Full Code of dat-land/dat-desktop for AI

master 57a34e227227 cached
88 files
1.8 MB
447.9k tokens
1583 symbols
1 requests
Download .txt
Showing preview only (1,888K chars total). Download the full file or copy to clipboard to get everything.
Repository: dat-land/dat-desktop
Branch: master
Commit: 57a34e227227
Files: 88
Total size: 1.8 MB

Directory structure:
gitextract_rtm8sp7z/

├── .babelrc
├── .github/
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── nodejs.yml
├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│   ├── actions/
│   │   ├── dat-middleware.js
│   │   └── index.js
│   ├── components/
│   │   ├── app.js
│   │   ├── button.js
│   │   ├── dat-import.js
│   │   ├── dialog.js
│   │   ├── empty.js
│   │   ├── file-list.js
│   │   ├── finder-button.js
│   │   ├── header.js
│   │   ├── hex-content.js
│   │   ├── icon.js
│   │   ├── inspect.js
│   │   ├── intro.js
│   │   ├── status-bar.js
│   │   ├── status.js
│   │   ├── table-row.js
│   │   ├── table.js
│   │   └── title-field.js
│   ├── consts/
│   │   ├── env.js
│   │   ├── screen.js
│   │   └── state.js
│   ├── containers/
│   │   ├── dat-import.js
│   │   ├── dialog.js
│   │   ├── drag-drop.js
│   │   ├── header.js
│   │   ├── inspect.js
│   │   ├── intro.js
│   │   ├── status-bar.js
│   │   ├── table-row.js
│   │   └── table.js
│   ├── index.js
│   └── reducers/
│       └── index.js
├── appveyor.yml
├── build/
│   └── icon.icns
├── dev/
│   └── react-dev-tools/
│       ├── _metadata/
│       │   └── verified_contents.json
│       ├── build/
│       │   ├── backend.js
│       │   ├── background.js
│       │   ├── contentScript.js
│       │   ├── inject.js
│       │   ├── main.js
│       │   └── panel.js
│       ├── main.html
│       ├── manifest.json
│       ├── panel.html
│       └── popups/
│           ├── deadcode.html
│           ├── development.html
│           ├── disabled.html
│           ├── outdated.html
│           ├── production.html
│           ├── shared.js
│           └── unminified.html
├── dist/
│   └── .gitignore
├── index.html
├── index.js
├── lib/
│   └── auto-updater.js
├── package.json
├── preload.js
├── static/
│   └── base.css
├── tests/
│   ├── fixtures/
│   │   ├── dat.json
│   │   └── hello.txt
│   ├── index.js
│   └── utils/
│       ├── wait.js
│       ├── waitForAndClick.js
│       ├── waitForMatch.js
│       └── waitForVisible.js
├── unit-tests/
│   ├── _helpers/
│   │   ├── enzymeSetup.js
│   │   └── mockWindow.js
│   ├── dat-import.js
│   ├── file-list.js
│   ├── hex-content.js
│   ├── inspect.js
│   ├── intro.js
│   ├── status-bar.js
│   ├── status.js
│   ├── table-row.js
│   ├── table.js
│   └── title-field.js
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
  "presets": [
    "@babel/preset-react"
  ],
  "env": {
    "test": {
      "plugins": [
        "@babel/plugin-transform-modules-commonjs",
        "@babel/plugin-transform-classes",
        "@babel/plugin-proposal-object-rest-spread"
      ]
    }
  }
}


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Thanks for contributing to the project!
Please help us keep this project in good shape by going through this checklist.
Replace the empty checkboxes [ ] below with checked ones [X] as they are completed
Remember, you can preview this before saving it.
-->

<!-- You can remove this first section if you have contributed before -->

### First time contributor checklist:

