[
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": ".husky/.gitignore",
    "content": "_\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "#!/bin/sh\n. \"$(dirname \"$0\")/_/husky.sh\"\n\nnpx lint-staged\n"
  },
  {
    "path": ".prettierignore",
    "content": "**/node_modules\n**/dist\n**/package.json\n**/yarn.lock\n**/package-lock.json\n**/.eslintrc.json\n**/tsconfig.json"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"arrowParens\": \"avoid\",\n  \"singleQuote\": true,\n  \"semi\": false,\n  \"printWidth\": 80\n} "
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.formatOnPaste\": true,\n  \"editor.formatOnSave\": true,\n  \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n} "
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Vladimir Angelov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies 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 all\ncopies 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 FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n   <a href=\"https://calories-in.com\" target=\"_blank\">\n    <img src=\"devices-preview.png\" alt=\"Devices preview\" />\n  </a>\n</p>\n<h1 align=\"center\">Calories-In</h1>\n\n<div align=\"center\">\n\n  <h3>A web-based meal plan editor for people who prepare all of their food.</h3>\n  \n<br />\n\nLive version: https://calories-in.com\n\nDemo video: https://tella.video/calories-in-4onp\n\n</div>\n\n## Background\n\nThe idea was born out of my experience of trying to find a better alternative to Google Sheets for calculating the macros of my meal plans. I wanted to be able to do this on desktop as it's more convenient but nothing really felt fast and simple enough.\n\nA huge inspiration for me has been [excalidraw.com](http://excalidraw.com).\n\n## Notable libraries\n\n- [Chakra UI](https://chakra-ui.com/)\n- [React Beautiful Dnd](https://github.com/atlassian/react-beautiful-dnd)\n- [React-pdf](https://react-pdf.org/)\n- [Comlink-loader](https://github.com/GoogleChromeLabs/comlink-loader)\n- [React window](https://github.com/bvaughn/react-window)\n- [Fuse.js](https://fusejs.io/)\n- [Framer Motion](https://www.framer.com/motion/)\n- [Feather icons](https://feathericons.com/)\n\n## Available Scripts\n\nIn the project directory, you can run:\n\n### `yarn start`\n\nRuns the app in the development mode.\\\nOpen [http://localhost:3000](http://localhost:3000) to view it in the browser.\n\n### `yarn build`\n\nBuilds the app for production to the `build` folder.\\\nIt correctly bundles React in production mode and optimizes the build for the best performance.\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"energytab\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@chakra-ui/react\": \"^1.3.4\",\n    \"@emotion/css\": \"^11.1.3\",\n    \"@emotion/react\": \"^11.1.5\",\n    \"@emotion/styled\": \"^11.1.5\",\n    \"@hookform/resolvers\": \"^2.6.0\",\n    \"@react-hook/resize-observer\": \"^1.2.0\",\n    \"@react-pdf/renderer\": \"^2.0.19\",\n    \"@szhsin/react-menu\": \"1.11.0\",\n    \"@testing-library/jest-dom\": \"^5.11.4\",\n    \"@testing-library/react\": \"^11.1.0\",\n    \"@testing-library/user-event\": \"^12.1.10\",\n    \"@types/jest\": \"^26.0.15\",\n    \"@types/node\": \"^12.0.0\",\n    \"@types/react\": \"^17.0.0\",\n    \"@types/react-dom\": \"^17.0.0\",\n    \"@types/react-window\": \"^1.8.3\",\n    \"@types/smoothscroll-polyfill\": \"^0.3.1\",\n    \"@types/uuid\": \"^8.3.0\",\n    \"comlink-loader\": \"^2.0.0\",\n    \"focus-visible\": \"^5.2.0\",\n    \"format-quantity\": \"^1.0.1\",\n    \"framer-motion\": \"^3.10.0\",\n    \"fuse.js\": \"^6.4.6\",\n    \"immer\": \"^9.0.5\",\n    \"jsondiffpatch\": \"^0.4.1\",\n    \"numeric-quantity\": \"^1.0.2\",\n    \"pretty-bytes\": \"^5.6.0\",\n    \"react\": \"^17.0.1\",\n    \"react-beautiful-dnd\": \"13.0.0\",\n    \"react-device-detect\": \"^1.17.0\",\n    \"react-dom\": \"^17.0.1\",\n    \"react-feather\": \"^2.0.9\",\n    \"react-hook-form\": \"7.8.5\",\n    \"react-merge-refs\": \"^1.1.0\",\n    \"react-scripts\": \"4.0.3\",\n    \"react-window\": \"^1.8.6\",\n    \"scroll-polyfill\": \"^1.0.1\",\n    \"source-map-explorer\": \"^2.5.2\",\n    \"typescript\": \"^4.1.2\",\n    \"uuid\": \"^8.3.2\",\n    \"web-vitals\": \"^1.0.1\",\n    \"yup\": \"^0.32.9\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\",\n    \"format\": \"prettier --write src/**/*.{ts,tsx}\",\n    \"lint\": \"tsc --noEmit && eslint src/**/*.{ts,tsx}\",\n    \"prepare\": \"husky install\",\n    \"analyze\": \"source-map-explorer 'build/static/js/*.js'\"\n  },\n  \"lint-staged\": {\n    \"src/**/*.{ts,tsx}\": [\n      \"yarn lint\"\n    ],\n    \"*.{ts,tsx}\": \"prettier --write\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"react-app\",\n      \"react-app/jest\"\n    ]\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@types/react-beautiful-dnd\": \"^13.0.0\",\n    \"@types/react-custom-scroll\": \"^4.2.1\",\n    \"@types/react-custom-scrollbars\": \"^4.0.7\",\n    \"husky\": \"^6.0.0\",\n    \"lint-staged\": \"^10.5.4\",\n    \"prettier\": \"^2.2.1\"\n  }\n}\n"
  },
  {
    "path": "public/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo src=\"/mstile-150x150.png\"/>\n            <TileColor>#da532c</TileColor>\n        </tile>\n    </msapplication>\n</browserconfig>\n"
  },
  {
    "path": "public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    \n    <meta\n      name=\"description\"\n      content=\"Build custom meals plans faster\"\n    />\n\n    <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon-32x32.png\">\n    <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/favicon-16x16.png\">\n    <link rel=\"manifest\" href=\"/site.webmanifest\">\n    <link rel=\"mask-icon\" href=\"/safari-pinned-tab.svg\" color=\"#5bbad5\">\n    <meta name=\"msapplication-TileColor\" content=\"#da532c\">\n    <meta name=\"theme-color\" content=\"#319795\"> \n    \n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n    <script src=\"https://cdn.usefathom.com/script.js\" data-site=\"%REACT_APP_FATHOM_SITE%\" defer></script>\n    <title>Calories-In</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "public/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "public/site.webmanifest",
    "content": "{\n    \"name\": \"\",\n    \"short_name\": \"\",\n    \"icons\": [\n        {\n            \"src\": \"/android-chrome-192x192.png\",\n            \"sizes\": \"192x192\",\n            \"type\": \"image/png\"\n        },\n        {\n            \"src\": \"/android-chrome-512x512.png\",\n            \"sizes\": \"512x512\",\n            \"type\": \"image/png\"\n        }\n    ],\n    \"theme_color\": \"#319795\",\n    \"background_color\": \"#319795\",\n    \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "src/App.tsx",
    "content": "import { ChakraProvider } from '@chakra-ui/react'\nimport { MainLayout } from 'layout'\nimport 'focus-visible/dist/focus-visible'\nimport theme from 'theme'\nimport { FoodsStoreProvider } from 'foods'\nimport { loadFoods } from 'foods/persistence'\nimport { OneTimeCheckStoreProvider, ScreenSizeProvider } from 'general'\nimport { DietEditor } from 'diets'\nimport { useState } from 'react'\nimport { PortionsStoreProvider } from 'portions'\n\nimport 'scroll-polyfill/auto'\n\nfunction App() {\n  const [foods] = useState(loadFoods)\n\n  return (\n    <ChakraProvider theme={theme}>\n      <ScreenSizeProvider>\n        <OneTimeCheckStoreProvider>\n          <PortionsStoreProvider>\n            <FoodsStoreProvider initialFoods={foods}>\n              <MainLayout>\n                <DietEditor />\n              </MainLayout>\n            </FoodsStoreProvider>\n          </PortionsStoreProvider>\n        </OneTimeCheckStoreProvider>\n      </ScreenSizeProvider>\n    </ChakraProvider>\n  )\n}\n\nexport default App\n"
  },
  {
    "path": "src/diets/DietEditor/DndContextProvider.tsx",
    "content": "import { useDietFormActions } from 'diets'\nimport { ReactNode } from 'react'\n\nimport { DragDropContext, DropResult } from 'react-beautiful-dnd'\n\ntype Props = {\n  children: ReactNode\n}\n\nfunction DndContextProvider({ children }: Props) {\n  const dietFormActions = useDietFormActions()\n\n  const onDragEnd = (dropResult: DropResult) => {\n    const { source, destination, type } = dropResult\n\n    if (!destination) {\n      return\n    }\n\n    if (type === 'variantsList') {\n      dietFormActions.moveVariantForm(source.index, destination.index)\n    } else if (type === 'mealsList') {\n      dietFormActions.moveMealForm(source.index, destination.index)\n    } else if (type === 'ingredientsList') {\n      dietFormActions.moveIngredientForm(\n        source.droppableId,\n        source.index,\n        destination.droppableId,\n        destination.index\n      )\n    }\n  }\n\n  return <DragDropContext onDragEnd={onDragEnd}>{children}</DragDropContext>\n}\n\nexport default DndContextProvider\n"
  },
  {
    "path": "src/diets/DietEditor/Form/About.tsx",
    "content": "import {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalFooter,\n  ModalBody,\n  ModalCloseButton,\n  Button,\n  Text,\n  ListItem,\n  List,\n  ListIcon,\n} from '@chakra-ui/react'\nimport { CheckCircle } from 'react-feather'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n}\n\nfunction About({ isOpen, onClose }: Props) {\n  return (\n    <Modal isOpen={isOpen} onClose={onClose} size=\"2xl\" scrollBehavior=\"inside\">\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>About </ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Text fontSize=\"lg\">\n            <Text>Hi, I'm Vladimir, the person behind this project.</Text>\n            <br />\n            <Text>\n              <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                Calories-In\n              </Text>{' '}\n              is made for people who follow meal plans that involve preparing\n              everything by yourself and gives them full control to fine tune\n              the nutritional values.\n            </Text>\n            <br />\n            <Text>\n              The idea was born out of my experience of trying to find a better\n              alternative to Google Sheets for calculating the macros of my own\n              meal plans. I wanted to be able to do this on desktop as it's more\n              convenient but nothing really felt fast and simple enough.\n            </Text>\n            <br />\n            <Text>The main differences to other apps in this space are:</Text>\n            <br />\n            <List ml={8}>\n              <ListItem>\n                <ListIcon as={CheckCircle} color=\"teal.600\" />\n                <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                  Faster search\n                </Text>\n                <Text mt={1}>\n                  There are actually not that many foods you need when you\n                  prepare everything yourself. This means all of the food data\n                  can be downloaded beforehand which makes the search super\n                  fast. Of course you can add your own foods if you'd like.{' '}\n                </Text>\n              </ListItem>\n              <br />\n              <ListItem>\n                <ListIcon as={CheckCircle} color=\"teal.600\" />\n                <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                  Undo/Redo\n                </Text>\n                <Text mt={1}>\n                  Building a plan from scratch or updating an existing one\n                  involves some back and forth choosing the right foods and\n                  adjusting their amounts. This is especially true if you want\n                  to be as close as possible to a specific calorie limit and\n                  have your macros be a certain percentages split.\n                </Text>\n              </ListItem>\n              <br />\n              <ListItem>\n                <ListIcon as={CheckCircle} color=\"teal.600\" />\n                <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                  Faster export\n                </Text>\n                <Text mt={1}>\n                  Creating the PDF file for your meal plan is done entirely\n                  inside the browser. It does not involve generating and\n                  downloading it from a server. This means I can keep the cost\n                  of running the website low and you get your file in just a few\n                  seconds.\n                </Text>\n              </ListItem>\n              <br />\n              <ListItem>\n                <ListIcon as={CheckCircle} color=\"teal.600\" />\n                <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                  Simpler\n                </Text>\n\n                <Text mt={1}>\n                  There are no other pages except the editor. Most of the other\n                  tools are bloated with additional features for professionals,\n                  such as managing clients, creating invoices, etc.\n                </Text>\n              </ListItem>\n              <br />\n              <ListItem>\n                <ListIcon as={CheckCircle} color=\"teal.600\" />\n                <Text fontWeight=\"semibold\" as=\"span\" textColor=\"teal.600\">\n                  Fully mobile\n                </Text>\n                <Text mt={1}>\n                  You can use your phone or tablet to build your meal plans\n                  right from your browser. If you add the app to your home\n                  screen it will look and feel almost like a native one.\n                </Text>\n              </ListItem>\n            </List>\n            <br />\n          </Text>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button size=\"lg\" onClick={onClose}>\n            Close\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  )\n}\n\nexport default About\n"
  },
  {
    "path": "src/diets/DietEditor/Form/Controls/ExportButton.tsx",
    "content": "import { ScreenSize, useScreenSize } from 'general'\nimport { Button, ButtonProps, IconButton } from '@chakra-ui/react'\nimport { Share } from 'react-feather'\nimport { canExportDietForm } from 'diets/persistence'\nimport { useDietForm } from 'diets'\n\ntype Props = {} & ButtonProps\n\nfunction ExportButton({ ...rest }: Props) {\n  const screenSize = useScreenSize()\n  const dietForm = useDietForm()\n  const canExport = canExportDietForm(dietForm)\n\n  const commonProps: ButtonProps = {\n    isDisabled: !canExport,\n    ...rest,\n  }\n\n  if (screenSize >= ScreenSize.Medium) {\n    return (\n      <Button\n        leftIcon={<Share size={16} pointerEvents=\"none\" />}\n        variant=\"solid\"\n        colorScheme=\"teal\"\n        size=\"md\"\n        {...commonProps}\n      >\n        Export\n      </Button>\n    )\n  }\n\n  return (\n    <IconButton\n      isDisabled={!canExport}\n      aria-label=\"Export\"\n      colorScheme=\"teal\"\n      size=\"md\"\n      icon={<Share size={20} pointerEvents=\"none\" />}\n      {...commonProps}\n    />\n  )\n}\n\nexport default ExportButton\n"
  },
  {
    "path": "src/diets/DietEditor/Form/Controls/MenuOrDrawer.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\nimport { Download, List, MoreHorizontal, Trash } from 'react-feather'\nimport {\n  MenuOrDrawer as MenuOrDrawerBase,\n  MenuOrDrawerItem,\n  MenuOrDrawerSeparator,\n  ScreenSize,\n  useScreenSize,\n} from 'general'\n\nconst DownloadStyled = chakra(Download)\nconst ListStyled = chakra(List)\nconst TrashStyled = chakra(Trash)\n\ntype Props = {\n  onImport: () => void\n  onClear: () => void\n  onViewFoods: () => void\n}\n\nfunction MenuOrDrawer({ onImport, onClear, onViewFoods }: Props) {\n  const screenSize = useScreenSize()\n\n  const items = [\n    <MenuOrDrawerSeparator key=\"separator\" />,\n    <MenuOrDrawerItem\n      key=\"importMealPlan\"\n      icon={<DownloadStyled />}\n      onClick={onImport}\n    >\n      Import meal plan\n    </MenuOrDrawerItem>,\n    <MenuOrDrawerItem\n      key=\"manageFoods\"\n      icon={<ListStyled />}\n      onClick={onViewFoods}\n    >\n      Manage foods\n    </MenuOrDrawerItem>,\n  ]\n\n  if (screenSize <= ScreenSize.Small) {\n    items.unshift(\n      <MenuOrDrawerItem\n        key=\"clearMealPlan\"\n        icon={<TrashStyled />}\n        onClick={onClear}\n      >\n        Clear\n      </MenuOrDrawerItem>\n    )\n  }\n\n  return (\n    <MenuOrDrawerBase\n      size=\"md\"\n      title=\"More actions\"\n      variant=\"solid\"\n      mr={2}\n      icon={<MoreHorizontal size={20} />}\n      aria-label=\"More actions\"\n    >\n      {items}\n    </MenuOrDrawerBase>\n  )\n}\n\nexport default MenuOrDrawer\n"
  },
  {
    "path": "src/diets/DietEditor/Form/Controls/Name.tsx",
    "content": "import { useDietForm, useDietFormActions } from 'diets'\nimport { Editable, EditableInput, EditablePreview } from '@chakra-ui/react'\nimport { ChangeEvent, useEffect, useRef } from 'react'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport { canExportDietForm } from 'diets/persistence'\n\nfunction Name() {\n  const dietForm = useDietForm()\n  const dietFormActions = useDietFormActions()\n  const editablePreviewRef = useRef<HTMLDivElement>(null)\n  const focusedForDietFieldIdMap = useRef<Record<string, boolean | undefined>>(\n    {}\n  )\n\n  useEffect(() => {\n    if (\n      !canExportDietForm(dietForm) &&\n      editablePreviewRef.current &&\n      !focusedForDietFieldIdMap.current[dietForm.fieldId]\n    ) {\n      editablePreviewRef.current.focus()\n      focusedForDietFieldIdMap.current[dietForm.fieldId] = true\n    }\n  }, [dietForm])\n\n  function onNameChange(event: ChangeEvent<HTMLInputElement>) {\n    const { value } = event.target\n    dietFormActions.updateDietForm({ name: value })\n  }\n\n  const boxShadowColor = getComputedColorFromChakra('teal.400')\n\n  return (\n    <Editable\n      fontSize=\"lg\"\n      fontWeight=\"medium\"\n      textAlign=\"center\"\n      value={dietForm.name}\n      width=\"85%\"\n      data-test-type=\"diet-name\"\n    >\n      <EditablePreview ref={editablePreviewRef} width=\"100%\" />\n      <EditableInput\n        _focus={{ boxShadow: `${boxShadowColor} 0px 0px 0px 3px` }}\n        onChange={onNameChange}\n      />\n    </Editable>\n  )\n}\n\nexport default Name\n"
  },
  {
    "path": "src/diets/DietEditor/Form/Controls/index.tsx",
    "content": "import { Flex, useDisclosure, Button } from '@chakra-ui/react'\nimport { UndoRedoButtons, useKeyboard } from 'undoRedo'\nimport { getDietForm, useDietFormActions } from 'diets'\nimport { useImportDietForm, ExportModal } from 'diets/persistence'\nimport {\n  FoodsListModal,\n  MissingFoodsModal,\n  useImportFoods,\n} from 'foods/persistence'\nimport { FoodsDrawer } from 'foods'\nimport { Trash } from 'react-feather'\nimport MenuOrDrawer from './MenuOrDrawer'\nimport Name from './Name'\nimport { ScreenSize, useScreenSize } from 'general'\nimport ExportButton from './ExportButton'\n\nfunction Controls() {\n  const dietFormActions = useDietFormActions()\n  const exportModalDisclosure = useDisclosure()\n  const missingFoodsModalDisclosure = useDisclosure()\n  const { onLoadFromFile } = useImportDietForm({ missingFoodsModalDisclosure })\n  const foodsListModalDisclosure = useDisclosure()\n  const importFoods = useImportFoods({ foodsListModalDisclosure })\n  const foodsDrawerDisclosure = useDisclosure()\n  const screenSize = useScreenSize()\n\n  useKeyboard()\n\n  function onClear() {\n    dietFormActions.setDietForm(getDietForm())\n  }\n\n  return (\n    <Flex width=\"100%\" alignItems=\"center\">\n      <Flex flex={1} mr={2}>\n        <UndoRedoButtons />\n      </Flex>\n\n      <Flex flexShrink={1} justifyContent=\"center\" flex={4}>\n        <Name />\n      </Flex>\n\n      <Flex ml={2} justifyContent=\"flex-end\" spacing={3} flex={1}>\n        <MenuOrDrawer\n          onImport={onLoadFromFile}\n          onClear={onClear}\n          onViewFoods={foodsDrawerDisclosure.onOpen}\n        />\n\n        {screenSize >= ScreenSize.Medium && (\n          <Button\n            leftIcon={<Trash size={16} />}\n            size=\"md\"\n            onClick={onClear}\n            mr={2}\n          >\n            Clear\n          </Button>\n        )}\n\n        <ExportButton onClick={exportModalDisclosure.onOpen} />\n      </Flex>\n\n      <MissingFoodsModal\n        isOpen={missingFoodsModalDisclosure.isOpen}\n        onClose={missingFoodsModalDisclosure.onClose}\n        onImport={importFoods.onImport}\n      />\n\n      <FoodsListModal\n        isOpen={foodsListModalDisclosure.isOpen}\n        onClose={foodsListModalDisclosure.onClose}\n        foodsToImport={importFoods.foodsToImport}\n      />\n\n      <FoodsDrawer\n        isOpen={foodsDrawerDisclosure.isOpen}\n        onClose={foodsDrawerDisclosure.onClose}\n        canSelect={false}\n      />\n\n      <ExportModal\n        isOpen={exportModalDisclosure.isOpen}\n        onClose={exportModalDisclosure.onClose}\n      />\n    </Flex>\n  )\n}\n\nexport default Controls\n"
  },
  {
    "path": "src/diets/DietEditor/Form/Footer.tsx",
    "content": "import { Box, HStack, Button, Divider, Link, BoxProps } from '@chakra-ui/react'\n\ntype Props = {\n  onAbout: () => void\n} & BoxProps\n\nfunction Footer({ onAbout, ...rest }: Props) {\n  return (\n    <Box {...rest}>\n      <Divider />\n      <HStack height=\"50px\" spacing={3}>\n        <Button\n          variant=\"link\"\n          color=\"gray.500\"\n          fontWeight=\"thin\"\n          py={0.5}\n          onClick={onAbout}\n        >\n          About\n        </Button>\n\n        <Link\n          color=\"gray.500\"\n          target=\"_blank\"\n          href=\"https://www.termsfeed.com/live/7e9b9ec6-aca7-4c99-a987-feb8b535a8e9\"\n        >\n          Terms\n        </Link>\n\n        <Link\n          color=\"gray.500\"\n          target=\"_blank\"\n          href=\"https://www.termsfeed.com/live/ff5061b9-09e0-4fae-a8e9-010274f2085c\"\n        >\n          Disclaimer\n        </Link>\n      </HStack>\n    </Box>\n  )\n}\n\nexport default Footer\n"
  },
  {
    "path": "src/diets/DietEditor/Form/index.tsx",
    "content": "import { useDietForm, useScrollManager } from 'diets'\nimport { DietFormVersionsStoreProvider } from 'undoRedo'\nimport { useRef } from 'react'\nimport { Page, PageHeader, PageBody } from 'layout'\nimport { MealsList } from 'meals'\nimport useDietFormEvents from './useDietFormEvents'\nimport { Box, useDisclosure, Flex } from '@chakra-ui/react'\nimport { ScreenSize, useElementHeight, useScreenSize } from 'general'\nimport Controls from './Controls'\nimport { FoodsDrawer } from 'foods'\nimport { VariantsList, VariantStats } from 'variants'\nimport useVariantFormEvents from './useVariantFormActions'\nimport About from './About'\nimport Footer from './Footer'\n\nfunction Form() {\n  const horizontalScrollRef = useRef<HTMLDivElement>(null)\n  const dietForm = useDietForm()\n  const { variantsForms } = dietForm\n  const selectedVariantForm = variantsForms[dietForm.selectedVariantFormIndex]\n\n  const scrollManager = useScrollManager({\n    selectedVariantForm,\n    horizontalScrollRef,\n  })\n\n  const foodsDrawerDisclosure = useDisclosure()\n  const dietFormEvents = useDietFormEvents({\n    scrollManager,\n    foodsDrawerDisclosure,\n  })\n\n  const {\n    elementHeight: headerHeight,\n    elementRef: headerRef,\n  } = useElementHeight()\n  const variantFormEvents = useVariantFormEvents({ scrollManager })\n\n  const screenSize = useScreenSize()\n\n  const aboutModalDisclosure = useDisclosure()\n\n  return (\n    <DietFormVersionsStoreProvider\n      horizontalScrollRef={horizontalScrollRef}\n      form={dietForm}\n      onUndo={dietFormEvents.onUndoOrRedo}\n      onRedo={dietFormEvents.onUndoOrRedo}\n    >\n      <Page>\n        <PageHeader ref={headerRef}>\n          <Box bg=\"white\" py={3}>\n            <Controls />\n          </Box>\n        </PageHeader>\n\n        <PageBody>\n          <VariantsList\n            onVariantFormCopy={variantFormEvents.onVariantFormCopy}\n            onVariantFormSelect={variantFormEvents.onVariantFormSelect}\n            ref={horizontalScrollRef}\n          />\n\n          <Flex>\n            <MealsList\n              flex={1}\n              headerHeight={headerHeight}\n              selectedVariantFormFieldId={selectedVariantForm.fieldId}\n              mealsForms={selectedVariantForm.mealsForms}\n              selectedVariantFormIndex={dietForm.selectedVariantFormIndex}\n              onAddMeal={foodsDrawerDisclosure.onOpen}\n            />\n\n            {screenSize >= ScreenSize.Large && (\n              <VariantStats\n                data-test-type=\"variant-stats\"\n                position=\"sticky\"\n                top={`${headerHeight + 24}px`}\n                ml={6}\n                width=\"300px\"\n                bg=\"white\"\n                borderRadius={6}\n                boxShadow=\"base\"\n              />\n            )}\n          </Flex>\n\n          <Footer mt={10} onAbout={aboutModalDisclosure.onOpen} />\n\n          <FoodsDrawer\n            isOpen={foodsDrawerDisclosure.isOpen}\n            onClose={foodsDrawerDisclosure.onClose}\n            mealName={`Meal ${selectedVariantForm.mealsForms.length + 1}`}\n            onSelectedFoods={dietFormEvents.onMealAdded}\n          />\n\n          <About\n            isOpen={aboutModalDisclosure.isOpen}\n            onClose={aboutModalDisclosure.onClose}\n          />\n        </PageBody>\n      </Page>\n    </DietFormVersionsStoreProvider>\n  )\n}\n\nexport default Form\n"
  },
  {
    "path": "src/diets/DietEditor/Form/useDietFormEvents.ts",
    "content": "import { UseDisclosureReturn } from '@chakra-ui/hooks'\nimport { DietForm, useDietFormActions, ScrollManager } from 'diets'\nimport { Food } from 'foods'\nimport { getIngredient } from 'ingredients'\nimport { getMealForm } from 'meals'\nimport { AppLocation } from 'undoRedo'\n\ntype Params = {\n  scrollManager: ScrollManager\n  foodsDrawerDisclosure: UseDisclosureReturn\n}\n\nfunction useDietFormEvents({ scrollManager, foodsDrawerDisclosure }: Params) {\n  const dietFormActions = useDietFormActions()\n  const { setScrollState } = scrollManager\n\n  function onMealAdded(foods: Food[], mealName?: string) {\n    foodsDrawerDisclosure.onClose()\n    const ingredients = foods.map(getIngredient)\n    const mealForm = getMealForm({ name: mealName as string, ingredients })\n    dietFormActions.appendMealForm(mealForm)\n  }\n\n  function onUndoOrRedo(\n    form: DietForm,\n    { scrollTop, scrollLeft, variantIndex }: AppLocation\n  ) {\n    const finalVariantIndex = form.variantsForms[variantIndex]\n      ? variantIndex\n      : form.selectedVariantFormIndex\n\n    dietFormActions.updateDietForm({\n      ...form,\n      selectedVariantFormIndex: finalVariantIndex,\n    })\n\n    setScrollState({ top: scrollTop, left: scrollLeft })\n  }\n\n  return {\n    onUndoOrRedo,\n    onMealAdded,\n  }\n}\n\nexport default useDietFormEvents\n"
  },
  {
    "path": "src/diets/DietEditor/Form/useVariantFormActions.ts",
    "content": "import { VariantForm } from 'variants'\nimport { useCallback } from 'react'\nimport { ScrollManager } from 'diets/useScrollManager'\n\ntype Params = {\n  scrollManager: ScrollManager\n}\n\nfunction useVariantFormEvents({ scrollManager }: Params) {\n  const { setScrollState, getCachedScrollTop } = scrollManager\n\n  const onVariantFormSelect = useCallback(\n    (variantForm: VariantForm) => {\n      setScrollState({ top: getCachedScrollTop(variantForm.fieldId) })\n    },\n    [setScrollState, getCachedScrollTop]\n  )\n\n  const onVariantFormCopy = useCallback(() => {\n    setScrollState({ top: 0 })\n  }, [setScrollState])\n\n  return {\n    onVariantFormCopy,\n    onVariantFormSelect,\n  }\n}\n\nexport default useVariantFormEvents\n"
  },
  {
    "path": "src/diets/DietEditor/index.tsx",
    "content": "import { DietFormStoreProvider } from 'diets'\nimport Form from './Form'\nimport { useOneTimeCheckActions } from 'general'\nimport DndContextProvider from './DndContextProvider'\nimport { MealsStatsStoreProvider } from 'stats'\nimport { useState } from 'react'\nimport { loadLastOrDefaultDietForm } from 'diets/persistence'\n\nfunction DietEditor() {\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const [dietForm] = useState(loadLastOrDefaultDietForm)\n\n  return (\n    <>\n      <DietFormStoreProvider\n        initialDietForm={dietForm}\n        oneTimeCheckActions={oneTimeCheckActions}\n      >\n        <MealsStatsStoreProvider>\n          <DndContextProvider>\n            <Form />\n          </DndContextProvider>\n        </MealsStatsStoreProvider>\n      </DietFormStoreProvider>\n    </>\n  )\n}\n\nexport default DietEditor\n"
  },
  {
    "path": "src/diets/PdfDietEditor.tsx",
    "content": "import ReactPDF, {\n  Document,\n  Page,\n  Font,\n  StyleSheet,\n  View,\n} from '@react-pdf/renderer'\nimport { Food } from 'foods'\nimport { Portion } from 'portions'\nimport { ReactElement } from 'react'\nimport { StatsTree } from 'stats/calculations/getStatsTree'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport PdfVariantItem from 'variants/PdfVariantsList/PdfVariantItem'\nimport { DietForm } from './dietForm'\n\ntype Props = {\n  dietForm: DietForm\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n\n  dietFormStatsTree: StatsTree\n} & ReactPDF.DocumentProps\n\nfunction PdfDietEditor({\n  dietForm,\n  foodsById,\n  portionsById,\n  dietFormStatsTree,\n  ...rest\n}: Props) {\n  const { variantsForms } = dietForm\n\n  const variantItemsElements: ReactElement[] = []\n\n  variantsForms.forEach((variantForm, index) => {\n    const { mealsForms } = variantForm\n    const { stats, subtrees } = dietFormStatsTree.subtrees[index]\n\n    if (mealsForms.length > 0) {\n      variantItemsElements.push(\n        <PdfVariantItem\n          index={variantItemsElements.length}\n          key={variantForm.fieldId}\n          variantForm={variantForm}\n          stats={stats}\n          mealsFormsStatsTrees={subtrees}\n          foodsById={foodsById}\n          portionsById={portionsById}\n        />\n      )\n    }\n  })\n\n  return (\n    <Document {...rest}>\n      <Page\n        style={[\n          styles.page,\n          { backgroundColor: getComputedColorFromChakra('gray.50') },\n        ]}\n      >\n        <View\n          fixed\n          style={{\n            backgroundColor: getComputedColorFromChakra('teal.500'),\n            height: 10,\n            alignItems: 'center',\n            padding: 4,\n            marginBottom: 24,\n          }}\n        />\n\n        {variantItemsElements}\n      </Page>\n    </Document>\n  )\n}\n\nconst styles = StyleSheet.create({\n  page: {\n    fontFamily: 'Roboto',\n    paddingBottom: 12,\n  },\n})\n\nFont.register({\n  family: 'Roboto',\n  fonts: [\n    {\n      src:\n        'https://fontlibrary.org/assets/fonts/roboto/4f8c3c9bbdde908a86daabfe666d2f61/ac3f799d5bbaf5196fab15ab8de8431c/RobotoRegular.ttf',\n      fontWeight: 'normal',\n    },\n\n    {\n      src:\n        'https://fontlibrary.org/assets/fonts/roboto/4f8c3c9bbdde908a86daabfe666d2f61/fe13e4170719c2fc586501e777bde143/RobotoMedium.ttf',\n      fontWeight: 'medium',\n    },\n\n    {\n      src:\n        'https://fontlibrary.org/assets/fonts/roboto/4f8c3c9bbdde908a86daabfe666d2f61/d329cc8b34667f114a95422aaad1b063/RobotoBold.ttf',\n      fontWeight: 'bold',\n    },\n  ],\n})\n\nexport default PdfDietEditor\n"
  },
  {
    "path": "src/diets/dietForm.ts",
    "content": "import { Diet } from 'diets'\nimport { getVariantForm, VariantForm } from 'variants'\nimport { v4 as uuidv4 } from 'uuid'\n\ntype DietForm = {\n  fieldId: string\n  name: string\n  selectedVariantFormIndex: number\n  variantsForms: VariantForm[]\n}\n\nfunction getDietForm(diet?: Diet): DietForm {\n  const variantsForms = [getVariantForm('Day 1')]\n  const fieldId = uuidv4()\n\n  if (diet) {\n    return {\n      fieldId,\n      name: diet.name,\n      variantsForms,\n      selectedVariantFormIndex: 0,\n    }\n  }\n\n  return {\n    fieldId,\n    name: 'Untitled',\n    variantsForms,\n    selectedVariantFormIndex: 0,\n  }\n}\n\nexport type { DietForm }\n\nexport { getDietForm }\n"
  },
  {
    "path": "src/diets/index.ts",
    "content": "export * from './dietForm'\nexport { default as useDietFormStore } from './useDietFormStore'\nexport * from './useDietFormStore'\nexport { default as DietEditor } from './DietEditor'\nexport * from './types'\nexport { default as useGetDietFormStatsTree } from './useGetDietFormStatsTree'\nexport { default as useScrollManager } from './useScrollManager'\nexport * from './useScrollManager'\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/index.tsx",
    "content": "import { Loader } from 'general'\nimport {\n  Alert,\n  AlertIcon,\n  AlertTitle,\n  AlertDescription,\n} from '@chakra-ui/react'\nimport usePdfExport from './usePdfExport'\n\ntype Props = {\n  onUpdate: (blob: Blob, url: string) => void\n}\n\nfunction Exporter({ onUpdate }: Props) {\n  const { isLoading, error } = usePdfExport({ onUpdate })\n\n  if (isLoading) {\n    return <Loader label=\"Exporting...\" />\n  }\n\n  return (\n    <Alert\n      status={error ? 'error' : 'success'}\n      variant=\"subtle\"\n      flexDirection=\"column\"\n      alignItems=\"center\"\n      justifyContent=\"center\"\n      textAlign=\"center\"\n      height=\"200px\"\n      bg=\"white\"\n    >\n      <AlertIcon color={error ? 'red.400' : 'teal.400'} boxSize=\"40px\" mr={0} />\n      <AlertTitle mt={4} mb={1} fontSize=\"lg\">\n        {error\n          ? 'Something went wrong while creating your pdf file'\n          : 'Your PDF file is ready'}\n      </AlertTitle>\n      {!error && (\n        <AlertDescription maxWidth=\"sm\">\n          Downloading this plan will allow you to import it later if you need to\n          update it.\n        </AlertDescription>\n      )}\n    </Alert>\n  )\n}\n\nexport default Exporter\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/usePdfExport.ts",
    "content": "import { useDietForm, useGetDietFormStatsTree } from 'diets'\nimport { useFoods } from 'foods'\nimport { usePortions } from 'portions'\nimport { useEffect, useState } from 'react'\nimport Worker from './worker'\nimport { minDelay, useRunIfNotUnmounted } from 'general'\n\nconst worker = new Worker()\n\ntype Params = {\n  onUpdate: (blob: Blob, url: string) => void\n}\n\nfunction usePdfExport({ onUpdate }: Params) {\n  const dietForm = useDietForm()\n  const { foodsById } = useFoods()\n  const { portionsById } = usePortions()\n  const getDietFormStatsTree = useGetDietFormStatsTree()\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<unknown>()\n\n  const runIfNotUnmounted = useRunIfNotUnmounted()\n\n  useEffect(() => {\n    async function run() {\n      const dietFormStatsTree = getDietFormStatsTree(dietForm)\n      const startDate = new Date()\n\n      try {\n        setIsLoading(true)\n        const blob = await worker.getDietPdfBlob({\n          dietForm,\n          dietFormStatsTree,\n          foodsById,\n          portionsById,\n        })\n\n        await minDelay(startDate)\n\n        runIfNotUnmounted(() => {\n          setIsLoading(false)\n          const url = URL.createObjectURL(blob)\n          onUpdate(blob, url)\n        })\n      } catch (error) {\n        await minDelay(startDate)\n\n        runIfNotUnmounted(() => {\n          setIsLoading(false)\n          setError(error)\n        })\n      }\n    }\n    run()\n  }, [\n    dietForm,\n    foodsById,\n    portionsById,\n    getDietFormStatsTree,\n    onUpdate,\n    runIfNotUnmounted,\n  ])\n\n  return {\n    isLoading,\n    error,\n  }\n}\n\nexport default usePdfExport\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/worker/custom.d.ts",
    "content": "declare module 'comlink-loader!*' {\n  import { Params } from './types'\n\n  class WebpackWorker extends Worker {\n    constructor()\n\n    getDietPdfBlob(data: Params): Promise<Blob>\n  }\n\n  export = WebpackWorker\n}\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/worker/index.ts",
    "content": "// eslint-disable-next-line\nimport Worker from 'comlink-loader!./worker'\n\nexport default Worker\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/worker/types.ts",
    "content": "import { DietForm } from 'diets/dietForm'\nimport { Food } from 'foods/types'\nimport { Portion } from 'portions/types'\nimport { StatsTree } from 'stats/calculations'\n\ntype Params = {\n  dietForm: DietForm\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n  dietFormStatsTree: StatsTree\n}\n\nexport type { Params }\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/Exporter/worker/worker.tsx",
    "content": "import { pdf } from '@react-pdf/renderer'\n\nif (process.env.NODE_ENV !== 'production') {\n  const t: any = global\n  t.$RefreshReg$ = () => {}\n  t.$RefreshSig$ = () => () => {}\n}\n\nasync function getDietPdfBlob(data: any) {\n  const PdfDietEditor = require('diets/PdfDietEditor').default\n\n  const document = (\n    <PdfDietEditor\n      dietForm={data.dietForm}\n      foodsById={data.foodsById}\n      portionsById={data.portionsById}\n      subject={JSON.stringify(data.dietForm)}\n      dietFormStatsTree={data.dietFormStatsTree}\n    />\n  )\n\n  return pdf(document).toBlob()\n}\n\nexport { getDietPdfBlob }\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/Content/index.tsx",
    "content": "import {\n  ModalContent,\n  ModalHeader,\n  ModalFooter,\n  ModalBody,\n  ModalCloseButton,\n  Button,\n  VStack,\n  Text,\n} from '@chakra-ui/react'\nimport { useState, useCallback } from 'react'\nimport { DownloadButton } from 'persistence'\nimport { useDietForm } from 'diets'\nimport Exporter from './Exporter'\n\ntype Props = {\n  onClose: () => void\n}\n\nfunction Content({ onClose }: Props) {\n  const [blob, setBlob] = useState<Blob>()\n  const [url, setUrl] = useState<string>()\n  const dietForm = useDietForm()\n\n  const onUpdate = useCallback((blob: Blob, url: string) => {\n    setBlob(blob)\n    setUrl(url)\n  }, [])\n\n  function onViewInBrowser() {\n    window.open(url, '_blank')\n  }\n\n  return (\n    <ModalContent>\n      <ModalHeader fontWeight=\"normal\">\n        Export{' '}\n        <Text as=\"span\" fontWeight=\"bold\">\n          {dietForm.name}\n        </Text>\n      </ModalHeader>\n      <ModalCloseButton />\n      <ModalBody px={0}>\n        <Exporter onUpdate={onUpdate} />\n      </ModalBody>\n\n      <ModalFooter>\n        <VStack spacing={3} width=\"100%\">\n          {blob && url && (\n            <DownloadButton\n              blob={blob}\n              onClose={onClose}\n              label=\"Download\"\n              isFullWidth={true}\n              fileName={dietForm.name}\n              isLoading={blob === undefined}\n            />\n          )}\n          {blob && url && (\n            <Button\n              mr={3}\n              variant=\"outline\"\n              colorScheme=\"teal\"\n              onClick={onViewInBrowser}\n              isFullWidth={true}\n            >\n              View in browser\n            </Button>\n          )}\n\n          <Button isFullWidth={true} variant=\"solid\" onClick={onClose}>\n            Close\n          </Button>\n        </VStack>\n      </ModalFooter>\n    </ModalContent>\n  )\n}\n\nexport default Content\n"
  },
  {
    "path": "src/diets/persistence/ExportModal/index.tsx",
    "content": "import { Modal, ModalOverlay } from '@chakra-ui/react'\nimport Content from './Content'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n}\n\nfunction ExportModal({ isOpen, onClose }: Props) {\n  return (\n    <Modal size=\"sm\" isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n      <Content onClose={onClose} />\n    </Modal>\n  )\n}\n\nexport default ExportModal\n"
  },
  {
    "path": "src/diets/persistence/canExportDietForm.ts",
    "content": "import { DietForm } from 'diets'\n\nfunction canExportDietForm(dietForm: DietForm) {\n  const { variantsForms } = dietForm\n\n  return variantsForms.some(({ mealsForms }) => {\n    return mealsForms.length > 0\n  })\n}\n\nexport default canExportDietForm\n"
  },
  {
    "path": "src/diets/persistence/hasMissingFoods.ts",
    "content": "import { DietForm } from 'diets'\nimport { Food, FoodId } from 'foods'\n\nfunction hasMissingFoods(dietForm: DietForm, foodsById: Record<FoodId, Food>) {\n  const { variantsForms } = dietForm\n\n  for (const variantForm of variantsForms) {\n    const { mealsForms } = variantForm\n\n    for (const mealForm of mealsForms) {\n      const { ingredientsForms } = mealForm\n\n      for (const ingredientForm of ingredientsForms) {\n        const food = foodsById[ingredientForm.foodId]\n\n        if (!food) {\n          return true\n        }\n      }\n    }\n  }\n\n  return false\n}\n\nexport default hasMissingFoods\n"
  },
  {
    "path": "src/diets/persistence/index.ts",
    "content": "export { default as ExportModal } from './ExportModal'\nexport { default as useImportDietForm } from './useImportDietForm'\nexport { default as parseDietForm } from './parseDietForm'\nexport { default as hasMissingFoods } from './hasMissingFoods'\nexport { default as loadLastOrDefaultDietForm } from './loadLastOrDefaultDietForm'\nexport { default as canExportDietForm } from './canExportDietForm'\n"
  },
  {
    "path": "src/diets/persistence/loadLastOrDefaultDietForm.ts",
    "content": "import { getDietForm } from 'diets'\n\nfunction loadLastOrDefaultDietForm() {\n  const savedValue = localStorage.getItem('lastDietForm')\n\n  if (savedValue) {\n    try {\n      return JSON.parse(savedValue)\n    } catch (error) {\n      return getDietForm()\n    }\n  }\n\n  return getDietForm()\n}\n\nexport default loadLastOrDefaultDietForm\n"
  },
  {
    "path": "src/diets/persistence/parseDietForm.ts",
    "content": "import { DietForm } from 'diets'\nimport { fixWhiteSpace } from 'persistence'\n\nfunction getLocation(text: string) {\n  const subject = '/Subject'\n  const startIndex = text.indexOf('/Subject')\n  const endIndex = text.indexOf('R', startIndex)\n\n  if (startIndex < 0 || endIndex < 0) {\n    throw new SyntaxError()\n  }\n  const locatioPrefix = text.slice(startIndex + subject.length, endIndex).trim()\n  return `${locatioPrefix} obj`\n}\n\nfunction getData(location: string, text: string) {\n  const startIndex = text.indexOf(location)\n  const endIndex = text.indexOf('endobj', startIndex)\n\n  if (startIndex < 0 || endIndex < 0) {\n    throw new SyntaxError()\n  }\n\n  return text.slice(startIndex + location.length + 2, endIndex - 2)\n}\n\nfunction parseDietForm(text: string) {\n  const location = getLocation(text)\n  const data = getData(location, text)\n  const dietForm = JSON.parse(data, (key: string, value) => {\n    if (key === 'notes') {\n      return fixWhiteSpace(value)\n    }\n\n    return value\n  }) as DietForm\n\n  return dietForm\n}\n\nexport default parseDietForm\n"
  },
  {
    "path": "src/diets/persistence/useDietImportErrors.tsx",
    "content": "import { useToast } from '@chakra-ui/toast'\nimport { Text, Button, UseDisclosureReturn } from '@chakra-ui/react'\n\ntype Params = {\n  missingFoodsModalDisclosure: UseDisclosureReturn\n}\n\nfunction useDietImportErrors({ missingFoodsModalDisclosure }: Params) {\n  const toast = useToast()\n\n  function onLearnAboutMissingFoods() {\n    toast.closeAll()\n    missingFoodsModalDisclosure.onOpen()\n  }\n\n  function onMissingFoods() {\n    toast({\n      isClosable: true,\n      position: 'top',\n      title: 'File imported',\n      description: (\n        <Text>\n          Warning: Foods missing.{' '}\n          <Button\n            variant=\"link\"\n            colorScheme=\"white\"\n            onClick={onLearnAboutMissingFoods}\n          >\n            Learn more\n          </Button>\n        </Text>\n      ),\n      status: 'warning',\n      duration: null,\n    })\n  }\n\n  return {\n    onMissingFoods,\n    missingFoodsModalDisclosure,\n  }\n}\n\nexport default useDietImportErrors\n"
  },
  {
    "path": "src/diets/persistence/useImportDietForm.ts",
    "content": "import { selectFile, readFile } from 'persistence'\nimport { useFoods } from 'foods'\nimport { useDietFormActions } from 'diets'\nimport { hasMissingFoods, parseDietForm } from 'diets/persistence'\nimport useFileImportError from 'persistence/useImportFileError'\nimport { useToast } from '@chakra-ui/toast'\nimport useDietImportErrors from './useDietImportErrors'\nimport { UseDisclosureReturn } from '@chakra-ui/hooks'\n\ntype Params = {\n  missingFoodsModalDisclosure: UseDisclosureReturn\n}\n\nfunction useImportDietForm({ missingFoodsModalDisclosure }: Params) {\n  const { foodsById } = useFoods()\n  const dietFormActions = useDietFormActions()\n  const fileImportError = useFileImportError()\n  const dietImportErrors = useDietImportErrors({ missingFoodsModalDisclosure })\n  const toast = useToast()\n\n  async function onLoadFromFile() {\n    const file = await selectFile('application/pdf')\n\n    try {\n      const text = await readFile(file)\n      const dietForm = parseDietForm(text)\n\n      if (hasMissingFoods(dietForm, foodsById)) {\n        dietImportErrors.onMissingFoods()\n      } else {\n        toast({\n          status: 'success',\n          position: 'top',\n          title: 'Meal plan imported',\n          duration: 2000,\n          isClosable: true,\n        })\n      }\n      dietFormActions.setDietForm(dietForm)\n    } catch (error: any) {\n      fileImportError.onError({ error, file })\n    }\n  }\n\n  return {\n    onLoadFromFile,\n    missingFoodsModalDisclosure: dietImportErrors.missingFoodsModalDisclosure,\n  }\n}\n\nexport default useImportDietForm\n"
  },
  {
    "path": "src/diets/types.ts",
    "content": "import { Meal } from 'meals'\n\ntype Diet = {\n  id: number\n  name: string\n  meals: Meal[]\n}\n\nexport type { Diet }\n"
  },
  {
    "path": "src/diets/useDietFormStore.ts",
    "content": "import { useCallback, useState } from 'react'\nimport { DietForm } from './dietForm'\nimport { useVariantsFormsActions, VariantsFormsActions } from 'variants'\nimport { useMealsFormsActions, MealsFormsActions } from 'meals'\nimport { useCallbacksMemo, makeStoreProvider } from 'general'\nimport {\n  useIngredientsFormsActions,\n  IngredientsFormsActions,\n} from 'ingredients'\nimport { OneTimeCheckActions } from 'general'\nimport { useSaveValue } from 'persistence'\n\nexport type Params = {\n  initialDietForm: DietForm\n  oneTimeCheckActions: OneTimeCheckActions\n}\n\ntype Actions = VariantsFormsActions &\n  MealsFormsActions &\n  IngredientsFormsActions\n\nfunction useDietFormStore({\n  initialDietForm,\n\n  oneTimeCheckActions,\n}: Params) {\n  const [dietForm, setDietForm] = useState(initialDietForm)\n\n  useSaveValue({ value: dietForm, key: 'lastDietForm' })\n\n  const variantsFormsActions = useVariantsFormsActions({\n    setDietForm,\n    oneTimeCheckActions,\n  })\n\n  const mealsFormsActions = useMealsFormsActions({\n    setDietForm,\n    oneTimeCheckActions,\n  })\n\n  const ingredientsFormsActions = useIngredientsFormsActions({\n    setDietForm,\n    oneTimeCheckActions,\n  })\n\n  const updateDietForm = useCallback(\n    (partialDietForm: Partial<DietForm>) => {\n      setDietForm(dietForm => {\n        return {\n          ...dietForm,\n          ...partialDietForm,\n        }\n      })\n    },\n    [setDietForm]\n  )\n\n  const ownActions = {\n    setDietForm,\n    updateDietForm,\n  }\n\n  const actions: Actions & typeof ownActions = useCallbacksMemo({\n    ...ownActions,\n    ...mealsFormsActions,\n    ...variantsFormsActions,\n    ...ingredientsFormsActions,\n  })\n\n  return [dietForm, actions] as const\n}\n\nconst [\n  DietFormStoreProvider,\n  useDietForm,\n  useDietFormActions,\n] = makeStoreProvider(useDietFormStore)\n\nexport { DietFormStoreProvider, useDietForm, useDietFormActions }\n\nexport default useDietFormStore\n"
  },
  {
    "path": "src/diets/useGetDietFormStatsTree.ts",
    "content": "import { StatsTree, getStatsTree } from 'stats'\nimport { DietForm } from './dietForm'\nimport { useGetVariantFormStatsTree } from 'variants'\nimport { useCallback } from 'react'\n\nfunction useGetDietFormStatsTree() {\n  const getVariantFormStatsTree = useGetVariantFormStatsTree()\n\n  const getDietFormStatsTree2 = useCallback(\n    (dietForm: DietForm): StatsTree => {\n      const subtrees = dietForm.variantsForms.map(variantForm =>\n        getVariantFormStatsTree(variantForm)\n      )\n\n      return getStatsTree({\n        id: dietForm.fieldId,\n        subtrees,\n        calculateAvg: true,\n      })\n    },\n    [getVariantFormStatsTree]\n  )\n\n  return getDietFormStatsTree2\n}\n\nexport default useGetDietFormStatsTree\n"
  },
  {
    "path": "src/diets/useScrollManager.ts",
    "content": "import { VariantForm } from 'variants'\nimport { useState, useRef, useEffect, RefObject, useCallback } from 'react'\n\ntype ScrollState = {\n  top?: number\n  left?: number\n}\n\ntype Params = {\n  selectedVariantForm: VariantForm\n  horizontalScrollRef: RefObject<HTMLDivElement>\n}\n\nfunction useScrollManager({\n  selectedVariantForm,\n  horizontalScrollRef,\n}: Params) {\n  const scrollTopCacheRef = useRef<Record<string, number | undefined>>({})\n  const [scrollState, setScrollState] = useState<ScrollState>({\n    top: 0,\n    left: 0,\n  })\n\n  const getCachedScrollTop = useCallback((variantFormFieldId: string) => {\n    return scrollTopCacheRef.current[variantFormFieldId] || 0\n  }, [])\n\n  useEffect(() => {\n    function onScroll() {\n      scrollTopCacheRef.current[selectedVariantForm.fieldId] = window.scrollY\n    }\n    window.addEventListener('scroll', onScroll)\n\n    return () => {\n      window.removeEventListener('scroll', onScroll)\n    }\n  }, [selectedVariantForm.fieldId])\n\n  useEffect(() => {\n    const { top, left } = scrollState\n\n    if (top !== undefined) {\n      window.scroll({ top })\n    }\n\n    if (left !== undefined && horizontalScrollRef.current) {\n      horizontalScrollRef.current.scrollLeft = left\n    }\n  }, [scrollState, horizontalScrollRef])\n\n  return {\n    setScrollState,\n    getCachedScrollTop,\n  }\n}\n\ntype ScrollManager = ReturnType<typeof useScrollManager>\n\nexport type { ScrollManager }\n\nexport default useScrollManager\n"
  },
  {
    "path": "src/dom/animateScrollLeft.ts",
    "content": "import { animate } from 'framer-motion'\nimport { RefObject } from 'react'\n\nfunction animateScrollLeft(nodeRef: RefObject<HTMLDivElement>, delta: number) {\n  if (!nodeRef.current) {\n    return\n  }\n\n  const node = nodeRef.current\n\n  animate(node.scrollLeft, node.scrollLeft + delta, {\n    duration: 0.2,\n    onUpdate: value => {\n      node.scrollLeft = value\n    },\n  })\n}\n\nexport default animateScrollLeft\n"
  },
  {
    "path": "src/dom/index.ts",
    "content": "export { default as animateScrollLeft } from './animateScrollLeft'\nexport { default as isElementInViewport } from './isElementInViewport'\nexport { default as useGetRefForId } from './useGetRefForId'\nexport { default as useScrollTo } from './useScrollTo'\n"
  },
  {
    "path": "src/dom/isElementInViewport.ts",
    "content": "function isElementInViewport(element: Element) {\n  const { top, left, bottom, right } = element.getBoundingClientRect()\n\n  return (\n    top >= 0 &&\n    left >= 0 &&\n    bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n    right <= (window.innerWidth || document.documentElement.clientWidth)\n  )\n}\n\nexport default isElementInViewport\n"
  },
  {
    "path": "src/dom/useGetRefForId.ts",
    "content": "import { createRef, RefObject, useCallback, useRef } from 'react'\n\ntype RefsCache<T> = {\n  [id: number]: RefObject<T>\n  [id: string]: RefObject<T>\n}\n\nfunction useGetRefForId<T extends HTMLElement = HTMLElement>() {\n  const cacheRef = useRef<RefsCache<T>>({})\n\n  const getRef = useCallback((id: number | string) => {\n    if (!cacheRef.current[id]) {\n      cacheRef.current[id] = createRef()\n    }\n\n    return cacheRef.current[id]\n  }, [])\n\n  return getRef\n}\n\nexport default useGetRefForId\n"
  },
  {
    "path": "src/dom/useScrollTo.ts",
    "content": "import { useEffect, useRef, useCallback } from 'react'\n\nfunction useScrollTo() {\n  const scrollTimeoutRef = useRef<number>()\n  const didScrollCheckTimeoutRef = useRef<number>()\n\n  useEffect(() => {\n    return () => {\n      window.clearTimeout(scrollTimeoutRef.current)\n    }\n  }, [])\n\n  const scrollTo = useCallback((node: HTMLElement) => {\n    return new Promise<void>(resolve => {\n      const resolveWihoutScrollTimeout = window.setTimeout(() => {\n        window.clearTimeout(didScrollCheckTimeoutRef.current)\n\n        window.removeEventListener('scroll', listener)\n        resolve()\n      }, 100)\n\n      function listener() {\n        window.clearTimeout(scrollTimeoutRef.current)\n        window.clearTimeout(resolveWihoutScrollTimeout)\n\n        scrollTimeoutRef.current = window.setTimeout(() => {\n          window.removeEventListener('scroll', listener)\n          resolve()\n        }, 50)\n      }\n\n      window.addEventListener('scroll', listener)\n\n      node.scrollIntoView({\n        behavior: 'smooth',\n        block: 'center',\n      })\n    })\n  }, [])\n\n  return scrollTo\n}\n\nexport default useScrollTo\n"
  },
  {
    "path": "src/foods/FoodInfo.tsx",
    "content": "import { Text, Box, Flex, BoxProps, Link } from '@chakra-ui/react'\nimport { Food } from 'foods'\nimport { ReactNode } from 'react'\nimport { DEFAULT_SERVING_SIZE_IN_GRAMS } from './foodForm'\n\ntype Props = {\n  food: Food\n  nameNoOfLines?: number\n  canBeLink?: boolean\n  notes?: string\n\n  energy?: number\n  children?: ReactNode\n} & BoxProps\n\nfunction FoodInfo({\n  food,\n\n  fontSize,\n  nameNoOfLines,\n  energy,\n  notes,\n  children,\n  canBeLink = false,\n  ...rest\n}: Props) {\n  return (\n    <Flex height=\"100%\" align=\"center\" {...rest}>\n      <Box>\n        {food.url && canBeLink ? (\n          <Link target=\"_blank\" href={food.url} color=\"teal.500\">\n            {food.name}\n          </Link>\n        ) : (\n          <Text noOfLines={nameNoOfLines} color=\"gray.800\">\n            {food.name}\n          </Text>\n        )}\n\n        {energy !== undefined && (\n          <Text fontSize=\"sm\" textColor=\"gray.500\">\n            <Text as=\"span\" fontWeight=\"medium\">\n              {`${Math.round(energy as number)}kcal`}\n            </Text>{' '}\n            / {food.servingSizeInGrams || DEFAULT_SERVING_SIZE_IN_GRAMS}g\n          </Text>\n        )}\n\n        {children}\n      </Box>\n    </Flex>\n  )\n}\n\nexport default FoodInfo\n"
  },
  {
    "path": "src/foods/FoodModal/Content/DeleteConfirmationModal.tsx",
    "content": "import {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalFooter,\n  ModalBody,\n  ModalCloseButton,\n  Button,\n  Text,\n} from '@chakra-ui/react'\n\ntype Props = {\n  isOpen: boolean\n  onCancel: () => void\n  onConfirm: () => void\n  text: string\n  confirmButtonLabel: String\n}\n\nfunction DeleteConfirmationModal({\n  isOpen,\n  onCancel,\n  onConfirm,\n  text,\n  confirmButtonLabel,\n}: Props) {\n  return (\n    <Modal isOpen={isOpen} onClose={onCancel} size=\"xs\" isCentered>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>Delete food</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Text>{text}</Text>\n          <br />\n          <Text fontWeight=\"medium\">This action cannot be undone.</Text>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button variant=\"outline\" onClick={onCancel}>\n            Cancel\n          </Button>\n          <Button colorScheme=\"red\" ml={3} onClick={onConfirm}>\n            {confirmButtonLabel}\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  )\n}\n\nexport default DeleteConfirmationModal\n"
  },
  {
    "path": "src/foods/FoodModal/Content/FoodFormProvider.tsx",
    "content": "import { useForm } from 'react-hook-form'\nimport { yupResolver } from '@hookform/resolvers/yup'\nimport { ReactNode } from 'react'\nimport { FormProvider } from 'react-hook-form'\nimport {\n  Food,\n  FoodForm,\n  foodFormSchema,\n  FoodFormSchemaContext,\n  getFoodForm,\n  useFoods,\n} from 'foods'\n\ntype Props = {\n  food?: Food\n  children: ReactNode\n}\n\nfunction FoodFormProvider({ food, children }: Props) {\n  const defaultValues = getFoodForm(food)\n  const { allFoods } = useFoods()\n\n  const formMethods = useForm<FoodForm, FoodFormSchemaContext>({\n    defaultValues,\n    resolver: yupResolver(foodFormSchema),\n    context: {\n      allFoods,\n      food,\n    },\n    mode: 'onChange',\n  })\n\n  return <FormProvider {...formMethods}>{children}</FormProvider>\n}\n\nexport default FoodFormProvider\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Footer.tsx",
    "content": "import { ModalFooter, Button, HStack } from '@chakra-ui/react'\n\ntype Props = {\n  onClose: () => void\n  onSubmit: () => void\n  isEditing: boolean\n}\n\nfunction Footer({ onClose, onSubmit, isEditing }: Props) {\n  return (\n    <ModalFooter>\n      <HStack spacing={3}>\n        <Button onClick={onClose}>Close</Button>\n        {isEditing && (\n          <Button\n            colorScheme=\"teal\"\n            type=\"submit\"\n            variant=\"solid\"\n            onClick={onSubmit}\n          >\n            Save food\n          </Button>\n        )}\n      </HStack>\n    </ModalFooter>\n  )\n}\n\nexport default Footer\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Header.tsx",
    "content": "import { ModalHeader, Button } from '@chakra-ui/react'\n\ntype Props = {\n  onClose: () => void\n  title: string\n  canEdit: boolean\n  onToggleEdit: () => void\n  isEditing: boolean\n}\n\nfunction Header({ title, canEdit, isEditing, onToggleEdit }: Props) {\n  return (\n    <ModalHeader>\n      {title}\n      {canEdit && (\n        <Button\n          ml={3}\n          variant=\"link\"\n          size=\"md\"\n          colorScheme=\"teal\"\n          onClick={onToggleEdit}\n        >\n          {isEditing ? 'Back to preview' : 'Edit food'}\n        </Button>\n      )}\n    </ModalHeader>\n  )\n}\n\nexport default Header\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Tabs/NutritionFactsFormFields.tsx",
    "content": "import { Box, FlexProps, VStack } from '@chakra-ui/react'\nimport { RefObject } from 'react'\nimport { StatsFormFields, StatFormField } from 'stats'\n\ntype Props = {\n  nameInputRef: RefObject<HTMLInputElement>\n  canEdit: boolean\n} & FlexProps\n\nfunction NutritionFactsFormFields({ nameInputRef, canEdit, ...rest }: Props) {\n  return (\n    <Box {...rest}>\n      <VStack spacing={2} alignItems=\"stretch\">\n        <VStack spacing={2}>\n          <StatFormField\n            hasDivider={false}\n            isEmphasized={true}\n            name=\"servingSizeInGrams\"\n            label=\"Serving size\"\n            isRequired={true}\n            inputType=\"nutritionValue\"\n            isReadOnly={!canEdit}\n          />\n\n          <StatFormField\n            name=\"energy\"\n            isCaption={true}\n            isValueBold={true}\n            isEmphasized={true}\n            label=\"Calories\"\n            inputType=\"nutritionValue\"\n            nutritionValueUnit=\"kcal\"\n            isRequired={true}\n            isReadOnly={!canEdit}\n          />\n        </VStack>\n\n        <StatsFormFields canEdit={canEdit} />\n      </VStack>\n    </Box>\n  )\n}\n\nexport default NutritionFactsFormFields\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Tabs/UrlField.tsx",
    "content": "import {\n  Flex,\n  FormControl,\n  FormLabel,\n  Link,\n  Alert,\n  AlertIcon,\n} from '@chakra-ui/react'\nimport { Input } from '@chakra-ui/react'\nimport { Food, FoodForm } from 'foods'\nimport { useFormContext } from 'react-hook-form'\n\ntype Props = {\n  canEdit: boolean\n  food?: Food\n}\n\nfunction UrlField({ canEdit, food }: Props) {\n  const { register } = useFormContext<FoodForm>()\n\n  return (\n    <Flex minHeight={canEdit ? '200px' : undefined} flexDirection=\"column\">\n      {canEdit && (\n        <Alert status=\"info\" mb={3}>\n          <AlertIcon color=\"teal.400\" />\n          Add a link will open a web page when the food is clicked. This is\n          useful if you want to show a specific product.\n        </Alert>\n      )}\n\n      <FormControl id=\"email\">\n        <Flex alignItems=\"center\">\n          <FormLabel mb={0} flexShrink={0}>\n            Link:\n          </FormLabel>\n          {canEdit ? (\n            <Input\n              {...register('url')}\n              placeholder=\"http://example.com\"\n              type=\"email\"\n            />\n          ) : (\n            <Link\n              href={food?.url}\n              target=\"_blank\"\n              noOfLines={1}\n              color=\"teal.500\"\n            >\n              {food?.url}\n            </Link>\n          )}\n        </Flex>\n      </FormControl>\n    </Flex>\n  )\n}\n\nexport default UrlField\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Tabs/VolumeFormFields.tsx",
    "content": "import { Flex, Text, HStack, Alert, AlertIcon } from '@chakra-ui/react'\nimport { Food, FoodForm } from 'foods'\nimport { PortionsSelect, usePortions } from 'portions'\nimport { Controller, useFormContext } from 'react-hook-form'\nimport { AmountInput } from 'stats'\n\ntype Props = {\n  canEdit: boolean\n  food?: Food\n}\n\nfunction VolumeFields({ canEdit, food }: Props) {\n  const { register } = useFormContext<FoodForm>()\n  const { portionsById, volumeBasedPortions } = usePortions()\n  const portion = food?.volume ? portionsById[food.volume.portionId] : undefined\n\n  return (\n    <Flex minHeight={canEdit ? '200px' : undefined} flexDirection=\"column\">\n      {canEdit && (\n        <Alert status=\"info\" mb={3}>\n          <AlertIcon color=\"teal.400\" />\n          Enter the food weight in grams per some volume measurement if you want\n          to convert between weight and volume (for example: between grams and\n          cups).\n        </Alert>\n      )}\n\n      <HStack spacing={2}>\n        {canEdit && <Text fontWeight=\"medium\">1 x</Text>}\n        {canEdit ? (\n          <PortionsSelect\n            width=\"200px\"\n            portions={volumeBasedPortions}\n            {...register('volumeForm.portionId')}\n          />\n        ) : (\n          <Text fontWeight=\"medium\">\n            1 x {`${portion?.singular} (${portion?.millilitersPerAmount} ml)`}\n          </Text>\n        )}\n\n        <Text fontWeight=\"medium\">=</Text>\n        <HStack spacing={1} alignItems=\"center\">\n          {canEdit ? (\n            <Controller\n              name=\"volumeForm.weightInGrams\"\n              render={({ field }) => (\n                <AmountInput value={field.value} onChange={field.onChange} />\n              )}\n            />\n          ) : (\n            <Text>{food?.volume?.weightInGrams}g</Text>\n          )}\n          {canEdit && <Text textColor=\"gray.500\">g</Text>}\n        </HStack>\n      </HStack>\n    </Flex>\n  )\n}\n\nexport default VolumeFields\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/Tabs/index.tsx",
    "content": "import { Food } from 'foods'\nimport NutritionFactsFormFields from './NutritionFactsFormFields'\nimport { RefObject } from 'react'\nimport {\n  Tabs as TabsBase,\n  TabList,\n  TabPanels,\n  Tab,\n  TabPanel,\n} from '@chakra-ui/react'\nimport VolumeFormFields from './VolumeFormFields'\nimport UrlField from './UrlField'\nimport { useFormContext } from 'react-hook-form'\n\ntype TabName = 'nutrition' | 'volume' | 'link'\n\ntype Props = {\n  nameInputRef: RefObject<HTMLInputElement>\n  food?: Food\n  isEditing: boolean\n  selectedTabName: TabName\n  tabNames: TabName[]\n  onTabNameChange: (name: TabName) => void\n}\n\nfunction Tabs({\n  nameInputRef,\n  food,\n  isEditing,\n  selectedTabName,\n  tabNames,\n  onTabNameChange,\n}: Props) {\n  const { formState } = useFormContext()\n  const tabIndex = tabNames.indexOf(selectedTabName)\n\n  function onTabIndexChange(index: number) {\n    onTabNameChange(tabNames[index])\n  }\n\n  return (\n    <TabsBase\n      variant=\"enclosed\"\n      colorScheme=\"teal\"\n      index={tabIndex}\n      onChange={onTabIndexChange}\n    >\n      <TabList>\n        <Tab color={formState.errors?.energy ? 'red.500' : undefined}>\n          Nutrition Facts\n        </Tab>\n\n        {tabNames.includes('volume') && <Tab>Volume</Tab>}\n        {tabNames.includes('link') && <Tab>Link</Tab>}\n      </TabList>\n\n      <TabPanels>\n        <TabPanel px={0}>\n          <NutritionFactsFormFields\n            nameInputRef={nameInputRef}\n            canEdit={isEditing}\n          />\n        </TabPanel>\n        {tabNames.includes('volume') && (\n          <TabPanel px={0}>\n            <VolumeFormFields food={food} canEdit={isEditing} />\n          </TabPanel>\n        )}\n\n        {tabNames.includes('link') && (\n          <TabPanel px={0}>\n            <UrlField canEdit={isEditing} food={food} />\n          </TabPanel>\n        )}\n      </TabPanels>\n    </TabsBase>\n  )\n}\n\nexport type { TabName }\n\nexport default Tabs\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/index.tsx",
    "content": "import {\n  ModalContent,\n  ModalCloseButton,\n  ModalBody,\n  Button,\n  Divider,\n  Box,\n  VStack,\n  Text,\n} from '@chakra-ui/react'\nimport { Food } from 'foods'\nimport { RefObject } from 'react'\nimport useSubmitFoodForm from './useSubmitFoodForm'\nimport { StatFormField } from 'stats'\nimport Footer from './Footer'\nimport Header from './Header'\nimport Tabs from './Tabs'\nimport useTabs from './useTabs'\n\ntype Props = {\n  onClose: () => void\n  title: string\n  nameInputRef: RefObject<HTMLInputElement>\n  food?: Food\n  canEdit: boolean\n  isEditing: boolean\n  onToggleEdit: () => void\n  onDelete: () => void\n  onFoodCreatedOrUpdated?: (newFood: Food, oldFood?: Food) => void\n}\n\nfunction Form({\n  onClose,\n  nameInputRef,\n  title,\n  food,\n  canEdit,\n  onFoodCreatedOrUpdated,\n  isEditing,\n  onToggleEdit,\n  onDelete,\n}: Props) {\n  const { onSubmit } = useSubmitFoodForm({\n    onComplete: (newOrUpdatedFood: Food) => {\n      onFoodCreatedOrUpdated && onFoodCreatedOrUpdated(newOrUpdatedFood, food)\n      onClose()\n    },\n  })\n\n  const { tabNames, onTabNameChange, selectedTabName } = useTabs({\n    isEditing,\n    food,\n  })\n\n  return (\n    <form onSubmit={onSubmit}>\n      <ModalContent>\n        <Header\n          title={title}\n          canEdit={canEdit}\n          isEditing={isEditing}\n          onClose={onClose}\n          onToggleEdit={onToggleEdit}\n        />\n        <ModalCloseButton />\n\n        <ModalBody>\n          <VStack spacing={6} align=\"stretch\\\">\n            <VStack spacing={2} align=\"stretch\">\n              {isEditing ? (\n                <StatFormField\n                  textInputRef={nameInputRef}\n                  name=\"name\"\n                  label=\"Name\"\n                  inputType=\"text\"\n                  isRequired={true}\n                  isReadOnly={!isEditing}\n                  hasDivider={false}\n                />\n              ) : (\n                <Text fontSize=\"xl\" fontWeight=\"bold\">\n                  {food?.name}\n                </Text>\n              )}\n              <StatFormField\n                name=\"categoryId\"\n                label=\"Category\"\n                inputType=\"foodCategory\"\n                isRequired={true}\n                isReadOnly={!isEditing}\n              />\n            </VStack>\n\n            <Tabs\n              nameInputRef={nameInputRef}\n              isEditing={isEditing}\n              food={food}\n              tabNames={tabNames}\n              onTabNameChange={onTabNameChange}\n              selectedTabName={selectedTabName}\n            />\n          </VStack>\n\n          {isEditing && food && (\n            <Box>\n              <Divider />\n              <Button width=\"100%\" my={6} colorScheme=\"red\" onClick={onDelete}>\n                Delete food\n              </Button>\n            </Box>\n          )}\n        </ModalBody>\n\n        <Footer onClose={onClose} onSubmit={onSubmit} isEditing={isEditing} />\n      </ModalContent>\n    </form>\n  )\n}\n\nexport type { Props }\n\nexport default Form\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/useSubmitFoodForm.ts",
    "content": "import { objectFromNutritionDataKeys } from 'stats'\nimport { Food, FoodForm } from 'foods'\nimport { useOneTimeCheckActions } from 'general'\nimport { useFormContext } from 'react-hook-form'\nimport { useFoodsActions } from 'foods'\nimport { v4 as uuidv4 } from 'uuid'\n\ntype Params = {\n  onComplete: (food: Food) => void\n}\n\nfunction withProtocol(url: string) {\n  return !/^https?:\\/\\//i.test(url) ? `http://${url}` : url\n}\n\nfunction useSubmitFoodForm({ onComplete }: Params) {\n  const { handleSubmit } = useFormContext()\n  const foodsActions = useFoodsActions()\n  const oneTimeCheckActions = useOneTimeCheckActions()\n\n  const onSubmit = handleSubmit((foodForm: FoodForm) => {\n    const food: Food = {\n      id: foodForm.id !== undefined ? foodForm.id : uuidv4(),\n      name: foodForm.name,\n      categoryId: foodForm.categoryId,\n      addedByUser: true,\n      servingSizeInGrams: Number(foodForm.servingSizeInGrams),\n      url: foodForm.url ? withProtocol(foodForm.url) : undefined,\n      ...objectFromNutritionDataKeys(key => Number(foodForm[key])),\n    }\n\n    const { volumeForm } = foodForm\n    const volumeWeightInGrams = Number(volumeForm.weightInGrams)\n\n    if (volumeWeightInGrams > 0) {\n      food.volume = {\n        portionId: volumeForm.portionId,\n        weightInGrams: volumeWeightInGrams,\n      }\n    }\n\n    if (foodForm.id === undefined) {\n      oneTimeCheckActions.set(`food-appear-${food.id}`)\n    }\n    oneTimeCheckActions.set(`food-flash-${food.id}`)\n\n    foodsActions.setFoods([food])\n    onComplete(food)\n  })\n\n  return {\n    onSubmit,\n  }\n}\n\nexport default useSubmitFoodForm\n"
  },
  {
    "path": "src/foods/FoodModal/Content/Form/useTabs.tsx",
    "content": "import { Food } from 'foods'\nimport { useEffect, useState } from 'react'\nimport { TabName } from './Tabs'\n\ntype Params = {\n  food?: Food\n  isEditing: boolean\n}\n\nfunction getTabNames(isEditing: boolean, food?: Food): TabName[] {\n  if (isEditing) {\n    return ['nutrition', 'volume', 'link']\n  }\n\n  const result: TabName[] = ['nutrition']\n\n  if (food?.volume) {\n    result.push('volume')\n  }\n\n  if (food?.url) {\n    result.push('link')\n  }\n\n  return result\n}\n\nfunction useTabs({ food, isEditing }: Params) {\n  const [selectedTabName, setSelectedTabName] = useState<TabName>('nutrition')\n\n  function onTabNameChange(newTabName: TabName) {\n    setSelectedTabName(newTabName)\n  }\n\n  const tabNames = getTabNames(isEditing, food)\n\n  useEffect(() => {\n    if (!tabNames.includes(selectedTabName)) {\n      setSelectedTabName('nutrition')\n    }\n  }, [food, isEditing, selectedTabName, tabNames])\n\n  return {\n    onTabNameChange,\n    selectedTabName,\n    tabNames,\n  }\n}\n\nexport default useTabs\n"
  },
  {
    "path": "src/foods/FoodModal/Content/index.tsx",
    "content": "import { Food } from 'foods'\nimport { RefObject, useState } from 'react'\nimport DeleteConfirmationModal from './DeleteConfirmationModal'\nimport useDeleteFood from './useDeleteFood'\nimport Form from './Form'\nimport FoodFormProvider from './FoodFormProvider'\n\ntype Props = {\n  onClose: () => void\n  title: string\n  nameInputRef: RefObject<HTMLInputElement>\n  food?: Food\n  onFoodCreatedOrUpdated?: (newFood: Food, oldFood?: Food) => void\n  onFoodDeleted?: (food: Food) => void\n}\n\nfunction Content({\n  onClose,\n  nameInputRef,\n  title,\n  food,\n  onFoodCreatedOrUpdated,\n  onFoodDeleted,\n}: Props) {\n  const canEdit = Boolean(food && food.addedByUser)\n  const deleteFood = useDeleteFood({ food, onClose, onFoodDeleted })\n  const [isEditing, setIsEditing] = useState(!food)\n\n  function onToggleEdit() {\n    setIsEditing(!isEditing)\n  }\n\n  return (\n    <FoodFormProvider food={food}>\n      <Form\n        nameInputRef={nameInputRef}\n        title={title}\n        canEdit={canEdit}\n        onToggleEdit={onToggleEdit}\n        food={food}\n        onDelete={deleteFood.onDelete}\n        onFoodCreatedOrUpdated={onFoodCreatedOrUpdated}\n        onClose={onClose}\n        isEditing={isEditing}\n      />\n\n      <DeleteConfirmationModal\n        text=\"Deleting this food will remove it from all meal plans where it's being used.\"\n        confirmButtonLabel=\"Delete food\"\n        isOpen={deleteFood.deleteConfirmationDisclosure.isOpen}\n        onCancel={deleteFood.deleteConfirmationDisclosure.onClose}\n        onConfirm={deleteFood.onConfirmDelete}\n      />\n    </FoodFormProvider>\n  )\n}\n\nexport type { Props }\n\nexport default Content\n"
  },
  {
    "path": "src/foods/FoodModal/Content/useDeleteFood.ts",
    "content": "import { useDisclosure } from '@chakra-ui/hooks'\nimport { useFoodsActions } from 'foods'\nimport { Food } from 'foods'\nimport { useToast } from '@chakra-ui/react'\n\ntype Params = {\n  food?: Food\n  onClose: () => void\n  onFoodDeleted?: (food: Food) => void\n}\n\nfunction useDeleteFood({ food, onClose, onFoodDeleted }: Params) {\n  const deleteConfirmationDisclosure = useDisclosure()\n  const foodsActions = useFoodsActions()\n  const toast = useToast()\n\n  function onDelete() {\n    deleteConfirmationDisclosure.onOpen()\n  }\n\n  function onConfirmDelete() {\n    if (food) {\n      foodsActions.removeFood(food.id)\n      toast({\n        position: 'top',\n        title: 'Food deleted',\n        status: 'success',\n        duration: 2000,\n        isClosable: true,\n      })\n      deleteConfirmationDisclosure.onClose()\n      onFoodDeleted && onFoodDeleted(food)\n      onClose()\n    }\n  }\n\n  return {\n    deleteConfirmationDisclosure,\n    onDelete,\n    onConfirmDelete,\n  }\n}\n\nexport default useDeleteFood\n"
  },
  {
    "path": "src/foods/FoodModal/index.tsx",
    "content": "import { Modal, ModalOverlay } from '@chakra-ui/react'\nimport { Food } from 'foods'\nimport { useRef } from 'react'\nimport Content from './Content'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  food?: Food\n  onFoodCreatedOrUpdated?: (newFood: Food, oldFood?: Food) => void\n  onFoodDeleted?: (food: Food) => void\n}\n\nfunction FoodModal({\n  onClose,\n  isOpen,\n  food,\n  onFoodCreatedOrUpdated,\n  onFoodDeleted,\n}: Props) {\n  const nameInputRef = useRef<HTMLInputElement>(null)\n  const title = food ? 'Food Details' : 'Create Food'\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      preserveScrollBarGap={true}\n      initialFocusRef={!food ? nameInputRef : undefined}\n      onClose={onClose}\n      scrollBehavior=\"inside\"\n      size={food ? 'md' : 'lg'}\n    >\n      <ModalOverlay />\n\n      <Content\n        nameInputRef={nameInputRef}\n        onClose={onClose}\n        title={title}\n        food={food}\n        onFoodCreatedOrUpdated={onFoodCreatedOrUpdated}\n        onFoodDeleted={onFoodDeleted}\n      />\n    </Modal>\n  )\n}\n\nexport type { Props }\n\nexport default FoodModal\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/Header.tsx",
    "content": "import { DrawerHeader, Text } from '@chakra-ui/react'\nimport { MealForm } from 'meals'\n\ntype Props = {\n  mealName?: string\n  canSelect: boolean\n  mealForm?: MealForm\n}\n\nfunction getTitlePrefix(props: Props) {\n  const { mealName, canSelect, mealForm } = props\n\n  if (!mealForm && mealName) {\n    return 'Select Foods for '\n  }\n\n  if (canSelect) {\n    return mealName ? 'Add Foods to ' : 'Add Foods'\n  }\n\n  return 'Foods'\n}\n\nfunction Header(props: Props) {\n  const { mealName } = props\n  const fontWeight = mealName ? 'normal' : 'bold'\n  let titlePrefix = getTitlePrefix(props)\n\n  return (\n    <DrawerHeader fontWeight={fontWeight} mr={3}>\n      {titlePrefix}\n\n      {mealName && (\n        <Text as=\"span\" fontSize=\"xl\" fontWeight=\"bold\">\n          {mealName}\n        </Text>\n      )}\n    </DrawerHeader>\n  )\n}\n\nexport default Header\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/MenuButtons.tsx",
    "content": "import { chakra, IconButton } from '@chakra-ui/react'\nimport { MoreHorizontal, Download, Share } from 'react-feather'\nimport { Menu, MenuItem } from 'general'\n\nconst DownloadStyled = chakra(Download)\nconst ShareStyled = chakra(Share)\nconst MoreHorizontalStyled = chakra(MoreHorizontal)\n\ntype Props = {\n  onImport: () => void\n  onExport: () => void\n}\n\nfunction MenuButtons({ onImport, onExport }: Props) {\n  return (\n    <Menu\n      arrow\n      align=\"end\"\n      viewScroll=\"close\"\n      menuButton={\n        <IconButton\n          aria-label=\"Foods actions\"\n          icon={<MoreHorizontalStyled size={20} pointerEvents=\"none\" />}\n          variant=\"outline\"\n        />\n      }\n    >\n      <MenuItem onClick={onImport}>\n        <DownloadStyled pointerEvents=\"none\" mr={3} />\n        Import custom foods\n      </MenuItem>\n      <MenuItem onClick={onExport}>\n        <ShareStyled pointerEvents=\"none\" mr={3} />\n        Export custom foods\n      </MenuItem>\n    </Menu>\n  )\n}\n\nexport default MenuButtons\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/SelectedFoodsList/SelectedFoodItem.tsx",
    "content": "import { Tag, TagLabel, TagCloseButton, Fade } from '@chakra-ui/react'\nimport { Food } from 'foods'\n\ntype Props = {\n  food: Food\n  onUnselect: (food: Food) => void\n}\n\nfunction SelectedFoodItem({ food, onUnselect }: Props) {\n  return (\n    <Fade in={true}>\n      <Tag\n        size=\"md\"\n        borderRadius=\"full\"\n        variant=\"outline\"\n        colorScheme=\"teal\"\n        maxWidth=\"250px\"\n      >\n        <TagLabel>{food.name}</TagLabel>\n        <TagCloseButton onClick={() => onUnselect(food)} />\n      </Tag>\n    </Fade>\n  )\n}\n\nexport default SelectedFoodItem\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/SelectedFoodsList/index.tsx",
    "content": "import { Flex, Text, Wrap } from '@chakra-ui/react'\nimport { Selection } from 'general'\nimport SelectedFoodItem from './SelectedFoodItem'\nimport { Food, useFoods } from 'foods'\n\ntype Props = {\n  selection: Selection<Food>\n}\n\nfunction SelectedFoods({ selection }: Props) {\n  const { selectedItems: selectedFoods } = selection\n  const { foodsById } = useFoods()\n\n  return (\n    <Flex alignItems=\"center\" minHeight=\"56px\">\n      {selectedFoods.length > 0 ? (\n        <Wrap spacing={2}>\n          {selectedFoods.map(({ id }) => (\n            <SelectedFoodItem\n              key={id}\n              food={foodsById[id]}\n              onUnselect={selection.toggleItem}\n            />\n          ))}\n        </Wrap>\n      ) : (\n        <Text textColor=\"gray.500\">Select one or more foods</Text>\n      )}\n    </Flex>\n  )\n}\n\nexport default SelectedFoods\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/index.tsx",
    "content": "import {\n  DrawerContent,\n  DrawerCloseButton,\n  DrawerBody,\n  DrawerFooter,\n  Flex,\n  Button,\n  VStack,\n  Text,\n  HStack,\n  useDisclosure,\n} from '@chakra-ui/react'\nimport { RefObject, useRef, useState } from 'react'\nimport { FoodsList, FoodsListMethods, FoodModal, Food } from 'foods'\nimport { useSelection, Tooltip } from 'general'\nimport SelectedFoodsList from './SelectedFoodsList'\nimport Header from './Header'\nimport MenuButtons from './MenuButtons'\nimport { useImportFoods, FoodsListModal } from 'foods/persistence'\nimport { FoodsFilterStoreProvider } from 'foods-filters'\nimport { loadFoodsFilter } from 'foods-filters/persistence'\nimport useFoodEvents from './useFoodEvents'\nimport { MealForm } from 'meals'\n\ntype Props = {\n  onClose: () => void\n  mealName?: string\n  mealForm?: MealForm\n  searchInputRef: RefObject<HTMLInputElement>\n  onSelectedFoods?: (foods: Food[], mealName?: string) => void\n\n  canSelect: boolean\n}\n\nfunction Content({\n  onClose,\n  mealName,\n  mealForm,\n  searchInputRef,\n  onSelectedFoods,\n  canSelect,\n}: Props) {\n  const selection = useSelection<Food>()\n  const listRef = useRef<FoodsListMethods>(null)\n  const foodEvents = useFoodEvents({ listRef, selection })\n\n  const foodsListModalDisclosure = useDisclosure()\n  const importFoods = useImportFoods({ foodsListModalDisclosure })\n  const [foodsFilter] = useState(loadFoodsFilter)\n\n  function onAdd() {\n    onSelectedFoods && onSelectedFoods(selection.selectedItems, mealName)\n  }\n\n  return (\n    <DrawerContent>\n      <DrawerCloseButton />\n      <Header mealForm={mealForm} mealName={mealName} canSelect={canSelect} />\n\n      <DrawerBody overflow=\"hidden\">\n        <VStack\n          width=\"100%\"\n          height=\"100%\"\n          spacing={canSelect ? 3 : 6}\n          alignItems=\"stretch\"\n        >\n          <Flex>\n            <Text textColor=\"gray.500\" size=\"lg\" mr={1}>\n              Need more foods?\n            </Text>\n            <Button\n              variant=\"link\"\n              colorScheme=\"teal\"\n              onClick={foodEvents.onCreateFood}\n            >\n              Create a new food\n            </Button>\n          </Flex>\n\n          {canSelect && <SelectedFoodsList selection={selection} />}\n\n          <FoodsFilterStoreProvider initialFilter={foodsFilter}>\n            <FoodsList\n              ref={listRef}\n              searchInputRef={searchInputRef}\n              selection={selection}\n              flex={1}\n              onFoodPreview={foodEvents.onPreviewFood}\n              itemUsageType={canSelect ? 'selectOrPreview' : 'previewOnly'}\n            />\n          </FoodsFilterStoreProvider>\n        </VStack>\n      </DrawerBody>\n\n      <DrawerFooter justifyContent={canSelect ? 'flex-end' : 'space-between'}>\n        {!canSelect && (\n          <MenuButtons\n            onImport={importFoods.onImport}\n            onExport={foodsListModalDisclosure.onOpen}\n          />\n        )}\n\n        <HStack spacing={3}>\n          <Button variant=\"solid\" size=\"md\" onClick={onClose}>\n            Close\n          </Button>\n          {canSelect && (\n            <Tooltip\n              isActive={!mealForm}\n              delay={300}\n              label=\"You can add more later\"\n            >\n              <Button\n                isDisabled={selection.selectedItems.length === 0}\n                colorScheme=\"teal\"\n                onClick={onAdd}\n              >\n                {mealForm ? 'Add selected foods' : 'Select foods'}\n              </Button>\n            </Tooltip>\n          )}\n        </HStack>\n      </DrawerFooter>\n\n      <FoodModal\n        isOpen={foodEvents.foodModalDisclosure.isOpen}\n        onClose={foodEvents.foodModalDisclosure.onClose}\n        onFoodCreatedOrUpdated={foodEvents.onFoodCreatedOrUpdated}\n        onFoodDeleted={foodEvents.onFoodDeleted}\n        food={foodEvents.food}\n      />\n\n      <FoodsListModal\n        isOpen={foodsListModalDisclosure.isOpen}\n        onClose={foodsListModalDisclosure.onClose}\n        foodsToImport={importFoods.foodsToImport}\n      />\n    </DrawerContent>\n  )\n}\n\nexport default Content\n"
  },
  {
    "path": "src/foods/FoodsDrawer/Content/useFoodEvents.ts",
    "content": "import { useDisclosure } from '@chakra-ui/react'\nimport { Food } from 'foods'\nimport { useState, RefObject } from 'react'\nimport { FoodsListMethods } from 'foods'\nimport { Selection } from 'general'\n\ntype Params = {\n  listRef: RefObject<FoodsListMethods>\n  selection: Selection<Food>\n}\n\nfunction useFoodEvents({ listRef, selection }: Params) {\n  const foodModalDisclosure = useDisclosure()\n  const [food, setFood] = useState<Food>()\n\n  function onCreateFood() {\n    setFood(undefined)\n    foodModalDisclosure.onOpen()\n  }\n\n  function onPreviewFood(food: Food) {\n    setFood(food)\n    foodModalDisclosure.onOpen()\n  }\n\n  function onFoodDeleted(food: Food) {\n    selection.removeItem(food)\n  }\n\n  function onFoodCreatedOrUpdated(newFood: Food, oldFood?: Food) {\n    if (!listRef.current) {\n      return\n    }\n\n    if (!oldFood || (oldFood && newFood.categoryId !== oldFood.categoryId)) {\n      listRef.current.scrollToFood(newFood)\n    }\n  }\n\n  return {\n    onCreateFood,\n    onPreviewFood,\n    onFoodCreatedOrUpdated,\n    food,\n    foodModalDisclosure,\n    onFoodDeleted,\n  }\n}\n\nexport default useFoodEvents\n"
  },
  {
    "path": "src/foods/FoodsDrawer/index.tsx",
    "content": "import { Drawer, DrawerOverlay } from '@chakra-ui/react'\nimport { Food } from 'foods'\nimport { MealForm } from 'meals'\nimport { useRef } from 'react'\nimport { isMobile } from 'react-device-detect'\nimport Content from './Content'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  mealName?: string\n  mealForm?: MealForm\n  canSelect?: boolean\n  onSelectedFoods?: (foods: Food[], mealName?: string) => void\n}\n\nfunction FoodsDrawer({\n  onClose,\n  isOpen,\n  mealName,\n  mealForm,\n  canSelect = true,\n  onSelectedFoods,\n}: Props) {\n  const searchInputRef = useRef<HTMLInputElement>(null)\n\n  return (\n    <Drawer\n      initialFocusRef={isMobile ? undefined : searchInputRef}\n      isOpen={isOpen}\n      size=\"md\"\n      placement=\"right\"\n      onClose={onClose}\n    >\n      <DrawerOverlay />\n      <Content\n        onClose={onClose}\n        mealName={mealName}\n        mealForm={mealForm}\n        onSelectedFoods={onSelectedFoods}\n        searchInputRef={searchInputRef}\n        canSelect={canSelect}\n      />\n    </Drawer>\n  )\n}\n\nexport default FoodsDrawer\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/FoodItem/AnimateAppear.tsx",
    "content": "import { motion } from 'framer-motion'\nimport { ReactNode } from 'react'\n\ntype Props = {\n  shouldAnimate: boolean\n  children: ReactNode\n}\n\nconst variants = {\n  open: {\n    opacity: 1,\n    scale: 1,\n  },\n  hidden: { opacity: 0, scale: 0.9 },\n}\n\nfunction AnimateAppear({ shouldAnimate, children }: Props) {\n  return (\n    <motion.div\n      transition={{\n        ease: 'easeInOut',\n        duration: shouldAnimate ? 0.35 : undefined,\n        delay: 0.5,\n      }}\n      initial={shouldAnimate ? 'hidden' : false}\n      animate=\"open\"\n      variants={variants}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\nexport default AnimateAppear\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/FoodItem/DisappearingBox.tsx",
    "content": "import { Box } from '@chakra-ui/react'\nimport { useEffect, useState } from 'react'\n\ntype Props = {\n  shouldAnimate: boolean\n}\n\nfunction DisappearingBox({ shouldAnimate }: Props) {\n  const [opacity, setOpacity] = useState(shouldAnimate ? 1 : 0)\n\n  useEffect(() => {\n    if (shouldAnimate) {\n      setOpacity(0)\n    }\n  }, [shouldAnimate])\n\n  return (\n    <Box\n      position=\"absolute\"\n      left=\"0\"\n      bg=\"gray.100\"\n      right=\"0\"\n      top=\"0\"\n      bottom=\"0\"\n      opacity={opacity}\n      transition=\"opacity 2s ease-in-out\"\n    />\n  )\n}\n\nexport default DisappearingBox\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/FoodItem/index.tsx",
    "content": "import { FoodInfo, Food } from 'foods'\nimport { Flex, FlexProps, Box, chakra, IconButton } from '@chakra-ui/react'\nimport { Info } from 'react-feather'\nimport { MouseEvent } from 'react'\nimport { useOneTimeCheckActions, Tooltip } from 'general'\nimport DisappearingBox from './DisappearingBox'\nimport AnimateAppear from './AnimateAppear'\n\nconst InfoStyled = chakra(Info)\n\ntype UsageType = 'selectOrPreview' | 'previewOnly' | 'nonInteractive'\n\ntype Props = {\n  food: Food\n  isSelected?: boolean\n  onPreview: (food: Food) => void\n  onChoose: (food: Food) => void\n  usageType?: UsageType\n} & FlexProps\n\nfunction FoodItem({\n  food,\n  isSelected = false,\n  onPreview,\n  onChoose,\n  usageType = 'selectOrPreview',\n  ...rest\n}: Props) {\n  function onInfoButtonClick(event: MouseEvent<HTMLButtonElement>) {\n    event.stopPropagation()\n    onPreview(food)\n  }\n\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const shouldAnimateAppear = oneTimeCheckActions.checkAndReset(\n    `food-appear-${food.id}`\n  )\n  const shouldAnimateFlash = oneTimeCheckActions.checkAndReset(\n    `food-flash-${food.id}`\n  )\n\n  return (\n    <Box\n      pb={2}\n      onClick={() => {\n        if (usageType === 'previewOnly') {\n          onPreview(food)\n        } else if (usageType === 'selectOrPreview') {\n          onChoose(food)\n        }\n      }}\n      {...rest}\n    >\n      <AnimateAppear shouldAnimate={shouldAnimateAppear}>\n        <Flex\n          cursor={usageType !== 'nonInteractive' ? 'pointer' : undefined}\n          _hover={\n            usageType !== 'nonInteractive'\n              ? {\n                  backgroundColor: !isSelected ? 'gray.50' : undefined,\n                }\n              : undefined\n          }\n          position=\"relative\"\n          transition=\"border 150ms ease-out\"\n          borderColor={isSelected ? 'teal.500' : 'gray.200'}\n          backgroundColor={isSelected ? 'gray.50' : 'white'}\n          borderWidth=\"1px\"\n          borderRadius={6}\n          overflow=\"hidden\"\n          justifyContent=\"space-between\"\n          alignItems=\"center\"\n          p={3}\n          height=\"64px\"\n        >\n          {shouldAnimateFlash && (\n            <DisappearingBox shouldAnimate={shouldAnimateFlash} />\n          )}\n\n          <FoodInfo\n            nameNoOfLines={1}\n            food={food}\n            energy={food.energy}\n            position=\"relative\"\n            zIndex={1}\n          />\n          {usageType === 'selectOrPreview' && (\n            <Tooltip label=\"Food details\">\n              <IconButton\n                aria-label=\"Food details\"\n                icon={<InfoStyled size={20} pointerEvents=\"none\" />}\n                variant=\"ghost\"\n                onClick={onInfoButtonClick}\n                position=\"relative\"\n                zIndex={1}\n              />\n            </Tooltip>\n          )}\n        </Flex>\n      </AnimateAppear>\n    </Box>\n  )\n}\n\nexport type { UsageType }\n\nexport default FoodItem\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/FoodItemRenderer.tsx",
    "content": "import { Food } from 'foods'\nimport FoodItem, { UsageType } from './FoodItem'\nimport { TOP_PADDING } from './Inner'\n\ntype Data = {\n  getFood: (index: number) => Food\n  isFoodSelected: (food: Food) => boolean\n  onFoodSelect: (food: Food) => void\n  onFoodPreview: (food: Food) => void\n  usageType: UsageType\n}\n\ntype Props = {\n  style: any\n  index: number\n  data: Data\n}\n\nfunction FoodItemRenderer({ style, index, data }: Props) {\n  const {\n    getFood,\n    onFoodSelect,\n    onFoodPreview,\n    isFoodSelected,\n    usageType,\n  } = data\n  const food = getFood(index)\n\n  return (\n    <FoodItem\n      key={food.id}\n      style={{\n        ...style,\n        top: `${parseFloat(style['top'] as string) + TOP_PADDING}px`,\n      }}\n      onChoose={onFoodSelect}\n      isSelected={isFoodSelected(food)}\n      onPreview={onFoodPreview}\n      food={food}\n      usageType={usageType}\n    />\n  )\n}\n\nexport default FoodItemRenderer\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/Inner.tsx",
    "content": "import { forwardRef } from 'react'\n\nconst TOP_PADDING = 12\n\nconst Inner = forwardRef<any, any>(({ style, ...rest }, ref) => (\n  <div\n    ref={ref}\n    style={{\n      ...style,\n      height: `${parseFloat(style.height) + TOP_PADDING}px`,\n    }}\n    {...rest}\n  />\n))\n\nexport { TOP_PADDING }\n\nexport default Inner\n"
  },
  {
    "path": "src/foods/FoodsList/VirtualizedList/index.tsx",
    "content": "import { Box } from '@chakra-ui/react'\nimport { FixedSizeList } from 'react-window'\nimport { forwardRef, ForwardedRef } from 'react'\nimport { Food } from 'foods'\nimport Inner from './Inner'\nimport FoodItemRenderer from './FoodItemRenderer'\nimport { UsageType } from './FoodItem'\nimport { useElementHeight } from 'general'\n\ntype Props = {\n  foodsCount: number\n  getFood: (index: number) => Food\n  isFoodSelected: (food: Food) => boolean\n  onFoodSelect: (food: Food) => void\n  onFoodPreview: (food: Food) => void\n  forwardRef?: ForwardedRef<FixedSizeList>\n  itemUsageType: UsageType\n}\n\nfunction VirtualizedList({\n  getFood,\n  isFoodSelected,\n  onFoodSelect,\n  onFoodPreview,\n  foodsCount,\n  forwardRef,\n  itemUsageType,\n}: Props) {\n  const { elementHeight, elementRef } = useElementHeight()\n\n  return (\n    <Box position=\"relative\" ref={elementRef} flex={1}>\n      <FixedSizeList\n        style={{ position: 'absolute', top: 0 }}\n        innerElementType={Inner}\n        height={elementHeight}\n        itemCount={foodsCount}\n        itemData={{\n          getFood,\n          onFoodSelect,\n          onFoodPreview,\n          isFoodSelected,\n          usageType: itemUsageType,\n        }}\n        itemSize={72}\n        width=\"100%\"\n        ref={forwardRef}\n      >\n        {FoodItemRenderer}\n      </FixedSizeList>\n    </Box>\n  )\n}\n\nexport default forwardRef<FixedSizeList, Props>((props, ref) => (\n  <VirtualizedList {...props} forwardRef={ref} />\n))\n"
  },
  {
    "path": "src/foods/FoodsList/index.tsx",
    "content": "import {\n  Input,\n  InputGroup,\n  InputLeftElement,\n  chakra,\n  Flex,\n  Text,\n  FlexProps,\n  HStack,\n  Box,\n} from '@chakra-ui/react'\nimport { Divider } from '@chakra-ui/react'\nimport { Search } from 'react-feather'\nimport VirtualizedList from './VirtualizedList'\nimport { Selection } from 'general'\nimport {\n  ForwardedRef,\n  RefObject,\n  useRef,\n  useImperativeHandle,\n  forwardRef,\n  ChangeEvent,\n  useEffect,\n} from 'react'\nimport { useFoods } from 'foods'\nimport {\n  useFilterFoods,\n  useFoodsFilter,\n  useFoodsFilterActions,\n} from 'foods-filters'\nimport { Food } from 'foods'\nimport { FixedSizeList } from 'react-window'\nimport { FoodsFilterPopoverOrModal } from 'foods-filters'\nimport { UsageType } from './VirtualizedList/FoodItem'\nimport { isMobile } from 'react-device-detect'\n\nconst SearchStyled = chakra(Search)\n\ntype FoodsListMethods = {\n  scrollToFood: (food: Food) => void\n}\n\ntype Props = {\n  searchInputRef?: RefObject<HTMLInputElement>\n  selection?: Selection<Food>\n  onFoodPreview?: (food: Food) => void\n  forwardedRef?: ForwardedRef<FoodsListMethods>\n  allowsFiltering?: boolean\n  itemUsageType?: UsageType\n} & FlexProps\n\nfunction FoodsList({\n  selection,\n  searchInputRef,\n  onFoodPreview,\n  forwardedRef,\n  allowsFiltering = true,\n  itemUsageType = 'selectOrPreview',\n  ...rest\n}: Props) {\n  const { allFoods, userFoods } = useFoods()\n  const listRef = useRef<FixedSizeList>(null)\n\n  const filter = useFoodsFilter()\n  const foodsFilterActions = useFoodsFilterActions()\n  const filteredFoods = useFilterFoods(allFoods, userFoods, filter)\n\n  useEffect(() => {\n    if (filter.categoryId) {\n      listRef.current?.scrollToItem(0, 'start')\n    }\n  }, [filter.categoryId])\n\n  useImperativeHandle(forwardedRef, () => ({\n    scrollToFood: (food: Food) => {\n      foodsFilterActions.resetCategoryIdAndQuery()\n\n      if (listRef.current) {\n        const foods = filter.onlyFoodsAddedByUser ? userFoods : allFoods\n        const index = foods.map(({ id }) => id).indexOf(food.id)\n        listRef.current.scrollToItem(index, 'center')\n      }\n    },\n  }))\n\n  function onFoodSelect(food: Food) {\n    if (selection) {\n      selection.toggleItem(food)\n      const input = searchInputRef?.current\n\n      if (input && !isMobile) {\n        input.focus()\n        input.setSelectionRange(0, input.value.length)\n      }\n    }\n  }\n\n  return (\n    <Flex flexDirection=\"column\" {...rest}>\n      <HStack spacing={3}>\n        {allowsFiltering && (\n          <Box>\n            <FoodsFilterPopoverOrModal />\n          </Box>\n        )}\n\n        <InputGroup size=\"md\" flex={4}>\n          <InputLeftElement\n            pointerEvents=\"none\"\n            children={\n              <SearchStyled pointerEvents=\"none\" size={20} color=\"gray.400\" />\n            }\n          />\n          <Input\n            ref={searchInputRef}\n            value={filter.query}\n            onChange={(event: ChangeEvent<HTMLInputElement>) =>\n              foodsFilterActions.updateFilter({ query: event.target.value })\n            }\n            placeholder=\"Search\"\n          />\n        </InputGroup>\n      </HStack>\n\n      <Divider mt={3} width=\"100%\" />\n\n      {filteredFoods.length > 0 ? (\n        <VirtualizedList\n          ref={listRef}\n          foodsCount={filteredFoods.length}\n          isFoodSelected={food =>\n            selection ? selection.isIdSelected(food.id) : false\n          }\n          getFood={index => filteredFoods[index]}\n          onFoodSelect={onFoodSelect}\n          onFoodPreview={onFoodPreview || (() => {})}\n          itemUsageType={itemUsageType}\n        />\n      ) : (\n        <Flex flex={1} alignItems=\"center\" justifyContent=\"center\">\n          <Text textColor=\"gray.500\">No foods found</Text>\n        </Flex>\n      )}\n    </Flex>\n  )\n}\n\nexport type { FoodsListMethods }\n\nexport default forwardRef<any, Props>((props, ref) => (\n  <FoodsList {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/foods/builtIn/bakedProducts.json",
    "content": "\n  [\n    {\n      \"id\": 3001,\n      \"name\": \"Taco shells\",\n      \"categoryId\": 3000,\n      \"energy\": 476,\n      \"fat\": 21.79,\n      \"saturatedFat\": 7.105,\n      \"monounsaturatedFat\": 6.935,\n      \"polyunsaturatedFat\": 5.495,\n      \"carbs\": 63.49,\n      \"sugar\": 1.5,\n      \"fiber\": 6.7,\n      \"protein\": 6.41,\n      \"sodium\": 324,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.216,\n      \"vitaminB2\": 0.08,\n      \"vitaminB3\": 1.867,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.203,\n      \"vitaminB9\": 69,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.69,\n      \"vitaminK\": 8.6,\n      \"magnesium\": 83,\n      \"calcium\": 100,\n      \"phosphorus\": 233,\n      \"potassium\": 231,\n      \"iron\": 1.64,\n      \"selenium\": 4.8,\n      \"zinc\": 1.61,\n      \"manganese\": 0.56,\n      \"copper\": 0.113,\n      \"choline\": 29.9\n    },\n    {\n      \"id\": 3002,\n      \"name\": \"Flour tortilla\",\n      \"categoryId\": 3000,\n      \"energy\": 306,\n      \"fat\": 7.99,\n      \"saturatedFat\": 2.924,\n      \"monounsaturatedFat\": 1.751,\n      \"polyunsaturatedFat\": 2.29,\n      \"carbs\": 49.38,\n      \"sugar\": 3.71,\n      \"fiber\": 3.5,\n      \"protein\": 8.2,\n      \"sodium\": 736,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.503,\n      \"vitaminB2\": 0.282,\n      \"vitaminB3\": 4.415,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.059,\n      \"vitaminB9\": 94,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 7.2,\n      \"magnesium\": 22,\n      \"calcium\": 146,\n      \"phosphorus\": 206,\n      \"potassium\": 125,\n      \"iron\": 3.63,\n      \"selenium\": 22.3,\n      \"zinc\": 0.53,\n      \"manganese\": 0,\n      \"copper\": 0.104,\n      \"choline\": 7.9\n    },\n    {\n      \"id\": 3003,\n      \"name\": \"Corn tortilla\",\n      \"categoryId\": 3000,\n      \"energy\": 218,\n      \"fat\": 2.85,\n      \"saturatedFat\": 0.453,\n      \"monounsaturatedFat\": 0.692,\n      \"polyunsaturatedFat\": 1.419,\n      \"carbs\": 44.64,\n      \"sugar\": 0.88,\n      \"fiber\": 6.3,\n      \"protein\": 5.7,\n      \"sodium\": 45,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.094,\n      \"vitaminB2\": 0.065,\n      \"vitaminB3\": 1.498,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.219,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.28,\n      \"vitaminK\": 0,\n      \"magnesium\": 72,\n      \"calcium\": 81,\n      \"phosphorus\": 314,\n      \"potassium\": 186,\n      \"iron\": 1.23,\n      \"selenium\": 6.1,\n      \"zinc\": 1.31,\n      \"manganese\": 0,\n      \"copper\": 0.154,\n      \"choline\": 13.3\n    },\n    {\n      \"id\": 3004,\n      \"name\": \"Bagel\",\n      \"categoryId\": 3000,\n      \"energy\": 264,\n      \"fat\": 1.32,\n      \"saturatedFat\": 0.36,\n      \"monounsaturatedFat\": 0.39,\n      \"polyunsaturatedFat\": 0.526,\n      \"carbs\": 52.38,\n      \"sugar\": 8.43,\n      \"fiber\": 1.6,\n      \"protein\": 10.56,\n      \"sodium\": 422,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.568,\n      \"vitaminB2\": 0.344,\n      \"vitaminB3\": 4.515,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.07,\n      \"vitaminB9\": 106,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.1,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 29,\n      \"calcium\": 105,\n      \"phosphorus\": 99,\n      \"potassium\": 107,\n      \"iron\": 3.57,\n      \"selenium\": 21.5,\n      \"zinc\": 0.83,\n      \"manganese\": 0,\n      \"copper\": 0.128,\n      \"choline\": 14.6\n    },\n    {\n      \"id\": 3005,\n      \"name\": \"Whole-grain bread\",\n      \"categoryId\": 3000,\n      \"energy\": 265,\n      \"fat\": 4.23,\n      \"saturatedFat\": 0.872,\n      \"monounsaturatedFat\": 0.76,\n      \"polyunsaturatedFat\": 1.872,\n      \"carbs\": 43.34,\n      \"sugar\": 6.39,\n      \"fiber\": 7.4,\n      \"protein\": 13.36,\n      \"sodium\": 381,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.279,\n      \"vitaminB2\": 0.131,\n      \"vitaminB3\": 4.042,\n      \"vitaminB5\": 0.336,\n      \"vitaminB6\": 0.263,\n      \"vitaminB9\": 75,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.37,\n      \"vitaminK\": 1.4,\n      \"magnesium\": 78,\n      \"calcium\": 103,\n      \"phosphorus\": 228,\n      \"potassium\": 230,\n      \"iron\": 2.5,\n      \"selenium\": 32.9,\n      \"zinc\": 1.7,\n      \"manganese\": 2.025,\n      \"copper\": 0.282,\n      \"choline\": 22\n    },\n    {\n      \"id\": 3006,\n      \"name\": \"White bread\",\n      \"categoryId\": 3000,\n      \"energy\": 270,\n      \"fat\": 3.59,\n      \"saturatedFat\": 0.821,\n      \"monounsaturatedFat\": 0.717,\n      \"polyunsaturatedFat\": 1.87,\n      \"carbs\": 49.2,\n      \"sugar\": 5.34,\n      \"fiber\": 2.3,\n      \"protein\": 9.43,\n      \"sodium\": 477,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.507,\n      \"vitaminB2\": 0.24,\n      \"vitaminB3\": 4.76,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.092,\n      \"vitaminB9\": 111,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.22,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 27,\n      \"calcium\": 211,\n      \"phosphorus\": 113,\n      \"potassium\": 117,\n      \"iron\": 3.36,\n      \"selenium\": 23.2,\n      \"zinc\": 0.88,\n      \"manganese\": 0,\n      \"copper\": 0.124,\n      \"choline\": 14.6\n    },\n    {\n      \"id\": 3007,\n      \"name\": \"Jumbo Seeded Hamburger Buns\",\n      \"categoryId\": 3000,\n      \"energy\": 277,\n      \"fat\": 4.62,\n      \"saturatedFat\": 0.77,\n      \"monounsaturatedFat\": 0.77,\n      \"polyunsaturatedFat\": 1.54,\n      \"carbs\": 50.77,\n      \"sugar\": 4.62,\n      \"fiber\": 1.5,\n      \"protein\": 9.23,\n      \"sodium\": 446,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0.308,\n      \"vitaminB3\": 4.154,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 92,\n      \"phosphorus\": 0,\n      \"potassium\": 92,\n      \"iron\": 3.08,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"url\": \"https://www.instacart.com/products/18368481-holsum-cotton-s-jumbo-seeded-hamburger-buns-18-2-oz\"\n    },\n    {\n      \"id\": 3008,\n      \"name\": \"While-wheat pita\",\n      \"categoryId\": 3000,\n      \"energy\": 262,\n      \"fat\": 1.71,\n      \"saturatedFat\": 0.208,\n      \"monounsaturatedFat\": 0.349,\n      \"polyunsaturatedFat\": 1.055,\n      \"carbs\": 55.89,\n      \"sugar\": 2.87,\n      \"fiber\": 6.1,\n      \"protein\": 9.8,\n      \"sodium\": 421,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.339,\n      \"vitaminB2\": 0.08,\n      \"vitaminB3\": 2.84,\n      \"vitaminB5\": 0.831,\n      \"vitaminB6\": 0.265,\n      \"vitaminB9\": 35,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.61,\n      \"vitaminK\": 1.4,\n      \"magnesium\": 69,\n      \"calcium\": 15,\n      \"phosphorus\": 180,\n      \"potassium\": 170,\n      \"iron\": 3.06,\n      \"selenium\": 44,\n      \"zinc\": 1.52,\n      \"manganese\": 1.74,\n      \"copper\": 0.29,\n      \"choline\": 26.5\n    },\n    {\n      \"id\": 3009,\n      \"name\": \"Saltine crakers\",\n      \"categoryId\": 3000,\n      \"energy\": 418,\n      \"fat\": 8.64,\n      \"saturatedFat\": 1.653,\n      \"monounsaturatedFat\": 1.986,\n      \"polyunsaturatedFat\": 4.835,\n      \"carbs\": 74.05,\n      \"sugar\": 1.29,\n      \"fiber\": 2.8,\n      \"protein\": 9.46,\n      \"sodium\": 941,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.702,\n      \"vitaminB2\": 0.487,\n      \"vitaminB3\": 6.442,\n      \"vitaminB5\": 0.536,\n      \"vitaminB6\": 0.086,\n      \"vitaminB9\": 134,\n      \"vitaminB12\": 0.09,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.15,\n      \"vitaminK\": 25.4,\n      \"magnesium\": 23,\n      \"calcium\": 19,\n      \"phosphorus\": 102,\n      \"potassium\": 152,\n      \"iron\": 5.57,\n      \"selenium\": 10.3,\n      \"zinc\": 0.69,\n      \"manganese\": 0.686,\n      \"copper\": 0.139,\n      \"choline\": 16.7,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 45\n      }\n    },\n    {\n      \"id\": 3010,\n      \"name\": \"Snyders' Olde Tyme Pretzels\",\n      \"categoryId\": 3000,\n      \"energy\": 400,\n      \"fat\": 3.33,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 3.33,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 80,\n      \"sugar\": 3.33,\n      \"fiber\": 3.3,\n      \"protein\": 10,\n      \"sodium\": 400,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0.453,\n      \"vitaminB3\": 5.333,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 3.6,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"url\": \"https://www.snydersofhanover.com/olde-tyme\"\n\n    },\n    {\n      \"id\": 3011,\n      \"name\": \"Seasoned breadcrumbs\",\n      \"categoryId\": 3000,\n      \"energy\": 383,\n      \"fat\": 5.48,\n      \"saturatedFat\": 1.391,\n      \"monounsaturatedFat\": 1.168,\n      \"polyunsaturatedFat\": 2.3,\n      \"carbs\": 68.49,\n      \"sugar\": 5.74,\n      \"fiber\": 4.9,\n      \"protein\": 14.13,\n      \"sodium\": 2100,\n      \"cholesterol\": 1,\n      \"vitaminA\": 10,\n      \"vitaminB1\": 0.961,\n      \"vitaminB2\": 0.415,\n      \"vitaminB3\": 6.161,\n      \"vitaminB5\": 0.623,\n      \"vitaminB6\": 0.171,\n      \"vitaminB9\": 119,\n      \"vitaminB12\": 0.35,\n      \"vitaminC\": 2.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.26,\n      \"vitaminK\": 46,\n      \"magnesium\": 46,\n      \"calcium\": 182,\n      \"phosphorus\": 177,\n      \"potassium\": 231,\n      \"iron\": 4.92,\n      \"selenium\": 24.7,\n      \"zinc\": 1.43,\n      \"manganese\": 0.984,\n      \"copper\": 0.244,\n      \"choline\": 14.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 120\n      }\n    },\n    {\n      \"id\": 3012,\n      \"name\": \"English muffins\",\n      \"categoryId\": 3000,\n      \"energy\": 245,\n      \"fat\": 1.75,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 50.17,\n      \"sugar\": 1.75,\n      \"fiber\": 3.5,\n      \"protein\": 7.02,\n      \"sodium\": 386,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.263,\n      \"vitaminB2\": 0.179,\n      \"vitaminB3\": 2.105,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.056,\n      \"vitaminB9\": 70,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.25,\n      \"vitaminK\": 2.3,\n      \"magnesium\": 33,\n      \"calcium\": 140,\n      \"phosphorus\": 127,\n      \"potassium\": 130,\n      \"iron\": 2.53,\n      \"selenium\": 17.3,\n      \"zinc\": 0.97,\n      \"manganese\": 0,\n      \"copper\": 0.164,\n      \"choline\": 6.5\n    },\n    {\n      \"id\": 3013,\n      \"name\": \"High fiber tortilla\",\n      \"categoryId\": 3000,\n      \"energy\": 111,\n      \"fat\": 3.33,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 35.56,\n      \"sugar\": 0,\n      \"fiber\": 24.4,\n      \"protein\": 8.89,\n      \"sodium\": 689,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 222,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 1.6,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0\n    },\n    {\n      \"id\": 3014,\n      \"name\": \"La Tortilla Low carb tortillas\",\n      \"categoryId\": 3000,\n      \"energy\": 167,\n      \"fat\": 5.95,\n      \"saturatedFat\": 2.38,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 35.71,\n      \"sugar\": 2.38,\n      \"fiber\": 21.4,\n      \"protein\": 11.9,\n      \"sodium\": 595,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 102,\n      \"phosphorus\": 0,\n      \"potassium\": 43,\n      \"iron\": 2.38,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"url\": \"https://www.latortillafactory.com/product/non-gmo-low-carb-flour-soft-taco-size/\"\n\n    },\n    {\n      \"id\": 3015,\n      \"name\": \"Wheat crackers\",\n      \"categoryId\": 3000,\n      \"energy\": 455,\n      \"fat\": 16.4,\n      \"saturatedFat\": 3.21,\n      \"monounsaturatedFat\": 3.47,\n      \"polyunsaturatedFat\": 8.474,\n      \"carbs\": 70.73,\n      \"sugar\": 15.48,\n      \"fiber\": 6.9,\n      \"protein\": 7.3,\n      \"sodium\": 699,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.284,\n      \"vitaminB2\": 0.146,\n      \"vitaminB3\": 4.022,\n      \"vitaminB5\": 0.577,\n      \"vitaminB6\": 0.244,\n      \"vitaminB9\": 38,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.55,\n      \"vitaminK\": 14.2,\n      \"magnesium\": 72,\n      \"calcium\": 92,\n      \"phosphorus\": 302,\n      \"potassium\": 283,\n      \"iron\": 2.64,\n      \"selenium\": 9.9,\n      \"zinc\": 1.64,\n      \"manganese\": 1.549,\n      \"copper\": 0.274,\n      \"choline\": 27.2\n    },\n    {\n      \"id\": 3016, \n      \"name\": \"Graham crackers\",\n      \"categoryId\": 3000,\n      \"energy\": 430,\n      \"fat\": 10.6,\n      \"saturatedFat\": 1.633,\n      \"monounsaturatedFat\": 2.509,\n      \"polyunsaturatedFat\": 5.388,\n      \"carbs\": 77.66,\n      \"sugar\": 24.85,\n      \"fiber\": 3.4,\n      \"protein\": 6.69,\n      \"sodium\": 516,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.265,\n      \"vitaminB2\": 0.317,\n      \"vitaminB3\": 4.439,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.156,\n      \"vitaminB9\": 91,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.51,\n      \"vitaminK\": 14.3,\n      \"magnesium\": 40,\n      \"calcium\": 77,\n      \"phosphorus\": 185,\n      \"potassium\": 170,\n      \"iron\": 3.78,\n      \"selenium\": 6.3,\n      \"zinc\": 0.96,\n      \"manganese\": 0,\n      \"copper\": 0.17,\n      \"choline\": 5.9\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/beef.json",
    "content": "[\n  {\n    \"id\": 201,\n    \"name\": \"70% Lean Ground Beef\",\n    \"categoryId\": 200,\n    \"energy\": 332,\n    \"fat\": 30,\n    \"saturatedFat\": 11.754,\n    \"monounsaturatedFat\": 14.171,\n    \"polyunsaturatedFat\": 0.697,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 14.35,\n    \"sodium\": 66,\n    \"cholesterol\": 78,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.044,\n    \"vitaminB2\": 0.151,\n    \"vitaminB3\": 3.382,\n    \"vitaminB5\": 0.395,\n    \"vitaminB6\": 0.278,\n    \"vitaminB9\": 9,\n    \"vitaminB12\": 2.07,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 2.9,\n    \"magnesium\": 14,\n    \"calcium\": 24,\n    \"phosphorus\": 132,\n    \"potassium\": 218,\n    \"iron\": 1.64,\n    \"selenium\": 13.5,\n    \"zinc\": 3.57,\n    \"manganese\": 0.009,\n    \"copper\": 0.05,\n    \"choline\": 46.8\n  },\n  {\n    \"id\": 202,\n    \"name\": \"75% Lean Ground Beef\",\n    \"categoryId\": 200,\n    \"energy\": 293,\n    \"fat\": 25,\n    \"saturatedFat\": 9.568,\n    \"monounsaturatedFat\": 11.383,\n    \"polyunsaturatedFat\": 0.609,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 15.76,\n    \"sodium\": 66,\n    \"cholesterol\": 75,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.044,\n    \"vitaminB2\": 0.151,\n    \"vitaminB3\": 3.804,\n    \"vitaminB5\": 0.446,\n    \"vitaminB6\": 0.301,\n    \"vitaminB9\": 8,\n    \"vitaminB12\": 2.11,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 2.4,\n    \"magnesium\": 15,\n    \"calcium\": 21,\n    \"phosphorus\": 145,\n    \"potassium\": 244,\n    \"iron\": 1.79,\n    \"selenium\": 14.3,\n    \"zinc\": 3.87,\n    \"manganese\": 0.009,\n    \"copper\": 0.056,\n    \"choline\": 51.6\n  },\n  {\n    \"id\": 203,\n    \"name\": \"80% Lean Ground Beef\",\n    \"categoryId\": 200,\n    \"energy\": 254,\n    \"fat\": 20,\n    \"saturatedFat\": 7.581,\n    \"monounsaturatedFat\": 8.848,\n    \"polyunsaturatedFat\": 0.521,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 17.17,\n    \"sodium\": 66,\n    \"cholesterol\": 71,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.043,\n    \"vitaminB2\": 0.151,\n    \"vitaminB3\": 4.227,\n    \"vitaminB5\": 0.498,\n    \"vitaminB6\": 0.323,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 2.14,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 1.8,\n    \"magnesium\": 17,\n    \"calcium\": 18,\n    \"phosphorus\": 158,\n    \"potassium\": 270,\n    \"iron\": 1.94,\n    \"selenium\": 15,\n    \"zinc\": 4.18,\n    \"manganese\": 0.01,\n    \"copper\": 0.061,\n    \"choline\": 56.4\n  },\n  {\n    \"id\": 204,\n    \"name\": \"90% Lean Ground Beef\",\n    \"categoryId\": 200,\n    \"energy\": 176,\n    \"fat\": 10,\n    \"saturatedFat\": 3.927,\n    \"monounsaturatedFat\": 4.194,\n    \"polyunsaturatedFat\": 0.345,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20,\n    \"sodium\": 66,\n    \"cholesterol\": 65,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.042,\n    \"vitaminB2\": 0.151,\n    \"vitaminB3\": 5.072,\n    \"vitaminB5\": 0.601,\n    \"vitaminB6\": 0.369,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 2.21,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 0.8,\n    \"magnesium\": 20,\n    \"calcium\": 12,\n    \"phosphorus\": 184,\n    \"potassium\": 321,\n    \"iron\": 2.24,\n    \"selenium\": 16.6,\n    \"zinc\": 4.79,\n    \"manganese\": 0.01,\n    \"copper\": 0.072,\n    \"choline\": 66.1\n  },\n  {\n    \"id\": 205,\n    \"name\": \"95% Lean Ground Beef\",\n    \"categoryId\": 200,\n    \"energy\": 137,\n    \"fat\": 5,\n    \"saturatedFat\": 2.182,\n    \"monounsaturatedFat\": 1.994,\n    \"polyunsaturatedFat\": 0.257,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 21.41,\n    \"sodium\": 66,\n    \"cholesterol\": 62,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.041,\n    \"vitaminB2\": 0.151,\n    \"vitaminB3\": 5.494,\n    \"vitaminB5\": 0.652,\n    \"vitaminB6\": 0.392,\n    \"vitaminB9\": 5,\n    \"vitaminB12\": 2.24,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 0.3,\n    \"magnesium\": 22,\n    \"calcium\": 9,\n    \"phosphorus\": 198,\n    \"potassium\": 346,\n    \"iron\": 2.38,\n    \"selenium\": 17.4,\n    \"zinc\": 5.09,\n    \"manganese\": 0.01,\n    \"copper\": 0.078,\n    \"choline\": 70.9\n  },\n  {\n    \"id\": 206,\n    \"name\": \"Jack Link's Original Beef Jerky\",\n    \"categoryId\": 200,\n    \"energy\": 278,\n    \"fat\": 2.78,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 16.67,\n    \"sugar\": 11.11,\n    \"fiber\": 0,\n    \"protein\": 44.44,\n    \"sodium\": 2056,\n    \"cholesterol\": 111,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 0,\n    \"phosphorus\": 0,\n    \"potassium\": 0,\n    \"iron\": 4,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0,\n    \"url\": \"https://www.jacklinks.com/shop/original-beef-jerky\"\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/beverages.json",
    "content": "[\n    {\n      \"id\": 7001,\n      \"name\": \"Unsweetened Almond Milk\",\n      \"categoryId\": 7000,\n      \"energy\": 15,\n      \"fat\": 0.96,\n      \"saturatedFat\": 0.08,\n      \"monounsaturatedFat\": 0.59,\n      \"polyunsaturatedFat\": 0.24,\n      \"carbs\": 1.31,\n      \"sugar\": 0.81,\n      \"fiber\": 0.2,\n      \"protein\": 0.4,\n      \"sodium\": 72,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0.01,\n      \"vitaminB3\": 0.07,\n      \"vitaminB5\": 0.01,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 1,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 1,\n      \"vitaminE\": 6.33,\n      \"vitaminK\": 0,\n      \"magnesium\": 6,\n      \"calcium\": 184,\n      \"phosphorus\": 9,\n      \"potassium\": 67,\n      \"iron\": 0.28,\n      \"selenium\": 0.1,\n      \"zinc\": 0.06,\n      \"manganese\": 0.04,\n      \"copper\": 0.02,\n      \"choline\": 3.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 262\n      }\n    },\n    {\n      \"id\": 7002,\n      \"name\": \"Unsweetened Rice Milk\",\n      \"categoryId\": 7000,\n      \"energy\": 47,\n      \"fat\": 0.97,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0.625,\n      \"polyunsaturatedFat\": 0.313,\n      \"carbs\": 9.17,\n      \"sugar\": 5.28,\n      \"fiber\": 0.3,\n      \"protein\": 0.28,\n      \"sodium\": 39,\n      \"cholesterol\": 0,\n      \"vitaminA\": 63,\n      \"vitaminB1\": 0.027,\n      \"vitaminB2\": 0.142,\n      \"vitaminB3\": 0.39,\n      \"vitaminB5\": 0.146,\n      \"vitaminB6\": 0.039,\n      \"vitaminB9\": 2,\n      \"vitaminB12\": 0.63,\n      \"vitaminC\": 0,\n      \"vitaminD\": 1,\n      \"vitaminE\": 0.47,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 11,\n      \"calcium\": 118,\n      \"phosphorus\": 56,\n      \"potassium\": 27,\n      \"iron\": 0.2,\n      \"selenium\": 2.2,\n      \"zinc\": 0.13,\n      \"manganese\": 0.282,\n      \"copper\": 0.037,\n      \"choline\": 2.1\n    },\n    {\n      \"id\": 7003,\n      \"name\": \"Whey Protein Powder\",\n      \"categoryId\": 7000,\n      \"energy\": 352,\n      \"fat\": 1.56,\n      \"saturatedFat\": 0.781,\n      \"monounsaturatedFat\": 0.158,\n      \"polyunsaturatedFat\": 0.299,\n      \"carbs\": 6.25,\n      \"sugar\": 0,\n      \"fiber\": 3.1,\n      \"protein\": 78.13,\n      \"sodium\": 156,\n      \"cholesterol\": 16,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.609,\n      \"vitaminB2\": 2.017,\n      \"vitaminB3\": 1.136,\n      \"vitaminB5\": 5.516,\n      \"vitaminB6\": 0.607,\n      \"vitaminB9\": 33,\n      \"vitaminB12\": 2.45,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 195,\n      \"calcium\": 469,\n      \"phosphorus\": 1321,\n      \"potassium\": 500,\n      \"iron\": 1.13,\n      \"selenium\": 26.7,\n      \"zinc\": 6.18,\n      \"manganese\": 0,\n      \"copper\": 0.049,\n      \"choline\": 224,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 32\n      }\n    },\n    {\n      \"id\": 7004,\n      \"name\": \"Coconut Milk\",\n      \"categoryId\": 7000,\n      \"energy\": 31,\n      \"fat\": 2.08,\n      \"saturatedFat\": 2.083,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 2.92,\n      \"sugar\": 2.5,\n      \"fiber\": 0,\n      \"protein\": 0.21,\n      \"sodium\": 19,\n      \"cholesterol\": 0,\n      \"vitaminA\": 63,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 1.25,\n      \"vitaminC\": 0,\n      \"vitaminD\": 1,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 188,\n      \"phosphorus\": 0,\n      \"potassium\": 19,\n      \"iron\": 0.3,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 240\n      }\n    },\n    {\n      \"id\": 7005,\n      \"name\": \"Red Wine\",\n      \"categoryId\": 7000,\n      \"energy\": 85,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 2.61,\n      \"sugar\": 0.62,\n      \"fiber\": 0,\n      \"protein\": 0.07,\n      \"sodium\": 4,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.005,\n      \"vitaminB2\": 0.031,\n      \"vitaminB3\": 0.224,\n      \"vitaminB5\": 0.03,\n      \"vitaminB6\": 0.057,\n      \"vitaminB9\": 1,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0.4,\n      \"magnesium\": 12,\n      \"calcium\": 8,\n      \"phosphorus\": 23,\n      \"potassium\": 127,\n      \"iron\": 0.46,\n      \"selenium\": 0.2,\n      \"zinc\": 0.14,\n      \"manganese\": 0.132,\n      \"copper\": 0.011,\n      \"choline\": 5.7\n    },\n    {\n      \"id\": 7006,\n      \"name\": \"Beer\",\n      \"categoryId\": 7000,\n      \"energy\": 43,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 3.55,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0.46,\n      \"sodium\": 4,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.005,\n      \"vitaminB2\": 0.025,\n      \"vitaminB3\": 0.513,\n      \"vitaminB5\": 0.041,\n      \"vitaminB6\": 0.046,\n      \"vitaminB9\": 6,\n      \"vitaminB12\": 0.02,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 6,\n      \"calcium\": 4,\n      \"phosphorus\": 14,\n      \"potassium\": 27,\n      \"iron\": 0.02,\n      \"selenium\": 0.6,\n      \"zinc\": 0.01,\n      \"manganese\": 0.008,\n      \"copper\": 0.005,\n      \"choline\": 10.1\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/dairyAndEggs.json",
    "content": "[\n  {\n    \"id\": 501,\n    \"name\": \"Skim Milk\",\n    \"categoryId\": 500,\n    \"energy\": 34,\n    \"fat\": 0.08,\n    \"saturatedFat\": 0.049,\n    \"monounsaturatedFat\": 0.017,\n    \"polyunsaturatedFat\": 0.006,\n    \"carbs\": 4.89,\n    \"sugar\": 5.05,\n    \"fiber\": 0,\n    \"protein\": 3.43,\n    \"sodium\": 41,\n    \"cholesterol\": 3,\n    \"vitaminA\": 64,\n    \"vitaminB1\": 0.056,\n    \"vitaminB2\": 0.131,\n    \"vitaminB3\": 0.118,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.058,\n    \"vitaminB9\": 2,\n    \"vitaminB12\": 0.58,\n    \"vitaminC\": 0,\n    \"vitaminD\": 1.1,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 12,\n    \"calcium\": 132,\n    \"phosphorus\": 107,\n    \"potassium\": 167,\n    \"iron\": 0,\n    \"selenium\": 2,\n    \"zinc\": 0.45,\n    \"manganese\": 0,\n    \"copper\": 0.002,\n    \"choline\": 18.2\n  },\n  {\n    \"id\": 502,\n    \"name\": \"Whole Eggs\",\n    \"categoryId\": 500,\n    \"energy\": 143,\n    \"fat\": 9.51,\n    \"saturatedFat\": 3.126,\n    \"monounsaturatedFat\": 3.658,\n    \"polyunsaturatedFat\": 1.911,\n    \"carbs\": 0.72,\n    \"sugar\": 0.37,\n    \"fiber\": 0,\n    \"protein\": 12.56,\n    \"sodium\": 142,\n    \"cholesterol\": 372,\n    \"vitaminA\": 160,\n    \"vitaminB1\": 0.04,\n    \"vitaminB2\": 0.457,\n    \"vitaminB3\": 0.075,\n    \"vitaminB5\": 1.533,\n    \"vitaminB6\": 0.17,\n    \"vitaminB9\": 47,\n    \"vitaminB12\": 0.89,\n    \"vitaminC\": 0,\n    \"vitaminD\": 2,\n    \"vitaminE\": 1.05,\n    \"vitaminK\": 0.3,\n    \"magnesium\": 12,\n    \"calcium\": 56,\n    \"phosphorus\": 198,\n    \"potassium\": 138,\n    \"iron\": 1.75,\n    \"selenium\": 30.7,\n    \"zinc\": 1.29,\n    \"manganese\": 0.028,\n    \"copper\": 0.072,\n    \"choline\": 293.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 243\n    }\n  },\n  {\n    \"id\": 503,\n    \"name\": \"Egg Whites\",\n    \"categoryId\": 500,\n    \"energy\": 52,\n    \"fat\": 0.17,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0.73,\n    \"sugar\": 0.71,\n    \"fiber\": 0,\n    \"protein\": 10.9,\n    \"sodium\": 166,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.004,\n    \"vitaminB2\": 0.439,\n    \"vitaminB3\": 0.105,\n    \"vitaminB5\": 0.19,\n    \"vitaminB6\": 0.005,\n    \"vitaminB9\": 4,\n    \"vitaminB12\": 0.09,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 11,\n    \"calcium\": 7,\n    \"phosphorus\": 15,\n    \"potassium\": 163,\n    \"iron\": 0.08,\n    \"selenium\": 20,\n    \"zinc\": 0.03,\n    \"manganese\": 0.011,\n    \"copper\": 0.023,\n    \"choline\": 1.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 243\n    }\n  },\n  {\n    \"id\": 504,\n    \"name\": \"Half and Half\",\n    \"categoryId\": 500,\n    \"energy\": 131,\n    \"fat\": 11.5,\n    \"saturatedFat\": 7.032,\n    \"monounsaturatedFat\": 3.32,\n    \"polyunsaturatedFat\": 0.554,\n    \"carbs\": 4.3,\n    \"sugar\": 4.13,\n    \"fiber\": 0,\n    \"protein\": 3.13,\n    \"sodium\": 61,\n    \"cholesterol\": 35,\n    \"vitaminA\": 97,\n    \"vitaminB1\": 0.03,\n    \"vitaminB2\": 0.194,\n    \"vitaminB3\": 0.109,\n    \"vitaminB5\": 0.539,\n    \"vitaminB6\": 0.05,\n    \"vitaminB9\": 3,\n    \"vitaminB12\": 0.19,\n    \"vitaminC\": 0.9,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.25,\n    \"vitaminK\": 1.3,\n    \"magnesium\": 10,\n    \"calcium\": 107,\n    \"phosphorus\": 95,\n    \"potassium\": 132,\n    \"iron\": 0.05,\n    \"selenium\": 3.2,\n    \"zinc\": 0.39,\n    \"manganese\": 0.005,\n    \"copper\": 0.009,\n    \"choline\": 18.7,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 15\n    }\n  },\n  {\n    \"id\": 505,\n    \"name\": \"Reduced Fat Cheddar Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 316,\n    \"fat\": 20.41,\n    \"saturatedFat\": 12.602,\n    \"monounsaturatedFat\": 5.304,\n    \"polyunsaturatedFat\": 0.893,\n    \"carbs\": 2.67,\n    \"sugar\": 0.26,\n    \"fiber\": 0,\n    \"protein\": 27.35,\n    \"sodium\": 628,\n    \"cholesterol\": 76,\n    \"vitaminA\": 145,\n    \"vitaminB1\": 0.021,\n    \"vitaminB2\": 0.397,\n    \"vitaminB3\": 0.145,\n    \"vitaminB5\": 0.389,\n    \"vitaminB6\": 0.084,\n    \"vitaminB9\": 20,\n    \"vitaminB12\": 1.41,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.3,\n    \"vitaminE\": 0.48,\n    \"vitaminK\": 1.5,\n    \"magnesium\": 27,\n    \"calcium\": 761,\n    \"phosphorus\": 520,\n    \"potassium\": 63,\n    \"iron\": 0.12,\n    \"selenium\": 35.8,\n    \"zinc\": 4.44,\n    \"manganese\": 0.031,\n    \"copper\": 0.043,\n    \"choline\": 15.4\n  },\n  {\n    \"id\": 506,\n    \"name\": \"Sour Cream\",\n    \"categoryId\": 500,\n    \"energy\": 198,\n    \"fat\": 19.35,\n    \"saturatedFat\": 10.14,\n    \"monounsaturatedFat\": 4.594,\n    \"polyunsaturatedFat\": 0.8,\n    \"carbs\": 4.63,\n    \"sugar\": 3.41,\n    \"fiber\": 0,\n    \"protein\": 2.44,\n    \"sodium\": 31,\n    \"cholesterol\": 59,\n    \"vitaminA\": 124,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.168,\n    \"vitaminB3\": 0.093,\n    \"vitaminB5\": 0.472,\n    \"vitaminB6\": 0.041,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 0.21,\n    \"vitaminC\": 0.9,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.38,\n    \"vitaminK\": 1.5,\n    \"magnesium\": 10,\n    \"calcium\": 101,\n    \"phosphorus\": 76,\n    \"potassium\": 125,\n    \"iron\": 0.07,\n    \"selenium\": 3.7,\n    \"zinc\": 0.33,\n    \"manganese\": 0.015,\n    \"copper\": 0.018,\n    \"choline\": 19.2,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 12\n    }\n  },\n  {\n    \"id\": 507,\n    \"name\": \"Fat Free Sour Cream\",\n    \"categoryId\": 500,\n    \"energy\": 74,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 15.6,\n    \"sugar\": 0.39,\n    \"fiber\": 0,\n    \"protein\": 3.1,\n    \"sodium\": 141,\n    \"cholesterol\": 9,\n    \"vitaminA\": 73,\n    \"vitaminB1\": 0.04,\n    \"vitaminB2\": 0.15,\n    \"vitaminB3\": 0.07,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.02,\n    \"vitaminB9\": 11,\n    \"vitaminB12\": 0.3,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 10,\n    \"calcium\": 125,\n    \"phosphorus\": 95,\n    \"potassium\": 129,\n    \"iron\": 0,\n    \"selenium\": 5.3,\n    \"zinc\": 0.5,\n    \"manganese\": 0,\n    \"copper\": 0.016,\n    \"choline\": 19.2,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 12\n    }\n  },\n  {\n    \"id\": 508,\n    \"name\": \"2% Milk\",\n    \"categoryId\": 500,\n    \"energy\": 50,\n    \"fat\": 1.98,\n    \"saturatedFat\": 1.257,\n    \"monounsaturatedFat\": 0.56,\n    \"polyunsaturatedFat\": 0.073,\n    \"carbs\": 4.8,\n    \"sugar\": 5.06,\n    \"fiber\": 0,\n    \"protein\": 3.3,\n    \"sodium\": 47,\n    \"cholesterol\": 8,\n    \"vitaminA\": 55,\n    \"vitaminB1\": 0.039,\n    \"vitaminB2\": 0.185,\n    \"vitaminB3\": 0.092,\n    \"vitaminB5\": 0.356,\n    \"vitaminB6\": 0.038,\n    \"vitaminB9\": 5,\n    \"vitaminB12\": 0.53,\n    \"vitaminC\": 0.2,\n    \"vitaminD\": 1.2,\n    \"vitaminE\": 0.03,\n    \"vitaminK\": 0.2,\n    \"magnesium\": 11,\n    \"calcium\": 120,\n    \"phosphorus\": 92,\n    \"potassium\": 140,\n    \"iron\": 0.02,\n    \"selenium\": 2.5,\n    \"zinc\": 0.48,\n    \"manganese\": 0.014,\n    \"copper\": 0.006,\n    \"choline\": 16.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 244\n    }\n  },\n  {\n    \"id\": 509,\n    \"name\": \"Nonfat Mozzarella Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 141,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 3.5,\n    \"sugar\": 1.48,\n    \"fiber\": 1.8,\n    \"protein\": 31.7,\n    \"sodium\": 743,\n    \"cholesterol\": 18,\n    \"vitaminA\": 127,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.3,\n    \"vitaminB3\": 0.12,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.08,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 0.92,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.14,\n    \"vitaminK\": 1.6,\n    \"magnesium\": 33,\n    \"calcium\": 961,\n    \"phosphorus\": 656,\n    \"potassium\": 106,\n    \"iron\": 0.31,\n    \"selenium\": 18.9,\n    \"zinc\": 3.92,\n    \"manganese\": 0,\n    \"copper\": 0.034,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 113\n    }\n  },\n  {\n    \"id\": 510,\n    \"name\": \"Feta Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 265,\n    \"fat\": 21.49,\n    \"saturatedFat\": 13.3,\n    \"monounsaturatedFat\": 4.623,\n    \"polyunsaturatedFat\": 0.591,\n    \"carbs\": 3.88,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 14.21,\n    \"sodium\": 1139,\n    \"cholesterol\": 89,\n    \"vitaminA\": 125,\n    \"vitaminB1\": 0.154,\n    \"vitaminB2\": 0.844,\n    \"vitaminB3\": 0.991,\n    \"vitaminB5\": 0.967,\n    \"vitaminB6\": 0.424,\n    \"vitaminB9\": 32,\n    \"vitaminB12\": 1.69,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0.18,\n    \"vitaminK\": 1.8,\n    \"magnesium\": 19,\n    \"calcium\": 493,\n    \"phosphorus\": 337,\n    \"potassium\": 62,\n    \"iron\": 0.65,\n    \"selenium\": 15,\n    \"zinc\": 2.88,\n    \"manganese\": 0.028,\n    \"copper\": 0.032,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 150\n    }\n  },\n  {\n    \"id\": 511,\n    \"name\": \"0% Greek Yogurt\",\n    \"categoryId\": 500,\n    \"energy\": 53,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 2.94,\n    \"sugar\": 2.94,\n    \"fiber\": 0,\n    \"protein\": 10.59,\n    \"sodium\": 38,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 118,\n    \"phosphorus\": 0,\n    \"potassium\": 0,\n    \"iron\": 0,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0\n  },\n  {\n    \"id\": 512,\n    \"name\": \"1% Cottage Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 72,\n    \"fat\": 1.02,\n    \"saturatedFat\": 0.645,\n    \"monounsaturatedFat\": 0.291,\n    \"polyunsaturatedFat\": 0.031,\n    \"carbs\": 2.72,\n    \"sugar\": 2.72,\n    \"fiber\": 0,\n    \"protein\": 12.39,\n    \"sodium\": 406,\n    \"cholesterol\": 4,\n    \"vitaminA\": 11,\n    \"vitaminB1\": 0.021,\n    \"vitaminB2\": 0.165,\n    \"vitaminB3\": 0.128,\n    \"vitaminB5\": 0.215,\n    \"vitaminB6\": 0.068,\n    \"vitaminB9\": 12,\n    \"vitaminB12\": 0.63,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.01,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 5,\n    \"calcium\": 61,\n    \"phosphorus\": 134,\n    \"potassium\": 86,\n    \"iron\": 0.14,\n    \"selenium\": 9,\n    \"zinc\": 0.38,\n    \"manganese\": 0.003,\n    \"copper\": 0.028,\n    \"choline\": 17.5,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 226\n    }\n  },\n  {\n    \"id\": 513,\n    \"name\": \"2% Cottage Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 81,\n    \"fat\": 2.27,\n    \"saturatedFat\": 1.235,\n    \"monounsaturatedFat\": 0.516,\n    \"polyunsaturatedFat\": 0.083,\n    \"carbs\": 4.76,\n    \"sugar\": 4,\n    \"fiber\": 0,\n    \"protein\": 10.45,\n    \"sodium\": 308,\n    \"cholesterol\": 12,\n    \"vitaminA\": 68,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.251,\n    \"vitaminB3\": 0.103,\n    \"vitaminB5\": 0.524,\n    \"vitaminB6\": 0.057,\n    \"vitaminB9\": 8,\n    \"vitaminB12\": 0.47,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.08,\n    \"vitaminK\": 0,\n    \"magnesium\": 9,\n    \"calcium\": 111,\n    \"phosphorus\": 150,\n    \"potassium\": 125,\n    \"iron\": 0.13,\n    \"selenium\": 11.9,\n    \"zinc\": 0.51,\n    \"manganese\": 0.015,\n    \"copper\": 0.033,\n    \"choline\": 16.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 226\n    }\n  },\n  {\n    \"id\": 514,\n    \"name\": \"Grated Parmesan Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 420,\n    \"fat\": 27.84,\n    \"saturatedFat\": 15.371,\n    \"monounsaturatedFat\": 7.13,\n    \"polyunsaturatedFat\": 1.386,\n    \"carbs\": 13.91,\n    \"sugar\": 0.07,\n    \"fiber\": 0,\n    \"protein\": 28.42,\n    \"sodium\": 1804,\n    \"cholesterol\": 86,\n    \"vitaminA\": 262,\n    \"vitaminB1\": 0.026,\n    \"vitaminB2\": 0.358,\n    \"vitaminB3\": 0.08,\n    \"vitaminB5\": 0.45,\n    \"vitaminB6\": 0.081,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 1.4,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.53,\n    \"vitaminK\": 1.7,\n    \"magnesium\": 34,\n    \"calcium\": 853,\n    \"phosphorus\": 627,\n    \"potassium\": 180,\n    \"iron\": 0.49,\n    \"selenium\": 34.4,\n    \"zinc\": 4.2,\n    \"manganese\": 0.071,\n    \"copper\": 0.04,\n    \"choline\": 14.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 100\n    }\n  },\n  {\n    \"id\": 515,\n    \"name\": \"Light Whipping Cream\",\n    \"categoryId\": 500,\n    \"energy\": 292,\n    \"fat\": 30.91,\n    \"saturatedFat\": 19.337,\n    \"monounsaturatedFat\": 9.093,\n    \"polyunsaturatedFat\": 0.884,\n    \"carbs\": 2.96,\n    \"sugar\": 2.96,\n    \"fiber\": 0,\n    \"protein\": 2.17,\n    \"sodium\": 34,\n    \"cholesterol\": 111,\n    \"vitaminA\": 279,\n    \"vitaminB1\": 0.024,\n    \"vitaminB2\": 0.125,\n    \"vitaminB3\": 0.042,\n    \"vitaminB5\": 0.259,\n    \"vitaminB6\": 0.028,\n    \"vitaminB9\": 4,\n    \"vitaminB12\": 0.2,\n    \"vitaminC\": 0.6,\n    \"vitaminD\": 0.6,\n    \"vitaminE\": 0.88,\n    \"vitaminK\": 2.7,\n    \"magnesium\": 7,\n    \"calcium\": 69,\n    \"phosphorus\": 61,\n    \"potassium\": 97,\n    \"iron\": 0.03,\n    \"selenium\": 0.5,\n    \"zinc\": 0.25,\n    \"manganese\": 0.001,\n    \"copper\": 0.007,\n    \"choline\": 16.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 239\n    }\n  },\n  {\n    \"id\": 516,\n    \"name\": \"Reduced Fat Grated Parmesan Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 265,\n    \"fat\": 20,\n    \"saturatedFat\": 13.317,\n    \"monounsaturatedFat\": 6.098,\n    \"polyunsaturatedFat\": 0.462,\n    \"carbs\": 1.37,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20,\n    \"sodium\": 1529,\n    \"cholesterol\": 88,\n    \"vitaminA\": 160,\n    \"vitaminB1\": 0.029,\n    \"vitaminB2\": 0.486,\n    \"vitaminB3\": 0.114,\n    \"vitaminB5\": 0.325,\n    \"vitaminB6\": 0.049,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 2.26,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0.17,\n    \"vitaminK\": 1.7,\n    \"magnesium\": 38,\n    \"calcium\": 1109,\n    \"phosphorus\": 729,\n    \"potassium\": 125,\n    \"iron\": 0.9,\n    \"selenium\": 17.7,\n    \"zinc\": 3.87,\n    \"manganese\": 0.085,\n    \"copper\": 0.238,\n    \"choline\": 20.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 100\n    }\n  },\n  {\n    \"id\": 517,\n    \"name\": \"Neufchatel Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 253,\n    \"fat\": 22.78,\n    \"saturatedFat\": 12.79,\n    \"monounsaturatedFat\": 5.784,\n    \"polyunsaturatedFat\": 0.97,\n    \"carbs\": 3.59,\n    \"sugar\": 3.19,\n    \"fiber\": 0,\n    \"protein\": 9.15,\n    \"sodium\": 334,\n    \"cholesterol\": 74,\n    \"vitaminA\": 241,\n    \"vitaminB1\": 0.022,\n    \"vitaminB2\": 0.155,\n    \"vitaminB3\": 0.21,\n    \"vitaminB5\": 0.575,\n    \"vitaminB6\": 0.041,\n    \"vitaminB9\": 14,\n    \"vitaminB12\": 0.3,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.4,\n    \"vitaminK\": 1.7,\n    \"magnesium\": 10,\n    \"calcium\": 117,\n    \"phosphorus\": 138,\n    \"potassium\": 152,\n    \"iron\": 0.13,\n    \"selenium\": 3,\n    \"zinc\": 0.82,\n    \"manganese\": 0.011,\n    \"copper\": 0.027,\n    \"choline\": 0\n  },\n  {\n    \"id\": 518,\n    \"name\": \"Low Fat Cream Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 208,\n    \"fat\": 16.67,\n    \"saturatedFat\": 10,\n    \"monounsaturatedFat\": 3.996,\n    \"polyunsaturatedFat\": 0.575,\n    \"carbs\": 6.73,\n    \"sugar\": 3.3,\n    \"fiber\": 0,\n    \"protein\": 7.85,\n    \"sodium\": 317,\n    \"cholesterol\": 54,\n    \"vitaminA\": 161,\n    \"vitaminB1\": 0.04,\n    \"vitaminB2\": 0.185,\n    \"vitaminB3\": 0.125,\n    \"vitaminB5\": 0.845,\n    \"vitaminB6\": 0.045,\n    \"vitaminB9\": 19,\n    \"vitaminB12\": 0.92,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.3,\n    \"vitaminE\": 0.27,\n    \"vitaminK\": 1.1,\n    \"magnesium\": 8,\n    \"calcium\": 148,\n    \"phosphorus\": 152,\n    \"potassium\": 247,\n    \"iron\": 0.17,\n    \"selenium\": 4,\n    \"zinc\": 0.57,\n    \"manganese\": 0.011,\n    \"copper\": 0.032,\n    \"choline\": 12.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 240\n    }\n  },\n  {\n    \"id\": 519,\n    \"name\": \"Fat Free American Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 126,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 10.53,\n    \"sugar\": 5.26,\n    \"fiber\": 0,\n    \"protein\": 21.05,\n    \"sodium\": 1316,\n    \"cholesterol\": 26,\n    \"vitaminA\": 56,\n    \"vitaminB1\": 0.412,\n    \"vitaminB2\": 0.545,\n    \"vitaminB3\": 5.56,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.567,\n    \"vitaminB9\": 9,\n    \"vitaminB12\": 1.85,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.27,\n    \"vitaminK\": 0.2,\n    \"magnesium\": 115,\n    \"calcium\": 789,\n    \"phosphorus\": 316,\n    \"potassium\": 393,\n    \"iron\": 0,\n    \"selenium\": 14.6,\n    \"zinc\": 4.11,\n    \"manganese\": 0,\n    \"copper\": 0.559,\n    \"choline\": 38.4\n  },\n  {\n    \"id\": 520,\n    \"name\": \"Cream Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 350,\n    \"fat\": 34.44,\n    \"saturatedFat\": 20.213,\n    \"monounsaturatedFat\": 8.907,\n    \"polyunsaturatedFat\": 1.483,\n    \"carbs\": 5.52,\n    \"sugar\": 3.76,\n    \"fiber\": 0,\n    \"protein\": 6.15,\n    \"sodium\": 314,\n    \"cholesterol\": 101,\n    \"vitaminA\": 308,\n    \"vitaminB1\": 0.023,\n    \"vitaminB2\": 0.23,\n    \"vitaminB3\": 0.091,\n    \"vitaminB5\": 0.517,\n    \"vitaminB6\": 0.056,\n    \"vitaminB9\": 9,\n    \"vitaminB12\": 0.22,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.86,\n    \"vitaminK\": 2.1,\n    \"magnesium\": 9,\n    \"calcium\": 97,\n    \"phosphorus\": 107,\n    \"potassium\": 132,\n    \"iron\": 0.11,\n    \"selenium\": 8.6,\n    \"zinc\": 0.5,\n    \"manganese\": 0.011,\n    \"copper\": 0.018,\n    \"choline\": 26.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 232\n    }\n  },\n  {\n    \"id\": 521,\n    \"name\": \"Gouda Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 356,\n    \"fat\": 27.44,\n    \"saturatedFat\": 17.614,\n    \"monounsaturatedFat\": 7.747,\n    \"polyunsaturatedFat\": 0.657,\n    \"carbs\": 2.22,\n    \"sugar\": 2.22,\n    \"fiber\": 0,\n    \"protein\": 24.94,\n    \"sodium\": 819,\n    \"cholesterol\": 114,\n    \"vitaminA\": 165,\n    \"vitaminB1\": 0.03,\n    \"vitaminB2\": 0.334,\n    \"vitaminB3\": 0.063,\n    \"vitaminB5\": 0.34,\n    \"vitaminB6\": 0.08,\n    \"vitaminB9\": 21,\n    \"vitaminB12\": 1.54,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.24,\n    \"vitaminK\": 2.3,\n    \"magnesium\": 29,\n    \"calcium\": 700,\n    \"phosphorus\": 546,\n    \"potassium\": 121,\n    \"iron\": 0.24,\n    \"selenium\": 14.5,\n    \"zinc\": 3.9,\n    \"manganese\": 0.011,\n    \"copper\": 0.036,\n    \"choline\": 15.4\n  },\n  {\n    \"id\": 522,\n    \"name\": \"Brie Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 334,\n    \"fat\": 27.68,\n    \"saturatedFat\": 17.41,\n    \"monounsaturatedFat\": 8.013,\n    \"polyunsaturatedFat\": 0.826,\n    \"carbs\": 0.45,\n    \"sugar\": 0.45,\n    \"fiber\": 0,\n    \"protein\": 20.75,\n    \"sodium\": 629,\n    \"cholesterol\": 100,\n    \"vitaminA\": 174,\n    \"vitaminB1\": 0.07,\n    \"vitaminB2\": 0.52,\n    \"vitaminB3\": 0.38,\n    \"vitaminB5\": 0.69,\n    \"vitaminB6\": 0.235,\n    \"vitaminB9\": 65,\n    \"vitaminB12\": 1.65,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.24,\n    \"vitaminK\": 2.3,\n    \"magnesium\": 20,\n    \"calcium\": 184,\n    \"phosphorus\": 188,\n    \"potassium\": 152,\n    \"iron\": 0.5,\n    \"selenium\": 14.5,\n    \"zinc\": 2.38,\n    \"manganese\": 0.034,\n    \"copper\": 0.019,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 240\n    }\n  },\n  {\n    \"id\": 523,\n    \"name\": \"Cheddar Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 410,\n    \"fat\": 33.82,\n    \"saturatedFat\": 19.368,\n    \"monounsaturatedFat\": 8.428,\n    \"polyunsaturatedFat\": 1.433,\n    \"carbs\": 2.13,\n    \"sugar\": 0.27,\n    \"fiber\": 0,\n    \"protein\": 24.25,\n    \"sodium\": 644,\n    \"cholesterol\": 99,\n    \"vitaminA\": 263,\n    \"vitaminB1\": 0.027,\n    \"vitaminB2\": 0.434,\n    \"vitaminB3\": 0.039,\n    \"vitaminB5\": 0.481,\n    \"vitaminB6\": 0.075,\n    \"vitaminB9\": 27,\n    \"vitaminB12\": 0.88,\n    \"vitaminC\": 0,\n    \"vitaminD\": 1,\n    \"vitaminE\": 0.78,\n    \"vitaminK\": 2.4,\n    \"magnesium\": 27,\n    \"calcium\": 711,\n    \"phosphorus\": 460,\n    \"potassium\": 76,\n    \"iron\": 0.16,\n    \"selenium\": 28.3,\n    \"zinc\": 3.74,\n    \"manganese\": 0.024,\n    \"copper\": 0.035,\n    \"choline\": 16.5\n  },\n  {\n    \"id\": 524,\n    \"name\": \"Blue Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 353,\n    \"fat\": 28.74,\n    \"saturatedFat\": 18.669,\n    \"monounsaturatedFat\": 7.778,\n    \"polyunsaturatedFat\": 0.8,\n    \"carbs\": 2.34,\n    \"sugar\": 0.5,\n    \"fiber\": 0,\n    \"protein\": 21.4,\n    \"sodium\": 1146,\n    \"cholesterol\": 75,\n    \"vitaminA\": 198,\n    \"vitaminB1\": 0.029,\n    \"vitaminB2\": 0.382,\n    \"vitaminB3\": 1.016,\n    \"vitaminB5\": 1.729,\n    \"vitaminB6\": 0.166,\n    \"vitaminB9\": 36,\n    \"vitaminB12\": 1.22,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.25,\n    \"vitaminK\": 2.4,\n    \"magnesium\": 23,\n    \"calcium\": 528,\n    \"phosphorus\": 387,\n    \"potassium\": 256,\n    \"iron\": 0.31,\n    \"selenium\": 14.5,\n    \"zinc\": 2.66,\n    \"manganese\": 0.009,\n    \"copper\": 0.04,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 135\n    }\n  },\n  {\n    \"id\": 525,\n    \"name\": \"Egg Yolk\",\n    \"categoryId\": 500,\n    \"energy\": 322,\n    \"fat\": 26.54,\n    \"saturatedFat\": 9.551,\n    \"monounsaturatedFat\": 11.738,\n    \"polyunsaturatedFat\": 4.204,\n    \"carbs\": 3.59,\n    \"sugar\": 0.56,\n    \"fiber\": 0,\n    \"protein\": 15.86,\n    \"sodium\": 48,\n    \"cholesterol\": 1085,\n    \"vitaminA\": 381,\n    \"vitaminB1\": 0.176,\n    \"vitaminB2\": 0.528,\n    \"vitaminB3\": 0.024,\n    \"vitaminB5\": 2.99,\n    \"vitaminB6\": 0.35,\n    \"vitaminB9\": 146,\n    \"vitaminB12\": 1.95,\n    \"vitaminC\": 0,\n    \"vitaminD\": 5.4,\n    \"vitaminE\": 2.58,\n    \"vitaminK\": 0.7,\n    \"magnesium\": 5,\n    \"calcium\": 129,\n    \"phosphorus\": 390,\n    \"potassium\": 109,\n    \"iron\": 2.73,\n    \"selenium\": 56,\n    \"zinc\": 2.3,\n    \"manganese\": 0.055,\n    \"copper\": 0.077,\n    \"choline\": 820.2,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 243\n    }\n  },\n  {\n    \"id\": 526,\n    \"name\": \"Provolone Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 351,\n    \"fat\": 26.62,\n    \"saturatedFat\": 17.078,\n    \"monounsaturatedFat\": 7.393,\n    \"polyunsaturatedFat\": 0.769,\n    \"carbs\": 2.14,\n    \"sugar\": 0.56,\n    \"fiber\": 0,\n    \"protein\": 25.58,\n    \"sodium\": 727,\n    \"cholesterol\": 69,\n    \"vitaminA\": 236,\n    \"vitaminB1\": 0.019,\n    \"vitaminB2\": 0.321,\n    \"vitaminB3\": 0.156,\n    \"vitaminB5\": 0.476,\n    \"vitaminB6\": 0.073,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 1.46,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.23,\n    \"vitaminK\": 2.2,\n    \"magnesium\": 28,\n    \"calcium\": 756,\n    \"phosphorus\": 496,\n    \"potassium\": 138,\n    \"iron\": 0.52,\n    \"selenium\": 14.5,\n    \"zinc\": 3.23,\n    \"manganese\": 0.01,\n    \"copper\": 0.026,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 132\n    }\n  },\n  {\n    \"id\": 527,\n    \"name\": \"Reduced Fat Provolone Chesse\",\n    \"categoryId\": 500,\n    \"energy\": 274,\n    \"fat\": 17.6,\n    \"saturatedFat\": 11.3,\n    \"monounsaturatedFat\": 4.89,\n    \"polyunsaturatedFat\": 0.51,\n    \"carbs\": 3.5,\n    \"sugar\": 0.55,\n    \"fiber\": 0,\n    \"protein\": 24.7,\n    \"sodium\": 615,\n    \"cholesterol\": 55,\n    \"vitaminA\": 141,\n    \"vitaminB1\": 0.019,\n    \"vitaminB2\": 0.321,\n    \"vitaminB3\": 0.156,\n    \"vitaminB5\": 0.476,\n    \"vitaminB6\": 0.073,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 1.46,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.3,\n    \"vitaminE\": 0.15,\n    \"vitaminK\": 1.5,\n    \"magnesium\": 28,\n    \"calcium\": 756,\n    \"phosphorus\": 496,\n    \"potassium\": 138,\n    \"iron\": 0.52,\n    \"selenium\": 14.5,\n    \"zinc\": 3.23,\n    \"manganese\": 0.01,\n    \"copper\": 0.026,\n    \"choline\": 12.9,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 113\n    }\n  },\n  {\n    \"id\": 528,\n    \"name\": \"Swiss Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 393,\n    \"fat\": 30.99,\n    \"saturatedFat\": 18.227,\n    \"monounsaturatedFat\": 8.046,\n    \"polyunsaturatedFat\": 1.341,\n    \"carbs\": 1.44,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 26.96,\n    \"sodium\": 187,\n    \"cholesterol\": 93,\n    \"vitaminA\": 288,\n    \"vitaminB1\": 0.011,\n    \"vitaminB2\": 0.302,\n    \"vitaminB3\": 0.064,\n    \"vitaminB5\": 0.353,\n    \"vitaminB6\": 0.071,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 3.06,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.6,\n    \"vitaminK\": 1.4,\n    \"magnesium\": 33,\n    \"calcium\": 890,\n    \"phosphorus\": 574,\n    \"potassium\": 72,\n    \"iron\": 0.13,\n    \"selenium\": 30,\n    \"zinc\": 4.37,\n    \"manganese\": 0.026,\n    \"copper\": 0.047,\n    \"choline\": 13.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 244\n    }\n  },\n  {\n    \"id\": 529,\n    \"name\": \"Low Fat Swiss Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 179,\n    \"fat\": 5.1,\n    \"saturatedFat\": 3.304,\n    \"monounsaturatedFat\": 1.351,\n    \"polyunsaturatedFat\": 0.18,\n    \"carbs\": 3.4,\n    \"sugar\": 1.33,\n    \"fiber\": 0,\n    \"protein\": 28.4,\n    \"sodium\": 199,\n    \"cholesterol\": 35,\n    \"vitaminA\": 40,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.36,\n    \"vitaminB3\": 0.09,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.08,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 1.68,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.07,\n    \"vitaminK\": 0.5,\n    \"magnesium\": 36,\n    \"calcium\": 961,\n    \"phosphorus\": 605,\n    \"potassium\": 111,\n    \"iron\": 0.17,\n    \"selenium\": 12.7,\n    \"zinc\": 3.9,\n    \"manganese\": 0,\n    \"copper\": 0.027,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 132\n    }\n  },\n  {\n    \"id\": 530,\n    \"name\": \"White Queso Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 310,\n    \"fat\": 24.31,\n    \"saturatedFat\": 13.661,\n    \"monounsaturatedFat\": 6.459,\n    \"polyunsaturatedFat\": 1.149,\n    \"carbs\": 2.53,\n    \"sugar\": 1.76,\n    \"fiber\": 0,\n    \"protein\": 20.38,\n    \"sodium\": 704,\n    \"cholesterol\": 70,\n    \"vitaminA\": 157,\n    \"vitaminB1\": 0.048,\n    \"vitaminB2\": 0.23,\n    \"vitaminB3\": 0.035,\n    \"vitaminB5\": 0.397,\n    \"vitaminB6\": 0.086,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 1.75,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.7,\n    \"vitaminE\": 0.47,\n    \"vitaminK\": 1.6,\n    \"magnesium\": 29,\n    \"calcium\": 690,\n    \"phosphorus\": 467,\n    \"potassium\": 126,\n    \"iron\": 0.18,\n    \"selenium\": 13.8,\n    \"zinc\": 3.06,\n    \"manganese\": 0.021,\n    \"copper\": 0.025,\n    \"choline\": 15.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 118\n    }\n  },\n  {\n    \"id\": 531,\n    \"name\": \"Part Skim Ricotta Cheese\",\n    \"categoryId\": 500,\n    \"energy\": 138,\n    \"fat\": 7.91,\n    \"saturatedFat\": 4.927,\n    \"monounsaturatedFat\": 2.314,\n    \"polyunsaturatedFat\": 0.26,\n    \"carbs\": 5.14,\n    \"sugar\": 0.31,\n    \"fiber\": 0,\n    \"protein\": 11.39,\n    \"sodium\": 99,\n    \"cholesterol\": 31,\n    \"vitaminA\": 107,\n    \"vitaminB1\": 0.021,\n    \"vitaminB2\": 0.185,\n    \"vitaminB3\": 0.078,\n    \"vitaminB5\": 0.242,\n    \"vitaminB6\": 0.02,\n    \"vitaminB9\": 13,\n    \"vitaminB12\": 0.29,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.07,\n    \"vitaminK\": 0.7,\n    \"magnesium\": 15,\n    \"calcium\": 272,\n    \"phosphorus\": 183,\n    \"potassium\": 125,\n    \"iron\": 0.44,\n    \"selenium\": 16.7,\n    \"zinc\": 1.34,\n    \"manganese\": 0.01,\n    \"copper\": 0.034,\n    \"choline\": 16.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 124\n    }\n  },\n  {\n    \"id\": 532,\n    \"name\": \"Egg White Wraps\",\n    \"categoryId\": 500,\n    \"energy\": 89,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 17.86,\n    \"sodium\": 429,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 36,\n    \"phosphorus\": 0,\n    \"potassium\": 250,\n    \"iron\": 0,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/fatsAndOils.json",
    "content": "[\n    {\n      \"id\": 2001,\n      \"name\": \"PAM cooking spray\",\n      \"categoryId\": 2000,\n      \"energy\": 792,\n      \"fat\": 78.69,\n      \"saturatedFat\": 5.025,\n      \"monounsaturatedFat\": 49.792,\n      \"polyunsaturatedFat\": 22.145,\n      \"carbs\": 20.69,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0.26,\n      \"sodium\": 59,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0\n    },\n    {\n      \"id\": 2002,\n      \"name\": \"Butter\",\n      \"categoryId\": 2000,\n      \"energy\": 717,\n      \"fat\": 81.11,\n      \"saturatedFat\": 51.368,\n      \"monounsaturatedFat\": 21.021,\n      \"polyunsaturatedFat\": 3.043,\n      \"carbs\": 0.06,\n      \"sugar\": 0.06,\n      \"fiber\": 0,\n      \"protein\": 0.85,\n      \"sodium\": 643,\n      \"cholesterol\": 215,\n      \"vitaminA\": 684,\n      \"vitaminB1\": 0.005,\n      \"vitaminB2\": 0.034,\n      \"vitaminB3\": 0.042,\n      \"vitaminB5\": 0.11,\n      \"vitaminB6\": 0.003,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0.17,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.32,\n      \"vitaminK\": 7,\n      \"magnesium\": 2,\n      \"calcium\": 24,\n      \"phosphorus\": 24,\n      \"potassium\": 24,\n      \"iron\": 0.02,\n      \"selenium\": 1,\n      \"zinc\": 0.09,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 18.8,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 227\n      }\n    },\n    {\n      \"id\": 2003,\n      \"name\": \"Olive Oil\",\n      \"categoryId\": 2000,\n      \"energy\": 884,\n      \"fat\": 100,\n      \"saturatedFat\": 13.808,\n      \"monounsaturatedFat\": 72.961,\n      \"polyunsaturatedFat\": 10.523,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 14.35,\n      \"vitaminK\": 60.2,\n      \"magnesium\": 0,\n      \"calcium\": 1,\n      \"phosphorus\": 0,\n      \"potassium\": 1,\n      \"iron\": 0.56,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0.3,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 13.5\n      }\n    },\n    {\n      \"id\": 2004,\n      \"name\": \"Coconut oil\",\n      \"categoryId\": 2000,\n      \"energy\": 892,\n      \"fat\": 99.06,\n      \"saturatedFat\": 82.475,\n      \"monounsaturatedFat\": 6.332,\n      \"polyunsaturatedFat\": 1.702,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.11,\n      \"vitaminK\": 0.6,\n      \"magnesium\": 0,\n      \"calcium\": 1,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0.05,\n      \"selenium\": 0,\n      \"zinc\": 0.02,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0.3,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 218\n      }\n    },\n    {\n      \"id\": 2005,\n      \"name\": \"Avocado Oil\",\n      \"categoryId\": 2000,\n      \"energy\": 884,\n      \"fat\": 100,\n      \"saturatedFat\": 11.56,\n      \"monounsaturatedFat\": 70.554,\n      \"polyunsaturatedFat\": 13.486,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 4.5\n      }\n    },\n    {\n      \"id\": 2006,\n      \"name\": \"Flaxseed Oil\",\n      \"categoryId\": 2000,\n      \"energy\": 884,\n      \"fat\": 99.98,\n      \"saturatedFat\": 8.976,\n      \"monounsaturatedFat\": 18.438,\n      \"polyunsaturatedFat\": 67.849,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0.11,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.47,\n      \"vitaminK\": 9.3,\n      \"magnesium\": 0,\n      \"calcium\": 1,\n      \"phosphorus\": 1,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0.07,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0.2,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 13.6\n      }\n    },\n    {\n      \"id\": 2007,\n      \"name\": \"Canola Oil\",\n      \"categoryId\": 2000,\n      \"energy\": 884,\n      \"fat\": 100,\n      \"saturatedFat\": 7.365,\n      \"monounsaturatedFat\": 63.276,\n      \"polyunsaturatedFat\": 28.142,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 17.46,\n      \"vitaminK\": 71.3,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0.2,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 4.5\n      }\n    },\n    {\n      \"id\": 2008,\n      \"name\": \"Salmon Oil\",\n      \"categoryId\": 2000,\n      \"energy\": 902,\n      \"fat\": 100,\n      \"saturatedFat\": 19.872,\n      \"monounsaturatedFat\": 29.037,\n      \"polyunsaturatedFat\": 40.324,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 0,\n      \"cholesterol\": 485,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 4.5\n      }\n    },\n    {\n      \"id\": 2009,\n      \"name\": \"Italian Salad Dressing\",\n      \"categoryId\": 2000,\n      \"energy\": 240,\n      \"fat\": 21.12,\n      \"saturatedFat\": 2.948,\n      \"monounsaturatedFat\": 5.638,\n      \"polyunsaturatedFat\": 10.748,\n      \"carbs\": 12.12,\n      \"sugar\": 10.77,\n      \"fiber\": 0,\n      \"protein\": 0.41,\n      \"sodium\": 993,\n      \"cholesterol\": 0,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.02,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0.131,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.064,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.19,\n      \"vitaminK\": 56,\n      \"magnesium\": 5,\n      \"calcium\": 13,\n      \"phosphorus\": 15,\n      \"potassium\": 84,\n      \"iron\": 0.26,\n      \"selenium\": 2,\n      \"zinc\": 0.07,\n      \"manganese\": 0.031,\n      \"copper\": 0.019,\n      \"choline\": 2.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 235\n      }\n    },\n    {\n      \"id\": 2010,\n      \"name\": \"Fat Free Italian Salad Dressing\",\n      \"categoryId\": 2000,\n      \"energy\": 47,\n      \"fat\": 0.87,\n      \"saturatedFat\": 0.295,\n      \"monounsaturatedFat\": 0.235,\n      \"polyunsaturatedFat\": 0.192,\n      \"carbs\": 8.75,\n      \"sugar\": 8.85,\n      \"fiber\": 0.6,\n      \"protein\": 0.97,\n      \"sodium\": 1129,\n      \"cholesterol\": 2,\n      \"vitaminA\": 4,\n      \"vitaminB1\": 0.031,\n      \"vitaminB2\": 0.053,\n      \"vitaminB3\": 0.135,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 12,\n      \"vitaminB12\": 0.31,\n      \"vitaminC\": 0.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.76,\n      \"vitaminK\": 1.6,\n      \"magnesium\": 5,\n      \"calcium\": 30,\n      \"phosphorus\": 109,\n      \"potassium\": 102,\n      \"iron\": 0.4,\n      \"selenium\": 2,\n      \"zinc\": 0.36,\n      \"manganese\": 0.032,\n      \"copper\": 0.116,\n      \"choline\": 4,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 14\n      }\n    },\n    {\n      \"id\": 2011,\n      \"name\": \"Light Italian Salad Dressing\",\n      \"categoryId\": 2000,\n      \"energy\": 102,\n      \"fat\": 6.68,\n      \"saturatedFat\": 0.833,\n      \"monounsaturatedFat\": 1.725,\n      \"polyunsaturatedFat\": 3.236,\n      \"carbs\": 9.99,\n      \"sugar\": 9.16,\n      \"fiber\": 0,\n      \"protein\": 0.39,\n      \"sodium\": 891,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.012,\n      \"vitaminB2\": 0.008,\n      \"vitaminB3\": 0.094,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.055,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 4.28,\n      \"vitaminK\": 12.5,\n      \"magnesium\": 4,\n      \"calcium\": 15,\n      \"phosphorus\": 12,\n      \"potassium\": 90,\n      \"iron\": 0.25,\n      \"selenium\": 1.6,\n      \"zinc\": 0.06,\n      \"manganese\": 0,\n      \"copper\": 0.019,\n      \"choline\": 3.3\n    },\n    {\n      \"id\": 2012,\n      \"name\": \"Light Mayonnaise\",\n      \"categoryId\": 2000,\n      \"energy\": 238,\n      \"fat\": 22.22,\n      \"saturatedFat\": 3.446,\n      \"monounsaturatedFat\": 5.01,\n      \"polyunsaturatedFat\": 12.993,\n      \"carbs\": 9.23,\n      \"sugar\": 3.56,\n      \"fiber\": 0,\n      \"protein\": 0.37,\n      \"sodium\": 827,\n      \"cholesterol\": 16,\n      \"vitaminA\": 8,\n      \"vitaminB1\": 0.008,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0.01,\n      \"vitaminB5\": 0.058,\n      \"vitaminB6\": 0.002,\n      \"vitaminB9\": 4,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.19,\n      \"vitaminK\": 53.7,\n      \"magnesium\": 2,\n      \"calcium\": 6,\n      \"phosphorus\": 15,\n      \"potassium\": 31,\n      \"iron\": 0.14,\n      \"selenium\": 2.6,\n      \"zinc\": 0.07,\n      \"manganese\": 0.007,\n      \"copper\": 0.019,\n      \"choline\": 9,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 15\n      }\n    },\n    {\n      \"id\": 2013,\n      \"name\": \"Mayonnaise\",\n      \"categoryId\": 2000,\n      \"energy\": 680,\n      \"fat\": 74.85,\n      \"saturatedFat\": 11.703,\n      \"monounsaturatedFat\": 16.843,\n      \"polyunsaturatedFat\": 44.69,\n      \"carbs\": 0.57,\n      \"sugar\": 0.57,\n      \"fiber\": 0,\n      \"protein\": 0.96,\n      \"sodium\": 635,\n      \"cholesterol\": 42,\n      \"vitaminA\": 16,\n      \"vitaminB1\": 0.01,\n      \"vitaminB2\": 0.019,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.008,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0.12,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0.2,\n      \"vitaminE\": 3.28,\n      \"vitaminK\": 163,\n      \"magnesium\": 1,\n      \"calcium\": 8,\n      \"phosphorus\": 21,\n      \"potassium\": 20,\n      \"iron\": 0.21,\n      \"selenium\": 2.3,\n      \"zinc\": 0.15,\n      \"manganese\": 0,\n      \"copper\": 0.019,\n      \"choline\": 34.2\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/finfishAndShellFish.json",
    "content": "[\n  {\n    \"id\": 401,\n    \"name\": \"Wild Atlantic Salmon\",\n    \"categoryId\": 400,\n    \"energy\": 142,\n    \"fat\": 6.34,\n    \"saturatedFat\": 0.981,\n    \"monounsaturatedFat\": 2.103,\n    \"polyunsaturatedFat\": 2.539,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 19.84,\n    \"sodium\": 44,\n    \"cholesterol\": 55,\n    \"vitaminA\": 12,\n    \"vitaminB1\": 0.226,\n    \"vitaminB2\": 0.38,\n    \"vitaminB3\": 7.86,\n    \"vitaminB5\": 1.664,\n    \"vitaminB6\": 0.818,\n    \"vitaminB9\": 25,\n    \"vitaminB12\": 3.18,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 29,\n    \"calcium\": 12,\n    \"phosphorus\": 200,\n    \"potassium\": 490,\n    \"iron\": 0.8,\n    \"selenium\": 36.5,\n    \"zinc\": 0.64,\n    \"manganese\": 0.016,\n    \"copper\": 0.25,\n    \"choline\": 0\n  },\n  {\n    \"id\": 402,\n    \"name\": \"Canned Tuna (in water)\",\n    \"categoryId\": 400,\n    \"energy\": 128,\n    \"fat\": 2.97,\n    \"saturatedFat\": 0.792,\n    \"monounsaturatedFat\": 0.784,\n    \"polyunsaturatedFat\": 1.109,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 23.62,\n    \"sodium\": 377,\n    \"cholesterol\": 42,\n    \"vitaminA\": 6,\n    \"vitaminB1\": 0.008,\n    \"vitaminB2\": 0.044,\n    \"vitaminB3\": 5.799,\n    \"vitaminB5\": 0.124,\n    \"vitaminB6\": 0.217,\n    \"vitaminB9\": 2,\n    \"vitaminB12\": 1.17,\n    \"vitaminC\": 0,\n    \"vitaminD\": 2,\n    \"vitaminE\": 0.85,\n    \"vitaminK\": 2.5,\n    \"magnesium\": 33,\n    \"calcium\": 14,\n    \"phosphorus\": 217,\n    \"potassium\": 237,\n    \"iron\": 0.97,\n    \"selenium\": 65.7,\n    \"zinc\": 0.48,\n    \"manganese\": 0.019,\n    \"copper\": 0.039,\n    \"choline\": 29.3\n  },\n  {\n    \"id\": 403,\n    \"name\": \"Shrimp\",\n    \"categoryId\": 400,\n    \"energy\": 85,\n    \"fat\": 0.51,\n    \"saturatedFat\": 0.101,\n    \"monounsaturatedFat\": 0.086,\n    \"polyunsaturatedFat\": 0.152,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.1,\n    \"sodium\": 119,\n    \"cholesterol\": 161,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 35,\n    \"calcium\": 64,\n    \"phosphorus\": 214,\n    \"potassium\": 264,\n    \"iron\": 0.52,\n    \"selenium\": 0,\n    \"zinc\": 1.34,\n    \"manganese\": 0.033,\n    \"copper\": 0.391,\n    \"choline\": 0\n  },\n  {\n    \"id\": 404,\n    \"name\": \"Canned Salmon\",\n    \"categoryId\": 400,\n    \"energy\": 137,\n    \"fat\": 5.48,\n    \"saturatedFat\": 1.009,\n    \"monounsaturatedFat\": 1.499,\n    \"polyunsaturatedFat\": 1.497,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.55,\n    \"sodium\": 403,\n    \"cholesterol\": 59,\n    \"vitaminA\": 25,\n    \"vitaminB1\": 0.025,\n    \"vitaminB2\": 0.19,\n    \"vitaminB3\": 6.776,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.268,\n    \"vitaminB9\": 13,\n    \"vitaminB12\": 4.62,\n    \"vitaminC\": 0,\n    \"vitaminD\": 15,\n    \"vitaminE\": 0.97,\n    \"vitaminK\": 0.4,\n    \"magnesium\": 30,\n    \"calcium\": 220,\n    \"phosphorus\": 338,\n    \"potassium\": 336,\n    \"iron\": 0.64,\n    \"selenium\": 33.9,\n    \"zinc\": 0.79,\n    \"manganese\": 0,\n    \"copper\": 0.071,\n    \"choline\": 86.6\n  },\n  {\n    \"id\": 405,\n    \"name\": \"Atlantic Cod\",\n    \"categoryId\": 400,\n    \"energy\": 82,\n    \"fat\": 0.67,\n    \"saturatedFat\": 0.131,\n    \"monounsaturatedFat\": 0.094,\n    \"polyunsaturatedFat\": 0.231,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 17.81,\n    \"sodium\": 54,\n    \"cholesterol\": 43,\n    \"vitaminA\": 12,\n    \"vitaminB1\": 0.076,\n    \"vitaminB2\": 0.065,\n    \"vitaminB3\": 2.063,\n    \"vitaminB5\": 0.153,\n    \"vitaminB6\": 0.245,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 0.91,\n    \"vitaminC\": 1,\n    \"vitaminD\": 0.9,\n    \"vitaminE\": 0.64,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 32,\n    \"calcium\": 16,\n    \"phosphorus\": 203,\n    \"potassium\": 413,\n    \"iron\": 0.38,\n    \"selenium\": 33.1,\n    \"zinc\": 0.45,\n    \"manganese\": 0.015,\n    \"copper\": 0.028,\n    \"choline\": 65.2\n  },\n  {\n    \"id\": 406,\n    \"name\": \"Tilapia\",\n    \"categoryId\": 400,\n    \"energy\": 96,\n    \"fat\": 1.7,\n    \"saturatedFat\": 0.585,\n    \"monounsaturatedFat\": 0.498,\n    \"polyunsaturatedFat\": 0.363,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.08,\n    \"sodium\": 52,\n    \"cholesterol\": 50,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.041,\n    \"vitaminB2\": 0.063,\n    \"vitaminB3\": 3.903,\n    \"vitaminB5\": 0.487,\n    \"vitaminB6\": 0.162,\n    \"vitaminB9\": 24,\n    \"vitaminB12\": 1.58,\n    \"vitaminC\": 0,\n    \"vitaminD\": 3.1,\n    \"vitaminE\": 0.4,\n    \"vitaminK\": 1.4,\n    \"magnesium\": 27,\n    \"calcium\": 10,\n    \"phosphorus\": 170,\n    \"potassium\": 302,\n    \"iron\": 0.56,\n    \"selenium\": 41.8,\n    \"zinc\": 0.33,\n    \"manganese\": 0.037,\n    \"copper\": 0.075,\n    \"choline\": 42.5\n  },\n  {\n    \"id\": 407,\n    \"name\": \"Smoked Salmon\",\n    \"categoryId\": 400,\n    \"energy\": 117,\n    \"fat\": 4.32,\n    \"saturatedFat\": 0.929,\n    \"monounsaturatedFat\": 2.023,\n    \"polyunsaturatedFat\": 0.995,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 18.28,\n    \"sodium\": 672,\n    \"cholesterol\": 23,\n    \"vitaminA\": 26,\n    \"vitaminB1\": 0.023,\n    \"vitaminB2\": 0.101,\n    \"vitaminB3\": 4.72,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.278,\n    \"vitaminB9\": 2,\n    \"vitaminB12\": 3.26,\n    \"vitaminC\": 0,\n    \"vitaminD\": 17.1,\n    \"vitaminE\": 1.35,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 18,\n    \"calcium\": 11,\n    \"phosphorus\": 164,\n    \"potassium\": 175,\n    \"iron\": 0.85,\n    \"selenium\": 32.4,\n    \"zinc\": 0.31,\n    \"manganese\": 0,\n    \"copper\": 0.23,\n    \"choline\": 89\n  },\n  {\n    \"id\": 408,\n    \"name\": \"Cod\",\n    \"categoryId\": 400,\n    \"energy\": 82,\n    \"fat\": 0.67,\n    \"saturatedFat\": 0.131,\n    \"monounsaturatedFat\": 0.094,\n    \"polyunsaturatedFat\": 0.231,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 17.81,\n    \"sodium\": 54,\n    \"cholesterol\": 43,\n    \"vitaminA\": 12,\n    \"vitaminB1\": 0.076,\n    \"vitaminB2\": 0.065,\n    \"vitaminB3\": 2.063,\n    \"vitaminB5\": 0.153,\n    \"vitaminB6\": 0.245,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 0.91,\n    \"vitaminC\": 1,\n    \"vitaminD\": 0.9,\n    \"vitaminE\": 0.64,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 32,\n    \"calcium\": 16,\n    \"phosphorus\": 203,\n    \"potassium\": 413,\n    \"iron\": 0.38,\n    \"selenium\": 33.1,\n    \"zinc\": 0.45,\n    \"manganese\": 0.015,\n    \"copper\": 0.028,\n    \"choline\": 65.2\n  },\n  {\n    \"id\": 409,\n    \"name\": \"Halibut\",\n    \"categoryId\": 400,\n    \"energy\": 91,\n    \"fat\": 1.33,\n    \"saturatedFat\": 0.292,\n    \"monounsaturatedFat\": 0.471,\n    \"polyunsaturatedFat\": 0.29,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 18.56,\n    \"sodium\": 68,\n    \"cholesterol\": 49,\n    \"vitaminA\": 20,\n    \"vitaminB1\": 0.05,\n    \"vitaminB2\": 0.03,\n    \"vitaminB3\": 6.513,\n    \"vitaminB5\": 0.343,\n    \"vitaminB6\": 0.548,\n    \"vitaminB9\": 12,\n    \"vitaminB12\": 1.1,\n    \"vitaminC\": 0,\n    \"vitaminD\": 4.7,\n    \"vitaminE\": 0.61,\n    \"vitaminK\": 0,\n    \"magnesium\": 23,\n    \"calcium\": 7,\n    \"phosphorus\": 236,\n    \"potassium\": 435,\n    \"iron\": 0.16,\n    \"selenium\": 45.6,\n    \"zinc\": 0.36,\n    \"manganese\": 0.011,\n    \"copper\": 0.023,\n    \"choline\": 61.8\n  },\n  {\n    \"id\": 410,\n    \"name\": \"Haddock\",\n    \"categoryId\": 400,\n    \"energy\": 74,\n    \"fat\": 0.45,\n    \"saturatedFat\": 0.091,\n    \"monounsaturatedFat\": 0.061,\n    \"polyunsaturatedFat\": 0.166,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 16.32,\n    \"sodium\": 213,\n    \"cholesterol\": 54,\n    \"vitaminA\": 17,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.057,\n    \"vitaminB3\": 3.363,\n    \"vitaminB5\": 0.403,\n    \"vitaminB6\": 0.281,\n    \"vitaminB9\": 12,\n    \"vitaminB12\": 1.83,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.45,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 21,\n    \"calcium\": 11,\n    \"phosphorus\": 227,\n    \"potassium\": 286,\n    \"iron\": 0.17,\n    \"selenium\": 25.9,\n    \"zinc\": 0.32,\n    \"manganese\": 0.011,\n    \"copper\": 0.021,\n    \"choline\": 65\n  },\n  {\n    \"id\": 411,\n    \"name\": \"Trout\",\n    \"categoryId\": 400,\n    \"energy\": 148,\n    \"fat\": 6.61,\n    \"saturatedFat\": 1.149,\n    \"monounsaturatedFat\": 3.254,\n    \"polyunsaturatedFat\": 1.499,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.77,\n    \"sodium\": 52,\n    \"cholesterol\": 58,\n    \"vitaminA\": 17,\n    \"vitaminB1\": 0.35,\n    \"vitaminB2\": 0.33,\n    \"vitaminB3\": 4.5,\n    \"vitaminB5\": 1.94,\n    \"vitaminB6\": 0.2,\n    \"vitaminB9\": 13,\n    \"vitaminB12\": 7.79,\n    \"vitaminC\": 0.5,\n    \"vitaminD\": 3.9,\n    \"vitaminE\": 0.2,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 22,\n    \"calcium\": 43,\n    \"phosphorus\": 245,\n    \"potassium\": 361,\n    \"iron\": 1.5,\n    \"selenium\": 12.6,\n    \"zinc\": 0.66,\n    \"manganese\": 0.851,\n    \"copper\": 0.188,\n    \"choline\": 65\n  },\n  {\n    \"id\": 412,\n    \"name\": \"Lobster\",\n    \"categoryId\": 400,\n    \"energy\": 77,\n    \"fat\": 0.75,\n    \"saturatedFat\": 0.181,\n    \"monounsaturatedFat\": 0.22,\n    \"polyunsaturatedFat\": 0.296,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 16.52,\n    \"sodium\": 423,\n    \"cholesterol\": 127,\n    \"vitaminA\": 1,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.014,\n    \"vitaminB3\": 1.591,\n    \"vitaminB5\": 1.449,\n    \"vitaminB6\": 0.104,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 1.25,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.87,\n    \"vitaminK\": 0,\n    \"magnesium\": 38,\n    \"calcium\": 84,\n    \"phosphorus\": 161,\n    \"potassium\": 200,\n    \"iron\": 0.26,\n    \"selenium\": 63.6,\n    \"zinc\": 3.53,\n    \"manganese\": 0.056,\n    \"copper\": 1.349,\n    \"choline\": 70.3\n  },\n  {\n    \"id\": 413,\n    \"name\": \"Pacific Oyster\",\n    \"categoryId\": 400,\n    \"energy\": 81,\n    \"fat\": 2.3,\n    \"saturatedFat\": 0.51,\n    \"monounsaturatedFat\": 0.358,\n    \"polyunsaturatedFat\": 0.894,\n    \"carbs\": 4.95,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 9.45,\n    \"sodium\": 106,\n    \"cholesterol\": 50,\n    \"vitaminA\": 81,\n    \"vitaminB1\": 0.067,\n    \"vitaminB2\": 0.233,\n    \"vitaminB3\": 2.01,\n    \"vitaminB5\": 0.5,\n    \"vitaminB6\": 0.05,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 16,\n    \"vitaminC\": 8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 22,\n    \"calcium\": 8,\n    \"phosphorus\": 162,\n    \"potassium\": 168,\n    \"iron\": 5.11,\n    \"selenium\": 77,\n    \"zinc\": 16.62,\n    \"manganese\": 0.643,\n    \"copper\": 1.576,\n    \"choline\": 0\n  },\n  {\n    \"id\": 414,\n    \"name\": \"Squid\",\n    \"categoryId\": 400,\n    \"energy\": 92,\n    \"fat\": 1.38,\n    \"saturatedFat\": 0.358,\n    \"monounsaturatedFat\": 0.107,\n    \"polyunsaturatedFat\": 0.524,\n    \"carbs\": 3.08,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 15.58,\n    \"sodium\": 44,\n    \"cholesterol\": 233,\n    \"vitaminA\": 10,\n    \"vitaminB1\": 0.02,\n    \"vitaminB2\": 0.412,\n    \"vitaminB3\": 2.175,\n    \"vitaminB5\": 0.5,\n    \"vitaminB6\": 0.056,\n    \"vitaminB9\": 5,\n    \"vitaminB12\": 1.3,\n    \"vitaminC\": 4.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.2,\n    \"vitaminK\": 0,\n    \"magnesium\": 33,\n    \"calcium\": 32,\n    \"phosphorus\": 221,\n    \"potassium\": 246,\n    \"iron\": 0.68,\n    \"selenium\": 44.8,\n    \"zinc\": 1.53,\n    \"manganese\": 0.035,\n    \"copper\": 1.891,\n    \"choline\": 65\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/fruitsAndJuices.json",
    "content": "[\n    {\n      \"id\": 901,\n      \"name\": \"Tomatoes\",\n      \"categoryId\": 900,\n      \"energy\": 18,\n      \"fat\": 0.2,\n      \"saturatedFat\": 0.028,\n      \"monounsaturatedFat\": 0.031,\n      \"polyunsaturatedFat\": 0.083,\n      \"carbs\": 3.89,\n      \"sugar\": 2.63,\n      \"fiber\": 1.2,\n      \"protein\": 0.88,\n      \"sodium\": 5,\n      \"cholesterol\": 0,\n      \"vitaminA\": 42,\n      \"vitaminB1\": 0.037,\n      \"vitaminB2\": 0.019,\n      \"vitaminB3\": 0.594,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.08,\n      \"vitaminB9\": 15,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 13.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.54,\n      \"vitaminK\": 7.9,\n      \"magnesium\": 11,\n      \"calcium\": 10,\n      \"phosphorus\": 24,\n      \"potassium\": 237,\n      \"iron\": 0.27,\n      \"selenium\": 0,\n      \"zinc\": 0.17,\n      \"manganese\": 0,\n      \"copper\": 0.059,\n      \"choline\": 6.7\n    },\n    { \n      \"id\": 902,\n      \"name\": \"Lemon Juice\",\n      \"categoryId\": 900,\n      \"energy\": 22,\n      \"fat\": 0.24,\n      \"saturatedFat\": 0.04,\n      \"monounsaturatedFat\": 0.006,\n      \"polyunsaturatedFat\": 0.021,\n      \"carbs\": 6.9,\n      \"sugar\": 2.52,\n      \"fiber\": 0.3,\n      \"protein\": 0.35,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.024,\n      \"vitaminB2\": 0.015,\n      \"vitaminB3\": 0.091,\n      \"vitaminB5\": 0.131,\n      \"vitaminB6\": 0.046,\n      \"vitaminB9\": 20,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 38.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.15,\n      \"vitaminK\": 0,\n      \"magnesium\": 6,\n      \"calcium\": 6,\n      \"phosphorus\": 8,\n      \"potassium\": 103,\n      \"iron\": 0.08,\n      \"selenium\": 0.1,\n      \"zinc\": 0.05,\n      \"manganese\": 0.012,\n      \"copper\": 0.016,\n      \"choline\": 5.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 244\n      }\n    },\n    {\n      \"id\": 903,\n      \"name\": \"Raisins\",\n      \"categoryId\": 900,\n      \"energy\": 299,\n      \"fat\": 0.25,\n      \"saturatedFat\": 0.094,\n      \"monounsaturatedFat\": 0.024,\n      \"polyunsaturatedFat\": 0.053,\n      \"carbs\": 79.32,\n      \"sugar\": 65.18,\n      \"fiber\": 4.5,\n      \"protein\": 3.3,\n      \"sodium\": 26,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.106,\n      \"vitaminB2\": 0.125,\n      \"vitaminB3\": 0.766,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.174,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 2.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.12,\n      \"vitaminK\": 3.5,\n      \"magnesium\": 36,\n      \"calcium\": 62,\n      \"phosphorus\": 98,\n      \"potassium\": 744,\n      \"iron\": 1.79,\n      \"selenium\": 0.6,\n      \"zinc\": 0.36,\n      \"manganese\": 0,\n      \"copper\": 0.272,\n      \"choline\": 11.1\n    },\n    {\n      \"id\": 904,\n      \"name\": \"Orange Juice\",\n      \"categoryId\": 900,\n      \"energy\": 47,\n      \"fat\": 0.15,\n      \"saturatedFat\": 0.018,\n      \"monounsaturatedFat\": 0.025,\n      \"polyunsaturatedFat\": 0.034,\n      \"carbs\": 11.01,\n      \"sugar\": 8.76,\n      \"fiber\": 0.3,\n      \"protein\": 0.68,\n      \"sodium\": 4,\n      \"cholesterol\": 0,\n      \"vitaminA\": 9,\n      \"vitaminB1\": 0.039,\n      \"vitaminB2\": 0.021,\n      \"vitaminB3\": 0.201,\n      \"vitaminB5\": 0.18,\n      \"vitaminB6\": 0.031,\n      \"vitaminB9\": 24,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 30.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.2,\n      \"vitaminK\": 0.1,\n      \"magnesium\": 10,\n      \"calcium\": 10,\n      \"phosphorus\": 17,\n      \"potassium\": 184,\n      \"iron\": 0.1,\n      \"selenium\": 0.1,\n      \"zinc\": 0.04,\n      \"manganese\": 0.021,\n      \"copper\": 0.022,\n      \"choline\": 6.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 249\n      }\n    },\n    {\n      \"id\": 905,\n      \"name\": \"Raspberries\",\n      \"categoryId\": 900,\n      \"energy\": 52,\n      \"fat\": 0.65,\n      \"saturatedFat\": 0.019,\n      \"monounsaturatedFat\": 0.064,\n      \"polyunsaturatedFat\": 0.375,\n      \"carbs\": 11.94,\n      \"sugar\": 4.42,\n      \"fiber\": 6.5,\n      \"protein\": 1.2,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.032,\n      \"vitaminB2\": 0.038,\n      \"vitaminB3\": 0.598,\n      \"vitaminB5\": 0.329,\n      \"vitaminB6\": 0.055,\n      \"vitaminB9\": 21,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 26.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.87,\n      \"vitaminK\": 7.8,\n      \"magnesium\": 22,\n      \"calcium\": 25,\n      \"phosphorus\": 29,\n      \"potassium\": 151,\n      \"iron\": 0.69,\n      \"selenium\": 0.2,\n      \"zinc\": 0.42,\n      \"manganese\": 0.67,\n      \"copper\": 0.09,\n      \"choline\": 12.3,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 123\n      }\n    },\n    {\n      \"id\": 906,\n      \"name\": \"Strawberries\",\n      \"categoryId\": 900,\n      \"energy\": 32,\n      \"fat\": 0.3,\n      \"saturatedFat\": 0.015,\n      \"monounsaturatedFat\": 0.043,\n      \"polyunsaturatedFat\": 0.155,\n      \"carbs\": 7.68,\n      \"sugar\": 4.89,\n      \"fiber\": 2,\n      \"protein\": 0.67,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.024,\n      \"vitaminB2\": 0.022,\n      \"vitaminB3\": 0.386,\n      \"vitaminB5\": 0.125,\n      \"vitaminB6\": 0.047,\n      \"vitaminB9\": 24,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 58.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.29,\n      \"vitaminK\": 2.2,\n      \"magnesium\": 13,\n      \"calcium\": 16,\n      \"phosphorus\": 24,\n      \"potassium\": 153,\n      \"iron\": 0.41,\n      \"selenium\": 0.4,\n      \"zinc\": 0.14,\n      \"manganese\": 0.386,\n      \"copper\": 0.048,\n      \"choline\": 5.7,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 232\n      }\n    },\n    {\n      \"id\": 907,\n      \"name\": \"Blackberries\",\n      \"categoryId\": 900,\n      \"energy\": 43,\n      \"fat\": 0.49,\n      \"saturatedFat\": 0.014,\n      \"monounsaturatedFat\": 0.047,\n      \"polyunsaturatedFat\": 0.28,\n      \"carbs\": 9.61,\n      \"sugar\": 4.88,\n      \"fiber\": 5.3,\n      \"protein\": 1.39,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 11,\n      \"vitaminB1\": 0.02,\n      \"vitaminB2\": 0.026,\n      \"vitaminB3\": 0.646,\n      \"vitaminB5\": 0.276,\n      \"vitaminB6\": 0.03,\n      \"vitaminB9\": 25,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 21,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.17,\n      \"vitaminK\": 19.8,\n      \"magnesium\": 20,\n      \"calcium\": 29,\n      \"phosphorus\": 22,\n      \"potassium\": 162,\n      \"iron\": 0.62,\n      \"selenium\": 0.4,\n      \"zinc\": 0.53,\n      \"manganese\": 0.646,\n      \"copper\": 0.165,\n      \"choline\": 8.5,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 144\n      }\n    },\n    {\n      \"id\": 908,\n      \"name\": \"Bananas\",\n      \"categoryId\": 900,\n      \"energy\": 89,\n      \"fat\": 0.33,\n      \"saturatedFat\": 0.112,\n      \"monounsaturatedFat\": 0.032,\n      \"polyunsaturatedFat\": 0.073,\n      \"carbs\": 22.84,\n      \"sugar\": 12.23,\n      \"fiber\": 2.6,\n      \"protein\": 1.09,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.031,\n      \"vitaminB2\": 0.073,\n      \"vitaminB3\": 0.665,\n      \"vitaminB5\": 0.334,\n      \"vitaminB6\": 0.367,\n      \"vitaminB9\": 20,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 8.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.1,\n      \"vitaminK\": 0.5,\n      \"magnesium\": 27,\n      \"calcium\": 5,\n      \"phosphorus\": 22,\n      \"potassium\": 358,\n      \"iron\": 0.26,\n      \"selenium\": 1,\n      \"zinc\": 0.15,\n      \"manganese\": 0.27,\n      \"copper\": 0.078,\n      \"choline\": 9.8,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 150\n      }\n    },\n    {\n      \"id\": 909,\n      \"name\": \"Blueberries\",\n      \"categoryId\": 900,\n      \"energy\": 57,\n      \"fat\": 0.33,\n      \"saturatedFat\": 0.028,\n      \"monounsaturatedFat\": 0.047,\n      \"polyunsaturatedFat\": 0.146,\n      \"carbs\": 14.49,\n      \"sugar\": 9.96,\n      \"fiber\": 2.4,\n      \"protein\": 0.74,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.037,\n      \"vitaminB2\": 0.041,\n      \"vitaminB3\": 0.418,\n      \"vitaminB5\": 0.124,\n      \"vitaminB6\": 0.052,\n      \"vitaminB9\": 6,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 9.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.57,\n      \"vitaminK\": 19.3,\n      \"magnesium\": 6,\n      \"calcium\": 6,\n      \"phosphorus\": 12,\n      \"potassium\": 77,\n      \"iron\": 0.28,\n      \"selenium\": 0.1,\n      \"zinc\": 0.16,\n      \"manganese\": 0.336,\n      \"copper\": 0.057,\n      \"choline\": 6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 148\n      }\n    },\n    {\n      \"id\": 910,\n      \"name\": \"Cherries\",\n      \"categoryId\": 900,\n      \"energy\": 63,\n      \"fat\": 0.2,\n      \"saturatedFat\": 0.038,\n      \"monounsaturatedFat\": 0.047,\n      \"polyunsaturatedFat\": 0.052,\n      \"carbs\": 16.01,\n      \"sugar\": 12.82,\n      \"fiber\": 2.1,\n      \"protein\": 1.06,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.027,\n      \"vitaminB2\": 0.033,\n      \"vitaminB3\": 0.154,\n      \"vitaminB5\": 0.199,\n      \"vitaminB6\": 0.049,\n      \"vitaminB9\": 4,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.07,\n      \"vitaminK\": 2.1,\n      \"magnesium\": 11,\n      \"calcium\": 13,\n      \"phosphorus\": 21,\n      \"potassium\": 222,\n      \"iron\": 0.36,\n      \"selenium\": 0,\n      \"zinc\": 0.07,\n      \"manganese\": 0.07,\n      \"copper\": 0.06,\n      \"choline\": 6.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 154\n      }\n    },\n    {\n      \"id\": 911,\n      \"name\": \"Peaches\",\n      \"categoryId\": 900,\n      \"energy\": 39,\n      \"fat\": 0.25,\n      \"saturatedFat\": 0.019,\n      \"monounsaturatedFat\": 0.067,\n      \"polyunsaturatedFat\": 0.086,\n      \"carbs\": 9.54,\n      \"sugar\": 8.39,\n      \"fiber\": 1.5,\n      \"protein\": 0.91,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 16,\n      \"vitaminB1\": 0.024,\n      \"vitaminB2\": 0.031,\n      \"vitaminB3\": 0.806,\n      \"vitaminB5\": 0.153,\n      \"vitaminB6\": 0.025,\n      \"vitaminB9\": 4,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.73,\n      \"vitaminK\": 2.6,\n      \"magnesium\": 9,\n      \"calcium\": 6,\n      \"phosphorus\": 20,\n      \"potassium\": 190,\n      \"iron\": 0.25,\n      \"selenium\": 0.1,\n      \"zinc\": 0.17,\n      \"manganese\": 0.061,\n      \"copper\": 0.068,\n      \"choline\": 6.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 154\n      }\n    },\n    {\n      \"id\": 912,\n      \"name\": \"Crushed Tomatoes (canned)\",\n      \"categoryId\": 900,\n      \"energy\": 32,\n      \"fat\": 0.28,\n      \"saturatedFat\": 0.04,\n      \"monounsaturatedFat\": 0.043,\n      \"polyunsaturatedFat\": 0.113,\n      \"carbs\": 7.29,\n      \"sugar\": 4.4,\n      \"fiber\": 1.9,\n      \"protein\": 1.64,\n      \"sodium\": 186,\n      \"cholesterol\": 0,\n      \"vitaminA\": 11,\n      \"vitaminB1\": 0.075,\n      \"vitaminB2\": 0.052,\n      \"vitaminB3\": 1.222,\n      \"vitaminB5\": 0.278,\n      \"vitaminB6\": 0.15,\n      \"vitaminB9\": 13,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 9.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.25,\n      \"vitaminK\": 5.3,\n      \"magnesium\": 20,\n      \"calcium\": 34,\n      \"phosphorus\": 32,\n      \"potassium\": 293,\n      \"iron\": 1.3,\n      \"selenium\": 0.6,\n      \"zinc\": 0.27,\n      \"manganese\": 0.183,\n      \"copper\": 0.183,\n      \"choline\": 12.9,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 121\n      }\n    },\n    {\n      \"id\": 913,\n      \"name\": \"Pears\",\n      \"categoryId\": 900,\n      \"energy\": 57,\n      \"fat\": 0.14,\n      \"saturatedFat\": 0.022,\n      \"monounsaturatedFat\": 0.084,\n      \"polyunsaturatedFat\": 0.094,\n      \"carbs\": 15.23,\n      \"sugar\": 9.75,\n      \"fiber\": 3.1,\n      \"protein\": 0.36,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.012,\n      \"vitaminB2\": 0.026,\n      \"vitaminB3\": 0.161,\n      \"vitaminB5\": 0.049,\n      \"vitaminB6\": 0.029,\n      \"vitaminB9\": 7,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.12,\n      \"vitaminK\": 4.4,\n      \"magnesium\": 7,\n      \"calcium\": 9,\n      \"phosphorus\": 12,\n      \"potassium\": 116,\n      \"iron\": 0.18,\n      \"selenium\": 0.1,\n      \"zinc\": 0.1,\n      \"manganese\": 0.048,\n      \"copper\": 0.082,\n      \"choline\": 5.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 161\n      }\n    },\n    {\n      \"id\": 914,\n      \"name\": \"Apples\",\n      \"categoryId\": 900,\n      \"energy\": 52,\n      \"fat\": 0.17,\n      \"saturatedFat\": 0.028,\n      \"monounsaturatedFat\": 0.007,\n      \"polyunsaturatedFat\": 0.051,\n      \"carbs\": 13.81,\n      \"sugar\": 10.39,\n      \"fiber\": 2.4,\n      \"protein\": 0.26,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.017,\n      \"vitaminB2\": 0.026,\n      \"vitaminB3\": 0.091,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.041,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.18,\n      \"vitaminK\": 2.2,\n      \"magnesium\": 5,\n      \"calcium\": 6,\n      \"phosphorus\": 11,\n      \"potassium\": 107,\n      \"iron\": 0.12,\n      \"selenium\": 0,\n      \"zinc\": 0.04,\n      \"manganese\": 0,\n      \"copper\": 0.027,\n      \"choline\": 3.4\n    },\n    {\n      \"id\": 915,\n      \"name\": \"Grapes\",\n      \"categoryId\": 900,\n      \"energy\": 69,\n      \"fat\": 0.16,\n      \"saturatedFat\": 0.054,\n      \"monounsaturatedFat\": 0.007,\n      \"polyunsaturatedFat\": 0.048,\n      \"carbs\": 18.1,\n      \"sugar\": 15.48,\n      \"fiber\": 0.9,\n      \"protein\": 0.72,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.069,\n      \"vitaminB2\": 0.07,\n      \"vitaminB3\": 0.188,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.086,\n      \"vitaminB9\": 2,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 3.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.19,\n      \"vitaminK\": 14.6,\n      \"magnesium\": 7,\n      \"calcium\": 10,\n      \"phosphorus\": 20,\n      \"potassium\": 191,\n      \"iron\": 0.36,\n      \"selenium\": 0.1,\n      \"zinc\": 0.07,\n      \"manganese\": 0,\n      \"copper\": 0.127,\n      \"choline\": 5.6\n    },\n    {\n      \"id\": 916,\n      \"name\": \"Avocado\",\n      \"categoryId\": 900,\n      \"energy\": 160,\n      \"fat\": 14.66,\n      \"saturatedFat\": 2.126,\n      \"monounsaturatedFat\": 9.799,\n      \"polyunsaturatedFat\": 1.816,\n      \"carbs\": 8.53,\n      \"sugar\": 0.66,\n      \"fiber\": 6.7,\n      \"protein\": 2,\n      \"sodium\": 7,\n      \"cholesterol\": 0,\n      \"vitaminA\": 7,\n      \"vitaminB1\": 0.067,\n      \"vitaminB2\": 0.13,\n      \"vitaminB3\": 1.738,\n      \"vitaminB5\": 1.389,\n      \"vitaminB6\": 0.257,\n      \"vitaminB9\": 81,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 10,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.07,\n      \"vitaminK\": 21,\n      \"magnesium\": 29,\n      \"calcium\": 12,\n      \"phosphorus\": 52,\n      \"potassium\": 485,\n      \"iron\": 0.55,\n      \"selenium\": 0.4,\n      \"zinc\": 0.64,\n      \"manganese\": 0.142,\n      \"copper\": 0.19,\n      \"choline\": 14.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 230\n      }\n    },\n    {\n      \"id\": 917,\n      \"name\": \"Plums\",\n      \"categoryId\": 900,\n      \"energy\": 46,\n      \"fat\": 0.28,\n      \"saturatedFat\": 0.017,\n      \"monounsaturatedFat\": 0.134,\n      \"polyunsaturatedFat\": 0.044,\n      \"carbs\": 11.42,\n      \"sugar\": 9.92,\n      \"fiber\": 1.4,\n      \"protein\": 0.7,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 17,\n      \"vitaminB1\": 0.028,\n      \"vitaminB2\": 0.026,\n      \"vitaminB3\": 0.417,\n      \"vitaminB5\": 0.135,\n      \"vitaminB6\": 0.029,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 9.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.26,\n      \"vitaminK\": 6.4,\n      \"magnesium\": 7,\n      \"calcium\": 6,\n      \"phosphorus\": 16,\n      \"potassium\": 157,\n      \"iron\": 0.17,\n      \"selenium\": 0,\n      \"zinc\": 0.1,\n      \"manganese\": 0.052,\n      \"copper\": 0.057,\n      \"choline\": 1.9,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 165\n      }\n    },\n    {\n      \"id\": 918,\n      \"name\": \"Mangos\",\n      \"categoryId\": 900,\n      \"energy\": 60,\n      \"fat\": 0.38,\n      \"saturatedFat\": 0.092,\n      \"monounsaturatedFat\": 0.14,\n      \"polyunsaturatedFat\": 0.071,\n      \"carbs\": 14.98,\n      \"sugar\": 13.66,\n      \"fiber\": 1.6,\n      \"protein\": 0.82,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 54,\n      \"vitaminB1\": 0.028,\n      \"vitaminB2\": 0.038,\n      \"vitaminB3\": 0.669,\n      \"vitaminB5\": 0.197,\n      \"vitaminB6\": 0.119,\n      \"vitaminB9\": 43,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 36.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.9,\n      \"vitaminK\": 4.2,\n      \"magnesium\": 10,\n      \"calcium\": 11,\n      \"phosphorus\": 14,\n      \"potassium\": 168,\n      \"iron\": 0.16,\n      \"selenium\": 0.6,\n      \"zinc\": 0.09,\n      \"manganese\": 0.063,\n      \"copper\": 0.111,\n      \"choline\": 7.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 165\n      }\n    },\n    {\n      \"id\": 919,\n      \"name\": \"Pineapple\",\n      \"categoryId\": 900,\n      \"energy\": 50,\n      \"fat\": 0.12,\n      \"saturatedFat\": 0.009,\n      \"monounsaturatedFat\": 0.013,\n      \"polyunsaturatedFat\": 0.04,\n      \"carbs\": 13.12,\n      \"sugar\": 9.85,\n      \"fiber\": 1.4,\n      \"protein\": 0.54,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.079,\n      \"vitaminB2\": 0.032,\n      \"vitaminB3\": 0.5,\n      \"vitaminB5\": 0.213,\n      \"vitaminB6\": 0.112,\n      \"vitaminB9\": 18,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 47.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.02,\n      \"vitaminK\": 0.7,\n      \"magnesium\": 12,\n      \"calcium\": 13,\n      \"phosphorus\": 8,\n      \"potassium\": 109,\n      \"iron\": 0.29,\n      \"selenium\": 0.1,\n      \"zinc\": 0.12,\n      \"manganese\": 0.927,\n      \"copper\": 0.11,\n      \"choline\": 5.5,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 165\n      }\n    },\n    {\n      \"id\": 920,\n      \"name\": \"Kiwi\",\n      \"categoryId\": 900,\n      \"energy\": 58,\n      \"fat\": 0.44,\n      \"saturatedFat\": 0.029,\n      \"monounsaturatedFat\": 0.047,\n      \"polyunsaturatedFat\": 0.287,\n      \"carbs\": 14,\n      \"sugar\": 8.99,\n      \"fiber\": 3,\n      \"protein\": 1.06,\n      \"sodium\": 5,\n      \"cholesterol\": 0,\n      \"vitaminA\": 4,\n      \"vitaminB1\": 0.027,\n      \"vitaminB2\": 0.025,\n      \"vitaminB3\": 0.37,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.061,\n      \"vitaminB9\": 26,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 74.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.3,\n      \"vitaminK\": 40.3,\n      \"magnesium\": 16,\n      \"calcium\": 35,\n      \"phosphorus\": 34,\n      \"potassium\": 198,\n      \"iron\": 0.24,\n      \"selenium\": 0.2,\n      \"zinc\": 0.14,\n      \"manganese\": 0,\n      \"copper\": 0.134,\n      \"choline\": 7.8\n    },\n    {\n      \"id\": 921,\n      \"name\": \"Pickled Olives\",\n      \"categoryId\": 900,\n      \"energy\": 145,\n      \"fat\": 15.32,\n      \"saturatedFat\": 2.029,\n      \"monounsaturatedFat\": 11.314,\n      \"polyunsaturatedFat\": 1.307,\n      \"carbs\": 3.84,\n      \"sugar\": 0.54,\n      \"fiber\": 3.3,\n      \"protein\": 1.03,\n      \"sodium\": 1556,\n      \"cholesterol\": 0,\n      \"vitaminA\": 20,\n      \"vitaminB1\": 0.021,\n      \"vitaminB2\": 0.007,\n      \"vitaminB3\": 0.237,\n      \"vitaminB5\": 0.023,\n      \"vitaminB6\": 0.031,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 3.81,\n      \"vitaminK\": 1.4,\n      \"magnesium\": 11,\n      \"calcium\": 52,\n      \"phosphorus\": 4,\n      \"potassium\": 42,\n      \"iron\": 0.49,\n      \"selenium\": 0.9,\n      \"zinc\": 0.04,\n      \"manganese\": 0,\n      \"copper\": 0.12,\n      \"choline\": 14.2\n    },\n    {\n      \"id\": 922,\n      \"name\": \"Grapefruit\",\n      \"categoryId\": 900,\n      \"energy\": 32,\n      \"fat\": 0.1,\n      \"saturatedFat\": 0.014,\n      \"monounsaturatedFat\": 0.013,\n      \"polyunsaturatedFat\": 0.024,\n      \"carbs\": 8.08,\n      \"sugar\": 6.98,\n      \"fiber\": 1.1,\n      \"protein\": 0.63,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 46,\n      \"vitaminB1\": 0.036,\n      \"vitaminB2\": 0.02,\n      \"vitaminB3\": 0.25,\n      \"vitaminB5\": 0.283,\n      \"vitaminB6\": 0.042,\n      \"vitaminB9\": 10,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 34.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.13,\n      \"vitaminK\": 0,\n      \"magnesium\": 8,\n      \"calcium\": 12,\n      \"phosphorus\": 8,\n      \"potassium\": 139,\n      \"iron\": 0.09,\n      \"selenium\": 0.3,\n      \"zinc\": 0.07,\n      \"manganese\": 0.012,\n      \"copper\": 0.047,\n      \"choline\": 7.7,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 230\n      }\n    },\n    {\n      \"id\": 923,\n      \"name\": \"Sugar-apples\",\n      \"categoryId\": 900,\n      \"energy\": 94,\n      \"fat\": 0.29,\n      \"saturatedFat\": 0.048,\n      \"monounsaturatedFat\": 0.114,\n      \"polyunsaturatedFat\": 0.04,\n      \"carbs\": 23.64,\n      \"sugar\": 0,\n      \"fiber\": 4.4,\n      \"protein\": 2.06,\n      \"sodium\": 9,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.11,\n      \"vitaminB2\": 0.113,\n      \"vitaminB3\": 0.883,\n      \"vitaminB5\": 0.226,\n      \"vitaminB6\": 0.2,\n      \"vitaminB9\": 14,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 36.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 21,\n      \"calcium\": 24,\n      \"phosphorus\": 32,\n      \"potassium\": 247,\n      \"iron\": 0.6,\n      \"selenium\": 0.6,\n      \"zinc\": 0.1,\n      \"manganese\": 0,\n      \"copper\": 0.086,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 250\n      }\n    },\n    {\n      \"id\": 924,\n      \"name\": \"Figs\",\n      \"categoryId\": 900,\n      \"energy\": 74,\n      \"fat\": 0.3,\n      \"saturatedFat\": 0.06,\n      \"monounsaturatedFat\": 0.066,\n      \"polyunsaturatedFat\": 0.144,\n      \"carbs\": 19.18,\n      \"sugar\": 16.26,\n      \"fiber\": 2.9,\n      \"protein\": 0.75,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 7,\n      \"vitaminB1\": 0.06,\n      \"vitaminB2\": 0.05,\n      \"vitaminB3\": 0.4,\n      \"vitaminB5\": 0.3,\n      \"vitaminB6\": 0.113,\n      \"vitaminB9\": 6,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.11,\n      \"vitaminK\": 4.7,\n      \"magnesium\": 17,\n      \"calcium\": 35,\n      \"phosphorus\": 14,\n      \"potassium\": 232,\n      \"iron\": 0.37,\n      \"selenium\": 0.2,\n      \"zinc\": 0.15,\n      \"manganese\": 0.128,\n      \"copper\": 0.07,\n      \"choline\": 4.7\n    },\n    {\n      \"id\": 925,\n      \"name\": \"Medjool Dates\",\n      \"categoryId\": 900,\n      \"energy\": 277,\n      \"fat\": 0.15,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 74.97,\n      \"sugar\": 66.47,\n      \"fiber\": 6.7,\n      \"protein\": 1.81,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 7,\n      \"vitaminB1\": 0.05,\n      \"vitaminB2\": 0.06,\n      \"vitaminB3\": 1.61,\n      \"vitaminB5\": 0.805,\n      \"vitaminB6\": 0.249,\n      \"vitaminB9\": 15,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 2.7,\n      \"magnesium\": 54,\n      \"calcium\": 64,\n      \"phosphorus\": 62,\n      \"potassium\": 696,\n      \"iron\": 0.9,\n      \"selenium\": 0,\n      \"zinc\": 0.44,\n      \"manganese\": 0.296,\n      \"copper\": 0.362,\n      \"choline\": 9.9\n    },\n    {\n      \"id\": 926,\n      \"name\": \"Apricots\",\n      \"categoryId\": 900,\n      \"energy\": 48,\n      \"fat\": 0.39,\n      \"saturatedFat\": 0.027,\n      \"monounsaturatedFat\": 0.17,\n      \"polyunsaturatedFat\": 0.077,\n      \"carbs\": 11.12,\n      \"sugar\": 9.24,\n      \"fiber\": 2,\n      \"protein\": 1.4,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 96,\n      \"vitaminB1\": 0.03,\n      \"vitaminB2\": 0.04,\n      \"vitaminB3\": 0.6,\n      \"vitaminB5\": 0.24,\n      \"vitaminB6\": 0.054,\n      \"vitaminB9\": 9,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 10,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.89,\n      \"vitaminK\": 3.3,\n      \"magnesium\": 10,\n      \"calcium\": 13,\n      \"phosphorus\": 23,\n      \"potassium\": 259,\n      \"iron\": 0.39,\n      \"selenium\": 0.1,\n      \"zinc\": 0.2,\n      \"manganese\": 0.077,\n      \"copper\": 0.078,\n      \"choline\": 2.8,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 155\n      }\n    },\n    {\n      \"id\": 927,\n      \"name\": \"Pomegranates\",\n      \"categoryId\": 900,\n      \"energy\": 83,\n      \"fat\": 1.17,\n      \"saturatedFat\": 0.12,\n      \"monounsaturatedFat\": 0.093,\n      \"polyunsaturatedFat\": 0.079,\n      \"carbs\": 18.7,\n      \"sugar\": 13.67,\n      \"fiber\": 4,\n      \"protein\": 1.67,\n      \"sodium\": 3,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.067,\n      \"vitaminB2\": 0.053,\n      \"vitaminB3\": 0.293,\n      \"vitaminB5\": 0.377,\n      \"vitaminB6\": 0.075,\n      \"vitaminB9\": 38,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 10.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.6,\n      \"vitaminK\": 16.4,\n      \"magnesium\": 12,\n      \"calcium\": 10,\n      \"phosphorus\": 36,\n      \"potassium\": 236,\n      \"iron\": 0.3,\n      \"selenium\": 0.5,\n      \"zinc\": 0.35,\n      \"manganese\": 0.119,\n      \"copper\": 0.158,\n      \"choline\": 7.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 87\n      }\n    },\n    {\n      \"id\": 928,\n      \"name\": \"Watermelon\",\n      \"categoryId\": 900,\n      \"energy\": 30,\n      \"fat\": 0.15,\n      \"saturatedFat\": 0.016,\n      \"monounsaturatedFat\": 0.037,\n      \"polyunsaturatedFat\": 0.05,\n      \"carbs\": 7.55,\n      \"sugar\": 6.2,\n      \"fiber\": 0.4,\n      \"protein\": 0.61,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 28,\n      \"vitaminB1\": 0.033,\n      \"vitaminB2\": 0.021,\n      \"vitaminB3\": 0.178,\n      \"vitaminB5\": 0.221,\n      \"vitaminB6\": 0.045,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 8.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.05,\n      \"vitaminK\": 0.1,\n      \"magnesium\": 10,\n      \"calcium\": 7,\n      \"phosphorus\": 11,\n      \"potassium\": 112,\n      \"iron\": 0.24,\n      \"selenium\": 0.4,\n      \"zinc\": 0.1,\n      \"manganese\": 0.038,\n      \"copper\": 0.042,\n      \"choline\": 4.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 152\n      }\n    },\n    {\n      \"id\": 929,\n      \"name\": \"Canteloupe Melons\",\n      \"categoryId\": 900,\n      \"energy\": 34,\n      \"fat\": 0.19,\n      \"saturatedFat\": 0.051,\n      \"monounsaturatedFat\": 0.003,\n      \"polyunsaturatedFat\": 0.081,\n      \"carbs\": 8.16,\n      \"sugar\": 7.86,\n      \"fiber\": 0.9,\n      \"protein\": 0.84,\n      \"sodium\": 16,\n      \"cholesterol\": 0,\n      \"vitaminA\": 169,\n      \"vitaminB1\": 0.041,\n      \"vitaminB2\": 0.019,\n      \"vitaminB3\": 0.734,\n      \"vitaminB5\": 0.105,\n      \"vitaminB6\": 0.072,\n      \"vitaminB9\": 21,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 36.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.05,\n      \"vitaminK\": 2.5,\n      \"magnesium\": 12,\n      \"calcium\": 9,\n      \"phosphorus\": 15,\n      \"potassium\": 267,\n      \"iron\": 0.21,\n      \"selenium\": 0.4,\n      \"zinc\": 0.18,\n      \"manganese\": 0.041,\n      \"copper\": 0.041,\n      \"choline\": 7.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 160\n      }\n    },\n    {\n      \"id\": 930,\n      \"name\": \"Papayas\",\n      \"categoryId\": 900,\n      \"energy\": 43,\n      \"fat\": 0.26,\n      \"saturatedFat\": 0.081,\n      \"monounsaturatedFat\": 0.072,\n      \"polyunsaturatedFat\": 0.058,\n      \"carbs\": 10.82,\n      \"sugar\": 7.82,\n      \"fiber\": 1.7,\n      \"protein\": 0.47,\n      \"sodium\": 8,\n      \"cholesterol\": 0,\n      \"vitaminA\": 47,\n      \"vitaminB1\": 0.023,\n      \"vitaminB2\": 0.027,\n      \"vitaminB3\": 0.357,\n      \"vitaminB5\": 0.191,\n      \"vitaminB6\": 0.038,\n      \"vitaminB9\": 37,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 60.9,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.3,\n      \"vitaminK\": 2.6,\n      \"magnesium\": 21,\n      \"calcium\": 20,\n      \"phosphorus\": 10,\n      \"potassium\": 182,\n      \"iron\": 0.25,\n      \"selenium\": 0.6,\n      \"zinc\": 0.08,\n      \"manganese\": 0.04,\n      \"copper\": 0.045,\n      \"choline\": 6.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 230\n      }\n    },\n    {\n      \"id\": 931,\n      \"name\": \"Limes\",\n      \"categoryId\": 900,\n      \"energy\": 30,\n      \"fat\": 0.2,\n      \"saturatedFat\": 0.022,\n      \"monounsaturatedFat\": 0.019,\n      \"polyunsaturatedFat\": 0.055,\n      \"carbs\": 10.54,\n      \"sugar\": 1.69,\n      \"fiber\": 2.8,\n      \"protein\": 0.7,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.03,\n      \"vitaminB2\": 0.02,\n      \"vitaminB3\": 0.2,\n      \"vitaminB5\": 0.217,\n      \"vitaminB6\": 0.043,\n      \"vitaminB9\": 8,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 29.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.22,\n      \"vitaminK\": 0.6,\n      \"magnesium\": 6,\n      \"calcium\": 33,\n      \"phosphorus\": 18,\n      \"potassium\": 102,\n      \"iron\": 0.6,\n      \"selenium\": 0.4,\n      \"zinc\": 0.11,\n      \"manganese\": 0.008,\n      \"copper\": 0.065,\n      \"choline\": 5.1\n    },\n    {\n      \"id\": 932,\n      \"name\": \"Nectarines\",\n      \"categoryId\": 900,\n      \"energy\": 44,\n      \"fat\": 0.32,\n      \"saturatedFat\": 0.025,\n      \"monounsaturatedFat\": 0.088,\n      \"polyunsaturatedFat\": 0.113,\n      \"carbs\": 10.55,\n      \"sugar\": 7.89,\n      \"fiber\": 1.7,\n      \"protein\": 1.06,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 17,\n      \"vitaminB1\": 0.034,\n      \"vitaminB2\": 0.027,\n      \"vitaminB3\": 1.125,\n      \"vitaminB5\": 0.185,\n      \"vitaminB6\": 0.025,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 5.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.77,\n      \"vitaminK\": 2.2,\n      \"magnesium\": 9,\n      \"calcium\": 6,\n      \"phosphorus\": 26,\n      \"potassium\": 201,\n      \"iron\": 0.28,\n      \"selenium\": 0,\n      \"zinc\": 0.17,\n      \"manganese\": 0.054,\n      \"copper\": 0.086,\n      \"choline\": 6.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 143\n      }\n    },\n    {\n      \"id\": 933,\n      \"name\": \"Lemons\",\n      \"categoryId\": 900,\n      \"energy\": 29,\n      \"fat\": 0.3,\n      \"saturatedFat\": 0.039,\n      \"monounsaturatedFat\": 0.011,\n      \"polyunsaturatedFat\": 0.089,\n      \"carbs\": 9.32,\n      \"sugar\": 2.5,\n      \"fiber\": 2.8,\n      \"protein\": 1.1,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.04,\n      \"vitaminB2\": 0.02,\n      \"vitaminB3\": 0.1,\n      \"vitaminB5\": 0.19,\n      \"vitaminB6\": 0.08,\n      \"vitaminB9\": 11,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 53,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.15,\n      \"vitaminK\": 0,\n      \"magnesium\": 8,\n      \"calcium\": 26,\n      \"phosphorus\": 16,\n      \"potassium\": 138,\n      \"iron\": 0.6,\n      \"selenium\": 0.4,\n      \"zinc\": 0.06,\n      \"manganese\": 0.03,\n      \"copper\": 0.037,\n      \"choline\": 5.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 212\n      }\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/grainsAndPasta.json",
    "content": "[\n  {\n    \"id\": 601,\n    \"name\": \"Brown Rice\",\n    \"categoryId\": 600,\n    \"energy\": 367,\n    \"fat\": 3.2,\n    \"saturatedFat\": 0.591,\n    \"monounsaturatedFat\": 1.054,\n    \"polyunsaturatedFat\": 1,\n    \"carbs\": 76.25,\n    \"sugar\": 0.66,\n    \"fiber\": 3.6,\n    \"protein\": 7.54,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.541,\n    \"vitaminB2\": 0.095,\n    \"vitaminB3\": 6.494,\n    \"vitaminB5\": 1.065,\n    \"vitaminB6\": 0.477,\n    \"vitaminB9\": 23,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.6,\n    \"vitaminK\": 0.6,\n    \"magnesium\": 116,\n    \"calcium\": 9,\n    \"phosphorus\": 311,\n    \"potassium\": 250,\n    \"iron\": 1.29,\n    \"selenium\": 17.1,\n    \"zinc\": 2.13,\n    \"manganese\": 2.853,\n    \"copper\": 0.302,\n    \"choline\": 21.5,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 185\n    }\n  },\n  {\n    \"id\": 602,\n    \"name\": \"White Rice\",\n    \"categoryId\": 600,\n    \"energy\": 360,\n    \"fat\": 0.58,\n    \"saturatedFat\": 0.158,\n    \"monounsaturatedFat\": 0.181,\n    \"polyunsaturatedFat\": 0.155,\n    \"carbs\": 79.34,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 6.61,\n    \"sodium\": 1,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.07,\n    \"vitaminB2\": 0.048,\n    \"vitaminB3\": 1.6,\n    \"vitaminB5\": 1.342,\n    \"vitaminB6\": 0.145,\n    \"vitaminB9\": 9,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 35,\n    \"calcium\": 9,\n    \"phosphorus\": 108,\n    \"potassium\": 86,\n    \"iron\": 0.8,\n    \"selenium\": 0,\n    \"zinc\": 1.16,\n    \"manganese\": 1.1,\n    \"copper\": 0.11,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 195\n    }\n  },\n  {\n    \"id\": 603,\n    \"name\": \"Oats\",\n    \"categoryId\": 600,\n    \"energy\": 379,\n    \"fat\": 6.52,\n    \"saturatedFat\": 1.11,\n    \"monounsaturatedFat\": 1.98,\n    \"polyunsaturatedFat\": 2.3,\n    \"carbs\": 67.7,\n    \"sugar\": 0.99,\n    \"fiber\": 10.1,\n    \"protein\": 13.15,\n    \"sodium\": 6,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.46,\n    \"vitaminB2\": 0.155,\n    \"vitaminB3\": 1.125,\n    \"vitaminB5\": 1.12,\n    \"vitaminB6\": 0.1,\n    \"vitaminB9\": 32,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.42,\n    \"vitaminK\": 2,\n    \"magnesium\": 138,\n    \"calcium\": 52,\n    \"phosphorus\": 410,\n    \"potassium\": 362,\n    \"iron\": 4.25,\n    \"selenium\": 28.9,\n    \"zinc\": 3.64,\n    \"manganese\": 3.63,\n    \"copper\": 0.391,\n    \"choline\": 40.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 81\n    }\n  },\n  {\n    \"id\": 604,\n    \"name\": \"Cornstarch\",\n    \"categoryId\": 600,\n    \"energy\": 381,\n    \"fat\": 0.05,\n    \"saturatedFat\": 0.009,\n    \"monounsaturatedFat\": 0.016,\n    \"polyunsaturatedFat\": 0.025,\n    \"carbs\": 91.27,\n    \"sugar\": 0,\n    \"fiber\": 0.9,\n    \"protein\": 0.26,\n    \"sodium\": 9,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 3,\n    \"calcium\": 2,\n    \"phosphorus\": 13,\n    \"potassium\": 3,\n    \"iron\": 0.47,\n    \"selenium\": 2.8,\n    \"zinc\": 0.06,\n    \"manganese\": 0.053,\n    \"copper\": 0.05,\n    \"choline\": 0.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 128\n    }\n  },\n  {\n    \"id\": 605,\n    \"name\": \"Whole-wheat Pasta\",\n    \"categoryId\": 600,\n    \"energy\": 352,\n    \"fat\": 2.93,\n    \"saturatedFat\": 0.428,\n    \"monounsaturatedFat\": 0.361,\n    \"polyunsaturatedFat\": 1.136,\n    \"carbs\": 73.37,\n    \"sugar\": 2.74,\n    \"fiber\": 9.2,\n    \"protein\": 13.87,\n    \"sodium\": 6,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.407,\n    \"vitaminB2\": 0.218,\n    \"vitaminB3\": 8.691,\n    \"vitaminB5\": 0.87,\n    \"vitaminB6\": 0.283,\n    \"vitaminB9\": 69,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.46,\n    \"vitaminK\": 1.4,\n    \"magnesium\": 128,\n    \"calcium\": 29,\n    \"phosphorus\": 343,\n    \"potassium\": 434,\n    \"iron\": 3.62,\n    \"selenium\": 77.6,\n    \"zinc\": 2.97,\n    \"manganese\": 2.983,\n    \"copper\": 0.497,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 96\n    }\n  },\n  {\n    \"id\": 606,\n    \"name\": \"Pasta\",\n    \"categoryId\": 600,\n    \"energy\": 371,\n    \"fat\": 1.51,\n    \"saturatedFat\": 0.277,\n    \"monounsaturatedFat\": 0.171,\n    \"polyunsaturatedFat\": 0.564,\n    \"carbs\": 74.67,\n    \"sugar\": 2.67,\n    \"fiber\": 3.2,\n    \"protein\": 13.04,\n    \"sodium\": 6,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.09,\n    \"vitaminB2\": 0.06,\n    \"vitaminB3\": 1.7,\n    \"vitaminB5\": 0.431,\n    \"vitaminB6\": 0.142,\n    \"vitaminB9\": 18,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.11,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 53,\n    \"calcium\": 21,\n    \"phosphorus\": 189,\n    \"potassium\": 223,\n    \"iron\": 1.3,\n    \"selenium\": 63.2,\n    \"zinc\": 1.41,\n    \"manganese\": 0.917,\n    \"copper\": 0.289,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 96\n    }\n  },\n  {\n    \"id\": 607,\n    \"name\": \"Quinoa\",\n    \"categoryId\": 600,\n    \"energy\": 368,\n    \"fat\": 6.07,\n    \"saturatedFat\": 0.706,\n    \"monounsaturatedFat\": 1.613,\n    \"polyunsaturatedFat\": 3.292,\n    \"carbs\": 64.16,\n    \"sugar\": 0,\n    \"fiber\": 7,\n    \"protein\": 14.12,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 1,\n    \"vitaminB1\": 0.36,\n    \"vitaminB2\": 0.318,\n    \"vitaminB3\": 1.52,\n    \"vitaminB5\": 0.772,\n    \"vitaminB6\": 0.487,\n    \"vitaminB9\": 184,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 2.44,\n    \"vitaminK\": 0,\n    \"magnesium\": 197,\n    \"calcium\": 47,\n    \"phosphorus\": 457,\n    \"potassium\": 563,\n    \"iron\": 4.57,\n    \"selenium\": 8.5,\n    \"zinc\": 3.1,\n    \"manganese\": 2.033,\n    \"copper\": 0.59,\n    \"choline\": 70.2,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 170\n    }\n  },\n  {\n    \"id\": 608,\n    \"name\": \"Egg Pasta\",\n    \"categoryId\": 600,\n    \"energy\": 130,\n    \"fat\": 1.74,\n    \"saturatedFat\": 0.408,\n    \"monounsaturatedFat\": 0.508,\n    \"polyunsaturatedFat\": 0.521,\n    \"carbs\": 23.54,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 5.28,\n    \"sodium\": 83,\n    \"cholesterol\": 41,\n    \"vitaminA\": 17,\n    \"vitaminB1\": 0.173,\n    \"vitaminB2\": 0.174,\n    \"vitaminB3\": 1.257,\n    \"vitaminB5\": 0.231,\n    \"vitaminB6\": 0.037,\n    \"vitaminB9\": 43,\n    \"vitaminB12\": 0.1,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 14,\n    \"calcium\": 10,\n    \"phosphorus\": 52,\n    \"potassium\": 21,\n    \"iron\": 1.16,\n    \"selenium\": 0,\n    \"zinc\": 0.44,\n    \"manganese\": 0.183,\n    \"copper\": 0.056,\n    \"choline\": 0\n  },\n  {\n    \"id\": 609,\n    \"name\": \"Egg Noodles\",\n    \"categoryId\": 600,\n    \"energy\": 384,\n    \"fat\": 4.44,\n    \"saturatedFat\": 1.18,\n    \"monounsaturatedFat\": 1.252,\n    \"polyunsaturatedFat\": 1.331,\n    \"carbs\": 71.27,\n    \"sugar\": 1.88,\n    \"fiber\": 3.3,\n    \"protein\": 14.16,\n    \"sodium\": 21,\n    \"cholesterol\": 84,\n    \"vitaminA\": 17,\n    \"vitaminB1\": 0.17,\n    \"vitaminB2\": 0.09,\n    \"vitaminB3\": 2.1,\n    \"vitaminB5\": 0.912,\n    \"vitaminB6\": 0.216,\n    \"vitaminB9\": 29,\n    \"vitaminB12\": 0.29,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.3,\n    \"vitaminE\": 0.37,\n    \"vitaminK\": 0.5,\n    \"magnesium\": 58,\n    \"calcium\": 35,\n    \"phosphorus\": 241,\n    \"potassium\": 244,\n    \"iron\": 1.9,\n    \"selenium\": 78.8,\n    \"zinc\": 1.92,\n    \"manganese\": 0.855,\n    \"copper\": 0.297,\n    \"choline\": 78.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 38\n    }\n  },\n  {\n    \"id\": 610,\n    \"name\": \"Couscous\",\n    \"categoryId\": 600,\n    \"energy\": 376,\n    \"fat\": 0.64,\n    \"saturatedFat\": 0.117,\n    \"monounsaturatedFat\": 0.089,\n    \"polyunsaturatedFat\": 0.252,\n    \"carbs\": 77.43,\n    \"sugar\": 0,\n    \"fiber\": 5,\n    \"protein\": 12.76,\n    \"sodium\": 10,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.163,\n    \"vitaminB2\": 0.078,\n    \"vitaminB3\": 3.49,\n    \"vitaminB5\": 1.243,\n    \"vitaminB6\": 0.11,\n    \"vitaminB9\": 20,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 44,\n    \"calcium\": 24,\n    \"phosphorus\": 170,\n    \"potassium\": 166,\n    \"iron\": 1.08,\n    \"selenium\": 0,\n    \"zinc\": 0.83,\n    \"manganese\": 0.78,\n    \"copper\": 0.247,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 173\n    }\n  },\n  {\n    \"id\": 611,\n    \"name\": \"Toasted Wheat Germ\",\n    \"categoryId\": 600,\n    \"energy\": 382,\n    \"fat\": 10.7,\n    \"saturatedFat\": 1.83,\n    \"monounsaturatedFat\": 1.5,\n    \"polyunsaturatedFat\": 6.62,\n    \"carbs\": 49.6,\n    \"sugar\": 7.8,\n    \"fiber\": 15.1,\n    \"protein\": 29.1,\n    \"sodium\": 4,\n    \"cholesterol\": 0,\n    \"vitaminA\": 5,\n    \"vitaminB1\": 1.67,\n    \"vitaminB2\": 0.82,\n    \"vitaminB3\": 5.59,\n    \"vitaminB5\": 1.387,\n    \"vitaminB6\": 0.978,\n    \"vitaminB9\": 352,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 15.99,\n    \"vitaminK\": 4,\n    \"magnesium\": 320,\n    \"calcium\": 45,\n    \"phosphorus\": 1146,\n    \"potassium\": 947,\n    \"iron\": 9.09,\n    \"selenium\": 65,\n    \"zinc\": 16.67,\n    \"manganese\": 19.956,\n    \"copper\": 0.62,\n    \"choline\": 178.6,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 113\n    }\n  },\n  {\n    \"id\": 612,\n    \"name\": \"White Flour\",\n    \"categoryId\": 600,\n    \"energy\": 361,\n    \"fat\": 1.66,\n    \"saturatedFat\": 0.244,\n    \"monounsaturatedFat\": 0.14,\n    \"polyunsaturatedFat\": 0.727,\n    \"carbs\": 72.53,\n    \"sugar\": 0.31,\n    \"fiber\": 2.4,\n    \"protein\": 11.98,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.812,\n    \"vitaminB2\": 0.512,\n    \"vitaminB3\": 7.554,\n    \"vitaminB5\": 0.438,\n    \"vitaminB6\": 0.037,\n    \"vitaminB9\": 183,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.4,\n    \"vitaminK\": 0.3,\n    \"magnesium\": 25,\n    \"calcium\": 15,\n    \"phosphorus\": 97,\n    \"potassium\": 100,\n    \"iron\": 4.41,\n    \"selenium\": 39.7,\n    \"zinc\": 0.85,\n    \"manganese\": 0.792,\n    \"copper\": 0.182,\n    \"choline\": 10.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 137\n    }\n  },\n  {\n    \"id\": 613,\n    \"name\": \"Bulgur\",\n    \"categoryId\": 600,\n    \"energy\": 342,\n    \"fat\": 1.33,\n    \"saturatedFat\": 0.232,\n    \"monounsaturatedFat\": 0.173,\n    \"polyunsaturatedFat\": 0.541,\n    \"carbs\": 75.87,\n    \"sugar\": 0.41,\n    \"fiber\": 12.5,\n    \"protein\": 12.29,\n    \"sodium\": 17,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.232,\n    \"vitaminB2\": 0.115,\n    \"vitaminB3\": 5.114,\n    \"vitaminB5\": 1.045,\n    \"vitaminB6\": 0.342,\n    \"vitaminB9\": 27,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.06,\n    \"vitaminK\": 1.9,\n    \"magnesium\": 164,\n    \"calcium\": 35,\n    \"phosphorus\": 300,\n    \"potassium\": 410,\n    \"iron\": 2.46,\n    \"selenium\": 2.3,\n    \"zinc\": 1.93,\n    \"manganese\": 3.048,\n    \"copper\": 0.335,\n    \"choline\": 28.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 140\n    }\n  },\n  {\n    \"id\": 614,\n    \"name\": \"Buckwheat\",\n    \"categoryId\": 600,\n    \"energy\": 343,\n    \"fat\": 3.4,\n    \"saturatedFat\": 0.741,\n    \"monounsaturatedFat\": 1.04,\n    \"polyunsaturatedFat\": 1.039,\n    \"carbs\": 71.5,\n    \"sugar\": 0,\n    \"fiber\": 10,\n    \"protein\": 13.25,\n    \"sodium\": 1,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.101,\n    \"vitaminB2\": 0.425,\n    \"vitaminB3\": 7.02,\n    \"vitaminB5\": 1.233,\n    \"vitaminB6\": 0.21,\n    \"vitaminB9\": 30,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 231,\n    \"calcium\": 18,\n    \"phosphorus\": 347,\n    \"potassium\": 460,\n    \"iron\": 2.2,\n    \"selenium\": 8.3,\n    \"zinc\": 2.4,\n    \"manganese\": 1.3,\n    \"copper\": 1.1,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 170\n    }\n  },\n  {\n    \"id\": 615,\n    \"name\": \"Millet\",\n    \"categoryId\": 600,\n    \"energy\": 378,\n    \"fat\": 4.22,\n    \"saturatedFat\": 0.723,\n    \"monounsaturatedFat\": 0.773,\n    \"polyunsaturatedFat\": 2.134,\n    \"carbs\": 72.85,\n    \"sugar\": 0,\n    \"fiber\": 8.5,\n    \"protein\": 11.02,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.421,\n    \"vitaminB2\": 0.29,\n    \"vitaminB3\": 4.72,\n    \"vitaminB5\": 0.848,\n    \"vitaminB6\": 0.384,\n    \"vitaminB9\": 85,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.05,\n    \"vitaminK\": 0.9,\n    \"magnesium\": 114,\n    \"calcium\": 8,\n    \"phosphorus\": 285,\n    \"potassium\": 195,\n    \"iron\": 3.01,\n    \"selenium\": 2.7,\n    \"zinc\": 1.68,\n    \"manganese\": 1.632,\n    \"copper\": 0.75,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 200\n    }\n  },\n  {\n    \"id\": 616,\n    \"name\": \"Whole-wheat Pasta\",\n    \"categoryId\": 600,\n    \"energy\": 352,\n    \"fat\": 2.93,\n    \"saturatedFat\": 0.428,\n    \"monounsaturatedFat\": 0.361,\n    \"polyunsaturatedFat\": 1.136,\n    \"carbs\": 73.37,\n    \"sugar\": 2.74,\n    \"fiber\": 9.2,\n    \"protein\": 13.87,\n    \"sodium\": 6,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.407,\n    \"vitaminB2\": 0.218,\n    \"vitaminB3\": 8.691,\n    \"vitaminB5\": 0.87,\n    \"vitaminB6\": 0.283,\n    \"vitaminB9\": 69,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.46,\n    \"vitaminK\": 1.4,\n    \"magnesium\": 128,\n    \"calcium\": 29,\n    \"phosphorus\": 343,\n    \"potassium\": 434,\n    \"iron\": 3.62,\n    \"selenium\": 77.6,\n    \"zinc\": 2.97,\n    \"manganese\": 2.983,\n    \"copper\": 0.497,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 96\n    }\n  },\n  {\n    \"id\": 617,\n    \"name\": \"Cornstarch\",\n    \"categoryId\": 600,\n    \"energy\": 381,\n    \"fat\": 0.05,\n    \"saturatedFat\": 0.009,\n    \"monounsaturatedFat\": 0.016,\n    \"polyunsaturatedFat\": 0.025,\n    \"carbs\": 91.27,\n    \"sugar\": 0,\n    \"fiber\": 0.9,\n    \"protein\": 0.26,\n    \"sodium\": 9,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 3,\n    \"calcium\": 2,\n    \"phosphorus\": 13,\n    \"potassium\": 3,\n    \"iron\": 0.47,\n    \"selenium\": 2.8,\n    \"zinc\": 0.06,\n    \"manganese\": 0.053,\n    \"copper\": 0.05,\n    \"choline\": 0.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 128\n    }\n  },\n  {\n    \"id\": 618,\n    \"name\": \"Whole-Grain Flour\",\n    \"categoryId\": 600,\n    \"energy\": 340,\n    \"fat\": 2.5,\n    \"saturatedFat\": 0.43,\n    \"monounsaturatedFat\": 0.283,\n    \"polyunsaturatedFat\": 1.167,\n    \"carbs\": 71.97,\n    \"sugar\": 0.41,\n    \"fiber\": 10.7,\n    \"protein\": 13.21,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.502,\n    \"vitaminB2\": 0.165,\n    \"vitaminB3\": 4.957,\n    \"vitaminB5\": 0.603,\n    \"vitaminB6\": 0.407,\n    \"vitaminB9\": 44,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.71,\n    \"vitaminK\": 1.9,\n    \"magnesium\": 137,\n    \"calcium\": 34,\n    \"phosphorus\": 357,\n    \"potassium\": 363,\n    \"iron\": 3.6,\n    \"selenium\": 61.8,\n    \"zinc\": 2.6,\n    \"manganese\": 4.067,\n    \"copper\": 0.41,\n    \"choline\": 31.2,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 120\n    }\n  },\n  {\n    \"id\": 619,\n    \"name\": \"Oat Flour\",\n    \"categoryId\": 600,\n    \"energy\": 404,\n    \"fat\": 9.12,\n    \"saturatedFat\": 1.607,\n    \"monounsaturatedFat\": 2.866,\n    \"polyunsaturatedFat\": 3.329,\n    \"carbs\": 65.7,\n    \"sugar\": 0.8,\n    \"fiber\": 6.5,\n    \"protein\": 14.66,\n    \"sodium\": 19,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.692,\n    \"vitaminB2\": 0.125,\n    \"vitaminB3\": 1.474,\n    \"vitaminB5\": 0.201,\n    \"vitaminB6\": 0.125,\n    \"vitaminB9\": 32,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.7,\n    \"vitaminK\": 3.2,\n    \"magnesium\": 144,\n    \"calcium\": 55,\n    \"phosphorus\": 452,\n    \"potassium\": 371,\n    \"iron\": 4,\n    \"selenium\": 34,\n    \"zinc\": 3.2,\n    \"manganese\": 4.019,\n    \"copper\": 0.437,\n    \"choline\": 29.9,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 104\n    }\n  },\n  {\n    \"id\": 620,\n    \"name\": \"Rice Noodles\",\n    \"categoryId\": 600,\n    \"energy\": 364,\n    \"fat\": 0.56,\n    \"saturatedFat\": 0.153,\n    \"monounsaturatedFat\": 0.175,\n    \"polyunsaturatedFat\": 0.15,\n    \"carbs\": 80.18,\n    \"sugar\": 0.12,\n    \"fiber\": 1.6,\n    \"protein\": 5.95,\n    \"sodium\": 182,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.031,\n    \"vitaminB2\": 0.017,\n    \"vitaminB3\": 0.221,\n    \"vitaminB5\": 0.051,\n    \"vitaminB6\": 0.015,\n    \"vitaminB9\": 3,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.11,\n    \"vitaminK\": 0,\n    \"magnesium\": 12,\n    \"calcium\": 18,\n    \"phosphorus\": 153,\n    \"potassium\": 30,\n    \"iron\": 0.7,\n    \"selenium\": 15.1,\n    \"zinc\": 0.74,\n    \"manganese\": 0.498,\n    \"copper\": 0.078,\n    \"choline\": 5.5\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/index.ts",
    "content": "import poultry from './poultry.json'\nimport beef from './beef.json'\nimport pork from './pork.json'\nimport finfishAndShellfish from './finfishAndShellFish.json'\nimport dairyAndEggs from './dairyAndEggs.json'\nimport grainsAndPasta from './grainsAndPasta.json'\nimport vegetables from './vegetables.json'\nimport legumesAndLegumeProducts from './legumesAndLegumeProducts.json'\nimport fruitsAndJuices from './fruitsAndJuices.json'\nimport nutAndSeedProducts from './nutAndSeedProducts.json'\nimport fatsAndOils from './fatsAndOils.json'\nimport bakedProducts from './bakedProducts.json'\nimport saucesAndSoups from './saucesAndSoups.json'\nimport spicesAndHerbs from './spicesAndHerbs.json'\nimport sweetsAndSnacks from './sweetsAndSnacks.json'\nimport beverages from './beverages.json'\n\nconst foods = [\n  ...poultry,\n  ...beef,\n  ...pork,\n  ...finfishAndShellfish,\n  ...dairyAndEggs,\n  ...grainsAndPasta,\n  ...vegetables,\n  ...legumesAndLegumeProducts,\n  ...fruitsAndJuices,\n  ...nutAndSeedProducts,\n  ...fatsAndOils,\n  ...bakedProducts,\n  ...saucesAndSoups,\n  ...spicesAndHerbs,\n  ...sweetsAndSnacks,\n  ...beverages,\n]\n\nexport default foods\n"
  },
  {
    "path": "src/foods/builtIn/legumesAndLegumeProducts.json",
    "content": "[\n    {\n      \"id\": 801,\n      \"name\": \"Traditional Refried Beans (canned)\",\n      \"categoryId\": 800,\n      \"energy\": 90,\n      \"fat\": 2.01,\n      \"saturatedFat\": 0.631,\n      \"monounsaturatedFat\": 0.601,\n      \"polyunsaturatedFat\": 0.543,\n      \"carbs\": 13.55,\n      \"sugar\": 0.54,\n      \"fiber\": 3.7,\n      \"protein\": 4.98,\n      \"sodium\": 370,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.076,\n      \"vitaminB2\": 0.079,\n      \"vitaminB3\": 0.367,\n      \"vitaminB5\": 0.189,\n      \"vitaminB6\": 0.103,\n      \"vitaminB9\": 11,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.09,\n      \"vitaminK\": 2.1,\n      \"magnesium\": 35,\n      \"calcium\": 29,\n      \"phosphorus\": 92,\n      \"potassium\": 319,\n      \"iron\": 1.44,\n      \"selenium\": 5.8,\n      \"zinc\": 0.58,\n      \"manganese\": 0.289,\n      \"copper\": 0.129,\n      \"choline\": 21.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 238\n      }\n    },\n    {\n      \"id\": 802,\n      \"name\": \"Pinto Beans (canned)\",\n      \"categoryId\": 800,\n      \"energy\": 114,\n      \"fat\": 0.9,\n      \"saturatedFat\": 0.158,\n      \"monounsaturatedFat\": 0.153,\n      \"polyunsaturatedFat\": 0.273,\n      \"carbs\": 20.22,\n      \"sugar\": 0.54,\n      \"fiber\": 5.5,\n      \"protein\": 6.99,\n      \"sodium\": 239,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.052,\n      \"vitaminB2\": 0.019,\n      \"vitaminB3\": 0.272,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 24,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 32,\n      \"calcium\": 63,\n      \"phosphorus\": 101,\n      \"potassium\": 274,\n      \"iron\": 1.33,\n      \"selenium\": 0,\n      \"zinc\": 0.61,\n      \"manganese\": 0.383,\n      \"copper\": 0.259,\n      \"choline\": 0\n    },\n    {\n      \"id\": 803,\n      \"name\": \"Peanut Butter\",\n      \"categoryId\": 800,\n      \"energy\": 590,\n      \"fat\": 49.9,\n      \"saturatedFat\": 7.716,\n      \"monounsaturatedFat\": 23.582,\n      \"polyunsaturatedFat\": 14.363,\n      \"carbs\": 21.83,\n      \"sugar\": 9.29,\n      \"fiber\": 6.6,\n      \"protein\": 24,\n      \"sodium\": 203,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.12,\n      \"vitaminB2\": 0.11,\n      \"vitaminB3\": 13.69,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.45,\n      \"vitaminB9\": 92,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 9.05,\n      \"vitaminK\": 0.6,\n      \"magnesium\": 159,\n      \"calcium\": 41,\n      \"phosphorus\": 317,\n      \"potassium\": 747,\n      \"iron\": 1.9,\n      \"selenium\": 7.5,\n      \"zinc\": 2.78,\n      \"manganese\": 0,\n      \"copper\": 0.515,\n      \"choline\": 63.5,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 16\n      }\n    },\n    {\n      \"id\": 804,\n      \"name\": \"Chickpeas (canned)\",\n      \"categoryId\": 800,\n      \"energy\": 139,\n      \"fat\": 2.77,\n      \"saturatedFat\": 0.214,\n      \"monounsaturatedFat\": 0.488,\n      \"polyunsaturatedFat\": 0.967,\n      \"carbs\": 22.53,\n      \"sugar\": 4.01,\n      \"fiber\": 6.4,\n      \"protein\": 7.05,\n      \"sodium\": 246,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.027,\n      \"vitaminB2\": 0.015,\n      \"vitaminB3\": 0.14,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.116,\n      \"vitaminB9\": 48,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.29,\n      \"vitaminK\": 3.4,\n      \"magnesium\": 26,\n      \"calcium\": 45,\n      \"phosphorus\": 85,\n      \"potassium\": 126,\n      \"iron\": 1.07,\n      \"selenium\": 3.1,\n      \"zinc\": 0.63,\n      \"manganese\": 0.846,\n      \"copper\": 0.253,\n      \"choline\": 0\n    },\n    {\n      \"id\": 805,\n      \"name\": \"Pinto Beans\",\n      \"categoryId\": 800,\n      \"energy\": 347,\n      \"fat\": 1.23,\n      \"saturatedFat\": 0.235,\n      \"monounsaturatedFat\": 0.229,\n      \"polyunsaturatedFat\": 0.407,\n      \"carbs\": 62.55,\n      \"sugar\": 2.11,\n      \"fiber\": 15.5,\n      \"protein\": 21.42,\n      \"sodium\": 12,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.713,\n      \"vitaminB2\": 0.212,\n      \"vitaminB3\": 1.174,\n      \"vitaminB5\": 0.785,\n      \"vitaminB6\": 0.474,\n      \"vitaminB9\": 525,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.21,\n      \"vitaminK\": 5.6,\n      \"magnesium\": 176,\n      \"calcium\": 113,\n      \"phosphorus\": 411,\n      \"potassium\": 1393,\n      \"iron\": 5.07,\n      \"selenium\": 27.9,\n      \"zinc\": 2.28,\n      \"manganese\": 1.148,\n      \"copper\": 0.893,\n      \"choline\": 66.2,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 12\n      }\n    },\n    {\n      \"id\": 806,\n      \"name\": \"White Beans\",\n      \"categoryId\": 800,\n      \"energy\": 333,\n      \"fat\": 0.85,\n      \"saturatedFat\": 0.219,\n      \"monounsaturatedFat\": 0.074,\n      \"polyunsaturatedFat\": 0.364,\n      \"carbs\": 60.27,\n      \"sugar\": 2.11,\n      \"fiber\": 15.2,\n      \"protein\": 23.36,\n      \"sodium\": 16,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.437,\n      \"vitaminB2\": 0.146,\n      \"vitaminB3\": 0.479,\n      \"vitaminB5\": 0.732,\n      \"vitaminB6\": 0.318,\n      \"vitaminB9\": 388,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.21,\n      \"vitaminK\": 5.6,\n      \"magnesium\": 190,\n      \"calcium\": 240,\n      \"phosphorus\": 301,\n      \"potassium\": 1795,\n      \"iron\": 10.44,\n      \"selenium\": 12.8,\n      \"zinc\": 3.67,\n      \"manganese\": 1.796,\n      \"copper\": 0.984,\n      \"choline\": 66.2,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 12.6\n      }\n    },\n    {\n      \"id\": 807,\n      \"name\": \"Red Beans\",\n      \"categoryId\": 800,\n      \"energy\": 337,\n      \"fat\": 1.06,\n      \"saturatedFat\": 0.154,\n      \"monounsaturatedFat\": 0.082,\n      \"polyunsaturatedFat\": 0.586,\n      \"carbs\": 61.29,\n      \"sugar\": 2.1,\n      \"fiber\": 15.2,\n      \"protein\": 22.53,\n      \"sodium\": 12,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.608,\n      \"vitaminB2\": 0.215,\n      \"vitaminB3\": 2.11,\n      \"vitaminB5\": 0.78,\n      \"vitaminB6\": 0.397,\n      \"vitaminB9\": 394,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.21,\n      \"vitaminK\": 5.6,\n      \"magnesium\": 138,\n      \"calcium\": 83,\n      \"phosphorus\": 406,\n      \"potassium\": 1359,\n      \"iron\": 6.69,\n      \"selenium\": 3.2,\n      \"zinc\": 2.79,\n      \"manganese\": 1.111,\n      \"copper\": 0.699,\n      \"choline\": 65.9,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 184\n      }\n    },\n    {\n      \"id\": 808,\n      \"name\": \"Black Beans\",\n      \"categoryId\": 800,\n      \"energy\": 341,\n      \"fat\": 1.42,\n      \"saturatedFat\": 0.366,\n      \"monounsaturatedFat\": 0.123,\n      \"polyunsaturatedFat\": 0.61,\n      \"carbs\": 62.36,\n      \"sugar\": 2.12,\n      \"fiber\": 15.5,\n      \"protein\": 21.6,\n      \"sodium\": 5,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.9,\n      \"vitaminB2\": 0.193,\n      \"vitaminB3\": 1.955,\n      \"vitaminB5\": 0.899,\n      \"vitaminB6\": 0.286,\n      \"vitaminB9\": 444,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.21,\n      \"vitaminK\": 5.6,\n      \"magnesium\": 171,\n      \"calcium\": 123,\n      \"phosphorus\": 352,\n      \"potassium\": 1483,\n      \"iron\": 5.02,\n      \"selenium\": 3.2,\n      \"zinc\": 3.65,\n      \"manganese\": 1.06,\n      \"copper\": 0.841,\n      \"choline\": 66.4,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 194\n      }\n    },\n    {\n      \"id\": 809,\n      \"name\": \"Adzuki Beans\",\n      \"categoryId\": 800,\n      \"energy\": 329,\n      \"fat\": 0.53,\n      \"saturatedFat\": 0.191,\n      \"monounsaturatedFat\": 0.05,\n      \"polyunsaturatedFat\": 0.113,\n      \"carbs\": 62.9,\n      \"sugar\": 0,\n      \"fiber\": 12.7,\n      \"protein\": 19.87,\n      \"sodium\": 5,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.455,\n      \"vitaminB2\": 0.22,\n      \"vitaminB3\": 2.63,\n      \"vitaminB5\": 1.471,\n      \"vitaminB6\": 0.351,\n      \"vitaminB9\": 622,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 127,\n      \"calcium\": 66,\n      \"phosphorus\": 381,\n      \"potassium\": 1254,\n      \"iron\": 4.98,\n      \"selenium\": 3.1,\n      \"zinc\": 5.04,\n      \"manganese\": 1.73,\n      \"copper\": 1.094,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 197\n      }\n    },\n    {\n      \"id\": 810,\n      \"name\": \"Lima Beans\",\n      \"categoryId\": 800,\n      \"energy\": 338,\n      \"fat\": 0.69,\n      \"saturatedFat\": 0.161,\n      \"monounsaturatedFat\": 0.062,\n      \"polyunsaturatedFat\": 0.309,\n      \"carbs\": 63.38,\n      \"sugar\": 8.5,\n      \"fiber\": 19,\n      \"protein\": 21.46,\n      \"sodium\": 18,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.507,\n      \"vitaminB2\": 0.202,\n      \"vitaminB3\": 1.537,\n      \"vitaminB5\": 1.355,\n      \"vitaminB6\": 0.512,\n      \"vitaminB9\": 395,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.72,\n      \"vitaminK\": 6,\n      \"magnesium\": 224,\n      \"calcium\": 81,\n      \"phosphorus\": 385,\n      \"potassium\": 1724,\n      \"iron\": 7.51,\n      \"selenium\": 7.2,\n      \"zinc\": 2.83,\n      \"manganese\": 1.672,\n      \"copper\": 0.74,\n      \"choline\": 96.7,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 178\n      }\n    },\n    {\n      \"id\": 811,\n      \"name\": \"Kidney Beans\",\n      \"categoryId\": 800,\n      \"energy\": 333,\n      \"fat\": 0.83,\n      \"saturatedFat\": 0.12,\n      \"monounsaturatedFat\": 0.064,\n      \"polyunsaturatedFat\": 0.457,\n      \"carbs\": 60.01,\n      \"sugar\": 2.23,\n      \"fiber\": 24.9,\n      \"protein\": 23.58,\n      \"sodium\": 24,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.529,\n      \"vitaminB2\": 0.219,\n      \"vitaminB3\": 2.06,\n      \"vitaminB5\": 0.78,\n      \"vitaminB6\": 0.397,\n      \"vitaminB9\": 394,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.22,\n      \"vitaminK\": 19,\n      \"magnesium\": 140,\n      \"calcium\": 143,\n      \"phosphorus\": 407,\n      \"potassium\": 1406,\n      \"iron\": 8.2,\n      \"selenium\": 3.2,\n      \"zinc\": 2.79,\n      \"manganese\": 1.021,\n      \"copper\": 0.958,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 184\n      }\n    },\n    {\n      \"id\": 812,\n      \"name\": \"Soybeans\",\n      \"categoryId\": 800,\n      \"energy\": 446,\n      \"fat\": 19.94,\n      \"saturatedFat\": 2.884,\n      \"monounsaturatedFat\": 4.404,\n      \"polyunsaturatedFat\": 11.255,\n      \"carbs\": 30.16,\n      \"sugar\": 7.33,\n      \"fiber\": 9.3,\n      \"protein\": 36.49,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.874,\n      \"vitaminB2\": 0.87,\n      \"vitaminB3\": 1.623,\n      \"vitaminB5\": 0.793,\n      \"vitaminB6\": 0.377,\n      \"vitaminB9\": 375,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.85,\n      \"vitaminK\": 47,\n      \"magnesium\": 280,\n      \"calcium\": 277,\n      \"phosphorus\": 704,\n      \"potassium\": 1797,\n      \"iron\": 15.7,\n      \"selenium\": 17.8,\n      \"zinc\": 4.89,\n      \"manganese\": 2.517,\n      \"copper\": 1.658,\n      \"choline\": 115.9,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 186\n      }\n    },\n    {\n      \"id\": 813,\n      \"name\": \"Hummus\",\n      \"categoryId\": 800,\n      \"energy\": 237,\n      \"fat\": 17.82,\n      \"saturatedFat\": 2.562,\n      \"monounsaturatedFat\": 5.34,\n      \"polyunsaturatedFat\": 8.812,\n      \"carbs\": 15,\n      \"sugar\": 0.62,\n      \"fiber\": 5.5,\n      \"protein\": 7.78,\n      \"sodium\": 426,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.16,\n      \"vitaminB2\": 0.127,\n      \"vitaminB3\": 1.024,\n      \"vitaminB5\": 0.346,\n      \"vitaminB6\": 0.146,\n      \"vitaminB9\": 48,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.54,\n      \"vitaminK\": 22.8,\n      \"magnesium\": 75,\n      \"calcium\": 47,\n      \"phosphorus\": 181,\n      \"potassium\": 312,\n      \"iron\": 2.54,\n      \"selenium\": 4.7,\n      \"zinc\": 1.44,\n      \"manganese\": 1.155,\n      \"copper\": 0.377,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 15\n      }\n    },\n    {\n      \"id\": 814,\n      \"name\": \"PBfit Peanut Butter Powder\",\n      \"categoryId\": 800,\n      \"energy\": 438,\n      \"fat\": 12.5,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 31.25,\n      \"sugar\": 18.75,\n      \"fiber\": 18.8,\n      \"protein\": 50,\n      \"sodium\": 781,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 238,\n      \"phosphorus\": 388,\n      \"potassium\": 775,\n      \"iron\": 5,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"url\": \"https://pbfit.com/product/pbfit-original/\"\n    },\n    {\n      \"id\": 815,\n      \"name\": \"PB2 Powdered Peanut Butter\",\n      \"categoryId\": 800,\n      \"energy\": 462,\n      \"fat\": 11.54,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 38.46,\n      \"sugar\": 15.38,\n      \"fiber\": 7.7,\n      \"protein\": 46.15,\n      \"sodium\": 692308,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 77,\n      \"phosphorus\": 0,\n      \"potassium\": 1154,\n      \"iron\": 3.08,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"url\": \"https://shop.pb2foods.com/products/pb2-original-powdered-peanut-butter-peanut-butter-powder\"\n    },\n    {\n      \"id\": 816,\n      \"name\": \"Lentils\",\n      \"categoryId\": 800,\n      \"energy\": 352,\n      \"fat\": 1.06,\n      \"saturatedFat\": 0.154,\n      \"monounsaturatedFat\": 0.193,\n      \"polyunsaturatedFat\": 0.526,\n      \"carbs\": 63.35,\n      \"sugar\": 2.03,\n      \"fiber\": 10.7,\n      \"protein\": 24.63,\n      \"sodium\": 6,\n      \"cholesterol\": 0,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.873,\n      \"vitaminB2\": 0.211,\n      \"vitaminB3\": 2.605,\n      \"vitaminB5\": 2.14,\n      \"vitaminB6\": 0.54,\n      \"vitaminB9\": 479,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.49,\n      \"vitaminK\": 5,\n      \"magnesium\": 47,\n      \"calcium\": 35,\n      \"phosphorus\": 281,\n      \"potassium\": 677,\n      \"iron\": 6.51,\n      \"selenium\": 0.1,\n      \"zinc\": 3.27,\n      \"manganese\": 1.393,\n      \"copper\": 0.754,\n      \"choline\": 96.4,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 12\n      }\n    },\n    {\n      \"id\": 817,\n      \"name\": \"Peanuts\",\n      \"categoryId\": 800,\n      \"energy\": 567,\n      \"fat\": 49.24,\n      \"saturatedFat\": 6.279,\n      \"monounsaturatedFat\": 24.426,\n      \"polyunsaturatedFat\": 15.558,\n      \"carbs\": 16.13,\n      \"sugar\": 4.72,\n      \"fiber\": 8.5,\n      \"protein\": 25.8,\n      \"sodium\": 18,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.64,\n      \"vitaminB2\": 0.135,\n      \"vitaminB3\": 12.066,\n      \"vitaminB5\": 1.767,\n      \"vitaminB6\": 0.348,\n      \"vitaminB9\": 240,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 8.33,\n      \"vitaminK\": 0,\n      \"magnesium\": 168,\n      \"calcium\": 92,\n      \"phosphorus\": 376,\n      \"potassium\": 705,\n      \"iron\": 4.58,\n      \"selenium\": 7.2,\n      \"zinc\": 3.27,\n      \"manganese\": 1.934,\n      \"copper\": 1.144,\n      \"choline\": 52.5,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 146\n      }\n    },\n    {\n      \"id\": 818,\n      \"name\": \"Tofu\",\n      \"categoryId\": 800,\n      \"energy\": 76,\n      \"fat\": 4.78,\n      \"saturatedFat\": 0.691,\n      \"monounsaturatedFat\": 1.056,\n      \"polyunsaturatedFat\": 2.699,\n      \"carbs\": 1.87,\n      \"sugar\": 0.62,\n      \"fiber\": 0.3,\n      \"protein\": 8.08,\n      \"sodium\": 7,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.081,\n      \"vitaminB2\": 0.052,\n      \"vitaminB3\": 0.195,\n      \"vitaminB5\": 0.068,\n      \"vitaminB6\": 0.047,\n      \"vitaminB9\": 15,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.01,\n      \"vitaminK\": 2.4,\n      \"magnesium\": 30,\n      \"calcium\": 350,\n      \"phosphorus\": 97,\n      \"potassium\": 121,\n      \"iron\": 5.36,\n      \"selenium\": 8.9,\n      \"zinc\": 0.8,\n      \"manganese\": 0.605,\n      \"copper\": 0.193,\n      \"choline\": 28.8,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 124\n      }\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/nutAndSeedProducts.json",
    "content": "[\n    {\n      \"id\": 1001,\n      \"name\": \"Sunflower Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 584,\n      \"fat\": 51.46,\n      \"saturatedFat\": 4.455,\n      \"monounsaturatedFat\": 18.528,\n      \"polyunsaturatedFat\": 23.137,\n      \"carbs\": 20,\n      \"sugar\": 2.62,\n      \"fiber\": 8.6,\n      \"protein\": 20.78,\n      \"sodium\": 9,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 1.48,\n      \"vitaminB2\": 0.355,\n      \"vitaminB3\": 8.335,\n      \"vitaminB5\": 1.13,\n      \"vitaminB6\": 1.345,\n      \"vitaminB9\": 227,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 35.17,\n      \"vitaminK\": 0,\n      \"magnesium\": 325,\n      \"calcium\": 78,\n      \"phosphorus\": 660,\n      \"potassium\": 645,\n      \"iron\": 5.25,\n      \"selenium\": 53,\n      \"zinc\": 5,\n      \"manganese\": 1.95,\n      \"copper\": 1.8,\n      \"choline\": 55.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 140\n      }\n    },\n    {\n      \"id\": 1002,\n      \"name\": \"Pumpkin Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 559,\n      \"fat\": 49.05,\n      \"saturatedFat\": 8.659,\n      \"monounsaturatedFat\": 16.242,\n      \"polyunsaturatedFat\": 20.976,\n      \"carbs\": 10.71,\n      \"sugar\": 1.4,\n      \"fiber\": 6,\n      \"protein\": 30.23,\n      \"sodium\": 7,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.273,\n      \"vitaminB2\": 0.153,\n      \"vitaminB3\": 4.987,\n      \"vitaminB5\": 0.75,\n      \"vitaminB6\": 0.143,\n      \"vitaminB9\": 58,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.9,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.18,\n      \"vitaminK\": 7.3,\n      \"magnesium\": 592,\n      \"calcium\": 46,\n      \"phosphorus\": 1233,\n      \"potassium\": 809,\n      \"iron\": 8.82,\n      \"selenium\": 9.4,\n      \"zinc\": 7.81,\n      \"manganese\": 4.543,\n      \"copper\": 1.343,\n      \"choline\": 63,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 129\n      }\n    },\n    {\n      \"id\": 1003,\n      \"name\": \"Chia Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 486,\n      \"fat\": 30.74,\n      \"saturatedFat\": 3.33,\n      \"monounsaturatedFat\": 2.309,\n      \"polyunsaturatedFat\": 23.665,\n      \"carbs\": 42.12,\n      \"sugar\": 0,\n      \"fiber\": 34.4,\n      \"protein\": 16.54,\n      \"sodium\": 16,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.62,\n      \"vitaminB2\": 0.17,\n      \"vitaminB3\": 8.83,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 49,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.5,\n      \"vitaminK\": 0,\n      \"magnesium\": 335,\n      \"calcium\": 631,\n      \"phosphorus\": 860,\n      \"potassium\": 407,\n      \"iron\": 7.72,\n      \"selenium\": 55.2,\n      \"zinc\": 4.58,\n      \"manganese\": 2.723,\n      \"copper\": 0.924,\n      \"choline\": 0\n    },\n    {\n      \"id\": 1004,\n      \"name\": \"Sesame Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 573,\n      \"fat\": 49.67,\n      \"saturatedFat\": 6.957,\n      \"monounsaturatedFat\": 18.759,\n      \"polyunsaturatedFat\": 21.773,\n      \"carbs\": 23.45,\n      \"sugar\": 0.3,\n      \"fiber\": 11.8,\n      \"protein\": 17.73,\n      \"sodium\": 11,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.791,\n      \"vitaminB2\": 0.247,\n      \"vitaminB3\": 4.515,\n      \"vitaminB5\": 0.05,\n      \"vitaminB6\": 0.79,\n      \"vitaminB9\": 97,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.25,\n      \"vitaminK\": 0,\n      \"magnesium\": 351,\n      \"calcium\": 975,\n      \"phosphorus\": 629,\n      \"potassium\": 468,\n      \"iron\": 14.55,\n      \"selenium\": 34.4,\n      \"zinc\": 7.75,\n      \"manganese\": 2.46,\n      \"copper\": 4.082,\n      \"choline\": 25.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 144\n      }\n    },\n    {\n      \"id\": 1005,\n      \"name\": \"Coconut Flakes\",\n      \"categoryId\": 1000,\n      \"energy\": 456,\n      \"fat\": 27.99,\n      \"saturatedFat\": 26.396,\n      \"monounsaturatedFat\": 1.377,\n      \"polyunsaturatedFat\": 0.222,\n      \"carbs\": 51.85,\n      \"sugar\": 36.75,\n      \"fiber\": 9.9,\n      \"protein\": 3.13,\n      \"sodium\": 285,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.015,\n      \"vitaminB2\": 0.015,\n      \"vitaminB3\": 0.697,\n      \"vitaminB5\": 0.14,\n      \"vitaminB6\": 0.03,\n      \"vitaminB9\": 3,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 51,\n      \"calcium\": 11,\n      \"phosphorus\": 100,\n      \"potassium\": 361,\n      \"iron\": 1.51,\n      \"selenium\": 16.1,\n      \"zinc\": 0.71,\n      \"manganese\": 0.959,\n      \"copper\": 0.295,\n      \"choline\": 19.3,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 85\n      }\n    },\n    {\n      \"id\": 1006,\n      \"name\": \"Almond Butter\",\n      \"categoryId\": 1000,\n      \"energy\": 614,\n      \"fat\": 55.5,\n      \"saturatedFat\": 4.152,\n      \"monounsaturatedFat\": 32.445,\n      \"polyunsaturatedFat\": 13.613,\n      \"carbs\": 18.82,\n      \"sugar\": 4.43,\n      \"fiber\": 10.3,\n      \"protein\": 20.96,\n      \"sodium\": 7,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.041,\n      \"vitaminB2\": 0.939,\n      \"vitaminB3\": 3.155,\n      \"vitaminB5\": 0.318,\n      \"vitaminB6\": 0.103,\n      \"vitaminB9\": 53,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 24.21,\n      \"vitaminK\": 0,\n      \"magnesium\": 279,\n      \"calcium\": 347,\n      \"phosphorus\": 508,\n      \"potassium\": 748,\n      \"iron\": 3.49,\n      \"selenium\": 2.4,\n      \"zinc\": 3.29,\n      \"manganese\": 2.131,\n      \"copper\": 0.934,\n      \"choline\": 52.1,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 16\n      }\n    },\n    {\n      \"id\": 1007,\n      \"name\": \"Cashews\",\n      \"categoryId\": 1000,\n      \"energy\": 553,\n      \"fat\": 43.85,\n      \"saturatedFat\": 7.783,\n      \"monounsaturatedFat\": 23.797,\n      \"polyunsaturatedFat\": 7.845,\n      \"carbs\": 30.19,\n      \"sugar\": 5.91,\n      \"fiber\": 3.3,\n      \"protein\": 18.22,\n      \"sodium\": 12,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.423,\n      \"vitaminB2\": 0.058,\n      \"vitaminB3\": 1.062,\n      \"vitaminB5\": 0.864,\n      \"vitaminB6\": 0.417,\n      \"vitaminB9\": 25,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.9,\n      \"vitaminK\": 34.1,\n      \"magnesium\": 292,\n      \"calcium\": 37,\n      \"phosphorus\": 593,\n      \"potassium\": 660,\n      \"iron\": 6.68,\n      \"selenium\": 19.9,\n      \"zinc\": 5.78,\n      \"manganese\": 1.655,\n      \"copper\": 2.195,\n      \"choline\": 0\n    },\n    {\n      \"id\": 1008,\n      \"name\": \"Pine Nuts\",\n      \"categoryId\": 1000,\n      \"energy\": 673,\n      \"fat\": 68.37,\n      \"saturatedFat\": 4.899,\n      \"monounsaturatedFat\": 18.764,\n      \"polyunsaturatedFat\": 34.071,\n      \"carbs\": 13.08,\n      \"sugar\": 3.59,\n      \"fiber\": 3.7,\n      \"protein\": 13.69,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.364,\n      \"vitaminB2\": 0.227,\n      \"vitaminB3\": 4.387,\n      \"vitaminB5\": 0.313,\n      \"vitaminB6\": 0.094,\n      \"vitaminB9\": 34,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 9.33,\n      \"vitaminK\": 53.9,\n      \"magnesium\": 251,\n      \"calcium\": 16,\n      \"phosphorus\": 575,\n      \"potassium\": 597,\n      \"iron\": 5.53,\n      \"selenium\": 0.7,\n      \"zinc\": 6.45,\n      \"manganese\": 8.802,\n      \"copper\": 1.324,\n      \"choline\": 55.8,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 135\n      }\n    },\n    {\n      \"id\": 1009,\n      \"name\": \"Flaxseed\",\n      \"categoryId\": 1000,\n      \"energy\": 534,\n      \"fat\": 42.16,\n      \"saturatedFat\": 3.663,\n      \"monounsaturatedFat\": 7.527,\n      \"polyunsaturatedFat\": 28.73,\n      \"carbs\": 28.88,\n      \"sugar\": 1.55,\n      \"fiber\": 27.3,\n      \"protein\": 18.29,\n      \"sodium\": 30,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 1.644,\n      \"vitaminB2\": 0.161,\n      \"vitaminB3\": 3.08,\n      \"vitaminB5\": 0.985,\n      \"vitaminB6\": 0.473,\n      \"vitaminB9\": 87,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.31,\n      \"vitaminK\": 4.3,\n      \"magnesium\": 392,\n      \"calcium\": 255,\n      \"phosphorus\": 642,\n      \"potassium\": 813,\n      \"iron\": 5.73,\n      \"selenium\": 25.4,\n      \"zinc\": 4.34,\n      \"manganese\": 2.482,\n      \"copper\": 1.22,\n      \"choline\": 78.7,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 2.5\n      }\n    },\n    {\n      \"id\": 1010,\n      \"name\": \"Almonds\",\n      \"categoryId\": 1000,\n      \"energy\": 579,\n      \"fat\": 49.93,\n      \"saturatedFat\": 3.802,\n      \"monounsaturatedFat\": 31.551,\n      \"polyunsaturatedFat\": 12.329,\n      \"carbs\": 21.55,\n      \"sugar\": 4.35,\n      \"fiber\": 12.5,\n      \"protein\": 21.15,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.205,\n      \"vitaminB2\": 1.138,\n      \"vitaminB3\": 3.618,\n      \"vitaminB5\": 0.471,\n      \"vitaminB6\": 0.137,\n      \"vitaminB9\": 44,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 25.63,\n      \"vitaminK\": 0,\n      \"magnesium\": 270,\n      \"calcium\": 269,\n      \"phosphorus\": 481,\n      \"potassium\": 733,\n      \"iron\": 3.71,\n      \"selenium\": 4.1,\n      \"zinc\": 3.12,\n      \"manganese\": 2.179,\n      \"copper\": 1.031,\n      \"choline\": 52.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 143\n      }\n    },\n    {\n      \"id\": 1011,\n      \"name\": \"Hazelnut\",\n      \"categoryId\": 1000,\n      \"energy\": 628,\n      \"fat\": 60.75,\n      \"saturatedFat\": 4.464,\n      \"monounsaturatedFat\": 45.652,\n      \"polyunsaturatedFat\": 7.92,\n      \"carbs\": 16.7,\n      \"sugar\": 4.34,\n      \"fiber\": 9.7,\n      \"protein\": 14.95,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.643,\n      \"vitaminB2\": 0.113,\n      \"vitaminB3\": 1.8,\n      \"vitaminB5\": 0.918,\n      \"vitaminB6\": 0.563,\n      \"vitaminB9\": 113,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 15.03,\n      \"vitaminK\": 14.2,\n      \"magnesium\": 163,\n      \"calcium\": 114,\n      \"phosphorus\": 290,\n      \"potassium\": 680,\n      \"iron\": 4.7,\n      \"selenium\": 2.4,\n      \"zinc\": 2.45,\n      \"manganese\": 6.175,\n      \"copper\": 1.725,\n      \"choline\": 45.6,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 115\n      }\n    },\n    {\n      \"id\": 1012,\n      \"name\": \"Macadamia\",\n      \"categoryId\": 1000,\n      \"energy\": 718,\n      \"fat\": 75.77,\n      \"saturatedFat\": 12.061,\n      \"monounsaturatedFat\": 58.877,\n      \"polyunsaturatedFat\": 1.502,\n      \"carbs\": 13.82,\n      \"sugar\": 4.57,\n      \"fiber\": 8.6,\n      \"protein\": 7.91,\n      \"sodium\": 5,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 1.195,\n      \"vitaminB2\": 0.162,\n      \"vitaminB3\": 2.473,\n      \"vitaminB5\": 0.758,\n      \"vitaminB6\": 0.275,\n      \"vitaminB9\": 11,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.54,\n      \"vitaminK\": 0,\n      \"magnesium\": 130,\n      \"calcium\": 85,\n      \"phosphorus\": 188,\n      \"potassium\": 368,\n      \"iron\": 3.69,\n      \"selenium\": 3.6,\n      \"zinc\": 1.3,\n      \"manganese\": 4.131,\n      \"copper\": 0.756,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 134\n      }\n    },\n    {\n      \"id\": 1013,\n      \"name\": \"Pistachios\",\n      \"categoryId\": 1000,\n      \"energy\": 560,\n      \"fat\": 45.32,\n      \"saturatedFat\": 5.907,\n      \"monounsaturatedFat\": 23.257,\n      \"polyunsaturatedFat\": 14.38,\n      \"carbs\": 27.17,\n      \"sugar\": 7.66,\n      \"fiber\": 10.6,\n      \"protein\": 20.16,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 26,\n      \"vitaminB1\": 0.87,\n      \"vitaminB2\": 0.16,\n      \"vitaminB3\": 1.3,\n      \"vitaminB5\": 0.52,\n      \"vitaminB6\": 1.7,\n      \"vitaminB9\": 51,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 5.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.86,\n      \"vitaminK\": 0,\n      \"magnesium\": 121,\n      \"calcium\": 105,\n      \"phosphorus\": 490,\n      \"potassium\": 1025,\n      \"iron\": 3.92,\n      \"selenium\": 7,\n      \"zinc\": 2.2,\n      \"manganese\": 1.2,\n      \"copper\": 1.3,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 123\n      }\n    },\n    {\n      \"id\": 1014,\n      \"name\": \"Pecans\",\n      \"categoryId\": 1000,\n      \"energy\": 691,\n      \"fat\": 71.97,\n      \"saturatedFat\": 6.18,\n      \"monounsaturatedFat\": 40.801,\n      \"polyunsaturatedFat\": 21.614,\n      \"carbs\": 13.86,\n      \"sugar\": 3.97,\n      \"fiber\": 9.6,\n      \"protein\": 9.17,\n      \"sodium\": 0,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.66,\n      \"vitaminB2\": 0.13,\n      \"vitaminB3\": 1.167,\n      \"vitaminB5\": 0.863,\n      \"vitaminB6\": 0.21,\n      \"vitaminB9\": 22,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.4,\n      \"vitaminK\": 3.5,\n      \"magnesium\": 121,\n      \"calcium\": 70,\n      \"phosphorus\": 277,\n      \"potassium\": 410,\n      \"iron\": 2.53,\n      \"selenium\": 3.8,\n      \"zinc\": 4.53,\n      \"manganese\": 4.5,\n      \"copper\": 1.2,\n      \"choline\": 40.5,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 109\n      }\n    },\n    {\n      \"id\": 1015,\n      \"name\": \"Walnuts\",\n      \"categoryId\": 1000,\n      \"energy\": 654,\n      \"fat\": 65.21,\n      \"saturatedFat\": 6.126,\n      \"monounsaturatedFat\": 8.933,\n      \"polyunsaturatedFat\": 47.174,\n      \"carbs\": 13.71,\n      \"sugar\": 2.61,\n      \"fiber\": 6.7,\n      \"protein\": 15.23,\n      \"sodium\": 2,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.341,\n      \"vitaminB2\": 0.15,\n      \"vitaminB3\": 1.125,\n      \"vitaminB5\": 0.57,\n      \"vitaminB6\": 0.537,\n      \"vitaminB9\": 98,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.7,\n      \"vitaminK\": 2.7,\n      \"magnesium\": 158,\n      \"calcium\": 98,\n      \"phosphorus\": 346,\n      \"potassium\": 441,\n      \"iron\": 2.91,\n      \"selenium\": 4.9,\n      \"zinc\": 3.09,\n      \"manganese\": 3.414,\n      \"copper\": 1.586,\n      \"choline\": 39.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 80\n      }\n    },\n    {\n      \"id\": 1016,\n      \"name\": \"Sunflower Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 584,\n      \"fat\": 51.46,\n      \"saturatedFat\": 4.455,\n      \"monounsaturatedFat\": 18.528,\n      \"polyunsaturatedFat\": 23.137,\n      \"carbs\": 20,\n      \"sugar\": 2.62,\n      \"fiber\": 8.6,\n      \"protein\": 20.78,\n      \"sodium\": 9,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 1.48,\n      \"vitaminB2\": 0.355,\n      \"vitaminB3\": 8.335,\n      \"vitaminB5\": 1.13,\n      \"vitaminB6\": 1.345,\n      \"vitaminB9\": 227,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 35.17,\n      \"vitaminK\": 0,\n      \"magnesium\": 325,\n      \"calcium\": 78,\n      \"phosphorus\": 660,\n      \"potassium\": 645,\n      \"iron\": 5.25,\n      \"selenium\": 53,\n      \"zinc\": 5,\n      \"manganese\": 1.95,\n      \"copper\": 1.8,\n      \"choline\": 55.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 140\n      }\n    },\n    {\n      \"id\": 1017,\n      \"name\": \"Pumpkin Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 559,\n      \"fat\": 49.05,\n      \"saturatedFat\": 8.659,\n      \"monounsaturatedFat\": 16.242,\n      \"polyunsaturatedFat\": 20.976,\n      \"carbs\": 10.71,\n      \"sugar\": 1.4,\n      \"fiber\": 6,\n      \"protein\": 30.23,\n      \"sodium\": 7,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.273,\n      \"vitaminB2\": 0.153,\n      \"vitaminB3\": 4.987,\n      \"vitaminB5\": 0.75,\n      \"vitaminB6\": 0.143,\n      \"vitaminB9\": 58,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.9,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.18,\n      \"vitaminK\": 7.3,\n      \"magnesium\": 592,\n      \"calcium\": 46,\n      \"phosphorus\": 1233,\n      \"potassium\": 809,\n      \"iron\": 8.82,\n      \"selenium\": 9.4,\n      \"zinc\": 7.81,\n      \"manganese\": 4.543,\n      \"copper\": 1.343,\n      \"choline\": 63,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 129\n      }\n    },\n    {\n      \"id\": 1018,\n      \"name\": \"Chia Seeds\",\n      \"categoryId\": 1000,\n      \"energy\": 486,\n      \"fat\": 30.74,\n      \"saturatedFat\": 3.33,\n      \"monounsaturatedFat\": 2.309,\n      \"polyunsaturatedFat\": 23.665,\n      \"carbs\": 42.12,\n      \"sugar\": 0,\n      \"fiber\": 34.4,\n      \"protein\": 16.54,\n      \"sodium\": 16,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.62,\n      \"vitaminB2\": 0.17,\n      \"vitaminB3\": 8.83,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 49,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.5,\n      \"vitaminK\": 0,\n      \"magnesium\": 335,\n      \"calcium\": 631,\n      \"phosphorus\": 860,\n      \"potassium\": 407,\n      \"iron\": 7.72,\n      \"selenium\": 55.2,\n      \"zinc\": 4.58,\n      \"manganese\": 2.723,\n      \"copper\": 0.924,\n      \"choline\": 0\n    },\n    {\n      \"id\": 1019,\n      \"name\": \"Coconut Meat\",\n      \"categoryId\": 1000,\n      \"energy\": 354,\n      \"fat\": 33.49,\n      \"saturatedFat\": 29.698,\n      \"monounsaturatedFat\": 1.425,\n      \"polyunsaturatedFat\": 0.366,\n      \"carbs\": 15.23,\n      \"sugar\": 6.23,\n      \"fiber\": 9,\n      \"protein\": 3.33,\n      \"sodium\": 20,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.066,\n      \"vitaminB2\": 0.02,\n      \"vitaminB3\": 0.54,\n      \"vitaminB5\": 0.3,\n      \"vitaminB6\": 0.054,\n      \"vitaminB9\": 26,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 3.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.24,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 32,\n      \"calcium\": 14,\n      \"phosphorus\": 113,\n      \"potassium\": 356,\n      \"iron\": 2.43,\n      \"selenium\": 10.1,\n      \"zinc\": 1.1,\n      \"manganese\": 1.5,\n      \"copper\": 0.435,\n      \"choline\": 12.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 80\n      }\n    },\n    {\n      \"id\": 1020,\n      \"name\": \"Tahini\",\n      \"categoryId\": 1000,\n      \"energy\": 595,\n      \"fat\": 53.76,\n      \"saturatedFat\": 7.529,\n      \"monounsaturatedFat\": 20.302,\n      \"polyunsaturatedFat\": 23.564,\n      \"carbs\": 21.19,\n      \"sugar\": 0.49,\n      \"fiber\": 9.3,\n      \"protein\": 17,\n      \"sodium\": 115,\n      \"cholesterol\": 0,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 1.22,\n      \"vitaminB2\": 0.473,\n      \"vitaminB3\": 5.45,\n      \"vitaminB5\": 0.693,\n      \"vitaminB6\": 0.149,\n      \"vitaminB9\": 98,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.25,\n      \"vitaminK\": 0,\n      \"magnesium\": 95,\n      \"calcium\": 426,\n      \"phosphorus\": 732,\n      \"potassium\": 414,\n      \"iron\": 8.95,\n      \"selenium\": 34.4,\n      \"zinc\": 4.62,\n      \"manganese\": 1.456,\n      \"copper\": 1.61,\n      \"choline\": 25.8,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 15\n      }\n    },\n    {\n      \"id\": 1021,\n      \"name\": \"Sunflower Butter\",\n      \"categoryId\": 1000,\n      \"energy\": 617,\n      \"fat\": 55.2,\n      \"saturatedFat\": 4.678,\n      \"monounsaturatedFat\": 39.025,\n      \"polyunsaturatedFat\": 9.805,\n      \"carbs\": 23.32,\n      \"sugar\": 10.54,\n      \"fiber\": 5.7,\n      \"protein\": 17.28,\n      \"sodium\": 3,\n      \"cholesterol\": 0, \n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.053,\n      \"vitaminB2\": 0.163,\n      \"vitaminB3\": 6.747,\n      \"vitaminB5\": 1.167,\n      \"vitaminB6\": 0.55,\n      \"vitaminB9\": 237,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 2.7,\n      \"vitaminD\": 0,\n      \"vitaminE\": 22.89,\n      \"vitaminK\": 0,\n      \"magnesium\": 311,\n      \"calcium\": 64,\n      \"phosphorus\": 666,\n      \"potassium\": 576,\n      \"iron\": 4.12,\n      \"selenium\": 104.4,\n      \"zinc\": 4.89,\n      \"manganese\": 2.073,\n      \"copper\": 1.597,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 16\n      }\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/pork.json",
    "content": "[\n  {\n    \"id\": 301,\n    \"name\": \"84% Lean Ground Pork\",\n    \"categoryId\": 300,\n    \"energy\": 218,\n    \"fat\": 16,\n    \"saturatedFat\": 4.93,\n    \"monounsaturatedFat\": 6.68,\n    \"polyunsaturatedFat\": 2.05,\n    \"carbs\": 0.44,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 17.99,\n    \"sodium\": 68,\n    \"cholesterol\": 68,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.332,\n    \"vitaminB2\": 0.338,\n    \"vitaminB3\": 6.416,\n    \"vitaminB5\": 0.639,\n    \"vitaminB6\": 0.551,\n    \"vitaminB9\": 2,\n    \"vitaminB12\": 0.73,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0.45,\n    \"vitaminK\": 0,\n    \"magnesium\": 16,\n    \"calcium\": 15,\n    \"phosphorus\": 161,\n    \"potassium\": 244,\n    \"iron\": 0.88,\n    \"selenium\": 30.2,\n    \"zinc\": 1.91,\n    \"manganese\": 0.01,\n    \"copper\": 0.032,\n    \"choline\": 61.5\n  },\n  {\n    \"id\": 302,\n    \"name\": \"96% Lean Ground Pork\",\n    \"categoryId\": 300,\n    \"energy\": 121,\n    \"fat\": 4,\n    \"saturatedFat\": 1.42,\n    \"monounsaturatedFat\": 1.89,\n    \"polyunsaturatedFat\": 0.66,\n    \"carbs\": 0.21,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 21.1,\n    \"sodium\": 67,\n    \"cholesterol\": 59,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.414,\n    \"vitaminB2\": 0.368,\n    \"vitaminB3\": 7.914,\n    \"vitaminB5\": 0.646,\n    \"vitaminB6\": 0.668,\n    \"vitaminB9\": 2,\n    \"vitaminB12\": 0.64,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.29,\n    \"vitaminK\": 0,\n    \"magnesium\": 19,\n    \"calcium\": 15,\n    \"phosphorus\": 190,\n    \"potassium\": 310,\n    \"iron\": 0.86,\n    \"selenium\": 34.8,\n    \"zinc\": 1.93,\n    \"manganese\": 0.01,\n    \"copper\": 0.033,\n    \"choline\": 71.7\n  },\n  {\n    \"id\": 303,\n    \"name\": \"Pork Tenderloin (fat trimmed)\",\n    \"categoryId\": 300,\n    \"energy\": 109,\n    \"fat\": 2.17,\n    \"saturatedFat\": 0.698,\n    \"monounsaturatedFat\": 0.792,\n    \"polyunsaturatedFat\": 0.367,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.95,\n    \"sodium\": 53,\n    \"cholesterol\": 65,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.998,\n    \"vitaminB2\": 0.342,\n    \"vitaminB3\": 6.684,\n    \"vitaminB5\": 0.846,\n    \"vitaminB6\": 0.777,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0.51,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.2,\n    \"vitaminE\": 0.22,\n    \"vitaminK\": 0,\n    \"magnesium\": 27,\n    \"calcium\": 5,\n    \"phosphorus\": 247,\n    \"potassium\": 399,\n    \"iron\": 0.98,\n    \"selenium\": 30.8,\n    \"zinc\": 1.89,\n    \"manganese\": 0.015,\n    \"copper\": 0.09,\n    \"choline\": 80.8\n  },\n  {\n    \"id\": 304,\n    \"name\": \"Canadian Bacon\",\n    \"categoryId\": 300,\n    \"energy\": 110,\n    \"fat\": 2.62,\n    \"saturatedFat\": 0.9,\n    \"monounsaturatedFat\": 1.09,\n    \"polyunsaturatedFat\": 0.467,\n    \"carbs\": 1.34,\n    \"sugar\": 0.9,\n    \"fiber\": 0,\n    \"protein\": 20.31,\n    \"sodium\": 751,\n    \"cholesterol\": 48,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.511,\n    \"vitaminB2\": 0.141,\n    \"vitaminB3\": 7.227,\n    \"vitaminB5\": 0.61,\n    \"vitaminB6\": 0.241,\n    \"vitaminB9\": 4,\n    \"vitaminB12\": 0.37,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.22,\n    \"vitaminK\": 0,\n    \"magnesium\": 20,\n    \"calcium\": 6,\n    \"phosphorus\": 240,\n    \"potassium\": 683,\n    \"iron\": 0.44,\n    \"selenium\": 37.1,\n    \"zinc\": 1.23,\n    \"manganese\": 0.015,\n    \"copper\": 0.053,\n    \"choline\": 76.1\n  },\n  {\n    \"id\": 305,\n    \"name\": \"Sliced Ham\",\n    \"categoryId\": 300,\n    \"energy\": 107,\n    \"fat\": 4.04,\n    \"saturatedFat\": 1.227,\n    \"monounsaturatedFat\": 1.618,\n    \"polyunsaturatedFat\": 0.626,\n    \"carbs\": 0.7,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 16.85,\n    \"sodium\": 945,\n    \"cholesterol\": 41,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.336,\n    \"vitaminB2\": 0.266,\n    \"vitaminB3\": 5.697,\n    \"vitaminB5\": 0.697,\n    \"vitaminB6\": 0.394,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0.36,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.6,\n    \"vitaminE\": 0.29,\n    \"vitaminK\": 0,\n    \"magnesium\": 19,\n    \"calcium\": 5,\n    \"phosphorus\": 252,\n    \"potassium\": 463,\n    \"iron\": 0.59,\n    \"selenium\": 31.6,\n    \"zinc\": 1.51,\n    \"manganese\": 0.014,\n    \"copper\": 0.05,\n    \"choline\": 62.4\n  },\n  {\n    \"id\": 306,\n    \"name\": \"Prosciutto\",\n    \"categoryId\": 300,\n    \"energy\": 195,\n    \"fat\": 8.32,\n    \"saturatedFat\": 2.78,\n    \"monounsaturatedFat\": 3.821,\n    \"polyunsaturatedFat\": 0.97,\n    \"carbs\": 0.3,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 27.8,\n    \"sodium\": 2695,\n    \"cholesterol\": 70,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.567,\n    \"vitaminB2\": 0.242,\n    \"vitaminB3\": 3.881,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.42,\n    \"vitaminB9\": 5,\n    \"vitaminB12\": 0.88,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.9,\n    \"vitaminE\": 0.28,\n    \"vitaminK\": 0,\n    \"magnesium\": 25,\n    \"calcium\": 10,\n    \"phosphorus\": 318,\n    \"potassium\": 510,\n    \"iron\": 1.11,\n    \"selenium\": 25.8,\n    \"zinc\": 2.81,\n    \"manganese\": 0,\n    \"copper\": 0.108,\n    \"choline\": 105.5\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/poultry.json",
    "content": "[\n  {\n    \"id\": 101,\n    \"name\": \"Skinless Chicken Breast\",\n    \"categoryId\": 100,\n    \"energy\": 108,\n    \"fat\": 3,\n    \"saturatedFat\": 0.545,\n    \"monounsaturatedFat\": 0.673,\n    \"polyunsaturatedFat\": 0.384,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.32,\n    \"sodium\": 173,\n    \"cholesterol\": 64,\n    \"vitaminA\": 11,\n    \"vitaminB1\": 0.068,\n    \"vitaminB2\": 0.127,\n    \"vitaminB3\": 7.583,\n    \"vitaminB5\": 1.23,\n    \"vitaminB6\": 0.761,\n    \"vitaminB9\": 8,\n    \"vitaminB12\": 0.19,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.19,\n    \"vitaminK\": 0,\n    \"magnesium\": 25,\n    \"calcium\": 5,\n    \"phosphorus\": 198,\n    \"potassium\": 332,\n    \"iron\": 0.34,\n    \"selenium\": 26.4,\n    \"zinc\": 0.63,\n    \"manganese\": 0.011,\n    \"copper\": 0.029,\n    \"choline\": 74.2\n  },\n  {\n    \"id\": 102,\n    \"name\": \"Skinless Turkey Breast\",\n    \"categoryId\": 100,\n    \"energy\": 111,\n    \"fat\": 2.53,\n    \"saturatedFat\": 0.6,\n    \"monounsaturatedFat\": 3.71,\n    \"polyunsaturatedFat\": 2.903,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 21.99,\n    \"sodium\": 124,\n    \"cholesterol\": 60,\n    \"vitaminA\": 5,\n    \"vitaminB1\": 0.049,\n    \"vitaminB2\": 0.155,\n    \"vitaminB3\": 10,\n    \"vitaminB5\": 0.95,\n    \"vitaminB6\": 0.84,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 0.33,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.2,\n    \"vitaminE\": 0.1,\n    \"vitaminK\": 0,\n    \"magnesium\": 25,\n    \"calcium\": 8,\n    \"phosphorus\": 181,\n    \"potassium\": 237,\n    \"iron\": 0.41,\n    \"selenium\": 22.3,\n    \"zinc\": 1.1,\n    \"manganese\": 0.005,\n    \"copper\": 0.043,\n    \"choline\": 64.7\n  },\n  {\n    \"id\": 103,\n    \"name\": \"Skinless Chicken Thigh\",\n    \"categoryId\": 100,\n    \"energy\": 110,\n    \"fat\": 3.69,\n    \"saturatedFat\": 0.899,\n    \"monounsaturatedFat\": 1.222,\n    \"polyunsaturatedFat\": 0.767,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 19.11,\n    \"sodium\": 156,\n    \"cholesterol\": 87,\n    \"vitaminA\": 6,\n    \"vitaminB1\": 0.087,\n    \"vitaminB2\": 0.23,\n    \"vitaminB3\": 5.3,\n    \"vitaminB5\": 1.25,\n    \"vitaminB6\": 0.433,\n    \"vitaminB9\": 3,\n    \"vitaminB12\": 0.56,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.26,\n    \"vitaminK\": 0,\n    \"magnesium\": 21,\n    \"calcium\": 8,\n    \"phosphorus\": 175,\n    \"potassium\": 234,\n    \"iron\": 0.6,\n    \"selenium\": 20.9,\n    \"zinc\": 1.53,\n    \"manganese\": 0.009,\n    \"copper\": 0.053,\n    \"choline\": 75.1\n  },\n  {\n    \"id\": 104,\n    \"name\": \"99% Lean Ground Turkey\",\n    \"categoryId\": 100,\n    \"energy\": 107,\n    \"fat\": 1.34,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 23.21,\n    \"sodium\": 62,\n    \"cholesterol\": 49,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 27,\n    \"phosphorus\": 0,\n    \"potassium\": 339,\n    \"iron\": 0.36,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0\n  },\n  {\n    \"id\": 105,\n    \"name\": \"Skinless Turkey Thigh\",\n    \"categoryId\": 100,\n    \"energy\": 116,\n    \"fat\": 3.69,\n    \"saturatedFat\": 0.782,\n    \"monounsaturatedFat\": 0.749,\n    \"polyunsaturatedFat\": 0.722,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 20.6,\n    \"sodium\": 75,\n    \"cholesterol\": 78,\n    \"vitaminA\": 19,\n    \"vitaminB1\": 0.059,\n    \"vitaminB2\": 0.307,\n    \"vitaminB3\": 6.183,\n    \"vitaminB5\": 1.3,\n    \"vitaminB6\": 0.482,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 2.17,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.5,\n    \"vitaminE\": 0.18,\n    \"vitaminK\": 0,\n    \"magnesium\": 22,\n    \"calcium\": 4,\n    \"phosphorus\": 177,\n    \"potassium\": 269,\n    \"iron\": 1.42,\n    \"selenium\": 21.5,\n    \"zinc\": 2.95,\n    \"manganese\": 0.006,\n    \"copper\": 0.083,\n    \"choline\": 75.9\n  },\n  {\n    \"id\": 106,\n    \"name\": \"93% Lean Ground Turkey\",\n    \"categoryId\": 100,\n    \"energy\": 150,\n    \"fat\": 8.34,\n    \"saturatedFat\": 2.17,\n    \"monounsaturatedFat\": 2.843,\n    \"polyunsaturatedFat\": 2.537,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 18.73,\n    \"sodium\": 69,\n    \"cholesterol\": 74,\n    \"vitaminA\": 22,\n    \"vitaminB1\": 0.067,\n    \"vitaminB2\": 0.185,\n    \"vitaminB3\": 5.417,\n    \"vitaminB5\": 1,\n    \"vitaminB6\": 0.35,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 1.2,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0.11,\n    \"vitaminK\": 0,\n    \"magnesium\": 21,\n    \"calcium\": 21,\n    \"phosphorus\": 193,\n    \"potassium\": 213,\n    \"iron\": 1.17,\n    \"selenium\": 19,\n    \"zinc\": 2.53,\n    \"manganese\": 0.008,\n    \"copper\": 0.107,\n    \"choline\": 53\n  },\n  {\n    \"id\": 107,\n    \"name\": \"Sliced Chicken Breast\",\n    \"categoryId\": 100,\n    \"energy\": 98,\n    \"fat\": 1.86,\n    \"saturatedFat\": 0.564,\n    \"monounsaturatedFat\": 0.74,\n    \"polyunsaturatedFat\": 0.452,\n    \"carbs\": 2.92,\n    \"sugar\": 0.75,\n    \"fiber\": 0,\n    \"protein\": 17.4,\n    \"sodium\": 1032,\n    \"cholesterol\": 51,\n    \"vitaminA\": 2,\n    \"vitaminB1\": 0.048,\n    \"vitaminB2\": 0.071,\n    \"vitaminB3\": 9.055,\n    \"vitaminB5\": 0.976,\n    \"vitaminB6\": 0.445,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 0.14,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.1,\n    \"vitaminE\": 0.32,\n    \"vitaminK\": 0,\n    \"magnesium\": 26,\n    \"calcium\": 11,\n    \"phosphorus\": 257,\n    \"potassium\": 360,\n    \"iron\": 0.39,\n    \"selenium\": 13.2,\n    \"zinc\": 0.51,\n    \"manganese\": 0.018,\n    \"copper\": 0.02,\n    \"choline\": 44.2\n  },\n  {\n    \"id\": 108,\n    \"name\": \"85% Lean Ground Turkey\",\n    \"categoryId\": 100,\n    \"energy\": 180,\n    \"fat\": 12.54,\n    \"saturatedFat\": 3.414,\n    \"monounsaturatedFat\": 4.551,\n    \"polyunsaturatedFat\": 3.485,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 16.9,\n    \"sodium\": 54,\n    \"cholesterol\": 78,\n    \"vitaminA\": 30,\n    \"vitaminB1\": 0.067,\n    \"vitaminB2\": 0.177,\n    \"vitaminB3\": 5.075,\n    \"vitaminB5\": 1.1,\n    \"vitaminB6\": 0.485,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 1.3,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0.08,\n    \"vitaminK\": 0,\n    \"magnesium\": 19,\n    \"calcium\": 33,\n    \"phosphorus\": 179,\n    \"potassium\": 202,\n    \"iron\": 1.32,\n    \"selenium\": 24.6,\n    \"zinc\": 2.75,\n    \"manganese\": 0.009,\n    \"copper\": 0.123,\n    \"choline\": 51.6\n  },\n  {\n    \"id\": 109,\n    \"name\": \"Andouille Chicken Sausage\",\n    \"categoryId\": 100,\n    \"energy\": 161,\n    \"fat\": 10.71,\n    \"saturatedFat\": 2.68,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 3.57,\n    \"sugar\": 1.79,\n    \"fiber\": 0,\n    \"protein\": 14.29,\n    \"sodium\": 714,\n    \"cholesterol\": 71,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 0,\n    \"phosphorus\": 0,\n    \"potassium\": 0,\n    \"iron\": 1.29,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0\n  },\n  {\n    \"id\": 110,\n    \"name\": \"Sliced Turkey Breast\",\n    \"categoryId\": 100,\n    \"energy\": 106,\n    \"fat\": 3.77,\n    \"saturatedFat\": 0.906,\n    \"monounsaturatedFat\": 1.145,\n    \"polyunsaturatedFat\": 1.024,\n    \"carbs\": 2.2,\n    \"sugar\": 0.91,\n    \"fiber\": 0,\n    \"protein\": 14.81,\n    \"sodium\": 898,\n    \"cholesterol\": 49,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.038,\n    \"vitaminB2\": 0.145,\n    \"vitaminB3\": 7.15,\n    \"vitaminB5\": 0.32,\n    \"vitaminB6\": 0.41,\n    \"vitaminB9\": 4,\n    \"vitaminB12\": 0.37,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.2,\n    \"vitaminE\": 0.13,\n    \"vitaminK\": 0,\n    \"magnesium\": 19,\n    \"calcium\": 14,\n    \"phosphorus\": 249,\n    \"potassium\": 371,\n    \"iron\": 0.42,\n    \"selenium\": 13,\n    \"zinc\": 0.94,\n    \"manganese\": 0.016,\n    \"copper\": 0.024,\n    \"choline\": 30.1\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/saucesAndSoups.json",
    "content": "[\n    {\n      \"id\": 4001,\n      \"name\": \"Sriracha\",\n      \"categoryId\": 4000,\n      \"energy\": 93,\n      \"fat\": 0.93,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 19.16,\n      \"sugar\": 15.11,\n      \"fiber\": 2.2,\n      \"protein\": 1.93,\n      \"sodium\": 2124,\n      \"cholesterol\": 0,\n      \"vitaminA\": 129,\n      \"vitaminB1\": 0.077,\n      \"vitaminB2\": 0.222,\n      \"vitaminB3\": 1.248,\n      \"vitaminB5\": 0.38,\n      \"vitaminB6\": 0.455,\n      \"vitaminB9\": 22,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 26.9,\n      \"vitaminD\": 0,\n      \"vitaminE\": 4.8,\n      \"vitaminK\": 10.9,\n      \"magnesium\": 16,\n      \"calcium\": 18,\n      \"phosphorus\": 46,\n      \"potassium\": 321,\n      \"iron\": 1.64,\n      \"selenium\": 0.4,\n      \"zinc\": 0.24,\n      \"manganese\": 0.146,\n      \"copper\": 0.06,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 6.5\n      }\n    },\n    {\n      \"id\": 4002,\n      \"name\": \"Salsa\",\n      \"categoryId\": 4000,\n      \"energy\": 29,\n      \"fat\": 0.17,\n      \"saturatedFat\": 0.021,\n      \"monounsaturatedFat\": 0.018,\n      \"polyunsaturatedFat\": 0.078,\n      \"carbs\": 6.64,\n      \"sugar\": 4.01,\n      \"fiber\": 1.9,\n      \"protein\": 1.52,\n      \"sodium\": 711,\n      \"cholesterol\": 0,\n      \"vitaminA\": 23,\n      \"vitaminB1\": 0.033,\n      \"vitaminB2\": 0.032,\n      \"vitaminB3\": 1.091,\n      \"vitaminB5\": 0.199,\n      \"vitaminB6\": 0.172,\n      \"vitaminB9\": 4,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 1.9,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.28,\n      \"vitaminK\": 4.3,\n      \"magnesium\": 15,\n      \"calcium\": 30,\n      \"phosphorus\": 33,\n      \"potassium\": 275,\n      \"iron\": 0.42,\n      \"selenium\": 0.9,\n      \"zinc\": 0.18,\n      \"manganese\": 0.112,\n      \"copper\": 0.066,\n      \"choline\": 12.8,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 36\n      }\n    },\n    {\n      \"id\": 4003,\n      \"name\": \"Teriyaki Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 89,\n      \"fat\": 0.02,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 15.58,\n      \"sugar\": 14.1,\n      \"fiber\": 0.1,\n      \"protein\": 5.93,\n      \"sodium\": 1778,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.03,\n      \"vitaminB2\": 0.07,\n      \"vitaminB3\": 1.27,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.1,\n      \"vitaminB9\": 8,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 61,\n      \"calcium\": 25,\n      \"phosphorus\": 154,\n      \"potassium\": 225,\n      \"iron\": 1.7,\n      \"selenium\": 0.8,\n      \"zinc\": 0.1,\n      \"manganese\": 0,\n      \"copper\": 0.1,\n      \"choline\": 19.5,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 36\n      }\n    },\n    {\n      \"id\": 4004,\n      \"name\": \"Honey Dijon Mustard\",\n      \"categoryId\": 4000,\n      \"energy\": 200,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 20,\n      \"sugar\": 20,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 1300,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0\n    },\n    {\n      \"id\": 4005,\n      \"name\": \"Coconut Aminos\",\n      \"categoryId\": 4000,\n      \"energy\": 200,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 46.67,\n      \"sugar\": 40,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 3200,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 10,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0\n    },\n    {\n      \"id\": 4006,\n      \"name\": \"Barbecue Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 172,\n      \"fat\": 0.63,\n      \"saturatedFat\": 0.045,\n      \"monounsaturatedFat\": 0.082,\n      \"polyunsaturatedFat\": 0.101,\n      \"carbs\": 40.77,\n      \"sugar\": 33.24,\n      \"fiber\": 0.9,\n      \"protein\": 0.82,\n      \"sodium\": 1027,\n      \"cholesterol\": 0,\n      \"vitaminA\": 11,\n      \"vitaminB1\": 0.023,\n      \"vitaminB2\": 0.056,\n      \"vitaminB3\": 0.597,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.075,\n      \"vitaminB9\": 2,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.6,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.8,\n      \"vitaminK\": 1.8,\n      \"magnesium\": 13,\n      \"calcium\": 33,\n      \"phosphorus\": 20,\n      \"potassium\": 232,\n      \"iron\": 0.64,\n      \"selenium\": 1.3,\n      \"zinc\": 0.17,\n      \"manganese\": 0,\n      \"copper\": 0.072,\n      \"choline\": 7.1\n    },\n    {\n      \"id\": 4007,\n      \"name\": \"Ketchup\",\n      \"categoryId\": 4000,\n      \"energy\": 101,\n      \"fat\": 0.1,\n      \"saturatedFat\": 0.014,\n      \"monounsaturatedFat\": 0.015,\n      \"polyunsaturatedFat\": 0.041,\n      \"carbs\": 27.4,\n      \"sugar\": 21.27,\n      \"fiber\": 0.3,\n      \"protein\": 1.04,\n      \"sodium\": 907,\n      \"cholesterol\": 0,\n      \"vitaminA\": 26,\n      \"vitaminB1\": 0.011,\n      \"vitaminB2\": 0.166,\n      \"vitaminB3\": 1.434,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.158,\n      \"vitaminB9\": 9,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.1,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.46,\n      \"vitaminK\": 3,\n      \"magnesium\": 13,\n      \"calcium\": 15,\n      \"phosphorus\": 26,\n      \"potassium\": 281,\n      \"iron\": 0.35,\n      \"selenium\": 0.7,\n      \"zinc\": 0.17,\n      \"manganese\": 0,\n      \"copper\": 0.085,\n      \"choline\": 12.5\n    },\n    {\n      \"id\": 4008,\n      \"name\": \"A1 Steak Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 95,\n      \"fat\": 0.23,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 22.04,\n      \"sugar\": 9.82,\n      \"fiber\": 1.5,\n      \"protein\": 1.25,\n      \"sodium\": 1647,\n      \"cholesterol\": 0,\n      \"vitaminA\": 15,\n      \"vitaminB1\": 0.034,\n      \"vitaminB2\": 0.054,\n      \"vitaminB3\": 0.913,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.105,\n      \"vitaminB9\": 8,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 6.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.16,\n      \"vitaminK\": 2.2,\n      \"magnesium\": 17,\n      \"calcium\": 19,\n      \"phosphorus\": 33,\n      \"potassium\": 312,\n      \"iron\": 1.37,\n      \"selenium\": 0.8,\n      \"zinc\": 0.34,\n      \"manganese\": 0,\n      \"copper\": 0.189,\n      \"choline\": 11.5\n    },\n    {\n      \"id\": 4009,\n      \"name\": \"Mustard\",\n      \"categoryId\": 4000,\n      \"energy\": 61,\n      \"fat\": 3.38,\n      \"saturatedFat\": 0.252,\n      \"monounsaturatedFat\": 2.59,\n      \"polyunsaturatedFat\": 0.903,\n      \"carbs\": 5.3,\n      \"sugar\": 1.42,\n      \"fiber\": 4.3,\n      \"protein\": 4.25,\n      \"sodium\": 1100,\n      \"cholesterol\": 0,\n      \"vitaminA\": 4,\n      \"vitaminB1\": 0.189,\n      \"vitaminB2\": 0.066,\n      \"vitaminB3\": 0.561,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.069,\n      \"vitaminB9\": 7,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.4,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.35,\n      \"vitaminK\": 1.5,\n      \"magnesium\": 48,\n      \"calcium\": 63,\n      \"phosphorus\": 108,\n      \"potassium\": 150,\n      \"iron\": 1.59,\n      \"selenium\": 34,\n      \"zinc\": 0.64,\n      \"manganese\": 0,\n      \"copper\": 0.074,\n      \"choline\": 22.4\n    },\n    {\n      \"id\": 4010,\n      \"name\": \"Soy Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 53,\n      \"fat\": 0.57,\n      \"saturatedFat\": 0.073,\n      \"monounsaturatedFat\": 0.088,\n      \"polyunsaturatedFat\": 0.263,\n      \"carbs\": 4.93,\n      \"sugar\": 0.4,\n      \"fiber\": 0.8,\n      \"protein\": 8.14,\n      \"sodium\": 5493,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.033,\n      \"vitaminB2\": 0.165,\n      \"vitaminB3\": 2.196,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.148,\n      \"vitaminB9\": 14,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 74,\n      \"calcium\": 33,\n      \"phosphorus\": 166,\n      \"potassium\": 435,\n      \"iron\": 1.45,\n      \"selenium\": 0.5,\n      \"zinc\": 0.87,\n      \"manganese\": 0,\n      \"copper\": 0.043,\n      \"choline\": 18.3\n    },\n    {\n      \"id\": 4011,\n      \"name\": \"Worcestershire Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 77,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 19.17,\n      \"sugar\": 10.03,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 1300,\n      \"cholesterol\": 0,\n      \"vitaminA\": 5,\n      \"vitaminB1\": 0.07,\n      \"vitaminB2\": 0.13,\n      \"vitaminB3\": 0.7,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 8,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 13,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.08,\n      \"vitaminK\": 1,\n      \"magnesium\": 13,\n      \"calcium\": 107,\n      \"phosphorus\": 60,\n      \"potassium\": 800,\n      \"iron\": 5.3,\n      \"selenium\": 0.5,\n      \"zinc\": 0.19,\n      \"manganese\": 0,\n      \"copper\": 0.2,\n      \"choline\": 2.7\n    },\n    {\n      \"id\": 4012,\n      \"name\": \"Hot Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 12,\n      \"fat\": 0.76,\n      \"saturatedFat\": 0.106,\n      \"monounsaturatedFat\": 0.061,\n      \"polyunsaturatedFat\": 0.401,\n      \"carbs\": 0.8,\n      \"sugar\": 0.13,\n      \"fiber\": 0.6,\n      \"protein\": 1.29,\n      \"sodium\": 633,\n      \"cholesterol\": 0,\n      \"vitaminA\": 82,\n      \"vitaminB1\": 0.032,\n      \"vitaminB2\": 0.084,\n      \"vitaminB3\": 0.178,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.154,\n      \"vitaminB9\": 1,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 4.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.01,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 12,\n      \"calcium\": 12,\n      \"phosphorus\": 23,\n      \"potassium\": 128,\n      \"iron\": 1.16,\n      \"selenium\": 0.5,\n      \"zinc\": 0.16,\n      \"manganese\": 0,\n      \"copper\": 0.075,\n      \"choline\": 0\n    },\n    {\n      \"id\": 4013,\n      \"name\": \"Fish Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 35,\n      \"fat\": 0.01,\n      \"saturatedFat\": 0.003,\n      \"monounsaturatedFat\": 0.002,\n      \"polyunsaturatedFat\": 0.003,\n      \"carbs\": 3.64,\n      \"sugar\": 3.64,\n      \"fiber\": 0,\n      \"protein\": 5.06,\n      \"sodium\": 7851,\n      \"cholesterol\": 0,\n      \"vitaminA\": 4,\n      \"vitaminB1\": 0.012,\n      \"vitaminB2\": 0.057,\n      \"vitaminB3\": 2.313,\n      \"vitaminB5\": 0.118,\n      \"vitaminB6\": 0.396,\n      \"vitaminB9\": 51,\n      \"vitaminB12\": 0.48,\n      \"vitaminC\": 0.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 175,\n      \"calcium\": 43,\n      \"phosphorus\": 7,\n      \"potassium\": 288,\n      \"iron\": 0.78,\n      \"selenium\": 9.1,\n      \"zinc\": 0.2,\n      \"manganese\": 0.233,\n      \"copper\": 0.05,\n      \"choline\": 13.2,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 18\n      }\n    },\n    {\n      \"id\": 4014,\n      \"name\": \"Pico de Gallo\",\n      \"categoryId\": 4000,\n      \"energy\": 17,\n      \"fat\": 0.14,\n      \"saturatedFat\": 0.023,\n      \"monounsaturatedFat\": 0.02,\n      \"polyunsaturatedFat\": 0.057,\n      \"carbs\": 3.7,\n      \"sugar\": 2.13,\n      \"fiber\": 1.1,\n      \"protein\": 0.71,\n      \"sodium\": 443,\n      \"cholesterol\": 0,\n      \"vitaminA\": 25,\n      \"vitaminB1\": 0.028,\n      \"vitaminB2\": 0.02,\n      \"vitaminB3\": 0.407,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.091,\n      \"vitaminB9\": 12,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 10.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.32,\n      \"vitaminK\": 6.9,\n      \"magnesium\": 9,\n      \"calcium\": 11,\n      \"phosphorus\": 19,\n      \"potassium\": 157,\n      \"iron\": 0.23,\n      \"selenium\": 0.1,\n      \"zinc\": 0.13,\n      \"manganese\": 0,\n      \"copper\": 0.047,\n      \"choline\": 4.7\n    },\n    {\n      \"id\": 4015,\n      \"name\": \"Chicken Broth\",\n      \"categoryId\": 4000,\n      \"energy\": 6,\n      \"fat\": 0.21,\n      \"saturatedFat\": 0.013,\n      \"monounsaturatedFat\": 0.019,\n      \"polyunsaturatedFat\": 0.009,\n      \"carbs\": 0.44,\n      \"sugar\": 0.43,\n      \"fiber\": 0,\n      \"protein\": 0.64,\n      \"sodium\": 371,\n      \"cholesterol\": 2,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.021,\n      \"vitaminB2\": 0.059,\n      \"vitaminB3\": 0.219,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0.02,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.04,\n      \"vitaminK\": 0,\n      \"magnesium\": 1,\n      \"calcium\": 4,\n      \"phosphorus\": 4,\n      \"potassium\": 18,\n      \"iron\": 0.07,\n      \"selenium\": 0.4,\n      \"zinc\": 0.07,\n      \"manganese\": 0.015,\n      \"copper\": 0.015,\n      \"choline\": 1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 249\n      }\n    },\n    {\n      \"id\": 4016,\n      \"name\": \"Pizza Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 54,\n      \"fat\": 1.15,\n      \"saturatedFat\": 0.46,\n      \"monounsaturatedFat\": 0.461,\n      \"polyunsaturatedFat\": 0.099,\n      \"carbs\": 8.66,\n      \"sugar\": 3.78,\n      \"fiber\": 2,\n      \"protein\": 2.18,\n      \"sodium\": 348,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.061,\n      \"vitaminB2\": 0.053,\n      \"vitaminB3\": 1.421,\n      \"vitaminB5\": 0.374,\n      \"vitaminB6\": 0.136,\n      \"vitaminB9\": 10,\n      \"vitaminB12\": 0.02,\n      \"vitaminC\": 11.3,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 21,\n      \"calcium\": 54,\n      \"phosphorus\": 50,\n      \"potassium\": 354,\n      \"iron\": 0.9,\n      \"selenium\": 0,\n      \"zinc\": 0.25,\n      \"manganese\": 0.221,\n      \"copper\": 0.137,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 63\n      }\n    },\n    {\n      \"id\": 4017,\n      \"name\": \"Pasta Sauce\",\n      \"categoryId\": 4000,\n      \"energy\": 50,\n      \"fat\": 1.61,\n      \"saturatedFat\": 0.218,\n      \"monounsaturatedFat\": 0.298,\n      \"polyunsaturatedFat\": 0.673,\n      \"carbs\": 7.43,\n      \"sugar\": 4.91,\n      \"fiber\": 1.8,\n      \"protein\": 1.39,\n      \"sodium\": 437,\n      \"cholesterol\": 2,\n      \"vitaminA\": 31,\n      \"vitaminB1\": 0.024,\n      \"vitaminB2\": 0.061,\n      \"vitaminB3\": 3.917,\n      \"vitaminB5\": 0.076,\n      \"vitaminB6\": 0.173,\n      \"vitaminB9\": 13,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.4,\n      \"vitaminK\": 13.9,\n      \"magnesium\": 18,\n      \"calcium\": 26,\n      \"phosphorus\": 34,\n      \"potassium\": 320,\n      \"iron\": 0.73,\n      \"selenium\": 1.4,\n      \"zinc\": 0.2,\n      \"manganese\": 0.127,\n      \"copper\": 0.082,\n      \"choline\": 13.7,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 132\n      }\n    },\n    {\n      \"id\": 4018,\n      \"name\": \"Chicken Stock\",\n      \"categoryId\": 4000,\n      \"energy\": 36,\n      \"fat\": 1.2,\n      \"saturatedFat\": 0.321,\n      \"monounsaturatedFat\": 0.582,\n      \"polyunsaturatedFat\": 0.213,\n      \"carbs\": 3.53,\n      \"sugar\": 1.58,\n      \"fiber\": 0,\n      \"protein\": 2.52,\n      \"sodium\": 143,\n      \"cholesterol\": 3,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.035,\n      \"vitaminB2\": 0.085,\n      \"vitaminB3\": 1.584,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.061,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.2,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.03,\n      \"vitaminK\": 0.2,\n      \"magnesium\": 4,\n      \"calcium\": 3,\n      \"phosphorus\": 27,\n      \"potassium\": 105,\n      \"iron\": 0.21,\n      \"selenium\": 2.2,\n      \"zinc\": 0.14,\n      \"manganese\": 0,\n      \"copper\": 0.054,\n      \"choline\": 9.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 240\n      }\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/spicesAndHerbs.json",
    "content": "[\n  {\n    \"id\": 5001,\n    \"name\": \"Salt\",\n    \"categoryId\": 5000,\n    \"energy\": 0,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 0,\n    \"sodium\": 38758,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 1,\n    \"calcium\": 24,\n    \"phosphorus\": 0,\n    \"potassium\": 8,\n    \"iron\": 0.33,\n    \"selenium\": 0.1,\n    \"zinc\": 0.1,\n    \"manganese\": 0.1,\n    \"copper\": 0.03,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 292\n    }\n  },\n  {\n    \"id\": 5002,\n    \"name\": \"Cinnamon\",\n    \"categoryId\": 5000,\n    \"energy\": 247,\n    \"fat\": 1.24,\n    \"saturatedFat\": 0.345,\n    \"monounsaturatedFat\": 0.246,\n    \"polyunsaturatedFat\": 0.068,\n    \"carbs\": 80.59,\n    \"sugar\": 2.17,\n    \"fiber\": 53.1,\n    \"protein\": 3.99,\n    \"sodium\": 10,\n    \"cholesterol\": 0,\n    \"vitaminA\": 15,\n    \"vitaminB1\": 0.022,\n    \"vitaminB2\": 0.041,\n    \"vitaminB3\": 1.332,\n    \"vitaminB5\": 0.358,\n    \"vitaminB6\": 0.158,\n    \"vitaminB9\": 6,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 3.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 2.32,\n    \"vitaminK\": 31.2,\n    \"magnesium\": 60,\n    \"calcium\": 1002,\n    \"phosphorus\": 64,\n    \"potassium\": 431,\n    \"iron\": 8.32,\n    \"selenium\": 3.1,\n    \"zinc\": 1.83,\n    \"manganese\": 17.466,\n    \"copper\": 0.339,\n    \"choline\": 11,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 2.6\n    }\n  },\n  {\n    \"id\": 5003,\n    \"name\": \"Vanilla Extract\",\n    \"categoryId\": 5000,\n    \"energy\": 288,\n    \"fat\": 0.06,\n    \"saturatedFat\": 0.01,\n    \"monounsaturatedFat\": 0.01,\n    \"polyunsaturatedFat\": 0.004,\n    \"carbs\": 12.65,\n    \"sugar\": 12.65,\n    \"fiber\": 0,\n    \"protein\": 0.06,\n    \"sodium\": 9,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.011,\n    \"vitaminB2\": 0.095,\n    \"vitaminB3\": 0.425,\n    \"vitaminB5\": 0.035,\n    \"vitaminB6\": 0.026,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 12,\n    \"calcium\": 11,\n    \"phosphorus\": 6,\n    \"potassium\": 148,\n    \"iron\": 0.12,\n    \"selenium\": 0,\n    \"zinc\": 0.11,\n    \"manganese\": 0.23,\n    \"copper\": 0.072,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 4.2\n    }\n  },\n  {\n    \"id\": 5004,\n    \"name\": \"Balsamic Vinegar\",\n    \"categoryId\": 5000,\n    \"energy\": 88,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 17.03,\n    \"sugar\": 14.95,\n    \"fiber\": 0,\n    \"protein\": 0.49,\n    \"sodium\": 23,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 12,\n    \"calcium\": 27,\n    \"phosphorus\": 19,\n    \"potassium\": 112,\n    \"iron\": 0.72,\n    \"selenium\": 0,\n    \"zinc\": 0.08,\n    \"manganese\": 0.131,\n    \"copper\": 0.026,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 16\n    }\n  },\n  {\n    \"id\": 5005,\n    \"name\": \"Garlic\",\n    \"categoryId\": 5000,\n    \"energy\": 149,\n    \"fat\": 0.5,\n    \"saturatedFat\": 0.089,\n    \"monounsaturatedFat\": 0.011,\n    \"polyunsaturatedFat\": 0.249,\n    \"carbs\": 33.06,\n    \"sugar\": 1,\n    \"fiber\": 2.1,\n    \"protein\": 6.36,\n    \"sodium\": 17,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.2,\n    \"vitaminB2\": 0.11,\n    \"vitaminB3\": 0.7,\n    \"vitaminB5\": 0.596,\n    \"vitaminB6\": 1.235,\n    \"vitaminB9\": 3,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 31.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.08,\n    \"vitaminK\": 1.7,\n    \"magnesium\": 25,\n    \"calcium\": 181,\n    \"phosphorus\": 153,\n    \"potassium\": 401,\n    \"iron\": 1.7,\n    \"selenium\": 14.2,\n    \"zinc\": 1.16,\n    \"manganese\": 1.672,\n    \"copper\": 0.299,\n    \"choline\": 23.2,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 2.8\n    }\n  },\n  {\n    \"id\": 5006,\n    \"name\": \"Fresh Mint\",\n    \"categoryId\": 5000,\n    \"energy\": 44,\n    \"fat\": 0.73,\n    \"saturatedFat\": 0.191,\n    \"monounsaturatedFat\": 0.025,\n    \"polyunsaturatedFat\": 0.394,\n    \"carbs\": 8.41,\n    \"sugar\": 0,\n    \"fiber\": 6.8,\n    \"protein\": 3.29,\n    \"sodium\": 30,\n    \"cholesterol\": 0,\n    \"vitaminA\": 203,\n    \"vitaminB1\": 0.078,\n    \"vitaminB2\": 0.175,\n    \"vitaminB3\": 0.948,\n    \"vitaminB5\": 0.25,\n    \"vitaminB6\": 0.158,\n    \"vitaminB9\": 105,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 13.3,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 63,\n    \"calcium\": 199,\n    \"phosphorus\": 60,\n    \"potassium\": 458,\n    \"iron\": 11.87,\n    \"selenium\": 0,\n    \"zinc\": 1.09,\n    \"manganese\": 1.118,\n    \"copper\": 0.24,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 11.4\n    }\n  },\n  {\n    \"id\": 5007,\n    \"name\": \"Fresh Basil\",\n    \"categoryId\": 5000,\n    \"energy\": 23,\n    \"fat\": 0.64,\n    \"saturatedFat\": 0.041,\n    \"monounsaturatedFat\": 0.088,\n    \"polyunsaturatedFat\": 0.389,\n    \"carbs\": 2.65,\n    \"sugar\": 0.3,\n    \"fiber\": 1.6,\n    \"protein\": 3.15,\n    \"sodium\": 4,\n    \"cholesterol\": 0,\n    \"vitaminA\": 264,\n    \"vitaminB1\": 0.034,\n    \"vitaminB2\": 0.076,\n    \"vitaminB3\": 0.902,\n    \"vitaminB5\": 0.209,\n    \"vitaminB6\": 0.155,\n    \"vitaminB9\": 68,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 18,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.8,\n    \"vitaminK\": 414.8,\n    \"magnesium\": 64,\n    \"calcium\": 177,\n    \"phosphorus\": 56,\n    \"potassium\": 295,\n    \"iron\": 3.17,\n    \"selenium\": 0.3,\n    \"zinc\": 0.81,\n    \"manganese\": 1.148,\n    \"copper\": 0.385,\n    \"choline\": 11.4,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 5.3\n    }\n  },\n  {\n    \"id\": 5008,\n    \"name\": \"Nutmeg\",\n    \"categoryId\": 5000,\n    \"energy\": 525,\n    \"fat\": 36.31,\n    \"saturatedFat\": 25.94,\n    \"monounsaturatedFat\": 3.22,\n    \"polyunsaturatedFat\": 0.35,\n    \"carbs\": 49.29,\n    \"sugar\": 2.99,\n    \"fiber\": 20.8,\n    \"protein\": 5.84,\n    \"sodium\": 16,\n    \"cholesterol\": 0,\n    \"vitaminA\": 5,\n    \"vitaminB1\": 0.346,\n    \"vitaminB2\": 0.057,\n    \"vitaminB3\": 1.299,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.16,\n    \"vitaminB9\": 76,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 3,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 183,\n    \"calcium\": 184,\n    \"phosphorus\": 213,\n    \"potassium\": 350,\n    \"iron\": 3.04,\n    \"selenium\": 1.6,\n    \"zinc\": 2.15,\n    \"manganese\": 2.9,\n    \"copper\": 1.027,\n    \"choline\": 8.8,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 7\n    }\n  },\n  {\n    \"id\": 5009,\n    \"name\": \"Black Pepper\",\n    \"categoryId\": 5000,\n    \"energy\": 251,\n    \"fat\": 3.26,\n    \"saturatedFat\": 1.392,\n    \"monounsaturatedFat\": 0.739,\n    \"polyunsaturatedFat\": 0.998,\n    \"carbs\": 63.95,\n    \"sugar\": 0.64,\n    \"fiber\": 25.3,\n    \"protein\": 10.39,\n    \"sodium\": 20,\n    \"cholesterol\": 0,\n    \"vitaminA\": 27,\n    \"vitaminB1\": 0.108,\n    \"vitaminB2\": 0.18,\n    \"vitaminB3\": 1.143,\n    \"vitaminB5\": 1.399,\n    \"vitaminB6\": 0.291,\n    \"vitaminB9\": 17,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.04,\n    \"vitaminK\": 163.7,\n    \"magnesium\": 171,\n    \"calcium\": 443,\n    \"phosphorus\": 158,\n    \"potassium\": 1329,\n    \"iron\": 9.71,\n    \"selenium\": 4.9,\n    \"zinc\": 1.19,\n    \"manganese\": 12.753,\n    \"copper\": 1.33,\n    \"choline\": 11.3,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 6.9\n    }\n  },\n  {\n    \"id\": 5010,\n    \"name\": \"Salt\",\n    \"categoryId\": 5000,\n    \"energy\": 0,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 0,\n    \"sodium\": 38758,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 1,\n    \"calcium\": 24,\n    \"phosphorus\": 0,\n    \"potassium\": 8,\n    \"iron\": 0.33,\n    \"selenium\": 0.1,\n    \"zinc\": 0.1,\n    \"manganese\": 0.1,\n    \"copper\": 0.03,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 292\n    }\n  },\n  {\n    \"id\": 5011,\n    \"name\": \"Paprika\",\n    \"categoryId\": 5000,\n    \"energy\": 282,\n    \"fat\": 12.89,\n    \"saturatedFat\": 2.14,\n    \"monounsaturatedFat\": 1.695,\n    \"polyunsaturatedFat\": 7.766,\n    \"carbs\": 53.99,\n    \"sugar\": 10.34,\n    \"fiber\": 34.9,\n    \"protein\": 14.14,\n    \"sodium\": 68,\n    \"cholesterol\": 0,\n    \"vitaminA\": 2463,\n    \"vitaminB1\": 0.33,\n    \"vitaminB2\": 1.23,\n    \"vitaminB3\": 10.06,\n    \"vitaminB5\": 2.51,\n    \"vitaminB6\": 2.141,\n    \"vitaminB9\": 49,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0.9,\n    \"vitaminD\": 0,\n    \"vitaminE\": 29.1,\n    \"vitaminK\": 80.3,\n    \"magnesium\": 178,\n    \"calcium\": 229,\n    \"phosphorus\": 314,\n    \"potassium\": 2280,\n    \"iron\": 21.14,\n    \"selenium\": 6.3,\n    \"zinc\": 4.33,\n    \"manganese\": 1.59,\n    \"copper\": 0.713,\n    \"choline\": 51.5,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 6.8\n    }\n  },\n  {\n    \"id\": 5012,\n    \"name\": \"Cayenne Pepper\",\n    \"categoryId\": 5000,\n    \"energy\": 318,\n    \"fat\": 17.27,\n    \"saturatedFat\": 3.26,\n    \"monounsaturatedFat\": 2.75,\n    \"polyunsaturatedFat\": 8.37,\n    \"carbs\": 56.63,\n    \"sugar\": 10.34,\n    \"fiber\": 27.2,\n    \"protein\": 12.01,\n    \"sodium\": 30,\n    \"cholesterol\": 0,\n    \"vitaminA\": 2081,\n    \"vitaminB1\": 0.328,\n    \"vitaminB2\": 0.919,\n    \"vitaminB3\": 8.701,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 2.45,\n    \"vitaminB9\": 106,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 76.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 29.83,\n    \"vitaminK\": 80.3,\n    \"magnesium\": 152,\n    \"calcium\": 148,\n    \"phosphorus\": 293,\n    \"potassium\": 2014,\n    \"iron\": 7.8,\n    \"selenium\": 8.8,\n    \"zinc\": 2.48,\n    \"manganese\": 2,\n    \"copper\": 0.373,\n    \"choline\": 51.5,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 5.3\n    }\n  },\n  {\n    \"id\": 5013,\n    \"name\": \"Cumin\",\n    \"categoryId\": 5000,\n    \"energy\": 375,\n    \"fat\": 22.27,\n    \"saturatedFat\": 1.535,\n    \"monounsaturatedFat\": 14.04,\n    \"polyunsaturatedFat\": 3.279,\n    \"carbs\": 44.24,\n    \"sugar\": 2.25,\n    \"fiber\": 10.5,\n    \"protein\": 17.81,\n    \"sodium\": 168,\n    \"cholesterol\": 0,\n    \"vitaminA\": 64,\n    \"vitaminB1\": 0.628,\n    \"vitaminB2\": 0.327,\n    \"vitaminB3\": 4.579,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.435,\n    \"vitaminB9\": 10,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 7.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 3.33,\n    \"vitaminK\": 5.4,\n    \"magnesium\": 366,\n    \"calcium\": 931,\n    \"phosphorus\": 499,\n    \"potassium\": 1788,\n    \"iron\": 66.36,\n    \"selenium\": 5.2,\n    \"zinc\": 4.8,\n    \"manganese\": 3.333,\n    \"copper\": 0.867,\n    \"choline\": 24.7,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 2.1\n    }\n  },\n  {\n    \"id\": 5014,\n    \"name\": \"Fresh Thyme\",\n    \"categoryId\": 5000,\n    \"energy\": 101,\n    \"fat\": 1.68,\n    \"saturatedFat\": 0.467,\n    \"monounsaturatedFat\": 0.081,\n    \"polyunsaturatedFat\": 0.532,\n    \"carbs\": 24.45,\n    \"sugar\": 0,\n    \"fiber\": 14,\n    \"protein\": 5.56,\n    \"sodium\": 9,\n    \"cholesterol\": 0,\n    \"vitaminA\": 238,\n    \"vitaminB1\": 0.048,\n    \"vitaminB2\": 0.471,\n    \"vitaminB3\": 1.824,\n    \"vitaminB5\": 0.409,\n    \"vitaminB6\": 0.348,\n    \"vitaminB9\": 45,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 160.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 160,\n    \"calcium\": 405,\n    \"phosphorus\": 106,\n    \"potassium\": 609,\n    \"iron\": 17.45,\n    \"selenium\": 0,\n    \"zinc\": 1.81,\n    \"manganese\": 1.719,\n    \"copper\": 0.555,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 0.8\n    }\n  },\n  {\n    \"id\": 5015,\n    \"name\": \"Dried Thyme\",\n    \"categoryId\": 5000,\n    \"energy\": 276,\n    \"fat\": 7.43,\n    \"saturatedFat\": 2.73,\n    \"monounsaturatedFat\": 0.47,\n    \"polyunsaturatedFat\": 1.19,\n    \"carbs\": 63.94,\n    \"sugar\": 1.71,\n    \"fiber\": 37,\n    \"protein\": 9.11,\n    \"sodium\": 55,\n    \"cholesterol\": 0,\n    \"vitaminA\": 190,\n    \"vitaminB1\": 0.513,\n    \"vitaminB2\": 0.399,\n    \"vitaminB3\": 4.94,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.55,\n    \"vitaminB9\": 274,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 50,\n    \"vitaminD\": 0,\n    \"vitaminE\": 7.48,\n    \"vitaminK\": 1714.5,\n    \"magnesium\": 220,\n    \"calcium\": 1890,\n    \"phosphorus\": 201,\n    \"potassium\": 814,\n    \"iron\": 123.6,\n    \"selenium\": 4.6,\n    \"zinc\": 6.18,\n    \"manganese\": 7.867,\n    \"copper\": 0.86,\n    \"choline\": 43.6,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 1\n    }\n  },\n  {\n    \"id\": 5016,\n    \"name\": \"Ground Ginger\",\n    \"categoryId\": 5000,\n    \"energy\": 335,\n    \"fat\": 4.24,\n    \"saturatedFat\": 2.599,\n    \"monounsaturatedFat\": 0.479,\n    \"polyunsaturatedFat\": 0.929,\n    \"carbs\": 71.62,\n    \"sugar\": 3.39,\n    \"fiber\": 14.1,\n    \"protein\": 8.98,\n    \"sodium\": 27,\n    \"cholesterol\": 0,\n    \"vitaminA\": 2,\n    \"vitaminB1\": 0.046,\n    \"vitaminB2\": 0.17,\n    \"vitaminB3\": 9.62,\n    \"vitaminB5\": 0.477,\n    \"vitaminB6\": 0.626,\n    \"vitaminB9\": 13,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0.8,\n    \"magnesium\": 214,\n    \"calcium\": 114,\n    \"phosphorus\": 168,\n    \"potassium\": 1320,\n    \"iron\": 19.8,\n    \"selenium\": 55.8,\n    \"zinc\": 3.64,\n    \"manganese\": 33.3,\n    \"copper\": 0.48,\n    \"choline\": 41.2,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 5.2\n    }\n  },\n  {\n    \"id\": 5017,\n    \"name\": \"Fresh Rosemary\",\n    \"categoryId\": 5000,\n    \"energy\": 131,\n    \"fat\": 5.86,\n    \"saturatedFat\": 2.838,\n    \"monounsaturatedFat\": 1.16,\n    \"polyunsaturatedFat\": 0.901,\n    \"carbs\": 20.7,\n    \"sugar\": 0,\n    \"fiber\": 14.1,\n    \"protein\": 3.31,\n    \"sodium\": 26,\n    \"cholesterol\": 0,\n    \"vitaminA\": 146,\n    \"vitaminB1\": 0.036,\n    \"vitaminB2\": 0.152,\n    \"vitaminB3\": 0.912,\n    \"vitaminB5\": 0.804,\n    \"vitaminB6\": 0.336,\n    \"vitaminB9\": 109,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 21.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 91,\n    \"calcium\": 317,\n    \"phosphorus\": 66,\n    \"potassium\": 668,\n    \"iron\": 6.65,\n    \"selenium\": 0,\n    \"zinc\": 0.93,\n    \"manganese\": 0.96,\n    \"copper\": 0.301,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 1.7\n    }\n  },\n  {\n    \"id\": 5018,\n    \"name\": \"Dried Rosemary\",\n    \"categoryId\": 5000,\n    \"energy\": 331,\n    \"fat\": 15.22,\n    \"saturatedFat\": 7.371,\n    \"monounsaturatedFat\": 3.014,\n    \"polyunsaturatedFat\": 2.339,\n    \"carbs\": 64.06,\n    \"sugar\": 0,\n    \"fiber\": 42.6,\n    \"protein\": 4.88,\n    \"sodium\": 50,\n    \"cholesterol\": 0,\n    \"vitaminA\": 156,\n    \"vitaminB1\": 0.514,\n    \"vitaminB2\": 0.428,\n    \"vitaminB3\": 1,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 1.74,\n    \"vitaminB9\": 307,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 61.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 220,\n    \"calcium\": 1280,\n    \"phosphorus\": 70,\n    \"potassium\": 955,\n    \"iron\": 29.25,\n    \"selenium\": 4.6,\n    \"zinc\": 3.23,\n    \"manganese\": 1.867,\n    \"copper\": 0.55,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 1.2\n    }\n  },\n  {\n    \"id\": 5019,\n    \"name\": \"Dried Oregano\",\n    \"categoryId\": 5000,\n    \"energy\": 265,\n    \"fat\": 4.28,\n    \"saturatedFat\": 1.551,\n    \"monounsaturatedFat\": 0.716,\n    \"polyunsaturatedFat\": 1.369,\n    \"carbs\": 68.92,\n    \"sugar\": 4.09,\n    \"fiber\": 42.5,\n    \"protein\": 9,\n    \"sodium\": 25,\n    \"cholesterol\": 0,\n    \"vitaminA\": 85,\n    \"vitaminB1\": 0.177,\n    \"vitaminB2\": 0.528,\n    \"vitaminB3\": 4.64,\n    \"vitaminB5\": 0.921,\n    \"vitaminB6\": 1.044,\n    \"vitaminB9\": 237,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 2.3,\n    \"vitaminD\": 0,\n    \"vitaminE\": 18.26,\n    \"vitaminK\": 621.7,\n    \"magnesium\": 270,\n    \"calcium\": 1597,\n    \"phosphorus\": 148,\n    \"potassium\": 1260,\n    \"iron\": 36.8,\n    \"selenium\": 4.5,\n    \"zinc\": 2.69,\n    \"manganese\": 4.99,\n    \"copper\": 0.633,\n    \"choline\": 32.3,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 1\n    }\n  },\n  {\n    \"id\": 5020,\n    \"name\": \"Ground Sage\",\n    \"categoryId\": 5000,\n    \"energy\": 315,\n    \"fat\": 12.75,\n    \"saturatedFat\": 7.03,\n    \"monounsaturatedFat\": 1.87,\n    \"polyunsaturatedFat\": 1.76,\n    \"carbs\": 60.73,\n    \"sugar\": 1.71,\n    \"fiber\": 40.3,\n    \"protein\": 10.63,\n    \"sodium\": 11,\n    \"cholesterol\": 0,\n    \"vitaminA\": 295,\n    \"vitaminB1\": 0.754,\n    \"vitaminB2\": 0.336,\n    \"vitaminB3\": 5.72,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 2.69,\n    \"vitaminB9\": 274,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 32.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 7.48,\n    \"vitaminK\": 1714.5,\n    \"magnesium\": 428,\n    \"calcium\": 1652,\n    \"phosphorus\": 91,\n    \"potassium\": 1070,\n    \"iron\": 28.12,\n    \"selenium\": 3.7,\n    \"zinc\": 4.7,\n    \"manganese\": 3.133,\n    \"copper\": 0.757,\n    \"choline\": 43.6,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 0.7\n    }\n  },\n  {\n    \"id\": 5021,\n    \"name\": \"Dried Parsley\",\n    \"categoryId\": 5000,\n    \"energy\": 292,\n    \"fat\": 5.48,\n    \"saturatedFat\": 1.378,\n    \"monounsaturatedFat\": 0.761,\n    \"polyunsaturatedFat\": 3.124,\n    \"carbs\": 50.64,\n    \"sugar\": 7.27,\n    \"fiber\": 26.7,\n    \"protein\": 26.63,\n    \"sodium\": 452,\n    \"cholesterol\": 0,\n    \"vitaminA\": 97,\n    \"vitaminB1\": 0.196,\n    \"vitaminB2\": 2.383,\n    \"vitaminB3\": 9.943,\n    \"vitaminB5\": 1.062,\n    \"vitaminB6\": 0.9,\n    \"vitaminB9\": 180,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 125,\n    \"vitaminD\": 0,\n    \"vitaminE\": 8.96,\n    \"vitaminK\": 1359.5,\n    \"magnesium\": 400,\n    \"calcium\": 1140,\n    \"phosphorus\": 436,\n    \"potassium\": 2683,\n    \"iron\": 22.04,\n    \"selenium\": 14.1,\n    \"zinc\": 5.44,\n    \"manganese\": 9.81,\n    \"copper\": 0.78,\n    \"choline\": 97.1,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 0.5\n    }\n  },\n  {\n    \"id\": 5022,\n    \"name\": \"Garlic Powder\",\n    \"categoryId\": 5000,\n    \"energy\": 331,\n    \"fat\": 0.73,\n    \"saturatedFat\": 0.249,\n    \"monounsaturatedFat\": 0.115,\n    \"polyunsaturatedFat\": 0.178,\n    \"carbs\": 72.73,\n    \"sugar\": 2.43,\n    \"fiber\": 9,\n    \"protein\": 16.55,\n    \"sodium\": 60,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.435,\n    \"vitaminB2\": 0.141,\n    \"vitaminB3\": 0.796,\n    \"vitaminB5\": 0.743,\n    \"vitaminB6\": 1.654,\n    \"vitaminB9\": 47,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 1.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.67,\n    \"vitaminK\": 0.4,\n    \"magnesium\": 77,\n    \"calcium\": 79,\n    \"phosphorus\": 414,\n    \"potassium\": 1193,\n    \"iron\": 5.65,\n    \"selenium\": 23.9,\n    \"zinc\": 2.99,\n    \"manganese\": 0.979,\n    \"copper\": 0.533,\n    \"choline\": 67.5,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 9.7\n    }\n  },\n  {\n    \"id\": 5023,\n    \"name\": \"Cappers\",\n    \"categoryId\": 5000,\n    \"energy\": 23,\n    \"fat\": 0.86,\n    \"saturatedFat\": 0.233,\n    \"monounsaturatedFat\": 0.063,\n    \"polyunsaturatedFat\": 0.304,\n    \"carbs\": 4.89,\n    \"sugar\": 0.41,\n    \"fiber\": 3.2,\n    \"protein\": 2.36,\n    \"sodium\": 2348,\n    \"cholesterol\": 0,\n    \"vitaminA\": 7,\n    \"vitaminB1\": 0.018,\n    \"vitaminB2\": 0.139,\n    \"vitaminB3\": 0.652,\n    \"vitaminB5\": 0.027,\n    \"vitaminB6\": 0.023,\n    \"vitaminB9\": 23,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 4.3,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.88,\n    \"vitaminK\": 24.6,\n    \"magnesium\": 33,\n    \"calcium\": 40,\n    \"phosphorus\": 10,\n    \"potassium\": 40,\n    \"iron\": 1.67,\n    \"selenium\": 1.2,\n    \"zinc\": 0.32,\n    \"manganese\": 0.078,\n    \"copper\": 0.374,\n    \"choline\": 6.5,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 8.6\n    }\n  },\n  {\n    \"id\": 5024,\n    \"name\": \"Apple Cider Vinegar\",\n    \"categoryId\": 5000,\n    \"energy\": 21,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0.93,\n    \"sugar\": 0.4,\n    \"fiber\": 0,\n    \"protein\": 0,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 5,\n    \"calcium\": 7,\n    \"phosphorus\": 8,\n    \"potassium\": 73,\n    \"iron\": 0.2,\n    \"selenium\": 0.1,\n    \"zinc\": 0.04,\n    \"manganese\": 0.249,\n    \"copper\": 0.008,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 5\n    }\n  },\n  {\n    \"id\": 5025,\n    \"name\": \"Salt\",\n    \"categoryId\": 5000,\n    \"energy\": 0,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 0,\n    \"sugar\": 0,\n    \"fiber\": 0,\n    \"protein\": 0,\n    \"sodium\": 38758,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 1,\n    \"calcium\": 24,\n    \"phosphorus\": 0,\n    \"potassium\": 8,\n    \"iron\": 0.33,\n    \"selenium\": 0.1,\n    \"zinc\": 0.1,\n    \"manganese\": 0.1,\n    \"copper\": 0.03,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 292\n    }\n  },\n  {\n    \"id\": 5026,\n    \"name\": \"Dried Coriander leaves\",\n    \"categoryId\": 5000,\n    \"energy\": 279,\n    \"fat\": 4.78,\n    \"saturatedFat\": 0.115,\n    \"monounsaturatedFat\": 2.232,\n    \"polyunsaturatedFat\": 0.328,\n    \"carbs\": 52.1,\n    \"sugar\": 7.27,\n    \"fiber\": 10.4,\n    \"protein\": 21.93,\n    \"sodium\": 211,\n    \"cholesterol\": 0,\n    \"vitaminA\": 293,\n    \"vitaminB1\": 1.252,\n    \"vitaminB2\": 1.5,\n    \"vitaminB3\": 10.707,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.61,\n    \"vitaminB9\": 274,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 566.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.03,\n    \"vitaminK\": 1359.5,\n    \"magnesium\": 694,\n    \"calcium\": 1246,\n    \"phosphorus\": 481,\n    \"potassium\": 4466,\n    \"iron\": 42.46,\n    \"selenium\": 29.3,\n    \"zinc\": 4.72,\n    \"manganese\": 6.355,\n    \"copper\": 1.786,\n    \"choline\": 97.1,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 0.6\n    }\n  }\n]"
  },
  {
    "path": "src/foods/builtIn/sweetsAndSnacks.json",
    "content": "[\n    {\n      \"id\": 6001,\n      \"name\": \"Maple syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 260,\n      \"fat\": 0.06,\n      \"saturatedFat\": 0.007,\n      \"monounsaturatedFat\": 0.011,\n      \"polyunsaturatedFat\": 0.017,\n      \"carbs\": 67.04,\n      \"sugar\": 60.46,\n      \"fiber\": 0,\n      \"protein\": 0.04,\n      \"sodium\": 12,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.066,\n      \"vitaminB2\": 1.27,\n      \"vitaminB3\": 0.081,\n      \"vitaminB5\": 0.036,\n      \"vitaminB6\": 0.002,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 21,\n      \"calcium\": 102,\n      \"phosphorus\": 2,\n      \"potassium\": 212,\n      \"iron\": 0.11,\n      \"selenium\": 0.6,\n      \"zinc\": 1.47,\n      \"manganese\": 2.908,\n      \"copper\": 0.018,\n      \"choline\": 1.6,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 20\n      }\n    },\n    {\n      \"id\": 6002,\n      \"name\": \"Sugar\",\n      \"categoryId\": 6000,\n      \"energy\": 387,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 99.98,\n      \"sugar\": 99.8,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 1,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0.019,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 1,\n      \"phosphorus\": 0,\n      \"potassium\": 2,\n      \"iron\": 0.05,\n      \"selenium\": 0.6,\n      \"zinc\": 0.01,\n      \"manganese\": 0.004,\n      \"copper\": 0.007,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 200\n      }\n    },\n    {\n      \"id\": 6003,\n      \"name\": \"Brown sugar\",\n      \"categoryId\": 6000,\n      \"energy\": 380,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 98.09,\n      \"sugar\": 97.02,\n      \"fiber\": 0,\n      \"protein\": 0.12,\n      \"sodium\": 28,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0.11,\n      \"vitaminB5\": 0.132,\n      \"vitaminB6\": 0.041,\n      \"vitaminB9\": 1,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 9,\n      \"calcium\": 83,\n      \"phosphorus\": 4,\n      \"potassium\": 133,\n      \"iron\": 0.71,\n      \"selenium\": 1.2,\n      \"zinc\": 0.03,\n      \"manganese\": 0.064,\n      \"copper\": 0.047,\n      \"choline\": 2.3,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 220\n      }\n    },\n    {\n      \"id\": 6004,\n      \"name\": \"Chocolate Chips Cookies\",\n      \"categoryId\": 6000,\n      \"energy\": 492,\n      \"fat\": 24.72,\n      \"saturatedFat\": 8.091,\n      \"monounsaturatedFat\": 6.272,\n      \"polyunsaturatedFat\": 8.417,\n      \"carbs\": 65.36,\n      \"sugar\": 32.9,\n      \"fiber\": 2,\n      \"protein\": 5.1,\n      \"sodium\": 311,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.292,\n      \"vitaminB2\": 0.297,\n      \"vitaminB3\": 2.665,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.058,\n      \"vitaminB9\": 72,\n      \"vitaminB12\": 0.03,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.01,\n      \"vitaminK\": 33.7,\n      \"magnesium\": 41,\n      \"calcium\": 21,\n      \"phosphorus\": 109,\n      \"potassium\": 171,\n      \"iron\": 5.58,\n      \"selenium\": 3.9,\n      \"zinc\": 0.72,\n      \"manganese\": 0.62,\n      \"copper\": 0.323,\n      \"choline\": 10.5\n    },\n    {\n      \"id\": 6005,\n      \"name\": \"Agave Syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 310,\n      \"fat\": 0.45,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 76.37,\n      \"sugar\": 68.03,\n      \"fiber\": 0.2,\n      \"protein\": 0.09,\n      \"sodium\": 4,\n      \"cholesterol\": 0,\n      \"vitaminA\": 8,\n      \"vitaminB1\": 0.122,\n      \"vitaminB2\": 0.165,\n      \"vitaminB3\": 0.689,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.234,\n      \"vitaminB9\": 30,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 17,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.98,\n      \"vitaminK\": 22.5,\n      \"magnesium\": 1,\n      \"calcium\": 1,\n      \"phosphorus\": 1,\n      \"potassium\": 4,\n      \"iron\": 0.09,\n      \"selenium\": 1.7,\n      \"zinc\": 0.01,\n      \"manganese\": 0.005,\n      \"copper\": 0.009,\n      \"choline\": 13.3,\n      \"volume\": {\n        \"portionId\": \"teaspoons\",\n        \"weightInGrams\": 6.9\n      }\n    },\n    {\n      \"id\": 6006,\n      \"name\": \"Honey\",\n      \"categoryId\": 6000,\n      \"energy\": 304,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 82.4,\n      \"sugar\": 82.12,\n      \"fiber\": 0.2,\n      \"protein\": 0.3,\n      \"sodium\": 4,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0.038,\n      \"vitaminB3\": 0.121,\n      \"vitaminB5\": 0.068,\n      \"vitaminB6\": 0.024,\n      \"vitaminB9\": 2,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 2,\n      \"calcium\": 6,\n      \"phosphorus\": 4,\n      \"potassium\": 52,\n      \"iron\": 0.42,\n      \"selenium\": 0.8,\n      \"zinc\": 0.22,\n      \"manganese\": 0.08,\n      \"copper\": 0.036,\n      \"choline\": 2.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 339\n      }\n    },\n    {\n      \"id\": 6007,\n      \"name\": \"Pancake Syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 234,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 61.47,\n      \"sugar\": 21.47,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 82,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.024,\n      \"vitaminB2\": 0.008,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0.004,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 2,\n      \"calcium\": 3,\n      \"phosphorus\": 9,\n      \"potassium\": 15,\n      \"iron\": 0.03,\n      \"selenium\": 0,\n      \"zinc\": 0.08,\n      \"manganese\": 0.068,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 20\n      }\n    },\n    {\n      \"id\": 6008,\n      \"name\": \"Reduced Calorie Pancake Syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 165,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 44.55,\n      \"sugar\": 32.8,\n      \"fiber\": 0,\n      \"protein\": 0,\n      \"sodium\": 178,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.025,\n      \"vitaminB2\": 0.003,\n      \"vitaminB3\": 0.004,\n      \"vitaminB5\": 0.005,\n      \"vitaminB6\": 0.003,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 2,\n      \"calcium\": 10,\n      \"phosphorus\": 43,\n      \"potassium\": 3,\n      \"iron\": 0.03,\n      \"selenium\": 0.5,\n      \"zinc\": 0.2,\n      \"manganese\": 0.022,\n      \"copper\": 0.018,\n      \"choline\": 0.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 240\n      }\n    },\n    {\n      \"id\": 6009,\n      \"name\": \"Jam\",\n      \"categoryId\": 6000,\n      \"energy\": 278,\n      \"fat\": 0.07,\n      \"saturatedFat\": 0.01,\n      \"monounsaturatedFat\": 0.038,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 68.86,\n      \"sugar\": 48.5,\n      \"fiber\": 1.1,\n      \"protein\": 0.37,\n      \"sodium\": 32,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.016,\n      \"vitaminB2\": 0.076,\n      \"vitaminB3\": 0.036,\n      \"vitaminB5\": 0.02,\n      \"vitaminB6\": 0.02,\n      \"vitaminB9\": 11,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 8.8,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.12,\n      \"vitaminK\": 0,\n      \"magnesium\": 4,\n      \"calcium\": 20,\n      \"phosphorus\": 19,\n      \"potassium\": 77,\n      \"iron\": 0.49,\n      \"selenium\": 2,\n      \"zinc\": 0.06,\n      \"manganese\": 0.04,\n      \"copper\": 0.1,\n      \"choline\": 10.2,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 20\n      }\n    },\n    {\n      \"id\": 6010,\n      \"name\": \"Dark Chocolate (45-59%)\",\n      \"categoryId\": 6000,\n      \"energy\": 546,\n      \"fat\": 31.28,\n      \"saturatedFat\": 18.519,\n      \"monounsaturatedFat\": 9.54,\n      \"polyunsaturatedFat\": 1.092,\n      \"carbs\": 61.17,\n      \"sugar\": 47.9,\n      \"fiber\": 7,\n      \"protein\": 4.88,\n      \"sodium\": 24,\n      \"cholesterol\": 8,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.025,\n      \"vitaminB2\": 0.05,\n      \"vitaminB3\": 0.725,\n      \"vitaminB5\": 0.297,\n      \"vitaminB6\": 0.042,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0.23,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.54,\n      \"vitaminK\": 8.1,\n      \"magnesium\": 146,\n      \"calcium\": 56,\n      \"phosphorus\": 206,\n      \"potassium\": 559,\n      \"iron\": 8.02,\n      \"selenium\": 3,\n      \"zinc\": 2.01,\n      \"manganese\": 1.419,\n      \"copper\": 1.028,\n      \"choline\": 0\n    },\n    {\n      \"id\": 6011,\n      \"name\": \"Dark Chocolate (60-69%)\",\n      \"categoryId\": 6000,\n      \"energy\": 579,\n      \"fat\": 38.31,\n      \"saturatedFat\": 22.031,\n      \"monounsaturatedFat\": 11.522,\n      \"polyunsaturatedFat\": 1.221,\n      \"carbs\": 52.42,\n      \"sugar\": 36.71,\n      \"fiber\": 8,\n      \"protein\": 6.12,\n      \"sodium\": 10,\n      \"cholesterol\": 6,\n      \"vitaminA\": 3,\n      \"vitaminB1\": 0.032,\n      \"vitaminB2\": 0.049,\n      \"vitaminB3\": 0.838,\n      \"vitaminB5\": 0.3,\n      \"vitaminB6\": 0.034,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0.18,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.59,\n      \"vitaminK\": 7.2,\n      \"magnesium\": 176,\n      \"calcium\": 62,\n      \"phosphorus\": 260,\n      \"potassium\": 567,\n      \"iron\": 6.32,\n      \"selenium\": 8.4,\n      \"zinc\": 2.65,\n      \"manganese\": 1.325,\n      \"copper\": 1.248,\n      \"choline\": 0\n    },\n    {\n      \"id\": 6012,\n      \"name\": \"Dark Chocolate (70-85%)\",\n      \"categoryId\": 6000,\n      \"energy\": 598,\n      \"fat\": 42.63,\n      \"saturatedFat\": 24.489,\n      \"monounsaturatedFat\": 12.781,\n      \"polyunsaturatedFat\": 1.257,\n      \"carbs\": 45.9,\n      \"sugar\": 23.99,\n      \"fiber\": 10.9,\n      \"protein\": 7.79,\n      \"sodium\": 20,\n      \"cholesterol\": 3,\n      \"vitaminA\": 2,\n      \"vitaminB1\": 0.034,\n      \"vitaminB2\": 0.078,\n      \"vitaminB3\": 1.054,\n      \"vitaminB5\": 0.418,\n      \"vitaminB6\": 0.038,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0.28,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.59,\n      \"vitaminK\": 7.3,\n      \"magnesium\": 228,\n      \"calcium\": 73,\n      \"phosphorus\": 308,\n      \"potassium\": 715,\n      \"iron\": 11.9,\n      \"selenium\": 6.8,\n      \"zinc\": 3.31,\n      \"manganese\": 1.948,\n      \"copper\": 1.766,\n      \"choline\": 0\n    },\n    {\n      \"id\": 6013,\n      \"name\": \"Unsweetened Cocoa Powder\",\n      \"categoryId\": 6000,\n      \"energy\": 228,\n      \"fat\": 13.7,\n      \"saturatedFat\": 8.07,\n      \"monounsaturatedFat\": 4.57,\n      \"polyunsaturatedFat\": 0.44,\n      \"carbs\": 57.9,\n      \"sugar\": 1.75,\n      \"fiber\": 37,\n      \"protein\": 19.6,\n      \"sodium\": 21,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.078,\n      \"vitaminB2\": 0.241,\n      \"vitaminB3\": 2.185,\n      \"vitaminB5\": 0.254,\n      \"vitaminB6\": 0.118,\n      \"vitaminB9\": 32,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.1,\n      \"vitaminK\": 2.5,\n      \"magnesium\": 499,\n      \"calcium\": 128,\n      \"phosphorus\": 734,\n      \"potassium\": 1524,\n      \"iron\": 13.86,\n      \"selenium\": 14.3,\n      \"zinc\": 6.81,\n      \"manganese\": 3.837,\n      \"copper\": 3.788,\n      \"choline\": 12,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 5.4\n      }\n    },\n    {\n      \"id\": 6014,\n      \"name\": \"Marshmallows\",\n      \"categoryId\": 6000,\n      \"energy\": 318,\n      \"fat\": 0.2,\n      \"saturatedFat\": 0.056,\n      \"monounsaturatedFat\": 0.08,\n      \"polyunsaturatedFat\": 0.047,\n      \"carbs\": 81.3,\n      \"sugar\": 57.56,\n      \"fiber\": 0.1,\n      \"protein\": 1.8,\n      \"sodium\": 80,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.001,\n      \"vitaminB2\": 0.001,\n      \"vitaminB3\": 0.078,\n      \"vitaminB5\": 0.005,\n      \"vitaminB6\": 0.003,\n      \"vitaminB9\": 1,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 2,\n      \"calcium\": 3,\n      \"phosphorus\": 8,\n      \"potassium\": 5,\n      \"iron\": 0.23,\n      \"selenium\": 1.7,\n      \"zinc\": 0.04,\n      \"manganese\": 0.008,\n      \"copper\": 0.097,\n      \"choline\": 0.1,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 50\n      }\n    },\n    {\n      \"id\": 6015,\n      \"name\": \"Chocolate Ice Cream\",\n      \"categoryId\": 6000,\n      \"energy\": 216,\n      \"fat\": 11,\n      \"saturatedFat\": 6.8,\n      \"monounsaturatedFat\": 3.21,\n      \"polyunsaturatedFat\": 0.41,\n      \"carbs\": 28.2,\n      \"sugar\": 25.36,\n      \"fiber\": 1.2,\n      \"protein\": 3.8,\n      \"sodium\": 76,\n      \"cholesterol\": 34,\n      \"vitaminA\": 118,\n      \"vitaminB1\": 0.042,\n      \"vitaminB2\": 0.194,\n      \"vitaminB3\": 0.226,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.055,\n      \"vitaminB9\": 16,\n      \"vitaminB12\": 0.29,\n      \"vitaminC\": 0.7,\n      \"vitaminD\": 0.2,\n      \"vitaminE\": 0.3,\n      \"vitaminK\": 0.3,\n      \"magnesium\": 29,\n      \"calcium\": 109,\n      \"phosphorus\": 107,\n      \"potassium\": 249,\n      \"iron\": 0.93,\n      \"selenium\": 2.5,\n      \"zinc\": 0.58,\n      \"manganese\": 0,\n      \"copper\": 0.135,\n      \"choline\": 22.5\n    },\n    {\n      \"id\": 6016,\n      \"name\": \"Vanilla Ice Cream\",\n      \"categoryId\": 6000,\n      \"energy\": 207,\n      \"fat\": 11,\n      \"saturatedFat\": 6.79,\n      \"monounsaturatedFat\": 2.969,\n      \"polyunsaturatedFat\": 0.452,\n      \"carbs\": 23.6,\n      \"sugar\": 21.22,\n      \"fiber\": 0.7,\n      \"protein\": 3.5,\n      \"sodium\": 80,\n      \"cholesterol\": 44,\n      \"vitaminA\": 118,\n      \"vitaminB1\": 0.041,\n      \"vitaminB2\": 0.24,\n      \"vitaminB3\": 0.116,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.048,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0.39,\n      \"vitaminC\": 0.6,\n      \"vitaminD\": 0.2,\n      \"vitaminE\": 0.3,\n      \"vitaminK\": 0.3,\n      \"magnesium\": 14,\n      \"calcium\": 128,\n      \"phosphorus\": 105,\n      \"potassium\": 199,\n      \"iron\": 0.09,\n      \"selenium\": 1.8,\n      \"zinc\": 0.69,\n      \"manganese\": 0,\n      \"copper\": 0.023,\n      \"choline\": 26\n    },\n    {\n      \"id\": 6017,\n      \"name\": \"Rice Cakes\",\n      \"categoryId\": 6000,\n      \"energy\": 392,\n      \"fat\": 4.3,\n      \"saturatedFat\": 0.875,\n      \"monounsaturatedFat\": 1.582,\n      \"polyunsaturatedFat\": 1.52,\n      \"carbs\": 81.1,\n      \"sugar\": 0.88,\n      \"fiber\": 4.2,\n      \"protein\": 7.1,\n      \"sodium\": 71,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.06,\n      \"vitaminB2\": 0.16,\n      \"vitaminB3\": 7.81,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.15,\n      \"vitaminB9\": 21,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.24,\n      \"vitaminK\": 1.9,\n      \"magnesium\": 131,\n      \"calcium\": 11,\n      \"phosphorus\": 360,\n      \"potassium\": 428,\n      \"iron\": 1.49,\n      \"selenium\": 24.6,\n      \"zinc\": 3,\n      \"manganese\": 0,\n      \"copper\": 0.445,\n      \"choline\": 18.9\n    },\n    {\n      \"id\": 6018,\n      \"name\": \"Tortilla Chips\",\n      \"categoryId\": 6000,\n      \"energy\": 497,\n      \"fat\": 22.33,\n      \"saturatedFat\": 2.776,\n      \"monounsaturatedFat\": 8.584,\n      \"polyunsaturatedFat\": 9.179,\n      \"carbs\": 67.38,\n      \"sugar\": 1.21,\n      \"fiber\": 4.7,\n      \"protein\": 6.62,\n      \"sodium\": 310,\n      \"cholesterol\": 0,\n      \"vitaminA\": 8,\n      \"vitaminB1\": 0.13,\n      \"vitaminB2\": 0.043,\n      \"vitaminB3\": 1.498,\n      \"vitaminB5\": 0.411,\n      \"vitaminB6\": 0.202,\n      \"vitaminB9\": 22,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 2.97,\n      \"vitaminK\": 0.6,\n      \"magnesium\": 84,\n      \"calcium\": 104,\n      \"phosphorus\": 234,\n      \"potassium\": 206,\n      \"iron\": 1.32,\n      \"selenium\": 8.4,\n      \"zinc\": 1.46,\n      \"manganese\": 0.357,\n      \"copper\": 0.105,\n      \"choline\": 19.1\n    },\n    {\n      \"id\": 6019,\n      \"name\": \"Air-popped Popcorn\",\n      \"categoryId\": 6000,\n      \"energy\": 387,\n      \"fat\": 4.54,\n      \"saturatedFat\": 0.637,\n      \"monounsaturatedFat\": 0.95,\n      \"polyunsaturatedFat\": 2.318,\n      \"carbs\": 77.78,\n      \"sugar\": 0.87,\n      \"fiber\": 14.5,\n      \"protein\": 12.94,\n      \"sodium\": 8,\n      \"cholesterol\": 0,\n      \"vitaminA\": 10,\n      \"vitaminB1\": 0.104,\n      \"vitaminB2\": 0.083,\n      \"vitaminB3\": 2.308,\n      \"vitaminB5\": 0.51,\n      \"vitaminB6\": 0.157,\n      \"vitaminB9\": 31,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.29,\n      \"vitaminK\": 1.2,\n      \"magnesium\": 144,\n      \"calcium\": 7,\n      \"phosphorus\": 358,\n      \"potassium\": 329,\n      \"iron\": 3.19,\n      \"selenium\": 0,\n      \"zinc\": 3.08,\n      \"manganese\": 1.113,\n      \"copper\": 0.262,\n      \"choline\": 21.2,\n      \"volume\": {\n        \"portionId\": \"cups\",\n        \"weightInGrams\": 8\n      }\n    },\n    {\n      \"id\": 6020,\n      \"name\": \"Pork Rinds\",\n      \"categoryId\": 6000,\n      \"energy\": 544,\n      \"fat\": 31.3,\n      \"saturatedFat\": 11.37,\n      \"monounsaturatedFat\": 14.78,\n      \"polyunsaturatedFat\": 3.64,\n      \"carbs\": 0,\n      \"sugar\": 0,\n      \"fiber\": 0,\n      \"protein\": 61.3,\n      \"sodium\": 1818,\n      \"cholesterol\": 95,\n      \"vitaminA\": 12,\n      \"vitaminB1\": 0.099,\n      \"vitaminB2\": 0.283,\n      \"vitaminB3\": 1.549,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.023,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0.64,\n      \"vitaminC\": 0.5,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.53,\n      \"vitaminK\": 0,\n      \"magnesium\": 11,\n      \"calcium\": 30,\n      \"phosphorus\": 85,\n      \"potassium\": 127,\n      \"iron\": 0.88,\n      \"selenium\": 41,\n      \"zinc\": 0.56,\n      \"manganese\": 0,\n      \"copper\": 0.094,\n      \"choline\": 164.5\n    },\n    {\n      \"id\": 6021,\n      \"name\": \"Sugar Free Chocolate Syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 43,\n      \"fat\": 2.03,\n      \"saturatedFat\": 0.746,\n      \"monounsaturatedFat\": 0.428,\n      \"polyunsaturatedFat\": 0.041,\n      \"carbs\": 14.2,\n      \"sugar\": 0.27,\n      \"fiber\": 2.9,\n      \"protein\": 2.87,\n      \"sodium\": 343,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0.017,\n      \"vitaminB2\": 0.071,\n      \"vitaminB3\": 0.371,\n      \"vitaminB5\": 0.039,\n      \"vitaminB6\": 0.018,\n      \"vitaminB9\": 5,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0.02,\n      \"vitaminK\": 0.4,\n      \"magnesium\": 74,\n      \"calcium\": 0,\n      \"phosphorus\": 113,\n      \"potassium\": 388,\n      \"iron\": 2.06,\n      \"selenium\": 2,\n      \"zinc\": 0.99,\n      \"manganese\": 0.579,\n      \"copper\": 0.565,\n      \"choline\": 1.8,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 35\n      }\n    },\n    {\n      \"id\": 6022,\n      \"name\": \"Sugar Free Chocolate Chips\",\n      \"categoryId\": 6000,\n      \"energy\": 450,\n      \"fat\": 16.8,\n      \"saturatedFat\": 4.183,\n      \"monounsaturatedFat\": 6.73,\n      \"polyunsaturatedFat\": 5.035,\n      \"carbs\": 73.4,\n      \"sugar\": 39.81,\n      \"fiber\": 1.6,\n      \"protein\": 3.9,\n      \"sodium\": 244,\n      \"cholesterol\": 0,\n      \"vitaminA\": 1,\n      \"vitaminB1\": 0.373,\n      \"vitaminB2\": 0.188,\n      \"vitaminB3\": 2.843,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0.018,\n      \"vitaminB9\": 54,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 1.06,\n      \"vitaminK\": 4,\n      \"magnesium\": 21,\n      \"calcium\": 46,\n      \"phosphorus\": 109,\n      \"potassium\": 199,\n      \"iron\": 3.5,\n      \"selenium\": 2.6,\n      \"zinc\": 0.47,\n      \"manganese\": 0,\n      \"copper\": 0.218,\n      \"choline\": 6.7\n    },\n    {\n      \"id\": 6023,\n      \"name\": \"Sugar Free Syrup\",\n      \"categoryId\": 6000,\n      \"energy\": 51,\n      \"fat\": 0,\n      \"saturatedFat\": 0,\n      \"monounsaturatedFat\": 0,\n      \"polyunsaturatedFat\": 0,\n      \"carbs\": 11.99,\n      \"sugar\": 0.01,\n      \"fiber\": 0.7,\n      \"protein\": 0.8,\n      \"sodium\": 210,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0.002,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 0,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0.5,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0,\n      \"volume\": {\n        \"portionId\": \"tablespoons\",\n        \"weightInGrams\": 15\n      }\n    },\n    {\n      \"id\": 6024,\n      \"name\": \"Guar Gum\",\n      \"categoryId\": 6000,\n      \"energy\": 332,\n      \"fat\": 0.5,\n      \"saturatedFat\": 0.06,\n      \"monounsaturatedFat\": 0.22,\n      \"polyunsaturatedFat\": 0.07,\n      \"carbs\": 77.3,\n      \"sugar\": 0,\n      \"fiber\": 77.3,\n      \"protein\": 4.6,\n      \"sodium\": 125,\n      \"cholesterol\": 0,\n      \"vitaminA\": 0,\n      \"vitaminB1\": 0,\n      \"vitaminB2\": 0,\n      \"vitaminB3\": 0,\n      \"vitaminB5\": 0,\n      \"vitaminB6\": 0,\n      \"vitaminB9\": 0,\n      \"vitaminB12\": 0,\n      \"vitaminC\": 0,\n      \"vitaminD\": 0,\n      \"vitaminE\": 0,\n      \"vitaminK\": 0,\n      \"magnesium\": 0,\n      \"calcium\": 294,\n      \"phosphorus\": 0,\n      \"potassium\": 0,\n      \"iron\": 0,\n      \"selenium\": 0,\n      \"zinc\": 0,\n      \"manganese\": 0,\n      \"copper\": 0,\n      \"choline\": 0\n    }\n  ]"
  },
  {
    "path": "src/foods/builtIn/vegetables.json",
    "content": "[\n  {\n    \"id\": 701,\n    \"name\": \"Sweet Corn Kernels (frozen)\",\n    \"categoryId\": 700,\n    \"energy\": 88,\n    \"fat\": 0.78,\n    \"saturatedFat\": 0.119,\n    \"monounsaturatedFat\": 0.227,\n    \"polyunsaturatedFat\": 0.366,\n    \"carbs\": 20.71,\n    \"sugar\": 2.5,\n    \"fiber\": 2.1,\n    \"protein\": 3.02,\n    \"sodium\": 3,\n    \"cholesterol\": 0,\n    \"vitaminA\": 10,\n    \"vitaminB1\": 0.083,\n    \"vitaminB2\": 0.068,\n    \"vitaminB3\": 1.739,\n    \"vitaminB5\": 0.361,\n    \"vitaminB6\": 0.168,\n    \"vitaminB9\": 36,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 6.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.08,\n    \"vitaminK\": 0.3,\n    \"magnesium\": 18,\n    \"calcium\": 4,\n    \"phosphorus\": 70,\n    \"potassium\": 213,\n    \"iron\": 0.42,\n    \"selenium\": 0.7,\n    \"zinc\": 0.38,\n    \"manganese\": 0.123,\n    \"copper\": 0.036,\n    \"choline\": 24,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 136\n    }\n  },\n  {\n    \"id\": 702,\n    \"name\": \"Romaine Lettuce\",\n    \"categoryId\": 700,\n    \"energy\": 15,\n    \"fat\": 0.15,\n    \"saturatedFat\": 0.02,\n    \"monounsaturatedFat\": 0.006,\n    \"polyunsaturatedFat\": 0.082,\n    \"carbs\": 2.87,\n    \"sugar\": 0.78,\n    \"fiber\": 1.3,\n    \"protein\": 1.36,\n    \"sodium\": 28,\n    \"cholesterol\": 0,\n    \"vitaminA\": 370,\n    \"vitaminB1\": 0.07,\n    \"vitaminB2\": 0.08,\n    \"vitaminB3\": 0.375,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.09,\n    \"vitaminB9\": 38,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 9.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.22,\n    \"vitaminK\": 126.3,\n    \"magnesium\": 13,\n    \"calcium\": 36,\n    \"phosphorus\": 29,\n    \"potassium\": 194,\n    \"iron\": 0.86,\n    \"selenium\": 0.6,\n    \"zinc\": 0.18,\n    \"manganese\": 0,\n    \"copper\": 0.029,\n    \"choline\": 13.6\n  },\n  {\n    \"id\": 703,\n    \"name\": \"Brussels Sprouts\",\n    \"categoryId\": 700,\n    \"energy\": 43,\n    \"fat\": 0.3,\n    \"saturatedFat\": 0.062,\n    \"monounsaturatedFat\": 0.023,\n    \"polyunsaturatedFat\": 0.153,\n    \"carbs\": 8.95,\n    \"sugar\": 2.2,\n    \"fiber\": 3.8,\n    \"protein\": 3.38,\n    \"sodium\": 25,\n    \"cholesterol\": 0,\n    \"vitaminA\": 38,\n    \"vitaminB1\": 0.139,\n    \"vitaminB2\": 0.09,\n    \"vitaminB3\": 0.745,\n    \"vitaminB5\": 0.309,\n    \"vitaminB6\": 0.219,\n    \"vitaminB9\": 61,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 85,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.88,\n    \"vitaminK\": 177,\n    \"magnesium\": 23,\n    \"calcium\": 42,\n    \"phosphorus\": 69,\n    \"potassium\": 389,\n    \"iron\": 1.4,\n    \"selenium\": 1.6,\n    \"zinc\": 0.42,\n    \"manganese\": 0.337,\n    \"copper\": 0.07,\n    \"choline\": 19.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 88\n    }\n  },\n  {\n    \"id\": 704,\n    \"name\": \"Carrots\",\n    \"categoryId\": 700,\n    \"energy\": 41,\n    \"fat\": 0.24,\n    \"saturatedFat\": 0.032,\n    \"monounsaturatedFat\": 0.012,\n    \"polyunsaturatedFat\": 0.102,\n    \"carbs\": 9.58,\n    \"sugar\": 4.74,\n    \"fiber\": 2.8,\n    \"protein\": 0.93,\n    \"sodium\": 69,\n    \"cholesterol\": 0,\n    \"vitaminA\": 835,\n    \"vitaminB1\": 0.066,\n    \"vitaminB2\": 0.058,\n    \"vitaminB3\": 0.983,\n    \"vitaminB5\": 0.273,\n    \"vitaminB6\": 0.138,\n    \"vitaminB9\": 19,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 5.9,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.66,\n    \"vitaminK\": 13.2,\n    \"magnesium\": 12,\n    \"calcium\": 33,\n    \"phosphorus\": 35,\n    \"potassium\": 320,\n    \"iron\": 0.3,\n    \"selenium\": 0.1,\n    \"zinc\": 0.24,\n    \"manganese\": 0.143,\n    \"copper\": 0.045,\n    \"choline\": 8.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 110\n    }\n  },\n  {\n    \"id\": 705,\n    \"name\": \"Frozen Mixed Vegetables\",\n    \"categoryId\": 700,\n    \"energy\": 72,\n    \"fat\": 0.52,\n    \"saturatedFat\": 0.098,\n    \"monounsaturatedFat\": 0.031,\n    \"polyunsaturatedFat\": 0.235,\n    \"carbs\": 13.47,\n    \"sugar\": 0,\n    \"fiber\": 4,\n    \"protein\": 3.33,\n    \"sodium\": 47,\n    \"cholesterol\": 0,\n    \"vitaminA\": 254,\n    \"vitaminB1\": 0.122,\n    \"vitaminB2\": 0.085,\n    \"vitaminB3\": 1.252,\n    \"vitaminB5\": 0.163,\n    \"vitaminB6\": 0.096,\n    \"vitaminB9\": 29,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 10.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 24,\n    \"calcium\": 25,\n    \"phosphorus\": 59,\n    \"potassium\": 212,\n    \"iron\": 0.95,\n    \"selenium\": 0.4,\n    \"zinc\": 0.45,\n    \"manganese\": 0.244,\n    \"copper\": 0.093,\n    \"choline\": 0\n  },\n  {\n    \"id\": 706,\n    \"name\": \"Onions\",\n    \"categoryId\": 700,\n    \"energy\": 40,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.042,\n    \"monounsaturatedFat\": 0.013,\n    \"polyunsaturatedFat\": 0.017,\n    \"carbs\": 9.34,\n    \"sugar\": 4.24,\n    \"fiber\": 1.7,\n    \"protein\": 1.1,\n    \"sodium\": 4,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.046,\n    \"vitaminB2\": 0.027,\n    \"vitaminB3\": 0.116,\n    \"vitaminB5\": 0.123,\n    \"vitaminB6\": 0.12,\n    \"vitaminB9\": 19,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 7.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.02,\n    \"vitaminK\": 0.4,\n    \"magnesium\": 10,\n    \"calcium\": 23,\n    \"phosphorus\": 29,\n    \"potassium\": 146,\n    \"iron\": 0.21,\n    \"selenium\": 0.5,\n    \"zinc\": 0.17,\n    \"manganese\": 0.129,\n    \"copper\": 0.039,\n    \"choline\": 6.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 160\n    }\n  },\n  {\n    \"id\": 707,\n    \"name\": \"Broccoli\",\n    \"categoryId\": 700,\n    \"energy\": 34,\n    \"fat\": 0.37,\n    \"saturatedFat\": 0.114,\n    \"monounsaturatedFat\": 0.031,\n    \"polyunsaturatedFat\": 0.112,\n    \"carbs\": 6.64,\n    \"sugar\": 1.7,\n    \"fiber\": 2.6,\n    \"protein\": 2.82,\n    \"sodium\": 33,\n    \"cholesterol\": 0,\n    \"vitaminA\": 31,\n    \"vitaminB1\": 0.071,\n    \"vitaminB2\": 0.117,\n    \"vitaminB3\": 0.639,\n    \"vitaminB5\": 0.573,\n    \"vitaminB6\": 0.175,\n    \"vitaminB9\": 63,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 89.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.78,\n    \"vitaminK\": 101.6,\n    \"magnesium\": 21,\n    \"calcium\": 47,\n    \"phosphorus\": 66,\n    \"potassium\": 316,\n    \"iron\": 0.73,\n    \"selenium\": 2.5,\n    \"zinc\": 0.41,\n    \"manganese\": 0.21,\n    \"copper\": 0.049,\n    \"choline\": 18.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 44\n    }\n  },\n  {\n    \"id\": 708,\n    \"name\": \"Green Beans\",\n    \"categoryId\": 700,\n    \"energy\": 31,\n    \"fat\": 0.22,\n    \"saturatedFat\": 0.05,\n    \"monounsaturatedFat\": 0.01,\n    \"polyunsaturatedFat\": 0.113,\n    \"carbs\": 6.97,\n    \"sugar\": 3.26,\n    \"fiber\": 2.7,\n    \"protein\": 1.83,\n    \"sodium\": 6,\n    \"cholesterol\": 0,\n    \"vitaminA\": 35,\n    \"vitaminB1\": 0.082,\n    \"vitaminB2\": 0.104,\n    \"vitaminB3\": 0.734,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.141,\n    \"vitaminB9\": 33,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 12.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.41,\n    \"vitaminK\": 43,\n    \"magnesium\": 25,\n    \"calcium\": 37,\n    \"phosphorus\": 38,\n    \"potassium\": 211,\n    \"iron\": 1.03,\n    \"selenium\": 0.6,\n    \"zinc\": 0.24,\n    \"manganese\": 0,\n    \"copper\": 0.069,\n    \"choline\": 15.3\n  },\n  {\n    \"id\": 709,\n    \"name\": \"Russet Potatoes\",\n    \"categoryId\": 700,\n    \"energy\": 79,\n    \"fat\": 0.08,\n    \"saturatedFat\": 0.026,\n    \"monounsaturatedFat\": 0.002,\n    \"polyunsaturatedFat\": 0.043,\n    \"carbs\": 18.07,\n    \"sugar\": 0.62,\n    \"fiber\": 1.3,\n    \"protein\": 2.14,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.082,\n    \"vitaminB2\": 0.033,\n    \"vitaminB3\": 1.035,\n    \"vitaminB5\": 0.301,\n    \"vitaminB6\": 0.345,\n    \"vitaminB9\": 14,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 5.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.01,\n    \"vitaminK\": 1.8,\n    \"magnesium\": 23,\n    \"calcium\": 13,\n    \"phosphorus\": 55,\n    \"potassium\": 417,\n    \"iron\": 0.86,\n    \"selenium\": 0.4,\n    \"zinc\": 0.29,\n    \"manganese\": 0.157,\n    \"copper\": 0.103,\n    \"choline\": 12.6,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 75\n    }\n  },\n  {\n    \"id\": 710,\n    \"name\": \"Spinach\",\n    \"categoryId\": 700,\n    \"energy\": 23,\n    \"fat\": 0.39,\n    \"saturatedFat\": 0.063,\n    \"monounsaturatedFat\": 0.01,\n    \"polyunsaturatedFat\": 0.165,\n    \"carbs\": 3.63,\n    \"sugar\": 0.42,\n    \"fiber\": 2.2,\n    \"protein\": 2.86,\n    \"sodium\": 79,\n    \"cholesterol\": 0,\n    \"vitaminA\": 469,\n    \"vitaminB1\": 0.078,\n    \"vitaminB2\": 0.189,\n    \"vitaminB3\": 0.724,\n    \"vitaminB5\": 0.065,\n    \"vitaminB6\": 0.195,\n    \"vitaminB9\": 194,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 28.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 2.03,\n    \"vitaminK\": 482.9,\n    \"magnesium\": 79,\n    \"calcium\": 99,\n    \"phosphorus\": 49,\n    \"potassium\": 558,\n    \"iron\": 2.71,\n    \"selenium\": 1,\n    \"zinc\": 0.53,\n    \"manganese\": 0.897,\n    \"copper\": 0.13,\n    \"choline\": 19.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 30\n    }\n  },\n  {\n    \"id\": 711,\n    \"name\": \"Bell Peppers\",\n    \"categoryId\": 700,\n    \"energy\": 18,\n    \"fat\": 0,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 4.71,\n    \"sugar\": 2.35,\n    \"fiber\": 1.2,\n    \"protein\": 1.18,\n    \"sodium\": 0,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0,\n    \"vitaminB2\": 0,\n    \"vitaminB3\": 0,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0,\n    \"vitaminB9\": 0,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 77.6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 0,\n    \"calcium\": 0,\n    \"phosphorus\": 0,\n    \"potassium\": 0,\n    \"iron\": 0.42,\n    \"selenium\": 0,\n    \"zinc\": 0,\n    \"manganese\": 0,\n    \"copper\": 0,\n    \"choline\": 0\n  },\n  {\n    \"id\": 712,\n    \"name\": \"Celery\",\n    \"categoryId\": 700,\n    \"energy\": 14,\n    \"fat\": 0.17,\n    \"saturatedFat\": 0.042,\n    \"monounsaturatedFat\": 0.032,\n    \"polyunsaturatedFat\": 0.079,\n    \"carbs\": 2.97,\n    \"sugar\": 1.34,\n    \"fiber\": 1.6,\n    \"protein\": 0.69,\n    \"sodium\": 80,\n    \"cholesterol\": 0,\n    \"vitaminA\": 22,\n    \"vitaminB1\": 0.021,\n    \"vitaminB2\": 0.057,\n    \"vitaminB3\": 0.32,\n    \"vitaminB5\": 0.246,\n    \"vitaminB6\": 0.074,\n    \"vitaminB9\": 36,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 3.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.27,\n    \"vitaminK\": 29.3,\n    \"magnesium\": 11,\n    \"calcium\": 40,\n    \"phosphorus\": 24,\n    \"potassium\": 260,\n    \"iron\": 0.2,\n    \"selenium\": 0.4,\n    \"zinc\": 0.13,\n    \"manganese\": 0.103,\n    \"copper\": 0.035,\n    \"choline\": 6.1,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 7.5\n    }\n  },\n  {\n    \"id\": 713,\n    \"name\": \"Cabbage\",\n    \"categoryId\": 700,\n    \"energy\": 25,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.034,\n    \"monounsaturatedFat\": 0.017,\n    \"polyunsaturatedFat\": 0.017,\n    \"carbs\": 5.8,\n    \"sugar\": 3.2,\n    \"fiber\": 2.5,\n    \"protein\": 1.28,\n    \"sodium\": 18,\n    \"cholesterol\": 0,\n    \"vitaminA\": 5,\n    \"vitaminB1\": 0.061,\n    \"vitaminB2\": 0.04,\n    \"vitaminB3\": 0.234,\n    \"vitaminB5\": 0.212,\n    \"vitaminB6\": 0.124,\n    \"vitaminB9\": 43,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 36.6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.15,\n    \"vitaminK\": 76,\n    \"magnesium\": 12,\n    \"calcium\": 40,\n    \"phosphorus\": 26,\n    \"potassium\": 170,\n    \"iron\": 0.47,\n    \"selenium\": 0.3,\n    \"zinc\": 0.18,\n    \"manganese\": 0.16,\n    \"copper\": 0.019,\n    \"choline\": 10.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 89\n    }\n  },\n  {\n    \"id\": 714,\n    \"name\": \"White Mushrooms\",\n    \"categoryId\": 700,\n    \"energy\": 22,\n    \"fat\": 0.34,\n    \"saturatedFat\": 0.05,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0.16,\n    \"carbs\": 3.26,\n    \"sugar\": 1.98,\n    \"fiber\": 1,\n    \"protein\": 3.09,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.081,\n    \"vitaminB2\": 0.402,\n    \"vitaminB3\": 3.607,\n    \"vitaminB5\": 1.497,\n    \"vitaminB6\": 0.104,\n    \"vitaminB9\": 17,\n    \"vitaminB12\": 0.04,\n    \"vitaminC\": 2.1,\n    \"vitaminD\": 0.2,\n    \"vitaminE\": 0.01,\n    \"vitaminK\": 0,\n    \"magnesium\": 9,\n    \"calcium\": 3,\n    \"phosphorus\": 86,\n    \"potassium\": 318,\n    \"iron\": 0.5,\n    \"selenium\": 9.3,\n    \"zinc\": 0.52,\n    \"manganese\": 0.047,\n    \"copper\": 0.318,\n    \"choline\": 17.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 70\n    }\n  },\n  {\n    \"id\": 715,\n    \"name\": \"Cucumber (peeled)\",\n    \"categoryId\": 700,\n    \"energy\": 10,\n    \"fat\": 0.16,\n    \"saturatedFat\": 0.078,\n    \"monounsaturatedFat\": 0.01,\n    \"polyunsaturatedFat\": 0.019,\n    \"carbs\": 2.16,\n    \"sugar\": 1.38,\n    \"fiber\": 0.7,\n    \"protein\": 0.59,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 4,\n    \"vitaminB1\": 0.031,\n    \"vitaminB2\": 0.025,\n    \"vitaminB3\": 0.037,\n    \"vitaminB5\": 0.24,\n    \"vitaminB6\": 0.051,\n    \"vitaminB9\": 14,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 3.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.03,\n    \"vitaminK\": 7.2,\n    \"magnesium\": 12,\n    \"calcium\": 14,\n    \"phosphorus\": 21,\n    \"potassium\": 136,\n    \"iron\": 0.22,\n    \"selenium\": 0.1,\n    \"zinc\": 0.17,\n    \"manganese\": 0.073,\n    \"copper\": 0.071,\n    \"choline\": 5.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 119\n    }\n  },\n  {\n    \"id\": 716,\n    \"name\": \"Cucumber (with peel)\",\n    \"categoryId\": 700,\n    \"energy\": 15,\n    \"fat\": 0.11,\n    \"saturatedFat\": 0.037,\n    \"monounsaturatedFat\": 0.005,\n    \"polyunsaturatedFat\": 0.032,\n    \"carbs\": 3.63,\n    \"sugar\": 1.67,\n    \"fiber\": 0.5,\n    \"protein\": 0.65,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 5,\n    \"vitaminB1\": 0.027,\n    \"vitaminB2\": 0.033,\n    \"vitaminB3\": 0.098,\n    \"vitaminB5\": 0.259,\n    \"vitaminB6\": 0.04,\n    \"vitaminB9\": 7,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 2.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.03,\n    \"vitaminK\": 16.4,\n    \"magnesium\": 13,\n    \"calcium\": 16,\n    \"phosphorus\": 24,\n    \"potassium\": 147,\n    \"iron\": 0.28,\n    \"selenium\": 0.3,\n    \"zinc\": 0.2,\n    \"manganese\": 0.079,\n    \"copper\": 0.041,\n    \"choline\": 6,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 52\n    }\n  },\n  {\n    \"id\": 717,\n    \"name\": \"Eggplant\",\n    \"categoryId\": 700,\n    \"energy\": 25,\n    \"fat\": 0.18,\n    \"saturatedFat\": 0.034,\n    \"monounsaturatedFat\": 0.016,\n    \"polyunsaturatedFat\": 0.076,\n    \"carbs\": 5.88,\n    \"sugar\": 3.53,\n    \"fiber\": 3,\n    \"protein\": 0.98,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 1,\n    \"vitaminB1\": 0.039,\n    \"vitaminB2\": 0.037,\n    \"vitaminB3\": 0.649,\n    \"vitaminB5\": 0.281,\n    \"vitaminB6\": 0.084,\n    \"vitaminB9\": 22,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 2.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.3,\n    \"vitaminK\": 3.5,\n    \"magnesium\": 14,\n    \"calcium\": 9,\n    \"phosphorus\": 24,\n    \"potassium\": 229,\n    \"iron\": 0.23,\n    \"selenium\": 0.3,\n    \"zinc\": 0.16,\n    \"manganese\": 0.232,\n    \"copper\": 0.081,\n    \"choline\": 6.9,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 82\n    }\n  },\n  {\n    \"id\": 718,\n    \"name\": \"Peas\",\n    \"categoryId\": 700,\n    \"energy\": 81,\n    \"fat\": 0.4,\n    \"saturatedFat\": 0.071,\n    \"monounsaturatedFat\": 0.035,\n    \"polyunsaturatedFat\": 0.187,\n    \"carbs\": 14.45,\n    \"sugar\": 5.67,\n    \"fiber\": 5.7,\n    \"protein\": 5.42,\n    \"sodium\": 5,\n    \"cholesterol\": 0,\n    \"vitaminA\": 38,\n    \"vitaminB1\": 0.266,\n    \"vitaminB2\": 0.132,\n    \"vitaminB3\": 2.09,\n    \"vitaminB5\": 0.104,\n    \"vitaminB6\": 0.169,\n    \"vitaminB9\": 65,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 40,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.13,\n    \"vitaminK\": 24.8,\n    \"magnesium\": 33,\n    \"calcium\": 25,\n    \"phosphorus\": 108,\n    \"potassium\": 244,\n    \"iron\": 1.47,\n    \"selenium\": 1.8,\n    \"zinc\": 1.24,\n    \"manganese\": 0.41,\n    \"copper\": 0.176,\n    \"choline\": 28.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 145\n    }\n  },\n  {\n    \"id\": 719,\n    \"name\": \"Butternut Squash\",\n    \"categoryId\": 700,\n    \"energy\": 45,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.021,\n    \"monounsaturatedFat\": 0.007,\n    \"polyunsaturatedFat\": 0.042,\n    \"carbs\": 11.69,\n    \"sugar\": 2.2,\n    \"fiber\": 2,\n    \"protein\": 1,\n    \"sodium\": 4,\n    \"cholesterol\": 0,\n    \"vitaminA\": 532,\n    \"vitaminB1\": 0.1,\n    \"vitaminB2\": 0.02,\n    \"vitaminB3\": 1.2,\n    \"vitaminB5\": 0.4,\n    \"vitaminB6\": 0.154,\n    \"vitaminB9\": 27,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 21,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.44,\n    \"vitaminK\": 1.1,\n    \"magnesium\": 34,\n    \"calcium\": 48,\n    \"phosphorus\": 33,\n    \"potassium\": 352,\n    \"iron\": 0.7,\n    \"selenium\": 0.5,\n    \"zinc\": 0.15,\n    \"manganese\": 0.202,\n    \"copper\": 0.072,\n    \"choline\": 0,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 140\n    }\n  },\n  {\n    \"id\": 720,\n    \"name\": \"Sweet Potatoes\",\n    \"categoryId\": 700,\n    \"energy\": 86,\n    \"fat\": 0.05,\n    \"saturatedFat\": 0.018,\n    \"monounsaturatedFat\": 0.001,\n    \"polyunsaturatedFat\": 0.014,\n    \"carbs\": 20.12,\n    \"sugar\": 4.18,\n    \"fiber\": 3,\n    \"protein\": 1.57,\n    \"sodium\": 55,\n    \"cholesterol\": 0,\n    \"vitaminA\": 709,\n    \"vitaminB1\": 0.078,\n    \"vitaminB2\": 0.061,\n    \"vitaminB3\": 0.557,\n    \"vitaminB5\": 0.8,\n    \"vitaminB6\": 0.209,\n    \"vitaminB9\": 11,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 2.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.26,\n    \"vitaminK\": 1.8,\n    \"magnesium\": 25,\n    \"calcium\": 30,\n    \"phosphorus\": 47,\n    \"potassium\": 337,\n    \"iron\": 0.61,\n    \"selenium\": 0.6,\n    \"zinc\": 0.3,\n    \"manganese\": 0.258,\n    \"copper\": 0.151,\n    \"choline\": 12.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 133\n    }\n  },\n  {\n    \"id\": 721,\n    \"name\": \"Zucchini\",\n    \"categoryId\": 700,\n    \"energy\": 21,\n    \"fat\": 0.4,\n    \"saturatedFat\": 0.083,\n    \"monounsaturatedFat\": 0.031,\n    \"polyunsaturatedFat\": 0.169,\n    \"carbs\": 3.11,\n    \"sugar\": 0,\n    \"fiber\": 1.1,\n    \"protein\": 2.71,\n    \"sodium\": 3,\n    \"cholesterol\": 0,\n    \"vitaminA\": 25,\n    \"vitaminB1\": 0.042,\n    \"vitaminB2\": 0.036,\n    \"vitaminB3\": 0.705,\n    \"vitaminB5\": 0.367,\n    \"vitaminB6\": 0.142,\n    \"vitaminB9\": 20,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 34.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 33,\n    \"calcium\": 21,\n    \"phosphorus\": 93,\n    \"potassium\": 459,\n    \"iron\": 0.79,\n    \"selenium\": 0.3,\n    \"zinc\": 0.83,\n    \"manganese\": 0.196,\n    \"copper\": 0.097,\n    \"choline\": 0\n  },\n  {\n    \"id\": 722,\n    \"name\": \"Cauliflower\",\n    \"categoryId\": 700,\n    \"energy\": 25,\n    \"fat\": 0.28,\n    \"saturatedFat\": 0.13,\n    \"monounsaturatedFat\": 0.034,\n    \"polyunsaturatedFat\": 0.031,\n    \"carbs\": 4.97,\n    \"sugar\": 1.91,\n    \"fiber\": 2,\n    \"protein\": 1.92,\n    \"sodium\": 30,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.05,\n    \"vitaminB2\": 0.06,\n    \"vitaminB3\": 0.507,\n    \"vitaminB5\": 0.667,\n    \"vitaminB6\": 0.184,\n    \"vitaminB9\": 57,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 48.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.08,\n    \"vitaminK\": 15.5,\n    \"magnesium\": 15,\n    \"calcium\": 22,\n    \"phosphorus\": 44,\n    \"potassium\": 299,\n    \"iron\": 0.42,\n    \"selenium\": 0.6,\n    \"zinc\": 0.27,\n    \"manganese\": 0.155,\n    \"copper\": 0.039,\n    \"choline\": 44.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 107\n    }\n  },\n  {\n    \"id\": 723,\n    \"name\": \"Summer Squash\",\n    \"categoryId\": 700,\n    \"energy\": 16,\n    \"fat\": 0.18,\n    \"saturatedFat\": 0.044,\n    \"monounsaturatedFat\": 0.016,\n    \"polyunsaturatedFat\": 0.089,\n    \"carbs\": 3.35,\n    \"sugar\": 2.2,\n    \"fiber\": 1.1,\n    \"protein\": 1.21,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 10,\n    \"vitaminB1\": 0.048,\n    \"vitaminB2\": 0.142,\n    \"vitaminB3\": 0.487,\n    \"vitaminB5\": 0.155,\n    \"vitaminB6\": 0.218,\n    \"vitaminB9\": 29,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 17,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.12,\n    \"vitaminK\": 3,\n    \"magnesium\": 17,\n    \"calcium\": 15,\n    \"phosphorus\": 38,\n    \"potassium\": 262,\n    \"iron\": 0.35,\n    \"selenium\": 0.2,\n    \"zinc\": 0.29,\n    \"manganese\": 0.175,\n    \"copper\": 0.051,\n    \"choline\": 6.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 113\n    }\n  },\n  {\n    \"id\": 724,\n    \"name\": \"Asparagus\",\n    \"categoryId\": 700,\n    \"energy\": 20,\n    \"fat\": 0.12,\n    \"saturatedFat\": 0.04,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0.05,\n    \"carbs\": 3.88,\n    \"sugar\": 1.88,\n    \"fiber\": 2.1,\n    \"protein\": 2.2,\n    \"sodium\": 2,\n    \"cholesterol\": 0,\n    \"vitaminA\": 38,\n    \"vitaminB1\": 0.143,\n    \"vitaminB2\": 0.141,\n    \"vitaminB3\": 0.978,\n    \"vitaminB5\": 0.274,\n    \"vitaminB6\": 0.091,\n    \"vitaminB9\": 52,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 5.6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.13,\n    \"vitaminK\": 41.6,\n    \"magnesium\": 14,\n    \"calcium\": 24,\n    \"phosphorus\": 52,\n    \"potassium\": 202,\n    \"iron\": 2.14,\n    \"selenium\": 2.3,\n    \"zinc\": 0.54,\n    \"manganese\": 0.158,\n    \"copper\": 0.189,\n    \"choline\": 16,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 134\n    }\n  },\n  {\n    \"id\": 725,\n    \"name\": \"Shiitake Mushrooms\",\n    \"categoryId\": 700,\n    \"energy\": 34,\n    \"fat\": 0.49,\n    \"saturatedFat\": 0,\n    \"monounsaturatedFat\": 0,\n    \"polyunsaturatedFat\": 0,\n    \"carbs\": 6.79,\n    \"sugar\": 2.38,\n    \"fiber\": 2.5,\n    \"protein\": 2.24,\n    \"sodium\": 9,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.015,\n    \"vitaminB2\": 0.217,\n    \"vitaminB3\": 3.877,\n    \"vitaminB5\": 1.5,\n    \"vitaminB6\": 0.293,\n    \"vitaminB9\": 13,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 0,\n    \"vitaminD\": 0.4,\n    \"vitaminE\": 0,\n    \"vitaminK\": 0,\n    \"magnesium\": 20,\n    \"calcium\": 2,\n    \"phosphorus\": 112,\n    \"potassium\": 304,\n    \"iron\": 0.41,\n    \"selenium\": 5.7,\n    \"zinc\": 1.03,\n    \"manganese\": 0.23,\n    \"copper\": 0.142,\n    \"choline\": 0\n  },\n  {\n    \"id\": 726,\n    \"name\": \"Jalapeño Peppers\",\n    \"categoryId\": 700,\n    \"energy\": 29,\n    \"fat\": 0.37,\n    \"saturatedFat\": 0.092,\n    \"monounsaturatedFat\": 0.029,\n    \"polyunsaturatedFat\": 0.112,\n    \"carbs\": 6.5,\n    \"sugar\": 4.12,\n    \"fiber\": 2.8,\n    \"protein\": 0.91,\n    \"sodium\": 3,\n    \"cholesterol\": 0,\n    \"vitaminA\": 54,\n    \"vitaminB1\": 0.04,\n    \"vitaminB2\": 0.07,\n    \"vitaminB3\": 1.28,\n    \"vitaminB5\": 0.315,\n    \"vitaminB6\": 0.419,\n    \"vitaminB9\": 27,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 118.6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 3.58,\n    \"vitaminK\": 18.5,\n    \"magnesium\": 15,\n    \"calcium\": 12,\n    \"phosphorus\": 26,\n    \"potassium\": 248,\n    \"iron\": 0.25,\n    \"selenium\": 0.4,\n    \"zinc\": 0.14,\n    \"manganese\": 0.097,\n    \"copper\": 0.046,\n    \"choline\": 7.5,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 90\n    }\n  },\n  {\n    \"id\": 727,\n    \"name\": \"Kale\",\n    \"categoryId\": 700,\n    \"energy\": 35,\n    \"fat\": 1.49,\n    \"saturatedFat\": 0.178,\n    \"monounsaturatedFat\": 0.104,\n    \"polyunsaturatedFat\": 0.673,\n    \"carbs\": 4.42,\n    \"sugar\": 0.99,\n    \"fiber\": 4.1,\n    \"protein\": 2.92,\n    \"sodium\": 53,\n    \"cholesterol\": 0,\n    \"vitaminA\": 241,\n    \"vitaminB1\": 0.113,\n    \"vitaminB2\": 0.347,\n    \"vitaminB3\": 1.18,\n    \"vitaminB5\": 0.37,\n    \"vitaminB6\": 0.147,\n    \"vitaminB9\": 62,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 93.4,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.66,\n    \"vitaminK\": 389.6,\n    \"magnesium\": 33,\n    \"calcium\": 254,\n    \"phosphorus\": 55,\n    \"potassium\": 348,\n    \"iron\": 1.6,\n    \"selenium\": 0.9,\n    \"zinc\": 0.39,\n    \"manganese\": 0.92,\n    \"copper\": 0.053,\n    \"choline\": 0.5,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 21\n    }\n  },\n  {\n    \"id\": 728,\n    \"name\": \"Red Peppers\",\n    \"categoryId\": 700,\n    \"energy\": 26,\n    \"fat\": 0.3,\n    \"saturatedFat\": 0.059,\n    \"monounsaturatedFat\": 0.007,\n    \"polyunsaturatedFat\": 0.156,\n    \"carbs\": 6.03,\n    \"sugar\": 4.2,\n    \"fiber\": 2.1,\n    \"protein\": 0.99,\n    \"sodium\": 4,\n    \"cholesterol\": 0,\n    \"vitaminA\": 157,\n    \"vitaminB1\": 0.054,\n    \"vitaminB2\": 0.085,\n    \"vitaminB3\": 0.979,\n    \"vitaminB5\": 0.317,\n    \"vitaminB6\": 0.291,\n    \"vitaminB9\": 46,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 127.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.58,\n    \"vitaminK\": 4.9,\n    \"magnesium\": 12,\n    \"calcium\": 7,\n    \"phosphorus\": 26,\n    \"potassium\": 211,\n    \"iron\": 0.43,\n    \"selenium\": 0.1,\n    \"zinc\": 0.25,\n    \"manganese\": 0.112,\n    \"copper\": 0.017,\n    \"choline\": 5.6,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 9.3\n    }\n  },\n  {\n    \"id\": 729,\n    \"name\": \"Radishes\",\n    \"categoryId\": 700,\n    \"energy\": 16,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.032,\n    \"monounsaturatedFat\": 0.017,\n    \"polyunsaturatedFat\": 0.048,\n    \"carbs\": 3.4,\n    \"sugar\": 1.86,\n    \"fiber\": 1.6,\n    \"protein\": 0.68,\n    \"sodium\": 39,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.012,\n    \"vitaminB2\": 0.039,\n    \"vitaminB3\": 0.254,\n    \"vitaminB5\": 0.165,\n    \"vitaminB6\": 0.071,\n    \"vitaminB9\": 25,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 14.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0,\n    \"vitaminK\": 1.3,\n    \"magnesium\": 10,\n    \"calcium\": 25,\n    \"phosphorus\": 20,\n    \"potassium\": 233,\n    \"iron\": 0.34,\n    \"selenium\": 0.6,\n    \"zinc\": 0.28,\n    \"manganese\": 0.069,\n    \"copper\": 0.05,\n    \"choline\": 6.5,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 116\n    }\n  },\n  {\n    \"id\": 730,\n    \"name\": \"Artichokes\",\n    \"categoryId\": 700,\n    \"energy\": 47,\n    \"fat\": 0.15,\n    \"saturatedFat\": 0.036,\n    \"monounsaturatedFat\": 0.005,\n    \"polyunsaturatedFat\": 0.064,\n    \"carbs\": 10.51,\n    \"sugar\": 0.99,\n    \"fiber\": 5.4,\n    \"protein\": 3.27,\n    \"sodium\": 94,\n    \"cholesterol\": 0,\n    \"vitaminA\": 1,\n    \"vitaminB1\": 0.072,\n    \"vitaminB2\": 0.066,\n    \"vitaminB3\": 1.046,\n    \"vitaminB5\": 0.338,\n    \"vitaminB6\": 0.116,\n    \"vitaminB9\": 68,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 11.7,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.19,\n    \"vitaminK\": 14.8,\n    \"magnesium\": 60,\n    \"calcium\": 44,\n    \"phosphorus\": 90,\n    \"potassium\": 370,\n    \"iron\": 1.28,\n    \"selenium\": 0.2,\n    \"zinc\": 0.49,\n    \"manganese\": 0.256,\n    \"copper\": 0.231,\n    \"choline\": 34.4\n  },\n  {\n    \"id\": 731,\n    \"name\": \"Chicory\",\n    \"categoryId\": 700,\n    \"energy\": 23,\n    \"fat\": 0.3,\n    \"saturatedFat\": 0.073,\n    \"monounsaturatedFat\": 0.006,\n    \"polyunsaturatedFat\": 0.131,\n    \"carbs\": 4.7,\n    \"sugar\": 0.7,\n    \"fiber\": 4,\n    \"protein\": 1.7,\n    \"sodium\": 45,\n    \"cholesterol\": 0,\n    \"vitaminA\": 286,\n    \"vitaminB1\": 0.06,\n    \"vitaminB2\": 0.1,\n    \"vitaminB3\": 0.5,\n    \"vitaminB5\": 1.159,\n    \"vitaminB6\": 0.105,\n    \"vitaminB9\": 110,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 24,\n    \"vitaminD\": 0,\n    \"vitaminE\": 2.26,\n    \"vitaminK\": 297.6,\n    \"magnesium\": 30,\n    \"calcium\": 100,\n    \"phosphorus\": 47,\n    \"potassium\": 420,\n    \"iron\": 0.9,\n    \"selenium\": 0.3,\n    \"zinc\": 0.42,\n    \"manganese\": 0.429,\n    \"copper\": 0.295,\n    \"choline\": 12.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 29\n    }\n  },\n  {\n    \"id\": 732,\n    \"name\": \"Arugula\",\n    \"categoryId\": 700,\n    \"energy\": 25,\n    \"fat\": 0.66,\n    \"saturatedFat\": 0.086,\n    \"monounsaturatedFat\": 0.049,\n    \"polyunsaturatedFat\": 0.319,\n    \"carbs\": 3.65,\n    \"sugar\": 2.05,\n    \"fiber\": 1.6,\n    \"protein\": 2.58,\n    \"sodium\": 27,\n    \"cholesterol\": 0,\n    \"vitaminA\": 119,\n    \"vitaminB1\": 0.044,\n    \"vitaminB2\": 0.086,\n    \"vitaminB3\": 0.305,\n    \"vitaminB5\": 0.437,\n    \"vitaminB6\": 0.073,\n    \"vitaminB9\": 97,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 15,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.43,\n    \"vitaminK\": 108.6,\n    \"magnesium\": 47,\n    \"calcium\": 160,\n    \"phosphorus\": 52,\n    \"potassium\": 369,\n    \"iron\": 1.46,\n    \"selenium\": 0.3,\n    \"zinc\": 0.47,\n    \"manganese\": 0.321,\n    \"copper\": 0.076,\n    \"choline\": 15.3,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 10\n    }\n  },\n  {\n    \"id\": 733,\n    \"name\": \"Pumpkin\",\n    \"categoryId\": 700,\n    \"energy\": 26,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.052,\n    \"monounsaturatedFat\": 0.013,\n    \"polyunsaturatedFat\": 0.005,\n    \"carbs\": 6.5,\n    \"sugar\": 2.76,\n    \"fiber\": 0.5,\n    \"protein\": 1,\n    \"sodium\": 1,\n    \"cholesterol\": 0,\n    \"vitaminA\": 426,\n    \"vitaminB1\": 0.05,\n    \"vitaminB2\": 0.11,\n    \"vitaminB3\": 0.6,\n    \"vitaminB5\": 0.298,\n    \"vitaminB6\": 0.061,\n    \"vitaminB9\": 16,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 9,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.06,\n    \"vitaminK\": 1.1,\n    \"magnesium\": 12,\n    \"calcium\": 21, \n    \"phosphorus\": 44,\n    \"potassium\": 340,\n    \"iron\": 0.8,\n    \"selenium\": 0.3,\n    \"zinc\": 0.32,\n    \"manganese\": 0.125,\n    \"copper\": 0.127,\n    \"choline\": 8.2,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 116\n    }\n  },\n  {\n    \"id\": 734,\n    \"name\": \"Turnips\",\n    \"categoryId\": 700,\n    \"energy\": 28,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.011,\n    \"monounsaturatedFat\": 0.006,\n    \"polyunsaturatedFat\": 0.053,\n    \"carbs\": 6.43,\n    \"sugar\": 3.8,\n    \"fiber\": 1.8,\n    \"protein\": 0.9,\n    \"sodium\": 67,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.04,\n    \"vitaminB2\": 0.03,\n    \"vitaminB3\": 0.4,\n    \"vitaminB5\": 0.2,\n    \"vitaminB6\": 0.09,\n    \"vitaminB9\": 15,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 21,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.03,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 11,\n    \"calcium\": 30,\n    \"phosphorus\": 27,\n    \"potassium\": 191,\n    \"iron\": 0.3,\n    \"selenium\": 0.7,\n    \"zinc\": 0.27,\n    \"manganese\": 0.134,\n    \"copper\": 0.085,\n    \"choline\": 11.1,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 130\n    }\n  },\n  {\n    \"id\": 735,\n    \"name\": \"Scallions\",\n    \"categoryId\": 700,\n    \"energy\": 32,\n    \"fat\": 0.19,\n    \"saturatedFat\": 0.032,\n    \"monounsaturatedFat\": 0.027,\n    \"polyunsaturatedFat\": 0.074,\n    \"carbs\": 7.34,\n    \"sugar\": 2.33,\n    \"fiber\": 2.6,\n    \"protein\": 1.83,\n    \"sodium\": 16,\n    \"cholesterol\": 0,\n    \"vitaminA\": 50,\n    \"vitaminB1\": 0.055,\n    \"vitaminB2\": 0.08,\n    \"vitaminB3\": 0.525,\n    \"vitaminB5\": 0.075,\n    \"vitaminB6\": 0.061,\n    \"vitaminB9\": 64,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 18.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.55,\n    \"vitaminK\": 207,\n    \"magnesium\": 20,\n    \"calcium\": 72,\n    \"phosphorus\": 37,\n    \"potassium\": 276,\n    \"iron\": 1.48,\n    \"selenium\": 0.6,\n    \"zinc\": 0.39,\n    \"manganese\": 0.16,\n    \"copper\": 0.083,\n    \"choline\": 5.7,\n    \"volume\": {\n      \"portionId\": \"tablespoons\",\n      \"weightInGrams\": 6\n    }\n  },\n  {\n    \"id\": 736,\n    \"name\": \"Iceberg Lettuce\",\n    \"categoryId\": 700,\n    \"energy\": 14,\n    \"fat\": 0.14,\n    \"saturatedFat\": 0.018,\n    \"monounsaturatedFat\": 0.006,\n    \"polyunsaturatedFat\": 0.074,\n    \"carbs\": 2.97,\n    \"sugar\": 1.97,\n    \"fiber\": 1.2,\n    \"protein\": 0.9,\n    \"sodium\": 10,\n    \"cholesterol\": 0,\n    \"vitaminA\": 25,\n    \"vitaminB1\": 0.041,\n    \"vitaminB2\": 0.025,\n    \"vitaminB3\": 0.123,\n    \"vitaminB5\": 0.091,\n    \"vitaminB6\": 0.042,\n    \"vitaminB9\": 29,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 2.8,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.18,\n    \"vitaminK\": 24.1,\n    \"magnesium\": 7,\n    \"calcium\": 18,\n    \"phosphorus\": 20,\n    \"potassium\": 141,\n    \"iron\": 0.41,\n    \"selenium\": 0.1,\n    \"zinc\": 0.15,\n    \"manganese\": 0.125,\n    \"copper\": 0.025,\n    \"choline\": 6.7,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 57\n    }\n  },\n  {\n    \"id\": 737,\n    \"name\": \"Ginger Root\",\n    \"categoryId\": 700,\n    \"energy\": 80,\n    \"fat\": 0.75,\n    \"saturatedFat\": 0.203,\n    \"monounsaturatedFat\": 0.154,\n    \"polyunsaturatedFat\": 0.154,\n    \"carbs\": 17.77,\n    \"sugar\": 1.7,\n    \"fiber\": 2,\n    \"protein\": 1.82,\n    \"sodium\": 13,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.025,\n    \"vitaminB2\": 0.034,\n    \"vitaminB3\": 0.75,\n    \"vitaminB5\": 0.203,\n    \"vitaminB6\": 0.16,\n    \"vitaminB9\": 11,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 5,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.26,\n    \"vitaminK\": 0.1,\n    \"magnesium\": 43,\n    \"calcium\": 16,\n    \"phosphorus\": 34,\n    \"potassium\": 415,\n    \"iron\": 0.6,\n    \"selenium\": 0.7,\n    \"zinc\": 0.34,\n    \"manganese\": 0.229,\n    \"copper\": 0.226,\n    \"choline\": 28.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 24\n    }\n  },\n  {\n    \"id\": 738,\n    \"name\": \"Red Potatoes\",\n    \"categoryId\": 700,\n    \"energy\": 70,\n    \"fat\": 0.14,\n    \"saturatedFat\": 0.035,\n    \"monounsaturatedFat\": 0.003,\n    \"polyunsaturatedFat\": 0.059,\n    \"carbs\": 15.9,\n    \"sugar\": 1.29,\n    \"fiber\": 1.7,\n    \"protein\": 1.89,\n    \"sodium\": 18,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.081,\n    \"vitaminB2\": 0.031,\n    \"vitaminB3\": 1.149,\n    \"vitaminB5\": 0.279,\n    \"vitaminB6\": 0.17,\n    \"vitaminB9\": 18,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 8.6,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.01,\n    \"vitaminK\": 2.9,\n    \"magnesium\": 22,\n    \"calcium\": 10,\n    \"phosphorus\": 61,\n    \"potassium\": 455,\n    \"iron\": 0.73,\n    \"selenium\": 0.5,\n    \"zinc\": 0.33,\n    \"manganese\": 0.141,\n    \"copper\": 0.134,\n    \"choline\": 16.4,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 75\n    }\n  },\n  {\n    \"id\": 739,\n    \"name\": \"Veggie Burger\",\n    \"categoryId\": 700,\n    \"energy\": 177,\n    \"fat\": 6.3,\n    \"saturatedFat\": 1.44,\n    \"monounsaturatedFat\": 1.778,\n    \"polyunsaturatedFat\": 2.023,\n    \"carbs\": 14.27,\n    \"sugar\": 1.07,\n    \"fiber\": 4.9,\n    \"protein\": 15.7,\n    \"sodium\": 569,\n    \"cholesterol\": 5,\n    \"vitaminA\": 1,\n    \"vitaminB1\": 2.651,\n    \"vitaminB2\": 0.244,\n    \"vitaminB3\": 3.753,\n    \"vitaminB5\": 0,\n    \"vitaminB6\": 0.303,\n    \"vitaminB9\": 124,\n    \"vitaminB12\": 2.01,\n    \"vitaminC\": 4.5,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.23,\n    \"vitaminK\": 4.2,\n    \"magnesium\": 56,\n    \"calcium\": 136,\n    \"phosphorus\": 206,\n    \"potassium\": 333,\n    \"iron\": 2.41,\n    \"selenium\": 22.6,\n    \"zinc\": 1.26,\n    \"manganese\": 0,\n    \"copper\": 0.2,\n    \"choline\": 19.4\n  },\n  {\n    \"id\": 740,\n    \"name\": \"Pumpkin (canned)\",\n    \"categoryId\": 700,\n    \"energy\": 34,\n    \"fat\": 0.28,\n    \"saturatedFat\": 0.146,\n    \"monounsaturatedFat\": 0.037,\n    \"polyunsaturatedFat\": 0.015,\n    \"carbs\": 8.09,\n    \"sugar\": 3.3,\n    \"fiber\": 2.9,\n    \"protein\": 1.1,\n    \"sodium\": 241,\n    \"cholesterol\": 0,\n    \"vitaminA\": 778,\n    \"vitaminB1\": 0.024,\n    \"vitaminB2\": 0.054,\n    \"vitaminB3\": 0.367,\n    \"vitaminB5\": 0.4,\n    \"vitaminB6\": 0.056,\n    \"vitaminB9\": 12,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 4.2,\n    \"vitaminD\": 0,\n    \"vitaminE\": 1.06,\n    \"vitaminK\": 16,\n    \"magnesium\": 23,\n    \"calcium\": 26,\n    \"phosphorus\": 35,\n    \"potassium\": 206,\n    \"iron\": 1.39,\n    \"selenium\": 0.4,\n    \"zinc\": 0.17,\n    \"manganese\": 0.149,\n    \"copper\": 0.107,\n    \"choline\": 9.8,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 245\n    }\n  },\n  {\n    \"id\": 741,\n    \"name\": \"Chives\",\n    \"categoryId\": 700,\n    \"energy\": 30,\n    \"fat\": 0.73,\n    \"saturatedFat\": 0.146,\n    \"monounsaturatedFat\": 0.095,\n    \"polyunsaturatedFat\": 0.267,\n    \"carbs\": 4.35,\n    \"sugar\": 1.85,\n    \"fiber\": 2.5,\n    \"protein\": 3.27,\n    \"sodium\": 3,\n    \"cholesterol\": 0,\n    \"vitaminA\": 218,\n    \"vitaminB1\": 0.078,\n    \"vitaminB2\": 0.115,\n    \"vitaminB3\": 0.647,\n    \"vitaminB5\": 0.324,\n    \"vitaminB6\": 0.138,\n    \"vitaminB9\": 105,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 58.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.21,\n    \"vitaminK\": 212.7,\n    \"magnesium\": 42,\n    \"calcium\": 92,\n    \"phosphorus\": 58,\n    \"potassium\": 296,\n    \"iron\": 1.6,\n    \"selenium\": 0.9,\n    \"zinc\": 0.56,\n    \"manganese\": 0.373,\n    \"copper\": 0.157,\n    \"choline\": 5.2,\n    \"volume\": {\n      \"portionId\": \"teaspoons\",\n      \"weightInGrams\": 1\n    }\n  },\n  {\n    \"id\": 742,\n    \"name\": \"White Potatoes\",\n    \"categoryId\": 700,\n    \"energy\": 69,\n    \"fat\": 0.1,\n    \"saturatedFat\": 0.026,\n    \"monounsaturatedFat\": 0.002,\n    \"polyunsaturatedFat\": 0.043,\n    \"carbs\": 15.71,\n    \"sugar\": 1.15,\n    \"fiber\": 2.4,\n    \"protein\": 1.68,\n    \"sodium\": 16,\n    \"cholesterol\": 0,\n    \"vitaminA\": 0,\n    \"vitaminB1\": 0.071,\n    \"vitaminB2\": 0.034,\n    \"vitaminB3\": 1.066,\n    \"vitaminB5\": 0.281,\n    \"vitaminB6\": 0.203,\n    \"vitaminB9\": 18,\n    \"vitaminB12\": 0,\n    \"vitaminC\": 9.1,\n    \"vitaminD\": 0,\n    \"vitaminE\": 0.01,\n    \"vitaminK\": 1.6,\n    \"magnesium\": 21,\n    \"calcium\": 9,\n    \"phosphorus\": 62,\n    \"potassium\": 407,\n    \"iron\": 0.52,\n    \"selenium\": 0.3,\n    \"zinc\": 0.29,\n    \"manganese\": 0.145,\n    \"copper\": 0.116,\n    \"choline\": 11,\n    \"volume\": {\n      \"portionId\": \"cups\",\n      \"weightInGrams\": 75\n    }\n  }\n]"
  },
  {
    "path": "src/foods/foodForm.ts",
    "content": "import { Food, FoodId } from 'foods'\nimport { useForm } from 'react-hook-form'\nimport { object, string, number } from 'yup'\nimport { objectFromNutritionDataKeys, MappedNutritionData } from 'stats'\nimport { FoodVolumeForm, getFoodVolumeForm } from './foodVolumeForm'\n\ntype FoodForm = {\n  id?: FoodId\n  name: string\n  categoryId: number\n  servingSizeInGrams: string\n  volumeForm: FoodVolumeForm\n  url?: string\n} & MappedNutritionData<string>\n\nconst DEFAULT_SERVING_SIZE_IN_GRAMS = 100\n\nfunction getFoodForm(food?: Food) {\n  const volumeForm = getFoodVolumeForm(food?.volume)\n\n  if (food) {\n    const servingSizeInGrams =\n      food.servingSizeInGrams || DEFAULT_SERVING_SIZE_IN_GRAMS\n\n    return {\n      id: food.id,\n      name: food.name,\n      categoryId: food.categoryId,\n      servingSizeInGrams: servingSizeInGrams.toString(),\n      volumeForm,\n      url: food.url,\n      ...objectFromNutritionDataKeys(key => food[key].toString()),\n    }\n  }\n\n  return {\n    name: '',\n    categoryId: 0,\n    servingSizeInGrams: DEFAULT_SERVING_SIZE_IN_GRAMS.toString(),\n    ...objectFromNutritionDataKeys(() => '0'),\n    energy: '',\n    volumeForm,\n  }\n}\n\ntype FoodFormSchemaContext = {\n  allFoods: Food[]\n  food?: Food\n}\n\nconst foodFormSchema = object().shape({\n  name: string()\n    .required('Please add a name')\n    .test(\n      'uniqueName',\n      'This name has already been used',\n      (currentName, { options }) => {\n        if (currentName === undefined) {\n          return true\n        }\n\n        const { allFoods, food } = options.context as FoodFormSchemaContext\n\n        const sameFoodExists = allFoods.some(({ name, id }) => {\n          const haveSameNames = currentName.toLowerCase() === name.toLowerCase()\n          return food ? id !== food.id && haveSameNames : haveSameNames\n        })\n\n        return !sameFoodExists\n      }\n    ),\n  categoryId: number()\n    .notOneOf([0], 'Please select category')\n    .typeError('Please select category'),\n  energy: string().required('Please enter energy'),\n  servingSizeInGrams: string().required('Please enter a value'),\n})\n\nfunction useFoodForm(foodForm: FoodForm) {\n  const formMethods = useForm<FoodForm>({\n    defaultValues: foodForm,\n  })\n\n  return formMethods\n}\n\nexport type { FoodForm, FoodFormSchemaContext }\n\nexport {\n  useFoodForm,\n  getFoodForm,\n  foodFormSchema,\n  DEFAULT_SERVING_SIZE_IN_GRAMS,\n}\n"
  },
  {
    "path": "src/foods/foodVolumeForm.ts",
    "content": "import { FoodVolume } from 'foods'\n\ntype FoodVolumeForm = {\n  portionId: string\n  weightInGrams: string\n}\n\nfunction getFoodVolumeForm(foodVolume?: FoodVolume): FoodVolumeForm {\n  if (foodVolume) {\n    return {\n      portionId: foodVolume.portionId,\n      weightInGrams: foodVolume.weightInGrams.toString(),\n    }\n  }\n\n  return {\n    portionId: 'milliliters',\n    weightInGrams: '',\n  }\n}\n\nexport type { FoodVolumeForm }\n\nexport { getFoodVolumeForm }\n"
  },
  {
    "path": "src/foods/index.ts",
    "content": "export * from './foodForm'\nexport * from './useFoodsStore'\nexport { default as FoodInfo } from './FoodInfo'\nexport { default as FoodModal } from './FoodModal'\nexport * from './FoodModal'\nexport { default as FoodsList } from './FoodsList'\nexport * from './FoodsList'\nexport { default as FoodsDrawer } from './FoodsDrawer'\nexport * from './types'\nexport { default as builtInFoods } from './builtIn'\n"
  },
  {
    "path": "src/foods/persistence/FoodsListModal/Content.tsx",
    "content": "import {\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  ModalFooter,\n  ModalBody,\n  Button,\n  HStack,\n} from '@chakra-ui/react'\nimport { FoodsList, useFoods } from 'foods'\nimport { DownloadButton, getUntitledFileName } from 'persistence'\nimport { useState } from 'react'\n\ntype Action = 'import' | 'export'\n\ntype Props = {\n  onClose: () => void\n  title: string\n  onImport: () => void\n  action: Action\n}\n\nfunction Content({ onClose, title, onImport, action }: Props) {\n  const { allFoods } = useFoods()\n\n  const [blob] = useState(() => {\n    const allFoodsString = JSON.stringify(allFoods)\n    return new Blob([allFoodsString])\n  })\n\n  return (\n    <ModalContent>\n      <ModalHeader>{title}</ModalHeader>\n      <ModalCloseButton />\n\n      <ModalBody>\n        <FoodsList\n          allowsFiltering={false}\n          height=\"350px\"\n          itemUsageType=\"nonInteractive\"\n        />\n      </ModalBody>\n\n      <ModalFooter>\n        <HStack spacing={3}>\n          <Button onClick={onClose}>Close</Button>\n\n          {action === 'import' ? (\n            <Button\n              isDisabled={allFoods.length === 0}\n              variant=\"solid\"\n              colorScheme=\"teal\"\n              onClick={onImport}\n            >\n              {allFoods.length > 0\n                ? `Import ${allFoods.length} ${\n                    allFoods.length === 1 ? 'food' : 'foods'\n                  }`\n                : 'Import'}\n            </Button>\n          ) : (\n            <DownloadButton\n              blob={blob}\n              onClose={onClose}\n              fileName={getUntitledFileName({ prefix: 'foods' })}\n              label=\"Export\"\n              isDisabled={allFoods.length === 0}\n            />\n          )}\n        </HStack>\n      </ModalFooter>\n    </ModalContent>\n  )\n}\n\nexport type { Props }\n\nexport default Content\n"
  },
  {
    "path": "src/foods/persistence/FoodsListModal/index.tsx",
    "content": "import { Modal, ModalOverlay, useToast } from '@chakra-ui/react'\nimport { Food, FoodsStoreProvider, useFoods, useFoodsActions } from 'foods'\nimport { DEFAULT_FILTER, FoodsFilterStoreProvider } from 'foods-filters'\nimport Content from './Content'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  foodsToImport?: Food[]\n}\n\nfunction FoodsListModal({ onClose, isOpen, foodsToImport }: Props) {\n  const title = foodsToImport ? 'Import Foods' : 'Export Foods'\n  const { userFoods } = useFoods()\n  const foodsActions = useFoodsActions()\n  const toast = useToast()\n  const foods = foodsToImport || userFoods\n\n  function onImport() {\n    if (foodsToImport) {\n      foodsActions.setFoods(foodsToImport)\n      toast({\n        position: 'top',\n        status: 'success',\n        title: 'Foods imported',\n        isClosable: true,\n      })\n      onClose()\n    }\n  }\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      preserveScrollBarGap={true}\n      onClose={onClose}\n      scrollBehavior=\"inside\"\n    >\n      <ModalOverlay />\n\n      <FoodsFilterStoreProvider\n        initialFilter={{ ...DEFAULT_FILTER, onlyFoodsAddedByUser: true }}\n        shouldSaveFilter={false}\n      >\n        <FoodsStoreProvider initialFoods={foods}>\n          <Content\n            onClose={onClose}\n            title={title}\n            onImport={onImport}\n            action={foodsToImport ? 'import' : 'export'}\n          />\n        </FoodsStoreProvider>\n      </FoodsFilterStoreProvider>\n    </Modal>\n  )\n}\n\nexport type { Props }\n\nexport default FoodsListModal\n"
  },
  {
    "path": "src/foods/persistence/MissingFoodsModal.tsx",
    "content": "import {\n  Modal,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalFooter,\n  ModalBody,\n  ModalCloseButton,\n  Button,\n  Text,\n} from '@chakra-ui/react'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n  onImport: () => void\n}\n\nfunction MissingFoodsModal({ isOpen, onClose, onImport }: Props) {\n  return (\n    <Modal isOpen={isOpen} onClose={onClose} size=\"md\" isCentered>\n      <ModalOverlay />\n      <ModalContent>\n        <ModalHeader>Missing foods</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Text fontWeight=\"medium\">\n            The meal plan you contains foods that are not part of your list.\n          </Text>\n          <br />\n          <Text>\n            You can try to import the missing foods or continue without them.\n          </Text>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button onClick={onClose} mr={3}>\n            Continue\n          </Button>\n\n          <Button\n            variant=\"solid\"\n            colorScheme=\"teal\"\n            onClick={() => {\n              onImport()\n              onClose()\n            }}\n          >\n            Import foods\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </Modal>\n  )\n}\n\nexport default MissingFoodsModal\n"
  },
  {
    "path": "src/foods/persistence/index.ts",
    "content": "export { default as MissingFoodsModal } from './MissingFoodsModal'\nexport { default as useImportFoods } from './useImportFoods'\nexport { default as FoodsListModal } from './FoodsListModal'\nexport * from './FoodsListModal'\nexport { default as loadFoods } from './loadFoods'\n"
  },
  {
    "path": "src/foods/persistence/loadFoods.ts",
    "content": "import { builtInFoods } from 'foods'\n\nfunction loadFoods() {\n  const userFoodsString = localStorage.getItem('userFoods')\n\n  if (userFoodsString) {\n    const userFoods = JSON.parse(userFoodsString)\n    return [...userFoods, ...builtInFoods]\n  }\n\n  return builtInFoods\n}\n\nexport default loadFoods\n"
  },
  {
    "path": "src/foods/persistence/useImportFoods.ts",
    "content": "import { UseDisclosureReturn } from '@chakra-ui/hooks'\nimport { Food } from 'foods'\nimport { selectFile, readFile, useFileImportError } from 'persistence'\nimport { useState } from 'react'\n\ntype Params = {\n  foodsListModalDisclosure: UseDisclosureReturn\n}\n\nfunction useImportFoods({ foodsListModalDisclosure }: Params) {\n  const fileImportError = useFileImportError()\n  const [foodsToImport, setFoodsToImport] = useState<Food[]>()\n\n  async function onImport() {\n    const file = await selectFile('text/json')\n\n    try {\n      const text = await readFile(file)\n      const foodsToImport = JSON.parse(text) as Food[]\n      setFoodsToImport(foodsToImport)\n      foodsListModalDisclosure.onOpen()\n    } catch (error: any) {\n      fileImportError.onError({ error, file })\n    }\n  }\n\n  return {\n    onImport,\n    foodsToImport,\n  }\n}\n\nexport default useImportFoods\n"
  },
  {
    "path": "src/foods/types.ts",
    "content": "import { NutritionData } from 'stats'\n\ntype FoodId = string | number\n\ntype FoodVolume = {\n  portionId: string\n  weightInGrams: number\n}\n\ntype Food = {\n  id: FoodId\n  categoryId: number\n  name: string\n  addedByUser?: boolean\n  servingSizeInGrams?: number\n  volume?: FoodVolume\n  url?: string\n} & NutritionData\n\nexport type { Food, FoodId, FoodVolume }\n"
  },
  {
    "path": "src/foods/useFoodsStore.ts",
    "content": "import { Food, FoodId } from 'foods'\nimport { useState, useCallback, useMemo } from 'react'\nimport produce from 'immer'\nimport { makeStoreProvider, useCallbacksMemo } from 'general'\nimport { useSaveValue } from 'persistence'\n\ntype Params = {\n  initialFoods: Food[]\n}\n\nfunction sortedFoods(foods: Food[]) {\n  return [...foods].sort((food1, food2) => {\n    if (food1.categoryId === food2.categoryId) {\n      return food1.name.localeCompare(food2.name)\n    }\n\n    return food1.categoryId - food2.categoryId\n  })\n}\n\nfunction useFoodsStore({ initialFoods }: Params) {\n  const [foodsById, setFoodsById] = useState<Record<FoodId, Food>>(() => {\n    const initialMap: Record<FoodId, Food> = {}\n\n    for (const food of initialFoods) {\n      initialMap[food.id] = food\n    }\n\n    return initialMap\n  })\n\n  const setFoods = useCallback(\n    (foods: Food[]) =>\n      setFoodsById(\n        produce(draftFoodsById => {\n          for (const food of foods) {\n            draftFoodsById[food.id] = food\n          }\n        })\n      ),\n    []\n  )\n\n  const removeFood = useCallback(\n    (foodId: FoodId) =>\n      setFoodsById(\n        produce(draftFoodsById => {\n          delete draftFoodsById[foodId]\n        })\n      ),\n    []\n  )\n\n  const allFoods = useMemo(() => sortedFoods(Object.values(foodsById)), [\n    foodsById,\n  ])\n\n  const userFoods = useMemo(\n    () => sortedFoods(allFoods.filter(food => food.addedByUser)),\n    [allFoods]\n  )\n\n  useSaveValue({ value: userFoods, key: 'userFoods' })\n\n  const actions = useCallbacksMemo({ setFoods, removeFood })\n\n  const state = useCallbacksMemo({\n    allFoods,\n    userFoods,\n    foodsById,\n  })\n\n  return [state, actions] as const\n}\n\nconst [FoodsStoreProvider, useFoods, useFoodsActions] = makeStoreProvider(\n  useFoodsStore\n)\n\nexport { FoodsStoreProvider, useFoods, useFoodsActions }\n\nexport default useFoodsStore\n"
  },
  {
    "path": "src/foods-categories/FoodCategoriesSelect.tsx",
    "content": "import { SelectProps, Select } from '@chakra-ui/select'\nimport foodCategories from './categories.json'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = { forwardedRef?: ForwardedRef<HTMLSelectElement> } & SelectProps\n\nfunction FoodCategoriesSelect({ children, forwardedRef, ...rest }: Props) {\n  return (\n    <Select focusBorderColor=\"teal.500\" size=\"md\" ref={forwardedRef} {...rest}>\n      {children}\n      {foodCategories.map(category => (\n        <option key={category.id} value={category.id}>\n          {category.name}\n        </option>\n      ))}\n    </Select>\n  )\n}\n\nexport default forwardRef<HTMLSelectElement, Props>((props, ref) => (\n  <FoodCategoriesSelect forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/foods-categories/categories.json",
    "content": "[\n    { \"name\": \"Poultry\", \"id\": 100 },\n    { \"name\": \"Beef\", \"id\": 200 },\n    { \"name\": \"Pork\", \"id\": 300 },\n    { \"name\": \"Finfish & Shellfish\", \"id\": 400 },\n    { \"name\": \"Dairy and eggs\", \"id\": 500},\n    { \"name\": \"Grains & Pasta\", \"id\": 600},\n    { \"name\": \"Vegetables\", \"id\": 700 },\n    { \"name\": \"Legumes & Legume Products\", \"id\": 800 },\n    { \"name\": \"Fruits & Juices\", \"id\": 900 },\n    { \"name\": \"Nut and Seed Products\", \"id\": 1000  },\n    { \"name\": \"Fats & Oils\", \"id\": 2000  },\n    { \"name\": \"Baked Products\", \"id\": 3000 },\n    { \"name\": \"Sauces & Soups\", \"id\": 4000 },\n    { \"name\": \"Spices & Herbs\", \"id\": 5000 },\n    { \"name\": \"Sweets & Snacks\", \"id\": 6000 },\n    { \"name\": \"Beverages\", \"id\": 7000 },\n    { \"name\": \"Other\", \"id\": 8000 }\n]\n          \n "
  },
  {
    "path": "src/foods-categories/index.ts",
    "content": "export { default as FoodCategoriesSelect } from './FoodCategoriesSelect'\nexport * from './types'\nexport { default as foodCategories } from './categories.json'\n"
  },
  {
    "path": "src/foods-categories/types.ts",
    "content": "type FoodCategory = {\n  id: number\n  name: string\n  color: string\n}\n\nexport type { FoodCategory }\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/Content.tsx",
    "content": "import { VStack, Checkbox } from '@chakra-ui/react'\nimport { FoodCategoriesSelect } from 'foods-categories'\nimport { useFoodsFilter, useFoodsFilterActions } from 'foods-filters'\nimport { ChangeEvent, RefObject } from 'react'\n\ntype Props = {\n  selectRef: RefObject<HTMLSelectElement>\n}\n\nfunction Content({ selectRef }: Props) {\n  const filter = useFoodsFilter()\n  const foodsFilterActions = useFoodsFilterActions()\n\n  function onSelectChange(event: ChangeEvent<HTMLSelectElement>) {\n    const { value } = event.target\n    foodsFilterActions.updateFilter({ categoryId: Number(value) })\n  }\n\n  function onCheckboxChange(event: ChangeEvent<HTMLInputElement>) {\n    const { checked } = event.target\n    foodsFilterActions.updateFilter({ onlyFoodsAddedByUser: checked })\n  }\n\n  return (\n    <VStack spacing={5} p={1} alignItems=\"flex-start\">\n      <FoodCategoriesSelect\n        ref={selectRef}\n        flex={3}\n        onChange={onSelectChange}\n        value={filter.categoryId}\n      >\n        <option value={0}>All categories</option>\n      </FoodCategoriesSelect>\n\n      <Checkbox\n        onChange={onCheckboxChange}\n        colorScheme=\"teal\"\n        isChecked={Boolean(filter.onlyFoodsAddedByUser)}\n      >\n        Only items added by me\n      </Checkbox>\n    </VStack>\n  )\n}\n\nexport default Content\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/Footer.tsx",
    "content": "import { HStack, Button } from '@chakra-ui/react'\nimport {\n  nonQueryChangesCount,\n  useFoodsFilter,\n  useFoodsFilterActions,\n} from 'foods-filters'\n\ntype Props = {\n  onClose: () => void\n}\n\nfunction Footer({ onClose }: Props) {\n  const filter = useFoodsFilter()\n  const foodsFilterActions = useFoodsFilterActions()\n\n  const changesCount = nonQueryChangesCount(filter)\n\n  function onReset() {\n    foodsFilterActions.resetFilter()\n    onClose()\n  }\n\n  return (\n    <HStack spacing={3} justifyContent=\"flex-end\">\n      <Button variant=\"link\" isDisabled={changesCount === 0} onClick={onReset}>\n        Reset\n      </Button>\n      <Button variant=\"outline\" onClick={onClose}>\n        Close\n      </Button>\n    </HStack>\n  )\n}\n\nexport default Footer\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/Modal.tsx",
    "content": "import {\n  Modal as ModalBase,\n  ModalOverlay,\n  ModalContent,\n  ModalHeader,\n  ModalFooter,\n  ModalBody,\n  ModalCloseButton,\n} from '@chakra-ui/react'\nimport { useRef } from 'react'\nimport Content from './Content'\nimport Footer from './Footer'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n}\n\nfunction Modal({ isOpen, onClose }: Props) {\n  const selectRef = useRef<HTMLSelectElement>(null)\n\n  return (\n    <ModalBase isOpen={isOpen} onClose={onClose}>\n      <ModalOverlay />\n\n      <ModalContent>\n        <ModalHeader>Filters</ModalHeader>\n        <ModalCloseButton />\n        <ModalBody>\n          <Content selectRef={selectRef} />\n        </ModalBody>\n\n        <ModalFooter>\n          <Footer onClose={onClose} />\n        </ModalFooter>\n      </ModalContent>\n    </ModalBase>\n  )\n}\n\nexport default Modal\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/Popover.tsx",
    "content": "import {\n  Popover as PopoverBase,\n  PopoverTrigger,\n  PopoverContent,\n  PopoverHeader,\n  PopoverBody,\n  PopoverFooter,\n  PopoverArrow,\n  PopoverCloseButton,\n} from '@chakra-ui/react'\nimport { useRef } from 'react'\nimport Content from './Content'\nimport Trigger from './Trigger'\nimport Footer from './Footer'\n\nfunction Popover() {\n  const selectRef = useRef<HTMLSelectElement>(null)\n\n  return (\n    <PopoverBase placement=\"left\" initialFocusRef={selectRef}>\n      {({ onClose }) => {\n        return (\n          <>\n            <PopoverTrigger>\n              <Trigger />\n            </PopoverTrigger>\n\n            <PopoverContent boxShadow=\"lg\">\n              <PopoverArrow />\n              <PopoverCloseButton />\n              <PopoverHeader>Filters</PopoverHeader>\n\n              <PopoverBody>\n                <Content selectRef={selectRef} />\n              </PopoverBody>\n\n              <PopoverFooter border=\"0\">\n                <Footer onClose={onClose} />\n              </PopoverFooter>\n            </PopoverContent>\n          </>\n        )\n      }}\n    </PopoverBase>\n  )\n}\n\nexport default Popover\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/Trigger.tsx",
    "content": "import { Badge } from 'general'\nimport { IconButton } from '@chakra-ui/react'\nimport { Filter } from 'react-feather'\nimport { nonQueryChangesCount, useFoodsFilter } from 'foods-filters'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = {\n  onClick?: () => void\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n}\n\nfunction Trigger({ onClick, forwardedRef }: Props) {\n  const filter = useFoodsFilter()\n\n  const changesCount = nonQueryChangesCount(filter)\n\n  return (\n    <Badge ref={forwardedRef} count={changesCount}>\n      <IconButton\n        size=\"md\"\n        aria-label=\"Add variant\"\n        icon={<Filter size={20} pointerEvents=\"none\" />}\n        variant=\"outline\"\n        onClick={onClick}\n      />\n    </Badge>\n  )\n}\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <Trigger {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/foods-filters/FoodsFilterPopoverOrModal/index.tsx",
    "content": "import { useScreenSize, ScreenSize } from 'general'\nimport Modal from './Modal'\nimport Trigger from './Trigger'\nimport Popover from './Popover'\nimport { useDisclosure } from '@chakra-ui/hooks'\n\nfunction FoodsFilterPopoverOrModal() {\n  const screenSize = useScreenSize()\n  const modalDisclosure = useDisclosure()\n\n  if (screenSize < ScreenSize.Medium) {\n    return (\n      <>\n        <Trigger onClick={modalDisclosure.onOpen} />\n        <Modal\n          isOpen={modalDisclosure.isOpen}\n          onClose={modalDisclosure.onClose}\n        />\n      </>\n    )\n  }\n\n  return <Popover />\n}\n\nexport default FoodsFilterPopoverOrModal\n"
  },
  {
    "path": "src/foods-filters/foodsFilter.ts",
    "content": "const DEFAULT_FILTER: FoodsFilter = {\n  query: '',\n  onlyFoodsAddedByUser: false,\n  categoryId: 0,\n}\n\ntype FoodsFilter = {\n  categoryId?: number\n  onlyFoodsAddedByUser?: boolean\n  query: string\n}\n\nfunction nonQueryChangesCount(filter: FoodsFilter) {\n  let count = 0\n  const { categoryId, onlyFoodsAddedByUser } = filter\n\n  if (categoryId !== DEFAULT_FILTER.categoryId) {\n    count++\n  }\n\n  if (onlyFoodsAddedByUser !== DEFAULT_FILTER.onlyFoodsAddedByUser) {\n    count++\n  }\n\n  return count\n}\n\nexport type { FoodsFilter }\n\nexport { nonQueryChangesCount, DEFAULT_FILTER }\n"
  },
  {
    "path": "src/foods-filters/index.ts",
    "content": "export { default as useFilterFoods } from './useFilterFoods'\nexport * from './foodsFilter'\nexport { default as useFoodsFilterStore } from './useFoodsFilterStore'\nexport * from './useFoodsFilterStore'\nexport { default as FoodsFilterPopoverOrModal } from './FoodsFilterPopoverOrModal'\n"
  },
  {
    "path": "src/foods-filters/persistence/index.ts",
    "content": "export { default as loadFoodsFilter } from './loadFoodsFilter'\n"
  },
  {
    "path": "src/foods-filters/persistence/loadFoodsFilter.ts",
    "content": "import { DEFAULT_FILTER, FoodsFilter } from 'foods-filters'\n\nfunction loadFoodsFilter() {\n  const foodsFilterString = localStorage.getItem('foodsFilter')\n\n  if (foodsFilterString) {\n    const foodsFilter = JSON.parse(foodsFilterString) as FoodsFilter\n    return foodsFilter\n  }\n\n  return DEFAULT_FILTER\n}\n\nexport default loadFoodsFilter\n"
  },
  {
    "path": "src/foods-filters/useFilterFoods.ts",
    "content": "import Fuse from 'fuse.js'\nimport { useMemo } from 'react'\nimport { Food } from 'foods'\nimport { FoodsFilter } from './foodsFilter'\n\nconst OPTIONS = { keys: ['name'] }\n\nfunction groupFoodsByCategoryId(foods: Food[]) {\n  const foodsByCategoryIdMap: Record<number, Food[]> = {}\n\n  for (const food of foods) {\n    const { categoryId } = food\n\n    if (!foodsByCategoryIdMap[categoryId]) {\n      foodsByCategoryIdMap[categoryId] = []\n    }\n\n    foodsByCategoryIdMap[categoryId].push(food)\n  }\n\n  return foodsByCategoryIdMap\n}\n\nfunction useFilterFoods(\n  allFoods: Food[],\n  userFoods: Food[],\n  filter: FoodsFilter\n) {\n  const foodsToFilter = filter.onlyFoodsAddedByUser ? userFoods : allFoods\n\n  const fuse = useMemo(() => new Fuse(foodsToFilter, OPTIONS), [foodsToFilter])\n  const foodsByCategoryId = useMemo(\n    () => groupFoodsByCategoryId(foodsToFilter),\n    [foodsToFilter]\n  )\n\n  const { query, categoryId } = filter\n  if (!query) {\n    return categoryId ? foodsByCategoryId[categoryId] || [] : foodsToFilter\n  }\n\n  const foodsForQuery = fuse.search(query, { limit: 5 }).map(({ item }) => item)\n  if (!categoryId) {\n    return foodsForQuery\n  }\n\n  return foodsForQuery.filter(food => food.categoryId === categoryId)\n}\n\nexport type { FoodsFilter }\n\nexport default useFilterFoods\n"
  },
  {
    "path": "src/foods-filters/useFoodsFilterStore.ts",
    "content": "import { useCallback, useState } from 'react'\nimport { FoodsFilter, DEFAULT_FILTER } from './foodsFilter'\nimport { makeStoreProvider, useCallbacksMemo } from 'general'\nimport { useSaveValue } from 'persistence'\n\ntype Params = {\n  initialFilter: FoodsFilter\n  shouldSaveFilter?: boolean\n}\n\nfunction filterWithoutQuery(filter: FoodsFilter) {\n  return { ...filter, query: '' }\n}\n\nfunction useFoodsFilterStore({\n  initialFilter,\n  shouldSaveFilter = true,\n}: Params) {\n  const [filter, setFilter] = useState<FoodsFilter>(initialFilter)\n\n  useSaveValue({\n    value: filterWithoutQuery(filter),\n    key: 'foodsFilter',\n    isEnabled: shouldSaveFilter,\n  })\n\n  const updateFilter = useCallback(\n    (partialFilter: Partial<FoodsFilter>) =>\n      setFilter(filter => {\n        return { ...filter, ...partialFilter }\n      }),\n    []\n  )\n\n  const resetFilter = useCallback(() => {\n    setFilter({ ...DEFAULT_FILTER })\n  }, [])\n\n  const resetCategoryIdAndQuery = useCallback(() => {\n    setFilter(filter => ({\n      ...DEFAULT_FILTER,\n      onlyFoodsAddedByUser: filter.onlyFoodsAddedByUser,\n    }))\n  }, [])\n\n  const actions = useCallbacksMemo({\n    updateFilter,\n    resetFilter,\n    resetCategoryIdAndQuery,\n  })\n\n  return [filter, actions] as const\n}\n\nconst [\n  FoodsFilterStoreProvider,\n  useFoodsFilter,\n  useFoodsFilterActions,\n] = makeStoreProvider(useFoodsFilterStore)\n\nexport { FoodsFilterStoreProvider, useFoodsFilter, useFoodsFilterActions }\n\nexport default useFoodsFilterStore\n"
  },
  {
    "path": "src/form/duplicate.ts",
    "content": "import { deepCopy } from 'general'\nimport { v4 as uuidv4 } from 'uuid'\nimport { Form } from './types'\n\nfunction duplicate<T extends Form>(originalForm: T) {\n  const copiedForm = deepCopy(originalForm, (key: string, value: any) => {\n    if (key === 'fieldId') {\n      return uuidv4()\n    }\n\n    return value\n  }) as T\n\n  return copiedForm\n}\n\nexport default duplicate\n"
  },
  {
    "path": "src/form/index.ts",
    "content": "export { default as duplicate } from './duplicate'\nexport * from './names'\nexport { default as useFormError } from './useFormError'\nexport { default as useSelectInputText } from './useSelectInputText'\n"
  },
  {
    "path": "src/form/names.ts",
    "content": "import { Form } from './types'\n\nfunction getDuplicatedName(index: number, forms: Form[]) {\n  const form = forms[index]\n  const originalNameOrUntitled = form.name || 'Untitled'\n  return getEnumeratedName(`Copy of ${originalNameOrUntitled}`, forms)\n}\n\nfunction getEnumeratedName(currentName: string, forms: Form[]) {\n  const presentCount = forms.filter(({ name }) => name === currentName).length\n\n  if (presentCount > 0) {\n    return `${currentName} (${presentCount})`\n  }\n\n  return currentName\n}\n\nexport { getDuplicatedName, getEnumeratedName }\n"
  },
  {
    "path": "src/form/types.ts",
    "content": "type Form = {\n  fieldId: string\n  name: string\n}\n\nexport type { Form }\n"
  },
  {
    "path": "src/form/useFormError.ts",
    "content": "import { useFormContext } from 'react-hook-form'\n\nfunction useFormError(name: string) {\n  const { formState } = useFormContext()\n  const { errors, touchedFields } = formState\n\n  const isInvalid =\n    errors[name] && (touchedFields[name] || formState.isSubmitted)\n\n  const errorMessage = isInvalid ? errors[name]?.message : undefined\n\n  return {\n    isInvalid,\n    errorMessage,\n  }\n}\n\nexport default useFormError\n"
  },
  {
    "path": "src/form/useSelectInputText.ts",
    "content": "import { RefObject, useEffect } from 'react'\n\nfunction useSelectInputText(inputRef: RefObject<HTMLInputElement>) {\n  useEffect(() => {\n    const input = inputRef.current\n\n    if (input) {\n      input.setSelectionRange(0, input.value.length)\n    }\n  }, [inputRef])\n}\n\nexport default useSelectInputText\n"
  },
  {
    "path": "src/general/Badge.tsx",
    "content": "import { ForwardedRef, ReactNode } from 'react'\nimport { Box, BoxProps, Center, Fade, Text } from '@chakra-ui/react'\nimport { forwardRef } from 'react'\nimport { useSameOrPreviousValue } from 'general'\n\ntype Props = {\n  children: ReactNode\n  count: number\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n} & BoxProps\n\nfunction Badge({ children, count, forwardedRef, ...rest }: Props) {\n  const prevCount = useSameOrPreviousValue(count)\n\n  return (\n    <Box position=\"relative\" ref={forwardedRef} {...rest}>\n      {children}\n\n      <Fade in={count > 0}>\n        <Center\n          width=\"20px\"\n          top=\"-5px\"\n          right=\"-5px\"\n          height=\"20px\"\n          bg=\"teal.500\"\n          position=\"absolute\"\n          borderRadius=\"full\"\n          pointerEvents=\"none\"\n          boxShadow=\"base\"\n        >\n          <Text fontWeight=\"bold\" fontSize=\"xs\" textColor=\"white\">\n            {count === 0 ? prevCount : count}\n          </Text>\n        </Center>\n      </Fade>\n    </Box>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <Badge {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/general/ContextMenuFlex.tsx",
    "content": "import { Flex, FlexProps } from '@chakra-ui/react'\nimport { ForwardedRef, ReactElement, forwardRef } from 'react'\nimport { MenuItem, ControlledMenu } from 'general'\nimport { useState } from 'react'\nimport { getMenuItems } from './MenuOrDrawer'\nimport { isDesktop } from 'react-device-detect'\n\ntype Props = {\n  menuItems?: ReactElement<typeof MenuItem>[]\n  menuOrDrawerItems?: ReactElement[]\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n} & FlexProps\n\nfunction ContextMenuFlex({\n  menuItems,\n  menuOrDrawerItems = [],\n  children,\n  forwardedRef,\n  ...rest\n}: Props) {\n  const [isOpen, setOpen] = useState(false)\n  const [anchorPoint, setAnchorPoint] = useState({ x: 0, y: 0 })\n\n  return (\n    <Flex\n      {...rest}\n      ref={forwardedRef}\n      onContextMenu={event => {\n        const { target, clientX, clientY } = event\n\n        if (\n          !isDesktop ||\n          (target as HTMLElement).tagName?.toLowerCase() === 'input'\n        ) {\n          return\n        }\n\n        event.preventDefault()\n        setAnchorPoint({ x: clientX, y: clientY })\n        setOpen(true)\n      }}\n    >\n      {isDesktop && (\n        <ControlledMenu\n          anchorPoint={anchorPoint}\n          isOpen={isOpen}\n          viewScroll=\"close\"\n          portal={true}\n          onClose={() => setOpen(false)}\n        >\n          {getMenuItems(menuOrDrawerItems)}\n        </ControlledMenu>\n      )}\n      {children}\n    </Flex>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <ContextMenuFlex {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/general/HFadeScroll/FadeBox.tsx",
    "content": "import { ReactNode } from 'react'\nimport { Box } from '@chakra-ui/react'\n\ntype ShadowProps = {\n  hasStartFade: boolean\n  hasEndFade: boolean\n  children: ReactNode\n}\n\nfunction getLinearGradient(direction: 'left' | 'right') {\n  return `linear-gradient(to ${direction},#F7FAFC, rgba(255, 255, 255, 0))`\n}\n\nconst shadowElementBase = {\n  content: '\"\"',\n  position: 'absolute',\n  top: 0,\n  bottom: 0,\n  width: '50px',\n  zIndex: 1,\n}\n\nfunction FadeBox({ hasStartFade, hasEndFade, children }: ShadowProps) {\n  const before = {\n    ...shadowElementBase,\n    left: 0,\n    background: getLinearGradient('right'),\n  }\n\n  const after = {\n    ...shadowElementBase,\n    right: 0,\n    background: getLinearGradient('left'),\n  }\n\n  return (\n    <Box\n      position=\"relative\"\n      flex={1}\n      overflow=\"hidden\"\n      _before={hasStartFade ? before : undefined}\n      _after={hasEndFade ? after : undefined}\n    >\n      {children}\n    </Box>\n  )\n}\n\nexport default FadeBox\n"
  },
  {
    "path": "src/general/HFadeScroll/ScrollContainer.tsx",
    "content": "import { Flex } from '@chakra-ui/react'\nimport styled from '@emotion/styled'\n\nconst ScrollContainer = styled(Flex)`\n  -ms-overflow-style: none;\n  scrollbar-width: none;\n\n  ::-webkit-scrollbar {\n    display: none;\n  }\n`\n\nexport default ScrollContainer\n"
  },
  {
    "path": "src/general/HFadeScroll/index.tsx",
    "content": "import {\n  ForwardedRef,\n  ReactNode,\n  forwardRef,\n  useRef,\n  useEffect,\n  useState,\n} from 'react'\nimport ScrollContainer from './ScrollContainer'\nimport FadeBox from './FadeBox'\nimport { useMergeRefs } from '@chakra-ui/hooks'\n\ntype Props = {\n  children: ReactNode\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n  onScrollStateChange: (\n    isScrollable: boolean,\n    canScrollLeft: boolean,\n    canScrollRight: boolean\n  ) => void\n}\n\nconst HFadeScroll = ({\n  children,\n  forwardedRef,\n  onScrollStateChange,\n}: Props) => {\n  const [hasStartFade, setHasStartFade] = useState(false)\n  const [hasEndFade, setHasEndFade] = useState(false)\n  const scrollContainerRef = useRef<HTMLDivElement>(null)\n  const timeoutRef = useRef<number>()\n\n  function onMousewheel(event: WheelEvent) {\n    const { deltaX } = event\n\n    if ((deltaX < 0 && !hasStartFade) || (deltaX > 0 && !hasEndFade)) {\n      event.preventDefault()\n    }\n  }\n\n  function onScroll() {\n    if (scrollContainerRef.current) {\n      const {\n        scrollWidth,\n        scrollLeft,\n        offsetWidth,\n      } = scrollContainerRef.current\n\n      setHasStartFade(scrollLeft > 0)\n      setHasEndFade(scrollLeft + offsetWidth + 1 < scrollWidth)\n    }\n  }\n\n  useEffect(() => {\n    onScroll()\n\n    window.clearTimeout(timeoutRef.current)\n    timeoutRef.current = window.setTimeout(onScroll, 300)\n\n    const scrollContainerNode = scrollContainerRef.current\n\n    scrollContainerNode?.addEventListener('scroll', onScroll)\n    scrollContainerNode?.addEventListener('wheel', onMousewheel)\n    window.addEventListener('resize', onScroll)\n\n    return () => {\n      window.removeEventListener('resize', onScroll)\n      scrollContainerNode?.removeEventListener('scroll', onScroll)\n      scrollContainerNode?.removeEventListener('wheel', onMousewheel)\n\n      window.clearTimeout(timeoutRef.current)\n    }\n  })\n\n  useEffect(() => {\n    if (scrollContainerRef.current) {\n      const { scrollWidth, offsetWidth } = scrollContainerRef.current\n      onScrollStateChange(offsetWidth < scrollWidth, hasStartFade, hasEndFade)\n    }\n  })\n\n  const finalScrollContainerRef = useMergeRefs(scrollContainerRef, forwardedRef)\n\n  return (\n    <FadeBox hasStartFade={hasStartFade} hasEndFade={hasEndFade}>\n      <ScrollContainer overflowY=\"scroll\" ref={finalScrollContainerRef}>\n        {children}\n      </ScrollContainer>\n    </FadeBox>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <HFadeScroll {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/general/Loader.tsx",
    "content": "import { Spinner, Text, Center, Flex } from '@chakra-ui/react'\n\ntype Props = {\n  label: string\n}\n\nfunction Loader({ label }: Props) {\n  return (\n    <Center height=\"200px\" spacing={2}>\n      <Flex flexDirection=\"column\" alignItems=\"center\">\n        <Spinner size=\"lg\" color=\"teal\" />\n        <Text mt={4} fontSize=\"lg\" fontWeight=\"medium\">\n          {label}\n        </Text>\n      </Flex>\n    </Center>\n  )\n}\n\nexport default Loader\n"
  },
  {
    "path": "src/general/Menu.tsx",
    "content": "import styled from '@emotion/styled'\nimport {\n  Menu as MenuBase,\n  MenuButton,\n  MenuItem,\n  ControlledMenu as ControlledMenuBase,\n  MenuDivider,\n  MenuHeader,\n} from '@szhsin/react-menu'\nimport '@szhsin/react-menu/dist/index.css'\n\nconst bowShadow =\n  'box-shadow: 0 3px 7px rgb(0 0 0 / 13%), 0 0.6px 2px rgb(0 0 0 / 10%) !important'\n\nconst Menu = styled(MenuBase)`\n  ${bowShadow}\n`\n\nconst ControlledMenu = styled(ControlledMenuBase)`\n  ${bowShadow}\n`\n\nexport { MenuButton, MenuItem, ControlledMenu, MenuDivider, MenuHeader }\n\nexport default Menu\n"
  },
  {
    "path": "src/general/MenuOrDrawer/Drawer/getDrawerButtons.tsx",
    "content": "import { cloneElement, ReactElement, Children } from 'react'\nimport { Button, Divider } from '@chakra-ui/react'\nimport MenuOrDrawerItem from '../MenuOrDrawerItem'\nimport MenuOrDrawerSeparator from '../MenuOrDrawerSeparator'\n\nfunction getDrawerButtons(\n  children: ReactElement | ReactElement[],\n  onClose: () => void\n) {\n  return Children.map(children, child => {\n    if (child.type === MenuOrDrawerItem) {\n      const icon = cloneElement(child.props.icon, {\n        size: 20,\n      })\n\n      return (\n        <Button\n          onClick={() => {\n            const { onClick } = child.props\n            onClick && onClick()\n            onClose()\n          }}\n          isFullWidth={true}\n          leftIcon={icon}\n          isDisabled={child.props.isDisabled}\n        >\n          {child.props.children}\n        </Button>\n      )\n    } else if (child.type === MenuOrDrawerSeparator) {\n      return <Divider borderColor=\"gray.400\" />\n    }\n\n    return null\n  })\n}\n\nexport default getDrawerButtons\n"
  },
  {
    "path": "src/general/MenuOrDrawer/Drawer/index.tsx",
    "content": "import {\n  Drawer as DrawerBase,\n  DrawerBody,\n  DrawerHeader,\n  DrawerOverlay,\n  DrawerContent,\n  DrawerCloseButton,\n  VStack,\n} from '@chakra-ui/react'\nimport { ReactElement } from 'react'\nimport getDrawerButtons from './getDrawerButtons'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n  children: ReactElement | ReactElement[]\n  title: string\n}\n\nfunction Drawer({ title, isOpen, onClose, children }: Props) {\n  return (\n    <DrawerBase isOpen={isOpen} placement=\"bottom\" onClose={onClose}>\n      <DrawerOverlay />\n      <DrawerContent maxHeight=\"500px\">\n        <DrawerCloseButton />\n        <DrawerHeader fontSize=\"md\">{title}</DrawerHeader>\n\n        <DrawerBody mb={4}>\n          <VStack width=\"100%\" spacing={3}>\n            {getDrawerButtons(children, onClose)}\n          </VStack>\n        </DrawerBody>\n      </DrawerContent>\n    </DrawerBase>\n  )\n}\n\nexport { getDrawerButtons }\n\nexport default Drawer\n"
  },
  {
    "path": "src/general/MenuOrDrawer/Menu/getMenuItems.tsx",
    "content": "import {\n  MenuItem,\n  MenuOrDrawerItem,\n  MenuOrDrawerSeparator,\n  MenuDivider,\n} from 'general'\nimport { cloneElement, ReactElement, Children } from 'react'\n\nfunction getMenuItems(children: ReactElement | ReactElement[]) {\n  return Children.map(children, (child: ReactElement) => {\n    if (child.type === MenuOrDrawerItem) {\n      const icon = cloneElement(child.props.icon, { size: 16, mr: 3 })\n\n      return (\n        <MenuItem\n          disabled={child.props.isDisabled}\n          onClick={child.props.onClick}\n        >\n          {icon}\n          {child.props.children}\n        </MenuItem>\n      )\n    } else if (child.type === MenuOrDrawerSeparator) {\n      return <MenuDivider />\n    }\n\n    return null\n  })\n}\n\nexport default getMenuItems\n"
  },
  {
    "path": "src/general/MenuOrDrawer/Menu/index.tsx",
    "content": "import { ButtonProps } from '@chakra-ui/react'\nimport { Menu as MenuBase, MenuHeader } from 'general'\nimport Trigger from '../Trigger'\nimport { ReactElement } from 'react'\nimport getMenuItems from './getMenuItems'\n\ntype Props = {\n  children: ReactElement | ReactElement[]\n  title: string\n} & ButtonProps\n\nfunction Menu({ children, title, ...rest }: Props) {\n  return (\n    <MenuBase\n      align=\"end\"\n      viewScroll=\"close\"\n      portal={true}\n      arrow={true}\n      menuButton={<Trigger {...rest} />}\n    >\n      <MenuHeader>{title}</MenuHeader>\n      {getMenuItems(children)}\n    </MenuBase>\n  )\n}\n\nexport { getMenuItems }\n\nexport default Menu\n"
  },
  {
    "path": "src/general/MenuOrDrawer/MenuOrDrawerItem.tsx",
    "content": "import { ReactElement, ReactNode } from 'react'\n\ntype Props = {\n  onClick?: () => void\n  children: ReactNode\n  icon: ReactElement\n  isDisabled?: boolean\n}\n\nfunction MenuItem(props: Props) {\n  return null\n}\n\nexport default MenuItem\n"
  },
  {
    "path": "src/general/MenuOrDrawer/MenuOrDrawerSeparator.tsx",
    "content": "function MenuOrDrawerSeparator() {\n  return null\n}\n\nexport default MenuOrDrawerSeparator\n"
  },
  {
    "path": "src/general/MenuOrDrawer/Trigger.tsx",
    "content": "import { IconButton, ButtonProps } from '@chakra-ui/react'\nimport { MoreHorizontal } from 'react-feather'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = {\n  forwardedRef?: ForwardedRef<HTMLButtonElement>\n} & ButtonProps\n\nfunction Trigger({ forwardedRef, ...rest }: Props) {\n  return (\n    <IconButton\n      aria-label=\"Actions\"\n      icon={<MoreHorizontal size={20} pointerEvents=\"none\" />}\n      variant=\"ghost\"\n      size=\"sm\"\n      ref={forwardedRef}\n      {...rest}\n    />\n  )\n}\nexport default forwardRef<HTMLButtonElement, Props>((props, ref) => (\n  <Trigger {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/general/MenuOrDrawer/index.tsx",
    "content": "import { useScreenSize, ScreenSize } from 'general'\nimport Drawer from './Drawer'\nimport Trigger from './Trigger'\nimport { useDisclosure, IconButtonProps } from '@chakra-ui/react'\nimport Menu from './Menu'\nimport { ReactElement } from 'react'\n\ntype Props = {\n  children: ReactElement | ReactElement[]\n  title: string\n} & IconButtonProps\n\nfunction MenuOrDrawer({ children, title, ...rest }: Props) {\n  const screenSize = useScreenSize()\n  const modalDisclosure = useDisclosure()\n\n  if (screenSize < ScreenSize.Medium) {\n    return (\n      <>\n        <Trigger onClick={modalDisclosure.onOpen} {...rest} />\n        <Drawer\n          isOpen={modalDisclosure.isOpen}\n          onClose={modalDisclosure.onClose}\n          title={title}\n        >\n          {children}\n        </Drawer>\n      </>\n    )\n  }\n\n  return (\n    <Menu title={title} {...rest}>\n      {children}\n    </Menu>\n  )\n}\n\nexport { default as MenuOrDrawerItem } from './MenuOrDrawerItem'\nexport { default as MenuOrDrawerSeparator } from './MenuOrDrawerSeparator'\nexport * from './Menu'\nexport * from './Drawer'\n\nexport default MenuOrDrawer\n"
  },
  {
    "path": "src/general/ResponsiveButton.tsx",
    "content": "import { Button, ButtonProps } from '@chakra-ui/react'\nimport { useScreenSize, ScreenSize } from 'general'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = {\n  forwardedRef?: ForwardedRef<HTMLButtonElement>\n} & ButtonProps\n\nfunction ResponsiveButton({ forwardedRef, ...rest }: Props) {\n  const screenSize = useScreenSize()\n  const size = screenSize >= ScreenSize.Medium ? 'sm' : 'sm'\n\n  return <Button ref={forwardedRef} size={size} {...rest} />\n}\n\nexport default forwardRef<HTMLButtonElement, Props>((props, ref) => (\n  <ResponsiveButton forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/general/ResponsiveIconButton.tsx",
    "content": "import { IconButtonProps, IconButton } from '@chakra-ui/react'\nimport { useScreenSize, ScreenSize } from 'general'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = {\n  forwardedRef?: ForwardedRef<HTMLButtonElement>\n  tooltip?: string\n} & IconButtonProps\n\nfunction ResponsiveIconButton({\n  forwardedRef,\n\n  ...rest\n}: Props) {\n  const screenSize = useScreenSize()\n  const size = screenSize >= ScreenSize.Medium ? 'sm' : 'sm'\n\n  return <IconButton ref={forwardedRef} size={size} {...rest} />\n}\n\nexport default forwardRef<HTMLButtonElement, Props>((props, ref) => (\n  <ResponsiveIconButton forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/general/RightAligned.tsx",
    "content": "import { Flex, FlexProps } from '@chakra-ui/react'\nimport { ReactNode } from 'react'\n\ntype Props = {\n  children: ReactNode\n} & FlexProps\n\nfunction RightAligned({ children, ...rest }: Props) {\n  return (\n    <Flex\n      width=\"100%\"\n      height=\"100%\"\n      alignItems=\"flex-end\"\n      justifyContent=\"center\"\n      flexDirection=\"column\"\n      {...rest}\n    >\n      {children}\n    </Flex>\n  )\n}\n\nexport default RightAligned\n"
  },
  {
    "path": "src/general/ScreenSizeProvider/context.ts",
    "content": "import { createContext, useContext } from 'react'\n\nenum ScreenSize {\n  Base = 0,\n  Small,\n  Medium,\n  Large,\n  ExtraLarge,\n}\n\nconst ScreenSizeContext = createContext<ScreenSize | undefined>(undefined)\n\nfunction useScreenSize() {\n  const screenSize = useContext(ScreenSizeContext)\n\n  if (screenSize === undefined) {\n    throw new Error('Provider missing')\n  }\n\n  return screenSize\n}\n\nexport { useScreenSize, ScreenSizeContext, ScreenSize }\n"
  },
  {
    "path": "src/general/ScreenSizeProvider/index.tsx",
    "content": "import { useBreakpointValue } from '@chakra-ui/media-query'\nimport { ReactNode } from 'react'\nimport { ScreenSizeContext, ScreenSize } from './context'\n\ntype Props = {\n  children: ReactNode\n}\n\nfunction ScreenSizeProvider({ children }: Props) {\n  const screenSize = useBreakpointValue({\n    base: ScreenSize.Base,\n    sm: ScreenSize.Small,\n    md: ScreenSize.Medium,\n    lg: ScreenSize.Large,\n    xl: ScreenSize.ExtraLarge,\n  })\n\n  if (screenSize === undefined) {\n    return null\n  }\n\n  return (\n    <ScreenSizeContext.Provider value={screenSize}>\n      {children}\n    </ScreenSizeContext.Provider>\n  )\n}\n\nexport * from './context'\n\nexport default ScreenSizeProvider\n"
  },
  {
    "path": "src/general/Tooltip.tsx",
    "content": "import { ReactElement, useState, cloneElement, useRef, ReactNode } from 'react'\nimport { Tooltip as TooltipBase } from '@chakra-ui/react'\n\ntype Props = {\n  children: ReactElement\n  delay?: number\n  label?: ReactNode\n  isActive?: boolean\n}\n\nfunction Tooltip({ children, label, isActive = true, delay = 500 }: Props) {\n  const [isHovered, setIsHovered] = useState(false)\n  const timeoutIdRef = useRef<number>()\n\n  function onMouseEnter() {\n    window.clearTimeout(timeoutIdRef.current)\n    timeoutIdRef.current = window.setTimeout(() => setIsHovered(true), delay)\n  }\n\n  function hideTooltip() {\n    window.clearTimeout(timeoutIdRef.current)\n    setIsHovered(false)\n  }\n\n  function onMouseLeave() {\n    hideTooltip()\n  }\n\n  function onClick(...rest: any) {\n    children.props.onClick && children.props.onClick(...rest)\n    hideTooltip()\n  }\n\n  if (!isActive) {\n    return children\n  }\n\n  return (\n    <TooltipBase hasArrow={true} isOpen={isHovered} label={label}>\n      {cloneElement(children, {\n        onMouseEnter,\n        onMouseLeave,\n        onClick,\n      })}\n    </TooltipBase>\n  )\n}\n\nexport default Tooltip\n"
  },
  {
    "path": "src/general/TooltipCommandLabel.tsx",
    "content": "import { Text } from '@chakra-ui/react'\n\ntype Props = {\n  command: string\n  kbdCombo: string\n}\n\nfunction TooltipCommandLabel({ command, kbdCombo }: Props) {\n  return (\n    <Text py={2}>\n      {command}{' '}\n      <Text p={1} bg=\"gray.600\" as=\"span\" borderRadius={2}>\n        {kbdCombo}\n      </Text>\n    </Text>\n  )\n}\n\nexport default TooltipCommandLabel\n"
  },
  {
    "path": "src/general/deepCopy.ts",
    "content": "const deepCopy = (value: any, replacer?: (key: string, value: any) => any) =>\n  JSON.parse(JSON.stringify(value, replacer))\n\nexport default deepCopy\n"
  },
  {
    "path": "src/general/getCtrlKeyName.ts",
    "content": "function isMac() {\n  return navigator.platform.indexOf('Mac') > -1\n}\n\nfunction getCtrlKeyName() {\n  if (isMac()) {\n    return 'Cmd'\n  }\n\n  return 'Ctrl'\n}\n\nexport default getCtrlKeyName\n"
  },
  {
    "path": "src/general/index.ts",
    "content": "export { default as HFadeScroll } from './HFadeScroll'\nexport * from './HFadeScroll'\nexport { default as Badge } from './Badge'\nexport { default as deepCopy } from './deepCopy'\nexport { default as Menu } from './Menu'\nexport * from './Menu'\nexport { default as ResponsiveButton } from './ResponsiveButton'\nexport { default as ResponsiveIconButton } from './ResponsiveIconButton'\nexport { default as RightAligned } from './RightAligned'\nexport * from './stores'\nexport { default as useSelection } from './useSelection'\nexport * from './useSelection'\nexport { default as useSameOrPreviousValue } from './useSameOrPreviousValue'\nexport { default as ContextMenuFlex } from './ContextMenuFlex'\nexport { default as Loader } from './Loader'\nexport { default as useElementHeight } from './useElementHeight'\nexport { default as Tooltip } from './Tooltip'\nexport { default as getCtrlKeyName } from './getCtrlKeyName'\nexport { default as TooltipCommandLabel } from './TooltipCommandLabel'\nexport { default as ScreenSizeProvider } from './ScreenSizeProvider'\nexport * from './ScreenSizeProvider'\nexport * from './useOneTimeCheckStore'\nexport { default as MenuOrDrawer } from './MenuOrDrawer'\nexport * from './MenuOrDrawer'\nexport { default as minDelay } from './minDelay'\nexport { default as useRunIfNotUnmounted } from './useRunIfNotUnmounted'\n"
  },
  {
    "path": "src/general/minDelay.ts",
    "content": "function minDelay(startDate: Date, minDelayInMs = 500) {\n  return new Promise(resolve => {\n    const endDate = new Date()\n    const timeDiffInMs = endDate.getTime() - startDate.getTime()\n\n    if (timeDiffInMs >= minDelayInMs) {\n      resolve(true)\n    } else {\n      setTimeout(() => resolve(true), minDelayInMs - timeDiffInMs)\n    }\n  })\n}\n\nexport default minDelay\n"
  },
  {
    "path": "src/general/stores.tsx",
    "content": "import {\n  Context,\n  useContext,\n  createContext,\n  ReactNode,\n  useMemo,\n  Provider,\n} from 'react'\n\nfunction guard(value: unknown): value is object {\n  return value !== undefined\n}\n\nfunction makeUseContext<T>(context: Context<T>) {\n  function useCustomContext() {\n    const value = useContext(context)\n\n    if (!guard(value)) {\n      throw new Error('Missing store context provider')\n    }\n\n    return value\n  }\n\n  return useCustomContext\n}\n\nfunction makeProvider<T>() {\n  const Context = createContext<T | undefined>(undefined)\n  const useContext = makeUseContext(Context)\n\n  return [Context.Provider, useContext] as const\n}\n\nfunction makeStoreProvider<State, Actions, StoreParams extends object>(\n  useStore: (params: StoreParams) => readonly [State, Actions],\n  ...selectors: ((state: State) => any)[]\n) {\n  const [StateProvider, useState] = makeProvider<State>()\n  const [ActionsProvider, useActions] = makeProvider<Actions>()\n\n  const selectorProviders: Provider<any>[] = []\n  const useSelectorHooks: any[] = []\n\n  selectors.forEach(() => {\n    const [SelectorProvider, useSelector] = makeProvider<any>()\n    selectorProviders.push(SelectorProvider)\n    useSelectorHooks.push(useSelector)\n  })\n\n  function StoreProvider(props: StoreParams & { children: ReactNode }) {\n    const { children, ...storeParams } = props\n    const [state, methods] = useStore(storeParams as StoreParams)\n\n    let finalChildren = children\n\n    selectorProviders.forEach((SelectorProvider, index) => {\n      const selector = selectors[index]\n      const value = selector(state)\n      finalChildren = (\n        <SelectorProvider value={value}>{finalChildren}</SelectorProvider>\n      )\n    })\n\n    return (\n      <ActionsProvider value={methods}>\n        <StateProvider value={state}>{finalChildren}</StateProvider>\n      </ActionsProvider>\n    )\n  }\n\n  return [StoreProvider, useState, useActions, ...useSelectorHooks] as const\n}\n\nfunction useCallbacksMemo<T extends object>(methods: T) {\n  return useMemo(() => methods, Object.values(methods)) // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport { makeStoreProvider, useCallbacksMemo }\n"
  },
  {
    "path": "src/general/useElementHeight.ts",
    "content": "import { useRef, useState } from 'react'\nimport useResizeObserver from '@react-hook/resize-observer'\n\nfunction useElementHeight() {\n  const elementRef = useRef<HTMLDivElement>(null)\n  const [elementHeight, setElementHeight] = useState(0)\n\n  useResizeObserver(elementRef, entry =>\n    setElementHeight(entry.contentRect.height)\n  )\n\n  return {\n    elementRef,\n    elementHeight,\n  }\n}\n\nexport default useElementHeight\n"
  },
  {
    "path": "src/general/useOneTimeCheckStore.ts",
    "content": "import { makeStoreProvider, useCallbacksMemo } from 'general'\nimport { useRef, useCallback } from 'react'\n\ntype KeysMap = {\n  [key: string]: boolean | undefined\n}\n\nfunction useOneTimeCheckStore() {\n  const keysMapRef = useRef<KeysMap>({})\n\n  const checkAndReset = useCallback((key: string) => {\n    if (keysMapRef.current[key] === true) {\n      setTimeout(() => {\n        keysMapRef.current[key] = undefined\n      }, 0)\n\n      return true\n    }\n\n    return false\n  }, [])\n\n  const set = useCallback((key: string) => {\n    keysMapRef.current[key] = true\n  }, [])\n\n  const actions = useCallbacksMemo({\n    checkAndReset,\n    set,\n  })\n\n  return [keysMapRef, actions] as const\n}\n\nconst [\n  OneTimeCheckStoreProvider,\n  useOneTimeCheck,\n  useOneTimeCheckActions,\n] = makeStoreProvider(useOneTimeCheckStore)\n\ntype OneTimeCheckActions = ReturnType<typeof useOneTimeCheckActions>\n\nexport { OneTimeCheckStoreProvider, useOneTimeCheck, useOneTimeCheckActions }\n\nexport type { OneTimeCheckActions }\n\nexport default useOneTimeCheckStore\n"
  },
  {
    "path": "src/general/useRunIfNotUnmounted.ts",
    "content": "import { useCallback, useEffect, useRef } from 'react'\n\nfunction useRunIfNotUnmounted() {\n  const isUnmountedRef = useRef(false)\n\n  useEffect(() => {\n    return () => {\n      isUnmountedRef.current = true\n    }\n  }, [])\n\n  const callIfNotUnmounted = useCallback((callback: Function) => {\n    if (!isUnmountedRef.current) {\n      callback()\n    }\n  }, [])\n\n  return callIfNotUnmounted\n}\n\nexport default useRunIfNotUnmounted\n"
  },
  {
    "path": "src/general/useSameOrPreviousValue.ts",
    "content": "import { useEffect, useRef } from 'react'\n\nfunction useSameOrPreviousValue<T>(value: T) {\n  const previous = useRef(value)\n\n  useEffect(() => {\n    previous.current = value\n  }, [value])\n\n  return previous.current\n}\n\nexport default useSameOrPreviousValue\n"
  },
  {
    "path": "src/general/useSelection.ts",
    "content": "import { useState } from 'react'\n\ntype Id = number | string\ntype Item = { id: Id }\ntype SelectionMap = { [id in Id]: boolean | undefined }\n\ntype Selection<T extends Item> = {\n  isIdSelected: (id: Id) => boolean\n  toggleItem: (item: T) => void\n  addItem: (item: T) => void\n  removeItem: (item: T) => void\n  selectedItems: T[]\n  selectionMap: SelectionMap\n}\n\nfunction useSelection<T extends Item>(): Selection<T> {\n  const [selectionMap, setSelectionMap] = useState<SelectionMap>({})\n  const [selectedItems, setSelectedItems] = useState<T[]>([])\n\n  function toggleItem(item: T) {\n    const { id } = item\n    const isSelected = Boolean(selectionMap[id])\n\n    if (isSelected) {\n      removeItem(item)\n    } else {\n      addItem(item)\n    }\n\n    setSelectionMap({ ...selectionMap, [id]: !isSelected })\n  }\n\n  function removeItem(item: T) {\n    setSelectedItems(selectedItems.filter(({ id }) => item.id !== id))\n  }\n\n  function addItem(item: T) {\n    setSelectedItems([...selectedItems, item])\n  }\n\n  function isIdSelected(id: Id) {\n    const isSelected = Boolean(selectionMap[id])\n    return isSelected\n  }\n\n  return {\n    isIdSelected,\n    toggleItem,\n    selectionMap,\n    selectedItems,\n    removeItem,\n    addItem,\n  }\n}\n\nexport type { Selection, Item }\n\nexport default useSelection\n"
  },
  {
    "path": "src/icons/CalendarPlus.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\n\nfunction CalendarPlus({ size = 24, ...rest }) {\n  return (\n    <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" {...rest}>\n      <rect width=\"24\" height=\"24\" />\n      <path\n        d=\"M21 13V6C21 4.89543 20.1046 4 19 4H5C3.89543 4 3 4.89543 3 6V20C3 21.1046 3.89543 22 5 22H12\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M16 2V6\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M17 14V22\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M21 18L13 18\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M8 2V6\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M3 10H21\"\n        stroke=\"black\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </svg>\n  )\n}\n\nexport default chakra(CalendarPlus)\n"
  },
  {
    "path": "src/icons/index.ts",
    "content": "export { default as CalendarPlus } from './CalendarPlus'\n"
  },
  {
    "path": "src/index.tsx",
    "content": "import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n  <React.StrictMode>\n    <App />\n  </React.StrictMode>,\n  document.getElementById('root')\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"
  },
  {
    "path": "src/ingredients/IngredientsList/EmptyList.tsx",
    "content": "import { Flex, Text, Button } from '@chakra-ui/react'\n\ntype Props = {\n  onAddIngredients: () => void\n}\n\nfunction EmptyList({ onAddIngredients }: Props) {\n  return (\n    <Flex p={3} justifyContent=\"space-between\" alignItems=\"center\">\n      <Text fontSize=\"md\" textColor=\"gray.500\">\n        You haven't added any foods\n      </Text>\n\n      <Button\n        colorScheme=\"teal\"\n        size=\"sm\"\n        variant=\"ghost\"\n        onClick={onAddIngredients}\n      >\n        Add foods\n      </Button>\n    </Flex>\n  )\n}\n\nexport default EmptyList\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/MenuOrDrawer.tsx",
    "content": "import { RightAligned } from 'layout'\nimport { MenuOrDrawer as MenuOrDrawerBase } from 'general'\nimport { ReactElement } from 'react'\n\ntype Props = {\n  children: ReactElement[]\n}\n\nfunction MenuOrDrawer({ children }: Props) {\n  return (\n    <RightAligned>\n      <MenuOrDrawerBase aria-label=\"Food actions\" mr={3} title=\"Food\">\n        {children}\n      </MenuOrDrawerBase>\n    </RightAligned>\n  )\n}\n\nexport default MenuOrDrawer\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/MissingStatsLayout.tsx",
    "content": "import { Flex, Text, Button } from '@chakra-ui/react'\nimport { Trash2 } from 'react-feather'\n\ntype Props = {\n  onRemoveRequest: () => void\n}\n\nfunction MissingStatsLayout({ onRemoveRequest }: Props) {\n  return (\n    <Flex width=\"100%\" justifyContent=\"space-between\" align=\"center\">\n      <Text fontSize=\"md\" textColor=\"red.400\" ml={3}>\n        Food not found\n      </Text>\n\n      <Button\n        mr={3}\n        alignSelf=\"flex-end\"\n        variant=\"ghost\"\n        colorScheme=\"red\"\n        size=\"sm\"\n        onClick={onRemoveRequest}\n        leftIcon={<Trash2 size={16} />}\n      >\n        Remove\n      </Button>\n    </Flex>\n  )\n}\n\nexport default MissingStatsLayout\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/Notes.tsx",
    "content": "import PresenceAnimation from './PresenceAnimation'\nimport { Box, Text } from '@chakra-ui/react'\nimport { NotesEvents } from './useNotesEvents'\nimport { IngredientForm } from 'ingredients'\n\ntype Props = {\n  notesEvents: NotesEvents\n  ingredientForm: IngredientForm\n}\n\nfunction Notes({ notesEvents, ingredientForm }: Props) {\n  return (\n    <PresenceAnimation\n      shouldAnimate={notesEvents.shouldAnimateNotes}\n      isVisible={notesEvents.areNotesVisible}\n      onAnimationComplete={notesEvents.onNotesAnimationComplete}\n    >\n      <Box width=\"100%\">\n        <Text fontSize=\"sm\" whiteSpace=\"pre-wrap\" textColor=\"gray.500\">\n          {ingredientForm.notes}\n        </Text>\n      </Box>\n    </PresenceAnimation>\n  )\n}\n\nexport default Notes\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/PresenceAnimation.tsx",
    "content": "import { ReactNode } from 'react'\nimport { motion } from 'framer-motion'\n\ntype Props = {\n  children: ReactNode\n  shouldAnimate: boolean\n  onAnimationComplete: () => void\n  isVisible: boolean\n  isDraggingOver?: boolean\n}\n\nconst variants = {\n  open: {\n    opacity: 1,\n    height: 'auto',\n  },\n  collapsed: { opacity: 0, height: 0 },\n}\n\nfunction PresenceAnimation({\n  shouldAnimate,\n  onAnimationComplete,\n  isVisible,\n  children,\n  isDraggingOver = false,\n}: Props) {\n  return (\n    <motion.div\n      style={{ overflow: isDraggingOver ? undefined : 'hidden' }}\n      transition={{ ease: 'easeInOut' }}\n      initial={shouldAnimate ? 'collapsed' : false}\n      animate={isVisible ? 'open' : 'collapsed'}\n      onAnimationComplete={onAnimationComplete}\n      variants={variants}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\nexport default PresenceAnimation\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/StatsLayout.tsx",
    "content": "import { IngredientForm } from 'ingredients'\nimport { Food, FoodInfo } from 'foods'\nimport { StatsLayout as StatsLayoutBase, Stat, AmountInput } from 'stats'\nimport { ChangeEvent, ReactElement, ReactNode } from 'react'\nimport { Portion, PortionsMenuOrDrawer } from 'portions'\nimport { Flex } from '@chakra-ui/react'\n\ntype Props = {\n  energy: number\n  protein: number\n  carbs: number\n  fat: number\n  ingredientForm: IngredientForm\n  onAmountChange: (event: ChangeEvent<HTMLInputElement>) => void\n  onPortionChange: (portion: Portion) => void\n  menuElement: ReactElement\n  food: Food\n  notes?: string\n  children: ReactNode\n}\n\nfunction StatsLayout({\n  energy,\n  protein,\n  carbs,\n  fat,\n  ingredientForm,\n  onAmountChange,\n  onPortionChange,\n  menuElement,\n  food,\n  notes,\n  children,\n}: Props) {\n  const acceptsFractions = ['teaspoons', 'tablespoons', 'cups'].includes(\n    ingredientForm.portionId\n  )\n\n  return (\n    <StatsLayoutBase\n      prefersAmount={true}\n      nameElement={\n        <FoodInfo mx={2} food={food} notes={notes} canBeLink={true}>\n          {children}\n        </FoodInfo>\n      }\n      amountElement={\n        <Flex height=\"100%\" alignItems=\"center\">\n          <AmountInput\n            ml={3}\n            size=\"sm\"\n            onChange={onAmountChange}\n            value={ingredientForm.amount}\n            mr=\"-1px\"\n            zIndex={1}\n            position=\"relative\"\n            borderTopLeftRadius={6}\n            borderBottomLeftRadius={6}\n            borderTopRightRadius={0}\n            borderBottomRightRadius={0}\n            acceptsFractions={acceptsFractions}\n          >\n            <PortionsMenuOrDrawer\n              selectedPortionId={ingredientForm.portionId}\n              onPortionChange={onPortionChange}\n              food={food}\n            />\n          </AmountInput>\n        </Flex>\n      }\n      energyElement={<Stat type=\"ingredientEnergy\" value={energy} />}\n      proteinElement={<Stat type=\"ingredient\" value={protein} />}\n      carbsElement={<Stat type=\"ingredient\" value={carbs} />}\n      fatElement={<Stat type=\"ingredient\" value={fat} />}\n      menuElement={menuElement}\n    />\n  )\n}\n\nexport default StatsLayout\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/getMenuOrDrawerItems.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\nimport { IngredientForm } from 'ingredients'\nimport { Trash2, Info, Edit } from 'react-feather'\nimport { MenuOrDrawerItem, MenuOrDrawerSeparator } from 'general'\n\nconst InfoStyled = chakra(Info)\nconst Trash2Styled = chakra(Trash2)\nconst EditStyled = chakra(Edit)\n\ntype Props = {\n  onEditNotes: () => void\n  onRemove: () => void\n  onViewFoodDetails: () => void\n  ingredientForm: IngredientForm\n}\n\nfunction getMenuOrDrawerItems({\n  ingredientForm,\n  onRemove,\n  onViewFoodDetails,\n  onEditNotes,\n}: Props) {\n  return [\n    <MenuOrDrawerItem\n      key=\"viewDetails\"\n      icon={<InfoStyled />}\n      onClick={onViewFoodDetails}\n    >\n      View details\n    </MenuOrDrawerItem>,\n    <MenuOrDrawerSeparator key=\"separator\" />,\n    <MenuOrDrawerItem\n      key=\"editNotes\"\n      icon={<EditStyled />}\n      onClick={onEditNotes}\n    >\n      {ingredientForm.notes ? 'Edit notes' : 'Add notes'}\n    </MenuOrDrawerItem>,\n    <MenuOrDrawerItem key=\"remove\" icon={<Trash2Styled />} onClick={onRemove}>\n      Remove\n    </MenuOrDrawerItem>,\n  ]\n}\n\nexport default getMenuOrDrawerItems\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/index.tsx",
    "content": "import { IngredientForm } from 'ingredients'\nimport { Draggable } from 'react-beautiful-dnd'\nimport { memo } from 'react'\nimport { FoodModal, useFoods } from 'foods'\nimport { ContextMenuFlex } from 'general'\nimport PresenceAnimation from './PresenceAnimation'\nimport useIngredientsEvents from './useIngredientsEvents'\nimport getMenuOrDrawerItems from './getMenuOrDrawerItems'\nimport StatsLayout from './StatsLayout'\nimport MissingStatsLayout from './MissingStatsLayout'\nimport { useDisclosure } from '@chakra-ui/react'\nimport { EditNotesModal } from 'notes'\nimport useNotesEvents from './useNotesEvents'\nimport Notes from './Notes'\nimport MenuOrDrawer from './MenuOrDrawer'\n\ntype Props = {\n  variantIndex: number\n  mealIndex: number\n  index: number\n  ingredientForm: IngredientForm\n  energy: number\n  protein: number\n  carbs: number\n  fat: number\n  onRemove: (variantIndex: number, mealIndex: number, index: number) => void\n  shouldAddRadiusToLastBottomBorder: boolean\n  isLast: boolean\n  isDraggingOver: boolean\n}\n\nfunction IngredientItem({\n  variantIndex,\n  mealIndex,\n  index,\n  ingredientForm,\n  energy,\n  protein,\n  carbs,\n  fat,\n  onRemove,\n  shouldAddRadiusToLastBottomBorder,\n  isLast,\n  isDraggingOver,\n  ...rest\n}: Props) {\n  const { foodsById } = useFoods()\n  const food = foodsById[ingredientForm.foodId]\n\n  const ingredientEvents = useIngredientsEvents({\n    variantIndex,\n    mealIndex,\n    index,\n    onRemove,\n    ingredientForm,\n    food,\n  })\n\n  const notesEvents = useNotesEvents({\n    variantIndex,\n    mealIndex,\n    index,\n    ingredientForm,\n  })\n\n  const foodModalDisclosure = useDisclosure()\n  const editNotesModalDisclosure = useDisclosure()\n\n  const menuOrDrawerItems = getMenuOrDrawerItems({\n    onEditNotes: editNotesModalDisclosure.onOpen,\n    onRemove: ingredientEvents.onRemoveRequest,\n    onViewFoodDetails: foodModalDisclosure.onOpen,\n    ingredientForm,\n  })\n\n  // console.log('ingredient', variantIndex, mealIndex, index)\n\n  return (\n    <Draggable\n      key={ingredientForm.fieldId}\n      draggableId={ingredientForm.fieldId as string}\n      index={index}\n    >\n      {(provided, { isDragging }) => (\n        <PresenceAnimation\n          shouldAnimate={ingredientEvents.shouldAnimate}\n          onAnimationComplete={ingredientEvents.onAnimationComplete}\n          isVisible={ingredientEvents.isVisible}\n          isDraggingOver={isDraggingOver}\n        >\n          <ContextMenuFlex\n            ref={provided.innerRef}\n            {...provided.draggableProps}\n            {...provided.dragHandleProps}\n            style={provided.draggableProps.style}\n            boxShadow={\n              isDragging\n                ? 'rgba(0, 0, 0, 0.2) 0px 5px 10px, rgba(0, 0, 0, 0.4) 0px 15px 40px'\n                : undefined\n            }\n            bg={isDragging ? 'gray.50' : undefined}\n            alignItems=\"center\"\n            position=\"relative\"\n            py={3}\n            _hover={{ backgroundColor: 'gray.50' }}\n            borderBottomRadius={\n              !isDragging && isLast && shouldAddRadiusToLastBottomBorder\n                ? 10\n                : 0\n            }\n            overflow=\"hidden\"\n            menuOrDrawerItems={menuOrDrawerItems}\n            {...rest}\n          >\n            {food ? (\n              <StatsLayout\n                ingredientForm={ingredientForm}\n                energy={energy}\n                protein={protein}\n                carbs={carbs}\n                fat={fat}\n                onAmountChange={ingredientEvents.onAmountChange}\n                onPortionChange={ingredientEvents.onPortionChange}\n                menuElement={<MenuOrDrawer>{menuOrDrawerItems}</MenuOrDrawer>}\n                food={food}\n                notes={ingredientForm.notes}\n              >\n                {ingredientForm.notes && (\n                  <Notes\n                    ingredientForm={ingredientForm}\n                    notesEvents={notesEvents}\n                  />\n                )}\n              </StatsLayout>\n            ) : (\n              <MissingStatsLayout\n                onRemoveRequest={ingredientEvents.onRemoveRequest}\n              />\n            )}\n          </ContextMenuFlex>\n\n          {food && (\n            <FoodModal\n              isOpen={foodModalDisclosure.isOpen}\n              onClose={foodModalDisclosure.onClose}\n              onFoodCreatedOrUpdated={ingredientEvents.onFoodUpdated}\n              food={food}\n            />\n          )}\n\n          {food && (\n            <EditNotesModal\n              isOpen={editNotesModalDisclosure.isOpen}\n              onClose={editNotesModalDisclosure.onClose}\n              notes={ingredientForm.notes}\n              onEditNotes={notesEvents.onEditNotes}\n              fieldId={ingredientForm.fieldId}\n              ownerName={food.name}\n            />\n          )}\n        </PresenceAnimation>\n      )}\n    </Draggable>\n  )\n}\n\nexport default memo(IngredientItem)\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/useIngredientsEvents.ts",
    "content": "import { useDietFormActions } from 'diets'\nimport { useOneTimeCheckActions } from 'general'\nimport { ChangeEvent, useState } from 'react'\nimport {\n  getInsertIngredientFormAnimationKey,\n  IngredientForm,\n} from 'ingredients'\nimport { useToast } from '@chakra-ui/toast'\nimport { Portion, formatAmount, useGetAmount } from 'portions'\nimport { Food } from 'foods'\nimport amountAsNumber from 'stats/amountAsNumber'\n\ntype Params = {\n  variantIndex: number\n  mealIndex: number\n  index: number\n  ingredientForm: IngredientForm\n  food: Food\n  onRemove: (variantIndex: number, mealIndex: number, index: number) => void\n}\n\nfunction useIngredientsEvents({\n  variantIndex,\n  mealIndex,\n  index,\n  onRemove,\n  ingredientForm,\n  food,\n}: Params) {\n  const [isVisible, setIsVisible] = useState(true)\n  const dietFormActions = useDietFormActions()\n  const toast = useToast()\n  const { getAmountFromPortionToPortion } = useGetAmount()\n\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const shouldAnimate = oneTimeCheckActions.checkAndReset(\n    getInsertIngredientFormAnimationKey(ingredientForm.fieldId)\n  )\n\n  function onAmountChange(event: ChangeEvent<HTMLInputElement>) {\n    const { value } = event.target\n\n    dietFormActions.updateIngredientForm(variantIndex, mealIndex, index, {\n      amount: value,\n    })\n  }\n\n  function onPortionChange(newPortion: Portion) {\n    const newAmount = getAmountFromPortionToPortion(\n      amountAsNumber(ingredientForm.amount),\n      ingredientForm.portionId,\n      newPortion.id,\n      food\n    )\n\n    dietFormActions.updateIngredientForm(variantIndex, mealIndex, index, {\n      portionId: newPortion.id,\n      amount: formatAmount(newAmount, newPortion.id),\n    })\n  }\n\n  function onAnimationComplete() {\n    if (!isVisible) {\n      onRemove(variantIndex, mealIndex, index)\n    }\n  }\n\n  function onFoodUpdated() {\n    toast({\n      position: 'top',\n      title: 'Food updated',\n      status: 'success',\n      duration: 2000,\n      isClosable: true,\n    })\n  }\n\n  function onRemoveRequest() {\n    setIsVisible(false)\n  }\n\n  return {\n    onAmountChange,\n    onAnimationComplete,\n    onRemoveRequest,\n    isVisible,\n    shouldAnimate,\n    onFoodUpdated,\n    onPortionChange,\n  }\n}\n\nexport default useIngredientsEvents\n"
  },
  {
    "path": "src/ingredients/IngredientsList/IngredientItem/useNotesEvents.tsx",
    "content": "import { useDietFormActions } from 'diets'\nimport { useOneTimeCheckActions } from 'general'\nimport { IngredientForm } from 'ingredients'\nimport { useRef, useState } from 'react'\n\ntype Params = {\n  variantIndex: number\n  mealIndex: number\n  index: number\n  ingredientForm: IngredientForm\n}\n\nfunction useNotesEvents({\n  variantIndex,\n  mealIndex,\n  index,\n  ingredientForm,\n}: Params) {\n  const [areNotesVisible, setAreNotesVisible] = useState(true)\n  const dietFormActions = useDietFormActions()\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const ref = useRef<string>()\n\n  const shouldAnimateNotes = oneTimeCheckActions.checkAndReset(\n    `notes-${ingredientForm.fieldId}`\n  )\n\n  function onEditNotes(notes?: string) {\n    if (ingredientForm.notes) {\n      ref.current = notes\n      setAreNotesVisible(false)\n    } else {\n      if (notes) {\n        dietFormActions.updateIngredientForm(variantIndex, mealIndex, index, {\n          notes,\n        })\n      }\n      setAreNotesVisible(Boolean(notes))\n    }\n  }\n\n  function onNotesAnimationComplete() {\n    if (!areNotesVisible) {\n      dietFormActions.updateIngredientForm(variantIndex, mealIndex, index, {\n        notes: ref.current,\n      })\n      ref.current = undefined\n\n      setAreNotesVisible(true)\n    }\n  }\n\n  return {\n    areNotesVisible,\n    shouldAnimateNotes,\n    onEditNotes,\n    onNotesAnimationComplete,\n  }\n}\n\ntype NotesEvents = ReturnType<typeof useNotesEvents>\n\nexport type { NotesEvents }\n\nexport default useNotesEvents\n"
  },
  {
    "path": "src/ingredients/IngredientsList/index.tsx",
    "content": "import { Box, Fade } from '@chakra-ui/react'\nimport IngredientItem from './IngredientItem'\nimport { Droppable } from 'react-beautiful-dnd'\nimport EmptyList from './EmptyList'\nimport { useDietFormActions } from 'diets'\nimport { IngredientForm } from 'ingredients'\nimport { memo } from 'react'\nimport { Stats } from 'stats'\n\ntype Props = {\n  mealIndex: number\n  variantIndex: number\n  mealFormFieldId: string\n  onAddIngredients: () => void\n  ingredientsForms: IngredientForm[]\n  ingredientsStats: Stats[]\n  shouldAddRadiusToLastBottomBorder?: boolean\n}\n\nfunction IngredientsList({\n  variantIndex,\n  mealIndex,\n  mealFormFieldId,\n  onAddIngredients,\n  ingredientsForms,\n  ingredientsStats,\n  shouldAddRadiusToLastBottomBorder,\n}: Props) {\n  const dietFormActions = useDietFormActions()\n\n  return (\n    <Droppable droppableId={mealFormFieldId} type=\"ingredientsList\">\n      {(provided, snapshot) => (\n        <Box ref={provided.innerRef} minHeight=\"56px\">\n          {ingredientsForms.map((ingredientForm, index) => {\n            const { energy, protein, carbs, fat } = ingredientsStats[index]\n\n            return (\n              <IngredientItem\n                key={ingredientForm.fieldId}\n                data-test-type=\"ingredient\"\n                data-test-index={index}\n                onRemove={dietFormActions.removeIngredientForm}\n                variantIndex={variantIndex}\n                mealIndex={mealIndex}\n                index={index}\n                ingredientForm={ingredientForm}\n                energy={energy}\n                protein={protein}\n                carbs={carbs}\n                fat={fat}\n                isLast={index === ingredientsForms.length - 1}\n                isDraggingOver={snapshot.isDraggingOver}\n                shouldAddRadiusToLastBottomBorder={\n                  shouldAddRadiusToLastBottomBorder !== undefined\n                    ? shouldAddRadiusToLastBottomBorder\n                    : index === ingredientsForms.length - 1\n                }\n              />\n            )\n          })}\n          {ingredientsForms.length > 0 && provided.placeholder}\n          {ingredientsForms.length === 0 && (\n            <Fade initial={false} in={true}>\n              <EmptyList onAddIngredients={onAddIngredients} />\n            </Fade>\n          )}\n        </Box>\n      )}\n    </Droppable>\n  )\n}\n\nexport default memo(IngredientsList)\n"
  },
  {
    "path": "src/ingredients/PdfIngredientsList/PdfIngredientItem/FoodName.tsx",
    "content": "import { Text, StyleSheet, View, Link } from '@react-pdf/renderer'\nimport { Food, FoodId } from 'foods'\nimport { IngredientForm } from 'ingredients'\nimport { Portion } from 'portions'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport getIngredientPortionDescription from 'portions/getIngredientPortionDescription'\ntype Props = {\n  ingredientForm: IngredientForm\n  foodsById: Record<FoodId, Food>\n  portionsById: Record<string, Portion>\n}\n\nfunction Name({ ingredientForm, foodsById, portionsById }: Props) {\n  const { foodId } = ingredientForm\n  const food = foodsById[foodId]\n\n  const text = (\n    <>\n      <Text style={{ fontWeight: 'medium' }}>\n        {getIngredientPortionDescription(\n          ingredientForm,\n          foodsById,\n          portionsById\n        )}\n      </Text>{' '}\n      {food.name}\n    </>\n  )\n\n  return (\n    <View style={styles.root}>\n      {food.url ? (\n        <Link\n          src={food.url}\n          style={[\n            styles.nameLink,\n            {\n              color: getComputedColorFromChakra('teal.500'),\n            },\n          ]}\n        >\n          {text}\n        </Link>\n      ) : (\n        <Text\n          style={[\n            styles.nameText,\n            { color: getComputedColorFromChakra('gray.600') },\n          ]}\n        >\n          {text}\n        </Text>\n      )}\n\n      {ingredientForm.notes && (\n        <Text\n          style={[\n            styles.notes,\n            { color: getComputedColorFromChakra('gray.500') },\n          ]}\n        >\n          {ingredientForm.notes}\n        </Text>\n      )}\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: { marginLeft: 12 },\n  nameText: {\n    fontSize: 14,\n  },\n  nameLink: {\n    fontSize: 14,\n    textDecoration: 'none',\n  },\n  notes: {\n    marginTop: 3,\n    fontSize: 12,\n  },\n})\n\nexport default Name\n"
  },
  {
    "path": "src/ingredients/PdfIngredientsList/PdfIngredientItem/index.tsx",
    "content": "import { StyleSheet, View } from '@react-pdf/renderer'\nimport { Food, FoodId } from 'foods'\nimport { IngredientForm } from 'ingredients'\nimport { Portion } from 'portions'\nimport { Stats } from 'stats'\nimport PdfStat from 'stats/PdfStat'\nimport PdfStatsLayout from 'stats/PdfStatsLayout'\nimport FoodName from './FoodName'\n\ntype Props = {\n  ingredientForm: IngredientForm\n  stats: Stats\n  foodsById: Record<FoodId, Food>\n  portionsById: Record<string, Portion>\n  isLast: boolean\n}\n\nfunction PdfIngredientItem({\n  ingredientForm,\n  stats,\n  foodsById,\n  portionsById,\n  isLast,\n}: Props) {\n  return (\n    <View\n      style={[\n        styles.root,\n        isLast ? { borderBottomLeftRadius: 7, borderBottomRightRadius: 7 } : {},\n      ]}\n    >\n      <PdfStatsLayout\n        nameElement={\n          <FoodName\n            ingredientForm={ingredientForm}\n            foodsById={foodsById}\n            portionsById={portionsById}\n          />\n        }\n        energyElement={\n          <PdfStat variant=\"ingredientEnergy\" value={stats.energy} />\n        }\n        proteinElement={<PdfStat variant=\"ingredient\" value={stats.protein} />}\n        carbsElement={<PdfStat variant=\"ingredient\" value={stats.carbs} />}\n        fatElement={<PdfStat variant=\"ingredient\" value={stats.fat} />}\n      />\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: { paddingTop: 12, paddingBottom: 12, backgroundColor: 'white' },\n  name: {\n    fontSize: 14,\n  },\n})\n\nexport default PdfIngredientItem\n"
  },
  {
    "path": "src/ingredients/PdfIngredientsList/index.tsx",
    "content": "import { View, Text, StyleSheet } from '@react-pdf/renderer'\nimport { Food, FoodId } from 'foods'\nimport { IngredientForm } from 'ingredients'\nimport { Portion } from 'portions'\nimport { Stats } from 'stats'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport PdfIngredientItem from './PdfIngredientItem'\n\ntype Props = {\n  ingredientsForms: IngredientForm[]\n  ingredientsFormsStats: Stats[]\n  foodsById: Record<FoodId, Food>\n  portionsById: Record<string, Portion>\n}\n\nfunction PdfIngredientsList({\n  ingredientsForms,\n  ingredientsFormsStats,\n  foodsById,\n  portionsById,\n}: Props) {\n  const filteredIngredientsForms = ingredientsForms.filter(\n    ({ foodId }) => foodsById[foodId]\n  )\n\n  return (\n    <View>\n      {filteredIngredientsForms.map((ingredientForm, index) => {\n        const stats = ingredientsFormsStats[index]\n\n        return (\n          <PdfIngredientItem\n            key={ingredientForm.fieldId}\n            ingredientForm={ingredientForm}\n            stats={stats}\n            foodsById={foodsById}\n            portionsById={portionsById}\n            isLast={index === filteredIngredientsForms.length - 1}\n          />\n        )\n      })}\n      {ingredientsForms.length === 0 && (\n        <Text\n          style={[\n            styles.emptyListText,\n            {\n              color: getComputedColorFromChakra('gray.500'),\n            },\n          ]}\n        >\n          You haven't added any foods\n        </Text>\n      )}\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  emptyListText: {\n    backgroundColor: 'white',\n    padding: 12,\n    fontSize: 14,\n    borderBottomLeftRadius: 7,\n    borderBottomRightRadius: 7,\n  },\n})\n\nexport default PdfIngredientsList\n"
  },
  {
    "path": "src/ingredients/getIngredient.ts",
    "content": "import { DEFAULT_SERVING_SIZE_IN_GRAMS, Food } from 'foods'\nimport { Ingredient } from './types'\n\nfunction getIngredient(food: Food): Ingredient {\n  const { volume } = food\n\n  if (\n    volume &&\n    ['tablespoons', 'teaspoons', 'cups'].includes(volume.portionId)\n  ) {\n    const { portionId } = volume\n\n    return {\n      foodId: food.id,\n      amount: 1,\n      portionId,\n    }\n  }\n\n  return {\n    foodId: food.id,\n    amount: food.servingSizeInGrams || DEFAULT_SERVING_SIZE_IN_GRAMS,\n    portionId: 'grams',\n  }\n}\n\nexport default getIngredient\n"
  },
  {
    "path": "src/ingredients/index.ts",
    "content": "export { default as IngredientsList } from './IngredientsList'\nexport * from './ingredientForm'\nexport { default as useIngredientsFormsActions } from './useIngredientsFormsActions'\nexport * from './useIngredientsFormsActions'\nexport * from './types'\nexport { default as useGetIngredientFormStatsTree } from './useGetIngredientFormStatsTree'\nexport { default as getIngredient } from './getIngredient'\n"
  },
  {
    "path": "src/ingredients/ingredientForm.ts",
    "content": "import { Ingredient } from './types'\nimport { v4 as uuidv4 } from 'uuid'\nimport { FoodId } from 'foods'\nimport { formatAmount } from 'portions'\n\ntype IngredientForm = {\n  fieldId: string\n  foodId: FoodId\n  amount: string\n  notes?: string\n  portionId: string\n}\n\nfunction getIngredientForm(ingredient: Ingredient): IngredientForm {\n  const fieldId = uuidv4()\n\n  return {\n    fieldId,\n    foodId: ingredient.foodId,\n    amount: formatAmount(ingredient.amount, ingredient.portionId),\n    portionId: ingredient.portionId,\n  }\n}\n\nfunction getInsertIngredientFormAnimationKey(fieldId: string) {\n  return `insert-ingredient-animation-${fieldId}`\n}\n\nexport type { IngredientForm }\n\nexport { getIngredientForm, getInsertIngredientFormAnimationKey }\n"
  },
  {
    "path": "src/ingredients/types.ts",
    "content": "import { FoodId } from 'foods'\n\ntype Ingredient = {\n  foodId: FoodId\n  amount: number\n  portionId: string\n}\n\nexport type { Ingredient }\n"
  },
  {
    "path": "src/ingredients/useGetIngredientFormStatsTree.ts",
    "content": "import { useFoods } from 'foods'\nimport { IngredientForm } from './ingredientForm'\nimport { StatsTree, objectFromNutritionDataKeys, Stats } from 'stats'\nimport { DEFAULT_SERVING_SIZE_IN_GRAMS } from 'foods'\nimport { useGetAmount } from 'portions'\nimport { useCallback } from 'react'\nimport amountAsNumber from 'stats/amountAsNumber'\n\nfunction useGetIngredientFormStatsTree() {\n  const { foodsById } = useFoods()\n  const { getAmountFromPortionToGrams } = useGetAmount()\n\n  const getIngredientFormStatsTree = useCallback(\n    (ingredientForm: IngredientForm): StatsTree => {\n      const food = foodsById[ingredientForm.foodId]\n      let stats: Stats\n\n      if (food) {\n        const amountInGrams = getAmountFromPortionToGrams(\n          amountAsNumber(ingredientForm.amount),\n          ingredientForm.portionId,\n          food\n        )\n        const servingSizeInGrams =\n          food.servingSizeInGrams || DEFAULT_SERVING_SIZE_IN_GRAMS\n        const scale = amountInGrams / servingSizeInGrams\n\n        stats = {\n          amountInGrams,\n          ...objectFromNutritionDataKeys(key => Math.round(scale * food[key])),\n        }\n      } else {\n        stats = {\n          amountInGrams: 0,\n          ...objectFromNutritionDataKeys(() => 0),\n        }\n      }\n\n      return {\n        id: ingredientForm.fieldId,\n        stats,\n        subtrees: [],\n      }\n    },\n    [foodsById, getAmountFromPortionToGrams]\n  )\n\n  return getIngredientFormStatsTree\n}\n\nexport default useGetIngredientFormStatsTree\n"
  },
  {
    "path": "src/ingredients/useIngredientsFormsActions.ts",
    "content": "import { useCallback, SetStateAction } from 'react'\nimport { DietForm } from 'diets'\nimport produce from 'immer'\nimport {\n  getIngredientForm,\n  getInsertIngredientFormAnimationKey,\n  IngredientForm,\n} from './ingredientForm'\nimport { OneTimeCheckActions } from 'general'\nimport { Food } from 'foods'\nimport { getIngredient } from 'ingredients'\n\ntype Params = {\n  setDietForm: (action: SetStateAction<DietForm>) => void\n  oneTimeCheckActions: OneTimeCheckActions\n}\n\nfunction useIngredientsFormsActions({\n  setDietForm,\n\n  oneTimeCheckActions,\n}: Params) {\n  const appendIngredientsForms = useCallback(\n    (variantFormIndex: number, mealFormIndex: number, foods: Food[]) => {\n      setDietForm(dietForm =>\n        produce(dietForm, draftDietForm => {\n          const ingredients = foods.map(getIngredient)\n          const ingredientForms = ingredients.map(getIngredientForm)\n\n          ingredientForms.forEach(({ fieldId }) => {\n            oneTimeCheckActions.set(\n              getInsertIngredientFormAnimationKey(fieldId)\n            )\n          })\n          const { variantsForms } = draftDietForm\n          const { mealsForms } = variantsForms[variantFormIndex]\n          const { ingredientsForms } = mealsForms[mealFormIndex]\n          ingredientsForms.push(...ingredientForms)\n        })\n      )\n    },\n    [setDietForm, oneTimeCheckActions]\n  )\n\n  const removeIngredientForm = useCallback(\n    (\n      variantFormIndex: number,\n      mealFormIndex: number,\n      ingredientFormIndex: number\n    ) => {\n      setDietForm(dietForm =>\n        produce(dietForm, draftDietForm => {\n          const { variantsForms } = draftDietForm\n          const { mealsForms } = variantsForms[variantFormIndex]\n          const { ingredientsForms } = mealsForms[mealFormIndex]\n\n          ingredientsForms.splice(ingredientFormIndex, 1)\n        })\n      )\n    },\n    [setDietForm]\n  )\n\n  const updateIngredientForm = useCallback(\n    (\n      variantFormIndex: number,\n      mealFormIndex: number,\n      ingredinetFormIndex: number,\n      partialIngredientForm: Partial<IngredientForm>\n    ) => {\n      setDietForm(dietForm =>\n        produce(dietForm, draftDietForm => {\n          const { variantsForms } = draftDietForm\n          const { mealsForms } = variantsForms[variantFormIndex]\n          const { ingredientsForms } = mealsForms[mealFormIndex]\n          const ingredientForm = ingredientsForms[ingredinetFormIndex]\n\n          ingredientsForms[ingredinetFormIndex] = {\n            ...ingredientForm,\n            ...partialIngredientForm,\n          }\n        })\n      )\n    },\n    [setDietForm]\n  )\n\n  const moveIngredientForm = useCallback(\n    (\n      sourceMealFormId: string,\n      sourceIngredientFormIndex: number,\n      destinationMealFormId: string,\n      destinationIngredientFormIndex: number\n    ) => {\n      setDietForm(dietForm =>\n        produce(dietForm, draftDietForm => {\n          const { selectedVariantFormIndex } = dietForm\n\n          const { mealsForms } = draftDietForm.variantsForms[\n            selectedVariantFormIndex\n          ]\n          const sourceMealForm = mealsForms.find(\n            ({ fieldId }) => fieldId === sourceMealFormId\n          )\n          let ingredientForm\n\n          if (sourceMealForm) {\n            ingredientForm =\n              sourceMealForm.ingredientsForms[sourceIngredientFormIndex]\n            sourceMealForm.ingredientsForms.splice(sourceIngredientFormIndex, 1)\n          }\n\n          const destinationMealForm = mealsForms.find(\n            ({ fieldId }) => fieldId === destinationMealFormId\n          )\n\n          if (destinationMealForm && ingredientForm) {\n            destinationMealForm.ingredientsForms.splice(\n              destinationIngredientFormIndex,\n              0,\n              ingredientForm\n            )\n          }\n        })\n      )\n    },\n    [setDietForm]\n  )\n\n  return {\n    appendIngredientsForms,\n    removeIngredientForm,\n    updateIngredientForm,\n    moveIngredientForm,\n  }\n}\n\ntype IngredientsFormsActions = ReturnType<typeof useIngredientsFormsActions>\n\nexport type { IngredientsFormsActions }\n\nexport default useIngredientsFormsActions\n"
  },
  {
    "path": "src/layout/MainLayout.tsx",
    "content": "import {\n  createContext,\n  ReactElement,\n  ReactNode,\n  RefObject,\n  useRef,\n} from 'react'\nimport { Box } from '@chakra-ui/react'\nimport useHasSideNavigation from './useHasSideNavigation'\n\nexport type MainLayoutProps = {\n  sidebarElement?: ReactElement\n  children: ReactNode\n}\n\nconst ContentBoxRefContext = createContext<RefObject<HTMLDivElement | null>>({\n  current: null,\n})\n\nfunction MainLayout({ children }: MainLayoutProps) {\n  const hasSideNavigation = useHasSideNavigation()\n  const contentBoxRef = useRef<HTMLDivElement>(null)\n\n  return (\n    <Box>\n      {hasSideNavigation && (\n        <Box\n          top=\"0\"\n          height=\"100vh\"\n          position=\"fixed\"\n          width=\"200px\"\n          bg=\"teal.500\"\n        />\n      )}\n\n      <ContentBoxRefContext.Provider value={contentBoxRef}>\n        <Box\n          ref={contentBoxRef}\n          bg={{ base: 'white', lg: 'gray.50' }}\n          ml={hasSideNavigation ? '200px' : 0}\n        >\n          {children}\n        </Box>\n      </ContentBoxRefContext.Provider>\n    </Box>\n  )\n}\n\nexport { ContentBoxRefContext }\n\nexport default MainLayout\n"
  },
  {
    "path": "src/layout/Page/ElementContainer.tsx",
    "content": "import { Box, BoxProps } from '@chakra-ui/react'\nimport { ForwardedRef, ReactNode, forwardRef } from 'react'\n\ntype Props = {\n  children: ReactNode\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n} & BoxProps\n\nfunction ElementContainer({ children, forwardedRef, ...rest }: Props) {\n  return (\n    <Box flex={1} ref={forwardedRef} bg=\"gray.50\" maxWidth=\"1000px\" {...rest}>\n      {children}\n    </Box>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <ElementContainer {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/layout/Page/PageBody.tsx",
    "content": "import { Flex } from '@chakra-ui/react'\nimport { ReactNode } from 'react'\nimport ElementContainer from './ElementContainer'\n\ntype Props = {\n  children: ReactNode\n}\n\nfunction PageBody({ children }: Props) {\n  return (\n    <Flex px={3} width=\"100%\" bg=\"gray.50\" justifyContent=\"center\">\n      <ElementContainer width=\"100%\">{children}</ElementContainer>\n    </Flex>\n  )\n}\n\nexport default PageBody\n"
  },
  {
    "path": "src/layout/Page/PageFooter.tsx",
    "content": "import { Box } from '@chakra-ui/react'\nimport { ReactNode, RefObject } from 'react'\nimport ElementContainer from './ElementContainer'\n\ntype Props = {\n  children: ReactNode\n  footerContainerRef?: RefObject<HTMLDivElement>\n}\n\nfunction PageFooter({ children, footerContainerRef }: Props) {\n  return (\n    <Box\n      bg=\"white\"\n      boxShadow=\"md\"\n      position=\"fixed\"\n      bottom=\"0\"\n      left={0}\n      right={0}\n      zIndex={2}\n    >\n      <ElementContainer mx=\"auto\" ref={footerContainerRef}>\n        <Box py={3} bg=\"white\">\n          {children}\n        </Box>\n      </ElementContainer>\n    </Box>\n  )\n}\n\nexport default PageFooter\n"
  },
  {
    "path": "src/layout/Page/PageHeader.tsx",
    "content": "import { Box, Flex } from '@chakra-ui/react'\nimport { ForwardedRef, forwardRef, ReactNode } from 'react'\nimport ElementContainer from './ElementContainer'\n\ntype Props = {\n  children: ReactNode\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n}\n\nfunction PageHeader({ children, forwardedRef }: Props) {\n  return (\n    <Flex\n      ref={forwardedRef}\n      justifyContent=\"center\"\n      position=\"sticky\"\n      top=\"0\"\n      bg=\"white\"\n      zIndex={2}\n      boxShadow=\"md\"\n      px={3}\n    >\n      <ElementContainer>\n        <Box>{children}</Box>\n      </ElementContainer>\n    </Flex>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <PageHeader forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/layout/Page/index.tsx",
    "content": "import { Box } from '@chakra-ui/react'\nimport { ReactNode } from 'react'\n\ntype Props = {\n  children: ReactNode\n}\n\nfunction Page({ children }: Props) {\n  return (\n    <Box>\n      <Box position=\"relative\" zIndex={1}>\n        {children}\n      </Box>\n    </Box>\n  )\n}\n\nexport { default as PageHeader } from './PageHeader'\nexport { default as PageBody } from './PageBody'\nexport { default as PageFooter } from './PageFooter'\n\nexport default Page\n"
  },
  {
    "path": "src/layout/RightAligned.tsx",
    "content": "import { Flex, FlexProps } from '@chakra-ui/react'\nimport { ReactNode } from 'react'\n\ntype Props = {\n  children: ReactNode\n} & FlexProps\n\nfunction RightAligned({ children, ...rest }: Props) {\n  return (\n    <Flex\n      width=\"100%\"\n      height=\"100%\"\n      alignItems=\"flex-end\"\n      justifyContent=\"center\"\n      flexDirection=\"column\"\n      {...rest}\n    >\n      {children}\n    </Flex>\n  )\n}\n\nexport default RightAligned\n"
  },
  {
    "path": "src/layout/index.tsx",
    "content": "export { default as Page } from './Page'\nexport * from './Page'\nexport { default as MainLayout } from './MainLayout'\nexport * from './MainLayout'\nexport { default as RightAligned } from './RightAligned'\n"
  },
  {
    "path": "src/layout/useHasSideNavigation.ts",
    "content": "// import { useScreenSize } from 'general'\n\nfunction useHasSideNavigation() {\n  /*const screenSize = useScreenSize()\n  return screenSize >= ScreenSize.Large*/\n\n  return false\n}\n\nexport default useHasSideNavigation\n"
  },
  {
    "path": "src/meals/MealsList/EmptyList.tsx",
    "content": "import { Text, Center, chakra, Button, VStack } from '@chakra-ui/react'\nimport { Plus } from 'react-feather'\n\nconst PlusStyled = chakra(Plus)\n\ntype Props = {\n  onAddMeal: () => void\n}\n\nfunction EmptyList({ onAddMeal }: Props) {\n  return (\n    <Center\n      textAlign=\"center\"\n      bg=\"white\"\n      boxShadow=\"base\"\n      borderRadius={6}\n      flex={1}\n      p={6}\n      flexDirection=\"column\"\n    >\n      <VStack spacing={6}>\n        <Text fontSize=\"xl\" fontWeight=\"medium\" textColor=\"gray.500\">\n          You haven't added any meals to this day yet\n        </Text>\n        <Text maxWidth=\"450px\" mt={3} fontSize=\"md\" textColor=\"gray.500\">\n          Days can be specific weekdays or just types of days. For example: a\n          training or a rest day.\n        </Text>\n        <Button\n          mt={3}\n          onClick={onAddMeal}\n          colorScheme=\"teal\"\n          variant=\"outline\"\n          size=\"md\"\n          leftIcon={<PlusStyled size={16} pointerEvents=\"none\" />}\n        >\n          Add meal\n        </Button>\n      </VStack>\n    </Center>\n  )\n}\n\nexport default EmptyList\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/Header/MenuOrDrawer.tsx",
    "content": "import { RightAligned } from 'layout'\nimport { MenuOrDrawer as MenuOrDrawerBase } from 'general'\nimport { ReactElement } from 'react'\n\ntype Props = {\n  children: ReactElement[]\n}\n\nfunction MenuOrDrawer({ children }: Props) {\n  return (\n    <RightAligned>\n      <MenuOrDrawerBase\n        mr={3}\n        title=\"Meal\"\n        variant=\"ghost\"\n        _hover={{ backgroundColor: 'gray.200' }}\n        aria-label=\"Meal actions\"\n      >\n        {children}\n      </MenuOrDrawerBase>\n    </RightAligned>\n  )\n}\n\nexport default MenuOrDrawer\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/Header/Name.tsx",
    "content": "import { BoxProps, Input, Flex } from '@chakra-ui/react'\nimport { useDietFormActions } from 'diets'\nimport { MealForm } from 'meals'\nimport { RefObject, ChangeEvent } from 'react'\n\ntype Props = {\n  variantIndex: number\n  mealForm: MealForm\n  index: number\n  getMealNameInputRefById: (id: string) => RefObject<HTMLInputElement>\n} & BoxProps\n\nfunction Name({\n  variantIndex,\n  mealForm,\n  index,\n  getMealNameInputRefById,\n  ...rest\n}: Props) {\n  const dietFormActions = useDietFormActions()\n\n  function onNameChange(event: ChangeEvent<HTMLInputElement>) {\n    const { value } = event.target\n\n    dietFormActions.updateMealForm(variantIndex, index, {\n      name: value,\n    })\n  }\n\n  return (\n    <Flex alignItems=\"center\" height=\"100%\">\n      <Input\n        ref={getMealNameInputRefById(mealForm.fieldId)}\n        placeholder=\"Meal name\"\n        onChange={onNameChange}\n        autoComplete=\"off\"\n        width=\"80%\"\n        bg=\"white\"\n        fontWeight=\"medium\"\n        textColor=\"gray.800\"\n        size=\"md\"\n        value={mealForm.name}\n        {...rest}\n      />\n    </Flex>\n  )\n}\n\nexport default Name\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/Header/getMenuOrDrawerItems.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\nimport { Plus, Trash2, Copy, Edit } from 'react-feather'\nimport { MealForm } from 'meals'\nimport { MenuOrDrawerItem, MenuOrDrawerSeparator } from 'general'\n\nconst PlusStyled = chakra(Plus)\nconst Trash2Styled = chakra(Trash2)\nconst CopyStyled = chakra(Copy)\nconst EditStyled = chakra(Edit)\n\ntype Params = {\n  onRemove: () => void\n  onEditNotes: () => void\n  onAddIngredient: () => void\n  onClone: () => void\n  mealForm: MealForm\n}\n\nfunction getMenuOrDrawerItems({\n  onRemove,\n  onAddIngredient,\n  onClone,\n  onEditNotes,\n  mealForm,\n}: Params) {\n  return [\n    <MenuOrDrawerItem\n      icon={<PlusStyled pointerEvents=\"none\" />}\n      key=\"addFoods\"\n      onClick={() => onAddIngredient()}\n    >\n      Add foods\n    </MenuOrDrawerItem>,\n    <MenuOrDrawerSeparator key=\"divider\" />,\n    <MenuOrDrawerItem\n      key=\"editNotes\"\n      icon={<EditStyled pointerEvents=\"none\" />}\n      onClick={() => onEditNotes()}\n    >\n      {mealForm.notes ? 'Edit notes' : 'Add notes'}\n    </MenuOrDrawerItem>,\n    <MenuOrDrawerItem\n      key=\"duplicateMeal\"\n      icon={<CopyStyled pointerEvents=\"none\" />}\n      onClick={() => onClone()}\n    >\n      Duplicate\n    </MenuOrDrawerItem>,\n\n    <MenuOrDrawerItem\n      key=\"remove\"\n      icon={<Trash2Styled pointerEvents=\"none\" />}\n      onClick={() => onRemove()}\n    >\n      Remove\n    </MenuOrDrawerItem>,\n  ]\n}\n\nexport default getMenuOrDrawerItems\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/Header/index.tsx",
    "content": "import { BoxProps } from '@chakra-ui/react'\nimport { MealForm } from 'meals'\nimport { Stat, StatsLayout } from 'stats'\nimport { RefObject } from 'react'\nimport Name from './Name'\nimport MenuOrDrawer from './MenuOrDrawer'\nimport { Stats } from 'stats'\nimport { ContextMenuFlex } from 'general'\nimport getMenuOrDrawerItems from './getMenuOrDrawerItems'\n\ntype Props = {\n  mealForm: MealForm\n  variantIndex: number\n  index: number\n  onAddIngredient: () => void\n  onRemove: () => void\n  onClone: () => void\n  onEditNotes: () => void\n  getMealNameInputRefById: (id: string) => RefObject<HTMLInputElement>\n  ingredientsStatsSum: Stats\n} & BoxProps\n\nfunction Header({\n  mealForm,\n  variantIndex,\n  index,\n  onRemove,\n  onClone,\n  onAddIngredient,\n  onEditNotes,\n  getMealNameInputRefById,\n  ingredientsStatsSum,\n  ...rest\n}: Props) {\n  const menuOrDrawerItems = getMenuOrDrawerItems({\n    onAddIngredient,\n    onRemove,\n    onClone,\n    onEditNotes,\n    mealForm,\n  })\n\n  return (\n    <ContextMenuFlex\n      bg=\"white\"\n      py={3}\n      borderTopRadius={10}\n      justifyContent=\"space-between\"\n      _hover={{ backgroundColor: 'gray.100' }}\n      menuOrDrawerItems={menuOrDrawerItems}\n      {...rest}\n    >\n      <StatsLayout\n        nameElement={\n          <Name\n            variantIndex={variantIndex}\n            ml={3}\n            mealForm={mealForm}\n            getMealNameInputRefById={getMealNameInputRefById}\n            index={index}\n          />\n        }\n        energyElement={\n          <Stat\n            type=\"mealEnergy\"\n            label=\"Calories\"\n            value={ingredientsStatsSum.energy}\n          />\n        }\n        proteinElement={\n          <Stat\n            type=\"meal\"\n            label=\"Protein\"\n            value={ingredientsStatsSum.protein}\n          />\n        }\n        carbsElement={\n          <Stat type=\"meal\" label=\"Carbs\" value={ingredientsStatsSum.carbs} />\n        }\n        fatElement={\n          <Stat type=\"meal\" label=\"Fat\" value={ingredientsStatsSum.fat} />\n        }\n        menuElement={<MenuOrDrawer>{menuOrDrawerItems}</MenuOrDrawer>}\n      />\n    </ContextMenuFlex>\n  )\n}\n\nexport default Header\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/Notes.tsx",
    "content": "import { Box, Text } from '@chakra-ui/react'\n\ntype Props = {\n  notes: string\n}\n\nfunction Notes({ notes }: Props) {\n  return (\n    <Box borderTopColor=\"gray.100\" borderTopWidth={1} p={3}>\n      <Text fontSize=\"md\" whiteSpace=\"pre-wrap\" color=\"gray.600\">\n        {notes}\n      </Text>\n    </Box>\n  )\n}\n\nexport default Notes\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/PresenceAnimation.tsx",
    "content": "import { ReactNode } from 'react'\nimport { motion } from 'framer-motion'\n\ntype Props = {\n  children: ReactNode\n  shouldAnimate: boolean\n  onAnimationComplete: () => void\n  isVisible: boolean\n  isDragging: boolean\n}\n\nconst variants = {\n  open: {\n    opacity: 1,\n    height: 'auto',\n  },\n\n  collapsed: { opacity: 0, height: 0, x: 0 },\n}\n\nfunction PresenceAnimation({\n  children,\n  onAnimationComplete,\n  shouldAnimate,\n  isVisible,\n  isDragging,\n}: Props) {\n  return (\n    <motion.div\n      transition={{\n        ease: 'easeInOut',\n        duration: 0.4,\n      }}\n      initial={shouldAnimate ? 'collapsed' : false}\n      animate={isVisible ? 'open' : 'collapsed'}\n      onAnimationComplete={onAnimationComplete}\n      variants={variants}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\nexport default PresenceAnimation\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/index.tsx",
    "content": "import { MealForm } from 'meals'\nimport { Flex, FlexProps, useDisclosure, Divider, Box } from '@chakra-ui/react'\nimport Header from './Header'\nimport { RefObject, memo } from 'react'\nimport { Draggable } from 'react-beautiful-dnd'\nimport { IngredientsList } from 'ingredients'\nimport { FoodsDrawer } from 'foods'\nimport PresenceAnimation from './PresenceAnimation'\nimport useMealFormEvents from './useMealFormEvents'\nimport { EditNotesModal } from 'notes'\nimport Notes from './Notes'\nimport useGetAndUpdateStats from './useGetAndUpdateStats'\n\ntype Props = {\n  mealForm: MealForm\n  index: number\n  variantIndex: number\n  onRemove: (variantIndex: number, index: number) => void\n  getMealNameInputRefById: (id: string) => RefObject<HTMLInputElement>\n  onFirstAppear: (mealForm: MealForm) => void\n  selectedVariantFormFieldId: string\n  isDragging: boolean\n} & FlexProps\n\nfunction MealItem({\n  mealForm,\n  index,\n  onRemove,\n  getMealNameInputRefById,\n  variantIndex,\n  selectedVariantFormFieldId,\n  onFirstAppear,\n  isDragging,\n  ...rest\n}: Props) {\n  const foodsDrawerDisclosure = useDisclosure()\n  const mealFormEvents = useMealFormEvents({\n    mealForm,\n    variantIndex,\n    index,\n    onFirstAppear,\n    onRemove,\n    foodsDrawerDisclosure,\n  })\n  const editNotesModalDisclosure = useDisclosure()\n\n  const { mealFormStatsTree, ingredientsStats } = useGetAndUpdateStats({\n    mealForm,\n    index,\n    selectedVariantFormFieldId,\n  })\n\n  return (\n    <Draggable\n      key={mealForm.fieldId}\n      draggableId={mealForm.fieldId}\n      index={index}\n    >\n      {(provided, snapshot) => (\n        <PresenceAnimation\n          shouldAnimate={mealFormEvents.shouldAnimate}\n          isVisible={mealFormEvents.isVisible}\n          onAnimationComplete={mealFormEvents.onAnimationComplete}\n          isDragging={isDragging}\n        >\n          <Flex\n            ref={provided.innerRef}\n            {...provided.draggableProps}\n            style={provided.draggableProps.style}\n            flexDirection=\"column\"\n            borderRadius={10}\n            backgroundColor=\"white\"\n            boxShadow={\n              snapshot.isDragging\n                ? 'rgba(0, 0, 0, 0.2) 0px 5px 10px, rgba(0, 0, 0, 0.4) 0px 15px 40px'\n                : 'base'\n            }\n            {...rest}\n          >\n            <Header\n              {...provided.dragHandleProps}\n              variantIndex={variantIndex}\n              ingredientsStatsSum={mealFormStatsTree.stats}\n              getMealNameInputRefById={getMealNameInputRefById}\n              index={index}\n              mealForm={mealForm}\n              onRemove={mealFormEvents.onRemoveRequest}\n              onAddIngredient={foodsDrawerDisclosure.onOpen}\n              onClone={mealFormEvents.onClone}\n              onEditNotes={editNotesModalDisclosure.onOpen}\n            />\n\n            <Box px={3}>\n              <Divider />\n            </Box>\n\n            <IngredientsList\n              ingredientsForms={mealForm.ingredientsForms}\n              ingredientsStats={ingredientsStats}\n              mealFormFieldId={mealForm.fieldId}\n              mealIndex={index}\n              variantIndex={variantIndex}\n              onAddIngredients={foodsDrawerDisclosure.onOpen}\n              shouldAddRadiusToLastBottomBorder={!mealForm.notes}\n            />\n\n            {mealForm.notes && <Notes notes={mealForm.notes} />}\n\n            <EditNotesModal\n              isOpen={editNotesModalDisclosure.isOpen}\n              onClose={editNotesModalDisclosure.onClose}\n              notes={mealForm.notes}\n              onEditNotes={mealFormEvents.onEditNotes}\n              fieldId={mealForm.fieldId}\n              ownerName={mealForm.name}\n              size=\"xl\"\n              textAreaHeight=\"150px\"\n            />\n\n            <FoodsDrawer\n              isOpen={foodsDrawerDisclosure.isOpen}\n              onClose={foodsDrawerDisclosure.onClose}\n              mealName={mealForm.name}\n              mealForm={mealForm}\n              onSelectedFoods={mealFormEvents.onAddFoods}\n            />\n          </Flex>\n        </PresenceAnimation>\n      )}\n    </Draggable>\n  )\n}\n\nexport default memo(MealItem)\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/useGetAndUpdateStats.ts",
    "content": "import { MealForm } from 'meals'\nimport { useGetIngredientFormStatsTree } from 'ingredients'\nimport { getStatsTree, useUpdateMealStats } from 'stats'\nimport { useMemo } from 'react'\n\ntype Params = {\n  mealForm: MealForm\n  index: number\n  selectedVariantFormFieldId: string\n}\n\nfunction useGetAndUpdateStats({\n  mealForm,\n  index,\n  selectedVariantFormFieldId,\n}: Params) {\n  const getIngredientFormStatsTree = useGetIngredientFormStatsTree()\n\n  const mealFormStatsTree = useMemo(\n    () =>\n      getStatsTree({\n        id: mealForm.fieldId,\n        subtrees: mealForm.ingredientsForms.map(ingredientForm =>\n          getIngredientFormStatsTree(ingredientForm)\n        ),\n      }),\n    [mealForm.fieldId, mealForm.ingredientsForms, getIngredientFormStatsTree]\n  )\n\n  const ingredientsStats = useMemo(\n    () => mealFormStatsTree.subtrees.map(({ stats }) => stats),\n    [mealFormStatsTree]\n  )\n\n  useUpdateMealStats({\n    stats: mealFormStatsTree.stats,\n    selectedVariantFormFieldId,\n    index,\n  })\n\n  return {\n    ingredientsStats,\n    mealFormStatsTree,\n  }\n}\n\nexport default useGetAndUpdateStats\n"
  },
  {
    "path": "src/meals/MealsList/MealItem/useMealFormEvents.ts",
    "content": "import { MealForm, getInsertMealFormAnimationKey } from 'meals'\nimport { useState } from 'react'\nimport { useOneTimeCheckActions } from 'general'\nimport { useDietFormActions } from 'diets'\nimport { Food } from 'foods'\nimport { UseDisclosureReturn } from '@chakra-ui/hooks'\nimport { useToast } from '@chakra-ui/toast'\n\ntype Params = {\n  mealForm: MealForm\n  index: number\n  variantIndex: number\n  onRemove: (variantIndex: number, index: number) => void\n  onFirstAppear: (mealForm: MealForm) => void\n  foodsDrawerDisclosure: UseDisclosureReturn\n}\n\nfunction useMealFormEvents({\n  mealForm,\n  index,\n  onRemove,\n  variantIndex,\n  onFirstAppear,\n  foodsDrawerDisclosure,\n}: Params) {\n  const [isVisible, setIsVisible] = useState(true)\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const dietFormActions = useDietFormActions()\n  const toast = useToast()\n  const shouldAnimate = oneTimeCheckActions.checkAndReset(\n    getInsertMealFormAnimationKey(mealForm.fieldId)\n  )\n\n  function onAnimationComplete() {\n    if (shouldAnimate) {\n      onFirstAppear(mealForm)\n    } else if (!isVisible) {\n      onRemove(variantIndex, index)\n    }\n  }\n\n  function onRemoveRequest() {\n    setIsVisible(false)\n  }\n\n  function onClone() {\n    dietFormActions.duplicateMealForm(variantIndex, index)\n  }\n\n  function onEditNotes(notes?: string) {\n    toast({\n      status: 'success',\n      position: 'top',\n      title: mealForm.notes\n        ? 'Your notes were edited'\n        : 'Your notes were added',\n      duration: 2000,\n      isClosable: true,\n    })\n\n    dietFormActions.updateMealForm(variantIndex, index, {\n      notes,\n    })\n  }\n\n  function onAddFoods(foods: Food[]) {\n    dietFormActions.appendIngredientsForms(variantIndex, index, foods)\n    foodsDrawerDisclosure.onClose()\n  }\n\n  return {\n    onAnimationComplete,\n    shouldAnimate,\n    onRemoveRequest,\n    isVisible,\n    onClone,\n    onAddFoods,\n    onEditNotes,\n  }\n}\n\nexport default useMealFormEvents\n"
  },
  {
    "path": "src/meals/MealsList/MealsControls.tsx",
    "content": "import { Flex, chakra, Button } from '@chakra-ui/react'\nimport { MealForm } from 'meals'\nimport { Plus } from 'react-feather'\n\nconst PlusStyled = chakra(Plus)\n\ntype Props = {\n  mealsForms: MealForm[]\n  onAddMeal: () => void\n}\n\nfunction MealsControls({ mealsForms, onAddMeal }: Props) {\n  return (\n    <Flex pt={3} pb={6} justifyContent=\"center\" alignItems=\"center\">\n      <Button\n        colorScheme=\"teal\"\n        variant=\"outline\"\n        onClick={onAddMeal}\n        size=\"md\"\n        leftIcon={<PlusStyled size={16} pointerEvents=\"none\" />}\n      >\n        Add meal\n      </Button>\n    </Flex>\n  )\n}\n\nexport default MealsControls\n"
  },
  {
    "path": "src/meals/MealsList/index.tsx",
    "content": "import { BoxProps, Flex, Box } from '@chakra-ui/react'\nimport MealItem from './MealItem'\nimport { useRef, memo } from 'react'\nimport { useGetRefForId } from 'dom'\nimport { Droppable } from 'react-beautiful-dnd'\nimport { useDietFormActions } from 'diets'\nimport { MealForm } from 'meals'\nimport useScrollToAndFocusMeal from './useScrollToAndFocusMeal'\nimport EmptyList from './EmptyList'\nimport MealsControls from './MealsControls'\n\ntype Props = {\n  mealsForms: MealForm[]\n  selectedVariantFormIndex: number\n  selectedVariantFormFieldId: string\n  headerHeight: number\n  onAddMeal: () => void\n} & BoxProps\n\nfunction MealsList({\n  mealsForms,\n  selectedVariantFormIndex,\n  selectedVariantFormFieldId,\n  headerHeight,\n  onAddMeal,\n  ...rest\n}: Props) {\n  const getMealNameInputRefById = useGetRefForId<HTMLInputElement>()\n  const scrollTargetRef = useRef<HTMLDivElement>(null)\n\n  const { onScrollToMeal } = useScrollToAndFocusMeal({\n    scrollTargetRef,\n    getMealNameInputRefById,\n  })\n\n  const dietFormActions = useDietFormActions()\n\n  return (\n    <Droppable droppableId=\"mealsList\" type=\"mealsList\">\n      {(provided, snapshot) => (\n        <Flex ref={provided.innerRef} flexDirection=\"column\" {...rest}>\n          {mealsForms.length > 0 ? (\n            mealsForms.map((mealForm, index) => (\n              <MealItem\n                key={mealForm.fieldId}\n                data-test-type=\"meal\"\n                data-test-index={index}\n                variantIndex={selectedVariantFormIndex}\n                getMealNameInputRefById={getMealNameInputRefById}\n                index={index}\n                onRemove={dietFormActions.removeMealForm}\n                mealForm={mealForm}\n                onFirstAppear={onScrollToMeal}\n                selectedVariantFormFieldId={selectedVariantFormFieldId}\n                mb={5}\n                isDragging={snapshot.isDraggingOver}\n              />\n            ))\n          ) : (\n            <EmptyList onAddMeal={onAddMeal} />\n          )}\n\n          {provided.placeholder}\n          {mealsForms.length > 0 && (\n            <>\n              <MealsControls mealsForms={mealsForms} onAddMeal={onAddMeal} />\n              <Box ref={scrollTargetRef} />\n            </>\n          )}\n        </Flex>\n      )}\n    </Droppable>\n  )\n}\n\nexport default memo(MealsList)\n"
  },
  {
    "path": "src/meals/MealsList/useScrollToAndFocusMeal.ts",
    "content": "import { MealForm } from 'meals'\nimport { useScrollTo } from 'dom'\nimport { RefObject, useCallback } from 'react'\nimport { isMobile } from 'react-device-detect'\n\ntype Params = {\n  getMealNameInputRefById: (id: string) => RefObject<HTMLInputElement>\n  scrollTargetRef: RefObject<HTMLDivElement>\n}\n\nfunction useScrollToAndFocusMeal({ getMealNameInputRefById }: Params) {\n  const scrollTo = useScrollTo()\n\n  const onScrollToMeal = useCallback(\n    async (mealForm: MealForm) => {\n      const mealNameInputRef = getMealNameInputRefById(mealForm.fieldId)\n\n      if (mealNameInputRef.current) {\n        await scrollTo(mealNameInputRef.current)\n      }\n\n      if (mealNameInputRef.current && !isMobile) {\n        mealNameInputRef.current.setSelectionRange(\n          0,\n          mealNameInputRef.current.value.length\n        )\n        mealNameInputRef.current.focus()\n      }\n    },\n    [getMealNameInputRefById, scrollTo]\n  )\n\n  return { onScrollToMeal }\n}\n\nexport default useScrollToAndFocusMeal\n"
  },
  {
    "path": "src/meals/PdfMealsList/Notes.tsx",
    "content": "import { Text, StyleSheet, View } from '@react-pdf/renderer'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\n\ntype Props = {\n  notes: string\n}\n\nfunction Notes({ notes }: Props) {\n  return (\n    <View\n      style={[\n        styles.root,\n        {\n          borderTopColor: getComputedColorFromChakra('gray.100'),\n        },\n      ]}\n    >\n      <Text\n        style={[\n          {\n            color: getComputedColorFromChakra('gray.600'),\n          },\n          styles.text,\n        ]}\n      >\n        {notes}\n      </Text>\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: {\n    padding: 12,\n    borderTopWidth: 1,\n    fontSize: 14,\n  },\n  text: {\n    flexDirection: 'row',\n    flex: 1,\n  },\n})\n\nexport default Notes\n"
  },
  {
    "path": "src/meals/PdfMealsList/PdfMealItem.tsx",
    "content": "import { Text, StyleSheet, View } from '@react-pdf/renderer'\nimport { MealForm } from 'meals'\nimport { Style } from '@react-pdf/types/style'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport { Stats } from 'stats'\nimport PdfStat from 'stats/PdfStat'\nimport PdfStatsLayout from 'stats/PdfStatsLayout'\nimport { Food } from 'foods'\nimport PdfIngredientsList from 'ingredients/PdfIngredientsList'\nimport { Portion } from 'portions'\nimport Notes from './Notes'\n\ntype Props = {\n  mealForm: MealForm\n  style?: Style\n  stats: Stats\n  ingredientsFormsStats: Stats[]\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n}\n\nfunction PdfMealItem({\n  mealForm,\n  stats,\n  ingredientsFormsStats,\n  style = {},\n  foodsById,\n  portionsById,\n}: Props) {\n  const { ingredientsForms } = mealForm\n\n  return (\n    <View\n      wrap={false}\n      style={[\n        styles.root,\n        style,\n        { borderColor: getComputedColorFromChakra('gray.200') },\n      ]}\n    >\n      <View style={[styles.header]}>\n        <PdfStatsLayout\n          nameElement={\n            <Text\n              style={[\n                styles.name,\n                {\n                  color: getComputedColorFromChakra(\n                    mealForm.name ? 'gray.600' : 'gray.500'\n                  ),\n                },\n              ]}\n            >\n              {mealForm.name || 'Untitled meal'}\n            </Text>\n          }\n          energyElement={\n            <PdfStat\n              variant=\"mealEnergy\"\n              label=\"Calories\"\n              value={stats.energy}\n            />\n          }\n          proteinElement={\n            <PdfStat variant=\"meal\" label=\"Protein\" value={stats.protein} />\n          }\n          carbsElement={\n            <PdfStat variant=\"meal\" label=\"Carbs\" value={stats.carbs} />\n          }\n          fatElement={<PdfStat variant=\"meal\" label=\"Fat\" value={stats.fat} />}\n        />\n      </View>\n\n      <View\n        style={{ paddingLeft: 10, paddingRight: 10, backgroundColor: 'white' }}\n      >\n        <View\n          style={{\n            backgroundColor: getComputedColorFromChakra('gray.100'),\n            height: '1px',\n          }}\n        />\n      </View>\n      <PdfIngredientsList\n        ingredientsForms={ingredientsForms}\n        ingredientsFormsStats={ingredientsFormsStats}\n        foodsById={foodsById}\n        portionsById={portionsById}\n      />\n\n      {mealForm.notes && <Notes notes={mealForm.notes} />}\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: {\n    borderWidth: 1,\n    borderRadius: 8,\n  },\n  name: {\n    fontSize: 14,\n    fontWeight: 'medium',\n    marginLeft: 12,\n  },\n  header: {\n    backgroundColor: 'white',\n    borderTopLeftRadius: 7,\n    borderTopRightRadius: 7,\n    paddingTop: 12,\n    paddingBottom: 12,\n  },\n})\n\nexport default PdfMealItem\n"
  },
  {
    "path": "src/meals/PdfMealsList/index.tsx",
    "content": "import { View } from '@react-pdf/renderer'\nimport { Food } from 'foods'\nimport { MealForm } from 'meals/mealForm'\nimport { Portion } from 'portions'\nimport { StatsTree } from 'stats'\nimport PdfMealItem from './PdfMealItem'\n\ntype Props = {\n  mealsForms: MealForm[]\n  mealsFormsStatsTrees: StatsTree[]\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n}\n\nfunction PdfMealsList({\n  mealsForms,\n  mealsFormsStatsTrees,\n  foodsById,\n  portionsById,\n}: Props) {\n  return (\n    <View>\n      {mealsForms.map((mealForm, index) => {\n        const { stats, subtrees } = mealsFormsStatsTrees[index]\n\n        return (\n          <PdfMealItem\n            style={{ marginTop: 12 }}\n            key={mealForm.fieldId}\n            mealForm={mealForm}\n            stats={stats}\n            ingredientsFormsStats={subtrees.map(({ stats }) => stats)}\n            foodsById={foodsById}\n            portionsById={portionsById}\n          />\n        )\n      })}\n    </View>\n  )\n}\n\nexport default PdfMealsList\n"
  },
  {
    "path": "src/meals/index.ts",
    "content": "export { default as MealsList } from './MealsList'\nexport { default as useMealsFormsActions } from './useMealsFormsActions'\nexport * from './useMealsFormsActions'\nexport * from './mealForm'\nexport * from './types'\nexport { default as useGetMealFormStatsTree } from './useGetMealFormStatsTree'\n"
  },
  {
    "path": "src/meals/mealForm.ts",
    "content": "import { Meal } from './types'\nimport { getIngredientForm, IngredientForm } from 'ingredients'\nimport { v4 as uuidv4 } from 'uuid'\n\ntype MealForm = {\n  fieldId: string\n  name: string\n  notes?: string\n  ingredientsForms: IngredientForm[]\n}\n\nfunction getMealForm(meal?: Meal): MealForm {\n  const fieldId = uuidv4()\n\n  if (meal) {\n    return {\n      fieldId,\n      name: meal.name,\n      ingredientsForms: meal.ingredients.map(ingredient =>\n        getIngredientForm(ingredient)\n      ),\n    }\n  }\n\n  return {\n    fieldId,\n    name: '',\n    ingredientsForms: [],\n  }\n}\n\nfunction getInsertMealFormAnimationKey(fieldId: string) {\n  return `insert-meal-animmation-${fieldId}`\n}\n\nexport type { MealForm }\n\nexport { getMealForm, getInsertMealFormAnimationKey }\n"
  },
  {
    "path": "src/meals/types.ts",
    "content": "import { Ingredient } from 'ingredients'\n\ntype Meal = {\n  name: string\n  ingredients: Ingredient[]\n}\n\nexport type { Meal }\n"
  },
  {
    "path": "src/meals/useGetMealFormStatsTree.ts",
    "content": "import { getStatsTree, StatsTree } from 'stats'\nimport { useGetIngredientFormStatsTree } from 'ingredients'\nimport { MealForm } from 'meals'\nimport { useCallback } from 'react'\n\nfunction useGetMealFormStatsTree() {\n  const getIngredientFormStatsTree = useGetIngredientFormStatsTree()\n\n  const getMealFormStatsTree = useCallback(\n    (mealForm: MealForm): StatsTree => {\n      return getStatsTree({\n        id: mealForm.fieldId,\n        subtrees: mealForm.ingredientsForms.map(ingredientForm =>\n          getIngredientFormStatsTree(ingredientForm)\n        ),\n      })\n    },\n    [getIngredientFormStatsTree]\n  )\n\n  return getMealFormStatsTree\n}\n\nexport default useGetMealFormStatsTree\n"
  },
  {
    "path": "src/meals/useMealsFormsActions.ts",
    "content": "import { useCallback, SetStateAction } from 'react'\nimport { DietForm } from 'diets'\nimport produce from 'immer'\nimport {\n  getInsertMealFormAnimationKey,\n  getMealForm,\n  MealForm,\n} from './mealForm'\nimport { OneTimeCheckActions } from 'general'\nimport { duplicate } from 'form'\nimport { getDuplicatedName } from 'form/names'\n\ntype Params = {\n  setDietForm: (action: SetStateAction<DietForm>) => void\n  oneTimeCheckActions: OneTimeCheckActions\n}\n\nfunction useMealsFormsActions({ setDietForm, oneTimeCheckActions }: Params) {\n  const appendMealForm = useCallback(\n    (mealForm?: MealForm) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const mealFormToAppend = mealForm || getMealForm()\n          const { selectedVariantFormIndex, variantsForms } = draftDietForm\n\n          oneTimeCheckActions.set(\n            getInsertMealFormAnimationKey(mealFormToAppend.fieldId)\n          )\n\n          variantsForms[selectedVariantFormIndex].mealsForms.push(\n            mealFormToAppend\n          )\n        })\n      ),\n    [setDietForm, oneTimeCheckActions]\n  )\n\n  const removeMealForm = useCallback(\n    (variantIndex: number, mealFormIndex: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          draftDietForm.variantsForms[variantIndex].mealsForms.splice(\n            mealFormIndex,\n            1\n          )\n        })\n      ),\n    [setDietForm]\n  )\n\n  const moveMealForm = useCallback(\n    (fromIndex: number, toIndex: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const { variantsForms, selectedVariantFormIndex } = draftDietForm\n          const mealsForms = variantsForms[selectedVariantFormIndex].mealsForms\n\n          const mealForm = mealsForms[fromIndex]\n          mealsForms.splice(fromIndex, 1)\n          mealsForms.splice(toIndex, 0, mealForm)\n        })\n      ),\n    [setDietForm]\n  )\n\n  const updateMealForm = useCallback(\n    (\n      variantFormIndex: number,\n      mealFormIndex: number,\n      partialMealForm: Partial<MealForm>\n    ) => {\n      setDietForm(\n        produce(draftDietForm => {\n          const { mealsForms } = draftDietForm.variantsForms[variantFormIndex]\n          const mealForm = mealsForms[mealFormIndex]\n          mealsForms[mealFormIndex] = {\n            ...mealForm,\n            ...partialMealForm,\n          } as MealForm\n        })\n      )\n    },\n    [setDietForm]\n  )\n\n  const duplicateMealForm = useCallback(\n    (variantFormIndex: number, mealFormIndex: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const { mealsForms } = draftDietForm.variantsForms[variantFormIndex]\n          const mealForm = mealsForms[mealFormIndex]\n          const newMealForm = {\n            ...duplicate(mealForm),\n            name: getDuplicatedName(mealFormIndex, mealsForms),\n          }\n          appendMealForm(newMealForm)\n        })\n      ),\n    [setDietForm, appendMealForm]\n  )\n\n  return {\n    appendMealForm,\n    removeMealForm,\n    moveMealForm,\n    updateMealForm,\n    duplicateMealForm,\n  }\n}\n\ntype MealsFormsActions = ReturnType<typeof useMealsFormsActions>\n\nexport type { MealsFormsActions }\n\nexport default useMealsFormsActions\n"
  },
  {
    "path": "src/notes/EditNotesModal/Content/Form/Header.tsx",
    "content": "import { ModalHeader, Text } from '@chakra-ui/react'\n\ntype Props = {\n  ownerName: string\n  notes?: string\n}\n\nfunction Header({ ownerName, notes }: Props) {\n  const titlePrefix = notes ? 'Edit notes of' : 'Add notes to'\n\n  return (\n    <ModalHeader fontWeight=\"normal\" mr={3}>\n      {titlePrefix}{' '}\n      <Text as=\"span\" fontSize=\"xl\" fontWeight=\"bold\">\n        {ownerName}\n      </Text>\n    </ModalHeader>\n  )\n}\n\nexport default Header\n"
  },
  {
    "path": "src/notes/EditNotesModal/Content/Form/index.tsx",
    "content": "import {\n  ModalFooter,\n  ModalBody,\n  Button,\n  FormControl,\n  Textarea,\n  FormLabel,\n  FormErrorMessage,\n  ModalContent,\n  ModalCloseButton,\n  Collapse,\n  Box,\n} from '@chakra-ui/react'\nimport { RefObject } from 'react'\nimport { useFormContext } from 'react-hook-form'\nimport { useMergeRefs } from '@chakra-ui/react'\nimport { useFormError } from 'form'\nimport { NotesForm } from 'notes'\nimport { useOneTimeCheckActions } from 'general'\nimport Header from './Header'\n\ntype Props = {\n  onClose: () => void\n  initialRef: RefObject<HTMLInputElement>\n  onEditNotes: (notes?: string) => void\n  fieldId: string\n  ownerName: string\n  notes?: string\n  textAreaHeight?: string | number\n}\n\nfunction Form({\n  ownerName,\n  notes,\n  onClose,\n  initialRef,\n  onEditNotes,\n  fieldId,\n  textAreaHeight,\n}: Props) {\n  const { register, handleSubmit } = useFormContext()\n  const notesRegister = register('notes')\n  const notesInputRef = useMergeRefs(notesRegister.ref, initialRef)\n  const oneTimeCheckActions = useOneTimeCheckActions()\n\n  const onSubmit = handleSubmit((form: NotesForm) => {\n    oneTimeCheckActions.set(`notes-${fieldId}`)\n    onEditNotes(form.notes || undefined)\n    onClose()\n  })\n\n  const { errorMessage, isInvalid } = useFormError('name')\n\n  return (\n    <form onSubmit={onSubmit}>\n      <ModalContent>\n        <Header ownerName={ownerName} notes={notes} />\n        <ModalCloseButton />\n\n        <ModalBody>\n          <FormControl isInvalid={isInvalid}>\n            <FormLabel>Notes</FormLabel>\n            <Textarea\n              autoComplete=\"off\"\n              {...notesRegister}\n              ref={notesInputRef}\n              focusBorderColor={isInvalid ? 'red.500' : undefined}\n              placeholder=\"Enter notes\"\n              height={textAreaHeight}\n            />\n            <Collapse animateOpacity={true} in={Boolean(errorMessage)}>\n              <Box minHeight=\"21px\">\n                <FormErrorMessage>{errorMessage}</FormErrorMessage>\n              </Box>\n            </Collapse>\n          </FormControl>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button mr={3} onClick={onClose}>\n            Close\n          </Button>\n          <Button\n            type=\"submit\"\n            colorScheme=\"teal\"\n            variant=\"solid\"\n            onClick={onSubmit}\n          >\n            Save\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </form>\n  )\n}\n\nexport default Form\n"
  },
  {
    "path": "src/notes/EditNotesModal/Content/NotesFormProvider.tsx",
    "content": "import { FormProvider, useForm } from 'react-hook-form'\nimport { yupResolver } from '@hookform/resolvers/yup'\nimport { ReactNode } from 'react'\nimport { getNotesForm, NotesForm, notesFormSchema } from 'notes'\n\ntype Props = {\n  children: ReactNode\n  notes?: string\n}\n\nfunction NotesFormProvider({ children, notes }: Props) {\n  const defaultValues = getNotesForm(notes)\n\n  const formMethods = useForm<NotesForm>({\n    defaultValues,\n    mode: 'onChange',\n\n    resolver: yupResolver(notesFormSchema),\n  })\n\n  return <FormProvider {...formMethods}>{children}</FormProvider>\n}\n\nexport default NotesFormProvider\n"
  },
  {
    "path": "src/notes/EditNotesModal/Content/index.tsx",
    "content": "import { RefObject } from 'react'\nimport NotesFormProvider from './NotesFormProvider'\nimport Form from './Form'\n\ntype Props = {\n  onClose: () => void\n  initialRef: RefObject<HTMLInputElement>\n  onEditNotes: (notes?: string) => void\n  fieldId: string\n  ownerName: string\n  notes?: string\n  textAreaHeight?: string | number\n}\n\nfunction Content({\n  ownerName,\n  onClose,\n  initialRef,\n  onEditNotes,\n  fieldId,\n  notes,\n  textAreaHeight,\n}: Props) {\n  return (\n    <NotesFormProvider notes={notes}>\n      <Form\n        ownerName={ownerName}\n        notes={notes}\n        onClose={onClose}\n        onEditNotes={onEditNotes}\n        initialRef={initialRef}\n        fieldId={fieldId}\n        textAreaHeight={textAreaHeight}\n      />\n    </NotesFormProvider>\n  )\n}\n\nexport default Content\n"
  },
  {
    "path": "src/notes/EditNotesModal/Content/notesForm.ts",
    "content": "import { object, string } from 'yup'\n\ntype NotesForm = {\n  notes: string\n}\n\nfunction getNotesForm(notes?: string): NotesForm {\n  return {\n    notes: notes || '',\n  }\n}\n\nconst notesFormSchema = object().shape({\n  name: string(),\n})\n\nexport { getNotesForm, notesFormSchema }\n\nexport type { NotesForm }\n"
  },
  {
    "path": "src/notes/EditNotesModal/index.tsx",
    "content": "import { Modal, ModalOverlay, ModalProps } from '@chakra-ui/react'\nimport { useRef } from 'react'\nimport Content from './Content'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  notes?: string\n  onEditNotes: (notes?: string) => void\n  fieldId: string\n  ownerName: string\n  textAreaHeight?: string | number\n} & Omit<ModalProps, 'children'>\n\nfunction EditNotesModal({\n  onClose,\n  isOpen,\n  notes,\n  onEditNotes,\n  fieldId,\n  ownerName,\n  textAreaHeight,\n  ...rest\n}: Props) {\n  const initialRef = useRef<HTMLInputElement>(null)\n  const finalFocusRef = useRef(null)\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      preserveScrollBarGap={true}\n      onClose={onClose}\n      initialFocusRef={initialRef}\n      finalFocusRef={finalFocusRef}\n      {...rest}\n    >\n      <ModalOverlay />\n\n      <Content\n        onClose={onClose}\n        onEditNotes={onEditNotes}\n        initialRef={initialRef}\n        fieldId={fieldId}\n        notes={notes}\n        ownerName={ownerName}\n        textAreaHeight={textAreaHeight}\n      />\n    </Modal>\n  )\n}\n\nexport default EditNotesModal\n"
  },
  {
    "path": "src/notes/index.ts",
    "content": "export { default as EditNotesModal } from './EditNotesModal'\nexport * from './EditNotesModal'\nexport * from './notesForm'\n"
  },
  {
    "path": "src/notes/notesForm.ts",
    "content": "import { object, string } from 'yup'\n\ntype NotesForm = {\n  notes: string\n}\n\nfunction getNotesForm(notes?: string): NotesForm {\n  return {\n    notes: notes || '',\n  }\n}\n\nconst notesFormSchema = object().shape({\n  name: string(),\n})\n\nexport { getNotesForm, notesFormSchema }\n\nexport type { NotesForm }\n"
  },
  {
    "path": "src/persistence/DownloadButton.tsx",
    "content": "import { Button, ButtonProps } from '@chakra-ui/react'\nimport { useBlobUrl } from 'persistence'\nimport prettyBytes from 'pretty-bytes'\n\ntype Props = {\n  blob?: Blob\n  onClose: () => void\n  fileName: string\n  label: string\n} & ButtonProps\n\nfunction DownloadButton({ blob, onClose, fileName, label, ...rest }: Props) {\n  const { url } = useBlobUrl({ blob })\n\n  return (\n    <Button\n      as=\"a\"\n      download={fileName}\n      target=\"_blank\"\n      href={url}\n      isDisabled={!url}\n      colorScheme=\"teal\"\n      variant=\"solid\"\n      onClick={onClose}\n      {...rest}\n    >\n      {blob === undefined || rest.isDisabled\n        ? label\n        : `${label} (${prettyBytes(blob.size)})`}\n    </Button>\n  )\n}\n\nexport default DownloadButton\n"
  },
  {
    "path": "src/persistence/file.ts",
    "content": "function createFileInput(accept: string) {\n  const input = document.createElement('input')\n  input.type = 'file'\n  input.multiple = false\n  input.accept = accept\n\n  return input\n}\n\nfunction selectFile(accept: string) {\n  return new Promise<File>(resolve => {\n    const input = createFileInput(accept)\n\n    input.addEventListener('change', function onChange(this: HTMLInputElement) {\n      const { files } = this\n\n      if (files && files.length > 0) {\n        resolve(files[0])\n      }\n    })\n    input.dispatchEvent(new MouseEvent('click'))\n  })\n}\n\nfunction readFile(file: File) {\n  return new Promise<string>((resolve, reject) => {\n    const fileReader = new FileReader()\n\n    fileReader.onload = () => {\n      const { result } = fileReader\n      resolve(result as string)\n    }\n\n    fileReader.onerror = () => {\n      const { error } = fileReader\n      fileReader.abort()\n      reject(error)\n    }\n\n    fileReader.readAsText(file)\n  })\n}\n\nexport { selectFile, readFile }\n"
  },
  {
    "path": "src/persistence/fixWhiteSpace.tsx",
    "content": "function fixWhiteSpace(text: string) {\n  return text.replace(/\\\\n/g, '\\n').replace(/\\r/g, '\\r').replace(/\\t/g, '\\t')\n}\n\nexport default fixWhiteSpace\n"
  },
  {
    "path": "src/persistence/getUntitledFileName.ts",
    "content": "type Params = {\n  prefix?: string\n}\n\nfunction getUntitledFileName({ prefix = 'Untitled' }: Params = {}) {\n  const date = new Date()\n  const dateString = date.toISOString()\n  const dateStringParts = dateString.split('.')\n\n  return `${prefix}-${dateStringParts[0]}`\n}\n\nexport default getUntitledFileName\n"
  },
  {
    "path": "src/persistence/index.ts",
    "content": "export { default as useSaveValue } from './useSaveValue'\nexport * from './file'\nexport { default as useBlobUrl } from './useBlobUrl'\nexport { default as DownloadButton } from './DownloadButton'\nexport { default as getUntitledFileName } from './getUntitledFileName'\nexport { default as useFileImportError } from './useImportFileError'\nexport { default as fixWhiteSpace } from './fixWhiteSpace'\n"
  },
  {
    "path": "src/persistence/useBlobUrl.ts",
    "content": "import { useEffect, useState } from 'react'\n\ntype Params = {\n  blob?: Blob\n}\n\nfunction useBlobUrl({ blob }: Params) {\n  const [url, setUrl] = useState<string>()\n\n  useEffect(() => {\n    if (blob) {\n      const blobUrl = URL.createObjectURL(blob)\n      setUrl(blobUrl)\n\n      return () => {\n        URL.revokeObjectURL(blobUrl)\n      }\n    }\n  }, [blob])\n\n  return {\n    url,\n  }\n}\n\nexport default useBlobUrl\n"
  },
  {
    "path": "src/persistence/useImportFileError.ts",
    "content": "import { useToast, UseToastOptions } from '@chakra-ui/toast'\n\nconst COMMON_TOAST_OPTIONS: UseToastOptions = {\n  isClosable: true,\n  position: 'top',\n  duration: null,\n  status: 'error',\n}\n\ntype OnErrorParams = {\n  file: File\n  error: any\n}\n\nfunction useFileImportError() {\n  const toast = useToast()\n\n  function showCouldNotLoadFileToast(file: File) {\n    toast({\n      ...COMMON_TOAST_OPTIONS,\n      title: `File ${file.name} could not be loaded`,\n    })\n  }\n\n  function showCouldNotParseFileToast(file: File) {\n    toast({\n      ...COMMON_TOAST_OPTIONS,\n      title: `File ${file.name} contains invalid data`,\n    })\n  }\n\n  function showErrorToast(file: File, error: any) {\n    const { message } = error\n\n    toast({\n      ...COMMON_TOAST_OPTIONS,\n      title: `File ${file.name} could not be imported`,\n      description: message,\n    })\n  }\n\n  function onError({ error, file }: OnErrorParams) {\n    if (error instanceof DOMException) {\n      showCouldNotLoadFileToast(file)\n    } else if (error instanceof SyntaxError) {\n      showCouldNotParseFileToast(file)\n    } else {\n      showErrorToast(file, error)\n    }\n  }\n\n  return {\n    onError,\n  }\n}\n\nexport default useFileImportError\n"
  },
  {
    "path": "src/persistence/useSaveValue.ts",
    "content": "import { useEffect } from 'react'\n\nconst TIMEOUT = 150\n\ntype Params = {\n  value: any\n  key: string\n  isEnabled?: boolean\n}\n\nfunction useSaveValue({ value, key, isEnabled = true }: Params) {\n  useEffect(() => {\n    if (isEnabled) {\n      const timeoutId = window.setTimeout(() => {\n        try {\n          const valueString = JSON.stringify(value)\n          localStorage.setItem(key, valueString)\n        } catch (error) {\n          // Do nothing\n        }\n      }, TIMEOUT)\n\n      return () => {\n        window.clearTimeout(timeoutId)\n      }\n    }\n  }, [value, key, isEnabled])\n}\n\nexport default useSaveValue\n"
  },
  {
    "path": "src/portions/PortionsMenuOrDrawer/Drawer/PortionItem.tsx",
    "content": "import { Box, BoxProps, Flex, Text } from '@chakra-ui/react'\nimport { Portion, getPortionDescription } from 'portions'\nimport { Check } from 'react-feather'\n\ntype Props = {\n  portion: Portion\n  isSelected: boolean\n} & BoxProps\n\nfunction PortionItem({ portion, isSelected, ...rest }: Props) {\n  const { unit } = portion\n\n  return (\n    <Box\n      position=\"relative\"\n      as=\"button\"\n      width=\"100%\"\n      textAlign=\"left\"\n      borderRadius={4}\n      p={3}\n      fontSize=\"sm\"\n      fontWeight=\"semibold\"\n      _hover={{ bg: 'gray.50' }}\n      _active={{\n        bg: 'gray.100',\n      }}\n      {...rest}\n    >\n      <Flex justifyContent=\"space-between\">\n        <Text\n          color={isSelected ? 'teal.600' : undefined}\n          fontSize=\"md\"\n          fontWeight=\"500\"\n        >\n          {unit}{' '}\n          <Text as=\"span\" color={isSelected ? 'teal.600' : 'gray.500'}>\n            {getPortionDescription(portion)}\n          </Text>\n        </Text>\n        {isSelected && (\n          <Flex alignItems=\"center\">\n            <Check color=\"green\" size={20} />\n          </Flex>\n        )}\n      </Flex>\n    </Box>\n  )\n}\n\nexport default PortionItem\n"
  },
  {
    "path": "src/portions/PortionsMenuOrDrawer/Drawer/index.tsx",
    "content": "import {\n  Drawer as DrawerBase,\n  DrawerBody,\n  DrawerHeader,\n  DrawerOverlay,\n  DrawerContent,\n  DrawerCloseButton,\n} from '@chakra-ui/react'\nimport { Portion } from 'portions'\nimport PortionItem from './PortionItem'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n  onChange: (portion: Portion) => void\n  selectedPortionId: string\n  portions: Portion[]\n}\n\nfunction Drawer({\n  portions,\n  isOpen,\n  onClose,\n  onChange,\n  selectedPortionId,\n}: Props) {\n  return (\n    <DrawerBase isOpen={isOpen} placement=\"bottom\" onClose={onClose}>\n      <DrawerOverlay />\n      <DrawerContent maxHeight=\"500px\">\n        <DrawerCloseButton />\n        <DrawerHeader fontSize=\"md\">Portions</DrawerHeader>\n\n        <DrawerBody>\n          {portions.map(portion => {\n            const { id } = portion\n            const isSelected = id === selectedPortionId\n\n            return (\n              <PortionItem\n                key={id}\n                portion={portion}\n                isSelected={isSelected}\n                onClick={() => {\n                  onClose()\n                  onChange(portion)\n                }}\n              />\n            )\n          })}\n        </DrawerBody>\n      </DrawerContent>\n    </DrawerBase>\n  )\n}\n\nexport default Drawer\n"
  },
  {
    "path": "src/portions/PortionsMenuOrDrawer/Menu.tsx",
    "content": "import { chakra, Text } from '@chakra-ui/react'\nimport { Check } from 'react-feather'\nimport { Menu as MenuBase, MenuItem } from 'general'\nimport Trigger from './Trigger'\nimport { getPortionDescription, Portion } from 'portions'\n\nconst CheckStyled = chakra(Check)\n\ntype Props = {\n  selectedPortionId: string\n  onChange: (portion: Portion) => void\n  portions: Portion[]\n}\n\nfunction Menu({ portions, onChange, selectedPortionId }: Props) {\n  return (\n    <MenuBase\n      portal={true}\n      overflow=\"auto\"\n      position=\"anchor\"\n      viewScroll=\"close\"\n      arrow\n      menuButton={<Trigger selectedPortionId={selectedPortionId} />}\n    >\n      {portions.map(portion => {\n        const { id, unit } = portion\n        const isSelected = id === selectedPortionId\n\n        return (\n          <MenuItem key={id} onClick={() => onChange(portion)}>\n            <CheckStyled\n              color={isSelected ? 'teal' : 'transparent'}\n              pointerEvents=\"none\"\n              size={15}\n              mr={3}\n            />\n            <Text\n              color={isSelected ? 'teal.600' : undefined}\n              fontWeight=\"500\"\n              fontSize=\"sm\"\n            >\n              {unit}{' '}\n              <Text\n                as=\"span\"\n                fontWeight=\"normal\"\n                color={isSelected ? 'teal.600' : 'gray.500'}\n              >\n                {getPortionDescription(portion)}\n              </Text>\n            </Text>\n          </MenuItem>\n        )\n      })}\n    </MenuBase>\n  )\n}\n\nexport default Menu\n"
  },
  {
    "path": "src/portions/PortionsMenuOrDrawer/Trigger.tsx",
    "content": "import { ForwardedRef, forwardRef } from 'react'\nimport { Button } from '@chakra-ui/react'\nimport { usePortions } from 'portions'\n\ntype Props = {\n  selectedPortionId: string\n  forwardedRef?: ForwardedRef<HTMLButtonElement>\n  onClick?: () => void\n}\n\nfunction Trigger({ forwardedRef, selectedPortionId, ...rest }: Props) {\n  const { portionsById } = usePortions()\n  const portion = portionsById[selectedPortionId]\n\n  return (\n    <Button\n      size=\"sm\"\n      borderTopRightRadius={6}\n      borderBottomRightRadius={6}\n      borderTopLeftRadius={0}\n      borderBottomLeftRadius={0}\n      variant=\"outline\"\n      fontSize=\"sm\"\n      textColor=\"gray.600\"\n      ref={forwardedRef}\n      {...rest}\n    >\n      {portion.unit}\n    </Button>\n  )\n}\nexport default forwardRef<HTMLButtonElement, Props>((props, ref) => (\n  <Trigger {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/portions/PortionsMenuOrDrawer/index.tsx",
    "content": "import { useScreenSize, ScreenSize } from 'general'\nimport Drawer from './Drawer'\nimport Trigger from './Trigger'\nimport { useDisclosure } from '@chakra-ui/hooks'\nimport Menu from './Menu'\nimport { Portion, usePortions } from 'portions'\nimport { Food } from 'foods'\n\ntype Props = {\n  onPortionChange: (portion: Portion) => void\n  selectedPortionId: string\n  food: Food\n}\n\nfunction PortionsMenuOrDrawer({\n  food,\n  onPortionChange,\n  selectedPortionId,\n}: Props) {\n  const screenSize = useScreenSize()\n  const modalDisclosure = useDisclosure()\n  const { allPortions, weightBasedPortions } = usePortions()\n  const portions = food.volume ? allPortions : weightBasedPortions\n\n  if (screenSize < ScreenSize.Medium) {\n    return (\n      <>\n        <Trigger\n          selectedPortionId={selectedPortionId}\n          onClick={modalDisclosure.onOpen}\n        />\n        <Drawer\n          portions={portions}\n          onChange={onPortionChange}\n          selectedPortionId={selectedPortionId}\n          isOpen={modalDisclosure.isOpen}\n          onClose={modalDisclosure.onClose}\n        />\n      </>\n    )\n  }\n  return (\n    <Menu\n      portions={portions}\n      onChange={onPortionChange}\n      selectedPortionId={selectedPortionId}\n    />\n  )\n}\n\nexport default PortionsMenuOrDrawer\n"
  },
  {
    "path": "src/portions/PortionsSelect.tsx",
    "content": "import { SelectProps, Select } from '@chakra-ui/select'\nimport { Portion } from 'portions'\nimport { ForwardedRef, forwardRef } from 'react'\n\ntype Props = {\n  forwardedRef?: ForwardedRef<HTMLSelectElement>\n  portions: Portion[]\n} & SelectProps\n\nfunction PortionsSelect({ children, forwardedRef, portions, ...rest }: Props) {\n  return (\n    <Select focusBorderColor=\"teal.500\" size=\"md\" ref={forwardedRef} {...rest}>\n      {children}\n      {portions.map(({ id, singular, millilitersPerAmount }) => (\n        <option key={id} value={id}>\n          {singular}\n          {id !== 'milliliters' && ` (${millilitersPerAmount} ml)`}\n        </option>\n      ))}\n    </Select>\n  )\n}\n\nexport default forwardRef<HTMLSelectElement, Props>((props, ref) => (\n  <PortionsSelect forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/portions/defaultPortions.ts",
    "content": "import { Portion } from './types'\n\nconst defaultPortions: Portion[] = [\n  {\n    id: 'grams',\n    unit: 'g',\n    gramsPerAmount: 1,\n    singular: 'gram',\n  },\n  {\n    id: 'ounces',\n    unit: 'oz',\n    gramsPerAmount: 28.34952,\n    singular: 'ounce',\n  },\n  {\n    id: 'milliliters',\n    unit: 'ml',\n    millilitersPerAmount: 1,\n    singular: 'milliliter',\n  },\n  {\n    id: 'teaspoons',\n    unit: 'tsp',\n    millilitersPerAmount: 5,\n    singular: 'teaspoon',\n  },\n  {\n    id: 'tablespoons',\n    unit: 'tbsp',\n    millilitersPerAmount: 15,\n    singular: 'tablespoon',\n  },\n  {\n    id: 'fluid ounces',\n    unit: 'fl oz',\n    millilitersPerAmount: 30,\n    singular: 'fluid ounce',\n  },\n  {\n    id: 'cups',\n    unit: 'cup',\n    millilitersPerAmount: 240,\n    singular: 'cup',\n  },\n]\n\nexport default defaultPortions\n"
  },
  {
    "path": "src/portions/formatAmount.ts",
    "content": "import formatQuantity from 'format-quantity'\n\nfunction formatAsNumber(amount: number) {\n  const amountStringFixedTo1 = amount.toFixed(1)\n  const amountFixedTo1 = Number(amountStringFixedTo1)\n\n  return Number.isInteger(amountFixedTo1)\n    ? amountFixedTo1.toString()\n    : amountStringFixedTo1\n}\n\nfunction formatAmount(amount: number, portionId: string): string {\n  if (portionId === 'grams') {\n    return Math.round(amount).toString()\n  }\n\n  if (\n    portionId === 'ounces' ||\n    portionId === 'milliliters' ||\n    portionId === 'fluid ounces'\n  ) {\n    return formatAsNumber(amount)\n  }\n\n  const formattedAsFractions = formatQuantity(amount) || ''\n\n  if (formattedAsFractions.includes('.')) {\n    return formatAsNumber(amount)\n  }\n\n  return formattedAsFractions\n}\n\nexport default formatAmount\n"
  },
  {
    "path": "src/portions/getAmountFromPortionsToGrams.ts",
    "content": "import { Food } from 'foods'\nimport { Portion } from 'portions'\nimport getToGramsConversionFactor from './getToGramsConversionFactor'\n\nfunction getAmountFromPortionToGrams(\n  amountInGrams: number,\n  portionId: string,\n  food: Food,\n  portionsById: Record<string, Portion>\n) {\n  const portion = portionsById[portionId]\n  const factor = getToGramsConversionFactor(portion, food, portionsById)\n  return amountInGrams * factor\n}\n\nexport default getAmountFromPortionToGrams\n"
  },
  {
    "path": "src/portions/getIngredientPortionDescription.ts",
    "content": "import { Food, FoodId } from 'foods'\nimport { IngredientForm } from 'ingredients'\nimport amountAsNumber from 'stats/amountAsNumber'\nimport { Portion } from './types'\nimport getAmountFromPortionToGrams from './getAmountFromPortionsToGrams'\n\nconst UNITS_WITH_DISTANCE = ['oz', 'tsp', 'tbsp', 'fl oz', 'cup']\n\nfunction getIngredientPortionDescription(\n  ingredientForm: IngredientForm,\n  foodsById: Record<FoodId, Food>,\n  portionsById: Record<string, Portion>\n) {\n  const { portionId, foodId, amount } = ingredientForm\n  const portion = portionsById[portionId]\n\n  const distance = UNITS_WITH_DISTANCE.includes(portion.unit) ? ' ' : ''\n  const mainPart = `${amount || 0}${distance}${portion.unit}`\n  const { gramsPerAmount, millilitersPerAmount } = portion\n\n  if (gramsPerAmount !== 1 || millilitersPerAmount) {\n    const weightInGrams = Math.round(\n      getAmountFromPortionToGrams(\n        amountAsNumber(amount),\n        portion.id,\n        foodsById[foodId],\n        portionsById\n      )\n    )\n\n    return `${mainPart} (${weightInGrams}g)`\n  }\n\n  return mainPart\n}\n\nexport default getIngredientPortionDescription\n"
  },
  {
    "path": "src/portions/getPortionDescription.ts",
    "content": "import { Portion } from 'portions'\n\nfunction getPortionDescription(portion: Portion) {\n  const { id, millilitersPerAmount } = portion\n\n  if (millilitersPerAmount && id !== 'milliliters') {\n    return `(${millilitersPerAmount} ml)`\n  }\n\n  return ''\n}\n\nexport default getPortionDescription\n"
  },
  {
    "path": "src/portions/getToGramsConversionFactor.ts",
    "content": "import { Food } from 'foods'\nimport { Portion } from 'portions'\n\nfunction getToGramsConversionFactor(\n  portion: Portion,\n  food: Food,\n  portionsById: Record<string, Portion>\n): number {\n  const { gramsPerAmount, millilitersPerAmount } = portion\n\n  if (gramsPerAmount) {\n    return gramsPerAmount\n  }\n\n  if (millilitersPerAmount && food.volume) {\n    const { portionId, weightInGrams } = food.volume\n    const portion = portionsById[portionId]\n\n    if (portion.millilitersPerAmount) {\n      const gramsPerMilliliter = weightInGrams / portion.millilitersPerAmount\n\n      return millilitersPerAmount * gramsPerMilliliter\n    }\n  }\n\n  throw new Error()\n}\n\nexport default getToGramsConversionFactor\n"
  },
  {
    "path": "src/portions/index.ts",
    "content": "export * from './types'\nexport * from './usePortionsStore'\nexport { default as PortionsMenuOrDrawer } from './PortionsMenuOrDrawer'\nexport { default as formatAmount } from './formatAmount'\nexport { default as PortionsSelect } from './PortionsSelect'\nexport { default as useGetAmount } from './useGetAmount'\nexport { default as getPortionDescription } from './getPortionDescription'\nexport { default as getIngredientPortionDescription } from './getIngredientPortionDescription'\n"
  },
  {
    "path": "src/portions/types.ts",
    "content": "type Portion = {\n  id: string\n  unit: string\n  singular: string\n  description?: string\n  gramsPerAmount?: number\n  millilitersPerAmount?: number\n}\n\nexport type { Portion }\n"
  },
  {
    "path": "src/portions/useGetAmount.ts",
    "content": "import { Food } from 'foods'\nimport { useCallbacksMemo } from 'general'\nimport { usePortions } from 'portions'\nimport { useCallback } from 'react'\nimport useGetToGramsConversionFactor from './useGetToGramsConversionFactor'\nimport getAmountFromPortionToGramsInternal from './getAmountFromPortionsToGrams'\n\nfunction useGetAmount() {\n  const { portionsById } = usePortions()\n  const getToGramsConversionFactor = useGetToGramsConversionFactor()\n\n  const getAmountFromPortionToGrams = useCallback(\n    (amountInGrams: number, portionId: string, food: Food) =>\n      getAmountFromPortionToGramsInternal(\n        amountInGrams,\n        portionId,\n        food,\n        portionsById\n      ),\n    [portionsById]\n  )\n\n  const getAmountFromGramsToPortion = useCallback(\n    (amountInPortion: number, portionId: string, food: Food) => {\n      const portion = portionsById[portionId]\n      const factor = getToGramsConversionFactor(portion, food)\n      return amountInPortion / factor\n    },\n    [portionsById, getToGramsConversionFactor]\n  )\n\n  const getAmountFromPortionToPortion = useCallback(\n    (\n      amount: number,\n      fromPortionId: string,\n      toPortionId: string,\n      food: Food\n    ) => {\n      const amountInGrams = getAmountFromPortionToGrams(\n        amount,\n        fromPortionId,\n        food\n      )\n      return getAmountFromGramsToPortion(amountInGrams, toPortionId, food)\n    },\n    [getAmountFromPortionToGrams, getAmountFromGramsToPortion]\n  )\n\n  const callbacks = useCallbacksMemo({\n    getAmountFromPortionToPortion,\n    getAmountFromPortionToGrams,\n    getAmountFromGramsToPortion,\n  })\n\n  return callbacks\n}\n\nexport default useGetAmount\n"
  },
  {
    "path": "src/portions/useGetToGramsConversionFactor.ts",
    "content": "import { Food } from 'foods'\nimport { Portion, usePortions } from 'portions'\nimport { useCallback } from 'react'\nimport getToGramsConversionFactor from './getToGramsConversionFactor'\n\nfunction useGetToGramsConversionFactor() {\n  const { portionsById } = usePortions()\n\n  const getToGramsConversionFactorCallback = useCallback(\n    (portion: Portion, food: Food) =>\n      getToGramsConversionFactor(portion, food, portionsById),\n    [portionsById]\n  )\n\n  return getToGramsConversionFactorCallback\n}\n\nexport default useGetToGramsConversionFactor\n"
  },
  {
    "path": "src/portions/usePortionsStore.ts",
    "content": "import { makeStoreProvider, useCallbacksMemo } from 'general'\nimport { useMemo, useState } from 'react'\nimport { Portion } from './types'\nimport defaultPortions from './defaultPortions'\n\ntype PortionsMap = Record<string, Portion>\n\nfunction usePortionsStore() {\n  const [portionsById, setPortionsById] = useState<PortionsMap>(() => {\n    const initialMap: PortionsMap = {}\n\n    for (const portion of defaultPortions) {\n      initialMap[portion.id] = portion\n    }\n\n    return initialMap\n  })\n\n  const allPortions = useMemo(() => Object.values(portionsById), [portionsById])\n\n  const weightBasedPortions = useMemo(\n    () =>\n      allPortions.filter(({ gramsPerAmount }) => gramsPerAmount !== undefined),\n    [allPortions]\n  )\n\n  const volumeBasedPortions = useMemo(\n    () =>\n      allPortions.filter(\n        ({ millilitersPerAmount }) => millilitersPerAmount !== undefined\n      ),\n    [allPortions]\n  )\n\n  const state = useCallbacksMemo({\n    portionsById,\n    allPortions,\n    volumeBasedPortions,\n    weightBasedPortions,\n  })\n\n  return [state, setPortionsById] as const\n}\n\nconst [\n  PortionsStoreProvider,\n  usePortions,\n  usePortionsActions,\n] = makeStoreProvider(usePortionsStore)\n\nexport { PortionsStoreProvider, usePortions, usePortionsActions }\n\nexport default usePortionsStore\n"
  },
  {
    "path": "src/react-app-env.d.ts",
    "content": "/// <reference types=\"react-scripts\" />\n"
  },
  {
    "path": "src/reportWebVitals.ts",
    "content": "import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);\n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n};\n\nexport default reportWebVitals;\n"
  },
  {
    "path": "src/setupTests.ts",
    "content": "// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom';\n"
  },
  {
    "path": "src/stats/AmountInput.tsx",
    "content": "import { InputProps, Input, Flex } from '@chakra-ui/react'\nimport { MouseEvent, ReactNode, WheelEvent } from 'react'\nimport amountAsNumber from 'stats/amountAsNumber'\n\ntype Props = {\n  children?: ReactNode\n  acceptsFractions?: boolean\n} & InputProps\n\nconst MAX_AMOUNT_EXCLUDING = 10000\n\nfunction AmountInput({\n  name,\n  children,\n  acceptsFractions = false,\n  ...rest\n}: Props) {\n  function onMouseDown(event: MouseEvent<HTMLInputElement>) {\n    const input = event.target as HTMLInputElement\n\n    if (document.activeElement !== input) {\n      event.preventDefault()\n      const length = input.value.length\n      input.focus()\n\n      input.type = 'text'\n      input.setSelectionRange(length, length)\n      input.type = 'number'\n    }\n  }\n\n  function onWheel(event: WheelEvent<HTMLInputElement>) {\n    const target = event.target as HTMLInputElement\n    target.blur()\n  }\n\n  const numProps = acceptsFractions\n    ? {}\n    : {\n        type: 'number',\n        pattern: '\\\\d*',\n        onMouseDown,\n        onWheel,\n      }\n\n  return (\n    <Flex alignItems=\"center\">\n      <Input\n        fontSize=\"md\"\n        autoComplete=\"off\"\n        borderColor=\"gray.200\"\n        textColor=\"gray.800\"\n        textAlign=\"right\"\n        bg=\"white\"\n        maxWidth=\"68px\"\n        {...numProps}\n        {...rest}\n        onChange={event => {\n          const { value } = event.target\n          const valueAsNumber = amountAsNumber(value)\n\n          if (valueAsNumber >= 0 && valueAsNumber < MAX_AMOUNT_EXCLUDING) {\n            rest.onChange && rest.onChange(event)\n          }\n        }}\n      />\n\n      {children}\n    </Flex>\n  )\n}\n\nexport default AmountInput\n"
  },
  {
    "path": "src/stats/EnergyStat.tsx",
    "content": "import Stat, { StatProps } from './Stat'\nimport { ArrowUpCircle, ArrowDownCircle } from 'react-feather'\nimport { useSameOrPreviousValue } from 'general'\nimport StatValueDetail from './StatValueDetail'\n\ntype Props = {\n  energy: number\n  energyDiff: number\n} & StatProps\n\nfunction EnergyStat({ energy, energyDiff, ...rest }: Props) {\n  const energyValueDetail = `${Math.abs(energyDiff)}kcal`\n  const previousOrSameEnergyValueDetail = useSameOrPreviousValue(\n    energyValueDetail\n  )\n\n  return (\n    <Stat\n      justifyContent=\"flex-start\"\n      type=\"dietEnergy\"\n      label=\"Calories\"\n      value={energy}\n      valueDetailElement={\n        energyDiff !== 0 ? (\n          <StatValueDetail\n            label={\n              energyDiff !== 0\n                ? energyValueDetail\n                : previousOrSameEnergyValueDetail\n            }\n            tooltipLabel={'Energy change'}\n            leftIcon={\n              energyDiff > 0 ? (\n                <ArrowUpCircle width=\"15px\" height=\"15px\" />\n              ) : (\n                <ArrowDownCircle width=\"15px\" height=\"15px\" />\n              )\n            }\n          />\n        ) : undefined\n      }\n      {...rest}\n    />\n  )\n}\n\nexport default EnergyStat\n"
  },
  {
    "path": "src/stats/PdfStat.tsx",
    "content": "import { Text, View, StyleSheet } from '@react-pdf/renderer'\nimport { Style } from '@react-pdf/types/style'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport {\n  getLabelColor,\n  getValueFontWeight,\n  getValueTextColor,\n  isForDiet,\n  isForEnergy,\n  isForIngredient,\n  StatVariant,\n} from './statsVariants'\n\ntype Props = {\n  label?: string\n  value: number\n  valueDetail?: string\n  style?: Style\n  variant: StatVariant\n  unit?: string\n}\n\nfunction PdfStat({\n  label,\n  value,\n  variant,\n  valueDetail,\n  unit = 'g',\n  style = {},\n}: Props) {\n  return (\n    <View\n      style={[\n        styles.root,\n        { justifyContent: isForIngredient(variant) ? 'center' : undefined },\n        style,\n      ]}\n    >\n      {isForDiet(variant) && (\n        <View\n          style={[\n            styles.line,\n            { backgroundColor: getComputedColorFromChakra('gray.300') },\n          ]}\n        />\n      )}\n      {label && (\n        <Text\n          style={[\n            styles.label,\n            { color: getComputedColorFromChakra(getLabelColor(variant)) },\n          ]}\n        >\n          {label}\n        </Text>\n      )}\n      <Text\n        style={[\n          styles.value,\n          {\n            color: getComputedColorFromChakra(getValueTextColor(variant)),\n            fontWeight: getValueFontWeight(variant),\n          },\n        ]}\n      >\n        {value}\n        <Text style={styles.unit}>{isForEnergy(variant) ? 'kcal' : unit}</Text>\n      </Text>\n\n      {valueDetail && <Text style={[styles.valueDetail]}>{valueDetail}</Text>}\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: {\n    textAlign: 'right',\n    flex: 1,\n  },\n  label: {\n    fontSize: 10,\n    marginBottom: 2,\n  },\n  unit: {\n    fontSize: 12,\n  },\n  value: {\n    fontSize: 14,\n  },\n  valueDetail: {\n    marginTop: '2px',\n    fontSize: 12,\n  },\n  line: {\n    position: 'absolute',\n    top: '2px',\n    bottom: '2px',\n    right: '-10px',\n    width: '1px',\n  },\n})\n\nexport default PdfStat\n"
  },
  {
    "path": "src/stats/PdfStatsLayout.tsx",
    "content": "import { View, StyleSheet } from '@react-pdf/renderer'\nimport { ReactElement } from 'react'\n\ntype Props = {\n  nameElement: ReactElement\n\n  energyElement: ReactElement\n  proteinElement: ReactElement\n  carbsElement: ReactElement\n  fatElement: ReactElement\n}\n\nfunction PdfStatsLayout({\n  nameElement,\n\n  energyElement,\n  proteinElement,\n  carbsElement,\n  fatElement,\n}: Props) {\n  return (\n    <View style={styles.root}>\n      <View style={styles.name}>{nameElement}</View>\n      <View style={styles.macro}>{energyElement}</View>\n      <View style={styles.macro}>{proteinElement}</View>\n      <View style={styles.macro}>{carbsElement}</View>\n      <View style={styles.macro}>{fatElement}</View>\n    </View>\n  )\n}\n\nconst NAME_WIDTH = '50%'\nconst MACROS_COUNT = 4\nconst MACRO_WIDTH = `${(100 - parseInt(NAME_WIDTH, 10)) / MACROS_COUNT}%`\n\nconst styles = StyleSheet.create({\n  root: {\n    flexDirection: 'row',\n  },\n  name: {\n    width: NAME_WIDTH,\n    justifyContent: 'center',\n  },\n  macro: {\n    width: MACRO_WIDTH,\n    marginRight: 12,\n  },\n})\n\nexport default PdfStatsLayout\n"
  },
  {
    "path": "src/stats/Stat.tsx",
    "content": "import { Text, Box, FlexProps } from '@chakra-ui/react'\nimport { cloneElement, ReactElement } from 'react'\nimport { RightAligned } from 'layout'\nimport {\n  isForDiet,\n  isForEnergy,\n  StatVariant,\n  getValueFontWeight,\n  getValueTextColor,\n  getLabelColor,\n} from './statsVariants'\n\ntype Props = {\n  value?: number\n\n  label?: string\n  type?: StatVariant\n  valueDetailElement?: ReactElement\n  isLarge?: boolean\n  isDisabled?: boolean\n} & FlexProps\n\nfunction Stat({\n  value,\n  label,\n  type = 'ingredient',\n  isLarge = false,\n  valueDetailElement,\n  isDisabled = false,\n  ...rest\n}: Props) {\n  return (\n    <RightAligned\n      opacity={isDisabled ? 0.4 : undefined}\n      pointerEvents={isDisabled ? 'none' : undefined}\n      position=\"relative\"\n      {...rest}\n    >\n      {isForDiet(type) && (\n        <Box\n          position=\"absolute\"\n          top=\"2px\"\n          bottom=\"2px\"\n          right=\"-10px\"\n          width=\"1px\"\n          bg=\"gray.300\"\n        />\n      )}\n\n      {label && (\n        <Text fontSize={isLarge ? 'md' : 'sm'} textColor={getLabelColor(type)}>\n          {label}\n        </Text>\n      )}\n\n      {value !== undefined && (\n        <Text\n          lineHeight={5}\n          fontSize={isLarge ? 'xl' : { base: 'sm', md: 'md' }}\n          fontWeight={getValueFontWeight(type)}\n          textColor={getValueTextColor(type)}\n        >\n          {value}\n          <Text as=\"span\" fontSize={isLarge ? 'md' : 'sm'}>\n            {isForEnergy(type) ? 'kcal' : 'g'}\n          </Text>\n        </Text>\n      )}\n\n      {valueDetailElement && cloneElement(valueDetailElement, { isLarge })}\n    </RightAligned>\n  )\n}\n\nexport type { Props as StatProps }\n\nexport default Stat\n"
  },
  {
    "path": "src/stats/StatValueDetail.tsx",
    "content": "import { HStack, Text } from '@chakra-ui/react'\nimport { Tooltip } from 'general'\nimport { ReactNode } from 'react'\n\ntype Props = {\n  label: string\n  tooltipLabel?: string\n  leftIcon?: ReactNode\n  isLarge?: boolean\n}\n\nfunction StatValueDetail({\n  label,\n  tooltipLabel,\n  leftIcon,\n  isLarge = false,\n}: Props) {\n  return (\n    <HStack alignItems=\"center\" spacing={1}>\n      {leftIcon}\n\n      <Tooltip label={tooltipLabel}>\n        <Text color=\"gray.800\" fontSize={isLarge ? 'md' : 'sm'}>\n          {label}\n        </Text>\n      </Tooltip>\n    </HStack>\n  )\n}\n\nexport default StatValueDetail\n"
  },
  {
    "path": "src/stats/StatsFormFields/MacrosFormFields.tsx",
    "content": "import { VStack } from '@chakra-ui/react'\nimport StatFormField from './StatFormField'\nimport useGetDailyValuePercent from './useGetDailyValuePercent'\n\ntype Props = {\n  canEdit: boolean\n  showsEnergyPercentFromFats?: boolean\n}\n\nfunction MacrosFormFields({\n  canEdit,\n  showsEnergyPercentFromFats = false,\n}: Props) {\n  const getDailyValuePercent = useGetDailyValuePercent()\n\n  return (\n    <VStack spacing={2} alignItems=\"flex-start\">\n      <StatFormField\n        name=\"fat\"\n        label=\"Fat\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        dailyValuePercent={getDailyValuePercent('fat')}\n      />\n\n      <StatFormField\n        isIdented={true}\n        name=\"saturatedFat\"\n        label=\"Saturated fat\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        dailyValuePercent={getDailyValuePercent('saturatedFat')}\n      />\n\n      {showsEnergyPercentFromFats && (\n        <StatFormField\n          ml={3}\n          isIdented={true}\n          name=\"saturatedFatEnergyPercent\"\n          label=\"Calories from saturated fat\"\n          inputType=\"nutritionValue\"\n          nutritionValueUnit=\"%\"\n          isReadOnly={!canEdit}\n        />\n      )}\n\n      <StatFormField\n        isIdented={true}\n        name=\"polyunsaturatedFat\"\n        label=\"Polyunsaturated fat\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        width=\"100%\"\n        dailyValuePercent={getDailyValuePercent('polyunsaturatedFat')}\n      />\n      <StatFormField\n        isIdented={true}\n        name=\"monounsaturatedFat\"\n        label=\"Monounsaturated fat\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        dailyValuePercent={getDailyValuePercent('monounsaturatedFat')}\n      />\n\n      <StatFormField\n        name=\"cholesterol\"\n        label=\"Cholesterol\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        nutritionValueUnit=\"mg\"\n        dailyValuePercent={getDailyValuePercent('cholesterol')}\n      />\n\n      <StatFormField\n        name=\"sodium\"\n        label=\"Sodium\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        nutritionValueUnit=\"mg\"\n        dailyValuePercent={getDailyValuePercent('sodium')}\n      />\n\n      <StatFormField\n        name=\"carbs\"\n        label=\"Carbs\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n      />\n      <StatFormField\n        isIdented={true}\n        name=\"sugar\"\n        label=\"Sugar\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        dailyValuePercent={getDailyValuePercent('sugar')}\n      />\n      <StatFormField\n        isIdented={true}\n        name=\"fiber\"\n        label=\"Fiber\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n        dailyValuePercent={getDailyValuePercent('fiber')}\n      />\n\n      <StatFormField\n        name=\"protein\"\n        label=\"Protein\"\n        inputType=\"nutritionValue\"\n        isReadOnly={!canEdit}\n      />\n    </VStack>\n  )\n}\n\nexport default MacrosFormFields\n"
  },
  {
    "path": "src/stats/StatsFormFields/ReavealButton.tsx",
    "content": "import { Button, ButtonProps, chakra } from '@chakra-ui/react'\nimport { ChevronDown, ChevronUp } from 'react-feather'\n\nconst ChevronDownStyled = chakra(ChevronDown)\nconst ChevronUpStyled = chakra(ChevronUp)\n\ntype Props = {\n  isContentShown: boolean\n  showContentLabel: string\n  hideContentLabel: string\n} & ButtonProps\n\nfunction RevealButton({\n  isContentShown,\n  showContentLabel,\n  hideContentLabel,\n  ...rest\n}: Props) {\n  return (\n    <Button colorScheme=\"teal\" variant=\"link\" {...rest}>\n      {isContentShown ? (\n        <ChevronUpStyled mr={1} />\n      ) : (\n        <ChevronDownStyled mr={1} />\n      )}\n      {isContentShown ? hideContentLabel : showContentLabel}\n    </Button>\n  )\n}\n\nexport default RevealButton\n"
  },
  {
    "path": "src/stats/StatsFormFields/StatFormField/ReadOnlyInput.tsx",
    "content": "import { Text } from '@chakra-ui/react'\nimport { Controller } from 'react-hook-form'\nimport { foodCategories } from 'foods-categories'\nimport { InputType } from './types'\n\ntype Props = {\n  name: string\n  inputType: InputType\n  nutritionValueUnit: string\n  isBold?: boolean\n}\n\nfunction formatNutritionValue(value: string) {\n  const number = Number(value)\n\n  if (Number.isInteger(number)) {\n    return value\n  }\n\n  return number.toFixed(2)\n}\n\nfunction ReadOnlyInput({\n  name,\n  inputType,\n  nutritionValueUnit,\n  isBold = false,\n}: Props) {\n  return (\n    <Controller\n      name={name}\n      render={({ field }) => {\n        let { value } = field\n\n        if (inputType === 'foodCategory') {\n          const foodCategory = foodCategories.find(({ id }) => id === value)\n          if (foodCategory) {\n            value = foodCategory.name\n          }\n        }\n\n        return (\n          <Text\n            fontWeight={isBold ? 'semibold' : 'normal'}\n            fontSize={isBold ? 'lg' : 'md'}\n          >\n            {inputType === 'nutritionValue'\n              ? `${formatNutritionValue(value)}${nutritionValueUnit}`\n              : value}\n          </Text>\n        )\n      }}\n    />\n  )\n}\n\nexport default ReadOnlyInput\n"
  },
  {
    "path": "src/stats/StatsFormFields/StatFormField/index.tsx",
    "content": "import {\n  FormControl,\n  Flex,\n  FormLabel,\n  Text,\n  VStack,\n  Divider,\n  FormErrorMessage,\n  FormControlProps,\n  Box,\n  Collapse,\n  DividerProps,\n  FormLabelProps,\n} from '@chakra-ui/react'\nimport { useFormError } from 'form'\nimport { ReactNode, RefObject } from 'react'\nimport useGetInputElement, { InputType } from './useGetInputElement'\n\ntype Props = {\n  name: string\n  label?: string\n  labelElement?: ReactNode\n  labelDetail?: string\n  inputType: InputType\n  nutritionValueUnit?: string\n  isIdented?: boolean\n  textInputRef?: RefObject<HTMLInputElement>\n  isReadOnly?: boolean\n  isEmphasized?: Boolean\n  isCaption?: boolean\n  children?: ReactNode\n  isValueBold?: boolean\n  dividerProps?: DividerProps\n  hasDivider?: boolean\n  dailyValuePercent?: number\n  formLabelProps?: FormLabelProps\n} & FormControlProps\n\nfunction StatFormField(props: Props) {\n  const {\n    name,\n    label,\n    inputType,\n    isIdented = false,\n    nutritionValueUnit = 'g',\n    textInputRef,\n    isReadOnly = false,\n    isEmphasized = false,\n    isValueBold = false,\n    isCaption = false,\n    isRequired,\n    children,\n    labelDetail,\n    dividerProps = {},\n    hasDivider = true,\n    dailyValuePercent,\n    labelElement,\n    formLabelProps,\n    ...rest\n  } = props\n  const { errorMessage, isInvalid } = useFormError(name)\n\n  const inputElement = useGetInputElement({\n    isInvalid,\n    name,\n    inputType,\n    textInputRef,\n    isReadOnly,\n    nutritionValueUnit,\n    isBold: isValueBold,\n  })\n\n  const labelDetailElement = labelDetail ? (\n    <Text\n      as={isReadOnly ? 'span' : undefined}\n      fontSize=\"sm\"\n      fontWeight=\"thin\"\n      ml={1}\n    >\n      {labelDetail}\n    </Text>\n  ) : null\n\n  const isValueNextToLabel = isReadOnly && !(isCaption || isEmphasized)\n\n  return (\n    <FormControl\n      isInvalid={isInvalid}\n      id={name}\n      pl={isIdented ? 10 : 0}\n      isRequired={!isReadOnly && isRequired}\n      {...rest}\n    >\n      <VStack spacing={2} alignItems=\"stretch\">\n        {hasDivider && <Divider {...dividerProps} />}\n        <Flex justifyContent={'space-between'} alignItems=\"center\">\n          <Flex>\n            <FormLabel\n              fontWeight={\n                isIdented ? 'normal' : isEmphasized ? 'semibold' : 'medium'\n              }\n              flexShrink={0}\n              fontSize={isCaption ? 'lg' : 'md'}\n              m={0}\n              {...formLabelProps}\n            >\n              {label || labelElement}\n              {isReadOnly && labelDetailElement}\n            </FormLabel>\n            {!isReadOnly && labelDetailElement}\n            {isValueNextToLabel && <Box ml={2}>{inputElement}</Box>}\n          </Flex>\n\n          <Flex ml={2} justifyContent=\"flex-end\">\n            {!isValueNextToLabel && inputElement}\n\n            {dailyValuePercent !== undefined && isValueNextToLabel && (\n              <Text fontWeight=\"medium\">{`${dailyValuePercent}%`}</Text>\n            )}\n\n            {!isReadOnly && inputType === 'nutritionValue' && (\n              <Flex\n                width={9}\n                flexShrink={0}\n                justifyContent=\"flex-start\"\n                alignItems=\"center\"\n                ml={1}\n              >\n                <Text textColor=\"gray.500\">{nutritionValueUnit}</Text>\n              </Flex>\n            )}\n          </Flex>\n        </Flex>\n      </VStack>\n\n      <Collapse animateOpacity={true} in={Boolean(errorMessage)}>\n        <Box minHeight=\"21px\">\n          <FormErrorMessage>{errorMessage}</FormErrorMessage>\n        </Box>\n      </Collapse>\n\n      {children}\n    </FormControl>\n  )\n}\n\nexport type { Props as StatFormFieldProps }\n\nexport default StatFormField\n"
  },
  {
    "path": "src/stats/StatsFormFields/StatFormField/types.ts",
    "content": "type InputType = 'text' | 'nutritionValue' | 'foodCategory'\n\nexport type { InputType }\n"
  },
  {
    "path": "src/stats/StatsFormFields/StatFormField/useGetInputElement.tsx",
    "content": "import { Input, useMergeRefs } from '@chakra-ui/react'\nimport { cloneElement, ReactElement, RefObject } from 'react'\nimport { useFormContext, Controller } from 'react-hook-form'\nimport { FoodCategoriesSelect } from 'foods-categories'\nimport { InputType } from './types'\nimport ReadOnlyInput from './ReadOnlyInput'\nimport { AmountInput } from 'stats'\n\ntype Params = {\n  name: string\n  inputType: InputType\n  isInvalid: boolean\n  textInputRef?: RefObject<HTMLInputElement>\n  nutritionValueUnit: string\n  isReadOnly: boolean\n  isBold?: boolean\n}\n\nfunction useGetInputElement({\n  inputType,\n  name,\n  isInvalid,\n  nutritionValueUnit,\n  isReadOnly,\n  textInputRef,\n  isBold = false,\n}: Params) {\n  const { register } = useFormContext()\n  let result: ReactElement | null = null\n  const textInputRegister = register(name)\n  const finalTextInputRef = useMergeRefs(textInputRegister.ref, textInputRef)\n\n  if (isReadOnly) {\n    result = (\n      <ReadOnlyInput\n        name={name}\n        inputType={inputType}\n        nutritionValueUnit={nutritionValueUnit}\n        isBold={isBold}\n      />\n    )\n  } else if (inputType === 'text') {\n    result = (\n      <Input\n        autoComplete=\"off\"\n        {...textInputRegister}\n        ref={finalTextInputRef}\n        fontWeight={isBold ? 'semibold' : 'normal'}\n        width={{ base: '150px', md: '200px' }}\n      />\n    )\n  } else if (inputType === 'foodCategory') {\n    result = (\n      <FoodCategoriesSelect\n        {...register(name, {\n          valueAsNumber: true,\n        })}\n        width={{ base: '150px', md: '200px' }}\n      >\n        <option disabled value={undefined}>\n          Select category\n        </option>\n      </FoodCategoriesSelect>\n    )\n  } else if (inputType === 'nutritionValue') {\n    result = (\n      <Controller\n        name={name}\n        render={({ field }) => (\n          <AmountInput value={field.value} onChange={field.onChange} />\n        )}\n      />\n    )\n  }\n\n  if (!result) {\n    throw new Error()\n  }\n\n  if (isInvalid) {\n    return cloneElement(result, {\n      focusBorderColor: 'red.500',\n    })\n  }\n\n  return result\n}\n\nexport type { InputType }\n\nexport default useGetInputElement\n"
  },
  {
    "path": "src/stats/StatsFormFields/VitaminsAndMineralsFormFields.tsx",
    "content": "import { VStack, BoxProps, Divider } from '@chakra-ui/layout'\nimport { NutritionData, getUnit } from 'stats'\nimport StatFormField from './StatFormField'\nimport useGetDailyValuePercent from './useGetDailyValuePercent'\nimport useGetValue from './useGetValue'\n\ntype Props = {\n  canEdit: boolean\n} & BoxProps\n\ntype FieldData = {\n  name: keyof NutritionData\n  label: string\n  labelDetail?: string\n}\n\nconst fieldsData: FieldData[] = [\n  { name: 'vitaminA', label: 'Vitamin A' },\n  { name: 'vitaminB1', label: 'Vitamin B1', labelDetail: '(thiamin)' },\n  { name: 'vitaminB2', label: 'Vitamin B2', labelDetail: '(riboflavin)' },\n  { name: 'vitaminB3', label: 'Vitamin B3', labelDetail: '(niacin)' },\n  { name: 'vitaminB5', label: 'Vitamin B5', labelDetail: '(pantothenic acid)' },\n  { name: 'vitaminB6', label: 'Vitamin B6' },\n  { name: 'vitaminB9', label: 'Vitamin B9', labelDetail: '(folate)' },\n  { name: 'vitaminB12', label: 'Vitamin B12' },\n  { name: 'vitaminC', label: 'Vitamin C' },\n  { name: 'vitaminD', label: 'Vitamin D' },\n  { name: 'vitaminE', label: 'Vitamin E', labelDetail: '(alpha-tocopherol)' },\n  { name: 'vitaminK', label: 'Vitamin K', labelDetail: '(phylloquinone)' },\n  { name: 'magnesium', label: 'Magnesium' },\n  { name: 'calcium', label: 'Calcium' },\n  { name: 'phosphorus', label: 'Phosphorus' },\n  { name: 'potassium', label: 'Potassium' },\n  { name: 'iron', label: 'Iron' },\n  { name: 'selenium', label: 'Selenium' },\n  { name: 'zinc', label: 'Zinc' },\n  { name: 'manganese', label: 'Manganese' },\n  { name: 'copper', label: 'Copper' },\n]\n\nfunction VitaminsAndMinerals({ canEdit, ...rest }: Props) {\n  const getValue = useGetValue()\n  const getDailyValuePercent = useGetDailyValuePercent()\n\n  const fieldsDataToShow = canEdit\n    ? fieldsData\n    : fieldsData.filter(({ name }) => getValue(name) > 0)\n\n  if (fieldsDataToShow.length === 0) {\n    return null\n  }\n\n  return (\n    <>\n      <Divider size=\"md\" mt={2} />\n      <VStack\n        spacing={2}\n        alignItems=\"flex-start\"\n        {...rest}\n        divider={<Divider />}\n      >\n        {fieldsDataToShow.map(({ name, label, labelDetail }) => (\n          <StatFormField\n            key={name}\n            name={name}\n            label={label}\n            inputType=\"nutritionValue\"\n            nutritionValueUnit={getUnit(name)}\n            labelDetail={labelDetail}\n            isReadOnly={!canEdit}\n            dailyValuePercent={getDailyValuePercent(name)}\n            hasDivider={false}\n            formLabelProps={{ fontWeight: 'normal' }}\n          />\n        ))}\n      </VStack>\n    </>\n  )\n}\n\nexport default VitaminsAndMinerals\n"
  },
  {
    "path": "src/stats/StatsFormFields/index.tsx",
    "content": "import { FlexProps, Text, Flex, Box, Divider } from '@chakra-ui/react'\nimport MacrosFormFields from './MacrosFormFields'\nimport VitaminsAndMineralsFormFields from './VitaminsAndMineralsFormFields'\n\ntype Props = {\n  canEdit: boolean\n  showsEnergyPrecentFromFat?: boolean\n} & FlexProps\n\nfunction StatsFormFields({\n  canEdit,\n  showsEnergyPrecentFromFat = false,\n}: Props) {\n  return (\n    <Box>\n      {!canEdit && (\n        <>\n          <Divider size=\"md\" />\n          <Flex justifyContent=\"flex-end\" py={2}>\n            <Text fontSize=\"sm\" fontWeight=\"medium\">\n              % Daily Value *\n            </Text>\n          </Flex>\n        </>\n      )}\n\n      <MacrosFormFields\n        canEdit={canEdit}\n        showsEnergyPercentFromFats={showsEnergyPrecentFromFat}\n      />\n\n      <VitaminsAndMineralsFormFields canEdit={canEdit} mt={2} />\n\n      {!canEdit && (\n        <Box>\n          <Divider my={2} borderColor=\"gray.400\" />\n          <Text fontSize=\"sm\">\n            * The % Daily Value (DV) tells you how much a nutrient in a serving\n            of food contributes to a daily diet. 2000 calories a day is used for\n            general nutrition advise.{' '}\n          </Text>\n        </Box>\n      )}\n    </Box>\n  )\n}\n\nexport { default as StatFormField } from './StatFormField'\n\nexport default StatsFormFields\n"
  },
  {
    "path": "src/stats/StatsFormFields/useGetDailyValuePercent.ts",
    "content": "import { getDailyValuePercent, NutritionData } from 'stats'\nimport useGetValue from './useGetValue'\n\nfunction useGetDailyValuePercent() {\n  const getValue = useGetValue()\n\n  function get(name: keyof NutritionData) {\n    const value = getValue(name)\n    return getDailyValuePercent(name, value)\n  }\n\n  return get\n}\n\nexport default useGetDailyValuePercent\n"
  },
  {
    "path": "src/stats/StatsFormFields/useGetValue.ts",
    "content": "import { FoodForm } from 'foods'\nimport { useFormContext } from 'react-hook-form'\nimport { NutritionData } from 'stats'\n\nfunction useGetValue() {\n  const { getValues } = useFormContext<FoodForm>()\n  const values = getValues()\n\n  function get(name: keyof NutritionData) {\n    const valueAsNumber = Number(values[name])\n    return valueAsNumber\n  }\n\n  return get\n}\n\nexport default useGetValue\n"
  },
  {
    "path": "src/stats/StatsLayout.tsx",
    "content": "import { Grid, GridItem, GridProps } from '@chakra-ui/react'\nimport { useScreenSize, ScreenSize } from 'general'\nimport { ForwardedRef, ReactElement, forwardRef } from 'react'\n\ntype Props = {\n  nameElement: ReactElement\n  amountElement?: ReactElement\n  energyElement: ReactElement\n  proteinElement: ReactElement\n  carbsElement: ReactElement\n  fatElement: ReactElement\n  menuElement: ReactElement\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n  prefersAmount?: boolean\n} & GridProps\n\nfunction StatsLayout({\n  nameElement,\n  amountElement,\n  energyElement,\n  proteinElement,\n  carbsElement,\n  fatElement,\n  menuElement,\n  forwardedRef,\n  prefersAmount = false,\n  ...rest\n}: Props) {\n  const screenSize = useScreenSize()\n\n  if (screenSize >= ScreenSize.Medium) {\n    return (\n      <Grid\n        ref={forwardedRef}\n        width=\"100%\"\n        gap={0}\n        templateColumns=\"repeat(11, 1fr)\"\n        {...rest}\n      >\n        {amountElement && <GridItem colSpan={2}>{amountElement}</GridItem>}\n\n        <GridItem colSpan={amountElement ? 4 : 6}>{nameElement}</GridItem>\n        <GridItem colSpan={1}>{energyElement}</GridItem>\n        <GridItem colSpan={1}>{proteinElement}</GridItem>\n        <GridItem colSpan={1}>{carbsElement}</GridItem>\n        <GridItem colSpan={1}>{fatElement}</GridItem>\n        <GridItem colSpan={1}>{menuElement}</GridItem>\n      </Grid>\n    )\n  }\n\n  if (screenSize === 1) {\n    return (\n      <Grid\n        ref={forwardedRef}\n        width=\"100%\"\n        templateColumns=\"repeat(10, 1fr)\"\n        gap={0}\n        {...rest}\n      >\n        {amountElement && <GridItem colSpan={2}>{amountElement}</GridItem>}\n\n        <GridItem colSpan={amountElement ? 4 : 6}>{nameElement}</GridItem>\n        <GridItem colSpan={2}>{energyElement}</GridItem>\n        <GridItem colSpan={2}>{menuElement}</GridItem>\n      </Grid>\n    )\n  }\n\n  return (\n    <Grid\n      ref={forwardedRef}\n      width=\"100%\"\n      templateColumns=\"repeat(10, 1fr)\"\n      gap={0}\n      {...rest}\n    >\n      {prefersAmount && <GridItem colSpan={3}>{amountElement}</GridItem>}\n      <GridItem colSpan={5}>{nameElement}</GridItem>\n      {!prefersAmount && <GridItem colSpan={3}>{energyElement}</GridItem>}\n      <GridItem colSpan={2}>{menuElement}</GridItem>\n    </Grid>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <StatsLayout forwardedRef={ref} {...props} />\n))\n"
  },
  {
    "path": "src/stats/amountAsNumber.ts",
    "content": "import numericQuantity from 'numeric-quantity'\n\nfunction amountAsNumber(amount: string) {\n  if (amount === '') {\n    return 0\n  }\n\n  const t = parseInt(amount, 10)\n\n  if (Number.isNaN(t)) {\n    return 0\n  }\n\n  const q = numericQuantity(amount)\n\n  if (Number.isNaN(q)) {\n    return t\n  }\n\n  return q\n}\n\nexport default amountAsNumber\n"
  },
  {
    "path": "src/stats/calculations/aggregateStats.ts",
    "content": "import { objectFromNutritionDataKeys, NUTRITION_STATS_KEYS } from 'stats'\nimport { Stats } from '../types'\n\nfunction sumStats(stats: Stats[]): Stats {\n  const result: Stats = {\n    amountInGrams: 0,\n    ...objectFromNutritionDataKeys(key => 0),\n  }\n\n  for (const stat of stats) {\n    result.amountInGrams += stat.amountInGrams\n\n    for (const key of NUTRITION_STATS_KEYS) {\n      result[key] += stat[key]\n    }\n  }\n\n  return result\n}\n\nfunction avgStats(\n  stats: Stats[],\n  round: (x: number) => number = Math.round\n): Stats {\n  const result = sumStats(stats)\n  let key: keyof typeof result\n\n  for (key in result) {\n    result[key] = round(result[key] / stats.length)\n  }\n\n  return result\n}\n\nexport { sumStats, avgStats }\n"
  },
  {
    "path": "src/stats/calculations/getDailyValuePercent.ts",
    "content": "import { NutritionData } from 'stats'\n\ntype DailyValuesRecord = Partial<Record<keyof NutritionData, number>>\n\n// From: https://www.fda.gov/food/new-nutrition-facts-label/daily-value-new-nutrition-and-supplement-facts-labels\nconst DAILY_VALUES_RECORD: DailyValuesRecord = {\n  calcium: 1300,\n  fiber: 28,\n  magnesium: 420,\n  manganese: 2.3,\n  phosphorus: 1250,\n  potassium: 4700,\n  vitaminA: 900,\n  vitaminB1: 1.5,\n  vitaminB2: 1.3,\n  vitaminB5: 5,\n  vitaminB6: 1.7,\n  vitaminB12: 2.4,\n  vitaminC: 90,\n  vitaminD: 20,\n  vitaminE: 15,\n  vitaminK: 120,\n  copper: 0.9,\n  selenium: 55,\n  sodium: 2300,\n  cholesterol: 300,\n  iron: 18,\n  saturatedFat: 20,\n  choline: 550,\n}\n\nfunction getDailyValuePercent(name: keyof NutritionData, value: number) {\n  const dailyValue = DAILY_VALUES_RECORD[name]\n\n  if (dailyValue === undefined) {\n    return undefined\n  }\n\n  return Math.round((100 * value) / dailyValue)\n}\n\nexport default getDailyValuePercent\n"
  },
  {
    "path": "src/stats/calculations/getEnergiesEstimates.ts",
    "content": "import { Stats } from 'stats/types'\n\nconst CALORIES_PER_GRAM_PROTEIN = 4\nconst CALORIES_PER_GRAM_CARBS = 4\nconst CALORIES_PER_GRAM_FAT = 9\n\nfunction getProteinEnergyEstimate(gramsProtein: number) {\n  return gramsProtein * CALORIES_PER_GRAM_PROTEIN\n}\n\nfunction getCarbsEnergyEstimate(gramsCarbs: number) {\n  return gramsCarbs * CALORIES_PER_GRAM_CARBS\n}\n\nfunction getFatEnergyEstimate(gramsFat: number) {\n  return gramsFat * CALORIES_PER_GRAM_FAT\n}\n\nfunction getStatsEnergiesEstimates(stats: Stats) {\n  const { protein, carbs, fat } = stats\n\n  const proteinEnergyEstimate = getProteinEnergyEstimate(protein)\n  const carbsEnergyEstimate = getCarbsEnergyEstimate(carbs)\n  const fatEnergyEstimate = getFatEnergyEstimate(fat)\n\n  const energyEstimate =\n    proteinEnergyEstimate + carbsEnergyEstimate + fatEnergyEstimate\n\n  return {\n    energyEstimate,\n    proteinEnergyEstimate,\n    carbsEnergyEstimate,\n    fatEnergyEstimate,\n  }\n}\n\nexport {\n  getProteinEnergyEstimate,\n  getCarbsEnergyEstimate,\n  getFatEnergyEstimate,\n  getStatsEnergiesEstimates,\n}\n"
  },
  {
    "path": "src/stats/calculations/getMacrosPercents.ts",
    "content": "import { Stats } from '../types'\nimport { getStatsEnergiesEstimates } from './getEnergiesEstimates'\n\ntype MacrosPercents = {\n  proteinPercent: number\n  carbsPercent: number\n  fatPercent: number\n}\n\nfunction getMacroEnergyPercent(energyFromMacro: number, energyTotal: number) {\n  return energyFromMacro === 0 ? 0 : (energyFromMacro / energyTotal) * 100\n}\n\nfunction getMacrosPercents(stats: Stats): MacrosPercents {\n  const {\n    energyEstimate,\n    proteinEnergyEstimate,\n    carbsEnergyEstimate,\n    fatEnergyEstimate,\n  } = getStatsEnergiesEstimates(stats)\n\n  return {\n    proteinPercent: getMacroEnergyPercent(\n      proteinEnergyEstimate,\n      energyEstimate\n    ),\n    carbsPercent: getMacroEnergyPercent(carbsEnergyEstimate, energyEstimate),\n    fatPercent: getMacroEnergyPercent(fatEnergyEstimate, energyEstimate),\n  }\n}\n\nexport type { MacrosPercents }\n\nexport { getMacroEnergyPercent }\n\nexport default getMacrosPercents\n"
  },
  {
    "path": "src/stats/calculations/getStatsTree.ts",
    "content": "import { sumStats, avgStats } from './aggregateStats'\nimport { Stats } from '../types'\n\ntype StatsTree = {\n  id: string\n  stats: Stats\n  avg?: Stats\n  subtrees: StatsTree[]\n}\n\ntype Params = {\n  id: string\n  subtrees: StatsTree[]\n  calculateAvg?: boolean\n}\n\nfunction getStatsTree({ id, subtrees, calculateAvg = false }: Params) {\n  const subtreesStats = subtrees.map(({ stats }) => stats)\n\n  const result: StatsTree = {\n    id,\n    stats: sumStats(subtreesStats),\n    subtrees,\n  }\n\n  if (calculateAvg) {\n    result.avg = avgStats(subtreesStats)\n  }\n\n  return result\n}\n\nexport type { StatsTree }\n\nexport default getStatsTree\n"
  },
  {
    "path": "src/stats/calculations/index.ts",
    "content": "export { default as roundMacrosPercents } from './roundMacrosPercents'\nexport { default as getMacrosPercents } from './getMacrosPercents'\nexport * from './getMacrosPercents'\nexport * from './getStatsTree'\nexport { default as getStatsTree } from './getStatsTree'\nexport * from './aggregateStats'\nexport * from './getEnergiesEstimates'\nexport { default as getDailyValuePercent } from './getDailyValuePercent'\n"
  },
  {
    "path": "src/stats/calculations/roundMacrosPercents.ts",
    "content": "import { MacrosPercents } from './getMacrosPercents'\n\ntype RoundedMacroPercent = {\n  value: number\n  type: 'protein' | 'fat' | 'carbs'\n}\n\nfunction getDiff(macroPercents: MacrosPercents) {\n  return (\n    100 -\n    Object.values(macroPercents)\n      .map(percent => Math.floor(percent))\n      .reduce((sumSoFar, percent) => percent + sumSoFar, 0)\n  )\n}\n\nfunction getRoundedMacroPercents(\n  macroPercents: MacrosPercents,\n  diff: number\n): RoundedMacroPercent[] {\n  const { proteinPercent, carbsPercent, fatPercent } = macroPercents\n\n  const initialRoundedMacroPercents: RoundedMacroPercent[] = [\n    { value: proteinPercent, type: 'protein' },\n    { value: carbsPercent, type: 'carbs' },\n    { value: fatPercent, type: 'fat' },\n  ]\n\n  return initialRoundedMacroPercents\n    .sort(({ value }) => value - Math.floor(value))\n    .map(({ value, type }, index) =>\n      index < diff\n        ? {\n            type,\n            value: Math.floor(value) + 1,\n          }\n        : {\n            type,\n            value: Math.floor(value),\n          }\n    )\n}\n\nfunction getMacrosPercents(\n  roundedMacroPercents: RoundedMacroPercent[]\n): MacrosPercents {\n  let roundedProteinPercent = 0\n  let roundedCarbsPercent = 0\n  let roundedFatPercent = 0\n\n  for (const { type, value } of roundedMacroPercents) {\n    if (type === 'protein') {\n      roundedProteinPercent = value\n    } else if (type === 'carbs') {\n      roundedCarbsPercent = value\n    } else {\n      roundedFatPercent = value\n    }\n  }\n\n  return {\n    proteinPercent: roundedProteinPercent,\n    carbsPercent: roundedCarbsPercent,\n    fatPercent: roundedFatPercent,\n  }\n}\n\nfunction roundMacrosPercents(macroPercents: MacrosPercents): MacrosPercents {\n  const { proteinPercent, carbsPercent, fatPercent } = macroPercents\n\n  if (proteinPercent === 0 && carbsPercent === 0 && fatPercent === 0) {\n    return macroPercents\n  }\n\n  const diff = getDiff(macroPercents)\n  const roundedMacroPercents = getRoundedMacroPercents(macroPercents, diff)\n\n  return getMacrosPercents(roundedMacroPercents)\n}\n\nexport default roundMacrosPercents\n"
  },
  {
    "path": "src/stats/getUnit.ts",
    "content": "import { NutritionData } from 'stats'\n\ntype Unit = 'mcg' | 'mg' | 'g'\ntype UnitsRecord = Record<keyof NutritionData, Unit>\n\nconst unitsRecord: UnitsRecord = {\n  energy: 'g',\n\n  fat: 'g',\n  saturatedFat: 'g',\n  monounsaturatedFat: 'g',\n  polyunsaturatedFat: 'g',\n\n  carbs: 'g',\n  sugar: 'g',\n  fiber: 'g',\n\n  protein: 'g',\n\n  sodium: 'mg',\n  cholesterol: 'mg',\n\n  vitaminA: 'mcg',\n  vitaminB1: 'mg',\n  vitaminB2: 'mg',\n  vitaminB3: 'mg',\n  vitaminB5: 'mg',\n  vitaminB6: 'mg',\n  vitaminB9: 'mcg',\n  vitaminB12: 'mcg',\n  vitaminC: 'mg',\n  vitaminD: 'mcg',\n  vitaminE: 'mg',\n  vitaminK: 'mcg',\n\n  magnesium: 'mg',\n  calcium: 'mg',\n  phosphorus: 'mg',\n  potassium: 'mg',\n  iron: 'mg',\n  selenium: 'mcg',\n  zinc: 'mcg',\n  manganese: 'mg',\n  copper: 'mg',\n  choline: 'g',\n}\n\nfunction getUnit(name: keyof NutritionData) {\n  const unit = unitsRecord[name]\n\n  return unit\n}\n\nexport default getUnit\n"
  },
  {
    "path": "src/stats/index.ts",
    "content": "export * from './types'\nexport * from './useMealsStatsStore'\nexport { default as useUpdateMealStats } from './useUpdateMealStats'\nexport { default as useVariantStats } from './useVariantStats'\nexport * from './calculations'\nexport { default as Stat } from './Stat'\nexport { default as StatsLayout } from './StatsLayout'\nexport { default as objectFromNutritionDataKeys } from './objectFromNutritionDataKeys'\nexport * from './objectFromNutritionDataKeys'\nexport { default as StatsFormFields } from './StatsFormFields'\nexport * from './StatsFormFields'\nexport { default as AmountInput } from './AmountInput'\nexport { default as EnergyStat } from './EnergyStat'\nexport { default as getUnit } from './getUnit'\nexport { default as StatValueDetail } from './StatValueDetail'\n"
  },
  {
    "path": "src/stats/objectFromNutritionDataKeys.ts",
    "content": "import { NutritionData } from './types'\n\ntype MappedNutritionData<T> = { [k in keyof NutritionData]: T }\n\nconst NUTRITION_STATS_KEYS: (keyof NutritionData)[] = [\n  'protein',\n  'carbs',\n  'fat',\n  'saturatedFat',\n  'monounsaturatedFat',\n  'polyunsaturatedFat',\n  'energy',\n  'sugar',\n  'fiber',\n  'sodium',\n  'cholesterol',\n\n  'vitaminA',\n  'vitaminD',\n  'vitaminE',\n  'vitaminK',\n  'vitaminB1',\n  'vitaminB12',\n  'vitaminB2',\n  'vitaminB5',\n  'vitaminB6',\n  'vitaminB3',\n  'vitaminB9',\n  'vitaminC',\n  'vitaminD',\n  'vitaminE',\n  'vitaminK',\n\n  'magnesium',\n  'calcium',\n  'phosphorus',\n  'potassium',\n  'iron',\n  'selenium',\n  'zinc',\n  'manganese',\n  'copper',\n  'choline',\n]\n\nfunction objectFromNutritionDataKeys<T>(\n  f: (key: keyof NutritionData) => T\n): MappedNutritionData<T> {\n  const entries = NUTRITION_STATS_KEYS.map(key => {\n    return [key, f(key)]\n  })\n\n  return Object.fromEntries(entries)\n}\n\nexport { NUTRITION_STATS_KEYS }\n\nexport type { MappedNutritionData }\n\nexport default objectFromNutritionDataKeys\n"
  },
  {
    "path": "src/stats/statsVariants.ts",
    "content": "type StatVariant =\n  | 'ingredient'\n  | 'ingredientAmount'\n  | 'ingredientEnergy'\n  | 'meal'\n  | 'mealEnergy'\n  | 'diet'\n  | 'dietEnergy'\n\nfunction isForDiet(statVariant: StatVariant) {\n  return statVariant.startsWith('diet')\n}\n\nfunction isForEnergy(statVariant: StatVariant) {\n  return statVariant.endsWith('Energy')\n}\n\nfunction isForIngredient(statVaraint: StatVariant) {\n  return statVaraint.startsWith('ingredient')\n}\n\nfunction isForMeal(statVaraint: StatVariant) {\n  return statVaraint.startsWith('meal')\n}\n\nfunction getValueTextColor(statVariant: StatVariant) {\n  if (isForIngredient(statVariant)) {\n    return 'gray.500'\n  }\n\n  return 'gray.800'\n}\n\nfunction getValueFontWeight(statVariant: StatVariant) {\n  if (statVariant === 'dietEnergy') {\n    return 'bold'\n  }\n\n  if (statVariant === 'diet' || statVariant === 'mealEnergy') {\n    return 'medium'\n  }\n\n  return undefined\n}\n\nfunction getLabelColor(statVariant: StatVariant) {\n  if (isForDiet(statVariant)) {\n    return 'gray.800'\n  }\n\n  return 'gray.500'\n}\n\nexport {\n  getValueTextColor,\n  getValueFontWeight,\n  isForDiet,\n  isForEnergy,\n  isForIngredient,\n  isForMeal,\n  getLabelColor,\n}\n\nexport type { StatVariant }\n"
  },
  {
    "path": "src/stats/types.ts",
    "content": "type NutritionData = {\n  energy: number\n\n  fat: number\n  saturatedFat: number\n  monounsaturatedFat: number\n  polyunsaturatedFat: number\n\n  carbs: number\n  sugar: number\n  fiber: number\n\n  protein: number\n\n  sodium: number\n  cholesterol: number\n\n  vitaminA: number\n  vitaminB1: number\n  vitaminB2: number\n  vitaminB3: number\n  vitaminB5: number\n  vitaminB6: number\n  vitaminB9: number\n  vitaminB12: number\n  vitaminC: number\n  vitaminD: number\n  vitaminE: number\n  vitaminK: number\n\n  magnesium: number\n  calcium: number\n  phosphorus: number\n  potassium: number\n  iron: number\n  selenium: number\n  zinc: number\n  manganese: number\n  copper: number\n  choline: number\n}\n\ntype Stats = {\n  amountInGrams: number\n} & NutritionData\n\nexport type { Stats, NutritionData }\n"
  },
  {
    "path": "src/stats/useMealsStatsStore.ts",
    "content": "import { Stats } from './types'\nimport { useState, useCallback } from 'react'\nimport produce from 'immer'\nimport { makeStoreProvider, useCallbacksMemo } from 'general'\n\ntype MealsStats = Record<string, Record<number, Stats> | undefined>\n\nfunction useMealsStatsStore() {\n  const [mealsStats, setMealsStats] = useState<MealsStats>({})\n\n  const setMealStats = useCallback(\n    (variantFormFieldId: string, index: number, stats: Stats) =>\n      setMealsStats(\n        produce(draftMealsStats => {\n          let variantMealsStats = draftMealsStats[variantFormFieldId]\n\n          if (!variantMealsStats) {\n            variantMealsStats = {}\n            draftMealsStats[variantFormFieldId] = variantMealsStats\n          }\n\n          variantMealsStats[index] = stats\n        })\n      ),\n    []\n  )\n\n  const deleteMealStats = useCallback(\n    (variantFormFieldId: string, index: number) =>\n      setMealsStats(\n        produce(draftMealsStats => {\n          let variantMealsStats = draftMealsStats[variantFormFieldId]\n\n          if (variantMealsStats) {\n            delete variantMealsStats[index]\n          }\n        })\n      ),\n    []\n  )\n\n  const actions = useCallbacksMemo({ setMealStats, deleteMealStats })\n\n  return [mealsStats, actions] as const\n}\n\nconst [\n  MealsStatsStoreProvider,\n  useMealsStats,\n  useMealsStatsActions,\n] = makeStoreProvider(useMealsStatsStore)\n\nexport { MealsStatsStoreProvider, useMealsStatsActions, useMealsStats }\n\nexport default useMealsStatsStore\n"
  },
  {
    "path": "src/stats/useUpdateMealStats.ts",
    "content": "import { Stats } from './types'\nimport { useEffect } from 'react'\nimport { useMealsStatsActions } from './useMealsStatsStore'\n\ntype Params = {\n  stats: Stats\n  selectedVariantFormFieldId: string\n  index: number\n}\n\nfunction useUpdateMealStats({\n  stats,\n  selectedVariantFormFieldId,\n  index,\n}: Params) {\n  const mealsStatsActions = useMealsStatsActions()\n\n  useEffect(() => {\n    mealsStatsActions.setMealStats(selectedVariantFormFieldId, index, stats)\n\n    return () => {\n      mealsStatsActions.deleteMealStats(selectedVariantFormFieldId, index)\n    }\n  }, [stats, mealsStatsActions, index, selectedVariantFormFieldId])\n}\n\nexport default useUpdateMealStats\n"
  },
  {
    "path": "src/stats/useVariantStats.ts",
    "content": "import { useMemo, useRef } from 'react'\nimport { getMacrosPercents, roundMacrosPercents } from './calculations'\nimport { sumStats } from 'stats'\nimport { useMealsStats } from './useMealsStatsStore'\nimport { useDietForm } from 'diets'\n\ntype Params = {\n  variantFormFieldId: string\n}\n\nfunction useVariantStats({ variantFormFieldId }: Params) {\n  const mealsStats = useMealsStats()\n  const dietForm = useDietForm()\n  const energyCacheRef = useRef<Record<string, number | undefined>>({})\n\n  const variantForm = dietForm.variantsForms.find(\n    ({ fieldId }) => fieldId === variantFormFieldId\n  )\n\n  const shouldSetEnergyToZero =\n    variantForm && variantForm.mealsForms.length === 0\n\n  const variantStats = useMemo(() => {\n    const mealsStatsForVariant = mealsStats[variantFormFieldId]\n    const finalStats = mealsStatsForVariant\n      ? Object.values(mealsStatsForVariant)\n      : []\n    const statsSum = sumStats(finalStats)\n\n    if (shouldSetEnergyToZero) {\n      energyCacheRef.current[variantFormFieldId] = 0\n    } else if (\n      mealsStatsForVariant &&\n      energyCacheRef.current[variantFormFieldId] === undefined\n    ) {\n      energyCacheRef.current[variantFormFieldId] = statsSum.energy\n    }\n\n    return statsSum\n  }, [mealsStats, variantFormFieldId, shouldSetEnergyToZero])\n\n  const { proteinPercent, carbsPercent, fatPercent } = useMemo(() => {\n    return roundMacrosPercents(getMacrosPercents(variantStats))\n  }, [variantStats])\n\n  const cachedEnergy = energyCacheRef.current[variantFormFieldId]\n  const energyDiff =\n    cachedEnergy !== undefined && cachedEnergy > 0\n      ? variantStats.energy - cachedEnergy\n      : 0\n\n  return {\n    variantStats,\n    proteinPercent,\n    carbsPercent,\n    fatPercent,\n    energyDiff,\n  }\n}\n\nexport default useVariantStats\n"
  },
  {
    "path": "src/theme/colors.ts",
    "content": "const colors = {\n  custom: {\n    '50': '#74CFD1',\n\n    '500': '#74CFD1',\n    '600': '#38a8aa',\n  },\n}\n\nexport default colors\n"
  },
  {
    "path": "src/theme/components/Alert.ts",
    "content": "const Alert = {\n  variants: {\n    subtle: {\n      container: {\n        bg: 'gray.100',\n        borderRadius: 6,\n      },\n    },\n  },\n}\n\nexport default Alert\n"
  },
  {
    "path": "src/theme/components/Button.ts",
    "content": "const Button = {}\n\nexport default Button\n"
  },
  {
    "path": "src/theme/components/Divider.ts",
    "content": "const Divider = {\n  sizes: {\n    md: {\n      borderBottomWidth: '8px',\n    },\n    lg: {\n      borderBottomWidth: '12px',\n    },\n  },\n}\n\nexport default Divider\n"
  },
  {
    "path": "src/theme/components/Input.ts",
    "content": "const Input = {\n  defaultProps: {\n    focusBorderColor: 'teal.400',\n  },\n}\n\nexport default Input\n"
  },
  {
    "path": "src/theme/components/Textarea.ts",
    "content": "const Textarea = {\n  defaultProps: {\n    focusBorderColor: 'teal.400',\n  },\n}\n\nexport default Textarea\n"
  },
  {
    "path": "src/theme/components/index.ts",
    "content": "export { default as Input } from './Input'\nexport { default as Button } from './Button'\nexport { default as Divider } from './Divider'\nexport { default as Textarea } from './Textarea'\nexport { default as Alert } from './Alert'\n"
  },
  {
    "path": "src/theme/getComputedColorFromChakra.ts",
    "content": "/* React-pdf does not have access to the Chakra context so we\n   use the css variables to get the actual color values*/\n\nconst map: Record<string, string> = {\n  'gray.50': '#F7FAFC',\n  'teal.500': '#319795',\n  'teal.400': '#38B2AC',\n  'gray.400': '#A0AEC0',\n  'gray.600': '#4A5568',\n  'gray.500': '#718096',\n  'gray.100': '#EDF2F7',\n  'gray.200': '#E2E8F0',\n  'gray.300': '#CBD5E0',\n  'teal.600': '#2C7A7B',\n}\nfunction getComputedColorFromChakra(chakraColor: string) {\n  return map[chakraColor]\n}\n\nexport default getComputedColorFromChakra\n"
  },
  {
    "path": "src/theme/index.ts",
    "content": "import { extendTheme } from '@chakra-ui/react'\nimport styles from './styles'\nimport colors from './colors'\nimport { Input, Button, Divider, Textarea, Alert } from './components'\n\nconst theme = extendTheme({\n  styles,\n  colors,\n  config: { initialColorMode: 'light', useSystemColorMode: false },\n  components: {\n    Input,\n    Button,\n    Divider,\n    Textarea,\n    Alert,\n  },\n})\n\nexport { default as getComputedColorFromChakra } from './getComputedColorFromChakra'\n\nexport default theme\n"
  },
  {
    "path": "src/theme/styles.ts",
    "content": "const styles = {\n  global: {\n    body: {\n      overflowX: 'hidden',\n      fontFamily: 'Roboto',\n      background: 'gray.50',\n    },\n    '.js-focus-visible :focus:not([data-focus-visible-added])': {\n      outline: 'none',\n      boxShadow: 'none',\n    },\n    '.rc-menu__item--hover': {\n      backgroundColor: '#EDF2F7',\n    },\n    '.rc-menu__item--active': {\n      color: 'black',\n      backgroundColor: '#E2E8F0',\n    },\n  },\n}\n\nexport default styles\n"
  },
  {
    "path": "src/undoRedo/UndoRedoButtons/RedoButton.tsx",
    "content": "import { chakra, IconButton, Button } from '@chakra-ui/react'\nimport { useDietFormVersionsActions, useDietFormVersions } from 'undoRedo'\nimport { RotateCw } from 'react-feather'\nimport {\n  getCtrlKeyName,\n  TooltipCommandLabel,\n  Tooltip,\n  useScreenSize,\n  ScreenSize,\n} from 'general'\n\nconst RotateCwStyled = chakra(RotateCw)\nconst ctrlKeyName = getCtrlKeyName()\n\nfunction RedoButton() {\n  const { redo } = useDietFormVersionsActions()\n  const { canRedo } = useDietFormVersions()\n  const screenSize = useScreenSize()\n\n  if (screenSize >= ScreenSize.Medium) {\n    return (\n      <Tooltip\n        label={\n          <TooltipCommandLabel\n            command=\"Redo last change\"\n            kbdCombo={`${ctrlKeyName}+Shift+Z`}\n          />\n        }\n      >\n        <Button\n          variant=\"solid\"\n          leftIcon={<RotateCwStyled size={16} pointerEvents=\"none\" />}\n          isDisabled={!canRedo}\n          onClick={() => redo()}\n        >\n          Redo\n        </Button>\n      </Tooltip>\n    )\n  }\n\n  return (\n    <IconButton\n      aria-label=\"Redo\"\n      variant=\"solid\"\n      icon={<RotateCwStyled size={20} pointerEvents=\"none\" />}\n      isDisabled={!canRedo}\n      onClick={() => redo()}\n    />\n  )\n}\n\nexport default RedoButton\n"
  },
  {
    "path": "src/undoRedo/UndoRedoButtons/UndoButton.tsx",
    "content": "import { chakra, IconButton, Button } from '@chakra-ui/react'\nimport { useDietFormVersionsActions, useDietFormVersions } from 'undoRedo'\nimport { RotateCcw } from 'react-feather'\nimport {\n  getCtrlKeyName,\n  TooltipCommandLabel,\n  Tooltip,\n  useScreenSize,\n  ScreenSize,\n} from 'general'\n\nconst RotateCcwStyled = chakra(RotateCcw)\nconst ctrlKeyName = getCtrlKeyName()\n\nfunction UndoButton() {\n  const { undo } = useDietFormVersionsActions()\n  const { canUndo } = useDietFormVersions()\n  const screenSize = useScreenSize()\n\n  if (screenSize >= ScreenSize.Medium) {\n    return (\n      <Tooltip\n        label={\n          <TooltipCommandLabel\n            command=\"Undo last change\"\n            kbdCombo={`${ctrlKeyName}+Z`}\n          />\n        }\n      >\n        <Button\n          variant=\"solid\"\n          leftIcon={<RotateCcwStyled size={16} pointerEvents=\"none\" />}\n          isDisabled={!canUndo}\n          onClick={() => undo()}\n        >\n          Undo\n        </Button>\n      </Tooltip>\n    )\n  }\n\n  return (\n    <IconButton\n      aria-label=\"Undo\"\n      variant=\"solid\"\n      icon={<RotateCcwStyled size={20} pointerEvents=\"none\" />}\n      isDisabled={!canUndo}\n      onClick={() => undo()}\n    />\n  )\n}\n\nexport default UndoButton\n"
  },
  {
    "path": "src/undoRedo/UndoRedoButtons/index.tsx",
    "content": "import { ButtonGroup } from '@chakra-ui/react'\nimport UndoButton from './UndoButton'\nimport RedoButton from './RedoButton'\n\nfunction UndoRedoButtons() {\n  return (\n    <ButtonGroup spacing={2} variant=\"outline\">\n      <UndoButton />\n      <RedoButton />\n    </ButtonGroup>\n  )\n}\n\nexport default UndoRedoButtons\n"
  },
  {
    "path": "src/undoRedo/appLocation.ts",
    "content": "import { DietForm } from 'diets'\nimport { RefObject } from 'react'\n\ntype AppLocation = {\n  scrollTop: number\n  scrollLeft: number\n  variantIndex: number\n}\n\ntype Params = {\n  horizontalScrollRef: RefObject<HTMLDivElement>\n  dietForm: DietForm\n}\n\nfunction getAppLocation({\n  horizontalScrollRef,\n  dietForm,\n}: Params): AppLocation {\n  return {\n    scrollTop: window.scrollY,\n    scrollLeft: horizontalScrollRef.current\n      ? horizontalScrollRef.current.scrollLeft\n      : 0,\n    variantIndex: dietForm.selectedVariantFormIndex,\n  }\n}\n\nexport type { AppLocation }\n\nexport default getAppLocation\n"
  },
  {
    "path": "src/undoRedo/deltasStack.ts",
    "content": "import { Delta } from 'jsondiffpatch'\nimport { AppLocation } from './appLocation'\n\ntype DeltaNode = {\n  delta: Delta\n  appLocation: AppLocation\n  nextNode?: DeltaNode\n  prevNode?: DeltaNode\n}\n\nconst MAX_SIZE = 100\nclass DeltasStack {\n  startNode?: DeltaNode = undefined\n  pointerNode?: DeltaNode = undefined\n  size: number = 0\n  canUnpatch: boolean = false\n  canPatch: boolean = false\n\n  getNextNodeToUnpatch(): DeltaNode | null {\n    if (!this.canUnpatch) {\n      return null\n    }\n\n    if (!this.pointerNode) {\n      this.pointerNode = this.startNode\n    } else {\n      this.pointerNode = this.pointerNode.nextNode\n    }\n\n    if (this.pointerNode) {\n      this.canUnpatch = this.pointerNode.nextNode !== undefined\n      this.canPatch = true\n\n      // jsondiffpatch sometimes modifies this delta for some reason\n      return this.pointerNode\n    }\n\n    this.canUnpatch = false\n\n    return null\n  }\n\n  getNextNodeToPatch(): DeltaNode | null {\n    if (this.pointerNode) {\n      const result = this.pointerNode\n      this.pointerNode = this.pointerNode.prevNode\n\n      this.canPatch = this.pointerNode !== undefined\n      this.canUnpatch = true\n\n      return result\n    }\n\n    return null\n  }\n\n  keepOnlyLast(n: number) {\n    let node: DeltaNode | undefined = this.startNode\n    let index = 0\n\n    while (node) {\n      if (index + 1 === n) {\n        this.size = n\n        node.nextNode = undefined\n        break\n      }\n\n      node = node.nextNode\n      index++\n    }\n  }\n\n  push(delta: Delta, appLocation: AppLocation) {\n    if (this.pointerNode) {\n      this.startNode = this.pointerNode.nextNode\n      this.pointerNode = undefined\n    }\n\n    const node: DeltaNode = {\n      delta,\n      appLocation,\n    }\n\n    if (!this.startNode) {\n      this.startNode = node\n    } else {\n      node.nextNode = this.startNode\n      this.startNode.prevNode = node\n      this.startNode = node\n    }\n\n    this.size++\n\n    if (this.size >= MAX_SIZE) {\n      this.keepOnlyLast(Math.floor(MAX_SIZE / 2))\n    }\n\n    this.canUnpatch = true\n    this.canPatch = false\n  }\n}\n\nexport default DeltasStack\n"
  },
  {
    "path": "src/undoRedo/index.ts",
    "content": "export * from './useDietFormVersionsStore'\nexport { default as useKeyboard } from './useKeyboard'\nexport { default as UndoRedoButtons } from './UndoRedoButtons'\nexport * from './appLocation'\n"
  },
  {
    "path": "src/undoRedo/useDietFormVersionsStore.ts",
    "content": "import { useCallback, useRef, useState, RefObject, useEffect } from 'react'\nimport * as jsondiffpatch from 'jsondiffpatch'\nimport { Delta } from 'jsondiffpatch'\nimport DeltasStack from './deltasStack'\nimport { makeStoreProvider, useCallbacksMemo, deepCopy } from 'general'\nimport { DietForm } from 'diets'\nimport getAppLocation, { AppLocation } from './appLocation'\n\ntype Params = {\n  form: DietForm\n  horizontalScrollRef: RefObject<HTMLDivElement>\n  onUndo: (form: DietForm, appLocation: AppLocation) => void\n  onRedo: (form: DietForm, appLocation: AppLocation) => void\n}\n\nconst patcher = jsondiffpatch.create({\n  objectHash: (item: any) => item.fieldId,\n})\n\nconst TIMEOUT_IN_MS = 200\n\ntype UndoRedoState = {\n  canUndo: boolean\n  canRedo: boolean\n}\n\nfunction shouldSaveDelta(delta: Delta) {\n  const onlySelectedFormIndexChanged =\n    Object.keys(delta).length === 1 &&\n    delta.selectedVariantFormIndex !== undefined\n\n  return false === onlySelectedFormIndexChanged\n}\n\nfunction useDietFormVersionsStore({\n  form,\n  horizontalScrollRef,\n  onUndo,\n  onRedo,\n}: Params) {\n  const deltasStackRef = useRef(new DeltasStack())\n  const lastFormRef = useRef<object>(form)\n  const timeoutIdRef = useRef<number>()\n  const [state, setState] = useState<UndoRedoState>({\n    canUndo: false,\n    canRedo: false,\n  })\n\n  const undo = useCallback(() => {\n    const result = deltasStackRef.current.getNextNodeToUnpatch()\n\n    if (result) {\n      const { delta, appLocation } = result\n      lastFormRef.current = patcher.unpatch(\n        lastFormRef.current,\n        deepCopy(delta)\n      )\n\n      setState({\n        canUndo: deltasStackRef.current.canUnpatch,\n        canRedo: deltasStackRef.current.canPatch,\n      })\n\n      onUndo(deepCopy(lastFormRef.current), appLocation)\n    }\n  }, [onUndo])\n\n  const redo = useCallback(() => {\n    const result = deltasStackRef.current.getNextNodeToPatch()\n\n    if (result) {\n      const { delta, appLocation } = result\n      lastFormRef.current = patcher.patch(lastFormRef.current, deepCopy(delta))\n\n      setState({\n        canUndo: deltasStackRef.current.canUnpatch,\n        canRedo: deltasStackRef.current.canPatch,\n      })\n\n      onRedo(deepCopy(lastFormRef.current), appLocation)\n    }\n  }, [onRedo])\n\n  const pushForm = useCallback(\n    form => {\n      if (timeoutIdRef.current) {\n        clearTimeout(timeoutIdRef.current)\n      }\n\n      //console.log('push', form, lastFormRef.current)\n\n      timeoutIdRef.current = window.setTimeout(() => {\n        if (form !== lastFormRef.current) {\n          const delta = patcher.diff(lastFormRef.current, form)\n          //console.log('d', delta)\n          if (delta && shouldSaveDelta(delta)) {\n            lastFormRef.current = deepCopy(form)\n\n            deltasStackRef.current.push(\n              delta,\n              getAppLocation({ horizontalScrollRef, dietForm: form })\n            )\n\n            setState({\n              canUndo: deltasStackRef.current.canUnpatch,\n              canRedo: deltasStackRef.current.canPatch,\n            })\n          }\n        }\n      }, TIMEOUT_IN_MS)\n    },\n    [horizontalScrollRef]\n  )\n\n  useEffect(() => {\n    pushForm(form)\n  }, [pushForm, form])\n\n  const methods = useCallbacksMemo({ undo, redo })\n\n  return [state, methods] as const\n}\n\nconst [\n  DietFormVersionsStoreProvider,\n  useDietFormVersions,\n  useDietFormVersionsActions,\n] = makeStoreProvider(useDietFormVersionsStore)\n\nexport {\n  DietFormVersionsStoreProvider,\n  useDietFormVersions,\n  useDietFormVersionsActions,\n}\n\nexport default useDietFormVersionsStore\n"
  },
  {
    "path": "src/undoRedo/useKeyboard.ts",
    "content": "import { useContext, useEffect } from 'react'\nimport { ContentBoxRefContext } from 'layout'\nimport { useDietFormVersionsActions } from './useDietFormVersionsStore'\n\nfunction useKeyboard() {\n  const formVersionsActions = useDietFormVersionsActions()\n  const contentBoxRef = useContext(ContentBoxRefContext)\n  const node = contentBoxRef.current\n\n  useEffect(() => {\n    if (!node) {\n      return\n    }\n\n    function onNodeKeyDown(event: KeyboardEvent) {\n      const { ctrlKey, metaKey, shiftKey, code } = event\n\n      if (code === 'KeyZ' && (ctrlKey || metaKey)) {\n        event.preventDefault()\n\n        if (shiftKey) {\n          formVersionsActions.redo()\n        } else {\n          formVersionsActions.undo()\n        }\n      }\n    }\n\n    function onBodyKeyDown(event: KeyboardEvent) {\n      if (event.target === document.body) {\n        onNodeKeyDown(event)\n      }\n    }\n\n    node.addEventListener('keydown', onNodeKeyDown)\n    document.body.addEventListener('keydown', onBodyKeyDown)\n\n    return () => {\n      node.removeEventListener('keydown', onNodeKeyDown)\n      document.body.removeEventListener('keydown', onBodyKeyDown)\n    }\n  }, [formVersionsActions, node])\n}\n\nexport default useKeyboard\n"
  },
  {
    "path": "src/variants/PdfVariantsList/PdfVariantItem.tsx",
    "content": "import { Text, StyleSheet, View } from '@react-pdf/renderer'\nimport { Stats, StatsTree } from 'stats'\nimport PdfStat from 'stats/PdfStat'\nimport PdfStatsLayout from 'stats/PdfStatsLayout'\nimport { VariantForm } from 'variants'\nimport { Food } from 'foods'\nimport getComputedColorFromChakra from 'theme/getComputedColorFromChakra'\nimport PdfMealsList from 'meals/PdfMealsList'\nimport { useMemo } from 'react'\nimport { Portion } from 'portions'\nimport getMacrosPercents from 'stats/calculations/getMacrosPercents'\nimport roundMacrosPercents from 'stats/calculations/roundMacrosPercents'\n\ntype Props = {\n  variantForm: VariantForm\n  stats: Stats\n  mealsFormsStatsTrees: StatsTree[]\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n  index: number\n}\n\nfunction PdfVariantItem({\n  variantForm,\n  stats,\n  mealsFormsStatsTrees,\n  foodsById,\n  portionsById,\n  index,\n}: Props) {\n  const { mealsForms } = variantForm\n\n  const { proteinPercent, carbsPercent, fatPercent } = useMemo(\n    () => roundMacrosPercents(getMacrosPercents(stats)),\n    [stats]\n  )\n\n  return (\n    <View style={styles.root} break={index > 0}>\n      <PdfStatsLayout\n        nameElement={\n          <Text\n            style={[\n              styles.name,\n              {\n                color: variantForm.name\n                  ? getComputedColorFromChakra('teal.600')\n                  : getComputedColorFromChakra('gray.400'),\n              },\n            ]}\n          >\n            {variantForm.name || 'Untitled variant'}\n          </Text>\n        }\n        energyElement={\n          <PdfStat variant=\"dietEnergy\" label=\"Calories\" value={stats.energy} />\n        }\n        proteinElement={\n          <PdfStat\n            variant=\"diet\"\n            label=\"Protein\"\n            value={stats.protein}\n            valueDetail={`${proteinPercent}%`}\n          />\n        }\n        carbsElement={\n          <PdfStat\n            variant=\"diet\"\n            label=\"Carbs\"\n            value={stats.carbs}\n            valueDetail={`${carbsPercent}%`}\n          />\n        }\n        fatElement={\n          <PdfStat\n            variant=\"diet\"\n            label=\"Fat\"\n            value={stats.fat}\n            valueDetail={`${fatPercent}%`}\n          />\n        }\n      />\n\n      <View\n        style={[\n          { backgroundColor: getComputedColorFromChakra('gray.100') },\n          styles.separator,\n        ]}\n      />\n\n      <PdfMealsList\n        mealsForms={mealsForms}\n        mealsFormsStatsTrees={mealsFormsStatsTrees}\n        foodsById={foodsById}\n        portionsById={portionsById}\n      />\n    </View>\n  )\n}\n\nconst styles = StyleSheet.create({\n  root: {\n    paddingLeft: 24,\n    paddingRight: 24,\n  },\n  name: {\n    fontWeight: 'semibold',\n    fontSize: 20,\n  },\n  separator: {\n    height: 1,\n    marginTop: 12,\n  },\n})\n\nexport default PdfVariantItem\n"
  },
  {
    "path": "src/variants/PdfVariantsList/index.tsx",
    "content": "import { Food } from 'foods'\nimport { Portion } from 'portions'\nimport { ReactElement } from 'react'\nimport { StatsTree } from 'stats'\nimport { VariantForm } from 'variants/variantForm'\nimport PdfVariantItem from './PdfVariantItem'\n\ntype Props = {\n  variantsForms: VariantForm[]\n  variantsFormsStatsTrees: StatsTree[]\n  foodsById: Record<number, Food>\n  portionsById: Record<string, Portion>\n}\n\nfunction PdfVariantsList({\n  variantsForms,\n  variantsFormsStatsTrees,\n  foodsById,\n  portionsById,\n}: Props) {\n  const variantItemsElements: ReactElement[] = []\n\n  variantsForms.forEach((variantForm, index) => {\n    const { mealsForms } = variantForm\n    const { stats, subtrees } = variantsFormsStatsTrees[index]\n\n    if (mealsForms.length > 0) {\n      variantItemsElements.push(\n        <PdfVariantItem\n          index={index}\n          key={variantForm.fieldId}\n          variantForm={variantForm}\n          stats={stats}\n          mealsFormsStatsTrees={subtrees}\n          foodsById={foodsById}\n          portionsById={portionsById}\n        />\n      )\n    }\n  })\n\n  return variantItemsElements\n}\n\nexport default PdfVariantsList\n"
  },
  {
    "path": "src/variants/VariantStats/EnergyStat.tsx",
    "content": "import { BoxProps } from '@chakra-ui/layout'\nimport VariantStat from './VariantStat'\n\ntype Props = {\n  energy: number\n  energyDiff: number\n  hasAtLeastOneMeal: boolean\n} & BoxProps\n\nfunction getEnergyDiffDetail(energyDiff: number) {\n  const sign = energyDiff > 0 ? '+' : '-'\n  return `${sign}${Math.abs(energyDiff)}kcal`\n}\n\nfunction EnergyStat({ energy, energyDiff, hasAtLeastOneMeal, ...rest }: Props) {\n  return (\n    <VariantStat\n      label=\"Calories\"\n      value={energy}\n      detail={energyDiff !== 0 ? getEnergyDiffDetail(energyDiff) : undefined}\n      type=\"energy\"\n      isDisabled={!hasAtLeastOneMeal}\n      {...rest}\n    />\n  )\n}\n\nexport default EnergyStat\n"
  },
  {
    "path": "src/variants/VariantStats/VariantStat.tsx",
    "content": "import { Flex, Text, BoxProps } from '@chakra-ui/react'\nimport { Tooltip } from 'general'\n\ntype VariantStatType = 'energy' | 'primaryMacro' | 'secondaryMacro'\n\ntype Props = {\n  label: string\n  detail?: string\n  value: number\n  type: VariantStatType\n  isDisabled?: boolean\n  tooltipLabel?: string\n} & BoxProps\n\nfunction getLabelFontWeight(type: VariantStatType) {\n  switch (type) {\n    case 'energy':\n      return 'bold'\n    case 'primaryMacro':\n      return 'medium'\n    case 'secondaryMacro':\n      return 'normal'\n  }\n}\n\nfunction getValueFontWeight(type: VariantStatType) {\n  switch (type) {\n    case 'energy':\n      return 'medium'\n    case 'primaryMacro':\n    case 'secondaryMacro':\n      return 'normal'\n  }\n}\n\nfunction VariantStat({\n  label,\n  detail,\n  value,\n  type,\n  isDisabled = false,\n  tooltipLabel,\n  ...rest\n}: Props) {\n  return (\n    <Flex\n      opacity={isDisabled ? 0.5 : 1.0}\n      pointerEvents={isDisabled ? 'none' : 'all'}\n      justifyContent=\"space-between\"\n      {...rest}\n    >\n      <Text fontSize=\"lg\" fontWeight={getLabelFontWeight(type)}>\n        {label}{' '}\n        {detail !== undefined && (\n          <Tooltip label={tooltipLabel}>\n            <Text as=\"span\" fontSize=\"md\" fontWeight=\"normal\">\n              {`(${detail})`}\n            </Text>\n          </Tooltip>\n        )}\n      </Text>\n      <Text fontSize=\"lg\" fontWeight={getValueFontWeight(type)}>\n        {value}\n        {type === 'energy' ? 'kcal' : 'g'}\n      </Text>\n    </Flex>\n  )\n}\n\nexport default VariantStat\n"
  },
  {
    "path": "src/variants/VariantStats/index.tsx",
    "content": "import {\n  VStack,\n  BoxProps,\n  Divider,\n  Button,\n  useDisclosure,\n  Text,\n} from '@chakra-ui/react'\nimport { useDietForm } from 'diets'\nimport {\n  getFatEnergyEstimate,\n  getMacroEnergyPercent,\n  getStatsEnergiesEstimates,\n  useVariantStats,\n} from 'stats'\nimport VariantStat from './VariantStat'\nimport EnergyStat from './EnergyStat'\nimport { VariantsDetailsModal } from 'variants'\nimport { Info } from 'react-feather'\n\ntype Props = {} & BoxProps\n\nfunction VariantStats({ ...rest }: Props) {\n  const dietForm = useDietForm()\n  const { variantsForms, selectedVariantFormIndex } = dietForm\n  const selectedVariantForm = variantsForms[selectedVariantFormIndex]\n  const variantsDetailsModalDisclosure = useDisclosure()\n\n  const {\n    variantStats,\n    proteinPercent,\n    carbsPercent,\n    fatPercent,\n    energyDiff,\n  } = useVariantStats({ variantFormFieldId: selectedVariantForm.fieldId })\n\n  const { saturatedFat } = variantStats\n  const saturatedFatEnergyEstimate = getFatEnergyEstimate(saturatedFat)\n  const { energyEstimate } = getStatsEnergiesEstimates(variantStats)\n  const saturatedFatPercent = Math.round(\n    getMacroEnergyPercent(saturatedFatEnergyEstimate, energyEstimate)\n  )\n\n  const hasAtLeastOneMeal = selectedVariantForm.mealsForms.length > 0\n\n  return (\n    <VStack\n      p={5}\n      spacing={3}\n      align=\"stretch\"\n      alignSelf=\"flex-start\"\n      justify=\"left\"\n      {...rest}\n    >\n      <Text fontSize=\"lg\" textAlign=\"center\" textColor=\"gray.500\">\n        Daily totals\n      </Text>\n      <Divider />\n      <EnergyStat\n        energy={variantStats.energy}\n        energyDiff={energyDiff}\n        hasAtLeastOneMeal={hasAtLeastOneMeal}\n      />\n\n      <VariantStat\n        label=\"Protein\"\n        detail={`${proteinPercent}%`}\n        value={variantStats.protein}\n        type=\"primaryMacro\"\n        isDisabled={!hasAtLeastOneMeal}\n        tooltipLabel=\"% calories from protein\"\n      />\n      <VariantStat\n        label=\"Carbs\"\n        detail={`${carbsPercent}%`}\n        value={variantStats.carbs}\n        type=\"primaryMacro\"\n        isDisabled={!hasAtLeastOneMeal}\n        tooltipLabel=\"% calories from carbs\"\n      />\n      <VariantStat\n        label=\"Fat\"\n        detail={`${fatPercent}%`}\n        value={variantStats.fat}\n        type=\"primaryMacro\"\n        isDisabled={!hasAtLeastOneMeal}\n        tooltipLabel=\"% calories from fat\"\n      />\n\n      <VariantStat\n        label=\"Saturated fat\"\n        detail={`${saturatedFatPercent}%`}\n        value={variantStats.saturatedFat}\n        type=\"secondaryMacro\"\n        isDisabled={!hasAtLeastOneMeal}\n        tooltipLabel=\"% calories from saturated fat\"\n      />\n      <VariantStat\n        label=\"Sugar\"\n        value={variantStats.sugar}\n        type=\"secondaryMacro\"\n        isDisabled={!hasAtLeastOneMeal}\n      />\n\n      <Divider />\n\n      <Button\n        colorScheme=\"teal\"\n        variant=\"link\"\n        leftIcon={<Info size={16} />}\n        isDisabled={!hasAtLeastOneMeal}\n        onClick={variantsDetailsModalDisclosure.onOpen}\n      >\n        View details\n      </Button>\n\n      <VariantsDetailsModal\n        isOpen={variantsDetailsModalDisclosure.isOpen}\n        onClose={variantsDetailsModalDisclosure.onClose}\n        initialVariantForm={selectedVariantForm}\n      />\n    </VStack>\n  )\n}\n\nexport default VariantStats\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/Content/FormFields.tsx",
    "content": "import { Box, FlexProps, VStack, Select } from '@chakra-ui/react'\nimport { ChangeEvent, useMemo } from 'react'\nimport {\n  getMacrosPercents,\n  roundMacrosPercents,\n  StatsFormFields,\n  StatValueDetail,\n  Stat,\n  StatsTree,\n} from 'stats'\nimport { VariantForm } from 'variants'\nimport { Flex } from '@chakra-ui/react'\nimport { useScreenSize, ScreenSize } from 'general'\nimport useVariantFormEvents from './useVariantFormEvents'\n\ntype Props = {\n  canEdit: boolean\n  initialVariantForm: VariantForm\n  variantsForms: VariantForm[]\n\n  dietFormStatsTree: StatsTree\n} & FlexProps\n\nfunction FormFields({\n  canEdit,\n  variantsForms,\n  initialVariantForm,\n\n  dietFormStatsTree,\n  ...rest\n}: Props) {\n  const variantFormEvents = useVariantFormEvents({ dietFormStatsTree })\n  const { variantStats } = variantFormEvents\n  function onSelectChange(event: ChangeEvent<HTMLSelectElement>) {\n    const { value } = event.target\n    variantFormEvents.onVariantFormFieldIdChange(value)\n  }\n\n  const { proteinPercent, carbsPercent, fatPercent } = useMemo(\n    () => roundMacrosPercents(getMacrosPercents(variantStats)),\n    [variantStats]\n  )\n\n  const screenSize = useScreenSize()\n  const isLarge = screenSize >= ScreenSize.Medium\n\n  return (\n    <Box {...rest} p={4}>\n      <VStack spacing={6} alignItems=\"stretch\">\n        {variantsForms.length > 1 && (\n          <Select\n            focusBorderColor=\"teal.500\"\n            size=\"md\"\n            defaultValue={initialVariantForm.fieldId}\n            onChange={onSelectChange}\n          >\n            <option key=\"avg\" value={''}>\n              Average across all days\n            </option>\n            {variantsForms.map(variantForm => (\n              <option key={variantForm.fieldId} value={variantForm.fieldId}>\n                {variantForm.name}\n              </option>\n            ))}\n          </Select>\n        )}\n\n        <Flex width=\"97%\" justifyContent=\"space-between\">\n          <Box>\n            <Stat\n              type=\"dietEnergy\"\n              label=\"Calories\"\n              value={variantStats.energy}\n              isLarge={isLarge}\n              justifyContent=\"flex-start\"\n            />\n          </Box>\n\n          <Box>\n            <Stat\n              type=\"diet\"\n              label=\"Protein\"\n              value={variantStats.protein}\n              isLarge={isLarge}\n              justifyContent=\"flex-start\"\n              valueDetailElement={\n                <StatValueDetail\n                  label={`${proteinPercent}%`}\n                  tooltipLabel={'% energy from protein'}\n                />\n              }\n            />\n          </Box>\n\n          <Box>\n            <Stat\n              justifyContent=\"flex-start\"\n              type=\"diet\"\n              label=\"Carbs\"\n              value={variantStats.carbs}\n              isLarge={isLarge}\n              valueDetailElement={\n                <StatValueDetail\n                  label={`${carbsPercent}%`}\n                  tooltipLabel={'% energy from carbs'}\n                />\n              }\n            />\n          </Box>\n\n          <Box>\n            <Stat\n              justifyContent=\"flex-start\"\n              type=\"diet\"\n              label=\"Fat\"\n              value={variantStats.fat}\n              isLarge={isLarge}\n              valueDetailElement={\n                <StatValueDetail\n                  label={`${fatPercent}%`}\n                  tooltipLabel={'% energy from fats'}\n                />\n              }\n            />\n          </Box>\n        </Flex>\n\n        <StatsFormFields canEdit={canEdit} showsEnergyPrecentFromFat={true} />\n      </VStack>\n    </Box>\n  )\n}\n\nexport default FormFields\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/Content/VariantsDetailsFormProvider.tsx",
    "content": "import { FormProvider, useForm } from 'react-hook-form'\nimport { ReactNode } from 'react'\nimport {\n  getVariantsDetailsForm,\n  VariantsDetailsForm,\n} from './variantsDetailsForm'\nimport { VariantForm } from 'variants'\nimport { Stats } from 'stats'\n\ntype Props = {\n  children: ReactNode\n  initialVariantForm: VariantForm\n  initialVariantStats: Stats\n}\n\nfunction VariantsDetailsFormProvider({\n  children,\n  initialVariantForm,\n  initialVariantStats,\n}: Props) {\n  const defaultValues = getVariantsDetailsForm(\n    initialVariantForm.fieldId,\n    initialVariantStats\n  )\n\n  const formMethods = useForm<VariantsDetailsForm>({\n    defaultValues,\n  })\n\n  return <FormProvider {...formMethods}>{children}</FormProvider>\n}\n\nexport default VariantsDetailsFormProvider\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/Content/index.tsx",
    "content": "import {\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  ModalFooter,\n  ModalBody,\n  Button,\n} from '@chakra-ui/react'\nimport FormFields from './FormFields'\nimport { VariantForm } from 'variants'\nimport { StatsTree } from 'stats'\nimport VariantsDetailsFormProvider from './VariantsDetailsFormProvider'\nimport { useDietForm, useGetDietFormStatsTree } from 'diets'\n\ntype Props = {\n  onClose: () => void\n\n  initialVariantForm: VariantForm\n}\n\nfunction Content({ onClose, initialVariantForm }: Props) {\n  const dietForm = useDietForm()\n  const { variantsForms } = dietForm\n\n  const getDietFormStatsTree = useGetDietFormStatsTree()\n  const dietFormStatsTree = getDietFormStatsTree(dietForm)\n  const initialVariantStatsTree = dietFormStatsTree.subtrees.find(\n    (statsTree: StatsTree) => statsTree.id === initialVariantForm.fieldId\n  )\n\n  if (!initialVariantStatsTree) {\n    throw new Error()\n  }\n\n  return (\n    <ModalContent>\n      <ModalHeader>Day Details</ModalHeader>\n      <ModalCloseButton />\n\n      <ModalBody>\n        <VariantsDetailsFormProvider\n          initialVariantForm={initialVariantForm}\n          initialVariantStats={initialVariantStatsTree.stats}\n        >\n          <form>\n            <FormFields\n              initialVariantForm={initialVariantForm}\n              canEdit={false}\n              variantsForms={variantsForms}\n              dietFormStatsTree={dietFormStatsTree}\n            />\n          </form>\n        </VariantsDetailsFormProvider>\n      </ModalBody>\n\n      <ModalFooter>\n        <Button onClick={onClose}>Close</Button>\n      </ModalFooter>\n    </ModalContent>\n  )\n}\n\nexport type { Props }\n\nexport default Content\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/Content/useVariantFormEvents.ts",
    "content": "import { useFormContext, useWatch } from 'react-hook-form'\nimport { getVariantsDetailsForm } from './variantsDetailsForm'\nimport { Stats, StatsTree } from 'stats'\n\ntype Params = {\n  dietFormStatsTree: StatsTree\n}\n\nfunction useVariantFormEvents({ dietFormStatsTree }: Params) {\n  const { reset } = useFormContext()\n  const variantFormFieldId = useWatch({ name: 'variantFormFieldId' })\n\n  function getVariantStatsForForFieldId(value: string) {\n    if (value) {\n      const stats = dietFormStatsTree.subtrees.find(({ id }) => id === value)\n\n      if (!stats) {\n        throw new Error()\n      }\n\n      return stats.stats\n    }\n\n    return dietFormStatsTree.avg as Stats\n  }\n\n  const variantStats = getVariantStatsForForFieldId(variantFormFieldId)\n\n  function onVariantFormFieldIdChange(value: string) {\n    const variantStats = getVariantStatsForForFieldId(value)\n    const newVaraintsDetailsForm = getVariantsDetailsForm(value, variantStats)\n    reset(newVaraintsDetailsForm)\n  }\n\n  return { onVariantFormFieldIdChange, variantStats }\n}\n\nexport default useVariantFormEvents\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/Content/variantsDetailsForm.ts",
    "content": "import {\n  getFatEnergyEstimate,\n  getMacroEnergyPercent,\n  getStatsEnergiesEstimates,\n  MappedNutritionData,\n  objectFromNutritionDataKeys,\n  Stats,\n} from 'stats'\n\ntype VariantsDetailsForm = {\n  variantFormFieldId: string\n  saturatedFatEnergyPercent: string\n} & MappedNutritionData<string>\n\nfunction getVariantsDetailsForm(\n  variantFormFieldId: string,\n  variantStats: Stats\n) {\n  const { saturatedFat } = variantStats\n  const saturatedFatEnergyEstimate = getFatEnergyEstimate(saturatedFat)\n  const { energyEstimate } = getStatsEnergiesEstimates(variantStats)\n\n  return {\n    variantFormFieldId,\n    saturatedFatEnergyPercent: Math.round(\n      getMacroEnergyPercent(saturatedFatEnergyEstimate, energyEstimate)\n    ).toString(),\n    ...objectFromNutritionDataKeys(key => variantStats[key].toString()),\n  }\n}\n\nexport type { VariantsDetailsForm }\n\nexport { getVariantsDetailsForm }\n"
  },
  {
    "path": "src/variants/VariantsDetailsModal/index.tsx",
    "content": "import { Modal, ModalOverlay } from '@chakra-ui/react'\nimport { VariantForm } from 'variants'\nimport Content from './Content'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  initialVariantForm: VariantForm\n}\n\nfunction VariantsDetailsModal({ onClose, isOpen, initialVariantForm }: Props) {\n  return (\n    <Modal\n      isOpen={isOpen}\n      preserveScrollBarGap={true}\n      onClose={onClose}\n      scrollBehavior=\"inside\"\n      size=\"md\"\n    >\n      <ModalOverlay />\n\n      <Content onClose={onClose} initialVariantForm={initialVariantForm} />\n    </Modal>\n  )\n}\n\nexport type { Props }\n\nexport default VariantsDetailsModal\n"
  },
  {
    "path": "src/variants/VariantsList/AddVariantButton.tsx",
    "content": "import { Button, IconButton, ButtonProps } from '@chakra-ui/react'\nimport { ScreenSize, useScreenSize } from 'general'\nimport { CalendarPlus } from 'icons'\n\ntype Props = {} & ButtonProps\n\nfunction AddVariantButton({ ...rest }: Props) {\n  const screenSize = useScreenSize()\n\n  if (screenSize >= ScreenSize.Medium) {\n    return (\n      <Button\n        borderRadius=\"full\"\n        size=\"md\"\n        bg=\"white\"\n        leftIcon={<CalendarPlus size={16} />}\n        variant=\"outline\"\n        mr={2}\n        flexShrink={0}\n        {...rest}\n      >\n        Add day\n      </Button>\n    )\n  }\n\n  return (\n    <IconButton\n      aria-label=\"Add day\"\n      borderRadius=\"full\"\n      size=\"md\"\n      bg=\"white\"\n      icon={<CalendarPlus size={20} />}\n      variant=\"outline\"\n      mr={2}\n      flexShrink={0}\n      {...rest}\n    />\n  )\n}\n\nexport default AddVariantButton\n"
  },
  {
    "path": "src/variants/VariantsList/ScrollButtons.tsx",
    "content": "import { Fade, IconButton } from '@chakra-ui/react'\nimport { ArrowLeft, ArrowRight } from 'react-feather'\nimport { animateScrollLeft } from 'dom'\nimport { RefObject } from 'react'\n\ntype Props = {\n  scrollNodeRef: RefObject<HTMLDivElement>\n  showsButtons: boolean\n  canScrollLeft: boolean\n  canScrollRight: boolean\n}\n\nconst SCROLL_DELTA = 100\n\nfunction ScrollButtons({\n  showsButtons,\n  scrollNodeRef,\n  canScrollLeft,\n  canScrollRight,\n}: Props) {\n  function onTest() {\n    animateScrollLeft(scrollNodeRef, SCROLL_DELTA)\n  }\n\n  function onTest2() {\n    animateScrollLeft(scrollNodeRef, -SCROLL_DELTA)\n  }\n\n  return (\n    <Fade in={showsButtons} unmountOnExit={true}>\n      <IconButton\n        bg=\"white\"\n        borderTopLeftRadius=\"full\"\n        borderBottomLeftRadius=\"full\"\n        size=\"md\"\n        aria-label=\"Add variant\"\n        icon={<ArrowLeft size={20} pointerEvents=\"none\" />}\n        variant=\"outline\"\n        onClick={onTest2}\n        ml={3}\n        flexShrink={0}\n        isDisabled={!canScrollLeft}\n      />\n      <IconButton\n        bg=\"white\"\n        borderTopRightRadius=\"full\"\n        borderBottomRightRadius=\"full\"\n        size=\"md\"\n        aria-label=\"Add variant\"\n        icon={<ArrowRight size={20} pointerEvents=\"none\" />}\n        variant=\"outline\"\n        onClick={onTest}\n        flexShrink={0}\n        isDisabled={!canScrollRight}\n      />\n    </Fade>\n  )\n}\n\nexport default ScrollButtons\n"
  },
  {
    "path": "src/variants/VariantsList/VariantItem/PresenceAnimation.tsx",
    "content": "import { ReactNode } from 'react'\nimport { motion } from 'framer-motion'\n\ntype Props = {\n  children: ReactNode\n  shouldAnimate: boolean\n  onAnimationComplete: () => void\n  isVisible: boolean\n}\n\nconst variants = {\n  open: {\n    opacity: 1,\n    width: 'auto',\n    x: 0,\n  },\n  collapsed: { opacity: 0, width: 0, x: 0 },\n}\n\nfunction PresenceAnimation({\n  shouldAnimate,\n  isVisible,\n  onAnimationComplete,\n  children,\n}: Props) {\n  return (\n    <motion.div\n      transition={{ ease: 'easeInOut' }}\n      initial={shouldAnimate ? 'collapsed' : false}\n      animate={isVisible ? 'open' : 'collapsed'}\n      onAnimationComplete={onAnimationComplete}\n      variants={variants}\n    >\n      {children}\n    </motion.div>\n  )\n}\n\nexport default PresenceAnimation\n"
  },
  {
    "path": "src/variants/VariantsList/VariantItem/getMenuOrDrawerItems.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\nimport { Trash2, Edit, Copy, Info } from 'react-feather'\nimport { MenuOrDrawerItem, MenuOrDrawerSeparator } from 'general'\n\nconst Trash2Styled = chakra(Trash2)\nconst EditStyled = chakra(Edit)\nconst CopyStyled = chakra(Copy)\nconst InfoStyled = chakra(Info)\n\ntype Props = {\n  onClone: () => void\n  onEditName: () => void\n  onDelete: () => void\n  onViewDetails: () => void\n  canRemove: boolean\n}\n\nfunction getMenuOrDrawerItems({\n  onClone,\n  onEditName,\n  canRemove,\n  onDelete,\n  onViewDetails,\n}: Props) {\n  return [\n    <MenuOrDrawerItem icon={<EditStyled />} key=\"rename\" onClick={onEditName}>\n      Rename\n    </MenuOrDrawerItem>,\n\n    <MenuOrDrawerSeparator key=\"separator\" />,\n\n    <MenuOrDrawerItem\n      icon={<InfoStyled />}\n      key=\"viewDetails\"\n      onClick={onViewDetails}\n    >\n      View details\n    </MenuOrDrawerItem>,\n\n    <MenuOrDrawerItem key=\"copy\" icon={<CopyStyled />} onClick={onClone}>\n      Duplicate\n    </MenuOrDrawerItem>,\n\n    <MenuOrDrawerItem\n      key=\"remove\"\n      isDisabled={!canRemove}\n      icon={<Trash2Styled />}\n      onClick={onDelete}\n    >\n      Remove\n    </MenuOrDrawerItem>,\n  ]\n}\n\nexport default getMenuOrDrawerItems\n"
  },
  {
    "path": "src/variants/VariantsList/VariantItem/index.tsx",
    "content": "import { Text, HStack, LayoutProps, SpaceProps, Box } from '@chakra-ui/react'\nimport { VariantForm } from 'variants'\nimport { ForwardedRef, forwardRef, ReactNode, useRef } from 'react'\nimport { Draggable } from 'react-beautiful-dnd'\nimport { memo } from 'react'\nimport PresenceAnimation from './PresenceAnimation'\nimport useVariantFormEvents from './useVariantFormEvents'\nimport mergeRefs from 'react-merge-refs'\nimport { ContextMenuFlex, MenuOrDrawer } from 'general'\nimport useScrollIntoView from './useScrollIntoView'\nimport getMenuOrDrawerItems from './getMenuOrDrawerItems'\n\ntype Props = {\n  children: ReactNode\n  onDelete: (index: number) => void\n  onClone: (index: number) => void\n  onViewDetails: (variantForm: VariantForm) => void\n  onEditName: (index: number) => void\n  isSelected: boolean\n  onSelect: (variantForm: VariantForm, index: number) => void\n  variantForm: VariantForm\n  canRemove: boolean\n  index: number\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n} & LayoutProps &\n  SpaceProps\n\nfunction VariantItem({\n  onClone,\n  onEditName,\n  onDelete,\n  children,\n  isSelected,\n  onSelect,\n  onViewDetails,\n  variantForm,\n  canRemove,\n  index,\n  forwardedRef,\n  ...rest\n}: Props) {\n  const ref = useRef<HTMLDivElement>(null)\n  const variantFormEvents = useVariantFormEvents({\n    onSelect,\n    onDelete,\n    variantForm,\n    index,\n    ref,\n  })\n\n  useScrollIntoView({ isSelected, ref })\n\n  const menuOrDrawerItems = getMenuOrDrawerItems({\n    canRemove,\n    onClone: () => onClone(index),\n    onEditName: () => onEditName(index),\n    onDelete: variantFormEvents.onRemoveRequest,\n    onViewDetails: () => onViewDetails(variantForm),\n  })\n\n  return (\n    <Draggable\n      key={variantForm.fieldId}\n      draggableId={variantForm.fieldId}\n      index={index}\n      isDragDisabled={!isSelected}\n    >\n      {provided => {\n        const refs = [provided.innerRef, ref]\n\n        if (forwardedRef) {\n          refs.push(forwardedRef)\n        }\n\n        return (\n          <Box\n            flexShrink={0}\n            ref={mergeRefs(refs)}\n            {...rest}\n            {...provided.draggableProps}\n            {...provided.dragHandleProps}\n          >\n            <PresenceAnimation\n              shouldAnimate={variantFormEvents.shouldAnimate}\n              isVisible={variantFormEvents.isVisible}\n              onAnimationComplete={variantFormEvents.onAnimationComplete}\n            >\n              <ContextMenuFlex menuOrDrawerItems={menuOrDrawerItems}>\n                <HStack\n                  bg=\"white\"\n                  borderRadius=\"full\"\n                  fontWeight=\"medium\"\n                  _hover={{ color: !isSelected ? 'teal.600' : undefined }}\n                  cursor=\"pointer\"\n                  alignItems=\"center\"\n                  borderWidth=\"1px\"\n                  borderColor={isSelected ? 'teal.600' : 'gray.200'}\n                  color={isSelected ? 'teal.600' : 'gray.600'}\n                  onClick={variantFormEvents.onClick}\n                  pl={5}\n                  pr={4}\n                  height=\"40px\"\n                  spacing={1}\n                  overflow=\"hidden\"\n                >\n                  <Text\n                    fontWeight=\"semibold\"\n                    noOfLines={1}\n                    flexShrink={0}\n                    fontSize=\"md\"\n                  >\n                    {children}\n                  </Text>\n\n                  <MenuOrDrawer\n                    title=\"Day\"\n                    borderRadius=\"full\"\n                    aria-label=\"Day actions\"\n                  >\n                    {menuOrDrawerItems}\n                  </MenuOrDrawer>\n                </HStack>\n                <Box width={2} />\n              </ContextMenuFlex>\n            </PresenceAnimation>\n          </Box>\n        )\n      }}\n    </Draggable>\n  )\n}\n\nexport default memo(\n  forwardRef<HTMLDivElement, Props>((props, ref) => (\n    <VariantItem {...props} forwardedRef={ref} />\n  ))\n)\n"
  },
  {
    "path": "src/variants/VariantsList/VariantItem/useScrollIntoView.ts",
    "content": "import { RefObject, useEffect } from 'react'\n\ntype Params = {\n  isSelected: boolean\n  ref: RefObject<HTMLDivElement>\n}\n\nfunction useScrollIntoView({ ref, isSelected }: Params) {\n  useEffect(() => {\n    setTimeout(() => {\n      if (isSelected) {\n        ref.current?.scrollIntoView({\n          block: 'nearest',\n          behavior: 'smooth',\n        })\n      }\n    }, 200)\n  }, [ref, isSelected])\n}\n\nexport default useScrollIntoView\n"
  },
  {
    "path": "src/variants/VariantsList/VariantItem/useVariantFormEvents.ts",
    "content": "import { getInsertVariantFormAnimationKey, VariantForm } from 'variants'\nimport { RefObject, useState } from 'react'\nimport { useOneTimeCheckActions } from 'general'\nimport { MouseEvent } from 'react'\n\ntype Params = {\n  onDelete: (index: number) => void\n  onSelect: (variantForm: VariantForm, index: number) => void\n  variantForm: VariantForm\n  index: number\n  ref: RefObject<HTMLDivElement>\n}\n\nfunction useVariantFormEvents({\n  onDelete,\n  onSelect,\n  variantForm,\n\n  index,\n}: Params) {\n  const oneTimeCheckActions = useOneTimeCheckActions()\n  const [isVisible, setIsVisible] = useState(true)\n\n  const shouldAnimate = oneTimeCheckActions.checkAndReset(\n    getInsertVariantFormAnimationKey(variantForm.fieldId)\n  )\n\n  function onAnimationComplete() {\n    if (!isVisible) {\n      onDelete(index)\n    }\n  }\n\n  function onClick(event: MouseEvent<HTMLDivElement>) {\n    const anyTarget: any = event.target\n\n    if (\n      anyTarget.type !== 'button' &&\n      anyTarget.getAttribute('role') !== 'menuitem'\n    ) {\n      onSelect(variantForm, index)\n    }\n  }\n\n  function onRemoveRequest() {\n    setIsVisible(false)\n  }\n\n  return {\n    onClick,\n    shouldAnimate,\n    onAnimationComplete,\n    isVisible,\n    onRemoveRequest,\n  }\n}\n\nexport default useVariantFormEvents\n"
  },
  {
    "path": "src/variants/VariantsList/VariantNameModal/Content.tsx",
    "content": "import {\n  ModalFooter,\n  ModalBody,\n  Button,\n  FormControl,\n  Input,\n  FormLabel,\n  FormErrorMessage,\n  ModalContent,\n  ModalHeader,\n  ModalCloseButton,\n  Collapse,\n  Box,\n} from '@chakra-ui/react'\nimport { RefObject } from 'react'\nimport { useFormContext } from 'react-hook-form'\nimport { useMergeRefs } from '@chakra-ui/react'\nimport useSubmitVariantNameForm from './useSubmitVariantNameForm'\nimport { useFormError, useSelectInputText } from 'form'\n\ntype Props = {\n  title: string\n  onClose: () => void\n  initialRef: RefObject<HTMLInputElement>\n  variantFormIndex: number\n}\n\nfunction Content({ title, onClose, initialRef, variantFormIndex }: Props) {\n  const { register } = useFormContext()\n  const nameRegister = register('name')\n  const nameInputRef = useMergeRefs(nameRegister.ref, initialRef)\n\n  const onSubmit = useSubmitVariantNameForm({\n    variantFormIndex,\n    onComplete: onClose,\n  })\n\n  const { errorMessage, isInvalid } = useFormError('name')\n\n  useSelectInputText(initialRef)\n\n  return (\n    <form onSubmit={onSubmit}>\n      <ModalContent>\n        <ModalHeader>{title}</ModalHeader>\n        <ModalCloseButton />\n\n        <ModalBody>\n          <FormControl isInvalid={isInvalid}>\n            <FormLabel>Name</FormLabel>\n            <Input\n              autoComplete=\"off\"\n              {...nameRegister}\n              ref={nameInputRef}\n              focusBorderColor={isInvalid ? 'red.500' : undefined}\n              placeholder=\"Enter name\"\n            />\n            <Collapse animateOpacity={true} in={Boolean(errorMessage)}>\n              <Box minHeight=\"21px\">\n                <FormErrorMessage>{errorMessage}</FormErrorMessage>\n              </Box>\n            </Collapse>\n          </FormControl>\n        </ModalBody>\n\n        <ModalFooter>\n          <Button mr={3} onClick={onClose}>\n            Close\n          </Button>\n          <Button\n            type=\"submit\"\n            colorScheme=\"teal\"\n            variant=\"solid\"\n            onClick={onSubmit}\n          >\n            Rename\n          </Button>\n        </ModalFooter>\n      </ModalContent>\n    </form>\n  )\n}\n\nexport default Content\n"
  },
  {
    "path": "src/variants/VariantsList/VariantNameModal/VariantNameFormProvider.tsx",
    "content": "import { FormProvider, useForm } from 'react-hook-form'\nimport { yupResolver } from '@hookform/resolvers/yup'\nimport { ReactNode } from 'react'\nimport { useDietForm } from 'diets'\nimport {\n  getVariantNameForm,\n  VariantNameForm,\n  variantNameFormSchema,\n} from './variantNameForm'\nimport { VariantNameFormSchemaContext } from './variantNameForm'\n\ntype Props = {\n  children: ReactNode\n  variantFormIndex?: number\n}\n\nfunction VariantNameFormProvider({ children, variantFormIndex }: Props) {\n  const dietForm = useDietForm()\n  const { variantsForms } = dietForm\n  const variantForm =\n    variantFormIndex !== undefined ? variantsForms[variantFormIndex] : undefined\n\n  const defaultValues = getVariantNameForm(\n    variantFormIndex !== undefined\n      ? dietForm.variantsForms[variantFormIndex].name\n      : ''\n  )\n\n  const formMethods = useForm<VariantNameForm, VariantNameFormSchemaContext>({\n    defaultValues,\n    mode: 'onChange',\n    context: {\n      variantsForms,\n      variantForm,\n    },\n    resolver: yupResolver(variantNameFormSchema),\n  })\n\n  return <FormProvider {...formMethods}>{children}</FormProvider>\n}\n\nexport default VariantNameFormProvider\n"
  },
  {
    "path": "src/variants/VariantsList/VariantNameModal/index.tsx",
    "content": "import { Modal, ModalOverlay } from '@chakra-ui/react'\nimport { useRef } from 'react'\nimport Content from './Content'\nimport VariantNameFormProvider from './VariantNameFormProvider'\n\ntype Props = {\n  onClose: () => void\n  isOpen: boolean\n  variantFormIndex: number\n}\n\nfunction VariantNameModal({ onClose, isOpen, variantFormIndex }: Props) {\n  const initialRef = useRef<HTMLInputElement>(null)\n  const finalFocusRef = useRef(null)\n\n  return (\n    <Modal\n      isOpen={isOpen}\n      preserveScrollBarGap={true}\n      onClose={onClose}\n      initialFocusRef={initialRef}\n      finalFocusRef={finalFocusRef}\n      size=\"sm\"\n    >\n      <ModalOverlay />\n      <VariantNameFormProvider variantFormIndex={variantFormIndex}>\n        <Content\n          title=\"Rename Day\"\n          onClose={onClose}\n          initialRef={initialRef}\n          variantFormIndex={variantFormIndex}\n        />\n      </VariantNameFormProvider>\n    </Modal>\n  )\n}\n\nexport * from './variantNameForm'\nexport * from './useSubmitVariantNameForm'\n\nexport default VariantNameModal\n"
  },
  {
    "path": "src/variants/VariantsList/VariantNameModal/useSubmitVariantNameForm.ts",
    "content": "import { useFormContext } from 'react-hook-form'\nimport { VariantNameForm } from './variantNameForm'\nimport { useDietFormActions } from 'diets'\n\ntype Params = {\n  onComplete: (variantNameForm: VariantNameForm) => void\n  variantFormIndex: number\n}\n\nfunction useSubmitVariantNameForm({ onComplete, variantFormIndex }: Params) {\n  const dietFormActions = useDietFormActions()\n  const { handleSubmit } = useFormContext()\n\n  const onSubmit = handleSubmit((form: VariantNameForm) => {\n    onComplete(form)\n\n    dietFormActions.updateVariantForm(variantFormIndex, { name: form.name })\n  })\n\n  return onSubmit\n}\n\nexport default useSubmitVariantNameForm\n"
  },
  {
    "path": "src/variants/VariantsList/VariantNameModal/variantNameForm.ts",
    "content": "import { VariantForm } from 'variants'\nimport { object, string } from 'yup'\n\ntype VariantNameForm = {\n  name: string\n}\n\nfunction getVariantNameForm(name: string): VariantNameForm {\n  return {\n    name,\n  }\n}\n\ntype VariantNameFormSchemaContext = {\n  variantsForms: VariantForm[]\n  variantForm?: VariantForm\n}\n\nconst variantNameFormSchema = object().shape({\n  name: string()\n    .required('Please add a name')\n    .test(\n      'uniqueName',\n      'This name has already been used',\n      (currentName, { options }) => {\n        if (currentName === undefined) {\n          return true\n        }\n\n        const {\n          variantsForms,\n          variantForm,\n        } = options.context as VariantNameFormSchemaContext\n\n        const sameVariantFormExists = variantsForms.some(\n          ({ name, fieldId }) => {\n            const haveSameNames =\n              currentName.toLowerCase() === name.toLowerCase()\n            return variantForm\n              ? fieldId !== variantForm.fieldId && haveSameNames\n              : haveSameNames\n          }\n        )\n\n        return !sameVariantFormExists\n      }\n    ),\n})\n\nexport { getVariantNameForm, variantNameFormSchema }\n\nexport type { VariantNameForm, VariantNameFormSchemaContext }\n"
  },
  {
    "path": "src/variants/VariantsList/VariantsMenuOrDrawer/Drawer/VariantItem.tsx",
    "content": "import { Box, BoxProps, Flex, Text } from '@chakra-ui/react'\nimport { Check } from 'react-feather'\n\ntype Props = {\n  name: string\n  isSelected: boolean\n} & BoxProps\n\nfunction VariantItem({ name, isSelected, ...rest }: Props) {\n  return (\n    <Box\n      position=\"relative\"\n      as=\"button\"\n      width=\"100%\"\n      textAlign=\"left\"\n      borderRadius={4}\n      p={3}\n      fontSize=\"sm\"\n      fontWeight=\"semibold\"\n      _hover={{ bg: 'gray.50' }}\n      _active={{\n        bg: 'gray.100',\n      }}\n      {...rest}\n    >\n      <Flex justifyContent=\"space-between\">\n        <Text fontSize=\"md\" fontWeight=\"normal\">\n          {name}\n        </Text>\n        {isSelected && (\n          <Flex alignItems=\"center\">\n            <Check color=\"green\" size={20} />\n          </Flex>\n        )}\n      </Flex>\n    </Box>\n  )\n}\n\nexport default VariantItem\n"
  },
  {
    "path": "src/variants/VariantsList/VariantsMenuOrDrawer/Drawer/index.tsx",
    "content": "import {\n  Drawer as DrawerBase,\n  DrawerBody,\n  DrawerHeader,\n  DrawerOverlay,\n  DrawerContent,\n  DrawerCloseButton,\n} from '@chakra-ui/react'\nimport { useDietForm } from 'diets'\nimport { VariantForm } from 'variants'\nimport VariantItem from './VariantItem'\n\ntype Props = {\n  isOpen: boolean\n  onClose: () => void\n  onSelect: (variantForm: VariantForm, index: number) => void\n}\n\nfunction Drawer({ isOpen, onClose, onSelect }: Props) {\n  const { variantsForms, selectedVariantFormIndex } = useDietForm()\n\n  return (\n    <DrawerBase isOpen={isOpen} placement=\"bottom\" onClose={onClose}>\n      <DrawerOverlay />\n      <DrawerContent maxHeight=\"500px\">\n        <DrawerCloseButton />\n        <DrawerHeader fontSize=\"md\">Variants</DrawerHeader>\n\n        <DrawerBody>\n          {variantsForms.map((variantForm, index) => {\n            const { fieldId, name } = variantForm\n            const isSelected = index === selectedVariantFormIndex\n\n            return (\n              <VariantItem\n                key={fieldId}\n                name={name}\n                isSelected={isSelected}\n                onClick={() => {\n                  onClose()\n                  onSelect(variantForm, index)\n                }}\n              />\n            )\n          })}\n        </DrawerBody>\n      </DrawerContent>\n    </DrawerBase>\n  )\n}\n\nexport default Drawer\n"
  },
  {
    "path": "src/variants/VariantsList/VariantsMenuOrDrawer/Menu.tsx",
    "content": "import { chakra } from '@chakra-ui/react'\nimport { Check } from 'react-feather'\nimport { Menu as MenuBase, MenuItem } from 'general'\nimport Trigger from './Trigger'\nimport { useDietForm } from 'diets'\nimport { VariantForm } from 'variants'\n\nconst CheckStyled = chakra(Check)\n\ntype Props = {\n  onSelect: (variantForm: VariantForm, index: number) => void\n}\n\nfunction Menu({ onSelect }: Props) {\n  const { variantsForms, selectedVariantFormIndex } = useDietForm()\n\n  return (\n    <MenuBase arrow menuButton={<Trigger />}>\n      {variantsForms.map((variantForm, index) => {\n        const { fieldId, name } = variantForm\n        const isSelected = index === selectedVariantFormIndex\n\n        return (\n          <MenuItem key={fieldId} onClick={() => onSelect(variantForm, index)}>\n            <CheckStyled\n              color={isSelected ? 'teal' : 'transparent'}\n              pointerEvents=\"none\"\n              size={15}\n              mr={3}\n            />\n            {name}\n          </MenuItem>\n        )\n      })}\n    </MenuBase>\n  )\n}\n\nexport default Menu\n"
  },
  {
    "path": "src/variants/VariantsList/VariantsMenuOrDrawer/Trigger.tsx",
    "content": "import { IconButton } from '@chakra-ui/react'\nimport { ChevronDown } from 'react-feather'\nimport { ForwardedRef, forwardRef } from 'react'\nimport { useScreenSize, Tooltip, ScreenSize } from 'general'\n\ntype Props = {\n  forwardedRef?: ForwardedRef<HTMLButtonElement>\n  onClick?: () => void\n}\n\nfunction Trigger({ forwardedRef, onClick, ...rest }: Props) {\n  const screenSize = useScreenSize()\n  const isPhone = screenSize <= ScreenSize.Small\n\n  return (\n    <Tooltip label=\"All days\">\n      <IconButton\n        borderRadius=\"full\"\n        bg=\"white\"\n        size=\"md\"\n        aria-label=\"Add variant\"\n        icon={<ChevronDown size={20} pointerEvents=\"none\" />}\n        variant=\"outline\"\n        mr={isPhone ? 0 : 2}\n        ml={isPhone ? 2 : 0}\n        flexShrink={0}\n        ref={forwardedRef}\n        onClick={onClick}\n        {...rest}\n      />\n    </Tooltip>\n  )\n}\nexport default forwardRef<HTMLButtonElement, Props>((props, ref) => (\n  <Trigger {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/variants/VariantsList/VariantsMenuOrDrawer/index.tsx",
    "content": "import { useScreenSize, ScreenSize } from 'general'\nimport Drawer from './Drawer'\nimport Trigger from './Trigger'\nimport { useDisclosure } from '@chakra-ui/hooks'\nimport Menu from './Menu'\nimport { useDietFormActions } from 'diets'\nimport { VariantForm } from 'variants'\n\ntype Props = {\n  onVariantFormSelect: (variantForm: VariantForm, index: number) => void\n}\n\nfunction VariantsMenuOrDrawer({ onVariantFormSelect }: Props) {\n  const screenSize = useScreenSize()\n  const modalDisclosure = useDisclosure()\n  const dietActions = useDietFormActions()\n\n  function onSelect(variantForm: VariantForm, index: number) {\n    dietActions.setSelectedVariantFormIndex(index)\n    onVariantFormSelect(variantForm, index)\n  }\n\n  if (screenSize < ScreenSize.Medium) {\n    return (\n      <>\n        <Trigger onClick={modalDisclosure.onOpen} />\n        <Drawer\n          onSelect={onSelect}\n          isOpen={modalDisclosure.isOpen}\n          onClose={modalDisclosure.onClose}\n        />\n      </>\n    )\n  }\n\n  return <Menu onSelect={onSelect} />\n}\n\nexport default VariantsMenuOrDrawer\n"
  },
  {
    "path": "src/variants/VariantsList/index.tsx",
    "content": "import { Flex, useDisclosure } from '@chakra-ui/react'\nimport VariantItem from './VariantItem'\nimport { Droppable } from 'react-beautiful-dnd'\nimport VariantNameModal from './VariantNameModal'\nimport { ForwardedRef, createRef, forwardRef, useRef } from 'react'\nimport { useDietForm } from 'diets'\nimport { VariantForm, VariantsDetailsModal } from 'variants'\nimport { HFadeScroll, useScreenSize, ScreenSize } from 'general'\nimport mergeRefs from 'react-merge-refs'\nimport ScrollButtons from './ScrollButtons'\nimport VariantsMenuOrDrawer from './VariantsMenuOrDrawer'\nimport { useGetRefForId } from 'dom'\nimport useScrollState from './useScrollState'\nimport useVariantFormEvents from './useVariantFormEvents'\nimport AddVariantButton from './AddVariantButton'\n\ntype Props = {\n  onVariantFormSelect: (variantForm: VariantForm, index: number) => void\n  onVariantFormCopy: () => void\n  forwardedRef?: ForwardedRef<HTMLDivElement>\n}\nfunction VariantsList({\n  onVariantFormSelect,\n  onVariantFormCopy,\n  forwardedRef = createRef(),\n}: Props) {\n  const scrollNodeRef = useRef<HTMLDivElement>(null)\n  const screenSize = useScreenSize()\n  const isPhone = screenSize <= ScreenSize.Small\n\n  const nameModalDisclosure = useDisclosure()\n  const detailsModalDisclosure = useDisclosure()\n\n  const variantFormEvents = useVariantFormEvents({\n    onVariantFormSelect,\n    onVariantFormCopy,\n    nameModalDisclosure,\n    detailsModalDisclosure,\n  })\n\n  const dietForm = useDietForm()\n  const getVariantItemRefById = useGetRefForId<HTMLDivElement>()\n  const scrollState = useScrollState()\n\n  return (\n    <Flex py={6}>\n      <AddVariantButton onClick={variantFormEvents.onAppend} />\n\n      {!isPhone && (\n        <VariantsMenuOrDrawer onVariantFormSelect={onVariantFormSelect} />\n      )}\n\n      <Droppable\n        droppableId=\"variantsList\"\n        type=\"variantsList\"\n        direction=\"horizontal\"\n      >\n        {provided => (\n          <HFadeScroll\n            onScrollStateChange={scrollState.onScrollStateChange}\n            ref={mergeRefs([provided.innerRef, scrollNodeRef, forwardedRef])}\n          >\n            {dietForm.variantsForms.map((variantForm, index) => {\n              return (\n                <VariantItem\n                  data-test-type=\"variant\"\n                  data-test-index={index}\n                  canRemove={dietForm.variantsForms.length > 1}\n                  index={index}\n                  onDelete={variantFormEvents.onRemove}\n                  onEditName={variantFormEvents.onRename}\n                  onClone={variantFormEvents.onCopy}\n                  onViewDetails={variantFormEvents.onViewDetails}\n                  key={variantForm.fieldId}\n                  variantForm={variantForm}\n                  isSelected={index === dietForm.selectedVariantFormIndex}\n                  onSelect={variantFormEvents.onSelect}\n                  ref={getVariantItemRefById(variantForm.fieldId)}\n                >\n                  {variantForm.name}\n                </VariantItem>\n              )\n            })}\n\n            {provided.placeholder}\n          </HFadeScroll>\n        )}\n      </Droppable>\n\n      {isPhone ? (\n        <VariantsMenuOrDrawer onVariantFormSelect={onVariantFormSelect} />\n      ) : (\n        <ScrollButtons\n          scrollNodeRef={scrollNodeRef}\n          showsButtons={scrollState.showsScrollButtons}\n          canScrollLeft={scrollState.canScrollLeft}\n          canScrollRight={scrollState.canScrollRight}\n        />\n      )}\n\n      <VariantNameModal\n        isOpen={nameModalDisclosure.isOpen}\n        onClose={nameModalDisclosure.onClose}\n        variantFormIndex={variantFormEvents.variantFormIndex}\n      />\n\n      {variantFormEvents.variantForm && (\n        <VariantsDetailsModal\n          isOpen={detailsModalDisclosure.isOpen}\n          onClose={detailsModalDisclosure.onClose}\n          initialVariantForm={variantFormEvents.variantForm}\n        />\n      )}\n    </Flex>\n  )\n}\n\nexport default forwardRef<HTMLDivElement, Props>((props, ref) => (\n  <VariantsList {...props} forwardedRef={ref} />\n))\n"
  },
  {
    "path": "src/variants/VariantsList/useScrollState.ts",
    "content": "import { useState } from 'react'\n\nfunction useScrollState() {\n  const [showsScrollButtons, setShowsScrollButtons] = useState(false)\n  const [canScrollLeft, setCanScrollLeft] = useState(false)\n  const [canScrollRight, setCanScrollRight] = useState(false)\n\n  function onScrollStateChange(\n    isScrollable: boolean,\n    canScrollLeft: boolean,\n    canScrollRight: boolean\n  ) {\n    setCanScrollLeft(canScrollLeft)\n    setCanScrollRight(canScrollRight)\n    setShowsScrollButtons(isScrollable)\n  }\n\n  return {\n    showsScrollButtons,\n    canScrollLeft,\n    canScrollRight,\n    onScrollStateChange,\n  }\n}\n\nexport default useScrollState\n"
  },
  {
    "path": "src/variants/VariantsList/useVariantFormEvents.ts",
    "content": "import { useState, useCallback } from 'react'\nimport { VariantForm } from 'variants'\nimport { useDietFormActions } from 'diets'\nimport { UseDisclosureReturn } from '@chakra-ui/hooks'\n\ntype Params = {\n  onVariantFormSelect: (variantForm: VariantForm, index: number) => void\n  onVariantFormCopy: () => void\n  nameModalDisclosure: UseDisclosureReturn\n  detailsModalDisclosure: UseDisclosureReturn\n}\n\nfunction useVariantFormEvents({\n  onVariantFormSelect,\n  onVariantFormCopy,\n  nameModalDisclosure,\n  detailsModalDisclosure,\n}: Params) {\n  const [variantFormIndex, setVariantFormIndex] = useState<number>(0)\n  const [variantForm, setVariantForm] = useState<VariantForm>()\n\n  const dietFormActions = useDietFormActions()\n\n  const onRename = useCallback(\n    (index: number) => {\n      setVariantFormIndex(index)\n      nameModalDisclosure.onOpen()\n    },\n    [nameModalDisclosure]\n  )\n\n  const onViewDetails = useCallback(\n    (selectedVariantForm: VariantForm) => {\n      setVariantForm(selectedVariantForm)\n      detailsModalDisclosure.onOpen()\n    },\n    [detailsModalDisclosure]\n  )\n  const onCopy = useCallback(\n    (index: number) => {\n      dietFormActions.duplicateVariantForm(index)\n      onVariantFormCopy()\n    },\n    [dietFormActions, onVariantFormCopy]\n  )\n\n  const onAppend = useCallback(() => {\n    dietFormActions.appendVariantForm()\n  }, [dietFormActions])\n\n  const onSelect = useCallback(\n    (variantForm: VariantForm, index: number) => {\n      dietFormActions.setSelectedVariantFormIndex(index)\n      onVariantFormSelect(variantForm, index)\n    },\n    [dietFormActions, onVariantFormSelect]\n  )\n\n  const onRemove = useCallback(\n    (index: number) => {\n      dietFormActions.removeVariantForm(index)\n    },\n    [dietFormActions]\n  )\n\n  return {\n    onAppend,\n    onCopy,\n    onRename,\n    onSelect,\n    variantFormIndex,\n    variantForm,\n    onRemove,\n    onViewDetails,\n  }\n}\n\nexport default useVariantFormEvents\n"
  },
  {
    "path": "src/variants/getVariantFormIndexAfterRemove.ts",
    "content": "function getVariantFormIndexAfterRemove(\n  selectedIndex: number,\n  indexToRemove: number\n) {\n  if (indexToRemove < selectedIndex) {\n    return selectedIndex - 1\n  }\n\n  if (indexToRemove === selectedIndex && indexToRemove > 0) {\n    return indexToRemove - 1\n  }\n\n  return selectedIndex\n}\n\nexport default getVariantFormIndexAfterRemove\n"
  },
  {
    "path": "src/variants/index.ts",
    "content": "export { default as useVariantsFormsActions } from './useVariantsFormsActions'\nexport * from './useVariantsFormsActions'\nexport * from './variantForm'\nexport { default as VariantsList } from './VariantsList'\nexport { default as VariantsDetailsModal } from './VariantsDetailsModal'\nexport { default as useGetVariantFormStatsTree } from './useGetVariantFormStatsTree'\nexport { default as getVariantFormIndexAfterRemove } from './getVariantFormIndexAfterRemove'\nexport { default as VariantStats } from './VariantStats'\n"
  },
  {
    "path": "src/variants/useGetVariantFormStatsTree.ts",
    "content": "import { StatsTree, getStatsTree } from 'stats'\nimport { VariantForm } from './variantForm'\nimport { useGetMealFormStatsTree } from 'meals'\nimport { useCallback } from 'react'\n\nfunction useGetVariantFormStatsTree() {\n  const getMealFormStatsTree = useGetMealFormStatsTree()\n\n  const getVariantFormStatsTree = useCallback(\n    (variantForm: VariantForm): StatsTree => {\n      const subtrees = variantForm.mealsForms.map(mealForm =>\n        getMealFormStatsTree(mealForm)\n      )\n\n      return getStatsTree({\n        id: variantForm.fieldId,\n        subtrees,\n      })\n    },\n    [getMealFormStatsTree]\n  )\n\n  return getVariantFormStatsTree\n}\n\nexport default useGetVariantFormStatsTree\n"
  },
  {
    "path": "src/variants/useVariantsFormsActions.ts",
    "content": "import { useCallback, SetStateAction } from 'react'\nimport { DietForm } from 'diets'\nimport produce from 'immer'\nimport {\n  getInsertVariantFormAnimationKey,\n  getVariantForm,\n  VariantForm,\n} from './variantForm'\nimport { OneTimeCheckActions } from 'general'\nimport { duplicate, getDuplicatedName, getEnumeratedName } from 'form'\nimport getVariantFormIndexAfterRemove from './getVariantFormIndexAfterRemove'\n\ntype Params = {\n  setDietForm: (action: SetStateAction<DietForm>) => void\n  oneTimeCheckActions: OneTimeCheckActions\n}\n\nfunction getAppendedVariantFormName(variantForms: VariantForm[]) {\n  return getEnumeratedName(`Day ${variantForms.length + 1}`, variantForms)\n}\n\nfunction useVariantsFormsActions({ setDietForm, oneTimeCheckActions }: Params) {\n  const appendVariantForm = useCallback(\n    () =>\n      setDietForm(\n        produce(draftDietForm => {\n          const variantForm = getVariantForm(\n            getAppendedVariantFormName(draftDietForm.variantsForms)\n          )\n\n          oneTimeCheckActions.set(\n            getInsertVariantFormAnimationKey(variantForm.fieldId)\n          )\n\n          draftDietForm.variantsForms.push(variantForm)\n\n          draftDietForm.selectedVariantFormIndex =\n            draftDietForm.variantsForms.length - 1\n        })\n      ),\n    [setDietForm, oneTimeCheckActions]\n  )\n\n  const removeVariantForm = useCallback(\n    (\n      indexToRemove: number,\n      onRemove?: (newSelectedVariantForm: VariantForm) => void\n    ) =>\n      setDietForm(dietForm =>\n        produce(dietForm, draftDietForm => {\n          const { selectedVariantFormIndex, variantsForms } = draftDietForm\n\n          draftDietForm.selectedVariantFormIndex = getVariantFormIndexAfterRemove(\n            selectedVariantFormIndex,\n            indexToRemove\n          )\n          draftDietForm.variantsForms.splice(indexToRemove, 1)\n\n          if (onRemove) {\n            onRemove(variantsForms[draftDietForm.selectedVariantFormIndex])\n          }\n        })\n      ),\n    [setDietForm]\n  )\n\n  const duplicateVariantForm = useCallback(\n    (variantFormIndex: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const { variantsForms } = draftDietForm\n          const variantForm = variantsForms[variantFormIndex]\n\n          const copiedVariantForm = duplicate(variantForm)\n          oneTimeCheckActions.set(\n            getInsertVariantFormAnimationKey(copiedVariantForm.fieldId)\n          )\n          const newVariantForm = {\n            ...copiedVariantForm,\n            name: getDuplicatedName(variantFormIndex, variantsForms),\n          }\n\n          variantsForms.splice(variantFormIndex + 1, 0, newVariantForm)\n          draftDietForm.selectedVariantFormIndex = variantFormIndex + 1\n        })\n      ),\n    [setDietForm, oneTimeCheckActions]\n  )\n\n  const moveVariantForm = useCallback(\n    (fromIndex: number, toIndex: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const { variantsForms, selectedVariantFormIndex } = draftDietForm\n          const selectedVariantForm = variantsForms[selectedVariantFormIndex]\n\n          const variantForm = variantsForms[fromIndex]\n          variantsForms.splice(fromIndex, 1)\n          variantsForms.splice(toIndex, 0, variantForm)\n\n          const newSelectedVariantFormIndex = variantsForms.findIndex(\n            ({ fieldId }) => fieldId === selectedVariantForm.fieldId\n          )\n\n          draftDietForm.selectedVariantFormIndex = newSelectedVariantFormIndex\n        })\n      ),\n    [setDietForm]\n  )\n\n  const updateVariantForm = useCallback(\n    (variantFormIndex: number, partialVariantForm: Partial<VariantForm>) =>\n      setDietForm(\n        produce(draftDietForm => {\n          const variantForm = draftDietForm.variantsForms[variantFormIndex]\n          draftDietForm.variantsForms[variantFormIndex] = {\n            ...variantForm,\n            ...partialVariantForm,\n          }\n        })\n      ),\n    [setDietForm]\n  )\n\n  const setSelectedVariantFormIndex = useCallback(\n    (index: number) =>\n      setDietForm(\n        produce(draftDietForm => {\n          draftDietForm.selectedVariantFormIndex = index\n        })\n      ),\n    [setDietForm]\n  )\n\n  return {\n    appendVariantForm,\n    removeVariantForm,\n    duplicateVariantForm,\n    updateVariantForm,\n    moveVariantForm,\n    setSelectedVariantFormIndex,\n  }\n}\n\ntype VariantsFormsActions = ReturnType<typeof useVariantsFormsActions>\n\nexport type { VariantsFormsActions }\n\nexport default useVariantsFormsActions\n"
  },
  {
    "path": "src/variants/variantForm.ts",
    "content": "import { MealForm } from 'meals'\nimport { v4 as uuidv4 } from 'uuid'\n\ntype VariantForm = {\n  fieldId: string\n  name: string\n  mealsForms: MealForm[]\n}\n\nfunction getVariantForm(name: string): VariantForm {\n  const fieldId = uuidv4()\n\n  return {\n    fieldId,\n    name,\n    mealsForms: [],\n  }\n}\n\nfunction getInsertVariantFormAnimationKey(fieldId: string) {\n  return `insert-variant-animmation-${fieldId}`\n}\n\nexport type { VariantForm }\n\nexport { getVariantForm, getInsertVariantFormAnimationKey }\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\",\n    \"baseUrl\": \"src\"\n  },\n  \"include\": [\n    \"src\"\n  ]\n}\n"
  }
]