- [ ] I have read the [README](https://github.com/digidem/mapeo-desktop/blob/master/README.md) 

### Contributor checklist:

- [ ] My commits are in nice logical chunks with [good commit messages](http://chris.beams.io/posts/git-commit/)
- [ ] If my changes depend upon an update to a dependency, I have updated the package-lock.json file using `npm install --package-lock`
- [ ] I have used the app myself and all of the buttons work.
- [ ] I have tested the application with [the commandline
  tool](https://github.com/datproject/dat).
- [ ] My changes have been tested with the integration tests, and all tests pass.
- [ ] My changes are ready to be shipped to users on Mac and Linux.

### Description

<!--
Describe briefly what your pull request changes. Focus on the value provided to users.

Does it address any outstanding issues in this project?
  Reference an issue with the hash symbol: "#222"
  If you're fixing it, use something like "Fixes #222"

Please write a summary of your test approach:
  - Did you write any new tests?
  - What operating systems did you test with? (please use specific versions: http://whatsmyos.com/)
  - What other devices did you test with? (other Desktop devices, Android, Android Simulator, iOS, iOS Simulator)
-->



================================================
FILE: .github/workflows/nodejs.yml
================================================
name: Node CD

on: [push]

jobs:
  build:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: [windows-latest]

    steps:
      - name: Context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"
      - uses: actions/checkout@v1
        with:
          fetch-depth: 1
      - name: Use Node.js 12.4
        uses: actions/setup-node@v1
        with:
          node-version: 12.4
      - name: npm install
        run: |
          npm install
      - name: Test
        run: |
          npm test
      - name: Build frontend
        run: |
          npm run build:prod
        env:
          CI: true
      - name: Publish
        run: |
          npm run dist:publish
        env:
          CI: true
          GITHUB_CI_REF: ${{ github.ref }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
      - name: Cleanup artifacts
        run: |
          npx rimraf@2 'dist/!(*.exe|*.deb|*.AppImage|*.dmg)'
        shell: bash
      - name: Upload artifacts
        uses: actions/upload-artifact@v1
        with:
          name: ${{ matrix.os }}
          path: dist


================================================
FILE: .gitignore
================================================
node_modules
.DS_Store
dmgs
npm-debug.log
build/background.tiff
.dat
tags
yarn.lock
static/bundle.js


================================================
FILE: .travis.yml
================================================
dist: trusty
cache: bundler
sudo: false

language: node_js
node_js:
  - 12.4

os:
  - osx
  - linux

notifications:
  email: false

addons:
  apt:
    packages:
      - icnsutils
      - graphicsmagick
      - xz-utils
      - xvfb

env:
  - DISPLAY=":99.0"

install:
  - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
  - npm install
  - npm run build:prod

deploy:
  provider: script
  script: npm run dist:publish
  on:
    branch: master
  skip_cleanup: true


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.

### [3.0.2](https://github.com/datproject/dat-desktop/compare/v3.0.1...v3.0.2) (2020-02-20)


### Bug Fixes

* add standard version ([c6788cf](https://github.com/datproject/dat-desktop/commit/c6788cf))
* Windows download issue, an attempt to squash it! ([dd270f1](https://github.com/datproject/dat-desktop/commit/dd270f1))



### [3.0.1](https://github.com/datproject/dat-desktop/compare/v3.0.0...v3.0.1) (2020-02-18)


### Bug Fixes

* Fix a bug where sometimes download dir wouldn't exist and crash ([7e1f2a7](https://github.com/datproject/dat-desktop/commit/7e1f2a741c708772500a505e7f21b76456af1c92))
* Should no longer crash on startup for Mac. ([1bd0436](https://github.com/datproject/dat-desktop/commit/1bd043692129fe2436c15b8f6d2371bd9ea6f8bc))
* When downloading a dat, ensure Download button is visible. ([4a573ed](https://github.com/datproject/dat-desktop/commit/4a573ed385d7f3df7ac5f4f687f4e9db40397556))

## [3.0.0](https://github.com/datproject/dat-desktop/compare/v2.1.0...v3.0.0) (2020-02-18)

### Features

* Windows builds!

### Bug Fixes

* add package-lock ([8420cbf](https://github.com/datproject/dat-desktop/commit/8420cbf44b7a05902dac014663886cd96e71b61d))
* avoid the screen white-out. ([f53397a](https://github.com/datproject/dat-desktop/commit/f53397aec79739b54d848a46726b242fee759ec1))
* buttons will click now ([f3aceb9](https://github.com/datproject/dat-desktop/commit/f3aceb9217ae4a97a5116a9f6e49b8de9de690f8))
* changing title still keep on the next session. ([2f826ac](https://github.com/datproject/dat-desktop/commit/2f826ac35155eda883773d840b76116c4bcc9630))
* deprecated syntax by current styled-components. ([6340267](https://github.com/datproject/dat-desktop/commit/634026755d15526edaac5a0888da9bc312915934))
* Even though if press "cancel" on download-preview-screen, still listed in dat-list. ([894225b](https://github.com/datproject/dat-desktop/commit/894225bedaa06b68835de9b4f386f74822b9f94b))
* https://github.com/dat-land/dat-desktop/pull/600#issuecomment-440926308 ([5d05d27](https://github.com/datproject/dat-desktop/commit/5d05d2737f0a504f37f1024620de75da44149b26)), closes [/github.com/dat-land/dat-desktop/pull/600#issuecomment-440926308](https://github.com/datproject//github.com/dat-land/dat-desktop/pull/600/issues/issuecomment-440926308)
* overlay on menu open. ([96cf727](https://github.com/datproject/dat-desktop/commit/96cf7279e347dd9e64cfc1ce418af892ccf7a71e))
* overlay to be not enough filled the. ([c3698de](https://github.com/datproject/dat-desktop/commit/c3698de98c63341489291fcbe723dc45db7dc88f))
* Re-introduced --publish=onTagOrDraft flag, missing for the release management. ([ffff3d6](https://github.com/datproject/dat-desktop/commit/ffff3d6f81906ca5dfe7a4e829ee237886f81541))
* set to disable the hover action to dat-list-header. ([96f34c5](https://github.com/datproject/dat-desktop/commit/96f34c597d795ee8367c119a8860e6ef69c26ae6))
* to be fixed position the list header. ([5f198cb](https://github.com/datproject/dat-desktop/commit/5f198cb32e63c1766977134c73e8060818482891))
* unit-test ([840b108](https://github.com/datproject/dat-desktop/commit/840b1086bf73a5fff81697d39d4e1ef522e727b6))
* update Electron, comment deprecated makeSingleInstance call ([3a88c9f](https://github.com/datproject/dat-desktop/commit/3a88c9f42aff12a12f8c43defcbae75a9ae22073))
* update to electron changed showOpenDialog api ([834b23a](https://github.com/datproject/dat-desktop/commit/834b23aed094007d6b8dd144d85fa5050f09f6bb))


================================================
FILE: CONTRIBUTING.md
================================================
# Hello there!

Thanks for considering to contribute. Dat Desktop is a tool developed by the open source community, and it’s the time and effort of people like you that makes it better!

## What kind of contributions we are looking for

You can help to improve Dat Desktop by [reporting bugs](https://github.com/datproject/dat-desktop/issues) or helping with existing [issues](https://github.com/datproject/dat-desktop/issues). Help with improving documentation like the [README](https://github.com/datproject/dat-desktop/blob/master/README.md) or the [Wiki](https://github.com/datproject/dat-desktop/wiki) is also welcome.

## How to report a problem

[Check here](https://github.com/datproject/dat-desktop/issues) if the problem has already been reported. If so, you're welcome to add your description of the problem in a comment on the existing issue.
If there is no issue that describes your poblem, go ahead and [open a new issue](https://github.com/datproject/dat-desktop/issues/new). Please include the following information:

1. Which version of Dat Desktop are you running?
2. What operating system and processor architecture are you using?
3. What did you do?
4. What did you expect to see?
5. What did you see instead?

## Pull Requests

Please give 2 week days of time for reviews on each Pull Request, as we are a distributed team of non-fulltime contributors.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2017 Dat Project

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
[![deprecated](http://badges.github.io/stability-badges/dist/deprecated.svg)](https://dat-ecosystem.org/) 

More info on active projects and modules at [dat-ecosystem.org](https://dat-ecosystem.org/) <img src="https://i.imgur.com/qZWlO1y.jpg" width="30" height="30" /> 

---

# Dat Desktop

**Peer to peer data versioning & syncronization.**

[!["Build Status"](https://img.shields.io/travis/dat-land/dat-desktop/master.svg?style=flat-square)](https://travis-ci.org/dat-land/dat-desktop)
[!["Standard](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://standardjs.com)

![screenshot](assets/screenshot.png)

## Table of Content

- [Download](https://github.com/datproject/dat-desktop/releases)
- [FAQ](#faq)
- [License](#licenses)


## Contributing

To run _Dat Desktop_ in development mode:

```sh
node --version          # v12.4.0
npm install             # install dependencies
npm start               # start the application
```

To create binary packages run:

```sh
npm install             # install dependencies
npm run dist :os        # compile the app into an binary package
```

## FAQ

### How to speed up downloading Electron

If you’re not in Europe or the US, you might want to use a different mirror for
`electron`. You can set the `ELECTRON_MIRROR` variable to point to a different
provider:

```sh
# Europe / US
$ npm install

# Asia / Oceania
$ ELECTRON_MIRROR="https://npm.taobao.org/mirrors/electron/" npm install
```

## Licenses

[MIT License](./LICENSE)

### Font Attribution & License

SourceSansPro-Regular.ttf: Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. [SIL Open Font License, 1.1](http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)

SourceCodePro-Regular.ttf: Copyright 2010, 2012 Adobe Systems Incorporated. All Rights Reserved. [SIL Open Font License, 1.1](http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL)


================================================
FILE: app/actions/dat-middleware.js
================================================
'use strict'

import Dat from 'dat-node'
import { encode } from 'dat-encoding'
import fs from 'fs'
import { basename, join as joinPath } from 'path'
import { ipcRenderer, shell } from 'electron'
import mkdirp from 'mkdirp-promise'
import mirror from 'mirror-folder'
import promisify from 'util-promisify'

const readFile = promisify(fs.readFile)
const writeFile = promisify(fs.writeFile)
const { Notification } = window

async function readJSON (file) {
  try {
    const blob = await readFile(file, 'utf8')
    if (!blob) {
      return {}
    }
    return JSON.parse(blob)
  } catch (_) {}
  return {}
}

export default class DatMiddleware {
  constructor ({ downloadsDir, dataDir }) {
    this.downloadsDir = downloadsDir
    this.dataDir = dataDir
    this.dats = {}
    this.listeners = []
    this.execByType = {
      UPDATE_TITLE: action => this.updateTitle(action),
      REMOVE_DAT: action => this.removeDat(action),
      TRY_ADD_DAT: action => this.tryAddDat(action),
      REQUEST_DOWNLOAD: action => this.validateDownloadRequest(action),
      TOGGLE_PAUSE: action => this.togglePause(action),
      DOWNLOAD_SPARSE_DAT: action => this.downloadSparseDat(action),
      CANCEL_DOWNLOAD_DAT: action => this.cancelDownloadDat(action)
    }
  }

  async validateDownloadRequest ({ key }) {
    if (key) {
      key = encode(key)
      if (this.dats[key]) {
        return this.dispatch({
          type: 'ADD_DAT_ERROR',
          key,
          error: new Error('Dat with same key already exists.')
        })
      }
    }
    this.dispatch({ type: 'SHOW_DOWNLOAD_SCREEN', key })
  }

  execAction (action) {
    const exec = this.execByType[action.type]
    if (!exec) return false
    // Telling it to all the middlewares.
    this.dispatch(action)
    exec(action)
      .then(data =>
        this.dispatch({ ...action, type: `${action.type}_SUCCESS`, ...data })
      )
      .catch(error =>
        this.dispatch({ ...action, type: `${action.type}_ERROR`, error })
      )
    return true
  }

  middleware (store) {
    return dispatch => {
      this.listeners.push(dispatch)
      return action => {
        const triggersEffect = this.execAction(action)
        if (!triggersEffect) {
          // This action was not ment for this middleware.
          // Pass on to the next.
          dispatch(action)
        }
      }
    }
  }

  dispatch (action) {
    this.listeners.forEach(listener => listener(action))
  }

  async updateTitle ({ key, title }) {
    const dat = this.dats[key]
    const filePath = joinPath(dat.path, 'dat.json')
    const metadata = { ...dat.dat.metadata, title: title }

    try {
      await writeFile(filePath, JSON.stringify(metadata))
    } catch (error) {
      return this.dispatch({ type: 'WRITE_METADATA_ERROR', key, error })
    }
  }

  async removeDat ({ key }) {
    this.removeDatInternally(key)
    this.storeOnDisk()
  }

  async tryAddDat (action) {
    let { key, path } = action
    if (key) {
      key = encode(key)
      if (this.dats[key]) {
        this.dispatch({ type: 'ADD_DAT_ERROR:EXISTED' })
        throw this.dispatch({
          type: 'ADD_DAT_ERROR',
          key,
          error: new Error('Dat with same key already added.')
        })
      }
    }
    if (!path) path = joinPath(this.downloadsDir, key)

    for (let key in this.dats) {
      const dat = this.dats[key]
      if (dat.path === path) {
        this.dispatch({ type: 'ADD_DAT_ERROR:EXISTED' })
        throw this.dispatch({
          type: 'ADD_DAT_ERROR',
          key,
          error: new Error('Dat with same path already added.')
        })
      }
    }

    await this.internalAddDat(action)
  }

  async internalAddDat ({ key, path, paused, ...opts }) {
    if (key) {
      this.dispatch({ type: 'ADD_DAT', key, path, paused })
    }
    opts = {
      watch: true,
      resume: true,
      ignoreHidden: true,
      compareFileContent: true,
      ...opts
    }

    Dat(path, { key }, (error, dat) => {
      if (error) return this.dispatch({ type: 'ADD_DAT_ERROR', key, error })
      if (!key) {
        key = encode(dat.key)
        this.dispatch({ type: 'ADD_DAT', key, path, paused })
      }

      dat.trackStats()
      if (dat.writable) dat.importFiles(opts)

      this.dispatch({
        type: 'DAT_METADATA',
        key,
        metadata: {
          title: basename(path),
          author: 'Anonymous'
        }
      })

      this.dispatch({ type: 'ADD_DAT_SUCCESS', key })
      this.dispatch({ type: 'DAT_WRITABLE', key, writable: dat.writable })

      dat.archive.readFile('dat.json', (err, blob) => {
        if (err) return

        let metadata = {}
        try {
          metadata = JSON.parse(blob)
        } catch (_) {}

        this.dispatch({ type: 'DAT_METADATA', key, metadata })
      })

      dat.stats.on('update', stats => {
        if (!stats) stats = dat.stats.get()
        this.updateProgress(dat, key, stats)
        this.dispatch({ type: 'DAT_STATS', key, stats: { ...stats } })
      })

      this.updateState(dat)
      this.updateProgress(dat, key)

      if (!paused) {
        this.joinNetwork(dat)
        this.updateConnections(dat)
      }

      let prevNetworkStats
      dat.updateInterval = setInterval(() => {
        const stats = JSON.stringify(dat.stats.network)
        if (stats === prevNetworkStats) return
        prevNetworkStats = stats
        this.dispatch({
          type: 'DAT_NETWORK_STATS',
          key,
          stats: {
            up: dat.stats.network.uploadSpeed,
            down: dat.stats.network.downloadSpeed
          }
        })
      }, 1000)

      this.appendDatInternally(key, dat, path, opts)
      this.storeOnDisk()
    })
  }

  updateProgress (dat, key, stats) {
    if (!stats) stats = dat.stats.get()
    const prevProgress = dat.progress
    const progress = !dat.stats
      ? 0
      : dat.writable ? 1 : Math.min(1, stats.downloaded / stats.length)
    dat.progress = progress

    this.dispatch({ type: 'DAT_PROGRESS', key, progress })
    this.updateState(dat)

    const unfinishedBefore = prevProgress < 1 && prevProgress > 0
    if (dat.progress === 1 && unfinishedBefore) {
      const notification = new Notification('Download finished', {
        body: key
      })
      notification.onclick = () =>
        shell.openExternal(`file://${dat.path}`, () => {})
    }

    const incomplete = []
    for (const d of Object.values(this.dats)) {
      if (d.network && d.progress < 1) incomplete.push(d)
    }
    let totalProgress = incomplete.length
      ? incomplete.reduce((acc, dat) => {
        return acc + dat.progress
      }, 0) / incomplete.length
      : 1
    if (totalProgress === 1) totalProgress = -1 // deactivate
    if (ipcRenderer) ipcRenderer.send('progress', totalProgress)
  }

  async togglePause ({ key, paused }) {
    const { dat } = this.dats[key]
    if (paused) {
      this.joinNetwork(dat)
    } else {
      dat.leaveNetwork()
    }
    this.storeOnDisk()
  }

  async downloadSparseDat ({ key }) {
    key = encode(key)
    if (this.dats[key]) {
      this.dispatch({ type: 'ADD_DAT_ERROR:EXISTED' })
      return
    }
    const path = joinPath(this.downloadsDir, key)

    this.dispatch({ type: 'ADD_DAT', key, path })

    Dat(path, { key, sparse: true }, (error, dat) => {
      if (error) return this.dispatch({ type: 'ADD_DAT_ERROR', key, error })

      dat.trackStats()

      this.dispatch({
        type: 'DAT_METADATA',
        key,
        metadata: {
          title: basename(path),
          author: 'Anonymous'
        }
      })

      this.dispatch({ type: 'ADD_DAT_SUCCESS', key })

      dat.archive.readFile('/dat.json', (err, blob) => {
        if (err) return

        let metadata = {}
        try {
          metadata = JSON.parse(blob)
        } catch (_) {}

        this.dispatch({ type: 'DAT_METADATA', key, metadata })
      })

      dat.stats.on('update', stats => {
        if (!stats) stats = dat.stats.get()
        this.dispatch({ type: 'DAT_STATS', key, stats: { ...stats } })
      })

      this.updateState(dat)
      this.joinNetwork(dat)
      this.updateConnections(dat)

      this.appendDatInternally(key, dat, path)
    })
  }

  async cancelDownloadDat ({ key }) {
    this.removeDatInternally(key)
  }

  appendDatInternally (key, dat, path, opts = {}) {
    this.dats[key] = { dat, path, opts }
    dat.stats.once('update', () => {
      this.walk(dat)
    })
  }

  removeDatInternally (key) {
    this.dispatch({ type: 'REMOVE_DAT', key })

    const { dat } = this.dats[key] || {}
    if (!dat) return // maybe was deleted
    delete this.dats[key]
    if (dat.mirrorProgress) {
      dat.mirrorProgress.destroy()
    }

    for (const con of dat.network.connections) {
      con.removeAllListeners()
    }
    dat.stats.removeAllListeners()
    clearInterval(dat.updateInterval)

    dat.close()
  }

  walk (dat) {
    const key = encode(dat.key)
    if (!this.dats[key]) return // maybe it was deleted?
    if (!dat.files) dat.files = []
    var fs = { name: '/', fs: dat.archive }
    var progress = mirror(fs, '/', { dryRun: true })
    progress.on('put', file => {
      file.name = file.name.slice(1)
      if (file.name === '') return
      dat.files.push({
        path: file.name,
        size: file.stat.size,
        isFile: file.stat.isFile()
      })
      dat.files.sort(function (a, b) {
        return a.path.localeCompare(b.path)
      })

      const { files } = dat
      this.dispatch({ type: 'DAT_FILES', key, files })
    })
    dat.mirrorProgress = progress
  }

  updateState (dat) {
    const key = encode(dat.key)
    const state = !dat.network
      ? 'paused'
      : dat.writable || dat.progress === 1
        ? 'complete'
        : dat.network.connected ? 'loading' : 'stale'
    this.dispatch({ type: 'DAT_STATE', key, state })
  }

  updateConnections (dat) {
    if (!dat.network) return
    const key = encode(dat.key)
    this.dispatch({ type: 'DAT_PEERS', key, peers: dat.network.connected })
  }

  joinNetwork (dat) {
    dat.joinNetwork()
    dat.network.on('connection', con => {
      this.updateConnections(dat)
      this.updateState(dat)
      con.on('close', () => {
        this.updateConnections(dat)
        this.updateState(dat)
      })
    })
  }

  async loadFromDisk () {
    try {
      await mkdirp(this.downloadsDir)
      await mkdirp(this.dataDir)
    } catch (_) {}

    const [datOpts, paused] = await Promise.all([
      readJSON(joinPath(this.dataDir, 'dats.json')),
      readJSON(joinPath(this.dataDir, 'paused.json'))
    ])

    for (const key of Object.keys(datOpts)) {
      const opts = JSON.parse(datOpts[key])
      this.internalAddDat({
        key,
        path: opts.dir,
        paused: paused[key],
        ...opts
      })
    }
  }

  async storeOnDisk () {
    try {
      await mkdirp(this.dataDir)
    } catch (_) {}

    const datsState = Object.keys(this.dats).reduce(
      (acc, key) => ({
        ...acc,
        [key]: JSON.stringify({
          dir: this.dats[key].path,
          opts: this.dats[key].opts
        })
      }),
      {}
    )
    const pausedState = Object.keys(this.dats).reduce(
      (acc, key) => ({
        ...acc,
        [key]: !this.dats[key].dat.network
      }),
      {}
    )

    await writeFile(
      joinPath(this.dataDir, 'dats.json'),
      JSON.stringify(datsState)
    )
    await writeFile(
      joinPath(this.dataDir, 'paused.json'),
      JSON.stringify(pausedState)
    )
  }
}


================================================
FILE: app/actions/index.js
================================================
'use strict'

import { encode } from 'dat-encoding'
import { clipboard, remote, shell } from 'electron'
import fs from 'fs'
import promisify from 'util-promisify'
import path from 'path'

const stat = promisify(fs.stat)

function showOpenDialog (props) {
  if (process.env.RUNNING_IN_SPECTRON && process.env.OPEN_RESULT) {
    return new Promise((resolve, reject) => {
      resolve({
        cancelled: false,
        filePaths: [path.resolve(__dirname, process.env.OPEN_RESULT)]
      })
    })
  }
  return remote.dialog.showOpenDialog(props)
}

export const shareDat = key => ({ type: 'DIALOGS_LINK_OPEN', key })
export const copyLink = link => {
  clipboard.writeText(link)
  return { type: 'DIALOGS_LINK_COPY' }
}
export const closeShareDat = () => ({ type: 'DIALOGS_LINK_CLOSE' })
export const closeAlert = () => ({ type: 'DIALOGS_ALERT_CLOSE' })

export const createDat = () => dispatch => {
  showOpenDialog({
    properties: ['openDirectory']
  })
    .then(({ filePaths, cancelled }) => {
      if (cancelled) return
      if (!filePaths) {
        console.error('Did not get files from the open dialog, closing')
        return
      }
      const path = filePaths[0]
      addDat({ path })(dispatch)
    })
    .catch(err => {
      console.error(err)
    })
}
export const requestDownload = key => ({
  type: 'REQUEST_DOWNLOAD',
  key: encode(key)
})
export const hideDownloadScreen = () => ({ type: 'HIDE_DOWNLOAD_SCREEN' })
export const cancelDownloadDat = key => dispatch =>
  dispatch({ type: 'CANCEL_DOWNLOAD_DAT', key })
export const changeDownloadPath = key => dispatch => {
  const files = showOpenDialog({
    properties: ['openDirectory']
  })
  if (!files || !files.length) return
  const path = files[0]
  dispatch({ type: 'CHANGE_DOWNLOAD_PATH', key, path })
}

export const downloadSparseDat = ({ key }) => dispatch =>
  dispatch({ type: 'DOWNLOAD_SPARSE_DAT', key })
export const addDat = ({ key, path, paused, ...opts }) => dispatch =>
  dispatch({ type: 'TRY_ADD_DAT', key, path, paused, ...opts })
export const deleteDat = key => ({ type: 'DIALOGS_DELETE_OPEN', key })
export const confirmDeleteDat = key => dispatch => {
  dispatch({ type: 'REMOVE_DAT', key })
  dispatch({ type: 'DIALOGS_DELETE_CLOSE' })
}
export const cancelDeleteDat = () => ({ type: 'DIALOGS_DELETE_CLOSE' })
export const togglePause = ({ key, paused }) => dispatch =>
  dispatch({ type: 'TOGGLE_PAUSE', paused, key })

export const inspectDat = key => dispatch => {
  dispatch({ type: 'INSPECT_DAT', key })
}
export const closeInspectDat = () => ({ type: 'INSPECT_DAT_CLOSE' })
export const dropFolder = folder => async dispatch => {
  const isDirectory = (await stat(folder.path)).isDirectory()
  if (!isDirectory) return
  addDat({ path: folder.path })(dispatch)
}

export const openHomepage = () => shell.openExternal('https://datproject.org/')
export const nextIntro = screen => ({ type: 'NEXT_INTRO', screen })
export const hideIntro = () => ({ type: 'HIDE_INTRO' })

export const updateTitle = (key, title) => async dispatch =>
  dispatch({
    type: 'UPDATE_TITLE',
    key,
    title
  })

export const toggleMenu = visible => dispatch => {
  dispatch({ type: 'TOGGLE_MENU', visible })
}


================================================
FILE: app/components/app.js
================================================
'use strict'

import React, { Fragment } from 'react'
import { connect } from 'react-redux'

import SCREEN from '../consts/screen'

import IntroContainer from '../containers/intro'
import HeaderContainer from '../containers/header'
import TableContainer from '../containers/table'
import * as Dialog from '../containers/dialog'
import StatusBarContainer from '../containers/status-bar'
import InspectContainer from '../containers/inspect'
import DragDropContainer from '../containers/drag-drop'

const mapStateToProps = state => ({
  screen: state.screen
})

const mapDispatchToProps = dispatch => ({})

export default connect(mapStateToProps, mapDispatchToProps)(function ({
  screen
}) {
  if (screen === SCREEN.INTRO) {
    return <IntroContainer />
  }
  return (
    <Fragment>
      {/* header */}
      <HeaderContainer />
      {/* /header */}

      {/* main */}
      <TableContainer />
      <InspectContainer />
      {/* /main */}

      {/* footer */}
      <StatusBarContainer />
      {/* /footer */}

      <Dialog.LinkContainer />
      <Dialog.ConfirmContainer />
      <Dialog.AlertContainer />
      <DragDropContainer />
    </Fragment>
  )
})


================================================
FILE: app/components/button.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'

const BaseButton = styled.button.attrs(props => ({
  ...props
}))`
  text-transform: uppercase;
  letter-spacing: 0.025em;
  cursor: pointer;
  background-color: transparent;
  .icon-only {
    .btn-text {
      display: none;
    }
  }
  :hover,
  :focus {
    outline: 0;
  }
`

const HeaderButton = styled(BaseButton)`
  color: var(--color-neutral-30);
  height: 2rem;
  :hover,
  :focus {
    color: var(--color-white);
  }
`

var PlainButton = styled(BaseButton)`
  padding: 0.5rem 0.75rem;
  font-size: 0.75rem;
  background-color: transparent;
  color: var(--color-neutral-40);
  :hover,
  :focus {
    color: var(--color-neutral-70);
  }
`

var TextButton = styled(BaseButton)`
  font-size: 0.75rem;
  background-color: transparent;
  color: var(--color-neutral-40);
  :hover,
  :focus {
    color: var(--color-neutral-70);
  }
`

var GreenButton = styled(BaseButton)`
  padding: 0.5rem 0.75rem;
  font-size: 0.75rem;
  background-color: var(--color-green);
  color: var(--color-neutral-04);
  :hover,
  :focus {
    background-color: var(--color-green-hover);
    color: var(--color-white);
  }
`

var RedButton = styled(BaseButton)`
  padding: 0.5rem 0.75rem;
  font-size: 0.75rem;
  background-color: var(--color-red);
  color: var(--color-neutral-04);
  :hover,
  :focus {
    background-color: var(--color-red-hover);
    color: var(--color-white);
  }
`

const InnerWrapper = styled.div`
  display: flex;
  flex-wrap: nowrap;
  flex-direction: row;
  justify-content: center;
  align-items: center;
`

export const Header = ({ children, icon, ...props }) => (
  <HeaderButton {...props}>
    <InnerWrapperComponent icon={icon}>{children}</InnerWrapperComponent>
  </HeaderButton>
)

export const Icon = ({ icon, ...props }) => (
  <BaseButton {...props}>
    <InnerWrapper>{icon}</InnerWrapper>
  </BaseButton>
)

export const Plain = ({ children, ...props }) => (
  <PlainButton {...props}>
    <InnerWrapperComponent>{children}</InnerWrapperComponent>
  </PlainButton>
)

export const Text = ({ children, icon, ...props }) => (
  <TextButton {...props}>
    <InnerWrapperComponent icon={icon}>{children}</InnerWrapperComponent>
  </TextButton>
)

export const Green = ({ children, icon, ...props }) => (
  <GreenButton {...props}>
    <InnerWrapperComponent icon={icon}>{children}</InnerWrapperComponent>
  </GreenButton>
)

export const Red = ({ children, icon, ...props }) => (
  <RedButton {...props}>
    <InnerWrapperComponent icon={icon}>{children}</InnerWrapperComponent>
  </RedButton>
)

const InnerWrapperComponent = ({ children, icon }) => (
  <InnerWrapper>
    {icon}
    <span className='btn-text ml1'>{children}</span>
  </InnerWrapper>
)


================================================
FILE: app/components/dat-import.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import Icon from './icon'

const Label = styled.label`
  --icon-height: 1.2rem;
  color: var(--color-neutral-30);
  .icon-link {
    padding-top: 0.42rem;
    padding-left: 0.5rem;
    pointer-events: none;
    width: var(--icon-height);
    height: var(--icon-height);
  }
  input {
    height: 2rem;
    width: 7.5rem;
    padding-right: 0.5rem;
    padding-left: 2rem;
    border-radius: 2px;
    border: 1px solid transparent;
    background-color: transparent;
    color: var(--color-neutral-30);
    opacity: 1;
    text-transform: uppercase;
    letter-spacing: 0.025em;
    transition-property: width;
    transition-duration: 0.15s;
    transition-timing-function: ease-in;
    &::-webkit-input-placeholder {
      color: var(--color-neutral-30);
      opacity: 1;
    }
    &:hover,
    &:hover::-webkit-input-placeholder,
    &:hover + svg {
      color: var(--color-white);
    }
    &:focus,
    &:active {
      width: 14rem;
      outline: none;
      background-color: var(--color-white);
      color: var(--color-neutral);
    }
    &:focus::-webkit-input-placeholder,
    &:active::-webkit-input-placeholder,
    &:focus + svg,
    &:active + svg {
      color: var(--color-neutral-50);
    }
  }
`

const DatImport = ({ requestDownload, downloadSparseDat }) => {
  const onKeyDown = e => {
    const value = e.target.value
    if (e.key !== 'Enter' || !value) return
    e.target.value = ''
    downloadSparseDat({ key: value, paused: false, sparse: true })
    requestDownload(value)
  }

  return (
    <Label htmlFor='dat-import' className='relative dib pa0 b--none'>
      <input
        name='dat-import'
        type='text'
        placeholder='Download'
        onKeyDown={onKeyDown}
        className='input-reset f7 f6-l'
      />
      <Icon name='link' className='absolute top-0 bottom-0 left-0' />
    </Label>
  )
}

export default DatImport


================================================
FILE: app/components/dialog.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import Icon from './icon'
import * as Button from './button'

const Overlay = styled.div`
  background: rgba(0, 0, 0, 0.25);
`

const Inner = styled.div`
  min-width: 25rem;
  max-width: 32rem;
  padding: 2rem 2.5rem 2rem;
  background-color: var(--color-white);
  box-shadow: 0 1.2rem 2.4rem rgba(0, 0, 0, 0.5);
  .exit {
    border: none;
    color: var(--color-neutral-40);
  }
  .exit:hover,
  .exit:focus {
    color: var(--color-neutral);
  }
  .icon-cross {
    vertical-align: middle;
    width: 1.6em;
    max-height: 1.6em;
    transition: color 0.025s ease-out;
    margin-right: auto;
    margin-left: auto;
  }
`

const LabelInput = styled.label`
  --input-height: 3rem;
  --icon-height: 1.2rem;
  --button-width: 3rem;
  height: var(--input-height);
  border: 0;
  .btn-copy-to-clipboard {
    width: var(--button-width);
    height: calc(var(--input-height) - 2px);
    top: 1px;
    right: 1px;
    bottom: 1px;
    background-color: var(--color-neutral-10);
    border: none;
    color: var(--color-neutral-30);
    &:hover,
    &:focus {
      outline: none;
      color: var(--color-green-hover);
    }
  }
  .icon-link,
  .icon-clipboard {
    position: absolute;
    top: 0;
    bottom: 0;
    padding-top: calc(var(--icon-height) - 0.35rem);
    padding-left: 0.75rem;
    pointer-events: none;
    display: block;
    width: var(--icon-height);
    height: var(--icon-height);
    transition: color 0.025s ease-out;
  }
  .icon-link {
    left: 0;
    color: var(--color-neutral-30);
  }
  .icon-clipboard {
    right: 0.8rem;
  }
  .dat-input-input {
    width: 100%;
    height: var(--input-height);
    padding-right: var(--button-width);
    padding-left: 2.5rem;
    font-size: 1rem;
    font-weight: 600;
    border: 1px solid var(--color-neutral-20);
    background-color: var(--color-white);
    color: var(--color-green-hover);
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    &:hover,
    &:focus {
      outline: none;
    }
  }
  .dat-input-check {
    color: var(--color-blue);
    top: 2rem;
  }
  .icon-check {
    width: var(--icon-height);
    height: 0.875rem;
    vertical-align: -0.15rem;
    display: inline-block;
  }
  .confirmation {
    right: 0;
    opacity: 0;
    top: -0.5rem;
    color: var(--color-blue);
  }
  .show-confirmation {
    top: -1.2rem;
    opacity: 1;
    transition: all 0.15s ease-out;
  }
`

function CloseButton ({ onExit }) {
  return (
    <button
      onClick={onExit}
      className='absolute pointer pa0 top-0 right-0 h2 w2 bg-transparent tc exit btn-close'
      aria-label='Close Modal'
      style={{ outline: 0 }}
    >
      <Icon name='cross' />
    </button>
  )
}

export const Link = ({ link, copied, onCopy, onExit }) => (
  <Overlay
    className='modal fixed items-center justify-center top-0 left-0 h-100 w-100 z-9999'
    style={{ display: link ? 'flex' : 'none' }}
  >
    <Inner className='relative flex flex-column justify-center'>
      <h3 className='f4'>Copy Dat Link</h3>
      <LabelInput htmlFor='dat-link' className='relative mt4 mb4'>
        <p
          className={`f7 mt0 mb0 tr absolute confirmation ${
            copied ? 'show-confirmation' : ''
          }`}
        >
          <Icon name='check' />
          Link copied to clipboard
        </p>
        <input
          name='dat-link'
          type='text'
          defaultValue={link || ''}
          className='relative dib pa0 dat-input-input'
        />
        <Icon name='link' />
        <button
          className='absolute pointer btn-copy-to-clipboard'
          title='Copy to Clipboard'
          aria-label='Copy to Clipboard'
          onClick={() => onCopy(link)}
        >
          <Icon name='clipboard' />
        </button>
      </LabelInput>
      <p className='f7 color-neutral-70'>
        Anyone with this link can view your Dat.
      </p>
      <CloseButton onExit={onExit} />
    </Inner>
  </Overlay>
)

export const Confirm = ({ dat, onConfirm, onExit }) => (
  <Overlay
    className='modal fixed items-center justify-center top-0 left-0 h-100 w-100 z-9999'
    style={{ display: dat ? 'flex' : 'none' }}
  >
    <Inner className='relative flex flex-column justify-center'>
      <h3 className='f4'>Remove Dat</h3>
      <p className='mt3 mb4 f7 color-neutral-70'>
        Are you sure you want to remove this dat?
        <br />
        This can’t be undone.
      </p>
      <p>
        <Button.Green
          className='fr ml3 btn-confirm'
          onClick={() => onConfirm(dat)}
        >
          Yes, Remove Dat
        </Button.Green>
        <Button.Plain className='fr btn-cancel' onClick={onExit} autoFocus>
          No, Cancel
        </Button.Plain>
      </p>
      <CloseButton onExit={onExit} />
    </Inner>
  </Overlay>
)

export const Alert = ({ alert, onExit }) => (
  <Overlay
    className='modal fixed items-center justify-center top-0 left-0 h-100 w-100 z-9999'
    style={{ display: alert ? 'flex' : 'none' }}
  >
    <Inner className='relative flex flex-column justify-center'>
      <p className='mt3 mb4 f5 color-neutral-70'>{alert}</p>
      <p>
        <Button.Green className='fr btn-confirm' onClick={onExit} autoFocus>
          CLOSE
        </Button.Green>
      </p>
      <CloseButton onExit={onExit} />
    </Inner>
  </Overlay>
)


================================================
FILE: app/components/empty.js
================================================
import React from 'react'
import styled from 'styled-components'
import Icon from './icon'

const Main = styled.main`
  position: relative;
  .skeleton {
    position: fixed;
    top: 3.5rem;
    left: 1.25rem;
    width: 232px;
    max-width: 100vw;
  }
  .dotted-lines {
    position: absolute;
    top: 0.25rem;
    right: 5.5rem;
    width: 17rem;
  }
  .create-new-dat,
  .link {
    position: absolute;
    width: 15rem;
    color: var(--color-neutral-30);
    svg {
      display: inline-block;
      width: 2rem;
      height: 2rem;
    }
  }
  .create-new-dat {
    top: 14.5rem;
    right: 4rem;
  }
  .link {
    top: 6rem;
    right: 8.5rem;
    svg {
      margin-bottom: -0.75rem;
    }
  }
`

const Empty = () => (
  <Main>
    <img src='./assets/table-skeleton.svg' alt='' className='skeleton' />
    <div className='tutorial'>
      <img src='./assets/dotted-lines.svg' alt='' className='dotted-lines' />
      <div className='link'>
        <Icon name='link' />
        <h3 className='f4 ttu mt0 mb0'>Download A Dat</h3>
        <p className='f7'>
          … and keep data up-to-date
          <br />
          by entering the link here.
        </p>
      </div>
      <div className='tr create-new-dat'>
        <Icon name='create-new-dat' />
        <h3 className='f4 ttu mt0 mb0'>Share a Folder</h3>
        <p className='f7'>
          … and sync changes by sharing
          <br />
          the link with someone else.
        </p>
      </div>
    </div>
  </Main>
)

export default Empty


================================================
FILE: app/components/file-list.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import bytes from 'prettier-bytes'

const FileListTable = styled.table`
  width: 100%;
  border-collapse: collapse;
  tr:nth-child(odd) td {
    background-color: var(--color-white);
  }
  tr:nth-child(even) td {
    background-color: var(--color-neutral-10);
  }
  td {
    border: 0;
    padding: 0.25rem;
  }
  td:last-child {
    width: 4rem;
    text-align: right;
  }
`

const FileList = ({ dat, fallback = null }) => {
  if (!dat || !dat.files || !dat.files.length) return fallback
  return (
    <FileListTable className='w-100 f7 f6-l'>
      <tbody>
        {dat.files.map(file => {
          const size =
            Number(file.size) === file.size && file.isFile
              ? bytes(file.size)
              : ''
          return (
            <tr key={file.path}>
              <td className='truncate'>{file.path}</td>
              <td>{size}</td>
            </tr>
          )
        })}
      </tbody>
    </FileListTable>
  )
}

export default FileList


================================================
FILE: app/components/finder-button.js
================================================
'use strict'

import React from 'react'
import * as Button from './button'
import Icon from './icon'
import { resolve } from 'path'
import { shell } from 'electron'
import { DAT_ENV } from '../consts/env'

const alt =
  {
    darwin: 'Finder',
    win32: 'Explorer'
  }[DAT_ENV.platform] || 'FileManager'

const FinderButton = ({ dat, onClick }) => (
  <Button.Icon
    icon={<Icon name='open-in-finder' />}
    className='row-action btn-finder'
    title={`Open in ${alt}`}
    onClick={ev => {
      ev.stopPropagation()
      shell.openExternal(`file://${resolve(dat.path)}`, () => {})
    }}
  />
)

export default FinderButton


================================================
FILE: app/components/header.js
================================================
'use strict'

import React, { Fragment } from 'react'
import styled from 'styled-components'
import { transparentize } from 'polished'
import { neutral } from 'dat-colors'
import DatImport from '../containers/dat-import'
import * as Button from './button'
import Icon from './icon'

const Container = styled.header`
  position: fixed;
  z-index: 1;
  width: 100%;
  height: 2.5rem;
  padding: 0.25rem 0.75rem;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  -webkit-app-region: drag;
  background-color: var(--color-neutral);
  color: var(--color-white);
  & ~ main {
    margin-top: 2.5rem;
  }
`

const HideLayer = styled.div`
  position: fixed;
  background: ${transparentize(0.85, neutral)};
  width: 100vw;
  height: 100vh;
  left: 0;
  top: 0;
`

const Header = ({ onShare, onMenu, onReport, menuVisible, version }) => {
  const toggleMenu = () => onMenu(!menuVisible)
  return (
    <Fragment>
      {menuVisible && <HideLayer onClick={toggleMenu} />}
      <Container>
        <DatImport />
        <Button.Header
          icon={<Icon name='create-new-dat' style={{ width: '1.2em' }} />}
          className='b--transparent v-mid color-neutral-30 hover-color-white f7 f6-l btn-share-folder'
          onClick={onShare}
        >
          Share Folder
        </Button.Header>
        <Button.Header
          icon={<Icon name='menu' style={{ width: '1.2em' }} />}
          className='ml2 v-mid color-neutral-20 hover-color-white pointer btn-toggle-menu'
          onClick={toggleMenu}
        />
        {menuVisible && (
          <div
            className='absolute right-0 br1 w5 pa3 bg-neutral'
            style={{ top: '3rem', right: '0.5rem', zIndex: 6 }}
          >
            <h3 className='f6 f5-l mb2'>Dat Desktop {version}</h3>
            <p className='f6 f5-l mb3'>
              Dat Desktop is a peer to peer data versioning and syncronization app.
            </p>
            <p className='f6 f5-l'>
              <a
                onClick={onReport}
                href='#'
                className='color-neutral-50  hover-color-neutral-70'
              >
                Report Bug
              </a>
            </p>
          </div>
        )}
      </Container>
    </Fragment>
  )
}

export default Header


================================================
FILE: app/components/hex-content.js
================================================
import React from 'react'
import Swap from 'react-swap'
import * as Button from './button'
import Icon from './icon'

const HexContent = ({ dat }) => {
  let hex
  let onHover

  if (dat.state === 'loading') {
    hex = (
      <Button.Icon
        icon={<Icon name='hexagon-down' className='w2' />}
        className='color-blue hover-color-blue-hover ph0'
      />
    )
  } else if (dat.paused) {
    hex = (
      <Button.Icon
        icon={<Icon name='hexagon-resume' className='w2' />}
        className='color-neutral-30 hover-color-neutral-40 ph0'
      />
    )
  } else if (dat.state === 'complete') {
    hex = (
      <Button.Icon
        icon={<Icon name='hexagon-up' className='w2' />}
        className='color-green hover-color-green-hover ph0'
      />
    )
  } else {
    hex = (
      <Button.Icon
        icon={<Icon name='hexagon-x' className='w2' />}
        className='color-neutral-30 hover-color-neutral-40 ph0'
      />
    )
  }

  if (!dat.paused) {
    onHover = (
      <Button.Icon
        icon={<Icon name='hexagon-pause' className='w2' />}
        className='color-neutral-40 ph0'
      />
    )
  } else {
    onHover = hex
  }

  return (
    <Swap isHover>
      <div data-swap-handler>{hex}</div>
      <div>{onHover}</div>
    </Swap>
  )
}

export default HexContent


================================================
FILE: app/components/icon.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'

const Svg = styled.svg`
  display: block;
  fill: currentColor;
`

const Icon = ({ name, ...props }) => (
  <Svg
    viewBox='0 0 16 16'
    {...props}
    className={`icon-${name} ${props.className || ''}`}
  >
    <use xlinkHref={`#daticon-${name}`} />
  </Svg>
)

export default Icon


================================================
FILE: app/components/inspect.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import { toStr } from 'dat-encoding'
import bytes from 'prettier-bytes'
import Icon from './icon'
import FileList from './file-list'
import {
  Plain as PlainButton,
  Green as GreenButton,
  Text as TextButton
} from './button'
import SCREEN from '../consts/screen'

const DetailHeader = styled.header`
  width: 100%;
  height: 4rem;
  flex-shrink: 0;
  border-bottom: 1px solid var(--color-neutral-20);
`

const DetailFooter = styled.footer`
  width: 100%;
  bottom: 0;
  flex-shrink: 0;
  border-top: 1px solid var(--color-neutral-20);
`

const Label = styled.div`
  min-width: 8rem;
  color: var(--color-neutral-60);
  text-align: right;
  padding: 0.25rem;
  padding-right: 0.5rem;
`

const Column = styled.div`
  overflow: hidden;
  padding: 0.25rem;
`

const Row = ({ label = null, ...props }) => {
  return (
    <div className='flex mb2'>
      {label !== null && <Label className='f7 f6-l'>{label}</Label>}
      <Column className='bg-white f7 f6-l' {...props} />
    </div>
  )
}

const Inspect = ({
  screen,
  dat,
  closeInspectDat,
  addDat,
  hideDownloadScreen,
  cancelDownloadDat,
  changeDownloadPath
}) => {
  if (!dat) return null

  const title =
    dat.metadata && dat.metadata.title ? dat.metadata.title : dat.key || 'N/A'
  const author =
    dat.metadata && dat.metadata.author ? dat.metadata.author : 'N/A'
  const description =
    dat.metadata && dat.metadata.description ? dat.metadata.description : 'N/A'
  const size =
    dat.stats && Number(dat.stats.length) === dat.stats.length
      ? bytes(dat.stats.length)
      : bytes(0)
  const peers = isNaN(parseInt(dat.peers)) ? '…' : dat.peers

  return (
    <main className='flex flex-column'>
      <DetailHeader className='flex items-center bg-white'>
        <div className='w3'>
          <Icon name='hexagon-down' className='w2 center color-neutral-30' />
        </div>
        <h2 className='f5 normal truncate pr3 w-90'>{title}</h2>
      </DetailHeader>
      <div className='flex-auto pa3 bg-neutral-04 overflow-y-auto'>
        <Row label='Link:' data-test='key'>
          {toStr(dat.key)}
        </Row>
        <Row label='Size:' data-test='size'>
          {size}
        </Row>
        <Row label='Peers:' data-test='peers'>
          {peers}
        </Row>
        <Row label='Author:' data-test='author'>
          {author}
        </Row>
        <Row label='Description:' data-test='description'>
          {description}
        </Row>
        <Row label='Download to:' className='flex bg-white' data-test='path'>
          <pre
            className='flex-auto f7 f6-l'
            style={{ maxWidth: '200px', overflow: 'hidden', textOverflow: 'ellipsis' }}
          >
            {dat.path}
          </pre>
          <TextButton onClick={() => changeDownloadPath(dat.key)}>
            CHANGE...
          </TextButton>
        </Row>
        <Row label='Files:' style={{
          padding: 0,
          height: '100%',
          maxHeight: '200px',
          overflow: 'scroll'
        }}>
          <FileList
            dat={dat}
            fallback={<div className='f7 f6-l pa2'>N/A</div>}
          />
        </Row>
      </div>
      {screen === SCREEN.INSPECT && (
        <DetailFooter className='pa3 flex items-center justify-between bg-white'>
          <div className='flex ml2'>
            <PlainButton onClick={() => closeInspectDat()}>
              ← Back to Overview
            </PlainButton>
          </div>
        </DetailFooter>
      )}
      {screen === SCREEN.DOWNLOAD && (
        <DetailFooter className='pa3 flex items-center justify-between bg-white'>
          <div className='flex ml2'>
            <GreenButton
              onClick={() => {
                addDat({ key: dat.key, path: dat.path })
                hideDownloadScreen()
              }}
            >
              Download
            </GreenButton>
            <PlainButton
              onClick={() => {
                cancelDownloadDat(dat.key)
                hideDownloadScreen()
              }}
            >
              Cancel
            </PlainButton>
          </div>
        </DetailFooter>
      )}
    </main>
  )
}

export default Inspect


================================================
FILE: app/components/intro.js
================================================
'use strict'

import React, { Fragment, Component } from 'react'
import styled from 'styled-components'
import { Green as GreenButton, Plain as PlainButton } from './button'

const Intro = styled.main`
  position: relative;
  height: 100%;
  background-color: var(--color-neutral);
  color: var(--color-white);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  -webkit-app-region: drag;
  overflow: hidden;
`
const Content = styled.div`
  position: relative;
  flex: 1;
  width: 100%;
  padding: 3rem 2rem;
`

const Footer = styled.div`
  position: relative;
  width: 100%;
  padding: 1rem;
  display: flex;
  justify-content: space-between;
  button {
    min-width: 5rem;
  }
`
const Image = styled.img`
  max-width: 100%;
  max-height: 100%;
`

const StyledDots = styled.div`
  display: flex;
  justify-content: space-between;
  align-items: center;
  .dot {
    width: 0.5rem;
    height: 0.5rem;
    margin: 0.25rem;
    border-radius: 50%;
    background-color: var(--color-black);
  }
  .active {
    background-color: var(--color-blue);
  }
`

const Dots = ({ screen }) => (
  <StyledDots>
    {Array(5)
      .fill(null)
      .map((_, i) => {
        const className = i === screen - 1 ? 'dot active' : 'dot'
        return <div key={i} className={className} />
      })}
  </StyledDots>
)

class IntroScreen extends Component {
  constructor (props) {
    super(props)
    this.onkeydown = this.onkeydown.bind(this)
  }

  onkeydown (ev) {
    if (ev.code !== 'Escape') return
    window.removeEventListener('keydown', this.onkeydown)
    this.props.hide()
  }

  componentWillMount () {
    window.addEventListener('keydown', this.onkeydown)
  }

  componentWillUnmount () {
    window.removeEventListener('keydown', this.onkeydown)
  }

  render () {
    const { show, screen, hide, next, openHomepage } = this.props

    if (!show) {
      return (
        <Fragment>
          <div />
        </Fragment>
      )
    }

    return (
      <Intro>
        <Image
          src={'./assets/intro-' + (screen + 1) + '.svg'}
          alt=''
          className='absolute'
        />
        <Content>
          {
            {
              1: <p className='mw5 f4'>Hey there! This is a Dat.</p>,
              2: (
                <p className='mw5 f4'>
                  Think of it as a folder – with some magic.
                </p>
              ),
              3: (
                <p className='mw5 f4'>
                  You can turn any folder on your computer into a Dat.
                </p>
              ),
              4: (
                <p className='mw5 f4'>
                  Dats can be easily shared. Just copy the unique dat link and
                  securely share it.
                </p>
              ),
              5: (
                <p className='mw5 f4'>
                  You can also import existing Dats. Check out{' '}
                  <a
                    href='#'
                    className='color-green-disabled hover-color-green'
                    onClick={() => openHomepage()}
                  >
                    datproject.org
                  </a>{' '}
                  to explore open datasets.
                </p>
              )
            }[screen]
          }
        </Content>
        {screen === 1 ? (
          <GreenButton
            className='mt2 mb5 relative btn-get-started'
            onClick={() => next(screen)}
          >
            Get Started
          </GreenButton>
        ) : (
          <Footer>
            <PlainButton onClick={() => hide()} className='btn-skip'>
              Skip Intro
            </PlainButton>
            <Dots screen={screen} />
            {screen < 5 ? (
              <GreenButton onClick={() => next(screen)} className='btn-next'>
                Next
              </GreenButton>
            ) : (
              <GreenButton onClick={() => hide()} className='btn-next btn-done'>
                Done
              </GreenButton>
            )}
          </Footer>
        )}
      </Intro>
    )
  }
}

export default IntroScreen


================================================
FILE: app/components/status-bar.js
================================================
import React from 'react'
import styled from 'styled-components'
import bytes from 'prettier-bytes'

const StatusBar = styled.footer`
  width: 100%;
  min-width: 800px;
  height: 2.5rem;
  padding: 0.25rem 0.75rem;
  background-color: var(--color-neutral-04);
  color: var(--color-neutral-60);
`

export default function ({ up, down, show }) {
  if (!show) return null

  return (
    <StatusBar>
      <span className='f7 mr3'>Download: {bytes(down)}/s</span>
      <span className='f7'>Upload: {bytes(up)}/s</span>
    </StatusBar>
  )
}


================================================
FILE: app/components/status.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import bytes from 'prettier-bytes'

const ProgressBar = styled.div`
  --progress-height: 0.5rem;
  --bar-height: var(--progress-height);
  --counter-width: 3rem;
  --tile-width: 28px;
  --stripe-width: 5px;
  min-width: 8rem;
  max-width: 24rem;
  overflow: hidden;
  padding-top: 0.4rem;
  .bar {
    height: var(--progress-height);
    width: calc(100% - var(--counter-width));
    float: left;
    overflow: hidden;
    background-color: var(--color-neutral-20);
    border-radius: 2px;
  }
  .line {
    width: 0%;
    height: var(--progress-height);
    background-color: var(--color-blue);
    border-radius: 2px;
  }
  .line-loading {
    overflow: hidden;
    position: relative;
    height: var(--bar-height);
    &:before {
      content: '';
      width: 100%;
      height: var(--bar-height);
      position: absolute;
      top: 0;
      left: 0;
      background-image: repeating-linear-gradient(
        -45deg,
        transparent,
        transparent var(--stripe-width),
        rgba(255, 255, 255, 0.1) var(--stripe-width),
        rgba(255, 255, 255, 0.1) calc(2 * var(--stripe-width))
      );
      background-size: var(--tile-width) var(--bar-height);
      animation: move-bg 0.75s linear infinite;
    }
  }
  .line-complete {
    background-color: var(--color-green);
  }
  .line-paused {
    background-color: var(--color-neutral-40);
  }
  .counter {
    float: right;
    min-width: var(--counter-width);
    margin-top: -0.4rem;
    text-align: right;
  }

  @keyframes move-bg {
    0% {
      background-position: 28px 0;
    }
    100% {
      background-position: 0 0;
    }
  }
`

const ProgressSubline = styled.span`
  .arrow {
    vertical-align: top;
  }
`

const speed = n => `${bytes(n || 0)}/s`

const Status = ({ dat }) => {
  const progress = Math.floor((dat.progress || 0) * 100)
  const progressbarLine =
    dat.state === 'loading'
      ? 'line-loading'
      : dat.paused || dat.state === 'stale' ? 'line-paused' : 'line-complete'
  const netStats = dat.stats.network

  let progressText

  if (dat.paused) {
    progressText = 'Paused.'
  } else {
    switch (dat.state) {
      case 'complete':
        progressText = `Complete. ↑ ${speed(netStats.up)}`
        break
      case 'loading':
        progressText = (
          <span>
            <span className='arrow'>↓ </span> {speed(netStats.down)}
            <span className='arrow ml2'>↑ </span> {speed(netStats.up)}
          </span>
        )
        break
      case 'stale':
        progressText = 'waiting for peers…'
        break
      default:
        progressText = 'Paused.'
    }
  }

  return (
    <div>
      <ProgressBar>
        <div className='f6 f5-l counter'>{progress}%</div>
        <div className='bar'>
          <div
            className={`line ${progressbarLine}`}
            style={{ width: `${progress}%` }}
          />
        </div>
      </ProgressBar>
      <p className='f7 f6-l color-neutral-60 truncate'>
        <ProgressSubline>{progressText}</ProgressSubline>
      </p>
    </div>
  )
}

export default Status


================================================
FILE: app/components/table-row.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import * as Button from './button'
import Icon from './icon'
import Status from './status'
import bytes from 'prettier-bytes'
import FinderButton from './finder-button'
import HexContent from './hex-content'
import TitleField from './title-field'

export const Tr = styled.tr`
  transition: background-color 0.025s ease-out;
  &.selectable {
    &:hover,
    &:focus {
      background-color: var(--color-neutral-04);
      cursor: pointer;
    }
  }
  .cell-1 {
    width: 4rem;
  }
  .cell-2 {
    width: 14rem;
    max-width: 12rem;
    @media (min-width: 768px) {
      max-width: 20rem;
    }
    @media (min-width: 1280px) {
      max-width: 24rem;
    }
  }
  .cell-3 {
    width: 15rem;
  }
  .cell-4 {
    width: 4.5rem;
    white-space: nowrap;
  }
  .cell-5 {
    width: 4.5rem;
    white-space: nowrap;
  }
  .cell-6 {
    width: 10.25rem;
  }
  .cell-truncate {
    width: 100%;
  }
`

const IconContainer = styled.div`
  .row-action {
    height: 1.5rem;
    display: inline-block;
    color: var(--color-neutral-20);
    svg {
      vertical-align: middle;
      width: 0.75em;
      max-height: 1.6em;
      margin-top: -0.05em;
      margin-right: 5px;
      @media (min-width: 960px) {
        width: 1.4em;
      }
    }
    &:hover,
    &:focus {
      outline: none;
      color: var(--color-neutral-50);
    }
    &:first-child {
      padding-left: 0;
    }
    &:last-child {
      padding-right: 0;
    }
  }
  .icon-network {
    display: inline-block;
    color: var(--color-neutral-20);
    vertical-align: sub;
    width: 1em;
    svg polygon {
      fill: inherit;
    }
  }
`

const NetworkContainer = styled.td`
  vertical-align: top;
  svg {
    height: 1.5rem;
    display: inline-block;
    color: var(--color-neutral-20);
    vertical-align: top;
    width: 1.1em;
    max-height: 1.6em;
  }
  .network-peers-many {
    --polygon-1-color: var(--color-green);
    --polygon-2-color: var(--color-green);
    --polygon-3-color: var(--color-green);
  }
  .network-peers-1 {
    --polygon-1-color: var(--color-yellow);
    --polygon-2-color: var(--color-yellow);
  }
  .network-peers-0 {
    --polygon-1-color: var(--color-red);
  }
`

const NetworkIcon = ({ dat }) => {
  const iconClass = `network-peers ${
    dat.peers === 0
      ? 'network-peers-0'
      : dat.peers === 1 ? 'network-peers-1' : 'network-peers-many'
  }`
  return <Icon name='network' className={iconClass} />
}

const LinkButton = ({ ...props }) => (
  <Button.Icon
    icon={<Icon name='link' />}
    className='row-action btn-link'
    title='Copy Link'
    {...props}
  />
)

const DeleteButton = ({ ...props }) => (
  <Button.Icon
    icon={<Icon name='delete' />}
    className='row-action mr2 btn-delete'
    title='Delete'
    {...props}
  />
)

const Row = ({
  dat,
  shareDat,
  onDeleteDat,
  inspectDat,
  onTogglePause,
  updateTitle
}) => {
  const { writable, metadata, key } = dat
  if (!metadata) return null
  const { title } = metadata
  const placeholderTitle = `#${key}`
  // TODO: inspectDat needs more work!
  // onClick={() => inspectDat(dat.key)} className='selectable'>
  return (
    <Tr>
      <td className='cell-1'>
        <div
          className='w2 center'
          onClick={event => {
            event.stopPropagation()
            onTogglePause(dat)
          }}
        >
          <HexContent dat={dat} />
        </div>
      </td>
      <td className='cell-2'>
        <div className='cell-truncate'>
          <TitleField
            value={title || placeholderTitle}
            writable={writable}
            onChange={title => updateTitle(key, title)}
          />
          <p className='f7 f6-l color-neutral-60 truncate'>
            <span className='author'>
              {dat.metadata.author || 'Anonymous'} •{' '}
            </span>
            <span className='title'>
              {dat.writable ? 'Read & Write' : 'Read-only'}
            </span>
          </p>
        </div>
      </td>
      <td className='cell-3'>
        <Status dat={dat} />
      </td>
      <td className='f6 f5-l cell-4 size'>
        {bytes(dat.stats.byteLength || 0)}
      </td>
      <NetworkContainer className='cell-5'>
        <NetworkIcon dat={dat} />
        <span className='network v-top f6 f5-l ml1'>{dat.peers}</span>
      </NetworkContainer>
      <td className='cell-6'>
        <IconContainer className='flex justify-end'>
          <FinderButton dat={dat} />
          <LinkButton onClick={() => shareDat(`dat://${dat.key}`)} />
          <DeleteButton onClick={() => onDeleteDat(dat.key)} />
        </IconContainer>
      </td>
    </Tr>
  )
}

export default Row


================================================
FILE: app/components/table.js
================================================
'use strict'

import React from 'react'
import styled from 'styled-components'
import TableRowContainer from '../containers/table-row'
import { Tr } from './table-row'
import Empty from './empty'

const StyledTable = styled.table`
  width: 100%;
  max-width: 80rem;
  margin: 0 auto;
  border-collapse: collapse;
  th,
  td {
    padding-right: 0.75rem;
    padding-left: 0.75rem;
    &:nth-child(2) {
      padding-left: 0;
    }
  }
  th {
    height: 4rem;
    font-size: 0.8125rem;
    font-weight: normal;
    color: var(--color-neutral-60);
    border-bottom: 1px solid var(--color-neutral-20);
    &:first-child {
      border: none;
    }
  }
  td {
    height: 4rem;
    vertical-align: top;
    padding-top: 1rem;
  }
  tr:hover td {
    background-color: var(--color-neutral--04);
  }
`

const Table = ({ dats, show }) => {
  if (!show) return null

  if (!Object.keys(dats).length) return <Empty />

  return (
    <main className='flex flex-column'>
      <StyledTable>
        <thead>
          <Tr>
            <th className='cell-1' />
            <th className='tl cell-2'>Link</th>
            <th className='tl cell-3'>Status</th>
            <th className='tl cell-4'>Size</th>
            <th className='tl cell-5'>Peers</th>
            <th className='cell-6' />
          </Tr>
        </thead>
      </StyledTable>
      <div className='flex-auto overflow-y-auto'>
        <StyledTable>
          <tbody>
            {Object.keys(dats).map(key => (
              <TableRowContainer key={key} dat={dats[key]} />
            ))}
          </tbody>
        </StyledTable>
      </div>
    </main>
  )
}

export default Table


================================================
FILE: app/components/title-field.js
================================================
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import styled from 'styled-components'
import Icon from './icon'
import { Plain as PlainButton, Green as GreenButton } from './button'

const Overlay = styled.div`
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.2);
  z-index: 1;
`

const EditableFieldWrapper = styled.div`
  position: relative;
  h2 {
    position: relative;
  }
  .indicator {
    position: absolute;
    display: none;
    top: 0.25rem;
    right: 0;
    width: 0.75rem;
  }
  &:hover,
  &:focus {
    h2 {
      color: var(--color-blue);
    }
    .indicator {
      display: block;
    }
  }
`

const ActiveEditableFieldWrapper = styled(EditableFieldWrapper)`
  z-index: 1;
`

const InputFieldStyle = styled.input`
  :focus {
    outline: none;
  }
`

class InputField extends Component {
  componentDidMount () {
    const input = ReactDOM.findDOMNode(this)
    input.focus()
    input.select()
  }
  render () {
    return <InputFieldStyle {...this.props} />
  }
}

class TitleField extends Component {
  constructor (props) {
    super(props)
    this.titleInput = React.createRef()
  }

  onclick (ev) {
    ev.stopPropagation()
    ev.preventDefault()
    this.setState({ editing: true })
  }

  commit () {
    const oldValue = this.props.value
    const newValue = ReactDOM.findDOMNode(this.titleInput.current).value
    if (oldValue !== newValue) {
      this.props.onChange(newValue)
    }
    this.cancel()
  }

  cancel () {
    this.setState({
      modified: false,
      editing: false
    })
  }

  handleKeyup (ev) {
    ev.stopPropagation()

    if (ev.key === 'Escape') {
      ev.preventDefault()
      this.cancel()
      return
    }

    if (ev.key === 'Enter') {
      ev.preventDefault()
      this.commit()
      return
    }

    const oldValue = this.props.value
    const newValue = ev.target.value
    const modified = oldValue !== newValue
    this.setState({ modified })
  }

  render () {
    const { writable, value } = this.props
    const { editing, modified } = this.state || {}
    if (editing && writable) {
      return (
        <div onClick={e => e.stopPropagation()}>
          <Overlay onClick={() => this.cancel()} />
          <ActiveEditableFieldWrapper className='bg-white nt1 nb1 nl1 shadow-1 flex justify-between'>
            {/* why innerRef in following component? check here - styled-components/styled-components#102 */}
            <InputField
              className='bn f6 pl1 normal w-100'
              defaultValue={value}
              onKeyUp={ev => this.handleKeyup(ev)}
              ref={this.titleInput}
            />
            {modified ? (
              <GreenButton onClick={() => this.commit()}>Save</GreenButton>
            ) : (
              <PlainButton onClick={() => this.cancel()}>Save</PlainButton>
            )}
          </ActiveEditableFieldWrapper>
        </div>
      )
    }

    if (writable) {
      return (
        <EditableFieldWrapper>
          <h2
            tabIndex='0'
            className='f6 f5-l normal truncate pr3'
            onClick={ev => this.onclick(ev)}
          >
            {value}
            <Icon
              name='edit'
              className='absolute top-0 bottom-0 right-0 color-neutral-30 indicator'
            />
          </h2>
        </EditableFieldWrapper>
      )
    }

    return (
      <div>
        <h2 className='f6 f5-l normal truncate pr3'>{value}</h2>
      </div>
    )
  }
}

export default TitleField


================================================
FILE: app/consts/env.js
================================================
export const DAT_ENV = window.DAT_ENV || {} // in test, attach the blank object.


================================================
FILE: app/consts/screen.js
================================================
export const INTRO = 'intro'
export const DATS = 'dats'
export const DOWNLOAD = 'download'
export const INSPECT = 'inspect'

export default {
  INTRO,
  DATS,
  DOWNLOAD,
  INSPECT
}


================================================
FILE: app/consts/state.js
================================================
'use strict'

import SCREEN from '../consts/screen'

export const generateDefaultState = () => ({
  dats: {},
  screen: SCREEN.INTRO,
  dialogs: {
    link: {
      link: null,
      copied: false
    },
    delete: {
      dat: null
    }
  },
  speed: {
    up: 0,
    down: 0
  },
  inspect: {
    key: null
  },
  intro: {
    screen: 1
  },
  version: require('../../package.json').version,
  menu: {
    visible: false
  },
  downloadDatKey: null
})


================================================
FILE: app/containers/dat-import.js
================================================
import DatImport from '../components/dat-import'
import { requestDownload, downloadSparseDat } from '../actions'
import { connect } from 'react-redux'

const mapStateToProps = state => state

const mapDispatchToProps = dispatch => {
  return {
    requestDownload: key => dispatch(requestDownload(key)),
    downloadSparseDat: key => dispatch(downloadSparseDat(key))
  }
}

const DatImportContainer = connect(mapStateToProps, mapDispatchToProps)(
  DatImport
)

export default DatImportContainer


================================================
FILE: app/containers/dialog.js
================================================
import { Link, Confirm, Alert } from '../components/dialog'
import {
  copyLink,
  closeShareDat,
  confirmDeleteDat,
  cancelDeleteDat,
  closeAlert
} from '../actions'
import { connect } from 'react-redux'

export const LinkContainer = connect(
  state => ({
    link: state.dialogs.link.link,
    copied: state.dialogs.link.copied
  }),
  dispatch => ({
    onCopy: link => dispatch(copyLink(link)),
    onExit: () => dispatch(closeShareDat())
  })
)(Link)

export const ConfirmContainer = connect(
  state => ({
    dat: state.dialogs.delete.dat
  }),
  dispatch => ({
    onConfirm: dat => dispatch(confirmDeleteDat(dat)),
    onExit: () => dispatch(cancelDeleteDat())
  })
)(Confirm)

export const AlertContainer = connect(
  state => ({
    alert: state.dialogs.alert
  }),
  dispatch => ({
    onExit: () => dispatch(closeAlert())
  })
)(Alert)


================================================
FILE: app/containers/drag-drop.js
================================================
import React from 'react'
import styled from 'styled-components'
import FileDrop from 'react-file-drop'
import { connect } from 'react-redux'
import { dropFolder } from '../actions'
import Icon from '../components/icon'

const mapStateToProps = state => ({})

const mapDispatchToProps = dispatch => ({
  onDrop: list => dispatch(dropFolder(list[0]))
})

const DropFrame = styled(FileDrop)`
  .file-drop-target {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    background: rgba(42, 202, 75, 0.6);
    align-items: center;
    justify-content: center;
    z-index: 1;
    display: none;
  }
  .file-drop-dragging-over-frame {
    display: flex;
  }
`

const DropIcon = styled(Icon)`
  width: 128px;
  color: white;
`

const DragDropContainer = connect(mapStateToProps, mapDispatchToProps)(function (
  props
) {
  return (
    <DropFrame {...props}>
      <DropIcon name='create-new-dat' />
    </DropFrame>
  )
})

export default DragDropContainer


================================================
FILE: app/containers/header.js
================================================
import Header from '../components/header'
import { createDat, toggleMenu } from '../actions'
import { connect } from 'react-redux'
import { shell } from 'electron'

const mapStateToProps = state => ({
  menuVisible: state.menu.visible,
  version: state.version
})

const mapDispatchToProps = dispatch => ({
  onShare: () => dispatch(createDat()),
  onMenu: visible => dispatch(toggleMenu(visible)),
  onReport: () =>
    shell.openExternal('https://github.com/dat-land/dat-desktop/issues/')
})

const HeaderContainer = connect(mapStateToProps, mapDispatchToProps)(Header)

export default HeaderContainer


================================================
FILE: app/containers/inspect.js
================================================
'use strict'

import SCREEN from '../consts/screen'
import Inspect from '../components/inspect'

import {
  closeInspectDat,
  addDat,
  hideDownloadScreen,
  cancelDownloadDat,
  changeDownloadPath
} from '../actions'

import { connect } from 'react-redux'

const mapStateToProps = state => ({
  dat:
    state.screen === SCREEN.INSPECT
      ? state.dats[state.inspect.key]
      : state.screen === SCREEN.DOWNLOAD
        ? state.dats[state.downloadDatKey]
        : null,
  screen: state.screen
})

const mapDispatchToProps = dispatch => ({
  closeInspectDat: () => dispatch(closeInspectDat()),
  addDat: ({ key, path }) => dispatch(addDat({ key, path })),
  hideDownloadScreen: () => dispatch(hideDownloadScreen()),
  cancelDownloadDat: key => dispatch(cancelDownloadDat(key)),
  changeDownloadPath: key => dispatch(changeDownloadPath(key))
})

const InspectContainer = connect(mapStateToProps, mapDispatchToProps)(Inspect)

export default InspectContainer


================================================
FILE: app/containers/intro.js
================================================
'use strict'

import SCREEN from '../consts/screen'
import { connect } from 'react-redux'
import IntroScreen from '../components/intro'
import { openHomepage, nextIntro, hideIntro } from '../actions'

const mapStateToProps = state => ({
  show: state.screen === SCREEN.INTRO,
  screen: state.intro.screen
})

const mapDispatchToProps = dispatch => ({
  openHomepage: () => openHomepage(),
  next: screen => dispatch(nextIntro(screen)),
  hide: () => dispatch(hideIntro())
})

const IntroContainer = connect(mapStateToProps, mapDispatchToProps)(IntroScreen)

export default IntroContainer


================================================
FILE: app/containers/status-bar.js
================================================
'use strict'

import StatusBar from '../components/status-bar'
import { connect } from 'react-redux'

const mapStateToProps = state => ({
  up: state.speed.up,
  down: state.speed.down,
  show: true
})

const mapDispatchToProps = dispatch => ({})

const StatusBarContainer = connect(mapStateToProps, mapDispatchToProps)(
  StatusBar
)

export default StatusBarContainer


================================================
FILE: app/containers/table-row.js
================================================
'use strict'

import { connect } from 'react-redux'
import TableRow from '../components/table-row'
import {
  shareDat,
  deleteDat,
  togglePause,
  inspectDat,
  updateTitle
} from '../actions'

const mapStateToProps = (state, ownProps) => ({
  dat: ownProps.dat
})

const mapDispatchToProps = dispatch => ({
  shareDat: link => dispatch(shareDat(link)),
  onDeleteDat: key => dispatch(deleteDat(key)),
  inspectDat: key => dispatch(inspectDat(key)),
  onTogglePause: dat => dispatch(togglePause(dat)),
  updateTitle: (key, title) => dispatch(updateTitle(key, title))
})

const TableRowContainer = connect(mapStateToProps, mapDispatchToProps)(TableRow)

export default TableRowContainer


================================================
FILE: app/containers/table.js
================================================
'use strict'

import SCREEN from '../consts/screen'
import Table from '../components/table'
import { connect } from 'react-redux'

const mapStateToProps = state => ({
  dats: state.dats,
  show: state.screen === SCREEN.DATS
})

const TableContainer = connect(mapStateToProps, null)(Table)

export default TableContainer


================================================
FILE: app/index.js
================================================
'use strict'

import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { createStore, applyMiddleware, compose } from 'redux'
import datDesktopApp from './reducers'
import { addDat } from './actions'
import App from './components/app'
import logger from 'redux-logger'
import thunk from 'redux-thunk'
import { ipcRenderer as ipc, remote } from 'electron'
import DatMiddleware from './actions/dat-middleware'
import minimist from 'minimist'
import path from 'path'
import { homedir } from 'os'
import datIcons from 'dat-icons'

const argv = minimist(remote.process.argv.slice(2), {
  default: {
    db: path.join(homedir(), '.dat-desktop'),
    data: path.join(remote.app.getPath('downloads'), '/dat')
  }
})

const datMiddleware = new DatMiddleware({
  dataDir: argv.db,
  downloadsDir: argv.data
})
const isDev = process.env.NODE_ENV === 'development'

const store = createStore(
  datDesktopApp,
  compose(
    applyMiddleware(
      store => datMiddleware.middleware(store),
      thunk,
      isDev ? logger : storage => dispatch => dispatch
    )
  )
)

document.title = 'Dat Desktop | Welcome'

datMiddleware
  .loadFromDisk()
  .then(function () {
    // # addGlobalComponents
    // Adding global components only once to the DOM.
    const svg = document.body.appendChild(datIcons())

    // remove titleTag from SVG.
    // titleTag is provide uncontrollable "tooltip".
    Array.from(svg.querySelectorAll('title')).forEach(node =>
      node.parentNode.removeChild(node)
    )
  })
  .then(function () {
    render(
      <Provider store={store}>
        <App />
      </Provider>,
      document.getElementById('app-root')
    )
  })
  .catch(err => {
    console.log(err.stack || err)
  })

ipc.on('log', (_, str) => console.log(str))
ipc.on('link', key => store.dispatch(addDat({ key })))
ipc.on('file', path => store.dispatch(addDat({ path })))


================================================
FILE: app/reducers/index.js
================================================
'use strict'

import SCREEN from '../consts/screen'
import { generateDefaultState } from '../consts/state'

const redatApp = (state = generateDefaultState(), action) => {
  switch (action.type) {
    case 'NEXT_INTRO':
      return {
        ...state,
        intro: {
          screen: action.screen + 1
        }
      }
    case 'HIDE_INTRO':
      document.title = 'Dat Desktop'
      return {
        ...state,
        screen: SCREEN.DATS
      }
    case 'SHOW_DOWNLOAD_SCREEN':
      return {
        ...state,
        screen: SCREEN.DOWNLOAD,
        downloadDatKey: action.key
      }
    case 'HIDE_DOWNLOAD_SCREEN':
      return {
        ...state,
        screen: SCREEN.DATS,
        downloadDatKey: null
      }
    case 'CHANGE_DOWNLOAD_PATH':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            path: action.path
          }
        }
      }
    case 'ADD_DAT':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            key: action.key,
            path: action.path,
            loading: true,
            paused: action.paused,
            metadata: {},
            stats: {
              network: {
                up: 0,
                down: 0
              }
            }
          }
        },
        screen: SCREEN.DATS
      }
    case 'ADD_DAT_ERROR:EXISTED':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          alert: 'The DAT is already in the list.'
        }
      }
    case 'ADD_DAT_ERROR':
    case 'WRITE_METADATA_ERROR':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            error: action.error,
            loading: false
          }
        }
      }
    case 'ADD_DAT_SUCCESS':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            loading: false
          }
        }
      }
    case 'REMOVE_DAT':
      if (state.dats[action.key]) {
        const { [action.key]: del, ...dats } = state.dats
        return { ...state, dats }
      }
      return state
    case 'INSPECT_DAT':
      return {
        ...state,
        screen: SCREEN.INSPECT,
        inspect: {
          key: action.key
        }
      }
    case 'INSPECT_DAT_CLOSE':
      return {
        ...state,
        screen: SCREEN.DATS
      }
    case 'DAT_FILES':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            files: action.files
          }
        }
      }
    case 'DAT_METADATA':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            metadata: action.metadata
          }
        }
      }
    case 'DAT_WRITABLE':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            writable: action.writable
          }
        }
      }
    case 'DAT_STATS':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            stats: { ...state.dats[action.key].stats, ...action.stats }
          }
        }
      }
    case 'DAT_PROGRESS':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            progress: action.progress
          }
        }
      }
    case 'DAT_STATE':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            state: action.state
          }
        }
      }
    case 'DAT_NETWORK_STATS':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            stats: { ...state.dats[action.key].stats, network: action.stats }
          }
        },
        speed: {
          up:
            state.speed.up -
            state.dats[action.key].stats.network.up +
            action.stats.up,
          down:
            state.speed.down -
            state.dats[action.key].stats.network.down +
            action.stats.down
        }
      }
    case 'DAT_PEERS':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            peers: action.peers
          }
        }
      }
    case 'UPDATE_TITLE':
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...state.dats[action.key],
            metadata: {
              ...state.dats[action.key].metadata,
              title: action.title
            }
          }
        }
      }
    case 'DIALOGS_LINK_OPEN':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          link: {
            link: action.key,
            copied: false
          }
        }
      }
    case 'DIALOGS_LINK_COPY':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          link: {
            ...state.dialogs.link,
            copied: true
          }
        }
      }
    case 'DIALOGS_LINK_CLOSE':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          link: {
            link: null,
            copied: false
          }
        }
      }
    case 'DIALOGS_DELETE_OPEN':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          delete: {
            dat: action.key
          }
        }
      }
    case 'DIALOGS_DELETE_CLOSE':
      return {
        ...state,
        screen: SCREEN.DATS,
        dialogs: {
          ...state.dialogs,
          delete: {
            dat: null
          }
        }
      }
    case 'DIALOGS_ALERT_CLOSE':
      return {
        ...state,
        dialogs: {
          ...state.dialogs,
          alert: null
        }
      }
    case 'TOGGLE_PAUSE':
      const dat = state.dats[action.key]
      return {
        ...state,
        dats: {
          ...state.dats,
          [action.key]: {
            ...dat,
            paused: !action.paused,
            peers: !action.paused ? 0 : dat.peers
          }
        }
      }
    case 'TOGGLE_MENU':
      return {
        ...state,
        menu: {
          ...state.menu,
          visible: action.visible
        }
      }
    default:
      return state
  }
}

export default redatApp


================================================
FILE: appveyor.yml
================================================
environment:
  ELECTRON_ENABLE_STACK_DUMPING: 'true'
  DEBUG: '*,-nugget*,-eslint*,-extract-zip*,-sumchecker*,-electron-download*,-dependency-check*'
  matrix:
    - nodejs_version: "8"

platform:
  - x86
  - x64

install:
  - ps: Install-Product node $env:nodejs_version $env:platform
  - npm install
  - node --version
  - npm --version

test_script:
  - npm run build:prod
  - npm test

# Don't actually build.
build: off

# RDP for debugging purposes
init:
  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))

================================================
FILE: dev/react-dev-tools/_metadata/verified_contents.json
================================================
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJidWlsZC9iYWNrZW5kLmpzIiwicm9vdF9oYXNoIjoiVDF0d1pGbnItRTd4NlgtekxmYXllWWl0OEwzbmE1bnBqVEFxcnJVNzNQWSJ9LHsicGF0aCI6ImJ1aWxkL2JhY2tncm91bmQuanMiLCJyb290X2hhc2giOiJwd2o2TFdiZGpDRTV4U3czRmxKT0lXSUhZdFJFWE1jNjIxeG8yZE9EajVRIn0seyJwYXRoIjoiYnVpbGQvY29udGVudFNjcmlwdC5qcyIsInJvb3RfaGFzaCI6Im1WUnMtdEp2eEFRR0pOY2l5ZjFkZjBCeVAyM1hVYlRHNjhXYVZQNE1oalUifSx7InBhdGgiOiJidWlsZC9pbmplY3QuanMiLCJyb290X2hhc2giOiJjVS13V3Q1ckFYdGpzdnNSZUQ3QWxZUVJFam1xOE8wTGk0bU1CSk95U204In0seyJwYXRoIjoiYnVpbGQvbWFpbi5qcyIsInJvb3RfaGFzaCI6InJ4OVdHcG9MSlNGWjh4Zjd0bXBkMXVSYjBzRFBoNkVVS1dOTlo5dkh6WDAifSx7InBhdGgiOiJidWlsZC9wYW5lbC5qcyIsInJvb3RfaGFzaCI6IjdubkM3azBocURUSkVHbFJQWVFFb2JSN1VBcEw5R0pfZFd4dy1XQnBkdEUifSx7InBhdGgiOiJpY29ucy8xMjgtZGVhZGNvZGUucG5nIiwicm9vdF9oYXNoIjoiMUF4MUl2eXRyeUtYQTFzQkZxU1FIWmtjWnJMbVJaNjBvcEVQcWIzSDZiNCJ9LHsicGF0aCI6Imljb25zLzEyOC1kZXZlbG9wbWVudC5wbmciLCJyb290X2hhc2giOiIxQXgxSXZ5dHJ5S1hBMXNCRnFTUUhaa2NackxtUlo2MG9wRVBxYjNINmI0In0seyJwYXRoIjoiaWNvbnMvMTI4LWRpc2FibGVkLnBuZyIsInJvb3RfaGFzaCI6InIta3JhcWpva3FJbHozTTFwQmxiSWk4dGdDXzFHU3hrT2VFMlFwU1FDblUifSx7InBhdGgiOiJpY29ucy8xMjgtb3V0ZGF0ZWQucG5nIiwicm9vdF9oYXNoIjoidVNIdEo2cUFsTHVETWRGYkxnSkpwTHBVSEVEVjRHckRSeVhHcGdSUVNfZyJ9LHsicGF0aCI6Imljb25zLzEyOC1wcm9kdWN0aW9uLnBuZyIsInJvb3RfaGFzaCI6ImF3VDBvNEVpVGowQm1lMFRBUmJaeS1ZSklEcDAzdlBpOG5XU1JPSlFMd2sifSx7InBhdGgiOiJpY29ucy8xMjgtdW5taW5pZmllZC5wbmciLCJyb290X2hhc2giOiIxQXgxSXZ5dHJ5S1hBMXNCRnFTUUhaa2NackxtUlo2MG9wRVBxYjNINmI0In0seyJwYXRoIjoiaWNvbnMvMTYtZGVhZGNvZGUucG5nIiwicm9vdF9oYXNoIjoiX2J4aVZ4bmlCcGUxRG5CSDF0azRDalhkYWp3eGtQM2hSbnBIZDVEQUxFSSJ9LHsicGF0aCI6Imljb25zLzE2LWRldmVsb3BtZW50LnBuZyIsInJvb3RfaGFzaCI6Il9ieGlWeG5pQnBlMURuQkgxdGs0Q2pYZGFqd3hrUDNoUm5wSGQ1REFMRUkifSx7InBhdGgiOiJpY29ucy8xNi1kaXNhYmxlZC5wbmciLCJyb290X2hhc2giOiJ2QWZQVW4xd3UtbU1MclFSTlNrM2pSVUN1V2ZZZWRIUHFKR1p0RUFRV1BZIn0seyJwYXRoIjoiaWNvbnMvMTYtb3V0ZGF0ZWQucG5nIiwicm9vdF9oYXNoIjoiX0VXZVpIeVprMDY0bFAyWF9jWTJHcHF1R0JIanpDcU55M1Z0c3YxXzVhRSJ9LHsicGF0aCI6Imljb25zLzE2LXByb2R1Y3Rpb24ucG5nIiwicm9vdF9oYXNoIjoiR19FcWRrQmtTQ09Tb3M5NHN6bldwUWNhZUhWcFJwN3NRbUNrd3cySUVlRSJ9LHsicGF0aCI6Imljb25zLzE2LXVubWluaWZpZWQucG5nIiwicm9vdF9oYXNoIjoiX2J4aVZ4bmlCcGUxRG5CSDF0azRDalhkYWp3eGtQM2hSbnBIZDVEQUxFSSJ9LHsicGF0aCI6Imljb25zLzMyLWRlYWRjb2RlLnBuZyIsInJvb3RfaGFzaCI6Ijk5WjZZZEtfbEw5aVFZeU1VSElwT1ZSU1dKNm5ZQUQ2Mmx4UkNrMF9kU0kifSx7InBhdGgiOiJpY29ucy8zMi1kZXZlbG9wbWVudC5wbmciLCJyb290X2hhc2giOiI5OVo2WWRLX2xMOWlRWXlNVUhJcE9WUlNXSjZuWUFENjJseFJDazBfZFNJIn0seyJwYXRoIjoiaWNvbnMvMzItZGlzYWJsZWQucG5nIiwicm9vdF9oYXNoIjoiUzN3T25MeFBzd013UGotQXRuNUF1Ny1iTklTREtWbWtlUl9hVDNlSnNXVSJ9LHsicGF0aCI6Imljb25zLzMyLW91dGRhdGVkLnBuZyIsInJvb3RfaGFzaCI6IkJWS0gtbnEyMlB5UDdLZl9lQXFYeDdVM1M5ZzMyRi1wLWxxVVE1NnBGbDAifSx7InBhdGgiOiJpY29ucy8zMi1wcm9kdWN0aW9uLnBuZyIsInJvb3RfaGFzaCI6Il9Fdzc5ODc4bGRYWlVSUGlaemw5NjhPelA5NURURmpNT3l1TlhqejdpUWsifSx7InBhdGgiOiJpY29ucy8zMi11bm1pbmlmaWVkLnBuZyIsInJvb3RfaGFzaCI6Ijk5WjZZZEtfbEw5aVFZeU1VSElwT1ZSU1dKNm5ZQUQ2Mmx4UkNrMF9kU0kifSx7InBhdGgiOiJpY29ucy80OC1kZWFkY29kZS5wbmciLCJyb290X2hhc2giOiJnR3JxVnJhTkl4N2J6M0labTN0MUJxb3BYSFRUQU9td0ZTeHpxdFhoZkI4In0seyJwYXRoIjoiaWNvbnMvNDgtZGV2ZWxvcG1lbnQucG5nIiwicm9vdF9oYXNoIjoiZ0dycVZyYU5JeDdiejNJWm0zdDFCcW9wWEhUVEFPbXdGU3h6cXRYaGZCOCJ9LHsicGF0aCI6Imljb25zLzQ4LWRpc2FibGVkLnBuZyIsInJvb3RfaGFzaCI6InZXMkZBNXlWRzhDRGtNcjBRekVsS1lfQmxTdWxURnB5YkpDdmlIOFplU00ifSx7InBhdGgiOiJpY29ucy80OC1vdXRkYXRlZC5wbmciLCJyb290X2hhc2giOiJ4dFY4U1RBVm42VzUyWXA5aDJxdHdHckdyVzl4LTcxR0U0UUZnMjZ6Rm9vIn0seyJwYXRoIjoiaWNvbnMvNDgtcHJvZHVjdGlvbi5wbmciLCJyb290X2hhc2giOiJHUzczNkQ5TXp3UUhzRW5JOTU4UGxNVnp4RkdGaF92TEt2MFN2VGVTdkdVIn0seyJwYXRoIjoiaWNvbnMvNDgtdW5taW5pZmllZC5wbmciLCJyb290X2hhc2giOiJnR3JxVnJhTkl4N2J6M0labTN0MUJxb3BYSFRUQU9td0ZTeHpxdFhoZkI4In0seyJwYXRoIjoiaWNvbnMvZGVhZGNvZGUuc3ZnIiwicm9vdF9oYXNoIjoick1abk15VkR6VWtRbDdLQl9UVzlTYjlEVjJqVXl5cTQ5WGwwQUhKMVl4TSJ9LHsicGF0aCI6Imljb25zL2RldmVsb3BtZW50LnN2ZyIsInJvb3RfaGFzaCI6InJNWm5NeVZEelVrUWw3S0JfVFc5U2I5RFYyalV5eXE0OVhsMEFISjFZeE0ifSx7InBhdGgiOiJpY29ucy9kaXNhYmxlZC5zdmciLCJyb290X2hhc2giOiJKNU1Rd3Rfb2NmUDJxSFh2UFZ6N2lTTFRmNjdybkJKLXd4S3U2LUhGSE5NIn0seyJwYXRoIjoiaWNvbnMvb3V0ZGF0ZWQuc3ZnIiwicm9vdF9oYXNoIjoiMTkzazMzdmpTTE5CMU5nTXFINGktUjc2YXhHeXktVW1VVFNJYmhadlNKSSJ9LHsicGF0aCI6Imljb25zL3Byb2R1Y3Rpb24uc3ZnIiwicm9vdF9oYXNoIjoiRVB4cHFIQU9IRzlwUUtHMXJYelRJZmN2cV9qTUYxU0xRR3g1b1RkYmFQOCJ9LHsicGF0aCI6Im1haW4uaHRtbCIsInJvb3RfaGFzaCI6InM3OURqWERtdng3bWdySFZNcmpod3JnNFk3SUYyd2JuUUxEcnVDS2hUWU0ifSx7InBhdGgiOiJtYW5pZmVzdC5qc29uIiwicm9vdF9oYXNoIjoicDJEV0RZNVRvcHR0Q0pMcnRJX3BfcjQzTlVYQXRhZ0NtNUgtcVpuY0pZNCJ9LHsicGF0aCI6InBhbmVsLmh0bWwiLCJyb290X2hhc2giOiJJQk9KT3JEeGtBMkFGdUlIT0IyQTJlLThoMUVoV1ZHNUZPVVdwSzNUSUg0In0seyJwYXRoIjoicG9wdXBzL2RlYWRjb2RlLmh0bWwiLCJyb290X2hhc2giOiJzSHBuSUVZeDh5SFoycDk4ejdkclc4dkRTQm1SUWFpd3hqOHJhN3Q0OUpvIn0seyJwYXRoIjoicG9wdXBzL2RldmVsb3BtZW50Lmh0bWwiLCJyb290X2hhc2giOiJMOTQ5M0ptdjVyclRPYmZDWUlObDJiWHJJNEdxandOcXFEbEx5YWpsX3lzIn0seyJwYXRoIjoicG9wdXBzL2Rpc2FibGVkLmh0bWwiLCJyb290X2hhc2giOiJka3FZLXNTZC1Gem85cURpX203WjRsbGdDT3lLRUdQZlRKejBGdjdwRENJIn0seyJwYXRoIjoicG9wdXBzL291dGRhdGVkLmh0bWwiLCJyb290X2hhc2giOiJEY1VNcXRVb0gyYzR5Rjl5QXl2VERwcXc4TVhLdFk0QUo4VVRiSXdkRDNnIn0seyJwYXRoIjoicG9wdXBzL3Byb2R1Y3Rpb24uaHRtbCIsInJvb3RfaGFzaCI6Ikt1UXdjbVQ5dnA4R0ozS3RtQkRjdHlrdDg5ZFMtZW5pMV9SS0ZBdmx3TDgifSx7InBhdGgiOiJwb3B1cHMvc2hhcmVkLmpzIiwicm9vdF9oYXNoIjoiaXIwWkhXM0toUWktRVU3NG03Z3JvdzE5bmYxWk8xZmczeFRjbmZLUnp1SSJ9LHsicGF0aCI6InBvcHVwcy91bm1pbmlmaWVkLmh0bWwiLCJyb290X2hhc2giOiJjb0U5c3ZkeDJZcDgwMFl3a012YVpWRmxvMVV1M2dhcGQ4ZnRZOUhuVWpjIn1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoiZm1rYWRtYXBnb2ZhZG9wbGpiamZrYXBka29pZW5paGkiLCJpdGVtX3ZlcnNpb24iOiIzLjQuMiIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"l9HNvm0-gZjyrebNPghVRPgTrdN5ipEVo2PhVwMv06YdMpbqHpIetSoWMYj_X4RwZrGJ5xmRF2ZRDtICXOzYifjFeXrxE2Pqzqb8o8LaQYAAkaw_Ts9QppBcUDgW0lfdSbUvDqzdjQxxVHwMuKy4D9t30eZsTH9l4GFVWX1NQNUBqtoV_b71daiwPcf1rTr59XrBUEx8SXeuDMY-CSKI2wt9III8vdcXm7FQv9HsPA0bkmaJXPMpFBU-iL6pTreUgtS3m-ZxB6xDPU_ctTsRkoKtPby7ljyc0ARAcyYEkoIY12hlb0hyqC0OR3EMO_K_rd_4LFlsU6NZAiEjRsGxVA"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"My_ktGjIASNiBZ4CZVTMsbGSr61XDMzUxfpJMCdXvR3Wa0kkFBGi6k80BzvcKS8fR45xIp1q6VVEpN_yqkuAHzsno4NGJI9ZOKNYh5Hf0Tga4bGwwisw5Y5SyqgRb9pJ01j6Y-fhzmWrcqPflAtcz-DQLCYUrbQQIbzUgF9AwyvxlYHATH_lr__2Q67JEuTHhY4macOKLESdhRM5lwbfyBrlGph6oDL6KtaHqAqtEYsqDMi6jcnoUAQBe4HzER4xZb4QimBagLBVCIH-HRKrh2ZYb_LOgv4paEz0e8nXd2Hg2b1C5kv5I6eyU2i3aZAYpVcra4pk3DV9p3OqcDprPA"}]}}]

================================================
FILE: dev/react-dev-tools/build/backend.js
================================================
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */
	'use strict';

	// Do not add requires here!
	// Running module factories is intentionally delayed until we know the hook exists.
	// This is to avoid issues like: https://github.com/facebook/react-devtools/issues/1039

	window.addEventListener('message', welcome);
	function welcome(evt) {
	  if (evt.source !== window || evt.data.source !== 'react-devtools-content-script') {
	    return;
	  }

	  window.removeEventListener('message', welcome);
	  setup(window.__REACT_DEVTOOLS_GLOBAL_HOOK__);
	}

	function setup(hook) {
	  var Agent = __webpack_require__(1);
	  var ProfileCollector = __webpack_require__(11);
	  var TraceUpdatesBackendManager = __webpack_require__(12);
	  var Bridge = __webpack_require__(21);
	  var inject = __webpack_require__(46);
	  var setupRNStyle = __webpack_require__(58);
	  var setupHighlighter = __webpack_require__(60);
	  var setupProfiler = __webpack_require__(65);
	  var setupRelay = __webpack_require__(66);

	  var listeners = [];

	  var wall = {
	    listen: function listen(fn) {
	      var listener = function listener(evt) {
	        if (evt.source !== window || !evt.data || evt.data.source !== 'react-devtools-content-script' || !evt.data.payload) {
	          return;
	        }
	        fn(evt.data.payload);
	      };
	      listeners.push(listener);
	      window.addEventListener('message', listener);
	    },
	    send: function send(data) {
	      window.postMessage({
	        source: 'react-devtools-bridge',
	        payload: data
	      }, '*');
	    }
	  };

	  // Note: this is only useful for react-native-web (and equivalents).
	  // They would have to set this field directly on the hook.
	  var isRNStyleEnabled = !!hook.resolveRNStyle;

	  var bridge = new Bridge(wall);
	  var agent = new Agent(window, {
	    rnStyle: isRNStyleEnabled
	  });
	  agent.addBridge(bridge);

	  agent.once('connected', function () {
	    inject(hook, agent);
	  });

	  if (isRNStyleEnabled) {
	    setupRNStyle(bridge, agent, hook.resolveRNStyle);
	  }

	  setupProfiler(bridge, agent, hook);
	  setupRelay(bridge, agent, hook);

	  agent.on('shutdown', function () {
	    hook.emit('shutdown');
	    listeners.forEach(function (fn) {
	      window.removeEventListener('message', fn);
	    });
	    listeners = [];
	  });

	  setupHighlighter(agent);
	  ProfileCollector.init(agent);
	  TraceUpdatesBackendManager.init(agent);
	}

/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(__webpack_provided_Object_dot_create, Map, WeakMap, Set) {/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */
	'use strict';

	var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

	var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

	function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

	function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = __webpack_provided_Object_dot_create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

	var _require = __webpack_require__(6),
	    EventEmitter = _require.EventEmitter;

	var assign = __webpack_require__(7);
	var nullthrows = __webpack_require__(8).default;
	var guid = __webpack_require__(9);
	var getIn = __webpack_require__(10);

	/**
	 * The agent lives on the page in the same context as React, observes events
	 * from the `backend`, and communicates (via a `Bridge`) with the frontend.
	 *
	 * It is responsible for generating string IDs (ElementID) for each react
	 * element, maintaining a mapping of those IDs to elements, handling messages
	 * from the frontend, and translating between react elements and native
	 * handles.
	 *
	 *
	 *   React
	 *     |
	 *     v
	 *  backend
	 *     |
	 *     v
	 *  -----------
	 * | **Agent** |
	 *  -----------
	 *     ^
	 *     |
	 *     v
	 *  (Bridge)
	 *     ^
	 *     |
	 * serialization
	 *     |
	 *     v
	 *  (Bridge)
	 *     ^
	 *     |
	 *     v
	 *  ----------------
	 * | Frontend Store |
	 *  ----------------
	 *
	 *
	 * Events from the `backend`:
	 * - root (got a root)
	 * - mount (a component mounted)
	 * - update (a component updated)
	 * - unmount (a component mounted)
	 *
	 * Events from the `frontend` Store:
	 * - see `addBridge` for subscriptions
	 *
	 * Events that Agent fires:
	 * - selected
	 * - hideHighlight
	 * - startInspecting
	 * - stopInspecting
	 * - shutdown
	 * - highlight /highlightMany
	 * - setSelection
	 * - root
	 * - mount
	 * - update
	 * - unmount
	 */
	var Agent = function (_EventEmitter) {
	  _inherits(Agent, _EventEmitter);

	  // the window or global -> used to "make a value available in the console"
	  function Agent(global, capabilities) {
	    _classCallCheck(this, Agent);

	    var _this = _possibleConstructorReturn(this, (Agent.__proto__ || Object.getPrototypeOf(Agent)).call(this));

	    _this.global = global;
	    _this.internalInstancesById = new Map();
	    _this.idsByInternalInstances = new WeakMap();
	    _this.renderers = new Map();
	    _this.elementData = new Map();
	    _this.roots = new Set();
	    _this.reactInternals = {};
	    var lastSelected;
	    _this.on('selected', function (id) {
	      var data = _this.elementData.get(id);
	      if (data && data.publicInstance && _this.global.$r === lastSelected) {
	        _this.global.$r = data.publicInstance;
	        lastSelected = data.publicInstance;
	      }
	    });
	    _this._prevSelected = null;
	    _this._scrollUpdate = false;
	    var isReactDOM = window.document && typeof window.document.createElement === 'function';
	    _this.capabilities = assign({
	      scroll: isReactDOM && typeof window.document.body.scrollIntoView === 'function',
	      dom: isReactDOM,
	      editTextContent: false
	    }, capabilities);

	    if (isReactDOM) {
	      _this._updateScroll = _this._updateScroll.bind(_this);
	      window.addEventListener('scroll', _this._onScroll.bind(_this), true);
	      window.addEventListener('click', _this._onClick.bind(_this), true);
	      window.addEventListener('mouseover', _this._onMouseOver.bind(_this), true);
	      window.addEventListener('resize', _this._onResize.bind(_this), true);
	    }
	    return _this;
	  }

	  // returns an "unsubscribe" function


	  _createClass(Agent, [{
	    key: 'sub',
	    value: function sub(ev, fn) {
	      var _this2 = this;

	      this.on(ev, fn);
	      return function () {
	        _this2.removeListener(ev, fn);
	      };
	    }
	  }, {
	    key: 'setReactInternals',
	    value: function setReactInternals(renderer, reactInternals) {
	      this.reactInternals[renderer] = reactInternals;
	    }
	  }, {
	    key: 'addBridge',
	    value: function addBridge(bridge) {
	      var _this3 = this;

	      /** Events received from the frontend **/
	      // the initial handshake
	      bridge.on('requestCapabilities', function () {
	        bridge.send('capabilities', _this3.capabilities);
	        _this3.emit('connected');
	      });
	      bridge.on('setState', this._setState.bind(this));
	      bridge.on('setProps', this._setProps.bind(this));
	      bridge.on('setContext', this._setContext.bind(this));
	      bridge.on('makeGlobal', this._makeGlobal.bind(this));
	      bridge.on('highlight', function (id) {
	        return _this3.highlight(id);
	      });
	      bridge.on('highlightMany', function (id) {
	        return _this3.highlightMany(id);
	      });
	      bridge.on('hideHighlight', function () {
	        return _this3.emit('hideHighlight');
	      });
	      bridge.on('startInspecting', function () {
	        return _this3.emit('startInspecting');
	      });
	      bridge.on('stopInspecting', function () {
	        return _this3.emit('stopInspecting');
	      });
	      bridge.on('selected', function (id) {
	        return _this3.emit('selected', id);
	      });
	      bridge.on('isRecording', function (isRecording) {
	        return _this3.emit('isRecording', isRecording);
	      });
	      bridge.on('setInspectEnabled', function (enabled) {
	        _this3._inspectEnabled = enabled;
	        _this3.emit('stopInspecting');
	      });
	      bridge.on('shutdown', function () {
	        return _this3.emit('shutdown');
	      });
	      bridge.on('changeTextContent', function (_ref) {
	        var id = _ref.id,
	            text = _ref.text;

	        var node = _this3.getNodeForID(id);
	        if (!node) {
	          return;
	        }
	        node.textContent = text;
	      });
	      // used to "inspect node in Elements pane"
	      bridge.on('putSelectedNode', function (id) {
	        window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$node = _this3.getNodeForID(id);
	      });
	      // used to "view source in Sources pane"
	      bridge.on('putSelectedInstance', function (id) {
	        var node = _this3.elementData.get(id);
	        if (node) {
	          window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$type = node.type;
	        } else {
	          window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$type = null;
	        }
	        if (node && node.publicInstance) {
	          window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$inst = node.publicInstance;
	        } else {
	          window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$inst = null;
	        }
	      });
	      // used to select the inspected node ($0)
	      bridge.on('checkSelection', function () {
	        var newSelected = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$0;
	        if (newSelected !== _this3._prevSelected) {
	          _this3._prevSelected = newSelected;
	          var sentSelected = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.$node;
	          if (newSelected !== sentSelected) {
	            _this3.selectFromDOMNode(newSelected, true);
	          }
	        }
	      });
	      bridge.on('scrollToNode', function (id) {
	        return _this3.scrollToNode(id);
	      });
	      bridge.on('traceupdatesstatechange', function (value) {
	        return _this3.emit('traceupdatesstatechange', value);
	      });
	      bridge.on('colorizerchange', function (value) {
	        return _this3.emit('colorizerchange', value);
	      });

	      /** Events sent to the frontend **/
	      this.on('root', function (id) {
	        return bridge.send('root', id);
	      });
	      this.on('mount', function (data) {
	        return bridge.send('mount', data);
	      });
	      this.on('update', function (data) {
	        return bridge.send('update', data);
	      });
	      this.on('updateProfileTimes', function (data) {
	        return bridge.send('updateProfileTimes', data);
	      });
	      this.on('unmount', function (id) {
	        bridge.send('unmount', id);
	        // once an element has been unmounted, the bridge doesn't need to be
	        // able to inspect it anymore.
	        bridge.forget(id);
	      });
	      this.on('setSelection', function (data) {
	        return bridge.send('select', data);
	      });
	      this.on('setInspectEnabled', function (data) {
	        return bridge.send('setInspectEnabled', data);
	      });
	      this.on('isRecording', function (isRecording) {
	        return bridge.send('isRecording', isRecording);
	      });
	      this.on('storeSnapshot', function (data) {
	        return bridge.send('storeSnapshot', data);
	      });
	      this.on('clearSnapshots', function () {
	        return bridge.send('clearSnapshots');
	      });
	    }
	  }, {
	    key: 'scrollToNode',
	    value: function scrollToNode(id) {
	      var node = this.getNodeForID(id);
	      if (!node) {
	        console.warn('unable to get the node for scrolling');
	        return;
	      }
	      var domElement = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
	      if (!domElement) {
	        console.warn('unable to get the domElement for scrolling');
	        return;
	      }

	      if (typeof domElement.scrollIntoViewIfNeeded === 'function') {
	        domElement.scrollIntoViewIfNeeded();
	      } else if (typeof domElement.scrollIntoView === 'function') {
	        domElement.scrollIntoView();
	      }
	      this.highlight(id);
	    }
	  }, {
	    key: 'highlight',
	    value: function highlight(id) {
	      var data = this.elementData.get(id);
	      var node = this.getNodeForID(id);
	      if (data && node) {
	        this.emit('highlight', { node: node, name: data.name, props: data.props });
	      }
	    }
	  }, {
	    key: 'highlightMany',
	    value: function highlightMany(ids) {
	      var _this4 = this;

	      var nodes = [];
	      ids.forEach(function (id) {
	        var node = _this4.getNodeForID(id);
	        if (node) {
	          nodes.push(node);
	        }
	      });
	      if (nodes.length) {
	        this.emit('highlightMany', nodes);
	      }
	    }
	  }, {
	    key: 'getNodeForID',
	    value: function getNodeForID(id) {
	      var component = this.internalInstancesById.get(id);
	      if (!component) {
	        return null;
	      }
	      var renderer = this.renderers.get(id);
	      if (renderer && this.reactInternals[renderer].getNativeFromReactElement) {
	        return this.reactInternals[renderer].getNativeFromReactElement(component);
	      }
	      return null;
	    }
	  }, {
	    key: 'selectFromDOMNode',
	    value: function selectFromDOMNode(node, quiet) {
	      var offsetFromLeaf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;

	      var id = this.getIDForNode(node);
	      if (!id) {
	        return;
	      }
	      this.emit('setSelection', { id: id, quiet: quiet, offsetFromLeaf: offsetFromLeaf });
	    }

	    // TODO: remove this method because it's breaking encapsulation.
	    // It was used by RN inspector but this required leaking Fibers to it.
	    // RN inspector will use selectFromDOMNode() instead now.
	    // Remove this method in a few months after this comment was added.

	  }, {
	    key: 'selectFromReactInstance',
	    value: function selectFromReactInstance(instance, quiet) {
	      var id = this.getId(instance);
	      if (!id) {
	        console.log('no instance id', instance);
	        return;
	      }
	      this.emit('setSelection', { id: id, quiet: quiet });
	    }
	  }, {
	    key: 'getIDForNode',
	    value: function getIDForNode(node) {
	      if (!this.reactInternals) {
	        return null;
	      }
	      var component;
	      for (var renderer in this.reactInternals) {
	        // If a renderer doesn't know about a reactId, it will throw an error.
	        try {
	          // $FlowFixMe possibly null - it's not null
	          component = this.reactInternals[renderer].getReactElementFromNative(node);
	        } catch (e) {}
	        if (component) {
	          return this.getId(component);
	        }
	      }
	      return null;
	    }
	  }, {
	    key: '_setProps',
	    value: function _setProps(_ref2) {
	      var id = _ref2.id,
	          path = _ref2.path,
	          value = _ref2.value;

	      var data = this.elementData.get(id);
	      if (data && data.updater && typeof data.updater.setInProps === 'function') {
	        data.updater.setInProps(path, value);
	      } else {
	        console.warn("trying to set props on a component that doesn't support it");
	      }
	    }
	  }, {
	    key: '_setState',
	    value: function _setState(_ref3) {
	      var id = _ref3.id,
	          path = _ref3.path,
	          value = _ref3.value;

	      var data = this.elementData.get(id);
	      if (data && data.updater && typeof data.updater.setInState === 'function') {
	        data.updater.setInState(path, value);
	      } else {
	        console.warn("trying to set state on a component that doesn't support it");
	      }
	    }
	  }, {
	    key: '_setContext',
	    value: function _setContext(_ref4) {
	      var id = _ref4.id,
	          path = _ref4.path,
	          value = _ref4.value;

	      var data = this.elementData.get(id);
	      if (data && data.updater && typeof data.updater.setInContext === 'function') {
	        // $FlowFixMe
	        data.updater.setInContext(path, value);
	      } else {
	        console.warn("trying to set context on a component that doesn't support it");
	      }
	    }
	  }, {
	    key: '_makeGlobal',
	    value: function _makeGlobal(_ref5) {
	      var id = _ref5.id,
	          path = _ref5.path;

	      var data = this.elementData.get(id);
	      if (!data) {
	        return;
	      }
	      var value;
	      if (path === 'instance') {
	        value = data.publicInstance;
	      } else {
	        value = getIn(data, path);
	      }
	      this.global.$tmp = value;
	      console.log('$tmp =', value);
	    }
	  }, {
	    key: 'getId',
	    value: function getId(internalInstance) {
	      if ((typeof internalInstance === 'undefined' ? 'undefined' : _typeof(internalInstance)) !== 'object' || !internalInstance) {
	        return internalInstance;
	      }
	      if (!this.idsByInternalInstances.has(internalInstance)) {
	        this.idsByInternalInstances.set(internalInstance, guid());
	        this.internalInstancesById.set(nullthrows(this.idsByInternalInstances.get(internalInstance)), internalInstance);
	      }
	      return nullthrows(this.idsByInternalInstances.get(internalInstance));
	    }
	  }, {
	    key: 'addRoot',
	    value: function addRoot(renderer, internalInstance) {
	      var id = this.getId(internalInstance);
	      this.roots.add(id);
	      this.emit('root', id);
	    }
	  }, {
	    key: 'rootCommitted',
	    value: function rootCommitted(renderer, internalInstance, data) {
	      var id = this.getId(internalInstance);
	      this.emit('rootCommitted', id, internalInstance, data);
	    }
	  }, {
	    key: 'onMounted',
	    value: function onMounted(renderer, component, data) {
	      var _this5 = this;

	      var id = this.getId(component);
	      this.renderers.set(id, renderer);
	      this.elementData.set(id, data);

	      var send = assign({}, data);
	      if (send.children && send.children.map) {
	        send.children = send.children.map(function (c) {
	          return _this5.getId(c);
	        });
	      }
	      send.id = id;
	      send.canUpdate = send.updater && !!send.updater.forceUpdate;
	      delete send.type;
	      delete send.updater;
	      this.emit('mount', send);
	    }
	  }, {
	    key: 'onUpdated',
	    value: function onUpdated(component, data) {
	      var _this6 = this;

	      var id = this.getId(component);
	      this.elementData.set(id, data);

	      var send = assign({}, data);
	      if (send.children && send.children.map) {
	        send.children = send.children.map(function (c) {
	          return _this6.getId(c);
	        });
	      }
	      send.id = id;
	      send.canUpdate = send.updater && !!send.updater.forceUpdate;
	      delete send.type;
	      delete send.updater;
	      this.emit('update', send);
	    }
	  }, {
	    key: 'onUpdatedProfileTimes',
	    value: function onUpdatedProfileTimes(component, data) {
	      var _this7 = this;

	      var id = this.getId(component);
	      this.elementData.set(id, data);

	      var send = assign({}, data);
	      if (send.children && send.children.map) {
	        send.children = send.children.map(function (c) {
	          return _this7.getId(c);
	        });
	      }
	      send.id = id;
	      send.canUpdate = send.updater && !!send.updater.forceUpdate;
	      delete send.type;
	      delete send.updater;
	      this.emit('updateProfileTimes', send);
	    }
	  }, {
	    key: 'onUnmounted',
	    value: function onUnmounted(component) {
	      var id = this.getId(component);
	      this.elementData.delete(id);
	      if (this.roots.has(id)) {
	        this.roots.delete(id);
	        this.emit('rootUnmounted', id);
	      }
	      this.renderers.delete(id);
	      this.emit('unmount', id);
	      this.idsByInternalInstances.delete(component);
	    }
	  }, {
	    key: '_onScroll',
	    value: function _onScroll() {
	      if (!this._scrollUpdate) {
	        this._scrollUpdate = true;
	        window.requestAnimationFrame(this._updateScroll);
	      }
	    }
	  }, {
	    key: '_updateScroll',
	    value: function _updateScroll() {
	      this.emit('refreshMultiOverlay');
	      this.emit('stopInspecting');
	      this._scrollUpdate = false;
	    }
	  }, {
	    key: '_onClick',
	    value: function _onClick(event) {
	      if (!this._inspectEnabled) {
	        return;
	      }

	      var id = this.getIDForNode(event.target);
	      if (!id) {
	        return;
	      }

	      event.stopPropagation();
	      event.preventDefault();

	      this.emit('setSelection', { id: id });
	      this.emit('setInspectEnabled', false);
	    }
	  }, {
	    key: '_onMouseOver',
	    value: function _onMouseOver(event) {
	      if (this._inspectEnabled) {
	        var id = this.getIDForNode(event.target);
	        if (!id) {
	          return;
	        }

	        this.highlight(id);
	      }
	    }
	  }, {
	    key: '_onResize',
	    value: function _onResize(event) {
	      this.emit('stopInspecting');
	    }
	  }]);

	  return Agent;
	}(EventEmitter);

	module.exports = Agent;
	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(4), __webpack_require__(5)))

/***/ },
/* 2 */
/***/ function(module, exports) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */
	'use strict';

	module.exports = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.nativeObjectCreate;

/***/ },
/* 3 */
/***/ function(module, exports) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 */
	'use strict';

	module.exports = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.nativeMap;

/***/ },
/* 4 */
/***/ function(module, exports) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 */
	'use strict';

	module.exports = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.nativeWeakMap;

/***/ },
/* 5 */
/***/ function(module, exports) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 */
	'use strict';

	module.exports = window.__REACT_DEVTOOLS_GLOBAL_HOOK__.nativeSet;

/***/ },
/* 6 */
/***/ function(module, exports) {

	// Copyright Joyent, Inc. and other Node contributors.
	//
	// Permission is hereby granted, free of charge, to any person obtaining a
	// copy of this software and associated documentation files (the
	// "Software"), to deal in the Software without restriction, including
	// without limitation the rights to use, copy, modify, merge, publish,
	// distribute, sublicense, and/or sell copies of the Software, and to permit
	// persons to whom the Software is furnished to do so, subject to the
	// following conditions:
	//
	// The above copyright notice and this permission notice shall be included
	// in all copies or substantial portions of the Software.
	//
	// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
	// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
	// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
	// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
	// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
	// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
	// USE OR OTHER DEALINGS IN THE SOFTWARE.

	function EventEmitter() {
	  this._events = this._events || {};
	  this._maxListeners = this._maxListeners || undefined;
	}
	module.exports = EventEmitter;

	// Backwards-compat with node 0.10.x
	EventEmitter.EventEmitter = EventEmitter;

	EventEmitter.prototype._events = undefined;
	EventEmitter.prototype._maxListeners = undefined;

	// By default EventEmitters will print a warning if more than 10 listeners are
	// added to it. This is a useful default which helps finding memory leaks.
	EventEmitter.defaultMaxListeners = 10;

	// Obviously not all Emitters should be limited to 10. This function allows
	// that to be increased. Set to zero for unlimited.
	EventEmitter.prototype.setMaxListeners = function(n) {
	  if (!isNumber(n) || n < 0 || isNaN(n))
	    throw TypeError('n must be a positive number');
	  this._maxListeners = n;
	  return this;
	};

	EventEmitter.prototype.emit = function(type) {
	  var er, handler, len, args, i, listeners;

	  if (!this._events)
	    this._events = {};

	  // If there is no 'error' event listener then throw.
	  if (type === 'error') {
	    if (!this._events.error ||
	        (isObject(this._events.error) && !this._events.error.length)) {
	      er = arguments[1];
	      if (er instanceof Error) {
	        throw er; // Unhandled 'error' event
	      } else {
	        // At least give some kind of context to the user
	        var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
	        err.context = er;
	        throw err;
	      }
	    }
	  }

	  handler = this._events[type];

	  if (isUndefined(handler))
	    return false;

	  if (isFunction(handler)) {
	    switch (arguments.length) {
	      // fast cases
	      case 1:
	        handler.call(this);
	        break;
	      case 2:
	        handler.call(this, arguments[1]);
	        break;
	      case 3:
	        handler.call(this, arguments[1], arguments[2]);
	        break;
	      // slower
	      default:
	        args = Array.prototype.slice.call(arguments, 1);
	        handler.apply(this, args);
	    }
	  } else if (isObject(handler)) {
	    args = Array.prototype.slice.call(arguments, 1);
	    listeners = handler.slice();
	    len = listeners.length;
	    for (i = 0; i < len; i++)
	      listeners[i].apply(this, args);
	  }

	  return true;
	};

	EventEmitter.prototype.addListener = function(type, listener) {
	  var m;

	  if (!isFunction(listener))
	    throw TypeError('listener must be a function');

	  if (!this._events)
	    this._events = {};

	  // To avoid recursion in the case that type === "newListener"! Before
	  // adding it to the listeners, first emit "newListener".
	  if (this._events.newListener)
	    this.emit('newListener', type,
	              isFunction(listener.listener) ?
	              listener.listener : listener);

	  if (!this._events[type])
	    // Optimize the case of one listener. Don't need the extra array object.
	    this._events[type] = listener;
	  else if (isObject(this._events[type]))
	    // If we've already got an array, just append.
	    this._events[type].push(listener);
	  else
	    // Adding the second element, need to change to array.
	    this._events[type] = [this._events[type], listener];

	  // Check for listener leak
	  if (isObject(this._events[type]) && !this._events[type].warned) {
	    if (!isUndefined(this._maxListeners)) {
	      m = this._maxListeners;
	    } else {
	      m = EventEmitter.defaultMaxListeners;
	    }

	    if (m && m > 0 && this._events[type].length > m) {
	      this._events[type].warned = true;
	      console.error('(node) warning: possible EventEmitter memory ' +
	                    'leak detected. %d listeners added. ' +
	                    'Use emitter.setMaxListeners() to increase limit.',
	                    this._events[type].length);
	      if (typeof console.trace === 'function') {
	        // not supported in IE 10
	        console.trace();
	      }
	    }
	  }

	  return this;
	};

	EventEmitter.prototype.on = EventEmitter.prototype.addListener;

	EventEmitter.prototype.once = function(type, listener) {
	  if (!isFunction(listener))
	    throw TypeError('listener must be a function');

	  var fired = false;

	  function g() {
	    this.removeListener(type, g);

	    if (!fired) {
	      fired = true;
	      listener.apply(this, arguments);
	    }
	  }

	  g.listener = listener;
	  this.on(type, g);

	  return this;
	};

	// emits a 'removeListener' event iff the listener was removed
	EventEmitter.prototype.removeListener = function(type, listener) {
	  var list, position, length, i;

	  if (!isFunction(listener))
	    throw TypeError('listener must be a function');

	  if (!this._events || !this._events[type])
	    return this;

	  list = this._events[type];
	  length = list.length;
	  position = -1;

	  if (list === listener ||
	      (isFunction(list.listener) && list.listener === listener)) {
	    delete this._events[type];
	    if (this._events.removeListener)
	      this.emit('removeListener', type, listener);

	  } else if (isObject(list)) {
	    for (i = length; i-- > 0;) {
	      if (list[i] === listener ||
	          (list[i].listener && list[i].listener === listener)) {
	        position = i;
	        break;
	      }
	    }

	    if (position < 0)
	      return this;

	    if (list.length === 1) {
	      list.length = 0;
	      delete this._events[type];
	    } else {
	      list.splice(position, 1);
	    }

	    if (this._events.removeListener)
	      this.emit('removeListener', type, listener);
	  }

	  return this;
	};

	EventEmitter.prototype.removeAllListeners = function(type) {
	  var key, listeners;

	  if (!this._events)
	    return this;

	  // not listening for removeListener, no need to emit
	  if (!this._events.removeListener) {
	    if (arguments.length === 0)
	      this._events = {};
	    else if (this._events[type])
	      delete this._events[type];
	    return this;
	  }

	  // emit removeListener for all listeners on all events
	  if (arguments.length === 0) {
	    for (key in this._events) {
	      if (key === 'removeListener') continue;
	      this.removeAllListeners(key);
	    }
	    this.removeAllListeners('removeListener');
	    this._events = {};
	    return this;
	  }

	  listeners = this._events[type];

	  if (isFunction(listeners)) {
	    this.removeListener(type, listeners);
	  } else if (listeners) {
	    // LIFO order
	    while (listeners.length)
	      this.removeListener(type, listeners[listeners.length - 1]);
	  }
	  delete this._events[type];

	  return this;
	};

	EventEmitter.prototype.listeners = function(type) {
	  var ret;
	  if (!this._events || !this._events[type])
	    ret = [];
	  else if (isFunction(this._events[type]))
	    ret = [this._events[type]];
	  else
	    ret = this._events[type].slice();
	  return ret;
	};

	EventEmitter.prototype.listenerCount = function(type) {
	  if (this._events) {
	    var evlistener = this._events[type];

	    if (isFunction(evlistener))
	      return 1;
	    else if (evlistener)
	      return evlistener.length;
	  }
	  return 0;
	};

	EventEmitter.listenerCount = function(emitter, type) {
	  return emitter.listenerCount(type);
	};

	function isFunction(arg) {
	  return typeof arg === 'function';
	}

	function isNumber(arg) {
	  return typeof arg === 'number';
	}

	function isObject(arg) {
	  return typeof arg === 'object' && arg !== null;
	}

	function isUndefined(arg) {
	  return arg === void 0;
	}


/***/ },
/* 7 */
/***/ function(module, exports) {

	/* eslint-disable no-unused-vars */
	'use strict';
	var hasOwnProperty = Object.prototype.hasOwnProperty;
	var propIsEnumerable = Object.prototype.propertyIsEnumerable;

	function toObject(val) {
		if (val === null || val === undefined) {
			throw new TypeError('Object.assign cannot be called with null or undefined');
		}

		return Object(val);
	}

	module.exports = Object.assign || function (target, source) {
		var from;
		var to = toObject(target);
		var symbols;

		for (var s = 1; s < arguments.length; s++) {
			from = Object(arguments[s]);

			for (var key in from) {
				if (hasOwnProperty.call(from, key)) {
					to[key] = from[key];
				}
			}

			if (Object.getOwnPropertySymbols) {
				symbols = Object.getOwnPropertySymbols(from);
				for (var i = 0; i < symbols.length; i++) {
					if (propIsEnumerable.call(from, symbols[i])) {
						to[symbols[i]] = from[symbols[i]];
					}
				}
			}
		}

		return to;
	};


/***/ },
/* 8 */
/***/ function(module, exports) {

	'use strict';

	Object.defineProperty(exports, '__esModule', {value: true});

	exports.default = function nullthrows(x) {
	  if (x != null) {
	    return x;
	  }
	  throw new Error('Got unexpected null or undefined');
	};


/***/ },
/* 9 */
/***/ function(module, exports) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */
	'use strict';

	function guid() {
	  return 'g' + Math.random().toString(16).substr(2);
	}

	module.exports = guid;

/***/ },
/* 10 */
/***/ function(module, exports) {

	'use strict';

	function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 */

	var hasOwnProperty = Object.prototype.hasOwnProperty;

	/**
	 * Retrieves the value from the path of nested objects
	 * @param  {Object} base Base or root object for path
	 * @param  {Array<String>} path nested path
	 * @return {any}      Value at end of path or `mull`
	 */
	function getIn(base, path) {
	  return path.reduce(function (obj, attr) {
	    if (obj) {
	      if (hasOwnProperty.call(obj, attr)) {
	        return obj[attr];
	      }
	      if (typeof obj[Symbol.iterator] === 'function') {
	        // Convert iterable to array and return array[index]
	        return [].concat(_toConsumableArray(obj))[attr];
	      }
	    }

	    return null;
	  }, base);
	}

	module.exports = getIn;

/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(Set) {/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */

	'use strict';

	var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

	var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

	var hasNativePerformanceNow = (typeof performance === 'undefined' ? 'undefined' : _typeof(performance)) === 'object' && typeof performance.now === 'function';

	var now = hasNativePerformanceNow ? function () {
	  return performance.now();
	} : function () {
	  return Date.now();
	};

	/**
	 * The Profiler UI displays the entire React tree, with timing info, for each commit.
	 * The frontend store only has the latest tree at any given time though,
	 * So the ProfileCollector stores snapshots of the immutable tree for each commit,
	 * Along with timing information for nodes that were updated in that commit.
	 * This information is saved in the ProfilerStore.
	 */

	var ProfileCollector = function () {
	  function ProfileCollector(agent) {
	    var _this = this;

	    _classCallCheck(this, ProfileCollector);

	    this._committedNodes = new Set();
	    this._isRecording = false;
	    this._maxActualDuration = 0;
	    this._recordingStartTime = 0;

	    this._onIsRecording = function (isRecording) {
	      _this._committedNodes = new Set();
	      _this._isRecording = isRecording;
	      _this._recordingStartTime = isRecording ? now() : 0;

	      if (isRecording) {
	        // Maybe in the future, we'll allow collecting multiple profiles and stepping through them.
	        // For now, clear old snapshots when we start recording new data though.
	        _this._agent.emit('clearSnapshots');

	        // Note that the Profiler doesn't need to do anything to turn profiling on in React.
	        // Profiling-capable builds automatically profile all roots when DevTools is detected.
	      }
	    };

	    this._onMountOrUpdate = function (data) {
	      if (!_this._isRecording || data.actualDuration === undefined) {
	        return;
	      }

	      _this._committedNodes.add(data.id);
	      _this._maxActualDuration = Math.max(_this._maxActualDuration, data.actualDuration);
	    };

	    this._onRootCommitted = function (id, internalInstance, data) {
	      if (!_this._isRecording) {
	        return;
	      }

	      // Once all roots have been committed,
	      // Take a snapshot of the current tree.
	      _this._takeCommitSnapshotForRoot(id, data);

	      // Then reset data for the next snapshot.
	      _this._committedNodes = new Set();
	      _this._maxActualDuration = 0;
	    };

	    this._onUnmount = function (id) {
	      _this._committedNodes.delete(id);
	    };

	    this._agent = agent;

	    agent.on('isRecording', this._onIsRecording);
	    agent.on('mount', this._onMountOrUpdate);
	    agent.on('rootCommitted', this._onRootCommitted);
	    agent.on('unmount', this._onUnmount);
	    agent.on('update', this._onMountOrUpdate);
	  }

	  _createClass(ProfileCollector, [{
	    key: '_takeCommitSnapshotForRoot',
	    value: function _takeCommitSnapshotForRoot(id, data) {
	      var _this2 = this;

	      var interactionsArray = data.memoizedInteractions != null ? Array.from(data.memoizedInteractions) : [];

	      // Map interaction start times to when we started profiling.
	      // We clone (rather than mutate) the interactions in stateNode.memoizedInteractions,
	      // Because we don't want to affect user code that might be consuming these Interactions via Profiler.
	      var memoizedInteractions = interactionsArray.map(function (_ref) {
	        var name = _ref.name,
	            timestamp = _ref.timestamp;
	        return {
	          name: name,
	          timestamp: timestamp - _this2._recordingStartTime
	        };
	      });

	      var storeSnapshot = {
	        memoizedInteractions: memoizedInteractions,
	        committedNodes: Array.from(this._committedNodes),
	        commitTime: now() - this._recordingStartTime,
	        duration: this._maxActualDuration,
	        root: id
	      };

	      this._agent.emit('storeSnapshot', storeSnapshot);
	    }
	  }]);

	  return ProfileCollector;
	}();

	function init(agent) {
	  return new ProfileCollector(agent);
	}

	module.exports = {
	  init: init
	};
	/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5)))

/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */

	'use strict';

	var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

	var TraceUpdatesAbstractNodeMeasurer = __webpack_require__(13);
	var TraceUpdatesAbstractNodePresenter = __webpack_require__(18);
	var TraceUpdatesWebNodeMeasurer = __webpack_require__(19);
	var TraceUpdatesWebNodePresenter = __webpack_require__(20);

	var NODE_TYPE_COMPOSITE = 'Composite';
	var NODE_TYPE_SPECIAL = 'Special';

	var TraceUpdatesBackendManager = function () {
	  function TraceUpdatesBackendManager(agent) {
	    _classCallCheck(this, TraceUpdatesBackendManager);

	    this._onMeasureNode = this._onMeasureNode.bind(this);

	    var useDOM = agent.capabilities.dom;

	    this._measurer = useDOM ? new TraceUpdatesWebNodeMeasurer() : new TraceUpdatesAbstractNodeMeasurer();

	    this._presenter = useDOM ? new TraceUpdatesWebNodePresenter() : new TraceUpdatesAbstractNodePresenter();

	    this._isActive = false;
	    agent.on('traceupdatesstatechange', this._onTraceUpdatesStateChange.bind(this));
	    agent.on('update', this._onUpdate.bind(this, agent));
	    agent.on('shutdown', this._shutdown.bind(this));
	  }

	  _createClass(TraceUpdatesBackendManager, [{
	    key: '_onUpdate',
	    value: function _onUpdate(agent, obj) {
	      if (!this._isActive || !obj.id) {
	        return;
	      }

	      // Highlighting every host node would be too noisy.
	      // We highlight user components and context consumers
	      // (without consumers, a context update that renders
	      // only host nodes directly wouldn't highlight at all).
	      var shouldHighlight = obj.nodeType === NODE_TYPE_COMPOSITE || obj.nodeType === NODE_TYPE_SPECIAL && obj.name.endsWith('.Consumer');

	      if (!shouldHighlight) {
	        return;
	      }

	      var node = agent.getNodeForID(obj.id);
	      if (!node) {
	        return;
	      }

	      this._measurer.request(node, this._onMeasureNode);
	    }
	  }, {
	    key: '_onMeasureNode',
	    value: function _onMeasureNode(measurement) {
	      this._presenter.present(measurement);
	    }
	  }, {
	    key: '_onTraceUpdatesStateChange',
	    value: function _onTraceUpdatesStateChange(state) {
	      this._isActive = state.enabled;
	      this._presenter.setEnabled(state.enabled);
	    }
	  }, {
	    key: '_shutdown',
	    value: function _shutdown() {
	      this._isActive = false;
	      this._presenter.setEnabled(false);
	    }
	  }]);

	  return TraceUpdatesBackendManager;
	}();

	function init(agent) {
	  return new TraceUpdatesBackendManager(agent);
	}

	module.exports = {
	  init: init
	};

/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {

	/**
	 * Copyright (c) 2015-present, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * 
	 */
	'use strict';

	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

	var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();

	var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

	function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

	var requestAnimationFrame = __webpack_require__(14);
	var immutable = __webpack_require__(17);

	// How long the measurement can be cached in ms.
	var DURATION = 800;

	var Record = immutable.Record,
	    Map = immutable.Map,
	    Set = immutable.Set;


	var MeasurementRecord = Record({
	  bottom: 0,
	  expiration: 0,
	  height: 0,
	  id: '',
	  left: 0,
	  right: 0,
	  scrollX: 0,
	  scrollY: 0,
	  top: 0,
	  width: 0
	});

	var _id = 100;

	var TraceUpdatesAbstractNodeMeasurer = function () {
	  function TraceUpdatesAbstractNodeMeasurer() {
	    _classCallCheck(this, TraceUpdatesAbstractNodeMeasurer);

	    // pending nodes to measure.
	    this._nodes = new Map();

	    // ids of pending nodes.
	    this._ids = new Map();

	    // cached measurements.
	    this._measurements = new Map();

	    // callbacks for pending nodes.
	    this._callbacks = new Map();

	    this._isRequesting = false;

	    // non-auto-binds.
	    this._measureNodes = this._measureNodes.bind(this);
	  }

	  _createClass(TraceUpdatesAbstractNodeMeasurer, [{
	    key: 'request',
	    value: function request(node, callback) {
	      var requestID = this._nodes.has(node) ? this._nodes.get(node) : String(_id++);

	      this._nodes = this._nodes.set(node, requestID);
	      this._ids = this._ids.set(requestID, node);

	      var callbacks = this._callbacks.has(node) ? this._callbacks.get(node) : new Set();

	      callbacks = callbacks.add(callback);
	      this._callbacks = this._callbacks.set(node, callbacks);

	      if (this._isRequesting) {
	        return requestID;
	      }

	      this._isRequesting = true;
	      requestAnimationFrame(this._measureNodes);
	      return requestID;
	    }
	  }, {
	    key: 'cancel',
	    value: function cancel(requestID) {
	      if (this._ids.has(requestID)) {
	        var node = this._ids.get(requestID);
	        this._ids = this._ids.delete(requestID);
	        this._nodes = this._nodes.delete(node);
	        this._callbacks = this._callbacks.delete(node);
	      }
	    }
	  }, {
	    key: 'measureImpl',
	    value: function measureImpl(node) {
	      // sub-class must overwrite this.
	      return new MeasurementRecord();
	    }
	  }, {
	    key: '_measureNodes',
	    value: function _measureNodes() {
	      var _this = this;

	      var now = Date.now();

	      this._measurements = this._measurements.withMutations(function (_measurements) {
	        var _iteratorNormalCompletion = true;
	        var _didIteratorError = false;
	        var _iteratorError = undefined;

	        try {
	          for (var _iterator = _this._nodes.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
	            var node = _step.value;

	            var measurement = _this._measureNode(now, node);
	            // cache measurement.
	            _measurements.set(node, measurement);
	          }
	        } catch (err) {
	          _didIteratorError = true;
	          _iteratorError = err;
	        } finally {
	          try {
	            if (!_iteratorNormalCompletion && _iterator.return) {
	              _iterator.return();
	            }
	          } finally {
	            if (_didIteratorError) {
	              throw _iteratorError;
	            }
	          }
	        }
	      });

	      // execute callbacks.
	      var _iteratorNormalCompletion2 = true;
	      var _didIteratorError2 = false;
	      var _iteratorError2 = undefined;

	      try {
	        var _loop = function _loop() {
	          var node = _step2.value;

	          var measurement = _this._measurements.get(node);
	          _this._callbacks.get(node).forEach(function (callback) {
	            return callback(measurement);
	          });
	        };

	        for (var _iterator2 = this._nodes.keys()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
	          _loop();
	        }

	        // clear stale measurement.
	      } catch (err) {
	        _didIteratorError2 = true;
	        _iteratorError2 = err;
	      } finally {
	        try {
	          if (!_iteratorNormalCompletion2 && _iterator2.return) {
	            _iterator2.return();
	          }
	        } finally {
	          if (_didIteratorError2) {
	            throw _iteratorError2;
	          }
	        }
	      }

	      this._measurements = this._measurements.withMutations(function (_measurements) {
	        var _iteratorNormalCompletion3 = true;
	        var _didIteratorError3 = false;
	        var _iteratorError3 = undefined;

	        try {
	          for (var _iterator3 = _measurements.entries()[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
	            var _step3$value = _slicedToArray(_step3.value, 2),
	                node = _step3$value[0],
	                measurement = _step3$value[1];

	            if (measurement.expiration < now) {
	              _measurements.delete(node);
	            }
	          }
	        } catch (err) {
	          _didIteratorError3 = true;
	          _iteratorError3 = err;
	        } finally {
	          try {
	            if (!_iteratorNormalCompletion3 && _iterator3.return) {
	              _iterator3.return();
	            }
	          } finally {
	            if (_didIteratorError3) {
	              throw _iteratorError3;
	            }
	          }
	        }
	      });

	      this._ids = this._ids.clear();
	      this._nodes = this._nodes.clear();
	      this._callbacks = this._callbacks.clear();
	      this._isRequesting = false;
	    }
	  }, {
	    key: '_measureNode',
	    value: function _measureNode(timestamp, node) {
	      var measurement;
	      var data;

	      if (this._measurements.has(node)) {
	        measurement = this._measurements.get(node);
	        if (measurement.expiration < timestamp) {
	          // measurement expires. measure again.
	          data = this.measureImpl(node);
	          measurement = measurement.merge(_extends({}, data, {
	            expiration: timestamp + DURATION
	          }));
	        }
	      } else {
	        data = this.measureImpl(node);
	        measurement = new MeasurementRecord(_extends({}, data, {
	          expiration: timestamp + DURATION,
	          id: 'm_' + String(_id++)
	        }));
	      }
	      return measurement;
	    }
	  }]);

	  return TraceUpdatesAbstractNodeMeasurer;
	}();

	module.exports = TraceUpdatesAbstractNodeMeasurer;

/***/ },
/* 14 */
/***/ function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(global) {/**
	 * Copyright 2014-2015, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * @providesModule requestAnimationFrame
	 */

	'use strict';

	var emptyFunction = __webpack_require__(15);
	var nativeRequestAnimationFrame = __webpack_require__(16);

	var lastTime = 0;

	var requestAnimationFrame = nativeRequestAnimationFrame || function (callback) {
	  var currTime = Date.now();
	  var timeDelay = Math.max(0, 16 - (currTime - lastTime));
	  lastTime = currTime + timeDelay;
	  return global.setTimeout(function () {
	    callback(Date.now());
	  }, timeDelay);
	};

	// Works around a rare bug in Safari 6 where the first request is never invoked.
	requestAnimationFrame(emptyFunction);

	module.exports = requestAnimationFrame;
	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))

/***/ },
/* 15 */
/***/ function(module, exports) {

	/**
	 * Copyright 2013-2015, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * @providesModule emptyFunction
	 */

	"use strict";

	function makeEmptyFunction(arg) {
	  return function () {
	    return arg;
	  };
	}

	/**
	 * This function accepts and discards inputs; it has no side effects. This is
	 * primarily useful idiomatically for overridable function endpoints which
	 * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
	 */
	function emptyFunction() {}

	emptyFunction.thatReturns = makeEmptyFunction;
	emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
	emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
	emptyFunction.thatReturnsNull = makeEmptyFunction(null);
	emptyFunction.thatReturnsThis = function () {
	  return this;
	};
	emptyFunction.thatReturnsArgument = function (arg) {
	  return arg;
	};

	module.exports = emptyFunction;

/***/ },
/* 16 */
/***/ function(module, exports) {

	/* WEBPACK VAR INJECTION */(function(global) {/**
	 * Copyright 2013-2015, Facebook, Inc.
	 * All rights reserved.
	 *
	 * This source code is licensed under the BSD-style license found in the
	 * LICENSE file in the root directory of this source tree. An additional grant
	 * of patent rights can be found in the PATENTS file in the same directory.
	 *
	 * @providesModule nativeRequestAnimationFrame
	 */

	"use strict";

	var nativeRequestAnimationFrame = global.requestAnimationFrame || global.webkitRequestAnimationFrame || global.mozRequestAnimationFrame || global.oRequestAnimationFrame || global.msRequestAnimationFrame;

	module.exports = nativeRequestAnimationFrame;
	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))

/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {

	/* WEBPACK VAR INJECTION */(function(__webpack_provided_Object_dot_create, WeakMap, Map, Set) {/**
	 *  Copyright (c) 2014-2015, Facebook, Inc.
	 *  All rights reserved.
	 *
	 *  This source code is licensed under the BSD-style license found in the
	 *  LICENSE file in the root directory of this source tree. An additional grant
	 *  of patent rights can be found in the PATENTS file in the same directory.
	 */

	(function (global, factory) {
	   true ? module.exports = factory() :
	  typeof define === 'function' && define.amd ? define(factory) :
	  global.Immutable = factory();
	}(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;

	  function createClass(ctor, superClass) {
	    if (superClass) {
	      ctor.prototype = __webpack_provided_Object_dot_create(superClass.prototype);
	    }
	    ctor.prototype.constructor = ctor;
	  }

	  function Iterable(value) {
	      return isIterable(value) ? value : Seq(value);
	    }


	  createClass(KeyedIterable, Iterable);
	    function KeyedIterable(value) {
	      return isKeyed(value) ? value : KeyedSeq(value);
	    }


	  createClass(IndexedIterable, Iterable);
	    function IndexedIterable(value) {
	      return isIndexed(value) ? value : IndexedSeq(value);
	    }


	  createClass(SetIterable, Iterable);
	    function SetIterable(value) {
	      return isIterable(value) && !isAssociative(value) ? value : SetSeq(value);
	    }



	  function isIterable(maybeIterable) {
	    return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]);
	  }

	  function isKeyed(maybeKeyed) {
	    return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);
	  }

	  function isIndexed(maybeIndexed) {
	    return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);
	  }

	  function isAssociative(maybeAssociative) {
	    return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);
	  }

	  function isOrdered(maybeOrdered) {
	    return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);
	  }

	  Iterable.isIterable = isIterable;
	  Iterable.isKeyed = isKeyed;
	  Iterable.isIndexed = isIndexed;
	  Iterable.isAssociative = isAssociative;
	  Iterable.isOrdered = isOrdered;

	  Iterable.Keyed = KeyedIterable;
	  Iterable.Indexed = IndexedIterable;
	  Iterable.Set = SetIterable;


	  var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
	  var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';
	  var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';
	  var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';

	  // Used for setting prototype methods that IE8 chokes on.
	  var DELETE = 'delete';

	  // Constants describing the size of trie nodes.
	  var SHIFT = 5; // Resulted in best performance after ______?
	  var SIZE = 1 << SHIFT;
	  var MASK = SIZE - 1;

	  // A consistent shared value representing "not set" which equals nothing other
	  // than itself, and nothing that could be provided externally.
	  var NOT_SET = {};

	  // Boolean references, Rough equivalent of `bool &`.
	  var CHANGE_LENGTH = { value: false };
	  var DID_ALTER = { value: false };

	  function MakeRef(ref) {
	    ref.value = false;
	    return ref;
	  }

	  function SetRef(ref) {
	    ref && (ref.value = true);
	  }

	  // A function which returns a value representing an "owner" for transient writes
	  // to tries. The return value will only ever equal itself, and will not equal
	  // the return of any subsequent call of this function.
	  function OwnerID() {}

	  // http://jsperf.com/copy-array-inline
	  function arrCopy(arr, offset) {
	    offset = offset || 0;
	    var len = Math.max(0, arr.length - offset);
	    var newArr = new Array(len);
	    for (var ii = 0; ii < len; ii++) {
	      newArr[ii] = arr[ii + offset];
	    }
	    return newArr;
	  }

	  function ensureSize(iter) {
	    if (iter.size === undefined) {
	      iter.size = iter.__iterate(returnTrue);
	    }
	    return iter.size;
	  }

	  function wrapIndex(iter, index) {
	    // This implements "is array index" which the ECMAString spec defines as:
	    //
	    //     A String property name P is an array index if and only if
	    //     ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal
	    //     to 2^32−1.
	    //
	    // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects
	    if (typeof index !== 'number') {
	      var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32
	      if ('' + uint32Index !== index || uint32Index === 4294967295) {
	        return NaN;
	      }
	      index = uint32Index;
	    }
	    return index < 0 ? ensureSize(iter) + index : index;
	  }

	  function returnTrue() {
	    return true;
	  }

	  function wholeSlice(begin, end, size) {
	    return (begin === 0 || (size !== undefined && begin <= -size)) &&
	      (end === undefined || (size !== undefined && end >= size));
	  }

	  function resolveBegin(begin, size) {
	    return resolveIndex(begin, size, 0);
	  }

	  function resolveEnd(end, size) {
	    return resolveIndex(end, size, size);
	  }

	  function resolveIndex(index, size, defaultIndex) {
	    return index === undefined ?
	      defaultIndex :
	      index < 0 ?
	        Math.max(0, size + index) :
	        size === undefined ?
	          index :
	          Math.min(size, index);
	  }

	  /* global Symbol */

	  var ITERATE_KEYS = 0;
	  var ITERATE_VALUES = 1;
	  var ITERATE_ENTRIES = 2;

	  var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
	  var FAUX_ITERATOR_SYMBOL = '@@iterator';

	  var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;


	  function Iterator(next) {
	      this.next = next;
	    }

	    Iterator.prototype.toString = function() {
	      return '[Iterator]';
	    };


	  Iterator.KEYS = ITERATE_KEYS;
	  Iterator.VALUES = ITERATE_VALUES;
	  Iterator.ENTRIES = ITERATE_ENTRIES;

	  Iterator.prototype.inspect =
	  Iterator.prototype.toSource = function () { return this.toString(); }
	  Iterator.prototype[ITERATOR_SYMBOL] = function () {
	    return this;
	  };


	  function iteratorValue(type, k, v, iteratorResult) {
	    var value = type === 0 ? k : type === 1 ? v : [k, v];
	    iteratorResult ? (iteratorResult.value = value) : (iteratorResult = {
	      value: value, done: false
	    });
	    return iteratorResult;
	  }

	  function iteratorDone() {
	    return { value: undefined, done: true };
	  }

	  function hasIterator(maybeIterable) {
	    return !!getIteratorFn(maybeIterable);
	  }

	  function isIterator(maybeIterator) {
	    return maybeIterator && typeof maybeIterator.next === 'function';
	  }

	  function getIterator(iterable) {
	    var iteratorFn = getIteratorFn(iterable);
	    return iteratorFn && iteratorFn.call(iterable);
	  }

	  function getIteratorFn(iterable) {
	    var iteratorFn = iterable && (
	      (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||
	      iterable[FAUX_ITERATOR_SYMBOL]
	    );
	    if (typeof iteratorFn === 'function') {
	      return iteratorFn;
	    }
	  }

	  function isArrayLike(value) {
	    return value && typeof value.length === 'number';
	  }

	  createClass(Seq, Iterable);
	    function Seq(value) {
	      return value === null || value === undefined ? emptySequence() :
	        isIterable(value) ? value.toSeq() : seqFromValue(value);
	    }

	    Seq.of = function(/*...values*/) {
	      return Seq(arguments);
	    };

	    Seq.prototype.toSeq = function() {
	      return this;
	    };

	    Seq.prototype.toString = function() {
	      return this.__toString('Seq {', '}');
	    };

	    Seq.prototype.cacheResult = function() {
	      if (!this._cache && this.__iterateUncached) {
	        this._cache = this.entrySeq().toArray();
	        this.size = this._cache.length;
	      }
	      return this;
	    };

	    // abstract __iterateUncached(fn, reverse)

	    Seq.prototype.__iterate = function(fn, reverse) {
	      return seqIterate(this, fn, reverse, true);
	    };

	    // abstract __iteratorUncached(type, reverse)

	    Seq.prototype.__iterator = function(type, reverse) {
	      return seqIterator(this, type, reverse, true);
	    };



	  createClass(KeyedSeq, Seq);
	    function KeyedSeq(value) {
	      return value === null || value === undefined ?
	        emptySequence().toKeyedSeq() :
	        isIterable(value) ?
	          (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) :
	          keyedSeqFromValue(value);
	    }

	    KeyedSeq.prototype.toKeyedSeq = function() {
	      return this;
	    };



	  createClass(IndexedSeq, Seq);
	    function IndexedSeq(value) {
	      return value === null || value === undefined ? emptySequence() :
	        !isIterable(value) ? indexedSeqFromValue(value) :
	        isKeyed(value) ? value.entrySeq() : value.toIndexedSeq();
	    }

	    IndexedSeq.of = function(/*...values*/) {
	      return IndexedSeq(arguments);
	    };

	    IndexedSeq.prototype.toIndexedSeq = function() {
	      return this;
	    };

	    IndexedSeq.prototype.toString = function() {
	      return this.__toString('Seq [', ']');
	    };

	    IndexedSeq.prototype.__iterate = function(fn, reverse) {
	      return seqIterate(this, fn, reverse, false);
	    };

	    IndexedSeq.prototype.__iterator = function(type, reverse) {
	      return seqIterator(this, type, reverse, false);
	    };



	  createClass(SetSeq, Seq);
	    function SetSeq(value) {
	      return (
	        value === null || value === undefined ? emptySequence() :
	        !isIterable(value) ? indexedSeqFromValue(value) :
	        isKeyed(value) ? value.entrySeq() : value
	      ).toSetSeq();
	    }

	    SetSeq.of = function(/*...values*/) {
	      return SetSeq(arguments);
	    };

	    SetSeq.prototype.toSetSeq = function() {
	      return this;
	    };



	  Seq.isSeq = isSeq;
	  Seq.Keyed = KeyedSeq;
	  Seq.Set = SetSeq;
	  Seq.Indexed = IndexedSeq;

	  var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';

	  Seq.prototype[IS_SEQ_SENTINEL] = true;



	  createClass(ArraySeq, IndexedSeq);
	    function ArraySeq(array) {
	      this._array = array;
	      this.size = array.length;
	    }

	    ArraySeq.prototype.get = function(index, notSetValue) {
	      return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;
	    };

	    ArraySeq.prototype.__iterate = function(fn, reverse) {
	      var array = this._array;
	      var maxIndex = array.length - 1;
	      for (var ii = 0; ii <= maxIndex; ii++) {
	        if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) {
	          return ii + 1;
	        }
	      }
	      return ii;
	    };

	    ArraySeq.prototype.__iterator = function(type, reverse) {
	      var array = this._array;
	      var maxIndex = array.length - 1;
	      var ii = 0;
	      return new Iterator(function() 
	        {return ii > maxIndex ?
	          iteratorDone() :
	          iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])}
	      );
	    };



	  createClass(ObjectSeq, KeyedSeq);
	    function ObjectSeq(object) {
	      var keys = Object.keys(object);
	      this._object = object;
	      this._keys = keys;
	      this.size = keys.length;
	    }

	    ObjectSeq.prototype.get = function(key, notSetValue) {
	      if (notSetValue !== undefined && !this.has(key)) {
	        return notSetValue;
	      }
	      return this._object[key];
	    };

	    ObjectSeq.prototype.has = function(key) {
	      return this._object.hasOwnProperty(key);
	    };

	    ObjectSeq.prototype.__iterate = function(fn, reverse) {
	      var object = this._object;
	      var keys = this._keys;
	      var maxIndex = keys.length - 1;
	      for (var ii = 0; ii <= maxIndex; ii++) {
	        var key = keys[reverse ? maxIndex - ii : ii];
	        if (fn(object[key], key, this) === false) {
	          return ii + 1;
	        }
	      }
	      return ii;
	    };

	    ObjectSeq.prototype.__iterator = function(type, reverse) {
	      var object = this._object;
	      var keys = this._keys;
	      var maxIndex = keys.length - 1;
	      var ii = 0;
	      return new Iterator(function()  {
	        var key = keys[reverse ? maxIndex - ii : ii];
	        return ii++ > maxIndex ?
	          iteratorDone() :
	          iteratorValue(type, key, object[key]);
	      });
	    };

	  ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true;


	  createClass(IterableSeq, IndexedSeq);
	    function IterableSeq(iterable) {
	      this._iterable = iterable;
	      this.size = iterable.length || iterable.size;
	    }

	    IterableSeq.prototype.__iterateUncached = function(fn, reverse) {
	      if (reverse) {
	        return this.cacheResult().__iterate(fn, reverse);
	      }
	      var iterable = this._iterable;
	      var iterator = getIterator(iterable);
	      var iterations = 0;
	      if (isIterator(iterator)) {
	        var step;
	        while (!(step = iterator.next()).done) {
	          if (fn(step.value, iterations++, this) === false) {
	            break;
	          }
	        }
	      }
	      return iterations;
	    };

	    IterableSeq.prototype.__iteratorUncached = function(type, reverse) {
	      if (reverse) {
	        return this.cacheResult().__iterator(type, reverse);
	      }
	      var iterable = this._iterable;
	      var iterator = getIterator(iterable);
	      if (!isIterator(iterator)) {
	        return new Iterator(iteratorDone);
	      }
	      var iterations = 0;
	      return new Iterator(function()  {
	        var step = iterator.next();
	        return step.done ? step : iteratorValue(type, iterations++, step.value);
	      });
	    };



	  createClass(IteratorSeq, IndexedSeq);
	    function IteratorSeq(iterator) {
	      this._iterator = iterator;
	      this._iteratorCache = [];
	    }

	    IteratorSeq.prototype.__iterateUncached = function(fn, reverse) {
	      if (reverse) {
	        return this.cacheResult().__iterate(fn, reverse);
	      }
	      var iterator = this._iterator;
	      var cache = this._iteratorCache;
	      var iterations = 0;
	      while (iterations < cache.length) {
	        if (fn(cache[iterations], iterations++, this) === false) {
	          return iterations;
	        }
	      }
	      var step;
	      while (!(step = iterator.next()).done) {
	        var val = step.value;
	        cache[iterations] = val;
	        if (fn(val, iterations++, this) === false) {
	          break;
	        }
	      }
	      return iterations;
	    };

	    IteratorSeq.prototype.__iteratorUncached = function(type, reverse) {
	      if (reverse) {
	        return this.cacheResult().__iterator(type, reverse);
	      }
	      var iterator = this._iterator;
	      var cache = this._iteratorCache;
	      var iterations = 0;
	      return new Iterator(function()  {
	        if (iterations >= cache.length) {
	          var step = iterator.next();
	          if (step.done) {
	            return step;
	          }
	          cache[iterations] = step.value;
	        }
	        return iteratorValue(type, iterations, cache[iterations++]);
	      });
	    };




	  // # pragma Helper functions

	  function isSeq(maybeSeq) {
	    return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]);
	  }

	  var EMPTY_SEQ;

	  function emptySequence() {
	    return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));
	  }

	  function keyedSeqFromValue(value) {
	    var seq =
	      Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() :
	      isIterator(value) ? new IteratorSeq(value).fromEntrySeq() :
	      hasIterator(value) ? new IterableSeq(value).fromEntrySeq() :
	      typeof value === 'object' ? new ObjectSeq(value) :
	      undefined;
	    if (!seq) {
	      throw new TypeError(
	        'Expected Array or iterable object of [k, v] entries, '+
	        'or keyed object: ' + value
	      );
	    }
	    return seq;
	  }

	  function indexedSeqFromValue(value) {
	    var seq = maybeIndexedSeqFromValue(value);
	    if (!seq) {
	      throw new TypeError(
	        'Expected Array or iterable object of values: ' + value
	      );
	    }
	    return seq;
	  }

	  function seqFromValue(value) {
	    var seq = maybeIndexedSeqFromValue(value) ||
	      (typeof value === 'object' && new ObjectSeq(value));
	    if (!seq) {
	      throw new TypeError(
	        'Expected Array or iterable object of values, or keyed object: ' + value
	      );
	    }
	    return seq;
	  }

	  function maybeIndexedSeqFromValue(value) {
	    return (
	      isArrayLike(value) ? new ArraySeq(value) :
	      isIterator(value) ? new IteratorSeq(value) :
	      hasIterator(value) ? new IterableSeq(value) :
	      undefined
	    );
	  }

	  function seqIterate(seq, fn, reverse, useKeys) {
	    var cache = seq._cache;
	    if (cache) {
	      var maxIndex = cache.length - 1;
	      for (var ii = 0; ii <= maxIndex; ii++) {
	        var entry = cache[reverse ? maxIndex - ii : ii];
	        if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) {
	          return ii + 1;
	        }
	      }
	      return ii;
	    }
	    return seq.__iterateUncached(fn, reverse);
	  }

	  function seqIterator(seq, type, reverse, useKeys) {
	    var cache = seq._cache;
	    if (cache) {
	      var maxIndex = cache.length - 1;
	      var ii = 0;
	      return new Iterator(function()  {
	        var entry = cache[reverse ? maxIndex - ii : ii];
	        return ii++ > maxIndex ?
	          iteratorDone() :
	          iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]);
	      });
	    }
	    return seq.__iteratorUncached(type, reverse);
	  }

	  function fromJS(json, converter) {
	    return converter ?
	      fromJSWith(converter, json, '', {'': json}) :
	      fromJSDefault(json);
	  }

	  function fromJSWith(converter, json, key, parentJSON) {
	    if (Array.isArray(json)) {
	      return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k)  {return fromJSWith(converter, v, k, json)}));
	    }
	    if (isPlainObj(json)) {
	      return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k)  {return fromJSWith(converter, v, k, json)}));
	    }
	    return json;
	  }

	  function fromJSDefault(json) {
	    if (Array.isArray(json)) {
	      return IndexedSeq(json).map(fromJSDefault).toList();
	    }
	    if (isPlainObj(json)) {
	      return KeyedSeq(json).map(fromJSDefault).toMap();
	    }
	    return json;
	  }

	  function isPlainObj(value) {
	    return value && (value.constructor === Object || value.constructor === undefined);
	  }

	  /**
	   * An extension of the "same-value" algorithm as [described for use by ES6 Map
	   * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)
	   *
	   * NaN is considered the same as NaN, however -0 and 0 are considered the same
	   * value, which is different from the algorithm described by
	   * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).
	   *
	   * This is extended further to allow Objects to describe the values they
	   * represent, by way of `valueOf` or `equals` (and `hashCode`).
	   *
	   * Note: because of this extension, the key equality of Immutable.Map and the
	   * value equality of Immutable.Set will differ from ES6 Map and Set.
	   *
	   * ### Defining custom values
	   *
	   * The easiest way to describe the value an object represents is by implementing
	   * `valueOf`. For example, `Date` represents a value by returning a unix
	   * timestamp for `valueOf`:
	   *
	   *     var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...
	   *     var date2 = new Date(1234567890000);
	   *     date1.valueOf(); // 1234567890000
	   *     assert( date1 !== date2 );
	   *     assert( Immutable.is( date1, date2 ) );
	   *
	   * Note: overriding `valueOf` may have other implications if you use this object
	   * where JavaScript expects a primitive, such as implicit string coercion.
	   *
	   * For more complex types, especially collections, implementing `valueOf` may
	   * not be performant. An alternative is to implement `equals` and `hashCode`.
	   *
	   * `equals` takes another object, presumably of similar type, and returns true
	   * if the it is equal. Equality is symmetrical, so the same result should be
	   * returned if this and the argument are flipped.
	   *
	   *     assert( a.equals(b) === b.equals(a) );
	   *
	   * `hashCode` returns a 32bit integer number representing the object which will
	   * be used to determine how to store the value object in a Map or Set. You must
	   * provide both or neither methods, one must not exist without the other.
	   *
	   * Also, an important relationship between these methods must be upheld: if two
	   * values are equal, they *must* return the same hashCode. If the values are not
	   * equal, they might have the same hashCode; this is called a hash collision,
	   * and while undesirable for performance reasons, it is acceptable.
	   *
	   *     if (a.equals(b)) {
	   *       assert( a.hashCode() === b.hashCode() );
	   *     }
	   *
	   * All Immutable collections implement `equals` and `hashCode`.
	   *
	   */
	  function is(valueA, valueB) {
	    if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
	      return true;
	    }
	    if (!valueA || !valueB) {
	      return false;
	    }
	    if (typeof valueA.valueOf === 'function' &&
	        typeof valueB.valueOf === 'function') {
	      valueA = valueA.valueOf();
	      valueB = valueB.valueOf();
	      if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
	        return true;
	      }
	      if (!valueA || !valueB) {
	        return false;
	      }
	    }
	    if (typeof valueA.equals === 'function' &&
	        typeof valueB.equals === 'function' &&
	        valueA.equals(valueB)) {
	      return true;
	    }
	    return false;
	  }

	  function deepEqual(a, b) {
	    if (a === b) {
	      return true;
	    }

	    if (
	      !isIterable(b) ||
	      a.size !== undefined && b.size !== undefined && a.size !== b.size ||
	      a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash ||
	      isKeyed(a) !== isKeyed(b) ||
	      isIndexed(a) !== isIndexed(b) ||
	      isOrdered(a) !== isOrdered(b)
	    ) {
	      return false;
	    }

	    if (a.size === 0 && b.size === 0) {
	      return true;
	    }

	    var notAssociative = !isAssociative(a);

	    if (isOrdered(a)) {
	      var entries = a.entries();
	      return b.every(function(v, k)  {
	        var entry = entries.next().value;
	        return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));
	      }) && entries.next().done;
	    }

	    var flipped = false;

	    if (a.size === undefined) {
	      if (b.size === undefined) {
	        if (typeof a.cacheResult === 'function') {
	          a.cacheResult();
	        }
	      } else {
	        flipped = true;
	        var _ = a;
	        a = b;
	        b = _;
	      }
	    }

	    var allEqual = true;
	    var bSize = b.__iterate(function(v, k)  {
	      if (notAssociative ? !a.has(v) :
	          flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) {
	        allEqual = false;
	        return false;
	      }
	    });

	    return allEqual && a.size === bSize;
	  }

	  createClass(Repeat, IndexedSeq);

	    function Repeat(value, times) {
	      if (!(this instanceof Repeat)) {
	        return new Repeat(value, times);
	      }
	      this._value = value;
	      this.size = times === undefined ? Infinity : Math.max(0, times);
	      if (this.size === 0) {
	        if (EMPTY_REPEAT) {
	          return EMPTY_REPEAT;
	        }
	        EMPTY_REPEAT = this;
	      }
	    }

	    Repeat.prototype.toString = function() {
	      if (this.size === 0) {
	        return 'Repeat []';
	      }
	      return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';
	    };

	    Repeat.prototype.get = function(index, notSetValue) {
	      return this.has(index) ? this._value : notSetValue;
	    };

	    Repeat.prototype.includes = function(searchValue) {
	      return is(this._value, searchValue);
	    };

	    Repeat.prototype.slice = function(begin, end) {
	      var size = this.size;
	      return wholeSlice(begin, end, size) ? this :
	        new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size));
	    };

	    Repeat.prototype.reverse = function() {
	      return this;
	    };

	    Repeat.prototype.indexOf = function(searchValue) {
	      if (is(this._value, searchValue)) {
	        return 0;
	      }
	      return -1;
	    };

	    Repeat.prototype.lastIndexOf = function(searchValue) {
	      if (is(this._value, searchValue)) {
	        return this.size;
	      }
	      return -1;
	    };

	    Repeat.prototype.__iterate = function(fn, reverse) {
	      for (var ii = 0; ii < this.size; ii++) {
	        if (fn(this._value, ii, this) === false) {
	          return ii + 1;
	        }
	      }
	      return ii;
	    };

	    Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this;
	      var ii = 0;
	      return new Iterator(function() 
	        {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()}
	      );
	    };

	    Repeat.prototype.equals = function(other) {
	      return other instanceof Repeat ?
	        is(this._value, other._value) :
	        deepEqual(other);
	    };


	  var EMPTY_REPEAT;

	  function invariant(condition, error) {
	    if (!condition) throw new Error(error);
	  }

	  createClass(Range, IndexedSeq);

	    function Range(start, end, step) {
	      if (!(this instanceof Range)) {
	        return new Range(start, end, step);
	      }
	      invariant(step !== 0, 'Cannot step a Range by 0');
	      start = start || 0;
	      if (end === undefined) {
	        end = Infinity;
	      }
	      step = step === undefined ? 1 : Math.abs(step);
	      if (end < start) {
	        step = -step;
	      }
	      this._start = start;
	      this._end = end;
	      this._step = step;
	      this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);
	      if (this.size === 0) {
	        if (EMPTY_RANGE) {
	          return EMPTY_RANGE;
	        }
	        EMPTY_RANGE = this;
	      }
	    }

	    Range.prototype.toString = function() {
	      if (this.size === 0) {
	        return 'Range []';
	      }
	      return 'Range [ ' +
	        this._start + '...' + this._end +
	        (this._step > 1 ? ' by ' + this._step : '') +
	      ' ]';
	    };

	    Range.prototype.get = function(index, notSetValue) {
	      return this.has(index) ?
	        this._start + wrapIndex(this, index) * this._step :
	        notSetValue;
	    };

	    Range.prototype.includes = function(searchValue) {
	      var possibleIndex = (searchValue - this._start) / this._step;
	      return possibleIndex >= 0 &&
	        possibleIndex < this.size &&
	        possibleIndex === Math.floor(possibleIndex);
	    };

	    Range.prototype.slice = function(begin, end) {
	      if (wholeSlice(begin, end, this.size)) {
	        return this;
	      }
	      begin = resolveBegin(begin, this.size);
	      end = resolveEnd(end, this.size);
	      if (end <= begin) {
	        return new Range(0, 0);
	      }
	      return new Range(this.get(begin, this._end), this.get(end, this._end), this._step);
	    };

	    Range.prototype.indexOf = function(searchValue) {
	      var offsetValue = searchValue - this._start;
	      if (offsetValue % this._step === 0) {
	        var index = offsetValue / this._step;
	        if (index >= 0 && index < this.size) {
	          return index
	        }
	      }
	      return -1;
	    };

	    Range.prototype.lastIndexOf = function(searchValue) {
	      return this.indexOf(searchValue);
	    };

	    Range.prototype.__iterate = function(fn, reverse) {
	      var maxIndex = this.size - 1;
	      var step = this._step;
	      var value = reverse ? this._start + maxIndex * step : this._start;
	      for (var ii = 0; ii <= maxIndex; ii++) {
	        if (fn(value, ii, this) === false) {
	          return ii + 1;
	        }
	        value += reverse ? -step : step;
	      }
	      return ii;
	    };

	    Range.prototype.__iterator = function(type, reverse) {
	      var maxIndex = this.size - 1;
	      var step = this._step;
	      var value = reverse ? this._start + maxIndex * step : this._start;
	      var ii = 0;
	      return new Iterator(function()  {
	        var v = value;
	        value += reverse ? -step : step;
	        return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v);
	      });
	    };

	    Range.prototype.equals = function(other) {
	      return other instanceof Range ?
	        this._start === other._start &&
	        this._end === other._end &&
	        this._step === other._step :
	        deepEqual(this, other);
	    };


	  var EMPTY_RANGE;

	  createClass(Collection, Iterable);
	    function Collection() {
	      throw TypeError('Abstract');
	    }


	  createClass(KeyedCollection, Collection);function KeyedCollection() {}

	  createClass(IndexedCollection, Collection);function IndexedCollection() {}

	  createClass(SetCollection, Collection);function SetCollection() {}


	  Collection.Keyed = KeyedCollection;
	  Collection.Indexed = IndexedCollection;
	  Collection.Set = SetCollection;

	  var imul =
	    typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ?
	    Math.imul :
	    function imul(a, b) {
	      a = a | 0; // int
	      b = b | 0; // int
	      var c = a & 0xffff;
	      var d = b & 0xffff;
	      // Shift by 0 fixes the sign on the high part.
	      return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int
	    };

	  // v8 has an optimization for storing 31-bit signed numbers.
	  // Values which have either 00 or 11 as the high order bits qualify.
	  // This function drops the highest order bit in a signed number, maintaining
	  // the sign bit.
	  function smi(i32) {
	    return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF);
	  }

	  function hash(o) {
	    if (o === false || o === null || o === undefined) {
	      return 0;
	    }
	    if (typeof o.valueOf === 'function') {
	      o = o.valueOf();
	      if (o === false || o === null || o === undefined) {
	        return 0;
	      }
	    }
	    if (o === true) {
	      return 1;
	    }
	    var type = typeof o;
	    if (type === 'number') {
	      var h = o | 0;
	      if (h !== o) {
	        h ^= o * 0xFFFFFFFF;
	      }
	      while (o > 0xFFFFFFFF) {
	        o /= 0xFFFFFFFF;
	        h ^= o;
	      }
	      return smi(h);
	    }
	    if (type === 'string') {
	      return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o);
	    }
	    if (typeof o.hashCode === 'function') {
	      return o.hashCode();
	    }
	    if (type === 'object') {
	      return hashJSObj(o);
	    }
	    if (typeof o.toString === 'function') {
	      return hashString(o.toString());
	    }
	    throw new Error('Value type ' + type + ' cannot be hashed.');
	  }

	  function cachedHashString(string) {
	    var hash = stringHashCache[string];
	    if (hash === undefined) {
	      hash = hashString(string);
	      if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {
	        STRING_HASH_CACHE_SIZE = 0;
	        stringHashCache = {};
	      }
	      STRING_HASH_CACHE_SIZE++;
	      stringHashCache[string] = hash;
	    }
	    return hash;
	  }

	  // http://jsperf.com/hashing-strings
	  function hashString(string) {
	    // This is the hash from JVM
	    // The hash code for a string is computed as
	    // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],
	    // where s[i] is the ith character of the string and n is the length of
	    // the string. We "mod" the result to make it between 0 (inclusive) and 2^31
	    // (exclusive) by dropping high bits.
	    var hash = 0;
	    for (var ii = 0; ii < string.length; ii++) {
	      hash = 31 * hash + string.charCodeAt(ii) | 0;
	    }
	    return smi(hash);
	  }

	  function hashJSObj(obj) {
	    var hash;
	    if (usingWeakMap) {
	      hash = weakMap.get(obj);
	      if (hash !== undefined) {
	        return hash;
	      }
	    }

	    hash = obj[UID_HASH_KEY];
	    if (hash !== undefined) {
	      return hash;
	    }

	    if (!canDefineProperty) {
	      hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];
	      if (hash !== undefined) {
	        return hash;
	      }

	      hash = getIENodeHash(obj);
	      if (hash !== undefined) {
	        return hash;
	      }
	    }

	    hash = ++objHashUID;
	    if (objHashUID & 0x40000000) {
	      objHashUID = 0;
	    }

	    if (usingWeakMap) {
	      weakMap.set(obj, hash);
	    } else if (isExtensible !== undefined && isExtensible(obj) === false) {
	      throw new Error('Non-extensible objects are not allowed as keys.');
	    } else if (canDefineProperty) {
	      Object.defineProperty(obj, UID_HASH_KEY, {
	        'enumerable': false,
	        'configurable': false,
	        'writable': false,
	        'value': hash
	      });
	    } else if (obj.propertyIsEnumerable !== undefined &&
	               obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) {
	      // Since we can't define a non-enumerable property on the object
	      // we'll hijack one of the less-used non-enumerable properties to
	      // save our hash on it. Since this is a function it will not show up in
	      // `JSON.stringify` which is what we want.
	      obj.propertyIsEnumerable = function() {
	        return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments);
	      };
	      obj.propertyIsEnumerable[UID_HASH_KEY] = hash;
	    } else if (obj.nodeType !== undefined) {
	      // At this point we couldn't get the IE `uniqueID` to use as a hash
	      // and we couldn't use a non-enumerable property to exploit the
	      // dontEnum bug so we simply add the `UID_HASH_KEY` on the node
	      // itself.
	      obj[UID_HASH_KEY] = hash;
	    } else {
	      throw new Error('Unable to set a non-enumerable property on object.');
	    }

	    return hash;
	  }

	  // Get references to ES5 object methods.
	  var isExtensible = Object.isExtensible;

	  // True if Object.defineProperty works as expected. IE8 fails this test.
	  var canDefineProperty = (function() {
	    try {
	      Object.defineProperty({}, '@', {});
	      return true;
	    } catch (e) {
	      return false;
	    }
	  }());

	  // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it
	  // and avoid memory leaks from the IE cloneNode bug.
	  function getIENodeHash(node) {
	    if (node && node.nodeType > 0) {
	      switch (node.nodeType) {
	        case 1: // Element
	          return node.uniqueID;
	        case 9: // Document
	          return node.documentElement && node.documentElement.uniqueID;
	      }
	    }
	  }

	  // If possible, use a WeakMap.
	  var usingWeakMap = typeof WeakMap === 'function';
	  var weakMap;
	  if (usingWeakMap) {
	    weakMap = new WeakMap();
	  }

	  var objHashUID = 0;

	  var UID_HASH_KEY = '__immutablehash__';
	  if (typeof Symbol === 'function') {
	    UID_HASH_KEY = Symbol(UID_HASH_KEY);
	  }

	  var STRING_HASH_CACHE_MIN_STRLEN = 16;
	  var STRING_HASH_CACHE_MAX_SIZE = 255;
	  var STRING_HASH_CACHE_SIZE = 0;
	  var stringHashCache = {};

	  function assertNotInfinite(size) {
	    invariant(
	      size !== Infinity,
	      'Cannot perform this action with an infinite size.'
	    );
	  }

	  createClass(Map, KeyedCollection);

	    // @pragma Construction

	    function Map(value) {
	      return value === null || value === undefined ? emptyMap() :
	        isMap(value) && !isOrdered(value) ? value :
	        emptyMap().withMutations(function(map ) {
	          var iter = KeyedIterable(value);
	          assertNotInfinite(iter.size);
	          iter.forEach(function(v, k)  {return map.set(k, v)});
	        });
	    }

	    Map.prototype.toString = function() {
	      return this.__toString('Map {', '}');
	    };

	    // @pragma Access

	    Map.prototype.get = function(k, notSetValue) {
	      return this._root ?
	        this._root.get(0, undefined, k, notSetValue) :
	        notSetValue;
	    };

	    // @pragma Modification

	    Map.prototype.set = function(k, v) {
	      return updateMap(this, k, v);
	    };

	    Map.prototype.setIn = function(keyPath, v) {
	      return this.updateIn(keyPath, NOT_SET, function()  {return v});
	    };

	    Map.prototype.remove = function(k) {
	      return updateMap(this, k, NOT_SET);
	    };

	    Map.prototype.deleteIn = function(keyPath) {
	      return this.updateIn(keyPath, function()  {return NOT_SET});
	    };

	    Map.prototype.update = function(k, notSetValue, updater) {
	      return arguments.length === 1 ?
	        k(this) :
	        this.updateIn([k], notSetValue, updater);
	    };

	    Map.prototype.updateIn = function(keyPath, notSetValue, updater) {
	      if (!updater) {
	        updater = notSetValue;
	        notSetValue = undefined;
	      }
	      var updatedValue = updateInDeepMap(
	        this,
	        forceIterator(keyPath),
	        notSetValue,
	        updater
	      );
	      return updatedValue === NOT_SET ? undefined : updatedValue;
	    };

	    Map.prototype.clear = function() {
	      if (this.size === 0) {
	        return this;
	      }
	      if (this.__ownerID) {
	        this.size = 0;
	        this._root = null;
	        this.__hash = undefined;
	        this.__altered = true;
	        return this;
	      }
	      return emptyMap();
	    };

	    // @pragma Composition

	    Map.prototype.merge = function(/*...iters*/) {
	      return mergeIntoMapWith(this, undefined, arguments);
	    };

	    Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
	      return mergeIntoMapWith(this, merger, iters);
	    };

	    Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);
	      return this.updateIn(
	        keyPath,
	        emptyMap(),
	        function(m ) {return typeof m.merge === 'function' ?
	          m.merge.apply(m, iters) :
	          iters[iters.length - 1]}
	      );
	    };

	    Map.prototype.mergeDeep = function(/*...iters*/) {
	      return mergeIntoMapWith(this, deepMerger, arguments);
	    };

	    Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
	      return mergeIntoMapWith(this, deepMergerWith(merger), iters);
	    };

	    Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);
	      return this.updateIn(
	        keyPath,
	        emptyMap(),
	        function(m ) {return typeof m.mergeDeep === 'function' ?
	          m.mergeDeep.apply(m, iters) :
	          iters[iters.length - 1]}
	      );
	    };

	    Map.prototype.sort = function(comparator) {
	      // Late binding
	      return OrderedMap(sortFactory(this, comparator));
	    };

	    Map.prototype.sortBy = function(mapper, comparator) {
	      // Late binding
	      return OrderedMap(sortFactory(this, comparator, mapper));
	    };

	    // @pragma Mutability

	    Map.prototype.withMutations = function(fn) {
	      var mutable = this.asMutable();
	      fn(mutable);
	      return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;
	    };

	    Map.prototype.asMutable = function() {
	      return this.__ownerID ? this : this.__ensureOwner(new OwnerID());
	    };

	    Map.prototype.asImmutable = function() {
	      return this.__ensureOwner();
	    };

	    Map.prototype.wasAltered = function() {
	      return this.__altered;
	    };

	    Map.prototype.__iterator = function(type, reverse) {
	      return new MapIterator(this, type, reverse);
	    };

	    Map.prototype.__iterate = function(fn, reverse) {var this$0 = this;
	      var iterations = 0;
	      this._root && this._root.iterate(function(entry ) {
	        iterations++;
	        return fn(entry[1], entry[0], this$0);
	      }, reverse);
	      return iterations;
	    };

	    Map.prototype.__ensureOwner = function(ownerID) {
	      if (ownerID === this.__ownerID) {
	        return this;
	      }
	      if (!ownerID) {
	        this.__ownerID = ownerID;
	        this.__altered = false;
	        return this;
	      }
	      return makeMap(this.size, this._root, ownerID, this.__hash);
	    };


	  function isMap(maybeMap) {
	    return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]);
	  }

	  Map.isMap = isMap;

	  var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';

	  var MapPrototype = Map.prototype;
	  MapPrototype[IS_MAP_SENTINEL] = true;
	  MapPrototype[DELETE] = MapPrototype.remove;
	  MapPrototype.removeIn = MapPrototype.deleteIn;


	  // #pragma Trie Nodes



	    function ArrayMapNode(ownerID, entries) {
	      this.ownerID = ownerID;
	      this.entries = entries;
	    }

	    ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {
	      var entries = this.entries;
	      for (var ii = 0, len = entries.length; ii < len; ii++) {
	        if (is(key, entries[ii][0])) {
	          return entries[ii][1];
	        }
	      }
	      return notSetValue;
	    };

	    ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
	      var removed = value === NOT_SET;

	      var entries = this.entries;
	      var idx = 0;
	      for (var len = entries.length; idx < len; idx++) {
	        if (is(key, entries[idx][0])) {
	          break;
	        }
	      }
	      var exists = idx < len;

	      if (exists ? entries[idx][1] === value : removed) {
	        return this;
	      }

	      SetRef(didAlter);
	      (removed || !exists) && SetRef(didChangeSize);

	      if (removed && entries.length === 1) {
	        return; // undefined
	      }

	      if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {
	        return createNodes(ownerID, entries, key, value);
	      }

	      var isEditable = ownerID && ownerID === this.ownerID;
	      var newEntries = isEditable ? entries : arrCopy(entries);

	      if (exists) {
	        if (removed) {
	          idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop());
	        } else {
	          newEntries[idx] = [key, value];
	        }
	      } else {
	        newEntries.push([key, value]);
	      }

	      if (isEditable) {
	        this.entries = newEntries;
	        return this;
	      }

	      return new ArrayMapNode(ownerID, newEntries);
	    };




	    function BitmapIndexedNode(ownerID, bitmap, nodes) {
	      this.ownerID = ownerID;
	      this.bitmap = bitmap;
	      this.nodes = nodes;
	    }

	    BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) {
	      if (keyHash === undefined) {
	        keyHash = hash(key);
	      }
	      var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK));
	      var bitmap = this.bitmap;
	      return (bitmap & bit) === 0 ? notSetValue :
	        this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue);
	    };

	    BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
	      if (keyHash === undefined) {
	        keyHash = hash(key);
	      }
	      var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
	      var bit = 1 << keyHashFrag;
	      var bitmap = this.bitmap;
	      var exists = (bitmap & bit) !== 0;

	      if (!exists && value === NOT_SET) {
	        return this;
	      }

	      var idx = popCount(bitmap & (bit - 1));
	      var nodes = this.nodes;
	      var node = exists ? nodes[idx] : undefined;
	      var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);

	      if (newNode === node) {
	        return this;
	      }

	      if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {
	        return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);
	      }

	      if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) {
	        return nodes[idx ^ 1];
	      }

	      if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {
	        return newNode;
	      }

	      var isEditable = ownerID && ownerID === this.ownerID;
	      var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit;
	      var newNodes = exists ? newNode ?
	        setIn(nodes, idx, newNode, isEditable) :
	        spliceOut(nodes, idx, isEditable) :
	        spliceIn(nodes, idx, newNode, isEditable);

	      if (isEditable) {
	        this.bitmap = newBitmap;
	        this.nodes = newNodes;
	        return this;
	      }

	      return new BitmapIndexedNode(ownerID, newBitmap, newNodes);
	    };




	    function HashArrayMapNode(ownerID, count, nodes) {
	      this.ownerID = ownerID;
	      this.count = count;
	      this.nodes = nodes;
	    }

	    HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {
	      if (keyHash === undefined) {
	        keyHash = hash(key);
	      }
	      var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
	      var node = this.nodes[idx];
	      return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue;
	    };

	    HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
	      if (keyHash === undefined) {
	        keyHash = hash(key);
	      }
	      var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
	      var removed = value === NOT_SET;
	      var nodes = this.nodes;
	      var node = nodes[idx];

	      if (removed && !node) {
	        return this;
	      }

	      var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);
	      if (newNode === node) {
	        return this;
	      }

	      var newCount = this.count;
	      if (!node) {
	        newCount++;
	      } else if (!newNode) {
	        newCount--;
	        if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {
	          return packNodes(ownerID, nodes, newCount, idx);
	        }
	      }

	      var isEditable = ownerID && ownerID === this.ownerID;
	      var newNodes = setIn(nodes, idx, newN
Download .txt
gitextract_rtm8sp7z/

├── .babelrc
├── .github/
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       └── nodejs.yml
├── .gitignore
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app/
│   ├── actions/
│   │   ├── dat-middleware.js
│   │   └── index.js
│   ├── components/
│   │   ├── app.js
│   │   ├── button.js
│   │   ├── dat-import.js
│   │   ├── dialog.js
│   │   ├── empty.js
│   │   ├── file-list.js
│   │   ├── finder-button.js
│   │   ├── header.js
│   │   ├── hex-content.js
│   │   ├── icon.js
│   │   ├── inspect.js
│   │   ├── intro.js
│   │   ├── status-bar.js
│   │   ├── status.js
│   │   ├── table-row.js
│   │   ├── table.js
│   │   └── title-field.js
│   ├── consts/
│   │   ├── env.js
│   │   ├── screen.js
│   │   └── state.js
│   ├── containers/
│   │   ├── dat-import.js
│   │   ├── dialog.js
│   │   ├── drag-drop.js
│   │   ├── header.js
│   │   ├── inspect.js
│   │   ├── intro.js
│   │   ├── status-bar.js
│   │   ├── table-row.js
│   │   └── table.js
│   ├── index.js
│   └── reducers/
│       └── index.js
├── appveyor.yml
├── build/
│   └── icon.icns
├── dev/
│   └── react-dev-tools/
│       ├── _metadata/
│       │   └── verified_contents.json
│       ├── build/
│       │   ├── backend.js
│       │   ├── background.js
│       │   ├── contentScript.js
│       │   ├── inject.js
│       │   ├── main.js
│       │   └── panel.js
│       ├── main.html
│       ├── manifest.json
│       ├── panel.html
│       └── popups/
│           ├── deadcode.html
│           ├── development.html
│           ├── disabled.html
│           ├── outdated.html
│           ├── production.html
│           ├── shared.js
│           └── unminified.html
├── dist/
│   └── .gitignore
├── index.html
├── index.js
├── lib/
│   └── auto-updater.js
├── package.json
├── preload.js
├── static/
│   └── base.css
├── tests/
│   ├── fixtures/
│   │   ├── dat.json
│   │   └── hello.txt
│   ├── index.js
│   └── utils/
│       ├── wait.js
│       ├── waitForAndClick.js
│       ├── waitForMatch.js
│       └── waitForVisible.js
├── unit-tests/
│   ├── _helpers/
│   │   ├── enzymeSetup.js
│   │   └── mockWindow.js
│   ├── dat-import.js
│   ├── file-list.js
│   ├── hex-content.js
│   ├── inspect.js
│   ├── intro.js
│   ├── status-bar.js
│   ├── status.js
│   ├── table-row.js
│   ├── table.js
│   └── title-field.js
└── webpack.config.js
Download .txt
SYMBOL INDEX (1583 symbols across 16 files)

FILE: app/actions/dat-middleware.js
  function readJSON (line 16) | async function readJSON (file) {
  class DatMiddleware (line 27) | class DatMiddleware {
    method constructor (line 28) | constructor ({ downloadsDir, dataDir }) {
    method validateDownloadRequest (line 44) | async validateDownloadRequest ({ key }) {
    method execAction (line 58) | execAction (action) {
    method middleware (line 73) | middleware (store) {
    method dispatch (line 87) | dispatch (action) {
    method updateTitle (line 91) | async updateTitle ({ key, title }) {
    method removeDat (line 103) | async removeDat ({ key }) {
    method tryAddDat (line 108) | async tryAddDat (action) {
    method internalAddDat (line 138) | async internalAddDat ({ key, path, paused, ...opts }) {
    method updateProgress (line 217) | updateProgress (dat, key, stats) {
    method togglePause (line 250) | async togglePause ({ key, paused }) {
    method downloadSparseDat (line 260) | async downloadSparseDat ({ key }) {
    method cancelDownloadDat (line 310) | async cancelDownloadDat ({ key }) {
    method appendDatInternally (line 314) | appendDatInternally (key, dat, path, opts = {}) {
    method removeDatInternally (line 321) | removeDatInternally (key) {
    method walk (line 340) | walk (dat) {
    method updateState (line 364) | updateState (dat) {
    method updateConnections (line 374) | updateConnections (dat) {
    method joinNetwork (line 380) | joinNetwork (dat) {
    method loadFromDisk (line 392) | async loadFromDisk () {
    method storeOnDisk (line 414) | async storeOnDisk () {

FILE: app/actions/index.js
  function showOpenDialog (line 11) | function showOpenDialog (props) {

FILE: app/components/dialog.js
  function CloseButton (line 118) | function CloseButton ({ onExit }) {

FILE: app/components/intro.js
  class IntroScreen (line 68) | class IntroScreen extends Component {
    method constructor (line 69) | constructor (props) {
    method onkeydown (line 74) | onkeydown (ev) {
    method componentWillMount (line 80) | componentWillMount () {
    method componentWillUnmount (line 84) | componentWillUnmount () {
    method render (line 88) | render () {

FILE: app/components/title-field.js
  class InputField (line 50) | class InputField extends Component {
    method componentDidMount (line 51) | componentDidMount () {
    method render (line 56) | render () {
  class TitleField (line 61) | class TitleField extends Component {
    method constructor (line 62) | constructor (props) {
    method onclick (line 67) | onclick (ev) {
    method commit (line 73) | commit () {
    method cancel (line 82) | cancel () {
    method handleKeyup (line 89) | handleKeyup (ev) {
    method render (line 110) | render () {

FILE: app/consts/env.js
  constant DAT_ENV (line 1) | const DAT_ENV = window.DAT_ENV || {} // in test, attach the blank object.

FILE: app/consts/screen.js
  constant INTRO (line 1) | const INTRO = 'intro'
  constant DATS (line 2) | const DATS = 'dats'
  constant DOWNLOAD (line 3) | const DOWNLOAD = 'download'
  constant INSPECT (line 4) | const INSPECT = 'inspect'

FILE: dev/react-dev-tools/build/backend.js
  function __webpack_require__ (line 6) | function __webpack_require__(moduleId) {
  function welcome (line 64) | function welcome(evt) {
  function setup (line 73) | function setup(hook) {
  function defineProperties (line 157) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 159) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _possibleConstructorReturn (line 161) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
  function _inherits (line 163) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function Agent (line 236) | function Agent(global, capabilities) {
  function EventEmitter (line 838) | function EventEmitter() {
  function g (line 976) | function g() {
  function isFunction (line 1104) | function isFunction(arg) {
  function isNumber (line 1108) | function isNumber(arg) {
  function isObject (line 1112) | function isObject(arg) {
  function isUndefined (line 1116) | function isUndefined(arg) {
  function toObject (line 1130) | function toObject(val) {
  function guid (line 1198) | function guid() {
  function _toConsumableArray (line 1210) | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i ...
  function getIn (line 1230) | function getIn(base, path) {
  function defineProperties (line 1265) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 1269) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function ProfileCollector (line 1288) | function ProfileCollector(agent) {
  function init (line 1383) | function init(agent) {
  function defineProperties (line 1409) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 1411) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function TraceUpdatesBackendManager (line 1422) | function TraceUpdatesBackendManager(agent) {
  function init (line 1485) | function init(agent) {
  function sliceIterator (line 1511) | function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = ...
  function defineProperties (line 1513) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 1515) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function TraceUpdatesAbstractNodeMeasurer (line 1544) | function TraceUpdatesAbstractNodeMeasurer() {
  function makeEmptyFunction (line 1794) | function makeEmptyFunction(arg) {
  function emptyFunction (line 1805) | function emptyFunction() {}
  function createClass (line 1861) | function createClass(ctor, superClass) {
  function Iterable (line 1868) | function Iterable(value) {
  function KeyedIterable (line 1874) | function KeyedIterable(value) {
  function IndexedIterable (line 1880) | function IndexedIterable(value) {
  function SetIterable (line 1886) | function SetIterable(value) {
  function isIterable (line 1892) | function isIterable(maybeIterable) {
  function isKeyed (line 1896) | function isKeyed(maybeKeyed) {
  function isIndexed (line 1900) | function isIndexed(maybeIndexed) {
  function isAssociative (line 1904) | function isAssociative(maybeAssociative) {
  function isOrdered (line 1908) | function isOrdered(maybeOrdered) {
  function MakeRef (line 1944) | function MakeRef(ref) {
  function SetRef (line 1949) | function SetRef(ref) {
  function OwnerID (line 1956) | function OwnerID() {}
  function arrCopy (line 1959) | function arrCopy(arr, offset) {
  function ensureSize (line 1969) | function ensureSize(iter) {
  function wrapIndex (line 1976) | function wrapIndex(iter, index) {
  function returnTrue (line 1994) | function returnTrue() {
  function wholeSlice (line 1998) | function wholeSlice(begin, end, size) {
  function resolveBegin (line 2003) | function resolveBegin(begin, size) {
  function resolveEnd (line 2007) | function resolveEnd(end, size) {
  function resolveIndex (line 2011) | function resolveIndex(index, size, defaultIndex) {
  function Iterator (line 2033) | function Iterator(next) {
  function iteratorValue (line 2053) | function iteratorValue(type, k, v, iteratorResult) {
  function iteratorDone (line 2061) | function iteratorDone() {
  function hasIterator (line 2065) | function hasIterator(maybeIterable) {
  function isIterator (line 2069) | function isIterator(maybeIterator) {
  function getIterator (line 2073) | function getIterator(iterable) {
  function getIteratorFn (line 2078) | function getIteratorFn(iterable) {
  function isArrayLike (line 2088) | function isArrayLike(value) {
  function Seq (line 2093) | function Seq(value) {
  function KeyedSeq (line 2133) | function KeyedSeq(value) {
  function IndexedSeq (line 2148) | function IndexedSeq(value) {
  function SetSeq (line 2177) | function SetSeq(value) {
  function ArraySeq (line 2207) | function ArraySeq(array) {
  function ObjectSeq (line 2241) | function ObjectSeq(object) {
  function IterableSeq (line 2289) | function IterableSeq(iterable) {
  function IteratorSeq (line 2331) | function IteratorSeq(iterator) {
  function isSeq (line 2383) | function isSeq(maybeSeq) {
  function emptySequence (line 2389) | function emptySequence() {
  function keyedSeqFromValue (line 2393) | function keyedSeqFromValue(value) {
  function indexedSeqFromValue (line 2409) | function indexedSeqFromValue(value) {
  function seqFromValue (line 2419) | function seqFromValue(value) {
  function maybeIndexedSeqFromValue (line 2430) | function maybeIndexedSeqFromValue(value) {
  function seqIterate (line 2439) | function seqIterate(seq, fn, reverse, useKeys) {
  function seqIterator (line 2454) | function seqIterator(seq, type, reverse, useKeys) {
  function fromJS (line 2469) | function fromJS(json, converter) {
  function fromJSWith (line 2475) | function fromJSWith(converter, json, key, parentJSON) {
  function fromJSDefault (line 2485) | function fromJSDefault(json) {
  function isPlainObj (line 2495) | function isPlainObj(value) {
  function is (line 2553) | function is(valueA, valueB) {
  function deepEqual (line 2579) | function deepEqual(a, b) {
  function Repeat (line 2638) | function Repeat(value, times) {
  function invariant (line 2716) | function invariant(condition, error) {
  function Range (line 2722) | function Range(start, end, step) {
  function Collection (line 2834) | function Collection() {
  function KeyedCollection (line 2839) | function KeyedCollection() {}
  function IndexedCollection (line 2841) | function IndexedCollection() {}
  function SetCollection (line 2843) | function SetCollection() {}
  function smi (line 2866) | function smi(i32) {
  function hash (line 2870) | function hash(o) {
  function cachedHashString (line 2910) | function cachedHashString(string) {
  function hashString (line 2925) | function hashString(string) {
  function hashJSObj (line 2939) | function hashJSObj(obj) {
  function getIENodeHash (line 3019) | function getIENodeHash(node) {
  function assertNotInfinite (line 3049) | function assertNotInfinite(size) {
  function Map (line 3060) | function Map(value) {
  function isMap (line 3228) | function isMap(maybeMap) {
  function ArrayMapNode (line 3246) | function ArrayMapNode(ownerID, entries) {
  function BitmapIndexedNode (line 3312) | function BitmapIndexedNode(ownerID, bitmap, nodes) {
  function HashArrayMapNode (line 3381) | function HashArrayMapNode(ownerID, count, nodes) {
  function HashCollisionNode (line 3439) | function HashCollisionNode(ownerID, keyHash, entries) {
  function ValueNode (line 3515) | function ValueNode(ownerID, keyHash, entry) {
  function MapIterator (line 3582) | function MapIterator(map, type, reverse) {
  function mapIteratorValue (line 3623) | function mapIteratorValue(type, entry) {
  function mapIteratorFrame (line 3627) | function mapIteratorFrame(node, prev) {
  function makeMap (line 3635) | function makeMap(size, root, ownerID, hash) {
  function emptyMap (line 3646) | function emptyMap() {
  function updateMap (line 3650) | function updateMap(map, k, v) {
  function updateNode (line 3678) | function updateNode(node, ownerID, shift, keyHash, key, value, didChange...
  function isLeafNode (line 3690) | function isLeafNode(node) {
  function mergeIntoNode (line 3694) | function mergeIntoNode(node, ownerID, shift, keyHash, entry) {
  function createNodes (line 3710) | function createNodes(ownerID, entries, key, value) {
  function packNodes (line 3722) | function packNodes(ownerID, nodes, count, excluding) {
  function expandNodes (line 3736) | function expandNodes(ownerID, nodes, bitmap, including, node) {
  function mergeIntoMapWith (line 3746) | function mergeIntoMapWith(map, merger, iterables) {
  function deepMerger (line 3759) | function deepMerger(existing, value, key) {
  function deepMergerWith (line 3765) | function deepMergerWith(merger) {
  function mergeIntoCollectionWith (line 3775) | function mergeIntoCollectionWith(collection, merger, iters) {
  function updateInDeepMap (line 3799) | function updateInDeepMap(existing, keyPathIter, notSetValue, updater) {
  function popCount (line 3824) | function popCount(x) {
  function setIn (line 3833) | function setIn(array, idx, val, canEdit) {
  function spliceIn (line 3839) | function spliceIn(array, idx, val, canEdit) {
  function spliceOut (line 3858) | function spliceOut(array, idx, canEdit) {
  function List (line 3883) | function List(value) {
  function isList (line 4058) | function isList(maybeList) {
  function VNode (line 4083) | function VNode(array, ownerID) {
  function iterateList (line 4152) | function iterateList(list, reverse) {
  function makeList (line 4211) | function makeList(origin, capacity, level, root, tail, ownerID, hash) {
  function emptyList (line 4226) | function emptyList() {
  function updateList (line 4230) | function updateList(list, index, value) {
  function updateVNode (line 4270) | function updateVNode(node, ownerID, level, index, value, didAlter) {
  function editableVNode (line 4305) | function editableVNode(node, ownerID) {
  function listNodeFor (line 4312) | function listNodeFor(list, rawIndex) {
  function setListBounds (line 4327) | function setListBounds(list, begin, end) {
  function mergeIntoListWith (line 4450) | function mergeIntoListWith(list, merger, iterables) {
  function getTailOffset (line 4470) | function getTailOffset(size) {
  function OrderedMap (line 4478) | function OrderedMap(value) {
  function isOrderedMap (line 4557) | function isOrderedMap(maybeOrderedMap) {
  function makeOrderedMap (line 4568) | function makeOrderedMap(map, list, ownerID, hash) {
  function emptyOrderedMap (line 4579) | function emptyOrderedMap() {
  function updateOrderedMap (line 4583) | function updateOrderedMap(omap, k, v) {
  function ToKeyedSequence (line 4627) | function ToKeyedSequence(indexed, useKeys) {
  function ToIndexedSequence (line 4689) | function ToIndexedSequence(iter) {
  function ToSetSequence (line 4716) | function ToSetSequence(iter) {
  function FromEntriesSequence (line 4741) | function FromEntriesSequence(entries) {
  function flipFactory (line 4799) | function flipFactory(iterable) {
  function mapFactory (line 4837) | function mapFactory(iterable, mapper, context) {
  function reverseFactory (line 4874) | function reverseFactory(iterable, useKeys) {
  function filterFactory (line 4901) | function filterFactory(iterable, predicate, context, useKeys) {
  function countByFactory (line 4946) | function countByFactory(iterable, grouper, context) {
  function groupByFactory (line 4959) | function groupByFactory(iterable, grouper, context) {
  function sliceFactory (line 4973) | function sliceFactory(iterable, begin, end, useKeys) {
  function takeWhileFactory (line 5074) | function takeWhileFactory(iterable, predicate, context) {
  function skipWhileFactory (line 5115) | function skipWhileFactory(iterable, predicate, context, useKeys) {
  function concatFactory (line 5164) | function concatFactory(iterable, values) {
  function flattenFactory (line 5212) | function flattenFactory(iterable, depth, useKeys) {
  function flatMapFactory (line 5259) | function flatMapFactory(iterable, mapper, context) {
  function interposeFactory (line 5267) | function interposeFactory(iterable, separator) {
  function sortFactory (line 5299) | function sortFactory(iterable, comparator, mapper) {
  function maxFactory (line 5319) | function maxFactory(iterable, comparator, mapper) {
  function maxCompare (line 5333) | function maxCompare(comparator, a, b) {
  function zipWithFactory (line 5341) | function zipWithFactory(keyIter, zipper, iters) {
  function reify (line 5398) | function reify(iter, seq) {
  function validateEntry (line 5402) | function validateEntry(entry) {
  function resolveSize (line 5408) | function resolveSize(iter) {
  function iterableClass (line 5413) | function iterableClass(iterable) {
  function makeSequence (line 5419) | function makeSequence(iterable) {
  function cacheResultThrough (line 5429) | function cacheResultThrough() {
  function defaultComparator (line 5439) | function defaultComparator(a, b) {
  function forceIterator (line 5443) | function forceIterator(keyPath) {
  function Record (line 5458) | function Record(defaultValues, name) {
  function makeRecord (line 5581) | function makeRecord(likeRecord, map, ownerID) {
  function recordName (line 5588) | function recordName(record) {
  function setProps (line 5592) | function setProps(prototype, names) {
  function setProp (line 5600) | function setProp(prototype, name) {
  function Set (line 5616) | function Set(value) {
  function isSet (line 5749) | function isSet(maybeSet) {
  function updateSet (line 5769) | function updateSet(set, newMap) {
  function makeSet (line 5780) | function makeSet(map, ownerID) {
  function emptySet (line 5789) | function emptySet() {
  function OrderedSet (line 5797) | function OrderedSet(value) {
  function isOrderedSet (line 5820) | function isOrderedSet(maybeOrderedSet) {
  function makeOrderedSet (line 5832) | function makeOrderedSet(map, ownerID) {
  function emptyOrderedSet (line 5841) | function emptyOrderedSet() {
  function Stack (line 5849) | function Stack(value) {
  function isStack (line 6030) | function isStack(maybeStack) {
  function makeStack (line 6046) | function makeStack(size, head, ownerID, hash) {
  function emptyStack (line 6057) | function emptyStack() {
  function mixin (line 6064) | function mixin(ctor, methods) {
  function keyMapper (line 6737) | function keyMapper(v, k) {
  function entryMapper (line 6741) | function entryMapper(v, k) {
  function not (line 6745) | function not(predicate) {
  function neg (line 6751) | function neg(predicate) {
  function quoteString (line 6757) | function quoteString(value) {
  function defaultZipper (line 6761) | function defaultZipper() {
  function defaultNegComparator (line 6765) | function defaultNegComparator(a, b) {
  function hashIterable (line 6769) | function hashIterable(iterable) {
  function murmurHashOfSize (line 6788) | function murmurHashOfSize(size, h) {
  function hashMerge (line 6799) | function hashMerge(a, b) {
  function sliceIterator (line 6846) | function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = ...
  function defineProperties (line 6848) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 6850) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function TraceUpdatesAbstractNodePresenter (line 6870) | function TraceUpdatesAbstractNodePresenter() {
  function defineProperties (line 7032) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 7034) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _possibleConstructorReturn (line 7036) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
  function _inherits (line 7038) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function TraceUpdatesWebNodeMeasurer (line 7058) | function TraceUpdatesWebNodeMeasurer() {
  function sliceIterator (line 7114) | function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = ...
  function defineProperties (line 7116) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 7118) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _possibleConstructorReturn (line 7120) | function _possibleConstructorReturn(self, call) { if (!self) { throw new...
  function _inherits (line 7122) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function drawBorder (line 7136) | function drawBorder(ctx, measurement, borderWidth, borderColor) {
  function TraceUpdatesWebNodePresenter (line 7167) | function TraceUpdatesWebNodePresenter() {
  function defineProperties (line 7274) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _toConsumableArray (line 7276) | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i ...
  function _classCallCheck (line 7278) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function getWindowFunction (line 7287) | function getWindowFunction(name, polyfill) {
  function Bridge (line 7376) | function Bridge(wall) {
  function hydrate (line 8198) | function hydrate(data, cleaned) {
  function getPropType (line 8240) | function getPropType(data) {
  function createDehydrated (line 8276) | function createDehydrated(type, data, cleaned, path) {
  function dehydrate (line 8315) | function dehydrate(data, cleaned) {
  function attachRenderer (line 8668) | function attachRenderer(hook, rid, renderer) {
  function walkRoots (line 8818) | function walkRoots(roots, onMount, onRoot, isPre013) {
  function walkNode (line 8825) | function walkNode(internalInstance, onMount, isPre013) {
  function decorateResult (line 8835) | function decorateResult(obj, attr, fn) {
  function decorate (line 8845) | function decorate(obj, attr, fn) {
  function decorateMany (line 8855) | function decorateMany(source, fns) {
  function restoreMany (line 8863) | function restoreMany(source, olds) {
  function getData (line 8904) | function getData(internalInstance) {
  function setInProps (line 9055) | function setInProps(internalInst, forceUpdate, path, value) {
  function setInState (line 9063) | function setInState(inst, path, value) {
  function setInContext (line 9068) | function setInContext(inst, forceUpdate, path, value) {
  function setIn (line 9073) | function setIn(obj, path, value) {
  function childrenList (line 9083) | function childrenList(children) {
  function copyWithSetImpl (line 9111) | function copyWithSetImpl(obj, path, idx, value) {
  function copyWithSet (line 9122) | function copyWithSet(obj, path, value) {
  function getDisplayName (line 9147) | function getDisplayName(type) {
  function escape (line 9223) | function escape(key) {
  function getComponentKey (line 9243) | function getComponentKey(component, index) {
  function traverseAllChildrenImpl (line 9264) | function traverseAllChildrenImpl(children, nameSoFar, callback, traverse...
  function invariant (line 9345) | function invariant(condition, format, a, b, c, d, e, f) {
  function defaultSetTimout (line 9388) | function defaultSetTimout() {
  function defaultClearTimeout (line 9391) | function defaultClearTimeout () {
  function runTimeout (line 9414) | function runTimeout(fun) {
  function runClearTimeout (line 9439) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 9471) | function cleanUpNextTick() {
  function drainQueue (line 9486) | function drainQueue() {
  function Item (line 9524) | function Item(fun, array) {
  function noop (line 9538) | function noop() {}
  function getData012 (line 9582) | function getData012(internalInstance) {
  function setInProps (line 9673) | function setInProps(inst, path, value) {
  function setInState (line 9678) | function setInState(inst, path, value) {
  function setInContext (line 9683) | function setInContext(inst, path, value) {
  function setIn (line 9688) | function setIn(obj, path, value) {
  function childrenList (line 9698) | function childrenList(children) {
  function getInternalReactConstants (line 9731) | function getInternalReactConstants(version) {
  function attachRendererFiber (line 9842) | function attachRendererFiber(hook, rid, renderer) {
  function parse (line 10662) | function parse(version, loose) {
  function valid (line 10684) | function valid(version, loose) {
  function clean (line 10691) | function clean(version, loose) {
  function SemVer (line 10698) | function SemVer(version, loose) {
  function inc (line 10911) | function inc(version, release, loose, identifier) {
  function diff (line 10925) | function diff(version1, version2) {
  function compareIdentifiers (line 10954) | function compareIdentifiers(a, b) {
  function rcompareIdentifiers (line 10971) | function rcompareIdentifiers(a, b) {
  function major (line 10976) | function major(a, loose) {
  function minor (line 10981) | function minor(a, loose) {
  function patch (line 10986) | function patch(a, loose) {
  function compare (line 10991) | function compare(a, b, loose) {
  function compareLoose (line 10996) | function compareLoose(a, b) {
  function rcompare (line 11001) | function rcompare(a, b, loose) {
  function sort (line 11006) | function sort(list, loose) {
  function rsort (line 11013) | function rsort(list, loose) {
  function gt (line 11020) | function gt(a, b, loose) {
  function lt (line 11025) | function lt(a, b, loose) {
  function eq (line 11030) | function eq(a, b, loose) {
  function neq (line 11035) | function neq(a, b, loose) {
  function gte (line 11040) | function gte(a, b, loose) {
  function lte (line 11045) | function lte(a, b, loose) {
  function cmp (line 11050) | function cmp(a, op, b, loose) {
  function Comparator (line 11075) | function Comparator(comp, loose) {
  function Range (line 11174) | function Range(range, loose) {
  function toComparators (line 11278) | function toComparators(range, loose) {
  function parseComparator (line 11289) | function parseComparator(comp, loose) {
  function isX (line 11302) | function isX(id) {
  function replaceTildes (line 11312) | function replaceTildes(comp, loose) {
  function replaceTilde (line 11318) | function replaceTilde(comp, loose) {
  function replaceCarets (line 11353) | function replaceCarets(comp, loose) {
  function replaceCaret (line 11359) | function replaceCaret(comp, loose) {
  function replaceXRanges (line 11408) | function replaceXRanges(comp, loose) {
  function replaceXRange (line 11415) | function replaceXRange(comp, loose) {
  function replaceStars (line 11481) | function replaceStars(comp, loose) {
  function hyphenReplace (line 11492) | function hyphenReplace($0,
  function testSet (line 11535) | function testSet(set, version) {
  function satisfies (line 11569) | function satisfies(version, range, loose) {
  function maxSatisfying (line 11579) | function maxSatisfying(versions, range, loose) {
  function minSatisfying (line 11599) | function minSatisfying(versions, range, loose) {
  function validRange (line 11619) | function validRange(range, loose) {
  function ltr (line 11631) | function ltr(version, range, loose) {
  function gtr (line 11637) | function gtr(version, range, loose) {
  function outside (line 11642) | function outside(version, range, hilo, loose) {
  function prerelease (line 11712) | function prerelease(version, loose) {
  function intersects (line 11718) | function intersects(r1, r2, loose) {
  function coerce (line 11725) | function coerce(version) {
  function _defineProperty (line 11760) | function _defineProperty(obj, key, value) { if (key in obj) { Object.def...
  function measureStyle (line 11810) | function measureStyle(agent, bridge, resolveRNStyle, id) {
  function shallowClone (line 11854) | function shallowClone(obj) {
  function renameStyle (line 11862) | function renameStyle(agent, id, oldName, newName, val) {
  function setStyle (line 11921) | function setStyle(agent, id, attr, val) {
  function resolveBoxStyle (line 11987) | function resolveBoxStyle(prefix, style) {
  function capFirst (line 12018) | function capFirst(text) {
  function defineProperties (line 12085) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 12087) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function Highlighter (line 12098) | function Highlighter(win, onSelect) {
  function captureSubscription (line 12231) | function captureSubscription(obj, evt, cb) {
  function makeMagnifier (line 12238) | function makeMagnifier() {
  function defineProperties (line 12271) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 12273) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function Overlay (line 12286) | function Overlay(window) {
  function findTipPos (line 12391) | function findTipPos(dims, win) {
  function getElementDimensions (line 12422) | function getElementDimensions(domElement) {
  function getOwnerWindow (line 12444) | function getOwnerWindow(node) {
  function getOwnerIframe (line 12453) | function getOwnerIframe(node) {
  function getBoundingClientRectWithBorderOffset (line 12463) | function getBoundingClientRectWithBorderOffset(node) {
  function mergeRectOffsets (line 12481) | function mergeRectOffsets(rects) {
  function getNestedBoundingClientRect (line 12500) | function getNestedBoundingClientRect(node, boundaryWindow) {
  function boxWrap (line 12528) | function boxWrap(dims, what, node) {
  function defineProperties (line 12597) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 12599) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function MultiOverlay (line 12604) | function MultiOverlay(window) {
  function decorate (line 12730) | function decorate(obj, attr, fn) {
  function sendStoreData (line 12758) | function sendStoreData() {

FILE: dev/react-dev-tools/build/background.js
  function __webpack_require__ (line 2) | function __webpack_require__(moduleId) {
  function isNumeric (line 17) | function isNumeric(str) {
  function installContentScript (line 20) | function installContentScript(tabId) {
  function doublePipe (line 25) | function doublePipe(one, two) {
  function setIconAndPopup (line 39) | function setIconAndPopup(reactBuildType, tabId) {

FILE: dev/react-dev-tools/build/contentScript.js
  function __webpack_require__ (line 2) | function __webpack_require__(moduleId) {
  function handleMessageFromDevtools (line 17) | function handleMessageFromDevtools(message) {
  function handleMessageFromPage (line 23) | function handleMessageFromPage(evt) {
  function handleDisconnect (line 26) | function handleDisconnect() {

FILE: dev/react-dev-tools/build/inject.js
  function __webpack_require__ (line 2) | function __webpack_require__(moduleId) {
  function installGlobalHook (line 31) | function installGlobalHook(window) {
  function installRelayHook (line 108) | function installRelayHook(window) {

FILE: dev/react-dev-tools/build/main.js
  function __webpack_require__ (line 2) | function __webpack_require__(moduleId) {
  function createPanelIfReactLoaded (line 17) | function createPanelIfReactLoaded() {

FILE: dev/react-dev-tools/build/panel.js
  function __webpack_require__ (line 2) | function __webpack_require__(moduleId) {
  function reload (line 17) | function reload() {
  function _toConsumableArray (line 122) | function _toConsumableArray(arr) {
  function _classCallCheck (line 129) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 132) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 136) | function _inherits(subClass, superClass) {
  function defineProperties (line 148) | function defineProperties(target, props) {
  function Panel (line 160) | function Panel(props) {
  function shim (line 447) | function shim(props, propName, componentName, location, propFullName, se...
  function getShim (line 450) | function getShim() {
  function makeEmptyFunction (line 478) | function makeEmptyFunction(arg) {
  function invariant (line 493) | function invariant(condition, format, a, b, c, d, e, f) {
  function A (line 524) | function A(a, b, d, c, e, g, h, f) {
  function B (line 535) | function B(a) {
  function E (line 539) | function E(a, b, d) {
  function F (line 542) | function F() {}
  function G (line 543) | function G(a, b, d) {
  function L (line 546) | function L(a, b, d) {
  function M (line 565) | function M(a, b) {
  function N (line 575) | function N(a) {
  function escape (line 578) | function escape(a) {
  function Q (line 587) | function Q(a, b, d, c) {
  function R (line 600) | function R(a) {
  function S (line 604) | function S(a, b, d, c) {
  function U (line 632) | function U(a, b, d) {
  function T (line 635) | function T(a, b) {
  function V (line 638) | function V(a, b) {
  function aa (line 641) | function aa(a, b, d) {
  function W (line 648) | function W(a, b, d, c, e) {
  function ba (line 653) | function ba(a, b) {
  function toObject (line 784) | function toObject(val) {
  function shouldUseNative (line 788) | function shouldUseNative() {
  function _classCallCheck (line 820) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 823) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 827) | function _inherits(subClass, superClass) {
  function shouldUseVerticalLayout (line 838) | function shouldUseVerticalLayout(window) {
  function defineProperties (line 848) | function defineProperties(target, props) {
  function Container (line 860) | function Container(props) {
  function _toConsumableArray (line 976) | function _toConsumableArray(arr) {
  function _classCallCheck (line 983) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 986) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 990) | function _inherits(subClass, superClass) {
  function defineProperties (line 1002) | function defineProperties(target, props) {
  function ContextMenu (line 1014) | function ContextMenu(props) {
  function _classCallCheck (line 1166) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1169) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1173) | function _inherits(subClass, superClass) {
  function defineProperties (line 1185) | function defineProperties(target, props) {
  function HighlightHover (line 1197) | function HighlightHover(props) {
  function toObject (line 1231) | function toObject(val) {
  function _defineProperty (line 1249) | function _defineProperty(obj, key, value) {
  function _classCallCheck (line 1257) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1260) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1264) | function _inherits(subClass, superClass) {
  function arrayDiff (line 1275) | function arrayDiff(array, oldArray) {
  function setToArray (line 1283) | function setToArray(set) {
  function defineProperties (line 1308) | function defineProperties(target, props) {
  function Wrapper (line 1322) | function Wrapper(props) {
  function _classCallCheck (line 1378) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1381) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1385) | function _inherits(subClass, superClass) {
  function defineProperties (line 1397) | function defineProperties(target, props) {
  function PropState (line 1409) | function PropState() {
  function _classCallCheck (line 1571) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1574) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1578) | function _inherits(subClass, superClass) {
  function defineProperties (line 1590) | function defineProperties(target, props) {
  function BlurInput (line 1602) | function BlurInput(props) {
  function _objectWithoutProperties (line 1651) | function _objectWithoutProperties(obj, keys) {
  function _classCallCheck (line 1681) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1684) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1688) | function _inherits(subClass, superClass) {
  function alphanumericSort (line 1699) | function alphanumericSort(a, b) {
  function defineProperties (line 1707) | function defineProperties(target, props) {
  function DataView (line 1719) | function DataView() {
  function DataItem (line 1796) | function DataItem(props) {
  function _classCallCheck (line 1971) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 1974) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 1978) | function _inherits(subClass, superClass) {
  function textToValue (line 1989) | function textToValue(txt) {
  function valueToText (line 1997) | function valueToText(value) {
  function defineProperties (line 2001) | function defineProperties(target, props) {
  function Simple (line 2013) | function Simple(props) {
  function checkDCE (line 2129) | function checkDCE() {
  function ca (line 2147) | function ca(a, b, c, d, e, f, g, h) {
  function t (line 2158) | function t(a) {
  function da (line 2162) | function da(a, b, c, d, e, f, g, h, k) {
  function ka (line 2170) | function ka(a, b, c, d, e, f, g, h, k) {
  function la (line 2173) | function la(a, b, c, d, e, f, g, h, k) {
  function oa (line 2182) | function oa() {
  function ra (line 2200) | function ra(a, b, c) {
  function xa (line 2203) | function xa(a, b, c, d) {
  function ya (line 2206) | function ya(a, b) {
  function za (line 2210) | function za(a, b, c) {
  function Ba (line 2213) | function Ba(a, b) {
  function Ca (line 2220) | function Ca(a) {
  function Da (line 2223) | function Da(a) {
  function Fa (line 2226) | function Fa(a, b) {
  function Ga (line 2253) | function Ga(a, b) {
  function Ka (line 2257) | function Ka(a) {
  function La (line 2265) | function La(a) {
  function Ma (line 2268) | function Ma(a) {
  function Na (line 2271) | function Na(a) {
  function Oa (line 2274) | function Oa(a) {
  function Pa (line 2278) | function Pa(a, b, c) {
  function Qa (line 2282) | function Qa(a) {
  function Ra (line 2289) | function Ra(a, b, c) {
  function Ta (line 2293) | function Ta(a) {
  function Ua (line 2296) | function Ua(a) {
  function Wa (line 2299) | function Wa(a, b) {
  function ab (line 2304) | function ab(a) {
  function jb (line 2311) | function jb() {
  function kb (line 2319) | function kb() {
  function lb (line 2322) | function lb() {
  function z (line 2325) | function z(a, b, c, d) {
  function nb (line 2331) | function nb(a, b, c, d) {
  function ob (line 2338) | function ob(a) {
  function mb (line 2341) | function mb(a) {
  function zb (line 2344) | function zb(a, b) {
  function Ab (line 2361) | function Ab(a) {
  function Cb (line 2364) | function Cb(a, b) {
  function Db (line 2379) | function Db(a, b) {
  function Ib (line 2400) | function Ib(a) {
  function Jb (line 2407) | function Jb(a) {
  function Kb (line 2410) | function Kb() {
  function Lb (line 2416) | function Lb(a, b) {
  function Mb (line 2419) | function Mb(a, b, c) {
  function Nb (line 2422) | function Nb() {}
  function Pb (line 2423) | function Pb(a, b) {
  function Rb (line 2432) | function Rb(a) {
  function Sb (line 2436) | function Sb(a) {
  function Tb (line 2440) | function Tb(a) {
  function Ub (line 2447) | function Ub(a) {
  function Vb (line 2451) | function Vb(a) {
  function Wb (line 2478) | function Wb(a) {
  function Xb (line 2481) | function Xb(a) {
  function kc (line 2489) | function kc(a) {
  function lc (line 2493) | function lc(a) {
  function mc (line 2532) | function mc(a) {
  function sc (line 2555) | function sc(a) {
  function tc (line 2559) | function tc(a, b, c, d) {
  function uc (line 2574) | function uc(a, b, c, d) {
  function D (line 2592) | function D(a, b, c, d, e) {
  function wc (line 2596) | function wc(a) {
  function xc (line 2599) | function xc(a, b, c, d) {
  function yc (line 2605) | function yc(a) {
  function zc (line 2618) | function zc(a, b) {
  function Bc (line 2627) | function Bc(a, b) {
  function Cc (line 2635) | function Cc(a, b) {
  function Dc (line 2638) | function Dc(a, b) {
  function Fc (line 2645) | function Fc(a, b, c) {
  function Ec (line 2654) | function Ec(a, b, c) {
  function Hc (line 2657) | function Hc(a, b, c) {
  function Kc (line 2660) | function Kc(a) {
  function Lc (line 2663) | function Lc(a) {
  function Mc (line 2667) | function Mc(a, b) {
  function Oc (line 2670) | function Oc() {
  function Pc (line 2673) | function Pc(a) {
  function Qc (line 2676) | function Qc(a, b, c) {
  function Rc (line 2679) | function Rc(a) {
  function Sc (line 2682) | function Sc(a, b) {
  function Tc (line 2685) | function Tc(a, b) {
  function Xc (line 2688) | function Xc(a) {
  function Yc (line 2692) | function Yc() {
  function hd (line 2695) | function hd(a, b) {
  function id (line 2698) | function id(a, b) {
  function jd (line 2706) | function jd(a) {
  function kd (line 2714) | function kd(a) {
  function ld (line 2717) | function ld(a) {
  function md (line 2763) | function md(a) {
  function qd (line 2778) | function qd(a) {
  function Bd (line 2783) | function Bd(a, b) {
  function Fd (line 2796) | function Fd(a) {
  function F (line 2819) | function F(a, b) {
  function Jd (line 2824) | function Jd(a, b) {
  function Hd (line 2829) | function Hd(a, b) {
  function Id (line 2832) | function Id(a, b) {
  function Nd (line 2853) | function Nd(a) {
  function Od (line 2857) | function Od(a) {
  function Qd (line 2865) | function Qd(a) {
  function Rd (line 2869) | function Rd(a, b) {
  function Sd (line 2893) | function Sd(a, b) {
  function Td (line 2896) | function Td() {
  function Ud (line 2907) | function Ud(a) {
  function ae (line 2911) | function ae(a, b) {
  function ce (line 2925) | function ce(a) {
  function de (line 2931) | function de(a, b) {
  function ee (line 2936) | function ee(a, b, c, d) {
  function fe (line 2950) | function fe(a, b) {
  function ge (line 2957) | function ge(a, b) {
  function he (line 2965) | function he(a, b) {
  function ie (line 2970) | function ie(a) {
  function ke (line 2974) | function ke(a) {
  function le (line 2986) | function le(a, b) {
  function oe (line 2989) | function oe(a, b) {
  function re (line 2996) | function re(a, b) {
  function te (line 3004) | function te(a, b) {
  function ue (line 3009) | function ue(a, b) {
  function ve (line 3026) | function ve(a, b) {
  function we (line 3060) | function we() {}
  function ze (line 3061) | function ze(a, b) {
  function Ae (line 3071) | function Ae(a, b) {
  function Be (line 3074) | function Be(a) {
  function Ce (line 3078) | function Ce(a) {
  function G (line 3082) | function G(a) {
  function H (line 3085) | function H(a, b) {
  function He (line 3088) | function He(a, b) {
  function K (line 3098) | function K(a) {
  function Ie (line 3101) | function Ie(a) {
  function Je (line 3104) | function Je(a) {
  function Ke (line 3107) | function Ke(a, b, c) {
  function Le (line 3110) | function Le(a, b, c) {
  function Me (line 3117) | function Me(a) {
  function Ne (line 3122) | function Ne(a, b, c) {
  function Qe (line 3127) | function Qe(a) {
  function Re (line 3134) | function Re(a) {
  function Se (line 3148) | function Se(a, b, c, d) {
  function Te (line 3154) | function Te(a) {
  function Ue (line 3157) | function Ue(a, b, c) {
  function Ve (line 3167) | function Ve(a, b, c) {
  function We (line 3214) | function We(a, b, c, d) {
  function Xe (line 3217) | function Xe(a, b, c) {
  function Ye (line 3220) | function Ye(a, b, c) {
  function Ze (line 3228) | function Ze(a, b) {
  function $e (line 3234) | function $e(a, b) {
  function bf (line 3239) | function bf(a) {
  function cf (line 3252) | function cf(a) {
  function df (line 3265) | function df(a) {
  function ef (line 3275) | function ef(a, b) {
  function ff (line 3279) | function ff(a, b) {
  function gf (line 3289) | function gf(a, b) {
  function hf (line 3294) | function hf(a, b) {
  function jf (line 3298) | function jf(a, b, c, d, e, f) {
  function kf (line 3315) | function kf(a, b, c, d, e) {
  function lf (line 3333) | function lf(a, b, c) {
  function mf (line 3339) | function mf(a, b) {
  function nf (line 3350) | function nf(a, b) {
  function sf (line 3357) | function sf(a, b) {
  function tf (line 3361) | function tf(a) {
  function uf (line 3365) | function uf(a) {
  function vf (line 3368) | function vf(a, b) {
  function zf (line 3377) | function zf(a) {
  function Af (line 3380) | function Af(a, b) {
  function Bf (line 3394) | function Bf(a) {
  function Cf (line 3397) | function Cf(a) {
  function Df (line 3402) | function Df(a) {
  function Ff (line 3405) | function Ff(a, b, c, d) {
  function Kf (line 3409) | function Kf(a, b, c, d, e, f, g) {
  function Lf (line 3412) | function Lf(a, b, c, d) {
  function Mf (line 3417) | function Mf(a, b, c, d) {
  function Of (line 3426) | function Of(a, b, c) {
  function Pf (line 3442) | function Pf(a, b) {
  function Qf (line 3445) | function Qf(a) {
  function Wf (line 3641) | function Wf(a, b) {
  function Xf (line 3646) | function Xf(a, b) {
  function Yf (line 3661) | function Yf(a) {
  function Zf (line 3674) | function Zf(a) {
  function $f (line 3678) | function $f(a) {
  function ag (line 3686) | function ag() {
  function bg (line 3689) | function bg(a) {
  function M (line 3714) | function M(a, b, c, d) {
  function dg (line 3717) | function dg(a, b, c, d, e) {
  function fg (line 3723) | function fg(a, b) {
  function gg (line 3727) | function gg(a, b, c, d, e) {
  function hg (line 3732) | function hg(a, b, c, d, e) {
  function ig (line 3774) | function ig(a, b, c, d, e, f) {
  function jg (line 3784) | function jg(a) {
  function ng (line 3789) | function ng(a, b) {
  function og (line 3796) | function og(a, b, c, d) {
  function eg (line 3827) | function eg(a, b, c) {
  function pg (line 3838) | function pg(a, b, c) {
  function qg (line 3984) | function qg(a) {
  function ug (line 3987) | function ug(a, b) {
  function vg (line 3999) | function vg(a) {
  function xg (line 4007) | function xg(a) {
  function zg (line 4028) | function zg(a) {
  function Ag (line 4031) | function Ag(a) {
  function yg (line 4095) | function yg(a) {
  function Bg (line 4140) | function Bg(a, b) {
  function Cg (line 4192) | function Cg(a, b, c) {
  function Eg (line 4201) | function Eg(a, b, c) {
  function Gg (line 4212) | function Gg(a) {
  function Pg (line 4243) | function Pg() {
  function Qg (line 4275) | function Qg(a) {
  function Rg (line 4538) | function Rg(a) {
  function Sg (line 4542) | function Sg(a, b, c) {
  function wg (line 4598) | function wg(a, b) {
  function Hf (line 4622) | function Hf(a, b) {
  function If (line 4627) | function If(a, b) {
  function bh (line 4652) | function bh(a, b, c, d, e) {
  function oh (line 4661) | function oh() {
  function Zg (line 4664) | function Zg(a, b) {
  function Gf (line 4673) | function Gf() {
  function qh (line 4676) | function qh() {
  function ph (line 4701) | function ph(a) {
  function Yg (line 4712) | function Yg(a, b) {
  function Xg (line 4727) | function Xg(a, b, c) {
  function rh (line 4736) | function rh(a, b, c) {
  function Tg (line 4963) | function Tg() {
  function Dg (line 4966) | function Dg(a) {
  function sh (line 4969) | function sh(a, b) {
  function th (line 4978) | function th(a, b) {
  function uh (line 4989) | function uh(a, b, c) {
  function vh (line 5000) | function vh(a) {
  function wh (line 5035) | function wh(a, b, c, d, e) {
  function xh (line 5043) | function xh(a, b, c, d) {
  function zh (line 5047) | function zh(a) {
  function Ah (line 5057) | function Ah(a, b, c) {
  function Bh (line 5067) | function Bh(a) {
  function Ch (line 5072) | function Ch() {
  function Dh (line 5075) | function Dh(a, b, c) {
  function Eh (line 5098) | function Eh(a) {
  function Fh (line 5101) | function Fh(a, b) {
  function Gh (line 5106) | function Gh(a, b, c, d, e) {
  function Hh (line 5132) | function Hh(a, b) {
  function b (line 5201) | function b() {}
  function c (line 5202) | function c() {
  function toObject (line 6057) | function toObject(val) {
  function shouldUseNative (line 6061) | function shouldUseNative() {
  function m (line 6104) | function m() {
  function r (line 6110) | function r() {
  function q (line 6118) | function q(a) {
  function A (line 6130) | function A(a) {
  function flash (line 6244) | function flash(node, flashColor, baseColor, duration) {
  function previewComplex (line 6462) | function previewComplex(data, theme) {
  function _classCallCheck (line 6513) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 6516) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 6520) | function _inherits(subClass, superClass) {
  function defineProperties (line 6532) | function defineProperties(target, props) {
  function DetailPane (line 6544) | function DetailPane() {
  function _classCallCheck (line 6568) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 6571) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 6575) | function _inherits(subClass, superClass) {
  function defineProperties (line 6587) | function defineProperties(target, props) {
  function DetailPaneSection (line 6599) | function DetailPaneSection() {
  function _classCallCheck (line 6633) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 6636) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 6640) | function _inherits(subClass, superClass) {
  function previewProp (line 6651) | function previewProp(val, nested, inverted, theme) {
  function previewArray (line 6735) | function previewArray(val, inverted, theme) {
  function previewObject (line 6753) | function previewObject(val, inverted, theme) {
  function defineProperties (line 6781) | function defineProperties(target, props) {
  function PropVal (line 6793) | function PropVal() {
  function getBrightness (line 6816) | function getBrightness(hex) {
  function getInvertedMid (line 6820) | function getInvertedMid(hex) {
  function getInvertedWeak (line 6823) | function getInvertedWeak(hex) {
  function getRgb (line 6826) | function getRgb() {
  function hexToRgba (line 6836) | function hexToRgba(hex, alpha) {
  function isBright (line 6840) | function isBright(hex) {
  function _classCallCheck (line 6869) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 6872) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 6876) | function _inherits(subClass, superClass) {
  function defineProperties (line 6888) | function defineProperties(target, props) {
  function LeftPane (line 6900) | function LeftPane() {
  function _classCallCheck (line 6928) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 6931) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 6935) | function _inherits(subClass, superClass) {
  function SearchIcon (line 6946) | function SearchIcon(_ref4) {
  function defineProperties (line 6960) | function defineProperties(target, props) {
  function SettingsPane (line 6972) | function SettingsPane(props) {
  function isValidRegex (line 7213) | function isValidRegex(needle) {
  function searchTextToRegExp (line 7222) | function searchTextToRegExp(needle) {
  function shouldSearchUseRegex (line 7225) | function shouldSearchUseRegex(needle) {
  function trimSearchText (line 7228) | function trimSearchText(needle) {
  function _classCallCheck (line 7286) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 7289) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 7293) | function _inherits(subClass, superClass) {
  function defineProperties (line 7311) | function defineProperties(target, props) {
  function HoverableImplementation (line 7324) | function HoverableImplementation() {
  function _classCallCheck (line 7371) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 7374) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 7378) | function _inherits(subClass, superClass) {
  function defineProperties (line 7390) | function defineProperties(target, props) {
  function TreeView (line 7402) | function TreeView() {
  function _classCallCheck (line 7536) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 7539) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 7543) | function _inherits(subClass, superClass) {
  function defineProperties (line 7561) | function defineProperties(target, props) {
  function Node (line 7573) | function Node() {
  function _classCallCheck (line 7941) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 7944) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 7948) | function _inherits(subClass, superClass) {
  function defineProperties (line 7964) | function defineProperties(target, props) {
  function Props (line 7976) | function Props() {
  function _classCallCheck (line 8016) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 8019) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 8023) | function _inherits(subClass, superClass) {
  function getBreadcrumbPath (line 8034) | function getBreadcrumbPath(store) {
  function defineProperties (line 8042) | function defineProperties(target, props) {
  function Breadcrumb (line 8054) | function Breadcrumb(props) {
  function _classCallCheck (line 8169) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 8172) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 8176) | function _inherits(subClass, superClass) {
  function defineProperties (line 8188) | function defineProperties(target, props) {
  function PreferencesPanel (line 8200) | function PreferencesPanel(props, context) {
  function _classCallCheck (line 8401) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 8404) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 8408) | function _inherits(subClass, superClass) {
  function defineProperties (line 8420) | function defineProperties(target, props) {
  function Editor (line 8432) | function Editor(props, context) {
  function cleanup (line 8683) | function cleanup() {
  function bogusSelect (line 8687) | function bogusSelect() {
  function triggerCopy (line 8703) | function triggerCopy(tryBogusSelect) {
  function b (line 8739) | function b(a, b) {
  function c (line 8744) | function c(a) {
  function d (line 8749) | function d(a) {
  function e (line 8763) | function e(a) {
  function f (line 8775) | function f(a) {
  function g (line 8778) | function g() {
  function h (line 8782) | function h(a, b, c, d) {
  function i (line 8786) | function i(a, b, c) {
  function d (line 8814) | function d(f, g) {
  function Timeout (line 8859) | function Timeout(id, clearFn) {
  function defaultSetTimout (line 8891) | function defaultSetTimout() {
  function defaultClearTimeout (line 8894) | function defaultClearTimeout() {
  function runTimeout (line 8897) | function runTimeout(fun) {
  function runClearTimeout (line 8911) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 8925) | function cleanUpNextTick() {
  function drainQueue (line 8929) | function drainQueue() {
  function Item (line 8940) | function Item(fun, array) {
  function noop (line 8943) | function noop() {}
  function _classCallCheck (line 8978) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 8981) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 8985) | function _inherits(subClass, superClass) {
  function defineProperties (line 8997) | function defineProperties(target, props) {
  function ColorInput (line 9009) | function ColorInput(props, context) {
  function _interopRequireDefault (line 9152) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 9157) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 9160) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 9164) | function _inherits(subClass, superClass) {
  function defineProperties (line 9179) | function defineProperties(target, props) {
  function Portal (line 9193) | function Portal() {
  function shim (line 9299) | function shim(props, propName, componentName, location, propFullName, se...
  function getShim (line 9302) | function getShim() {
  function makeEmptyFunction (line 9329) | function makeEmptyFunction(arg) {
  function invariant (line 9344) | function invariant(condition, format, a, b, c, d, e, f) {
  function _classCallCheck (line 9364) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 9367) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 9371) | function _inherits(subClass, superClass) {
  function defineProperties (line 9389) | function defineProperties(target, props) {
  function ColorPicker (line 9401) | function ColorPicker() {
  function CustomColorPicker (line 9426) | function CustomColorPicker() {
  function _interopRequireDefault (line 9488) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 9598) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 9647) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 9666) | function _interopRequireDefault(obj) {
  function isString (line 9686) | function isString(value) {
  function baseGetTag (line 9692) | function baseGetTag(value) {
  function getRawTag (line 9711) | function getRawTag(value) {
  function objectToString (line 9724) | function objectToString(value) {
  function isObjectLike (line 9733) | function isObjectLike(value) {
  function forOwn (line 9738) | function forOwn(object, iteratee) {
  function baseForOwn (line 9744) | function baseForOwn(object, iteratee) {
  function createBaseFor (line 9753) | function createBaseFor(fromRight) {
  function keys (line 9764) | function keys(object) {
  function arrayLikeKeys (line 9770) | function arrayLikeKeys(value, inherited) {
  function baseTimes (line 9778) | function baseTimes(n, iteratee) {
  function baseIsArguments (line 9791) | function baseIsArguments(value) {
  function stubFalse (line 9807) | function stubFalse() {
  function isIndex (line 9812) | function isIndex(value, length) {
  function baseIsTypedArray (line 9821) | function baseIsTypedArray(value) {
  function isLength (line 9829) | function isLength(value) {
  function baseUnary (line 9835) | function baseUnary(func) {
  function baseKeys (line 9851) | function baseKeys(object) {
  function isPrototype (line 9860) | function isPrototype(value) {
  function overArg (line 9870) | function overArg(func, transform) {
  function isArrayLike (line 9877) | function isArrayLike(value) {
  function isFunction (line 9883) | function isFunction(value) {
  function isObject (line 9891) | function isObject(value) {
  function castFunction (line 9897) | function castFunction(value) {
  function identity (line 9903) | function identity(value) {
  function isPlainObject (line 9908) | function isPlainObject(value) {
  function map (line 9921) | function map(collection, iteratee) {
  function arrayMap (line 9928) | function arrayMap(array, iteratee) {
  function baseIteratee (line 9934) | function baseIteratee(value) {
  function baseMatches (line 9940) | function baseMatches(source) {
  function baseIsMatch (line 9949) | function baseIsMatch(object, source, matchData, customizer) {
  function Stack (line 9972) | function Stack(entries) {
  function ListCache (line 9980) | function ListCache(entries) {
  function listCacheClear (line 9992) | function listCacheClear() {
  function listCacheDelete (line 9997) | function listCacheDelete(key) {
  function assocIndexOf (line 10007) | function assocIndexOf(array, key) {
  function eq (line 10014) | function eq(value, other) {
  function listCacheGet (line 10019) | function listCacheGet(key) {
  function listCacheHas (line 10026) | function listCacheHas(key) {
  function listCacheSet (line 10032) | function listCacheSet(key, value) {
  function stackClear (line 10040) | function stackClear() {
  function stackDelete (line 10046) | function stackDelete(key) {
  function stackGet (line 10052) | function stackGet(key) {
  function stackHas (line 10057) | function stackHas(key) {
  function stackSet (line 10062) | function stackSet(key, value) {
  function getNative (line 10078) | function getNative(object, key) {
  function baseIsNative (line 10085) | function baseIsNative(value) {
  function isMasked (line 10093) | function isMasked(func) {
  function toSource (line 10105) | function toSource(func) {
  function getValue (line 10119) | function getValue(object, key) {
  function MapCache (line 10124) | function MapCache(entries) {
  function mapCacheClear (line 10136) | function mapCacheClear() {
  function Hash (line 10146) | function Hash(entries) {
  function hashClear (line 10157) | function hashClear() {
  function hashDelete (line 10166) | function hashDelete(key) {
  function hashGet (line 10172) | function hashGet(key) {
  function hashHas (line 10183) | function hashHas(key) {
  function hashSet (line 10190) | function hashSet(key, value) {
  function mapCacheDelete (line 10198) | function mapCacheDelete(key) {
  function getMapData (line 10205) | function getMapData(map, key) {
  function isKeyable (line 10212) | function isKeyable(value) {
  function mapCacheGet (line 10218) | function mapCacheGet(key) {
  function mapCacheHas (line 10224) | function mapCacheHas(key) {
  function mapCacheSet (line 10230) | function mapCacheSet(key, value) {
  function baseIsEqual (line 10237) | function baseIsEqual(value, other, bitmask, customizer, stack) {
  function baseIsEqualDeep (line 10243) | function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, ...
  function equalArrays (line 10264) | function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
  function SetCache (line 10295) | function SetCache(values) {
  function setCacheAdd (line 10303) | function setCacheAdd(value) {
  function setCacheHas (line 10309) | function setCacheHas(value) {
  function arraySome (line 10314) | function arraySome(array, predicate) {
  function cacheHas (line 10320) | function cacheHas(cache, key) {
  function equalByTag (line 10325) | function equalByTag(object, other, tag, bitmask, customizer, equalFunc, ...
  function mapToArray (line 10369) | function mapToArray(map) {
  function setToArray (line 10377) | function setToArray(set) {
  function equalObjects (line 10385) | function equalObjects(object, other, bitmask, customizer, equalFunc, sta...
  function getAllKeys (line 10415) | function getAllKeys(object) {
  function baseGetAllKeys (line 10421) | function baseGetAllKeys(object, keysFunc, symbolsFunc) {
  function arrayPush (line 10428) | function arrayPush(array, values) {
  function arrayFilter (line 10441) | function arrayFilter(array, predicate) {
  function stubArray (line 10450) | function stubArray() {
  function getMatchData (line 10489) | function getMatchData(object) {
  function isStrictComparable (line 10499) | function isStrictComparable(value) {
  function matchesStrictComparable (line 10505) | function matchesStrictComparable(key, srcValue) {
  function baseMatchesProperty (line 10512) | function baseMatchesProperty(path, srcValue) {
  function get (line 10521) | function get(object, path, defaultValue) {
  function baseGet (line 10528) | function baseGet(object, path) {
  function castPath (line 10536) | function castPath(value, object) {
  function isKey (line 10542) | function isKey(value, object) {
  function isSymbol (line 10550) | function isSymbol(value) {
  function memoizeCapped (line 10564) | function memoizeCapped(func) {
  function memoize (line 10573) | function memoize(func, resolver) {
  function toString (line 10586) | function toString(value) {
  function baseToString (line 10592) | function baseToString(value) {
  function toKey (line 10602) | function toKey(value) {
  function hasIn (line 10610) | function hasIn(object, path) {
  function baseHasIn (line 10616) | function baseHasIn(object, key) {
  function hasPath (line 10621) | function hasPath(object, path, hasFunc) {
  function property (line 10634) | function property(path) {
  function baseProperty (line 10640) | function baseProperty(key) {
  function basePropertyDeep (line 10647) | function basePropertyDeep(path) {
  function baseMap (line 10655) | function baseMap(collection, iteratee) {
  function createBaseEach (line 10667) | function createBaseEach(eachFunc, fromRight) {
  function _interopRequireDefault (line 10679) | function _interopRequireDefault(obj) {
  function cloneDeep (line 10705) | function cloneDeep(value) {
  function baseClone (line 10711) | function baseClone(value, bitmask, customizer, key, object, stack) {
  function arrayEach (line 10743) | function arrayEach(array, iteratee) {
  function assignValue (line 10749) | function assignValue(object, key, value) {
  function baseAssignValue (line 10756) | function baseAssignValue(object, key, value) {
  function baseAssign (line 10775) | function baseAssign(object, source) {
  function copyObject (line 10781) | function copyObject(source, props, object, customizer) {
  function baseAssignIn (line 10793) | function baseAssignIn(object, source) {
  function keysIn (line 10799) | function keysIn(object) {
  function baseKeysIn (line 10805) | function baseKeysIn(object) {
  function nativeKeysIn (line 10814) | function nativeKeysIn(object) {
  function cloneBuffer (line 10822) | function cloneBuffer(buffer, isDeep) {
  function copyArray (line 10831) | function copyArray(source, array) {
  function copySymbols (line 10838) | function copySymbols(source, object) {
  function copySymbolsIn (line 10844) | function copySymbolsIn(source, object) {
  function getAllKeysIn (line 10856) | function getAllKeysIn(object) {
  function initCloneArray (line 10862) | function initCloneArray(array) {
  function initCloneByTag (line 10870) | function initCloneByTag(object, tag, cloneFunc, isDeep) {
  function cloneArrayBuffer (line 10914) | function cloneArrayBuffer(arrayBuffer) {
  function cloneDataView (line 10921) | function cloneDataView(dataView, isDeep) {
  function cloneMap (line 10928) | function cloneMap(map, isDeep, cloneFunc) {
  function addMapEntry (line 10935) | function addMapEntry(map, pair) {
  function arrayReduce (line 10940) | function arrayReduce(array, iteratee, accumulator, initAccum) {
  function cloneRegExp (line 10947) | function cloneRegExp(regexp) {
  function cloneSet (line 10954) | function cloneSet(set, isDeep, cloneFunc) {
  function addSetEntry (line 10961) | function addSetEntry(set, value) {
  function cloneSymbol (line 10966) | function cloneSymbol(symbol) {
  function cloneTypedArray (line 10972) | function cloneTypedArray(typedArray, isDeep) {
  function initCloneObject (line 10979) | function initCloneObject(object) {
  function object (line 10986) | function object() {}
  function _interopRequireDefault (line 10998) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 11109) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 11114) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11117) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11121) | function _inherits(subClass, superClass) {
  function Hover (line 11144) | function Hover() {
  function _interopRequireDefault (line 11172) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 11177) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11180) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11184) | function _inherits(subClass, superClass) {
  function Active (line 11207) | function Active() {
  function _interopRequireDefault (line 11250) | function _interopRequireDefault(obj) {
  function _interopRequireWildcard (line 11309) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 11315) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 11320) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11323) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11327) | function _inherits(subClass, superClass) {
  function defineProperties (line 11348) | function defineProperties(target, props) {
  function Alpha (line 11360) | function Alpha() {
  function calculateChange (line 11459) | function calculateChange(e, skip, props, container) {
  function _interopRequireWildcard (line 11490) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 11496) | function _interopRequireDefault(obj) {
  function render (line 11526) | function render(c1, c2, size, serverCanvas) {
  function get (line 11535) | function get(c1, c2, size, serverCanvas) {
  function _interopRequireDefault (line 11546) | function _interopRequireDefault(obj) {
  function _defineProperty (line 11551) | function _defineProperty(obj, key, value) {
  function _classCallCheck (line 11559) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11562) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11566) | function _inherits(subClass, superClass) {
  function defineProperties (line 11581) | function defineProperties(target, props) {
  function EditableInput (line 11593) | function EditableInput(props) {
  function _interopRequireWildcard (line 11692) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 11698) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 11703) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11706) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11710) | function _inherits(subClass, superClass) {
  function defineProperties (line 11725) | function defineProperties(target, props) {
  function Hue (line 11737) | function Hue() {
  function calculateChange (line 11823) | function calculateChange(e, skip, props, container) {
  function _interopRequireWildcard (line 11860) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 11866) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 11871) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 11874) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 11878) | function _inherits(subClass, superClass) {
  function defineProperties (line 11893) | function defineProperties(target, props) {
  function Saturation (line 11905) | function Saturation(props) {
  function throttle (line 11994) | function throttle(func, wait, options) {
  function debounce (line 12007) | function debounce(func, wait, options) {
  function toNumber (line 12060) | function toNumber(value) {
  function calculateChange (line 12076) | function calculateChange(e, skip, props, container) {
  function _interopRequireDefault (line 12094) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 12099) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 12102) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 12106) | function _inherits(subClass, superClass) {
  function defineProperties (line 12127) | function defineProperties(target, props) {
  function ColorPicker (line 12140) | function ColorPicker(props) {
  function _interopRequireDefault (line 12184) | function _interopRequireDefault(obj) {
  function forEach (line 12239) | function forEach(collection, iteratee) {
  function tinycolor (line 12248) | function tinycolor(color, opts) {
  function inputToRGB (line 12258) | function inputToRGB(color) {
  function rgbToRgb (line 12279) | function rgbToRgb(r, g, b) {
  function rgbToHsl (line 12286) | function rgbToHsl(r, g, b) {
  function hslToRgb (line 12311) | function hslToRgb(h, s, l) {
  function rgbToHsv (line 12326) | function rgbToHsv(r, g, b) {
  function hsvToRgb (line 12350) | function hsvToRgb(h, s, v) {
  function rgbToHex (line 12359) | function rgbToHex(r, g, b, allow3Char) {
  function rgbaToHex (line 12363) | function rgbaToHex(r, g, b, a) {
  function desaturate (line 12367) | function desaturate(color, amount) {
  function saturate (line 12372) | function saturate(color, amount) {
  function greyscale (line 12377) | function greyscale(color) {
  function lighten (line 12380) | function lighten(color, amount) {
  function brighten (line 12385) | function brighten(color, amount) {
  function darken (line 12392) | function darken(color, amount) {
  function spin (line 12397) | function spin(color, amount) {
  function complement (line 12401) | function complement(color) {
  function triad (line 12405) | function triad(color) {
  function tetrad (line 12417) | function tetrad(color) {
  function splitcomplement (line 12433) | function splitcomplement(color) {
  function analogous (line 12445) | function analogous(color, results, slices) {
  function monochromatic (line 12452) | function monochromatic(color, results) {
  function flip (line 12461) | function flip(o) {
  function boundAlpha (line 12466) | function boundAlpha(a) {
  function bound01 (line 12469) | function bound01(n, max) {
  function clamp01 (line 12475) | function clamp01(val) {
  function parseIntFromHex (line 12478) | function parseIntFromHex(val) {
  function isOnePointZero (line 12481) | function isOnePointZero(n) {
  function isPercentage (line 12484) | function isPercentage(n) {
  function pad2 (line 12487) | function pad2(c) {
  function convertToPercentage (line 12490) | function convertToPercentage(n, multiplier) {
  function convertDecimalToHex (line 12493) | function convertDecimalToHex(d) {
  function convertHexToDecimal (line 12496) | function convertHexToDecimal(h) {
  function stringInputToObject (line 12499) | function stringInputToObject(color) {
  function validateWCAG2Parms (line 12555) | function validateWCAG2Parms(parms) {
  function _interopRequireDefault (line 12955) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 12989) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 13024) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 13124) | function _interopRequireDefault(obj) {
  function _interopRequireWildcard (line 13167) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 13173) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 13544) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 13599) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 13744) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 13749) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 13752) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 13756) | function _inherits(subClass, superClass) {
  function defineProperties (line 13771) | function defineProperties(target, props) {
  function ChromeFields (line 13783) | function ChromeFields() {
  function _interopRequireDefault (line 14049) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 14077) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 14104) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 14161) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 14174) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 14179) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 14182) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 14186) | function _inherits(subClass, superClass) {
  function defineProperties (line 14201) | function defineProperties(target, props) {
  function Raised (line 14213) | function Raised() {
  function shim (line 14300) | function shim(props, propName, componentName, location, propFullName, se...
  function getShim (line 14303) | function getShim() {
  function makeEmptyFunction (line 14330) | function makeEmptyFunction(arg) {
  function invariant (line 14345) | function invariant(condition, format, a, b, c, d, e, f) {
  function _interopRequireDefault (line 14365) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 14370) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 14373) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 14377) | function _inherits(subClass, superClass) {
  function sliceIterator (line 14392) | function sliceIterator(arr, i) {
  function defineProperties (line 14414) | function defineProperties(target, props) {
  function Tile (line 14426) | function Tile() {
  function _interopRequireDefault (line 14504) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 14509) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 14512) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 14516) | function _inherits(subClass, superClass) {
  function defineProperties (line 14531) | function defineProperties(target, props) {
  function Tabs (line 14543) | function Tabs(props) {
  function _interopRequireDefault (line 14704) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 14709) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 14712) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 14716) | function _inherits(subClass, superClass) {
  function defineProperties (line 14731) | function defineProperties(target, props) {
  function Tab (line 14743) | function Tab() {
  function _interopRequireDefault (line 14796) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 14801) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 14804) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 14808) | function _inherits(subClass, superClass) {
  function defineProperties (line 14823) | function defineProperties(target, props) {
  function Link (line 14835) | function Link() {
  function _interopRequireDefault (line 14869) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 14929) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15054) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15161) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15199) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15252) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15287) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15425) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 15430) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 15433) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 15437) | function _inherits(subClass, superClass) {
  function defineProperties (line 15452) | function defineProperties(target, props) {
  function Photoshop (line 15464) | function Photoshop(props) {
  function _interopRequireDefault (line 15585) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15762) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15796) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15857) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15899) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 15948) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16083) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16219) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16291) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16333) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16404) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16458) | function _interopRequireDefault(obj) {
  function _interopRequireWildcard (line 16486) | function _interopRequireWildcard(obj) {
  function _interopRequireDefault (line 16492) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16550) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16586) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 16662) | function _interopRequireDefault(obj) {
  function _defineProperty (line 16846) | function _defineProperty(obj, key, value) {
  function _classCallCheck (line 16854) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 16857) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 16861) | function _inherits(subClass, superClass) {
  function defineProperties (line 16873) | function defineProperties(target, props) {
  function Preview (line 16885) | function Preview() {
  function createClass (line 16990) | function createClass(ctor, superClass) {
  function Iterable (line 16993) | function Iterable(value) {
  function KeyedIterable (line 16996) | function KeyedIterable(value) {
  function IndexedIterable (line 16999) | function IndexedIterable(value) {
  function SetIterable (line 17002) | function SetIterable(value) {
  function isIterable (line 17005) | function isIterable(maybeIterable) {
  function isKeyed (line 17008) | function isKeyed(maybeKeyed) {
  function isIndexed (line 17011) | function isIndexed(maybeIndexed) {
  function isAssociative (line 17014) | function isAssociative(maybeAssociative) {
  function isOrdered (line 17017) | function isOrdered(maybeOrdered) {
  function MakeRef (line 17020) | function MakeRef(ref) {
  function SetRef (line 17023) | function SetRef(ref) {
  function OwnerID (line 17026) | function OwnerID() {}
  function arrCopy (line 17027) | function arrCopy(arr, offset) {
  function ensureSize (line 17032) | function ensureSize(iter) {
  function wrapIndex (line 17035) | function wrapIndex(iter, index) {
  function returnTrue (line 17043) | function returnTrue() {
  function wholeSlice (line 17046) | function wholeSlice(begin, end, size) {
  function resolveBegin (line 17049) | function resolveBegin(begin, size) {
  function resolveEnd (line 17052) | function resolveEnd(end, size) {
  function resolveIndex (line 17055) | function resolveIndex(index, size, defaultIndex) {
  function Iterator (line 17058) | function Iterator(next) {
  function iteratorValue (line 17061) | function iteratorValue(type, k, v, iteratorResult) {
  function iteratorDone (line 17068) | function iteratorDone() {
  function hasIterator (line 17074) | function hasIterator(maybeIterable) {
  function isIterator (line 17077) | function isIterator(maybeIterator) {
  function getIterator (line 17080) | function getIterator(iterable) {
  function getIteratorFn (line 17084) | function getIteratorFn(iterable) {
  function isArrayLike (line 17088) | function isArrayLike(value) {
  function Seq (line 17091) | function Seq(value) {
  function KeyedSeq (line 17094) | function KeyedSeq(value) {
  function IndexedSeq (line 17097) | function IndexedSeq(value) {
  function SetSeq (line 17100) | function SetSeq(value) {
  function ArraySeq (line 17103) | function ArraySeq(array) {
  function ObjectSeq (line 17106) | function ObjectSeq(object) {
  function IterableSeq (line 17110) | function IterableSeq(iterable) {
  function IteratorSeq (line 17113) | function IteratorSeq(iterator) {
  function isSeq (line 17116) | function isSeq(maybeSeq) {
  function emptySequence (line 17119) | function emptySequence() {
  function keyedSeqFromValue (line 17122) | function keyedSeqFromValue(value) {
  function indexedSeqFromValue (line 17127) | function indexedSeqFromValue(value) {
  function seqFromValue (line 17132) | function seqFromValue(value) {
  function maybeIndexedSeqFromValue (line 17137) | function maybeIndexedSeqFromValue(value) {
  function seqIterate (line 17140) | function seqIterate(seq, fn, reverse, useKeys) {
  function seqIterator (line 17151) | function seqIterator(seq, type, reverse, useKeys) {
  function fromJS (line 17162) | function fromJS(json, converter) {
  function fromJSWith (line 17167) | function fromJSWith(converter, json, key, parentJSON) {
  function fromJSDefault (line 17174) | function fromJSDefault(json) {
  function isPlainObj (line 17177) | function isPlainObj(value) {
  function is (line 17180) | function is(valueA, valueB) {
  function deepEqual (line 17189) | function deepEqual(a, b) {
  function Repeat (line 17213) | function Repeat(value, times) {
  function invariant (line 17221) | function invariant(condition, error) {
  function Range (line 17224) | function Range(start, end, step) {
  function Collection (line 17234) | function Collection() {
  function KeyedCollection (line 17237) | function KeyedCollection() {}
  function IndexedCollection (line 17238) | function IndexedCollection() {}
  function SetCollection (line 17239) | function SetCollection() {}
  function smi (line 17240) | function smi(i32) {
  function hash (line 17243) | function hash(o) {
  function cachedHashString (line 17259) | function cachedHashString(string) {
  function hashString (line 17265) | function hashString(string) {
  function hashJSObj (line 17269) | function hashJSObj(obj) {
  function getIENodeHash (line 17293) | function getIENodeHash(node) {
  function assertNotInfinite (line 17302) | function assertNotInfinite(size) {
  function Map (line 17305) | function Map(value) {
  function isMap (line 17313) | function isMap(maybeMap) {
  function ArrayMapNode (line 17316) | function ArrayMapNode(ownerID, entries) {
  function BitmapIndexedNode (line 17319) | function BitmapIndexedNode(ownerID, bitmap, nodes) {
  function HashArrayMapNode (line 17322) | function HashArrayMapNode(ownerID, count, nodes) {
  function HashCollisionNode (line 17325) | function HashCollisionNode(ownerID, keyHash, entries) {
  function ValueNode (line 17328) | function ValueNode(ownerID, keyHash, entry) {
  function MapIterator (line 17331) | function MapIterator(map, type, reverse) {
  function mapIteratorValue (line 17334) | function mapIteratorValue(type, entry) {
  function mapIteratorFrame (line 17337) | function mapIteratorFrame(node, prev) {
  function makeMap (line 17344) | function makeMap(size, root, ownerID, hash) {
  function emptyMap (line 17349) | function emptyMap() {
  function updateMap (line 17352) | function updateMap(map, k, v) {
  function updateNode (line 17366) | function updateNode(node, ownerID, shift, keyHash, key, value, didChange...
  function isLeafNode (line 17370) | function isLeafNode(node) {
  function mergeIntoNode (line 17373) | function mergeIntoNode(node, ownerID, shift, keyHash, entry) {
  function createNodes (line 17379) | function createNodes(ownerID, entries, key, value) {
  function packNodes (line 17387) | function packNodes(ownerID, nodes, count, excluding) {
  function expandNodes (line 17395) | function expandNodes(ownerID, nodes, bitmap, including, node) {
  function mergeIntoMapWith (line 17400) | function mergeIntoMapWith(map, merger, iterables) {
  function deepMerger (line 17409) | function deepMerger(existing, value, key) {
  function deepMergerWith (line 17412) | function deepMergerWith(merger) {
  function mergeIntoCollectionWith (line 17419) | function mergeIntoCollectionWith(collection, merger, iters) {
  function updateInDeepMap (line 17432) | function updateInDeepMap(existing, keyPathIter, notSetValue, updater) {
  function popCount (line 17442) | function popCount(x) {
  function setIn (line 17446) | function setIn(array, idx, val, canEdit) {
  function spliceIn (line 17450) | function spliceIn(array, idx, val, canEdit) {
  function spliceOut (line 17457) | function spliceOut(array, idx, canEdit) {
  function List (line 17464) | function List(value) {
  function isList (line 17475) | function isList(maybeList) {
  function VNode (line 17478) | function VNode(array, ownerID) {
  function iterateList (line 17481) | function iterateList(list, reverse) {
  function makeList (line 17511) | function makeList(origin, capacity, level, root, tail, ownerID, hash) {
  function emptyList (line 17517) | function emptyList() {
  function updateList (line 17520) | function updateList(list, index, value) {
  function updateVNode (line 17531) | function updateVNode(node, ownerID, level, index, value, didAlter) {
  function editableVNode (line 17544) | function editableVNode(node, ownerID) {
  function listNodeFor (line 17547) | function listNodeFor(list, rawIndex) {
  function setListBounds (line 17555) | function setListBounds(list, begin, end) {
  function mergeIntoListWith (line 17592) | function mergeIntoListWith(list, merger, iterables) {
  function getTailOffset (line 17601) | function getTailOffset(size) {
  function OrderedMap (line 17604) | function OrderedMap(value) {
  function isOrderedMap (line 17612) | function isOrderedMap(maybeOrderedMap) {
  function makeOrderedMap (line 17615) | function makeOrderedMap(map, list, ownerID, hash) {
  function emptyOrderedMap (line 17620) | function emptyOrderedMap() {
  function updateOrderedMap (line 17623) | function updateOrderedMap(omap, k, v) {
  function ToKeyedSequence (line 17640) | function ToKeyedSequence(indexed, useKeys) {
  function ToIndexedSequence (line 17643) | function ToIndexedSequence(iter) {
  function ToSetSequence (line 17646) | function ToSetSequence(iter) {
  function FromEntriesSequence (line 17649) | function FromEntriesSequence(entries) {
  function flipFactory (line 17652) | function flipFactory(iterable) {
  function mapFactory (line 17685) | function mapFactory(iterable, mapper, context) {
  function reverseFactory (line 17707) | function reverseFactory(iterable, useKeys) {
  function filterFactory (line 17732) | function filterFactory(iterable, predicate, context, useKeys) {
  function countByFactory (line 17757) | function countByFactory(iterable, grouper, context) {
  function groupByFactory (line 17765) | function groupByFactory(iterable, grouper, context) {
  function sliceFactory (line 17777) | function sliceFactory(iterable, begin, end, useKeys) {
  function takeWhileFactory (line 17809) | function takeWhileFactory(iterable, predicate, context) {
  function skipWhileFactory (line 17832) | function skipWhileFactory(iterable, predicate, context, useKeys) {
  function concatFactory (line 17857) | function concatFactory(iterable, values) {
  function flattenFactory (line 17878) | function flattenFactory(iterable, depth, useKeys) {
  function flatMapFactory (line 17905) | function flatMapFactory(iterable, mapper, context) {
  function interposeFactory (line 17911) | function interposeFactory(iterable, separator) {
  function sortFactory (line 17925) | function sortFactory(iterable, comparator, mapper) {
  function maxFactory (line 17938) | function maxFactory(iterable, comparator, mapper) {
  function maxCompare (line 17951) | function maxCompare(comparator, a, b) {
  function zipWithFactory (line 17955) | function zipWithFactory(keyIter, zipper, iters) {
  function reify (line 17978) | function reify(iter, seq) {
  function validateEntry (line 17981) | function validateEntry(entry) {
  function resolveSize (line 17984) | function resolveSize(iter) {
  function iterableClass (line 17987) | function iterableClass(iterable) {
  function makeSequence (line 17990) | function makeSequence(iterable) {
  function cacheResultThrough (line 17993) | function cacheResultThrough() {
  function defaultComparator (line 17997) | function defaultComparator(a, b) {
  function forceIterator (line 18000) | function forceIterator(keyPath) {
  function Record (line 18008) | function Record(defaultValues, name) {
  function makeRecord (line 18022) | function makeRecord(likeRecord, map, ownerID) {
  function recordName (line 18026) | function recordName(record) {
  function setProps (line 18029) | function setProps(prototype, names) {
  function setProp (line 18034) | function setProp(prototype, name) {
  function Set (line 18044) | function Set(value) {
  function isSet (line 18052) | function isSet(maybeSet) {
  function updateSet (line 18055) | function updateSet(set, newMap) {
  function makeSet (line 18058) | function makeSet(map, ownerID) {
  function emptySet (line 18062) | function emptySet() {
  function OrderedSet (line 18065) | function OrderedSet(value) {
  function isOrderedSet (line 18073) | function isOrderedSet(maybeOrderedSet) {
  function makeOrderedSet (line 18076) | function makeOrderedSet(map, ownerID) {
  function emptyOrderedSet (line 18080) | function emptyOrderedSet() {
  function Stack (line 18083) | function Stack(value) {
  function isStack (line 18086) | function isStack(maybeStack) {
  function makeStack (line 18089) | function makeStack(size, head, ownerID, hash) {
  function emptyStack (line 18094) | function emptyStack() {
  function mixin (line 18097) | function mixin(ctor, methods) {
  function keyMapper (line 18104) | function keyMapper(v, k) {
  function entryMapper (line 18107) | function entryMapper(v, k) {
  function not (line 18110) | function not(predicate) {
  function neg (line 18115) | function neg(predicate) {
  function quoteString (line 18120) | function quoteString(value) {
  function defaultZipper (line 18123) | function defaultZipper() {
  function defaultNegComparator (line 18126) | function defaultNegComparator(a, b) {
  function hashIterable (line 18129) | function hashIterable(iterable) {
  function murmurHashOfSize (line 18142) | function murmurHashOfSize(size, h) {
  function hashMerge (line 18147) | function hashMerge(a, b) {
  function _classCallCheck (line 19977) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 19980) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 19984) | function _inherits(subClass, superClass) {
  function defineProperties (line 20002) | function defineProperties(target, props) {
  function TimerSafeImplementation (line 20015) | function TimerSafeImplementation() {
  function deserialize (line 20049) | function deserialize(string) {
  function isColorSet (line 20067) | function isColorSet(maybeColor) {
  function serialize (line 20070) | function serialize(theme) {
  function _classCallCheck (line 20097) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 20100) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 20104) | function _inherits(subClass, superClass) {
  function defineProperties (line 20116) | function defineProperties(target, props) {
  function SettingsCheckbox (line 20130) | function SettingsCheckbox(props) {
  function _classCallCheck (line 20200) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 20203) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 20207) | function _inherits(subClass, superClass) {
  function defineProperties (line 20225) | function defineProperties(target, props) {
  function SplitPane (line 20237) | function SplitPane(props) {
  function _classCallCheck (line 20349) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 20352) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 20356) | function _inherits(subClass, superClass) {
  function defineProperties (line 20368) | function defineProperties(target, props) {
  function Draggable (line 20380) | function Draggable() {
  function _classCallCheck (line 20422) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 20425) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 20429) | function _inherits(subClass, superClass) {
  function defineProperties (line 20441) | function defineProperties(target, props) {
  function TabbedPane (line 20453) | function TabbedPane() {
  function _classCallCheck (line 20534) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 20537) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 20541) | function _inherits(subClass, superClass) {
  function sliceIterator (line 20553) | function sliceIterator(arr, i) {
  function defineProperties (line 20581) | function defineProperties(target, props) {
  function Store (line 20594) | function Store(bridge, themeStore) {
  function EventEmitter (line 21039) | function EventEmitter() {
  function isFunction (line 21042) | function isFunction(arg) {
  function isNumber (line 21045) | function isNumber(arg) {
  function isObject (line 21048) | function isObject(arg) {
  function isUndefined (line 21051) | function isUndefined(arg) {
  function g (line 21095) | function g() {
  function nodeMatchesText (line 21142) | function nodeMatchesText(node, needle, key, store) {
  function validString (line 21152) | function validString(str, needle, regex) {
  function stripFunctions (line 21165) | function stripFunctions(props) {
  function serializePropsForCopy (line 21174) | function serializePropsForCopy(props) {
  function _classCallCheck (line 21191) | function _classCallCheck(instance, Constructor) {
  function getSafeThemeName (line 21194) | function getSafeThemeName(themeName, fallbackThemeName) {
  function defineProperties (line 21198) | function defineProperties(target, props) {
  function Store (line 21210) | function Store(defaultThemeName) {
  function get (line 21242) | function get(key) {
  function set (line 21251) | function set(key, value) {
  function getDest (line 21264) | function getDest(dir, store) {
  function getRootSelection (line 21272) | function getRootSelection(dest, store, id) {
  function getNewSelection (line 21282) | function getNewSelection(dest, store) {
  function _toConsumableArray (line 21397) | function _toConsumableArray(arr) {
  function _classCallCheck (line 21404) | function _classCallCheck(instance, Constructor) {
  function getWindowFunction (line 21407) | function getWindowFunction(name, polyfill) {
  function defineProperties (line 21417) | function defineProperties(target, props) {
  function Bridge (line 21442) | function Bridge(wall) {
  function hydrate (line 21664) | function hydrate(data, cleaned) {
  function getPropType (line 21680) | function getPropType(data) {
  function createDehydrated (line 21693) | function createDehydrated(type, data, cleaned, path) {
  function dehydrate (line 21703) | function dehydrate(data, cleaned) {
  function _toConsumableArray (line 21771) | function _toConsumableArray(arr) {
  function getIn (line 21778) | function getIn(base, path) {
  function _classCallCheck (line 21814) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 21817) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 21821) | function _inherits(subClass, superClass) {
  function shallowClone (line 21832) | function shallowClone(obj) {
  function defineProperties (line 21838) | function defineProperties(target, props) {
  function NativeStyler (line 21850) | function NativeStyler(props) {
  function _classCallCheck (line 21940) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 21943) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 21947) | function _inherits(subClass, superClass) {
  function defineProperties (line 21959) | function defineProperties(target, props) {
  function StyleEdit (line 21971) | function StyleEdit(props) {
  function _classCallCheck (line 22094) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 22097) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 22101) | function _inherits(subClass, superClass) {
  function defineProperties (line 22113) | function defineProperties(target, props) {
  function AutoSizeInput (line 22125) | function AutoSizeInput(props, context) {
  function _classCallCheck (line 22267) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 22270) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 22274) | function _inherits(subClass, superClass) {
  function defineProperties (line 22292) | function defineProperties(target, props) {
  function BoxInspector (line 22321) | function BoxInspector() {
  function _classCallCheck (line 22391) | function _classCallCheck(instance, Constructor) {
  function defineProperties (line 22395) | function defineProperties(target, props) {
  function ProfilerPlugin (line 22407) | function ProfilerPlugin(store, bridge, refresh) {
  function _defineProperty (line 22443) | function _defineProperty(obj, key, value) {
  function _classCallCheck (line 22451) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 22454) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 22458) | function _inherits(subClass, superClass) {
  function defineProperties (line 22470) | function defineProperties(target, props) {
  function Wrapper (line 22484) | function Wrapper() {
  function _classCallCheck (line 22504) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 22507) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 22511) | function _inherits(subClass, superClass) {
  function defineProperties (line 22523) | function defineProperties(target, props) {
  function ProfilerStore (line 22535) | function ProfilerStore(bridge, mainStore) {
  function naiveLength (line 22640) | function naiveLength() {
  function LRUCache (line 22643) | function LRUCache(options) {
  function forEachStep (line 22655) | function forEachStep(self, fn, node, thisp) {
  function get (line 22659) | function get(self, key, doUse) {
  function isStale (line 22668) | function isStale(self, hit) {
  function trim (line 22673) | function trim(self) {
  function del (line 22679) | function del(self, node) {
  function Entry (line 22686) | function Entry(key, value, length, now, maxAge) {
  function PseudoMap (line 22848) | function PseudoMap(set) {
  function same (line 22859) | function same(a, b) {
  function Entry (line 22862) | function Entry(k, v, i) {
  function find (line 22865) | function find(data, k) {
  function set (line 22868) | function set(data, k, v) {
  function inspect (line 22907) | function inspect(obj, opts) {
  function stylizeWithColor (line 22918) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 22922) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 22925) | function arrayToHash(array) {
  function formatValue (line 22931) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 22963) | function formatPrimitive(ctx, value) {
  function formatError (line 22971) | function formatError(value) {
  function formatArray (line 22974) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 22980) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 22998) | function reduceToSingleString(output, base, braces) {
  function isArray (line 23004) | function isArray(ar) {
  function isBoolean (line 23007) | function isBoolean(arg) {
  function isNull (line 23010) | function isNull(arg) {
  function isNullOrUndefined (line 23013) | function isNullOrUndefined(arg) {
  function isNumber (line 23016) | function isNumber(arg) {
  function isString (line 23019) | function isString(arg) {
  function isSymbol (line 23022) | function isSymbol(arg) {
  function isUndefined (line 23025) | function isUndefined(arg) {
  function isRegExp (line 23028) | function isRegExp(re) {
  function isObject (line 23031) | function isObject(arg) {
  function isDate (line 23034) | function isDate(d) {
  function isError (line 23037) | function isError(e) {
  function isFunction (line 23040) | function isFunction(arg) {
  function isPrimitive (line 23043) | function isPrimitive(arg) {
  function objectToString (line 23046) | function objectToString(o) {
  function pad (line 23049) | function pad(n) {
  function timestamp (line 23052) | function timestamp() {
  function hasOwnProperty (line 23056) | function hasOwnProperty(obj, prop) {
  function deprecated (line 23088) | function deprecated() {
  function Yallist (line 23172) | function Yallist(list) {
  function push (line 23180) | function push(self, item) {
  function unshift (line 23184) | function unshift(self, item) {
  function Node (line 23188) | function Node(value, prev, next, list) {
  function _interopRequireDefault (line 23304) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 23309) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 23312) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 23316) | function _inherits(subClass, superClass) {
  function defineProperties (line 23331) | function defineProperties(target, props) {
  function ProfilerTab (line 23343) | function ProfilerTab() {
  function _interopRequireDefault (line 23660) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 23727) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 23732) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 23735) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 23739) | function _inherits(subClass, superClass) {
  function defineProperties (line 23754) | function defineProperties(target, props) {
  function ListItem (line 23805) | function ListItem() {
  function createDetectElementResize (line 23862) | function createDetectElementResize(nonce) {
  function defineProperties (line 23944) | function defineProperties(target, props) {
  function AutoSizer (line 23975) | function AutoSizer() {
  function _interopDefault (line 24039) | function _interopDefault(ex) {
  function createGridComponent (line 24042) | function createGridComponent(_ref2) {
  function createListComponent (line 24205) | function createListComponent(_ref) {
  function _interopRequireDefault (line 24749) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 24814) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 24849) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 24854) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 24857) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 24861) | function _inherits(subClass, superClass) {
  function sliceIterator (line 24876) | function sliceIterator(arr, i) {
  function defineProperties (line 24904) | function defineProperties(target, props) {
  function InteractionsList (line 24932) | function InteractionsList() {
  function ListItem (line 24977) | function ListItem() {
  function _interopRequireDefault (line 25106) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 25139) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 25192) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 25197) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 25200) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 25204) | function _inherits(subClass, superClass) {
  function sliceIterator (line 25219) | function sliceIterator(arr, i) {
  function defineProperties (line 25241) | function defineProperties(target, props) {
  function ListItem (line 25294) | function ListItem() {
  function _interopRequireDefault (line 25414) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 25443) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 25448) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 25451) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 25455) | function _inherits(subClass, superClass) {
  function defineProperties (line 25470) | function defineProperties(target, props) {
  function ListItem (line 25520) | function ListItem() {
  function _interopRequireDefault (line 25598) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 25776) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 25824) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 25829) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 25832) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 25836) | function _inherits(subClass, superClass) {
  function defineProperties (line 25857) | function defineProperties(target, props) {
  function SnapshotSelectorWrapper (line 25885) | function SnapshotSelectorWrapper() {
  function SnapshotSelector (line 25983) | function SnapshotSelector() {
  function ListItem (line 26035) | function ListItem() {
  function _interopRequireDefault (line 26093) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 26187) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 26263) | function _interopRequireDefault(obj) {
  function _interopRequireDefault (line 26355) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 26360) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 26363) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 26367) | function _inherits(subClass, superClass) {
  function defineProperties (line 26382) | function defineProperties(target, props) {
  function ProfilerSettings (line 26394) | function ProfilerSettings() {
  function _classCallCheck (line 26502) | function _classCallCheck(instance, Constructor) {
  function defineProperties (line 26506) | function defineProperties(target, props) {
  function RelayPlugin (line 26518) | function RelayPlugin(store, bridge, refresh) {
  function _classCallCheck (line 26565) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 26568) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 26572) | function _inherits(subClass, superClass) {
  function getDataIDs (line 26583) | function getDataIDs(obj) {
  function getDataIDsInternal (line 26587) | function getDataIDsInternal(obj, collector) {
  function defineProperties (line 26597) | function defineProperties(target, props) {
  function Store (line 26613) | function Store(bridge, mainStore) {
  function _classCallCheck (line 26745) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 26748) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 26752) | function _inherits(subClass, superClass) {
  function defineProperties (line 26764) | function defineProperties(target, props) {
  function QueriesTab (line 26776) | function QueriesTab() {
  function _classCallCheck (line 26819) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 26822) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 26826) | function _inherits(subClass, superClass) {
  function defineProperties (line 26838) | function defineProperties(target, props) {
  function QueryList (line 26850) | function QueryList() {
  function _classCallCheck (line 26922) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 26925) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 26929) | function _inherits(subClass, superClass) {
  function defineProperties (line 26947) | function defineProperties(target, props) {
  function Query (line 26959) | function Query() {
  function _interopRequireDefault (line 27036) | function _interopRequireDefault(obj) {
  function _classCallCheck (line 27041) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 27044) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 27048) | function _inherits(subClass, superClass) {
  function defineProperties (line 27060) | function defineProperties(target, props) {
  function QueryViewer (line 27072) | function QueryViewer() {
  function tidyGraphQL (line 27146) | function tidyGraphQL(input) {
  function _classCallCheck (line 27164) | function _classCallCheck(instance, Constructor) {
  function _possibleConstructorReturn (line 27167) | function _possibleConstructorReturn(self, call) {
  function _inherits (line 27171) | function _inherits(subClass, superClass) {
  function defineProperties (line 27183) | function defineProperties(target, props) {
  function ElementPanel (line 27195) | function ElementPanel() {

FILE: index.js
  method write (line 33) | write (chunk, env, done) {
  function watchAndReload (line 104) | function watchAndReload () {

FILE: tests/index.js
  function initAndSkipIntro (line 77) | function initAndSkipIntro (app, t) {
  function createApp (line 158) | function createApp (t) {
  function clear (line 177) | function clear () {
  function init (line 192) | function init (app, t) {
  function waitForLoad (line 197) | function waitForLoad (app, t) {
  function endTest (line 222) | function endTest (app, t) {

FILE: tests/utils/waitForMatch.js
  function check (line 14) | function check () {
Condensed preview — 88 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,954K chars).
[
  {
    "path": ".babelrc",
    "chars": 259,
    "preview": "{\n  \"presets\": [\n    \"@babel/preset-react\"\n  ],\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\n        \"@babel/plugin-trans"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1635,
    "preview": "<!--\nThanks for contributing to the project!\nPlease help us keep this project in good shape by going through this checkl"
  },
  {
    "path": ".github/workflows/nodejs.yml",
    "chars": 1121,
    "preview": "name: Node CD\n\non: [push]\n\njobs:\n  build:\n    runs-on: ${{ matrix.os }}\n\n    strategy:\n      matrix:\n        os: [window"
  },
  {
    "path": ".gitignore",
    "chars": 101,
    "preview": "node_modules\n.DS_Store\ndmgs\nnpm-debug.log\nbuild/background.tiff\n.dat\ntags\nyarn.lock\nstatic/bundle.js\n"
  },
  {
    "path": ".travis.yml",
    "chars": 466,
    "preview": "dist: trusty\ncache: bundler\nsudo: false\n\nlanguage: node_js\nnode_js:\n  - 12.4\n\nos:\n  - osx\n  - linux\n\nnotifications:\n  em"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 3662,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file. See [standard-version](https://github."
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1374,
    "preview": "# Hello there!\n\nThanks for considering to contribute. Dat Desktop is a tool developed by the open source community, and "
  },
  {
    "path": "LICENSE",
    "chars": 1068,
    "preview": "MIT License\n\nCopyright (c) 2017 Dat Project\n\nPermission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "README.md",
    "chars": 2091,
    "preview": "[![deprecated](http://badges.github.io/stability-badges/dist/deprecated.svg)](https://dat-ecosystem.org/) \n\nMore info on"
  },
  {
    "path": "app/actions/dat-middleware.js",
    "chars": 11470,
    "preview": "'use strict'\n\nimport Dat from 'dat-node'\nimport { encode } from 'dat-encoding'\nimport fs from 'fs'\nimport { basename, jo"
  },
  {
    "path": "app/actions/index.js",
    "chars": 3201,
    "preview": "'use strict'\n\nimport { encode } from 'dat-encoding'\nimport { clipboard, remote, shell } from 'electron'\nimport fs from '"
  },
  {
    "path": "app/components/app.js",
    "chars": 1166,
    "preview": "'use strict'\n\nimport React, { Fragment } from 'react'\nimport { connect } from 'react-redux'\n\nimport SCREEN from '../cons"
  },
  {
    "path": "app/components/button.js",
    "chars": 2750,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\n\nconst BaseButton = styled.button.attrs(p"
  },
  {
    "path": "app/components/dat-import.js",
    "chars": 1953,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport Icon from './icon'\n\nconst Label = "
  },
  {
    "path": "app/components/dialog.js",
    "chars": 5381,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport Icon from './icon'\nimport * as But"
  },
  {
    "path": "app/components/empty.js",
    "chars": 1516,
    "preview": "import React from 'react'\nimport styled from 'styled-components'\nimport Icon from './icon'\n\nconst Main = styled.main`\n  "
  },
  {
    "path": "app/components/file-list.js",
    "chars": 1053,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport bytes from 'prettier-bytes'\n\nconst"
  },
  {
    "path": "app/components/finder-button.js",
    "chars": 632,
    "preview": "'use strict'\n\nimport React from 'react'\nimport * as Button from './button'\nimport Icon from './icon'\nimport { resolve } "
  },
  {
    "path": "app/components/header.js",
    "chars": 2271,
    "preview": "'use strict'\n\nimport React, { Fragment } from 'react'\nimport styled from 'styled-components'\nimport { transparentize } f"
  },
  {
    "path": "app/components/hex-content.js",
    "chars": 1306,
    "preview": "import React from 'react'\nimport Swap from 'react-swap'\nimport * as Button from './button'\nimport Icon from './icon'\n\nco"
  },
  {
    "path": "app/components/icon.js",
    "chars": 367,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\n\nconst Svg = styled.svg`\n  display: block"
  },
  {
    "path": "app/components/inspect.js",
    "chars": 4245,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport { toStr } from 'dat-encoding'\nimpo"
  },
  {
    "path": "app/components/intro.js",
    "chars": 4110,
    "preview": "'use strict'\n\nimport React, { Fragment, Component } from 'react'\nimport styled from 'styled-components'\nimport { Green a"
  },
  {
    "path": "app/components/status-bar.js",
    "chars": 540,
    "preview": "import React from 'react'\nimport styled from 'styled-components'\nimport bytes from 'prettier-bytes'\n\nconst StatusBar = s"
  },
  {
    "path": "app/components/status.js",
    "chars": 3135,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport bytes from 'prettier-bytes'\n\nconst"
  },
  {
    "path": "app/components/table-row.js",
    "chars": 4701,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport * as Button from './button'\nimport"
  },
  {
    "path": "app/components/table.js",
    "chars": 1646,
    "preview": "'use strict'\n\nimport React from 'react'\nimport styled from 'styled-components'\nimport TableRowContainer from '../contain"
  },
  {
    "path": "app/components/title-field.js",
    "chars": 3555,
    "preview": "import React, { Component } from 'react'\nimport ReactDOM from 'react-dom'\nimport styled from 'styled-components'\nimport "
  },
  {
    "path": "app/consts/env.js",
    "chars": 81,
    "preview": "export const DAT_ENV = window.DAT_ENV || {} // in test, attach the blank object.\n"
  },
  {
    "path": "app/consts/screen.js",
    "chars": 183,
    "preview": "export const INTRO = 'intro'\nexport const DATS = 'dats'\nexport const DOWNLOAD = 'download'\nexport const INSPECT = 'inspe"
  },
  {
    "path": "app/consts/state.js",
    "chars": 456,
    "preview": "'use strict'\n\nimport SCREEN from '../consts/screen'\n\nexport const generateDefaultState = () => ({\n  dats: {},\n  screen: "
  },
  {
    "path": "app/containers/dat-import.js",
    "chars": 496,
    "preview": "import DatImport from '../components/dat-import'\nimport { requestDownload, downloadSparseDat } from '../actions'\nimport "
  },
  {
    "path": "app/containers/dialog.js",
    "chars": 853,
    "preview": "import { Link, Confirm, Alert } from '../components/dialog'\nimport {\n  copyLink,\n  closeShareDat,\n  confirmDeleteDat,\n  "
  },
  {
    "path": "app/containers/drag-drop.js",
    "chars": 986,
    "preview": "import React from 'react'\nimport styled from 'styled-components'\nimport FileDrop from 'react-file-drop'\nimport { connect"
  },
  {
    "path": "app/containers/header.js",
    "chars": 604,
    "preview": "import Header from '../components/header'\nimport { createDat, toggleMenu } from '../actions'\nimport { connect } from 're"
  },
  {
    "path": "app/containers/inspect.js",
    "chars": 962,
    "preview": "'use strict'\n\nimport SCREEN from '../consts/screen'\nimport Inspect from '../components/inspect'\n\nimport {\n  closeInspect"
  },
  {
    "path": "app/containers/intro.js",
    "chars": 588,
    "preview": "'use strict'\n\nimport SCREEN from '../consts/screen'\nimport { connect } from 'react-redux'\nimport IntroScreen from '../co"
  },
  {
    "path": "app/containers/status-bar.js",
    "chars": 370,
    "preview": "'use strict'\n\nimport StatusBar from '../components/status-bar'\nimport { connect } from 'react-redux'\n\nconst mapStateToPr"
  },
  {
    "path": "app/containers/table-row.js",
    "chars": 689,
    "preview": "'use strict'\n\nimport { connect } from 'react-redux'\nimport TableRow from '../components/table-row'\nimport {\n  shareDat,\n"
  },
  {
    "path": "app/containers/table.js",
    "chars": 320,
    "preview": "'use strict'\n\nimport SCREEN from '../consts/screen'\nimport Table from '../components/table'\nimport { connect } from 'rea"
  },
  {
    "path": "app/index.js",
    "chars": 1909,
    "preview": "'use strict'\n\nimport React from 'react'\nimport { render } from 'react-dom'\nimport { Provider } from 'react-redux'\nimport"
  },
  {
    "path": "app/reducers/index.js",
    "chars": 6752,
    "preview": "'use strict'\n\nimport SCREEN from '../consts/screen'\nimport { generateDefaultState } from '../consts/state'\n\nconst redatA"
  },
  {
    "path": "appveyor.yml",
    "chars": 595,
    "preview": "environment:\n  ELECTRON_ENABLE_STACK_DUMPING: 'true'\n  DEBUG: '*,-nugget*,-eslint*,-extract-zip*,-sumchecker*,-electron-"
  },
  {
    "path": "dev/react-dev-tools/_metadata/verified_contents.json",
    "chars": 6605,
    "preview": "[{\"description\":\"treehash per file\",\"signed_content\":{\"payload\":\"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGl"
  },
  {
    "path": "dev/react-dev-tools/build/backend.js",
    "chars": 393638,
    "preview": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/*"
  },
  {
    "path": "dev/react-dev-tools/build/background.js",
    "chars": 3105,
    "preview": "!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return install"
  },
  {
    "path": "dev/react-dev-tools/build/contentScript.js",
    "chars": 1679,
    "preview": "!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return install"
  },
  {
    "path": "dev/react-dev-tools/build/inject.js",
    "chars": 10865,
    "preview": "!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return install"
  },
  {
    "path": "dev/react-dev-tools/build/main.js",
    "chars": 1816,
    "preview": "!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return install"
  },
  {
    "path": "dev/react-dev-tools/build/panel.js",
    "chars": 1329060,
    "preview": "!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return install"
  },
  {
    "path": "dev/react-dev-tools/main.html",
    "chars": 156,
    "preview": "<!doctype html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <script src=\"./build/main.js\"></script>\n    </h"
  },
  {
    "path": "dev/react-dev-tools/manifest.json",
    "chars": 1188,
    "preview": "{\n\"update_url\": \"https://clients2.google.com/service/update2/crx\",\n\n  \"manifest_version\": 2,\n  \"name\": \"React Developer "
  },
  {
    "path": "dev/react-dev-tools/panel.html",
    "chars": 786,
    "preview": "<!doctype html>\n<html style=\"display: flex\">\n    <head>\n        <meta charset=\"utf8\">\n        <style>\n            html {"
  },
  {
    "path": "dev/react-dev-tools/popups/deadcode.html",
    "chars": 786,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 460px;\n    min-height: 133p"
  },
  {
    "path": "dev/react-dev-tools/popups/development.html",
    "chars": 611,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 460px;\n    min-height: 101p"
  },
  {
    "path": "dev/react-dev-tools/popups/disabled.html",
    "chars": 444,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 410px;\n    min-height: 33px"
  },
  {
    "path": "dev/react-dev-tools/popups/outdated.html",
    "chars": 604,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 460px;\n    min-height: 117p"
  },
  {
    "path": "dev/react-dev-tools/popups/production.html",
    "chars": 353,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 460px;\n    min-height: 39px"
  },
  {
    "path": "dev/react-dev-tools/popups/shared.js",
    "chars": 639,
    "preview": "/* globals chrome */\n\ndocument.addEventListener('DOMContentLoaded', function() {\n  // Make links work\n  var links = docu"
  },
  {
    "path": "dev/react-dev-tools/popups/unminified.html",
    "chars": 675,
    "preview": "<script src=\"shared.js\"></script>\n<style>\n  html, body {\n    font-size: 14px;\n    min-width: 460px;\n    min-height: 133p"
  },
  {
    "path": "dist/.gitignore",
    "chars": 14,
    "preview": "*\n!.gitignore\n"
  },
  {
    "path": "index.html",
    "chars": 663,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"Content-Security-Policy\" content=\"script-src 'self' 'unsafe-inline"
  },
  {
    "path": "index.js",
    "chars": 3481,
    "preview": "'use strict'\n\nconst { app, BrowserWindow, shell, Menu, ipcMain } = require('electron')\nconst { neutral } = require('dat-"
  },
  {
    "path": "lib/auto-updater.js",
    "chars": 1530,
    "preview": "const os = require('os')\nconst { app, dialog, autoUpdater } = require('electron')\nconst ms = require('ms')\n\nmodule.expor"
  },
  {
    "path": "package.json",
    "chars": 4424,
    "preview": "{\n  \"name\": \"dat-desktop\",\n  \"productName\": \"Dat Desktop\",\n  \"version\": \"3.0.3\",\n  \"license\": \"MIT\",\n  \"repository\": \"da"
  },
  {
    "path": "preload.js",
    "chars": 1139,
    "preview": "'use strict'\n/**\n * This file exists for security reasons!\n *\n * It prepares by removing dangerous scripts from the glob"
  },
  {
    "path": "static/base.css",
    "chars": 1894,
    "preview": "@font-face {\n  font-family: 'SourceSansPro';\n  src: url('fonts/SourceSansPro-Regular.ttf')  format('truetype')\n}\n\n@font-"
  },
  {
    "path": "tests/fixtures/dat.json",
    "chars": 46,
    "preview": "{\"title\": \"hello world\", \"author\": \"karissa\"}\n"
  },
  {
    "path": "tests/fixtures/hello.txt",
    "chars": 6,
    "preview": "mundo\n"
  },
  {
    "path": "tests/index.js",
    "chars": 6153,
    "preview": "#!/usr/bin/env node\nvar clipboard = require('clipboardy')\nvar spectron = require('spectron')\nvar path = require('path')\n"
  },
  {
    "path": "tests/utils/wait.js",
    "chars": 219,
    "preview": "// Returns a promise that resolves after 'ms' milliseconds. Default: 1 second\nmodule.exports = function wait (ms) {\n  ms"
  },
  {
    "path": "tests/utils/waitForAndClick.js",
    "chars": 308,
    "preview": "const waitForVisible = require('./waitForVisible')\n\nmodule.exports = function waitForAndClick (t, app, selector, ms, rev"
  },
  {
    "path": "tests/utils/waitForMatch.js",
    "chars": 974,
    "preview": "var wait = require('./wait')\n\nmodule.exports = function waitForMatch (t, app, selector, regexp, ms, reverse) {\n  if (rev"
  },
  {
    "path": "tests/utils/waitForVisible.js",
    "chars": 211,
    "preview": "module.exports = function waitForVisible (t, app, selector, ms, reverse) {\n  return app.client.waitForVisible(selector, "
  },
  {
    "path": "unit-tests/_helpers/enzymeSetup.js",
    "chars": 98,
    "preview": "import configure from 'enzyme-adapter-react-helper'\n\nconfigure({ disableLifecycleMethods: true })\n"
  },
  {
    "path": "unit-tests/_helpers/mockWindow.js",
    "chars": 55,
    "preview": "global.window = {\n  addEventListener: function () {}\n}\n"
  },
  {
    "path": "unit-tests/dat-import.js",
    "chars": 401,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport DatImport from '../app/compone"
  },
  {
    "path": "unit-tests/file-list.js",
    "chars": 1202,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow, render } from 'enzyme'\nimport FileList from '../app/"
  },
  {
    "path": "unit-tests/hex-content.js",
    "chars": 1285,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport HexContent from '../app/compon"
  },
  {
    "path": "unit-tests/inspect.js",
    "chars": 2742,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport Inspect from '../app/component"
  },
  {
    "path": "unit-tests/intro.js",
    "chars": 1944,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport Intro from '../app/components/"
  },
  {
    "path": "unit-tests/status-bar.js",
    "chars": 562,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport StatusBar from '../app/compone"
  },
  {
    "path": "unit-tests/status.js",
    "chars": 1869,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport Status from '../app/components"
  },
  {
    "path": "unit-tests/table-row.js",
    "chars": 2959,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport TableRow from '../app/componen"
  },
  {
    "path": "unit-tests/table.js",
    "chars": 745,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport Table from '../app/components/"
  },
  {
    "path": "unit-tests/title-field.js",
    "chars": 1457,
    "preview": "import test from 'tape'\nimport React from 'react'\nimport { shallow } from 'enzyme'\nimport TitleField from '../app/compon"
  },
  {
    "path": "webpack.config.js",
    "chars": 827,
    "preview": "const nodeExternals = require('webpack-node-externals')\nconst path = require('path')\nmodule.exports = (_, argv) => ({\n  "
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the dat-land/dat-desktop GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 88 files (1.8 MB), approximately 447.9k tokens, and a symbol index with 1583 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!