[
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {\n    \"no-console\": [\n      \"error\",\n      {\n        \"allow\": [\n          \"error\",\n          \"warn\",\n          \"log\"\n        ]\n      }\n    ],\n\n    \"camelcase\": \"off\",\n    \"@typescript-eslint/camelcase\": [\n      \"error\",\n      {\n        \"allow\": [\n          \"^reactxp_\",\n          \"^mixin_\",\n          \"^UNSAFE_\",\n          \"^Radio_button_\" /* Android properties only */\n        ]\n      }\n    ],\n    \"@typescript-eslint/no-parameter-properties\": \"off\"\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n\n    {\n      \"files\": [\n        \"ReactXP.ts\",\n        \"ModuleInterface.ts\"\n      ],\n      \"rules\": {\n        \"no-self-assign\": \"off\",\n        \"prefer-const\": \"off\",\n\n        \"@typescript-eslint/no-namespace\": \"off\",\n        \"@typescript-eslint/no-unused-vars\": \"off\",\n        \"@typescript-eslint/prefer-namespace-keyword\": \"off\"\n      }\n    },\n\n    {\n      \"files\": [\n        \"Easing.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/member-naming\": [\n          \"error\",\n          {\n            \"public\": \"^[A-Z]\\\\w+$\"\n          }\n        ]\n      }\n    },\n\n    {\n      \"files\": [\n        \"*.d.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/prefer-namespace-keyword\": \"off\",\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    },\n\n    {\n      \"files\": [\n        \"*/web/Animated.tsx\",\n        \"*/native-desktop/RootView.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/member-naming\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\n/samples/*/node_modules\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n\n# Build artifacts\n/src/.vs\n/src/bin\n/src/obj\n/dist\n\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\n\n\n.idea/*\n.vs\n"
  },
  {
    "path": ".npmignore",
    "content": "/node_modules\n/src/.vs\n/src/bin\n/src/obj\n/samples\n/extensions\n/docs\n*.user\n.eslintrc"
  },
  {
    "path": ".npmrc",
    "content": ""
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\n\nnode_js:\n  - \"node\"\n\ndist: trusty\n\nsudo: false\n\naddons:\n  chrome: stable\n\ninstall:\n  - node --version\n  - npm --version\n  - npm i\n\nscript:\n  - npm run lint\n  - npm run build\n\ncache:\n  directories:\n    - node_modules\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to ReactXP\n\nWe welcome contributions to ReactXP! This gude provides some tips for a successful contributions.\n\nFor complex changes, we recommend filing a GitHub issue to start a discussion with project maintainers before implementing the change.\n\n## Pull Requests\n\nPlease make sure the following is done when submitting a pull request:\n\n1. Fork the repo and create your branch from `master`.\n2. If you've added code that should be tested, add test code to the RXPTest sample app.\n3. If you've changed APIs, update the documentation files.\n4. Ensure the test suite passes.\n5. If you haven't already, complete the Contributor License Agreement (\"CLA\").\n\n## Testing Your Change\n\nTo test your change:\n1. Rebuild reactxp: `npm i` and `npm run build`\n2. Switch to the RXPTest sample directory: `cd ./samples/RXPTest`\n3. Update dependencies: `npm i`\n4. Copy the locally-built reactxp library: `cp -r ../../dist/* ./node_modules/reactxp/dist`\n5. Rebuild the test app: `npm run web-watch` or `npm run rn-watch`\n6. If testing the web version: \n  - for desktop: open the test in the browser: `open ./index.html` and run the test\n  - for mobile: run `npm run web -- -host YOUR_LOCAL_IP` then on your mobile enter `http://YOUR_LOCAL_IP:8080`\n7. If testing one or more RN versions, open the corresponding native project and build and run the test\n\n## Contributor License Agreement (\"CLA\")\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This is a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## Issues\n\nWe use GitHub issues to track bugs.\n\n## Coding Style\n\nReactXP is written in TypeScript and uses tslint to help enforce an internally-consistent coding style. Contributions should be consistent with this style.\n\n"
  },
  {
    "path": "LICENSE",
    "content": "ReactXP\r\n\r\nCopyright (c) Microsoft Corporation\r\nAll rights reserved. \r\n\r\nMIT License\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\r\nsoftware and associated documentation files (the Software), to deal in the Software\r\nwithout restriction, including without limitation the rights to use, copy, modify, merge,\r\npublish, distribute, sublicense, and/or sell copies of the Software, and to permit\r\npersons to whom the Software is furnished to do so, subject to the following conditions:\r\n \r\nThe above copyright notice and this permission notice shall be included in all copies\r\nor substantial portions of the Software.\r\n \r\nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\r\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\r\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\r\nFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\r\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\nDEALINGS IN THE SOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "# ReactXP\r\n\r\n[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/Microsoft/reactxp/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/reactxp.svg?style=flat-square)](https://www.npmjs.com/package/reactxp) [![Build Status](https://dev.azure.com/ms/reactxp/_apis/build/status/Microsoft.reactxp?)](https://dev.azure.com/ms/reactxp/_build/latest?definitionId=16) [![Build Status](https://img.shields.io/travis/Microsoft/reactxp/master.svg?style=flat-square)](https://travis-ci.org/Microsoft/reactxp) [![npm downloads](https://img.shields.io/npm/dm/reactxp.svg?style=flat-square)](https://www.npmjs.com/package/reactxp) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/Microsoft/reactxp#contributing) [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/msreactxp/Lobby)\r\n\r\n\r\nReactXP is a library for cross-platform app development using React and React Native.\r\n\r\n## ReactXP End of Life\r\nThe ReactXP library is no longer being maintained and is is considered “end of life”. We recommend alternatives such as [React Native for Web](https://necolas.github.io/react-native-web/docs/). The ReactXP github project will be put into “archive” mode and will remain available in read-only form for the benefit of those who are still using it within older projects, but no new versions will be published.\r\n\r\n## Why ReactXP\r\nWith React and React Native, your web app can share most of its logic with your iOS and Android apps, but the view layer needs to be implemented separately for each platform. We have taken this a step further and developed a thin cross-platform layer we call ReactXP. If you write your app to this abstraction, you can share your view definitions, styles and animations across multiple target platforms. Of course, you can still provide platform-specific UI variants, but this can be done selectively where desired.\r\n\r\n## Getting Started\r\nThe [samples](/samples) directory contains a minimal “Hello World” app that demonstrates some basic ReactXP functionality. You can use this as a starting point. Just follow the build instructions in the README file.\r\n\r\nAlso included in the samples directory is the [RXPTest app](/samples/RXPTest) which attempts to exercise all of the functionality of ReactXP. It is a good source to consult for sample usage of APIs, components, and props.\r\n\r\nYou can read more about ReactXP and its APIs from the [ReactXP official Documentation](https://microsoft.github.io/reactxp/docs/getting-started.html).\r\n\r\nUse the command-line tool called [create-rx-app](https://github.com/a-tarasyuk/create-rx-app) to create a starter project.\r\n\r\n```sh\r\nnpm install create-rx-app -g\r\ncreate-rx-app AppName\r\n```\r\n\r\nor\r\n\r\n```sh\r\nnpx create-rx-app AppName\r\n```\r\n\r\nBy default the project will be created in TypeScript. However if you prefer JavaScript instead, add `--javascript` when creating the project.\r\n\r\nThis will create a directory called **AppName** inside the current working directory. Inside **AppName**, this will generate the initial project structure and install all of its dependencies. Once this installation is done, there are some commands you can run in the project directory:\r\n\r\n- `npm run start:web` - runs the Web version of the app in the development mode\r\n- `npm run build:web` - builds the Web version of the app for production to the **dist-web** folder\r\n- `npm run start:ios` - runs the iOS version of the app and attempts to open in the iOS Simulator if you're on a Mac and have it installed\r\n- `npm run start:android` - runs the Android version of the app and attempts to open your app on a connected Android device or emulator\r\n- `npm run start:windows` - runs the Windows version of the app\r\n- `npm start:rn-dev-server` - runs react native (RN) development server\r\n\r\n### Prerequisites\r\n* [Node.Js](https://nodejs.org/) ([Setup Instructions](https://nodejs.org/en/download/package-manager/))\r\n* [React Native](https://facebook.github.io/react-native/) ([Setup Instructions](https://facebook.github.io/react-native/docs/getting-started))\r\n\r\n## ESLint rules\r\n\r\n> [TSLint will be deprecated some time in 2019](https://github.com/palantir/tslint)\r\n\r\nIf you plan to migrate your projects from TSLint to ESlint and want to continue using the [_rules_](https://github.com/microsoft/reactxp/tree/master/src/tslint) to automate search common problems in *ReactXP* usage, you can use [eslint-plugin-reactxp](https://github.com/a-tarasyuk/eslint-plugin-reactxp).\r\n\r\n## Contributing\r\n\r\nWe welcome contributions to ReactXP. See the [CONTRIBUTING](./CONTRIBUTING.md) file for how to help out.\r\n\r\n## License\r\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\r\n"
  },
  {
    "path": "README_Hindi.md",
    "content": "# ReactXP\n\n[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/Microsoft/reactxp/blob/master/LICENSE) [![npm version](https://img.shields.io/npm/v/reactxp.svg?style=flat-square)](https://www.npmjs.com/package/reactxp) [![Build Status](https://img.shields.io/travis/Microsoft/reactxp/master.svg?style=flat-square)](https://travis-ci.org/Microsoft/reactxp) [![npm downloads](https://img.shields.io/npm/dm/reactxp.svg?style=flat-square)](https://www.npmjs.com/package/reactxp) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/Microsoft/reactxp#contributing) [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/msreactxp/Lobby)\n\nReactXP एक क्रॉस-प्लॅटफॉर्म ऍप डेवलपमेंट लाइब्रेरी है जिसमे React और React Native का उपयोग किया जाता है.\n\n##ReactXP क्यों ?\nReact और React Native के साथ आपका वेब ऍप, iOS और Android ऍप के साथ ज्यादातर तार्किक शेयर कर सकता है, लेकिन view layer आपको अलग से  इम्प्लीमेंट करना होगा हर एक प्लॅटफॉर्म के लिए. हमने एक कदम आगे लेकर एक हल्का क्रॉस-प्लॅटफॉर्म लेयर विकसित किया है जिसे हम ReactXP बुलाते है. अगर आप  आपके ऍप को इस abstraction के हिसाब से लिखते है फिर आप आपके view definitions, styles और animations को शेयर कर सकते है मल्टिपल टारगेट प्लेटफॉर्म्स पर. आप प्लेटफार्म स्पेसिफिक UI variants भी प्रदान कर सकते है जैसे आप चुनेंगे जब आपकी मर्ज़ी हो|\n\n## शुरुआत\nदिए हुए [samples](/samples) directory में आपको एक आसान सा “Hello World” ऍप मिलेगा जिसमे ReactXP के बुनियादी कार्यक्षमता दिखाई गई है. आप उससे स्टार्टिंग पॉइंट की तरह प्रयोग कर सकते है. दिए हुए README के सूचनाओं का पालन कर सकते है.\n\nsamples directory[RXPTest app](/samples/RXPTest) में RXPTest ऍप भी दिया गया है जो ReactXP के सारे कार्यक्षमताओं का उपयोग करने का प्रयास करता है.\nये एक अछि सोर्स है APIs, components और props का उपयोग जान्ने के लिए.\n\nआप ReactXP और उसके APIs के बारे में और पड़ सकते है इस वेबसाइट पर [ReactXP official Documentation](https://microsoft.github.io/reactxp/docs/getting-started.html).\n\n[create-rx-app](https://github.com/a-tarasyuk/create-rx-app) नाम के कमांड-लाइन टूल का उपयोग करके स्टार्टर प्रोजेक्ट बनाइये.\n\n```sh\nnpm install create-rx-app -g\ncreate-rx-app AppName\n```\n\nअथवा\n\n```sh\nnpx create-rx-app AppName\n```\nशुरुवात में प्रोजेक्ट TypeScript में उपलब्ध किया जाता hai. लेकिन अगर आपको JavaScript में  करना हो तोह प्रोजेक्ट बनाते समय फिर `--javascript` का  उपयोग  करें.\n\nये **AppName** नाम का डायरेक्टरी बनाएगा वर्किंग डायरेक्टरी में. **AppName** के अंदर शुरुवाती प्रोजेक्ट का आकार बना हुआ रहेगा और सारे dependencies इनस्टॉल किये हुए रहेंगे. इंस्टालेशन ख़तम होने के बाद निचे दिए हुए कुछ commands आप रन कर सकते है प्रोजेक्ट डायरेक्टरी में :\n\n- `npm run start:web` - ऍप के Web version को development mode में run करने के लिए\n- `npm run build:web` - ऍप के Web version को बनता है production के लिए **dist-web** फोल्डर में\n- `npm run start:ios` - ऍप के iOS version को run करके iOS Simulator में खोलके की कोशिश करता है अगर आप Mac इस्तेमाल कर रहे हो और उसमे इनस्टॉल किया हुआ हो\n- `npm run start:android` - ऍप के Android version को run करके आपके ऍप को connected Android device या फिर emulator पर खोलने के कोशिश करता है\n- `npm run start:windows` - ऍप के Windows version को run करता है\n- `npm start:rn-dev-server` - React native (RN) development server run करता है\n\n### Prerequisites\n* [Node.Js](https://nodejs.org/) ([Setup Instructions](https://nodejs.org/en/download/package-manager/))\n* [React Native](https://facebook.github.io/react-native/) ([Setup Instructions](https://facebook.github.io/react-native/docs/getting-started))\n\n## Contributing\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This is a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.8 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "azure-pipelines.yml",
    "content": "# Node.js\n# Build a general Node.js project with npm.\n# Add steps that analyze code, save build artifacts, deploy, and more:\n# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript\n\npool:\n  vmImage: 'Ubuntu 16.04'\n\nsteps:\n- task: NodeTool@0\n  inputs:\n    versionSpec: '8.x'\n  displayName: 'Install Node.js'\n\n- script: |\n    npm ci\n    npm run lint\n    npm run build\n  displayName: 'npm install and build'"
  },
  {
    "path": "docs/Gemfile",
    "content": "source 'https://rubygems.org'\n\n# jekyll, which builds it all\n# 3.0 includes sass processing\ngem 'jekyll', '~>3.1'\n\n# Jekyll extensions\ngem 'jekyll-redirect-from'\ngem 'jekyll-paginate'\n"
  },
  {
    "path": "docs/_config.yml",
    "content": "theme: jekyll-theme-slate\nname: ReactXP\ndescription: A library for building cross-platform apps\nurl: https://microsoft.github.io\nbaseurl: /reactxp\npermalink: /blog/:year/:month/:day/:title.html\npaginate_path: /blog/page:num/\npaginate: 5\ntimezone: America/Los_Angeles\ndefaults:\n- scope:\n    path: blog\n    type: pages\n  values:\n    layout: post\n    sectionid: blog\n- scope:\n    path: docs\n    type: pages\n  values:\n    layout: docs\n    sectionid: docs\n- scope:\n    path: community\n    type: pages\n  values:\n    layout: default\n    sectionid: community\n- scope:\n    path: versions\n    type: pages\n  values:\n    layout: default\n    sectionid: versions\nexclude:\n- Gemfile\n- README.md\nsass:\n  sass_dir: ./_sass\ngems:\n- jekyll-redirect-from\n- jekyll-paginate\n\n\n"
  },
  {
    "path": "docs/_data/authors.yml",
    "content": "# Map of short name to more information. `name` will be used but if you don't\n# want to use your real name, just use whatever. If url is included, your name\n# will be a link to the provided url.\nerictraut:\n  name: Eric Traut\n  url: https://github.com/erictraut\n"
  },
  {
    "path": "docs/_data/nav_docs.yml",
    "content": "- title: Quick Start\n  items:\n    - id: getting-started\n      title: Getting Started\n    - id: using-reactxp\n      title: Using ReactXP\n    - id: faq\n      title: FAQ\n    - id: react_concepts\n      title: React Concepts\n    - id: react_lifecycle\n      title: Component Lifecycle\n    - id: react_stores\n      title: Stores & Services\n    - id: styles\n      title: Styles\n    - id: animations\n      title: Animations\n    - id: accessibility\n      title: Accessibility\n    - id: extensions\n      title: Extensions\n- title: Components\n  items:\n    - id: components/activityindicator\n      title: ActivityIndicator\n    - id: components/button\n      title: Button\n    - id: components/gestureview\n      title: GestureView\n    - id: components/image\n      title: Image\n    - id: components/link\n      title: Link\n    - id: components/picker\n      title: Picker\n    - id: components/scrollview\n      title: ScrollView\n    - id: components/text\n      title: Text\n    - id: components/textinput\n      title: TextInput\n    - id: components/view\n      title: View\n    - id: components/webview\n      title: WebView\n- title: APIs\n  items:\n    - id: apis/accessibility\n      title: Accessibility\n    - id: apis/alert\n      title: Alert\n    - id: apis/app\n      title: App\n    - id: apis/clipboard\n      title: Clipboard\n    - id: apis/input\n      title: Input\n    - id: apis/international\n      title: International\n    - id: apis/linking\n      title: Linking\n    - id: apis/location\n      title: Location\n    - id: apis/modal\n      title: Modal\n    - id: apis/network\n      title: Network\n    - id: apis/platform\n      title: Platform\n    - id: apis/popup\n      title: Popup\n    - id: apis/statusbar\n      title: StatusBar\n    - id: apis/storage\n      title: Storage\n    - id: apis/userinterface\n      title: UserInterface\n    - id: apis/userpresence\n      title: UserPresence\n- title: Extensions\n  items:\n    - id: extensions/database\n      title: Database\n    - id: extensions/imagesvg\n      title: ImageSvg\n    - id: extensions/navigator\n      title: Navigator\n    - id: extensions/netinfo\n      title: NetInfo\n    - id: extensions/restclient\n      title: REST Client\n    - id: extensions/video\n      title: Video\n    - id: extensions/virtuallistview\n      title: VirtualListView\n    - id: extensions/webview\n      title: WebView\n"
  },
  {
    "path": "docs/_includes/blog_post.html",
    "content": "{% assign page = include.page %}\n\n<h1>\n{% if include.isPermalink %}\n  {{ page.title }}\n{% else %}\n  <a href=\"/reactxp{{ page.url }}\">{{ page.title }}</a>\n{% endif %}\n</h1>\n\n<p class=\"meta\">\n  {{ page.date | date: \"%B %e, %Y\" }}\n  by\n  <a href=\"{{ site.data.authors[page.author].url }}\">{{ site.data.authors[page.author].name }}</a>\n</p>\n\n<hr>\n\n<div class=\"post\">\n  {{ include.content }}\n</div>\n\n"
  },
  {
    "path": "docs/_includes/footer.html",
    "content": "<footer class=\"nav-footer\">\n  <section class=\"sitemap\">\n    <a href=\"/reactxp/\" class=\"nav-home\">\n    </a>\n    <div>\n      <a href=\"/reactxp/docs/\">Docs</a>\n      <a href=\"/reactxp/blog/\">Blog</a>\n      <a href=\"/reactxp/community/\">Community</a>\n    </div>\n    <div>\n      <a href=\"https://github.com/microsoft/reactxp\" target=\"_blank\">GitHub</a>\n      <a href=\"http://facebook.github.io/react/\" target=\"_blank\">React</a>\n      <a href=\"http://facebook.github.io/react-native/\" target=\"_blank\">React Native</a>\n    </div>\n  </section>\n  <section class=\"copyright\">\n    Copyright © {{ site.time | date: '%Y' }} Microsoft Corp.\n  </section>\n</footer>"
  },
  {
    "path": "docs/_includes/hero.html",
    "content": "<div class=\"hero\">\n  <div class=\"wrap\">\n    <div class=\"text\"><strong>ReactXP</strong></div>\n    <div class=\"minitext\">\n      A library for building cross-platform apps\n    </div>\n\n    <div class=\"buttons-unit\">\n      <a href=\"/reactxp/docs/getting-started.html\" class=\"button\">Get Started</a>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "docs/_includes/nav_blog.html",
    "content": "<div class=\"nav-docs nav-blog\">\n  <div class=\"nav-docs-section\">\n    <h3>Recent posts</h3>\n    <ul>\n      {% for post in site.posts limit:10 %}\n        <li><a href=\"/reactxp{{ post.url }}\"{% if page.title == post.title %} class=\"active\"{% endif %}>{{ post.title }}</a></li>\n      {% endfor %}\n      <li><a href=\"/reactxp/blog/all.html\">All posts ...</a></li>\n    </ul>\n  </div>\n</div>\n"
  },
  {
    "path": "docs/_includes/nav_docs.html",
    "content": "<div class=\"nav-docs\">\n  <!-- Docs Nav -->\n  {% for section in site.data.nav_docs %}\n    <div class=\"nav-docs-section\">\n      <h3>{{ section.title }}</h3>\n      <ul>\n        {% for item in section.items %}\n          <li>\n            <a href=\"/reactxp/docs/{{ item.id }}.html\" {% if page.id == item.id %} class=\"active\"{% endif %}>\n                {{ item.title }}\n            </a>\n          </li>\n        {% endfor %}\n      </ul>\n    </div>\n  {% endfor %}\n\n</div>\n\n"
  },
  {
    "path": "docs/_includes/navigation.html",
    "content": "<div class=\"nav-main\">\n  <div class=\"wrap\">\n    <a class=\"nav-home\" href=\"/reactxp/\">\n      ReactXP\n    </a>\n    <div class=\"nav-lists\">\n      <ul class=\"nav-site nav-site-internal\">\n        <li><a href=\"/reactxp/docs/getting-started.html\"{% if page.sectionid == 'docs' %} class=\"active\"{% endif %}>Docs</a></li>\n        <li><a href=\"/reactxp/community/support.html\"{% if page.sectionid == 'community' %} class=\"active\"{% endif %}>Community</a></li>\n        <li><a href=\"/reactxp/versions/version_history.html\"{% if page.sectionid == 'versions' %} class=\"active\"{% endif %}>Versions</a></li>\n        <li><a href=\"/reactxp/blog/\"{% if page.sectionid == 'blog' %} class=\"active\"{% endif %}>Blog</a></li>\n      </ul>\n      <ul class=\"nav-site nav-site-external\">\n        <li><a href=\"https://github.com/microsoft/reactxp\">GitHub</a></li>\n      </ul>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "docs/_layouts/default.html",
    "content": "{% if page.excerpt %}\n{% assign type = 'article' %}\n{% assign sectionTitle = 'ReactXP Blog' %}\n{% assign description = page.excerpt | strip_html %}\n{% else %}\n{% assign type = 'website' %}\n{% assign sectionTitle = 'ReactXP' %}\n{% assign description = 'A library for cross-platform development' %}\n{% endif %}\n{% assign title = page.title | append: ' - ' | append: sectionTitle %}\n<!DOCTYPE html>\n<!--[if IE]><![endif]-->\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n  <title>{{ title }}</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <meta property=\"og:title\" content=\"{{ title }}\">\n  <meta property=\"og:type\" content=\"{{ type }}\">\n  <meta property=\"og:url\" content=\"https://microsoft.github.io/reactxp{{ page.url }}\">\n  <meta property=\"og:image\" content=\"https://microsoft.github.io/reactxp/img/logo_og.png\">\n  <meta property=\"og:description\" content=\"{{ description }}\">\n\n  <link rel=\"stylesheet\" href=\"/reactxp/css/syntax.css\">\n  <link rel=\"stylesheet\" href=\"/reactxp/css/reactxp.css\">\n\n  <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js\"></script>\n</head>\n<body>\n\n  <div class=\"container\">\n\n    {% include navigation.html %}\n\n    {{ content }}\n\n    {% include footer.html %}\n  </div>\n</body>\n</html>\n\n"
  },
  {
    "path": "docs/_layouts/docs.html",
    "content": "---\nlayout: default\nsectionid: docs\n---\n\n<section class=\"content wrap documentationContent\">\n  <div class=\"inner-content\">\n    <h1>\n      {{ page.title }}\n    </h1>\n    <div class=\"subHeader\">{{ page.description }}</div>\n\n    {{ content }}\n\n    <div class=\"docs-prevnext\">\n      {% if page.prev %}\n        <a class=\"docs-prev\" href=\"/reactxp/docs/{{ page.prev }}\">&larr; Prev</a>\n      {% endif %}\n      {% if page.next %}\n        <a class=\"docs-next\" href=\"/reactxp/docs/{{ page.next }}\">Next &rarr;</a>\n      {% endif %}\n    </div>\n  </div>\n\n  {% include nav_docs.html %}\n</section>\n"
  },
  {
    "path": "docs/_layouts/hero.html",
    "content": "---\nlayout: default\n---\n\n{% if page.id == 'home' %}\n  {% include hero.html %}\n{% endif %}\n\n<section class=\"content wrap\">\n  {{ content }}\n</section>\n"
  },
  {
    "path": "docs/_layouts/post.html",
    "content": "---\nlayout: default\nsectionid: blog\n---\n\n<section class=\"content wrap blogContent\">\n\n  <div class=\"inner-content\">\n    {% include blog_post.html isPermalink=\"true\" page=page content=content %}\n  </div>\n  {% include nav_blog.html %}\n</section>\n"
  },
  {
    "path": "docs/_plugins/sass.rb",
    "content": "module Jekyll\n  require 'sass'\n  class SassConverter < Converter\n    safe true\n    priority :low\n\n    def matches(ext)\n      ext =~ /scss/i\n    end\n\n    def output_ext(ext)\n      \".css\"\n    end\n\n    def convert(content)\n      engine = Sass::Engine.new(content, :syntax => :scss, :load_paths => [\"#{@config['source']}/_sass/\"])\n      engine.render\n    rescue StandardError => e\n      puts \"!!! SASS Error: \" + e.message\n    end\n  end\nend\n"
  },
  {
    "path": "docs/_posts/2017-04-06-introducing-reactxp.md",
    "content": "---\ntitle: Introducing ReactXP\nauthor: erictraut\n---\n\nThe Skype team at Microsoft are happy to announce that we are open sourcing ReactXP, a library that we developed for cross-platform development. It builds upon React JS and React Native, allowing you to create apps that span both web and native with a single code base.  \n\n\n\n### History of ReactXP\n\nSkype runs on many platforms --- desktops, laptops, mobile phones, tablets, browsers, and even TVs and cars. Historically, the UI for each Skype client was written from scratch in the \"native\" language of each platform (Objective C on iOS, Java on Android, HTML and javascript on the web, etc.). About a year ago, we embarked on an effort to reinvent Skype. We decided that we needed to take a fresh approach to client development - one that would maximize our engineering efficiency and agility. We wanted to move away from implementing each new feature multiple times in different code bases. We wanted to minimize duplication of effort. We explored a number of available options. Web wrappers like Cordova (PhoneGap) didn't provide the performance or \"native feel\" we were looking for. Xamarin, which is a great solution for cross-platform mobile development, didn't help us on the web. We ultimately decided to build our new client on top of React JS and React Native. ReactXP was our attempt to unify the behaviors and interfaces across React JS and the various React Native implementations. (We initially referred to it as ReactX, hence the references to this term within the sources.)\n\nThe Skype team also made many contributions to the React Native code base to fix bugs, improve performance, and eliminate behavioral differences between React JS and React Native. The biggest contribution was a major rework of the React Native layout engine. The original implementation loosely followed the W3C flexbox standard, but it differed from the standard in some important ways. The updated layout engine now reliably produces the same layout as all compliant web browsers.\n\n\n\n### ReactXP Design Philosophy\n\nReactXP was designed to be a thin, lightweight cross-platform abstraction layer on top of React and React Native. It implements a dozen or so foundational components that can be used to build more complex components. It also implements a collection of API namespaces that are required by most applications.\n\nReactXP currently supports the following platforms: web (React JS), iOS (React Native), Android (React Native) and Windows UWP (React Native). Windows UWP is still a work in progress, and some components and APIs are not yet complete.\n\nThe ReactXP \"core\" contains only general-purpose functionality. More specialized cross-platform functionality can be delivered in the form of ReactXP extensions. The Skype team has developed about twenty such extensions, and we plan to open source some of these over time. Extensions allow us to expand ReactXP without increasing its footprint or complexity.\n\nWhen we were deciding which props and style attributes to expose in ReactXP, we tried to stick with those that could be implemented uniformly on all supported platforms. For example, we don't expose any HTML-specific props or CSS-specific attributes that are not also supported in React Native. In a few cases, we decided to expose select platform-specific props or style attributes and documented them as being \"no ops\" on other platforms, but this was done only when we could find no other viable workaround.\n\n\n\n### Future of ReactXP\n\nThe Skype team will continue to maintain and build upon ReactXP. Other teams within Microsoft are also starting to use it and make contributions. Today we are opening it to the broader open source community. We hope that others will find it useful, and we welcome feedback and contributions.\n\nWe plan to snap a new version of ReactXP approximately monthly, roughly aligned to React Native releases. \n\n"
  },
  {
    "path": "docs/_posts/2017-04-27-building-skype-on-reactxp.md",
    "content": "---\ntitle: Building Skype on ReactXP\nauthor: erictraut\n---\n\nReactXP was developed by the Skype team at Microsoft as a way to improve development agility and efficiency. In this article, I'll talk more about the architecture of the new Skype app.\n\n<center><img src=\"/reactxp/img/blog/skype-app-architecture.png\" width=\"739\" height=\"391\" alt=\"Skype application architecture\" /></center>\n\n### Implementing Stores with ReSub\n\nWe initially tried using [Flux](https://facebook.github.io/react/blog/2014/05/06/flux.html), an architectural pattern created by Facebook engineers. We liked some of its properties, but we found it cumbersome because it required us to implement a bunch of helper classes (dispatcher, actions, action creators). State management also became hard to manage within our more complex components. For these reasons, we developed a new mechanism that we call [ReSub](https://github.com/Microsoft/ReSub), short for \"React Subscriptions\". ReSub provides coarse-grained data binding between components and stores, and it automates the process of subscribing and unsubscribing. More details and sample code can be found on the ReSub github site.\n\nSome stores within the app are singleton objects and are allocated --- and perhaps even populated --- at startup time. Others are allocated on demand and have a well-defined lifetime that corresponds to a user interaction or mode.\n\n\n### Caching Data Locally\n\nStores are responsible for maintaining in-memory data representations. We also had the need to persist data in a structured manner. Storing data locally allows the app to run in \"offline\" mode. It also allows for fast startup, since we don't need to wait for data to download over the network.\n\nFor local storage, we developed a [cross-platform no-SQL database abstraction](https://github.com/Microsoft/NoSQLProvider). It uses the native database implementation for each platform (sqlite for iOS, indexDB for some browsers, etc.). The abstraction allows us to create and query multiple tables. Each table can have multiple indexes, including composite (multi-key) indexes. It also supports transactions and string indexing for full text searches.\n\n\n### Services & Startup Management\n\nBackground tasks, such as fetching new messages, are handled by modules we refer to as \"Services\". These are singleton objects that are instantiated at app startup time. Some services are responsible for updating stores and saving information to the local database. Others are responsible for listening to one or more other stores and synthesizing information from those stores (e.g. notifications that are generated for incoming messages that require the user's immediate attention).\n\nIn some cases, a service was so tightly bound to the operation of a particular store that we merged their functionality into a single module. For example, we created a ConfigurationStore to track app-level configuration settings (e.g. which features are enabled for a particular user). We could have implemented a corresponding ConfigurationService that fetches configuration updates, but we opted to implement this functionality within the ConfigurationStore out of pragmatism.\n\nAt startup time, the app needs to instantiate all of its singleton stores and services, some of which have dependencies on others. To facilitate this startup process, we created a startup manager. Each store or service that wants to be started must implement an interface called \"IStartupable\", which includes a \"startup\" method that returns a promise. Modules register themselves with the startup manager and specify which other modules (if any) they depend upon. This allows the startup manager to run startup routines in parallel. Once a startup promise is resolved, it unblocks the startup of any dependent modules. This continues until all registered modules have been started.\n\nHere is a startup routine that populates its store with data from the database. Note that the startup routine returns a promise, which isn't resolved until after the async database access is completed.\n\n``` javascript\nstartup(): SyncTasks.Promise<void> {\n    return ClientDatabase.getRecentConversations().then(conversations => {\n        this._conversations = conversations;\n    });\n}\n```\n\n### Communicating with the REST of the World\n\nSkype is built upon over a dozen different micro-services that run on Azure. For example, one micro-service handles message delivery, another handles the storage and retrieval of photos and videos, and yet another provides dynamic updates of emoticon packs. Each micro-service exposes its functionality through a simple REST API. For each service, we implement a REST Client that exposes the API to the rest of the app. Each REST Client is a subclass of the [Simple REST Client](/reactxp/docs/extensions/restclient.html), which handles retry logic, authentication, and setting of HTTP header values.\n\n\n### Responsive Behavior\n\nThe Skype app runs on a wide variety of devices from phones to desktop PCs with large screens. It is able to adapt to screen size (and orientation) changes at runtime. This is mostly the responsibility of components at the upper layers of the view hierarchy, which change their behavior based on the available screen width. They subscribe to a store that we call \"ResponsiveWidthStore\". Despite its name, this store also tracks the screen (or window) height and the device orientation (landscape vs portrait). \n\nAs is common with most responsive websites, we defined several \"break point\" widths. In our case, we chose three such break points, meaning that our app works in one of four different responsive \"modes\". \n\n<center><img src=\"/reactxp/img/blog/responsive-navigation.png\" width=\"714\" height=\"260\" alt=\"Responsive breakpoints\" /></center>\n\nIn the narrowest mode, the app uses a \"stack navigation\" mode, where UI panels are stacked one on top of another. This is a typical navigation pattern for phones. For wider modes, the app uses a \"composite navigation\" mode, where panels are positioned beside each other, allowing for better use of the expanded screen real estate.\n\n\n### Navigation\n\nThe app coordinates navigation changes through the use of a NavigationStateStore. Components can subscribe to this store to determine whether the app is currently in \"stack navigation\" or \"composite navigation\" mode. When in stack navigation mode, this store records the contents of the stack. When in composite navigation mode, it records which panels and sub-panels are currently displayed (and in some cases, which mode they are in). This is tracked through a NavigationContext object. The parts of the view hierarchy that respond to navigation changes each have a corresponding NavigationContext. Some context have references to other child contexts, reflecting the hierarchical nature of the UI. When the user performs an action that results in a navigation change, the NavigationAction module is responsible for updating the NavigationContext and writing it back to the NavigationStateStore. This, in turn, causes the UI to update.\n\nHere is some code that demonstrates the typical flow. We start with an event handler within a button.\n\n``` javascript\nprivate _onClickConversationButton() {\n    // Navigate to the conversation.\n    NavigationActions.navigateToConversation(this.props.conversationId);\n}\n```\n\nThe NavigationActions module then updates the current navigation context. It needs to handle both the stack and composite cases.\n\n``` javascript\nnavigateToConversation(conversationId: string) {\n    let convContext = this.createConversationNavContext(conversationId);\n\n    if (NavigationStateStore.isUsingStackNav()) {\n        NavigationStateStore.pushNewStackContext(convContext);\n    } else {\n        NavigationStateStore.updateRightPanel(convContext);\n    }\n}\n```\n\nThis causes the NavigationStateStore to update its internal state and trigger a change, which notifies any subscribers.\n\n``` javascript\npushNewStackContext(context: NavigationContext) {\n    this._navStack.push(context);\n\n    // Tell subscribers that the nav context changed.\n    this.trigger();\n}\n```\n\nThe primary subscriber to the NavigationStateStore is a component called RootNavigationView. It is responsible for rendering either a RootStackNavigationView or RootCompositeNavigationView.\n\n``` javascript\nprotected _buildState(/* params omitted */): RootNavigationViewState {\n    return {\n        isStackNav: NavigationStateStore.isUsingStackNav(),\n        compositeNavContext: NavigationStateStore.getCompositeNavContext(),\n        stackNavContext: NavigationStateStore.getStackNavContext()\n    };\n}\n\nrender() {\n    if (this.state.isStackNav) {\n        return (\n            <RootStackNavigationView navContext={ this.state.stackNavContext } />\n        );\n    } else {\n        return (\n            <RootCompositeNavigationView navContext={ this.state.compositeNavContext } />\n        );\n    }\n}\n```\n\n"
  },
  {
    "path": "docs/_posts/2017-05-24-performance-tuning.md",
    "content": "---\ntitle: Performance Tuning\nauthor: erictraut\n---\n\nPerformance tuning is an important part of any app development effort. In this article, I'll talk about some of the tools and techniques we used to identify and address performance bottlenecks within the ReactXP-based Skype app.\n\nOne of the benefits of a cross-platform code base is that many performance improvements benefit all platforms.\n\n\n### Measurement and Analysis\n\nIt has been said that you can't improve what you can't measure. This is especially true for performance tuning. We use a variety of tools to determine which code paths are performance-critical.\n\nRegardless of the analysis tool, you may want to use the production build of the app when measuring performance. The React JavaScript code performs many expensive runtime checks when it executes in \"dev mode\", and this can significantly distort your measurements.\n\n#### Chrome Performance Tools\nThe Chrome browser offers excellent tracing and visualization tools. Open the Developer Tools window, click on the Performance tab, and click on the \"record\" button. Once you're done recording, Chrome will display a detailed timeline with call hierarchies. Zoom in and out to determine where your time is going.\n\n#### Systrace\nReact Native provides a way to enable and disable Systrace, a method-level trace recording facility. It records both native and JavaScript methods, so it provides a good overview of what's happening throughout the app. To use Systrace, build and deploy a dev build to your device. Shake the device to display the developer menu (or press command-D if you're running within the iOS simulator). Select \"Start Systrace\", then perform the action that you want to measure. When you stop Systrace, an HTML trace file will be created. You can visualize and interact with this trace in Chrome. Recent versions of Chrome deprecated a feature used in the Systrace code, so you will need to edit it as follows. Simply add the following line to the head section of the generated HTML file.\n\n```\n<script src=\"https://rawgit.com/MaxArt2501/object-observe/master/dist/object-observe.min.js\"></script>\n```\n\n#### Console Logging\nPrimitive console logging is often an effective way to measure performance. Log entries can be emitted with millisecond-resolution timestamps. Simply call Date.now() to get the current time. Durations of performance-critical operations (such as app startup) can also be computed and output in the log.\n\n#### Instrumentation\nOnce your app is deployed at scale, it's important to monitor performance of critical operations. To do this, we log instrumentation that is sent to our servers and aggregated across all users. We're then able to visualize the data over time, by platform, by device type, etc.\n\n\n### Crossing the Bridge\nReact Native apps contain two separate execution environments --- JavaScript and Native. These environments are relatively independent. They each run on separate threads and have access to their own data. All communication between the two environments takes place over the React Native \"bridge\". You can think of the bridge as a bidirectional message queue. Messages are processed in the order in which they are placed on each of the queues.\n\nData is passed in a serialized form --- UTF16 text in JSON format. All I/O occurs in the native environment. This means any storage or networking request initiated by the JavaScript code must go across the bridge, and the resulting data must then be serialized and sent back across the bridge in the other direction. This works fine for small pieces of data, but it is expensive once the data sizes or the message counts grow. \n\nOne way to mitigate this bottleneck is to avoid passing large pieces of data across the bridge. If it doesn't require processing within the JavaScript environment, leave it on the native side. It can be represented as a \"handle\" within the JavaScript code. This is how we handle all images, sounds, and complex animation definitions. \n\n\n### Cooperative Multitasking\nJavaScript runs on a single thread. If your app's JavaScript code runs for long periods of time, it blocks execution of event handlers, message handlers, etc., and the app will feel non-responsive. If you need to do a long-running operation, you have several options:\n1. Implement it as a native module and run it on a separate thread (applicable only to React Native).\n2. Break the operation into smaller blocks and execute them as chained tasks.\n3. Compute only the portion of the result that is needed at the time.\n\n\n### Virtualization\nWhen dealing with long lists of data that appear within a user interface, it is important to use some form of virtualization. A virtualized view renders only the visible contents. As the user scrolls through the list, newly-disclosed items are rendered. We looked at all of the available virtualized views, but we didn't find any that provided both the speed and flexibility that we needed, so we ended up writing our own implementation. Our [VirtualListView](https://microsoft.github.io/reactxp/docs/extensions/virtuallistview.html) went through six major iterations before we landed on a design and implementation that we were happy with.\n\n\n### Launching Your Startup\nApp startup time is perhaps the biggest performance challenge with React Native apps. This is especially true on slower Android devices. We continue to struggle to reduce the startup times on such devices. Here are several tips that we learned along the way.\n\n#### Defer Module Initialization\nIn TypeScript or JavaScript code, it's common practice to include a bunch of import statements at the top of each module. For example, here's what you'll find at the top of the App.tsx file in the hello-world sample.\n```\nimport RX = require('reactxp');\nimport MainPanel = require('./MainPanel');\nimport SecondPanel = require('./SecondPanel');\n```\n\nEach of these \"require\" calls initializes the specified module the first time it's encountered. A reference to that module is then cached, so subequent calls to \"require\" the same module are almost free. At startup time, the first module requires several other modules, each of which requires several other modules, etc. This continues until the entire tree of module dependencies have been initialized. This all occurs before the first line of your first module executes. As the number of modules within your app increases, the initialization time increases. \n\nThe way to fix this problem is through deferred initialization. Why pay the cost of initializing a module for some seldom-used UI panel at startup? Just defer its initialization until it is needed. To do this, we make use of a babel plugin created by Facebook called [inline-requires](https://github.com/facebook/fbjs/blob/master/packages/babel-preset-fbjs/plugins/inline-requires.js). Just download the script and create a \".babelrc\" file that looks something like this:\n```\n{\n   \"presets\": [\"react-native\"],\n   \"plugins\": [\"./build/inline-requires.js\"]\n}\n```\n\nWhat does this script do? It eliminates the require calls at the top of your modules. Whenever the imported variable is used within the file, it inserts a call to require. This means all modules are initialized immediately before their first use rather than at app startup time. For large apps, this can shave seconds from the app's startup time on slower devices.\n\n#### Minification\nFor production builds, it's important to \"minify\" your JavaScript. This process eliminates extraneous whitespace and shortens variable and method names where possible. It reduces the size of your JavaScript bundle on disk and in memory and speeds up parsing of your code.\n\n\n#### Native Module Initialization\nReact Native includes a number of built-in \"native modules\". These provide functionality that you can invoke from JavaScript. Many apps will not make use of all of the default native modules. Each native module can add tens of milliseconds to the app initialization time, so it's wasteful to initialize native modules that your app won't use. On Android, you can eliminate this overhead by creating a subclass of [MainReactPackage](https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java) that is specific to your app. Copy the createViewManagers() method into your subclass and comment out the view managers that you don't use. Then change the getPackages() method within your app's ReactInstanceHost class to instantiate your custom class rather than the normal MainReactPackage. This technique can shave 100ms or more off the startup time on slow Android devices.\n\n\n### Additional Resources\nFor additional tips on performance tuning, refer to the [Performance](https://facebook.github.io/react-native/docs/performance.html) page on Facebook's React Native documentation site. [This blog](https://code.facebook.com/posts/895897210527114/) also contains useful tips.\n"
  },
  {
    "path": "docs/_posts/2017-06-29-asset-loading.md",
    "content": "---\ntitle: Asset Loading\nauthor: erictraut\n---\n\nWe've received questions about how we handle assets (images, videos, sounds) in a way that works for both React Native and React JS (web). \n\n### Specifying Asset Locations\n\nOn the web, assets are simply referenced by URL and are loaded asynchronously by the browser. \n\n``` javascript\n<RX.Image source={ 'https://mydomain.com/images/appLogoSmall.jpg' }/>\n```\n\nReact Native apps typically package assets in the app bundle, so they are loaded from the local device storage. In this case, the path is specified in the form of a relative file system path. However, instead of passing the path directly, you need to invoke the React Native packager by calling \"require\". \n\n``` javascript\n<RX.Image source={ require('./images/appLogoSmall.jpg') }/>\n```\n\nThe packager requires that the asset path is specified as a string literal. In other words, it cannot be constructed at runtime or returned by a helper method. For more details about this limitation, refer to the [React Native documentation](https://facebook.github.io/react-native/docs/images.html).\n\nThis makes it difficult to write cross-platform code that runs on both web and native platforms. Here's how we solved this problem in the Skype app.\n\n\n\n### AppAssets Module\n\nWe created an \"AppAssets\" interface that includes an accessor method for each of the assets in our app. \n\n``` javascript\n// File: AppAssets.d.ts\n\ndeclare module 'AppAssets' {\n    interface IAppAssets {\n        appLogoSmall: string;\n        appLogoLarge: string;\n        notificationIcon: string;\n        // ... etc.\n    }\n    const Assets: IAppAssets;\n}\n```\n\nWe then implemented this interface for both web and native platforms.\n\n``` javascript\n// File: AppAssetsWeb.ts\n\nimport AppAssets = require('AppAssets');\nimport AppConfig = require('./AppConfig');\n\nclass AppAssetsImpl implements AppAssets.IAppAssets {\n    appLogoSmall = AppConfig.getImagePath('skypeLogoSmall.png');\n    appLogoLarge = AppConfig.getImagePath('skypeLogoLarge.png');\n    notificationIcon = AppConfig.getImagePath('notificationIcon.gif');\n    // ... etc.\n}\n\nexport const Assets: AppAssets.IAppAssets = new AppAssetsImpl();\n```\n\n``` javascript\n// File: AppAssetsNative.ts\n\nimport AppAssets = require('AppAssets');\n\nclass AppAssetsImpl implements IAppAssets.Collection {\n    get appLogoSmall() { return require('..images/skypeLogoSmall.png'); }\n    get appLogoLarge() { return require('..images/skypeLogoLarge.png'); }\n    get notificationIcon() { return require('../images/notificationIcon.gif'); }\n    // ... etc.\n}\n\nexport const Assets: AppAssets.IAppAssets = new AppAssetsImpl();\n```\n\nThere are a few things worth noting in the code above. First, we're making use of an interface to ensure that the web and native implementations stay in sync. If you forget to add an asset to both files, the TypeScript compiler will detect the error at build time.\n\nSecond, the web implementation is using a helper method ```getImagePath``` to construct the full URL. It builds this using a dynamically-configurable domain name, allowing us to stage the app to a test web server or publish it to the production server.\n\nThird, the native implementation makes use of accessors. This defers the loading of the asset until the first time it is first accessed. Without this trick, all assets would be loaded at the time the AppAssetsNative module was initialized, adding to app startup time.\n\nNow we can reference the assets in a cross-platform way. \n\n``` javascript\nimport AppAssets = require('AppAssets');\n\n<RX.Image source={ AppAssets.Assets.appLogoSmall }/>\n```\n\n\n### Aliasing\n\nNow that we have two implementations (one for web and a second for native), how do we \"link\" the correct version based on the platform that we're building? We do this through a lightweight \"aliasing\" step in our build process. This step replaces the ```require('AppAssets')``` with either ```require('./ts/AppAssetsWeb')``` or ```require('./ts/AppAssetsNative')``` depending on the platform being built.\n\nI'll provide examples in [gulp](http://gulpjs.com/) syntax, but the same technique can be used in [grunt](https://gruntjs.com/) or other task scripting runtimes.\n\n``` javascript\nvar config = {\n    aliasify: {\n        src: './.temp/' + argv.platform,\n        dest: getBuildPath() + 'js/',\n        aliases: (argv.platform === 'web') ?\n        // Web Aliases\n        {\n            'AppAssets': './ts/AppAssetsWeb'\n        } :\n        // Native Aliases\n        {\n            'AppAssets': './ts/AppAssetsNative'\n        }\n    }\n}\n\nfunction aliasify(aliases) {\n    var reqPattern = new RegExp(/require\\(['\"]([^'\"]+)['\"]\\)/g);\n\n    // For all files in the stream, apply the replacement.\n    return eventStream.map(function(file, done) {\n        if (!file.isNull()) {\n            var fileContent = file.contents.toString();\n            if (reqPattern.test(fileContent)) {\n                file.contents = new Buffer(fileContent.replace(reqPattern, function(req, oldPath) {\n                    if (!aliases[oldPath]) {\n                        return req;\n                    }\n\n                    return \"require('\" + aliases[oldPath] + \"')\";\n                }));\n            }\n        }\n\n        done(null, file);\n    });\n}\n\ngulp.task('apply-aliases', function() {\n    return gulp.src(path.join(config.aliasify.src, '**/*.js'))\n        .pipe(aliasify(config.aliasify.aliases))\n        .pipe(gulp.dest(config.aliasify.dest))\n        .on('error', handleError);\n});\n\n// Here's our full build task pipeline. I haven't provided the task\n// definitions for all of these stages, but you can see where the\n// 'apply-aliases' task fits into the pipeline.\ngulp.task('run', function(callback) {\n    runSequence('clean', 'build', 'apply-aliases', 'watch', 'lint', callback);\n});\n```\n\n"
  },
  {
    "path": "docs/_sass/_typography.scss",
    "content": "@import 'variables';\n\n$textColor: $mediumColor;\n$textColorLight: lighten($textColor, 20%);\n\nhtml {\n  font-family: $helvetica;\n  font-family: proxima-nova, $helvetica;\n  color: $textColor;\n  line-height: 1.28;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.subHeader {\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n  margin-bottom: 10px;\n}\n\nem {\n  font-style: italic;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  color: $textColorLight\n}\n\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\n\nh1 {\n  font-size: 39px;\n}\n\nh2 {\n  font-size: 31px;\n}\n\nh3 {\n  font-size: 23px;\n}\n\nh4 {\n  font-size: 16px;\n}\n\nh5 {\n  font-size: 14px;\n}\n\nh6 {\n  font-size: 11px;\n}\n\nh1 small {\n  font-size: 24px;\n}\n\nh2 small {\n  font-size: 18px;\n}\n\nh3 small {\n  font-size: 16px;\n}\n\nh4 small {\n  font-size: 14px;\n}\n\nul,\nol {\n  margin: 0 0 10px 25px;\n  padding: 0;\n}\n\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\n\nli {\n  line-height: 20px;\n}\n\na {\n  color: $linkColor;\n  text-decoration: none;\n  &:hover,\n  &:focus {\n    color: $linkInteract;\n    text-decoration: underline;\n  }\n  &:focus {\n    outline: thin dotted #333;\n    outline: 5px auto -webkit-focus-ring-color;\n    outline-offset: -2px;\n  }\n}\n.center {\n  text-align: center;\n}\n\ninput {\n  font-family: inherit;\n}"
  },
  {
    "path": "docs/_sass/_variables.scss",
    "content": "$primary: #59b941;\n$linkColor: darken($primary, 9%);\n$linkInteract: darken($linkColor, 9%);\n$pageBg: #f9f9f9;\n\n$lightColor: #e9e9e9;\n$mediumestColor: #666;\n$mediumColor: #484848;\n$darkColor: #2d2d2d;\n$darkestColor: #222222;\n$rxpColor: #59b941;\n\n$lightTextColor: #fafafa;\n$mediumTextColor: #aaa;\n$darkTextColor: $mediumColor;\n\n$buttonBlueTop: #77a3d2;\n$buttonBlueBottom: #4783c2;\n$buttonGreyTop: #9a9a9a;\n$buttonGreyBottom: #646464;\n\n\n$helvetica: \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif;\n\n\n@mixin clearfix {\n  &:after {\n    content:\"\";\n    display:table;\n    clear:both;\n  }\n}\n\n// HiDPI mixin. Default value set to 1.3 to target Google Nexus 7 (http://bjango.com/articles/min-device-pixel-ratio/)\n@mixin hidpi($ratio: 1.3) {\n  @media only screen and (-webkit-min-device-pixel-ratio: $ratio),\n  only screen and (min--moz-device-pixel-ratio: $ratio),\n  only screen and (-o-min-device-pixel-ratio: #{$ratio}/1),\n  only screen and (min-resolution: #{round($ratio*96)}dpi),\n  only screen and (min-resolution: #{$ratio}dppx) {\n    @content;\n  }\n}\n\n\n@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x) {\n  background-image: url(\"#{$filename}.#{$extension}\");\n\n  @include hidpi {\n    @if $retina-filename {\n      background-image: url(\"#{$retina-filename}.#{$extension}\");\n    }\n    @else {\n      background-image: url(\"#{$filename}#{$retina-suffix}.#{$extension}\");\n    }\n\n    background-size: $background-size;\n  }\n}\n\n"
  },
  {
    "path": "docs/blog/all.html",
    "content": "---\ntitle: Blog\nlayout: default\nsectionid: blog\nid: all-posts\n---\n\n<section class=\"content wrap documentationContent nosidebar\">\n  <div class=\"inner-content\">\n    <h1>All Posts</h1>\n    {% for page in site.posts %}\n      <p><strong><a href=\"/reactxp{{ page.url }}\">{{ page.title }}</a></strong> on {{ page.date | date: \"%B %e, %Y\" }} by\n        <a href=\"{{ site.data.authors[page.author].url }}\">{{ site.data.authors[page.author].name }}</a>\n      </p>\n    {% endfor %}\n  </div>\n</section>\n"
  },
  {
    "path": "docs/blog/index.html",
    "content": "---\ntitle: Blog\nlayout: default\nsectionid: blog\n---\n\n<section class=\"content wrap blogContent\">\n  {% include nav_blog.html %}\n  <div class=\"inner-content\">\n    {% for page in paginator.posts %}\n      <div class=\"post-list-item\">\n        {% include blog_post.html page=page content=page.content%}\n      </div>\n    {% endfor %}\n\n    <div class=\"pagination\">\n      {% if paginator.previous_page %}\n        <a href=\"/reactxp{{ paginator.previous_page_path }}\" class=\"previous\">\n          &laquo; Previous Page\n        </a>\n      {% endif %}\n      {% if paginator.next_page %}\n        <a href=\"/reactxp{{ paginator.next_page_path }}\" class=\"next\">\n          Next Page &raquo;\n        </a>\n      {% endif %}\n    </div>\n  </div>\n</section>\n"
  },
  {
    "path": "docs/community/support.md",
    "content": "---\nid: support\ntitle: Where To Get Support\nlayout: hero\nsectionid: community\npermalink: community/support.html\nredirect_from:\n  - \"community/index.html\"\n---\n\n# ReactXP Community\n\n### Maintainers\nReactXP was initially developed by the Skype team at Microsoft. It has since been adopted by other teams at Microsoft. You can contact the maintainers by email at [reactxp@microsoft.com](mailto:reactxp@microsoft.com).\n\n### Bug Reports & Feature Requests\nFor bug reports or feature requests, please create an issue in [GitHub](https://github.com/microsoft/reactxp/issues).\n\n### Forums\nFor general discussions or questions, use this [Gitter room](https://gitter.im/msreactxp).\n\n\n\n"
  },
  {
    "path": "docs/css/reactxp.scss",
    "content": "---\ntitle: reactxp.css\n---\n\n@import 'variables';\n@import 'typography';\n\n@mixin code-typography {\n  font-family: 'source-code-pro', Menlo, Consolas, 'Courier New', monospace;\n  line-height: 1.5;\n  font-size: 13px;\n  -webkit-text-size-adjust: none;\n}\n\n$skinnyContentWidth: 650px;\n$contentWidth: 920px;\n$contentPadding: 20px;\n$columnWidth: 280px;\n$columnGutter: 40px;\n$twoColumnWidth: 2 * $columnWidth + $columnGutter;\n$navHeight: 50px;\n\n// Breakpoints\n$bp-large: 960px;\n$bp-medium: 640px;\n$bp-small: 480px;\n\n@mixin bp-small {\n  @media (max-width: $bp-small) {\n    @content;\n  }\n}\n\n@mixin bp-medium {\n  @media (max-width: $bp-medium) {\n    @content;\n  }\n}\n\n@mixin bp-large {\n  @media (max-width: $bp-large) {\n    @content;\n  }\n}\n\n// basic reset\n* {\n  box-sizing: border-box;\n  border: none;\n  margin: 0;\n  padding: 0;\n}\n\nhtml {\n  background: $pageBg;\n}\n\n\n\n.left {\n  float: left;\n}\n\n.right {\n  float: right;\n}\n\n\n.container {\n  padding-top: $navHeight;\n  width: 100%;\n  background-color: white;\n}\n\n.wrap {\n  max-width: $contentWidth + (2 * $contentPadding);\n  margin-left: auto;\n  margin-right: auto;\n  padding-left: 20px;\n  padding-right: 20px;\n\n  @include bp-large {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n\n.skinnyWrap {\n  width: $skinnyContentWidth + (2 * $contentPadding);\n  margin-left: auto;\n  margin-right: auto;\n  padding-left: 20px;\n  padding-right: 20px;\n}\n\nhr {\n  height: 0;\n  border-top: 1px solid #ccc;\n  border-bottom: 1px solid #eee;\n}\n\nul,\nli {\n  margin-left: 20px;\n}\n\nli + li {\n  margin-top: 10px;\n}\n\n// Make header navigation linkable and on the screen. Used in documentation and\n// blog posts.\nh1, h2, h3, h4, h5, h6 {\n  .anchor {\n    margin-top: -$navHeight;\n    position: absolute;\n  }\n\n  &:hover .hash-link {\n    display: inline;\n  }\n}\n.hash-link {\n  color: $mediumTextColor;\n  display: none;\n  padding-left: 8px;\n}\n\n// Main Nav\n\n.nav-main {\n  @include clearfix;\n  background: $darkestColor;\n  color: $lightTextColor;\n  position: fixed;\n  top: 0;\n  height: $navHeight;\n  box-shadow: 0 0 5px rgba(0, 0, 0, .5);\n  width: 100%;\n  z-index: 100;\n\n  @include bp-large {\n    height: auto;\n  }\n\n  a {\n    color: $lightColor;\n    text-decoration: none;\n  }\n\n  .nav-site {\n    display: inline-flex;\n    display: -ms-flexbox;\n    flex: 1;\n    -ms-flex: 1;\n\n    li {\n      margin: 0;\n    }\n\n    li > a {\n      box-sizing: content-box;\n      padding: 0 10px;\n      line-height: $navHeight;\n      display: inline-block;\n      height: $navHeight;\n      color: #ddd;\n      white-space: nowrap;\n\n      @include bp-large {\n        display: flex;\n        display: -ms-flex;\n        justify-content: center;\n        align-items: center;\n        padding: 0 5px;\n        line-height: inherit;\n      }\n\n      &:hover {\n        color: #fff;\n      }\n\n      &.active {\n        position: relative;\n        color: $lightTextColor;\n        background: #333;\n\n        &:after {\n          content: \"\";\n          position: absolute;\n          bottom: 0;\n          left: 0;\n          right: 0;\n          border-bottom: 3px solid $primary;\n        }\n\n        @include bp-large {\n          background: inherit;\n        }\n      }\n    }\n\n    .nav-site-item {\n      &--hidden-sm {\n        @include bp-large {\n          display: none;\n        }\n      }\n    }\n\n    .nav-site-search {\n      @include bp-large {\n        position: absolute;\n        z-index: 1;\n        right: 0;\n        top: 0;\n        margin: 0 10px;\n\n        &:focus {\n          width: 170px;\n        }\n      }\n    }\n  }\n\n  .nav-site-internal {\n    margin: 0 0 0 20px;\n\n    @include bp-large {\n      margin: 0;\n    }\n  }\n\n  .nav-site-external {\n    float: right;\n    margin: 0;\n\n    @include bp-large {\n      position: absolute;\n      top: 0;\n      right: 55px;\n      float: none;\n    }\n  }\n\n  .nav-home {\n    color: $rxpColor;\n    font-size: 24px;\n    line-height: $navHeight;\n    height: $navHeight;\n    display: inline-block;\n\n    @include bp-large {\n      font-size: 20px;\n    }\n  }\n\n  .nav-logo {\n    vertical-align: middle;\n    display: inline-block;\n\n    @include bp-large {\n      height: 30px;\n      width: auto;\n    }\n  }\n\n  ul {\n    display: inline-block;\n    vertical-align: top;\n  }\n\n  li {\n    display: inline;\n  }\n}\n\n.nav-lists {\n  display: inline-block;\n  vertical-align: top;\n  width: calc(100% - 120px);\n\n  @include bp-large {\n    display: flex;\n    display: -ms-flex;\n    width: calc(100% + 20px);\n    margin: 0 -10px;\n    font-size: 0.9em;\n\n    li {\n      display: flex;\n      display: -ms-flex;\n      -ms-flex: 1 0 auto;\n      align-items: center;\n\n      a {\n        -ms-flex: 1;\n        text-align: center;\n        line-height: 1.2;\n      }\n    }\n  }\n}\n\n// Hero\n\n.hero {\n  min-height: 300px;\n  background: $darkColor;\n  padding-top: 50px;\n  color: $lightColor;\n  font-weight: 300;\n\n  .text {\n    font-size: 64px;\n    text-align: center;\n  }\n\n  .minitext {\n    font-size: 16px;\n    text-align: center;\n    text-transform: uppercase;\n  }\n\n  strong {\n    color: $rxpColor;\n    font-weight: 400;\n  }\n}\n\n.buttons-unit {\n  display: flex;\n  display: flex;\n  justify-content: center;\n  flex-wrap: wrap;\n  margin-top: 60px;\n  text-align: center;\n  font-size: 1em;\n\n  a {\n    color: $rxpColor;\n  }\n\n  .button {\n    font-size: 24px;\n    background: $primary;\n    color: $lightTextColor;\n\n    &:active {\n      background: darken($primary, 5%);\n    }\n\n    @include bp-large {\n      margin: 5px;\n      font-size: 1em;\n    }\n  }\n}\n\n// Downloads\n\n.buttons-unit.downloads {\n  margin: 30px 0;\n}\n\n// Docs Nav\n\n.nav-docs {\n  color: $darkColor;\n  font-size: 14px;\n  float: left;\n  width: 210px;\n\n  @include bp-medium {\n    width: 100%;\n    padding-bottom: 40px;\n  }\n\n  ul {\n    list-style: none;\n    margin: 0;\n  }\n  ul ul {\n    margin: 0 0 6px 20px;\n  }\n  li {\n    line-height: 16px;\n    margin: 0 0 6px;\n  }\n  h3 {\n    text-transform: uppercase;\n    font-size: 14px;\n  }\n  a {\n    color: $mediumestColor;\n    display: block;\n\n    &:hover {\n      text-decoration: none;\n      color: $primary;\n    }\n\n    &.active {\n      color: $primary;\n    }\n\n    &.external {\n      &:after {\n        content: \"\";\n        display: inline-block;\n        width: 10px;\n        height: 10px;\n        padding-left: 5px;\n        @include retina-image('../img/external', 10px 10px);\n        background-position: 100% 0;\n        background-repeat: no-repeat;\n        font-size: 10px;\n        line-height: 1em;\n        opacity: 0.5;\n      }\n    }\n  }\n\n  .nav-docs-section {\n    border-bottom: 1px solid #ccc;\n    border-top: 1px solid #eee;\n    padding: 12px 0;\n\n    &:first-child {\n       padding-top: 0;\n       border-top: 0;\n    }\n\n    &:last-child {\n      padding-bottom: 0;\n      border-bottom: 0;\n    }\n\n    > ul {\n      @include bp-medium {\n        columns: 2\n      }\n\n      @include bp-small {\n        columns: 1;\n      }\n\n      li {\n        margin: 0;\n\n        a {\n          padding: 0;\n          line-height: 1.6;\n        }\n      }\n    }\n  }\n\n}\n\n.nav-blog {\n  li {\n    margin-bottom: 5px;\n  }\n}\n\n// Home Page specifics\n\n.home-section {\n  margin: 50px 0;\n}\n\n.home-divider {\n  border-top-color: #bbb;\n  margin: 0 auto;\n  width: 100%;\n  max-width: 400px;\n}\n\n.skinny-row {\n  @include clearfix;\n}\n\n.skinny-col {\n  float: left;\n  margin-left: $columnGutter;\n  width: ($skinnyContentWidth - $columnGutter) / 2;\n  &:first-child {\n    margin-left: 0;\n  }\n}\n\n.marketing-row {\n  @include clearfix;\n  margin: 50px 0;\n}\n\n.marketing-col {\n  float: left;\n  margin-left: 40px;\n  width: $columnWidth;\n\n  @include bp-large {\n    margin: 0;\n    width: 100%;\n  }\n\n  h3 {\n    color: $darkColor;\n    font-size: 24px;\n    line-height: 28px;\n    font-weight: normal;\n  }\n  p {\n    font-size: 16px;\n  }\n}\n\n.marketing-col:first-child {\n  margin-left: 0;\n}\n\n#overview h3, .home-presentation h3 {\n  color: $darkColor;\n  font-size: 24px;\n  font-weight: normal;\n  margin-bottom: 5px;\n}\n\n#overview {\n  p {\n    margin: 0 0 25px 0;\n  }\n\n  .overview-section {\n    margin-top: 60px;\n  }\n}\n\n.home-bottom-section {\n  margin-bottom: 100px;\n}\n\n.docs-nextprev {\n  @include clearfix;\n}\n\n/* JSX Compiler */\n\n.jsxCompiler {\n  margin: 0 auto;\n  padding-top: 20px;\n  width: 1220px;\n\n  label.compiler-option {\n    display: block;\n    margin-top: 5px;\n  }\n\n  #jsxCompiler {\n    margin-top: 20px;\n  }\n\n  .playgroundPreview {\n    padding: 0;\n    width: 600px;\n    word-wrap: break-word;\n\n    pre {\n      @include code-typography;\n    }\n  }\n\n  .playgroundError {\n    // The compiler view kills padding in order to render the CodeMirror code\n    // more nicely. For the error view, put a padding back\n    padding: 15px 20px;\n  }\n}\n\n.docs-prev {\n  float: left;\n}\n\n.docs-next {\n  float: right;\n}\n\nsection.black content {\n  padding-bottom: 18px;\n}\n\n/**\n * Blog\n */\n\n.blogContent {\n  @include clearfix;\n\n  padding-top: 20px;\n  padding-bottom: 80px;\n  @include bp-medium {\n    padding-bottom: 0;\n  }\n\n  blockquote {\n    padding: 5px 15px;\n    margin: 20px 0;\n    background-color: #f8f5ec;\n    border-left: 5px solid #f7ebc6;\n  }\n\n  h2 > code {\n    font-size: inherit;\n    line-height: inherit;\n    color: #555;\n    background-color: rgba(0,0,0,0.04);\n  }\n}\n\n/**\n * Docs\n */\n\n.documentationContent {\n  @include clearfix;\n\n  .subHeader {\n    font-size: 24px;\n  }\n\n\n  // H2s form documentation topic dividers. Extra space helps.\n  h2 {\n    margin-top: 30px;\n  }\n\n  padding-top: 20px;\n  padding-bottom: 80px;\n  @include bp-medium {\n    padding-bottom: 0;\n  }\n\n  // Make a notice box out of blockquotes in the documentation:\n  blockquote {\n      padding: 15px 30px 15px 15px;\n      margin: 20px 0;\n      background-color: rgba(248, 245, 236, 0.5);\n      border-left: 5px solid rgba(191, 87, 73, 0.2);\n    h4 {\n      margin-top: 0;\n    }\n    p {\n      margin-bottom: 0;\n    }\n    // Treat first child as the title - promote to H4.\n    p:first-child {\n      font-weight: bold;\n      font-size: 17.5px;\n      line-height: 20px;\n      margin-top: 0;\n      text-rendering: optimizelegibility;\n    }\n  }\n}\n\n.docs-prevnext {\n  padding-top: 40px;\n  padding-bottom: 40px;\n}\n\n/* Button */\n\n.button {\n  background: linear-gradient($buttonGreyTop, $buttonGreyBottom);\n  border-radius: 4px;\n  padding: 8px 16px;\n  font-size: 18px;\n  font-weight: 400;\n  margin: 0 12px;\n  display: inline-block;\n  color: $lightTextColor;\n  text-decoration: none;\n  text-shadow: 0 1px 3px rgba(0, 0, 0, .3);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, .2);\n  text-decoration: none;\n\n  &:hover {\n    text-decoration: none;\n  }\n\n  &:active {\n    box-shadow: none;\n  }\n}\n\n.home {\n  .button {\n    box-shadow: 1px 3px 3px rgba(0, 0, 0, .3);\n  }\n}\n\n.button.blue {\n  background: linear-gradient($buttonBlueTop, $buttonBlueBottom);\n}\n\n\n/* Row */\n\n.row {\n  padding-bottom: 4px;\n}\n\n.row .span4 {\n  width: 33.33%;\n  display: table-cell;\n}\n\n.row .span8 {\n  width: 66.66%;\n  display: table-cell;\n}\n\n.row .span6 {\n  width: 50%;\n  display: table-cell;\n}\n\n\n/* Content */\n\np {\n  margin: 10px 0;\n}\n\n.highlight {\n  padding: 10px;\n  margin-bottom: 20px;\n}\n\nfigure {\n  text-align: center;\n}\n\n.content {\n  font-size: 15px;\n}\n\n.inner-content {\n  float: right;\n  width: 100%;\n  max-width: $skinnyContentWidth;\n  font-size: 15px;\n\n  @include bp-large {\n    width: calc(100% - 240px);\n    max-width: 100%;\n  }\n\n  @include bp-medium {\n    width: 100%;\n  }\n}\n\n.nosidebar .inner-content {\n  float: none;\n  margin: 0 auto;\n}\n\nh1 {\n  @include clearfix;\n}\n\n.edit-page-link {\n  float: right;\n  font-size: 16px;\n  font-weight: normal;\n  line-height: 20px;\n  margin-top: 17px;\n\n  @include bp-medium {\n    float: left;\n    width: 100%;\n  }\n}\n\n/**\n * Community\n */\n\n.communityContent {\n  @include clearfix;\n\n  h3 {\n    margin-top: 30px;\n  }\n\n  padding-top: 20px;\n\n  blockquote {\n    padding: 5px 15px;\n    margin: 20px 0;\n    background-color: #f8f5ec;\n    border-left: 5px solid #f7ebc6;\n  }\n\n  th {\n    padding-right: 6px;\n    text-align: right;\n    vertical-align: top;\n    font-weight: normal;\n    @include code-typography;\n  }\n\n  td {\n    vertical-align: top;\n    text-align: left;\n  }\n}\n\n\n/* Blog */\n\n.post-list-item + .post-list-item {\n  margin-top: 60px;\n}\n\n/* CodeMirror */\n\ndiv.CodeMirror pre, div.CodeMirror-linenumber, code {\n  @include code-typography;\n}\n\ndiv.CodeMirror-linenumber {\n  text-align: right;\n}\n\n.CodeMirror, div.CodeMirror-gutters, div.highlight {\n  border: none;\n}\n\n/* hide the cursor. Mostly used when code's in plain JS */\n.CodeMirror-readonly div.CodeMirror-cursor {\n  visibility: hidden;\n}\n\nsmall code,\nli code,\np code {\n  color: #555;\n  background-color: rgba(0, 0, 0, .04);\n  padding: 1px 3px;\n}\n\nsmall a code,\nli a code,\np a code {\n  color: inherit;\n}\n\n.cm-s-default span.cm-string-2 {\n  color: inherit;\n}\n\n.playground {\n  @include clearfix;\n}\n\n.playground-tab {\n  border-bottom: none !important;\n  border-radius: 3px 3px 0 0;\n  padding: 6px 8px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #c2c0bc;\n  background-color: #f1ede4;\n  display: inline-block;\n  cursor: pointer;\n}\n\n.playgroundCode,\n.playground-tab,\n.playgroundPreview {\n  border: 1px solid rgba(16,16,16,0.1);\n}\n\n.playground-tab-active {\n  color: $darkestColor;\n}\n\n.playgroundCode {\n  border-radius: 0 3px 3px 3px;\n  float: left;\n  overflow: hidden;\n  width: 100%;\n  max-width: $twoColumnWidth;\n}\n\n.playgroundPreview {\n  background-color: white;\n  border-radius: 3px;\n  float: right;\n  padding: 15px 20px;\n  width: $columnWidth;\n  word-wrap: break-word;\n}\n\n.playgroundError {\n  color: darken($primary, 5%);\n  font-size: 15px;\n}\n\n.MarkdownEditor textarea {\n  width: 100%;\n  height: 100px\n}\n\n.MarkdownEditor .content {\n  white-space: pre-wrap;\n  word-break: break-word;\n}\n\n.hll {\n  background-color: #f7ebc6;\n  border-left: 5px solid #f7d87c;\n  display: block;\n  margin-left: -14px;\n  margin-right: -14px;\n  padding-left: 9px;\n}\n\n/* CodeMirror doesn't support <jsx> syntax. Instead of highlighting it\n   as error, just ignore it */\n.highlight .javascript .err {\n  background-color: transparent;\n  color: inherit;\n}\n\n.highlight {\n  position: relative;\n  margin-bottom: 14px;\n  padding: 30px 14px 14px;\n  border: none;\n  border-radius: 0;\n  overflow: auto;\n}\n\n\n.highlight pre {\n  padding: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n  background-color: transparent;\n  border: 0;\n  float: left;\n  min-width: 100%;\n}\n\n.highlight pre code {\n  /* Respect line-height defined in <code> styles above */\n  display: block;\n\n  /* Cancel out styles for `li code` in case we have a <pre> within an <li>. */\n  background: none;\n  padding: 0;\n}\n\n.highlight pre .lineno {\n  display: inline-block;\n  width: 22px;\n  padding-right: 5px;\n  margin-right: 10px;\n  color: #bebec5;\n  text-align: right;\n}\n\n/* Echo out a label for the example */\n\ndiv.highlight:after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #c2c0bc;\n  background-color: #f1ede4;\n  content: \"Code\";\n}\n\n.downloadCenter {\n  text-align: center;\n  margin-top: 20px;\n  margin-bottom: 25px;\n}\n\n.downloadSection:hover {\n  text-decoration: none !important;\n}\n\n@include bp-large {\n  .nav-main {\n    position: relative;\n  }\n  .container {\n    padding-top: 0;\n  }\n}\n\n.post {\n  margin-bottom: 30px;\n}\n\n.post img {\n  max-width: 100%;\n  height: auto;\n}\n\n.pagination {\n  margin-bottom: 30px;\n\n  /* Trick to get the wrapper to expand to fit floating elements */\n  width: 100%;\n  overflow: hidden;\n\n  .next {\n    float: right;\n  }\n}\n\n// Twitter embeds. Need to !important because they inline margin on the iframe.\ndiv[data-twttr-id] iframe {\n  margin: 10px auto !important;\n  width: 100% !important;\n}\n\n.fb_iframe_widget {\n  max-width: 100%;\n\n  * {\n    max-width: 100%;\n  }\n}\n\n#twitter-widget-0 {\n  @include bp-large {\n    display: none !important; // Need !important because they inline display on the iframe.\n  }\n}\n\n/* Acknowledgements */\n\n.three-column {\n  @include clearfix;\n}\n\n.three-column > ul {\n  float: left;\n  margin-left: 30px;\n  width: 190px;\n}\n\n.three-column > ul:first-child {\n  margin-left: 20px;\n}\n\n\n/* Algolia Doc Search */\n\ninput#algolia-doc-search {\n  background: transparent url('/react/img/search.png') no-repeat 10px center;\n  background-size: 16px 16px;\n\n  position: relative;\n  vertical-align: top;\n  margin-left: 10px;\n  padding: 0 10px;\n  padding-left: 35px;\n  height: 30px;\n  margin-top: 10px;\n  font-size: 16px;\n  line-height: 20px;\n  background-color: #333;\n  border-radius: 4px;\n  color: white;\n  outline: none;\n  width: 170px;\n\n  transition: width .2s ease;\n\n  &:focus {\n    width: 240px;\n  }\n\n  @include bp-large {\n    background-color: transparent;\n    width: 0;\n    cursor: pointer;\n\n    &:focus {\n      width: 200px;\n      background-color: #333;\n    }\n  }\n}\n\n.algolia-autocomplete .aa-dropdown-menu {\n  margin-left: -110px;\n  margin-top: -4px;\n}\n\n.algolia-autocomplete {\n  vertical-align: top;\n  height: 53px;\n}\n\n.algolia-docsearch-suggestion {\n  border-bottom-color: #c05b4d;\n}\n\n.algolia-docsearch-suggestion--category-header {\n  background-color: #cc7a6f;\n}\n\n.algolia-docsearch-suggestion--highlight {\n  color: #c05b4d;\n}\n\n.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight {\n  background-color: #c05b4d;\n}\n\n.aa-cursor .algolia-docsearch-suggestion--content {\n  color: #c05b4d;\n}\n\n.aa-cursor .algolia-docsearch-suggestion {\n  background: #f1f3f5;\n}\n\n/**\n * Footer\n */\n\nfooter.nav-footer {\n  box-sizing: border-box;\n  border: none;\n  font-weight: 300;\n  color: #202020;\n  font-size: 15px;\n  line-height: 24px;\n  background: #2D2D2D;\n  box-shadow: inset 0 10px 10px -5px #0d1116;\n  padding-top: 2em;\n  padding-bottom: 2em;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\nfooter .sitemap {\n  display: flex;\n  display: -ms-flexbox;\n  justify-content: space-between;\n  max-width: 1080px;\n  margin: 0 auto 3em;\n}\nfooter .sitemap div {\n  flex: 1;\n  -ms-flex: 1;\n}\nfooter .sitemap .nav-home {\n  display: table;\n  margin: -12px 20px 0 0;\n  padding: 10px;\n  width: 60px;\n  height: 60px;\n  transition: opacity 0.15s ease-in-out;\n  background: url(\"../img/logo_small_gray.png\") no-repeat content-box;\n}\nfooter .sitemap .nav-home:hover,\nfooter .sitemap .nav-home:focus {\n  background-image: url(\"../img/logo_small.png\");\n}\n@media screen and (max-width: 740px) {\n  footer .sitemap {\n    display: none;\n  }\n}\n\nfooter .sitemap a {\n  color: white;\n  display: table;\n  margin: 2px -10px;\n  padding: 3px 10px;\n}\nfooter .sitemap a:hover,\nfooter .sitemap a:focus {\n  color: #61dafb;\n  text-decoration: none;\n}\nfooter .sitemap h6 > a:hover,\nfooter .sitemap h6 > a:focus {\n  color: #61dafb;\n  text-decoration: none;\n}\nfooter .sitemap h5,\nfooter .sitemap h6 {\n  margin: 0 0 10px;\n}\nfooter .sitemap h5,\nfooter .sitemap h6,\nfooter .sitemap h5 > a,\nfooter .sitemap h6 > a {\n  color: white;\n}\nfooter .sitemap h5 > a,\nfooter .sitemap h6 > a {\n  margin: 0 -10px;\n}\nfooter .fbOpenSource {\n  display: block;\n  margin: 1em auto;\n  opacity: 0.4;\n  transition: opacity 0.15s ease-in-out;\n  width: 170px;\n}\nfooter .fbOpenSource:hover {\n  opacity: 1.0;\n}\nfooter .copyright {\n  color: rgba(255, 255, 255, 0.4);\n  text-align: center;\n}\n"
  },
  {
    "path": "docs/css/syntax.css",
    "content": ".highlight pre code {\n  color: #637c84;\n}\n\n.highlight {\n  color: #333333;\n  background: #f8f5ec;\n}\n\n.highlight .c {\n  color: #93a1a1;\n}\n\n\n.highlight .g {\n  color: #637c84;\n}\n\n/* Generic */\n\n.highlight .k {\n  color: #859900;\n}\n\n/* Keyword */\n\n.highlight .l {\n  color: #637c84;\n}\n\n/* Literal */\n\n.highlight .n {\n  color: #637c84;\n}\n\n/* Name */\n\n.highlight .o {\n  color: #859900;\n}\n\n/* Operator */\n\n.highlight .x {\n  color: #cc7a6f;\n}\n\n/* Other */\n\n.highlight .p {\n  color: #637c84;\n}\n\n/* Punctuation */\n\n.highlight .cm {\n  color: #93a1a1;\n}\n\n/* Comment.Multiline */\n\n.highlight .cp {\n  color: #859900;\n}\n\n/* Comment.Preproc */\n\n.highlight .c1 {\n  color: #93a1a1;\n}\n\n/* Comment.Single */\n\n.highlight .cs {\n  color: #859900;\n}\n\n/* Comment.Special */\n\n.highlight .gd {\n  color: #36958e;\n}\n\n/* Generic.Deleted */\n\n.highlight .ge {\n  font-style: italic;\n  color: #637c84;\n}\n\n/* Generic.Emph */\n\n.highlight .gr {\n  color: #dc322f;\n}\n\n/* Generic.Error */\n\n.highlight .gh {\n  color: #cc7a6f;\n}\n\n/* Generic.Heading */\n\n.highlight .gi {\n  color: #859900;\n}\n\n/* Generic.Inserted */\n\n.highlight .go {\n  color: #637c84;\n}\n\n/* Generic.Output */\n\n.highlight .gp {\n  color: #637c84;\n}\n\n/* Generic.Prompt */\n\n.highlight .gs {\n  font-weight: bold;\n  color: #637c84;\n}\n\n/* Generic.Strong */\n\n.highlight .gu {\n  color: #cc7a6f;\n}\n\n/* Generic.Subheading */\n\n.highlight .gt {\n  color: #637c84;\n}\n\n/* Generic.Traceback */\n\n.highlight .kc {\n  color: #cc7a6f;\n}\n\n/* Keyword.Constant */\n\n.highlight .kd {\n  color: #268bd2;\n}\n\n/* Keyword.Declaration */\n\n.highlight .kn {\n  color: #859900;\n}\n\n/* Keyword.Namespace */\n\n.highlight .kp {\n  color: #859900;\n}\n\n/* Keyword.Pseudo */\n\n.highlight .kr {\n  color: #268bd2;\n}\n\n/* Keyword.Reserved */\n\n.highlight .kt {\n  color: #dc322f;\n}\n\n/* Keyword.Type */\n\n.highlight .ld {\n  color: #637c84;\n}\n\n/* Literal.Date */\n\n.highlight .m {\n  color: #36958e;\n}\n\n/* Literal.Number */\n\n.highlight .s {\n  color: #36958e;\n}\n\n/* Literal.String */\n\n.highlight .na {\n  color: #637c84;\n}\n\n/* Name.Attribute */\n\n.highlight .nb {\n  color: #b58900;\n}\n\n/* Name.Builtin */\n\n.highlight .nc {\n  color: #268bd2;\n}\n\n/* Name.Class */\n\n.highlight .no {\n  color: #cc7a6f;\n}\n\n/* Name.Constant */\n\n.highlight .nd {\n  color: #268bd2;\n}\n\n/* Name.Decorator */\n\n.highlight .ni {\n  color: #cc7a6f;\n}\n\n/* Name.Entity */\n\n.highlight .ne {\n  color: #cc7a6f;\n}\n\n/* Name.Exception */\n\n.highlight .nf {\n  color: #268bd2;\n}\n\n/* Name.Function */\n\n.highlight .nl {\n  color: #637c84;\n}\n\n/* Name.Label */\n\n.highlight .nn {\n  color: #637c84;\n}\n\n/* Name.Namespace */\n\n.highlight .nx {\n  color: #637c84;\n}\n\n/* Name.Other */\n\n.highlight .py {\n  color: #637c84;\n}\n\n/* Name.Property */\n\n.highlight .nt {\n  color: #268bd2;\n}\n\n/* Name.Tag */\n\n.highlight .nv {\n  color: #268bd2;\n}\n\n/* Name.Variable */\n\n.highlight .ow {\n  color: #859900;\n}\n\n/* Operator.Word */\n\n.highlight .w {\n  color: #637c84;\n}\n\n/* Text.Whitespace */\n\n.highlight .mf {\n  color: #36958e;\n}\n\n/* Literal.Number.Float */\n\n.highlight .mh {\n  color: #36958e;\n}\n\n/* Literal.Number.Hex */\n\n.highlight .mi {\n  color: #36958e;\n}\n\n/* Literal.Number.Integer */\n\n.highlight .mo {\n  color: #36958e;\n}\n\n/* Literal.Number.Oct */\n\n.highlight .sb {\n  color: #93a1a1;\n}\n\n/* Literal.String.Backtick */\n\n.highlight .sc {\n  color: #36958e;\n}\n\n/* Literal.String.Char */\n\n.highlight .sd {\n  color: #637c84;\n}\n\n/* Literal.String.Doc */\n\n.highlight .s2 {\n  color: #36958e;\n}\n\n/* Literal.String.Double */\n\n.highlight .se {\n  color: #cc7a6f;\n}\n\n/* Literal.String.Escape */\n\n.highlight .sh {\n  color: #637c84;\n}\n\n/* Literal.String.Heredoc */\n\n.highlight .si {\n  color: #36958e;\n}\n\n/* Literal.String.Interpol */\n\n.highlight .sx {\n  color: #36958e;\n}\n\n/* Literal.String.Other */\n\n.highlight .sr {\n  color: #dc322f;\n}\n\n/* Literal.String.Regex */\n\n.highlight .s1 {\n  color: #36958e;\n}\n\n/* Literal.String.Single */\n\n.highlight .ss {\n  color: #36958e;\n}\n\n/* Literal.String.Symbol */\n\n.highlight .bp {\n  color: #268bd2;\n}\n\n/* Name.Builtin.Pseudo */\n\n.highlight .vc {\n  color: #268bd2;\n}\n\n/* Name.Variable.Class */\n\n.highlight .vg {\n  color: #268bd2;\n}\n\n/* Name.Variable.Global */\n\n.highlight .vi {\n  color: #268bd2;\n}\n\n/* Name.Variable.Instance */\n\n.highlight .il {\n  color: #36958e;\n}\n\n"
  },
  {
    "path": "docs/docs/accessibility.md",
    "content": "---\nid: accessibility\ntitle: Accessibility\nlayout: docs\ncategory: Overview\npermalink: docs/accessibility.html\nnext: extensions\n---\n\nReactXP exposes a common way to implement accessibility features across platforms.\n\nA screen reader is an assistive technology available for visually-impaired users. It allows users to navigate through an application by focusing actionable components and announcing the purpose of those components.\n\nReactXP components [View](components/view), [Button](components/button), [GestureView](components/gestureview) and [TextInput](components/textinput) implement a common set of accessibility-related props described below.\n\nAdditional [Accessibility APIs](apis/accessibility) are provided for programmatically invoking the screen reader to announce events.\n\nAccessibility traits override the default screen reader behaviors where appropriate. For example, the default behavior for [Button](components/button) is to append the text \"Button\" at the end of the label. In most cases, the default traits provide the desired behavior, but it is sometimes useful to provide additional information to the screen reader.\n\n## Types\n``` javascript\nexport enum ImportantForAccessibility {\n    // Platform decides which views are important for accessibility and brings\n    // the screen reader focus on those views\n    Auto,\n\n    // Groups all subviews under the view, allowing the screen reader to focus\n    // just this view; if the accessibilityLabel is specified, it is announced;\n    // otherwise, the labels of its children are used\n    Yes,\n\n    // Tells the screen reader that it can focus the subviews of this view\n    No,\n\n    // Hides the view and its subviews from the screen reader\n    NoHideDescendants\n}\n```\n\n## Props\n``` javascript\n// Array of strings that will be added as custom actions on iOS\naccessibilityActions?: string[] = undefined;\n\n// Label that is read by the screen reader\naccessibilityLabel?: string = undefined;\n\n// Overrides or augments default screen reader behavior\naccessibilityTraits?: AccessibilityTrait | AccessibilityTrait[] = undefined;\n\n// Screen reader focus behavior\nimportantForAccessibility?: ImportantForAccessibility = Auto;\n\n// Callback function invoked for accessibility action events\nonAccessibilityAction?: (e: SyntheticEvent) => void;\n\n// Keyboard tab order\ntabIndex?: number = undefined; // web only\n\n// Used to define the current value for a range widget such as a slider, spinbutton or progressbar\nariaValueNow?: number = undefined; // web only\n```\n\n\n\n"
  },
  {
    "path": "docs/docs/animations.md",
    "content": "---\nid: animations\ntitle: Animations\nlayout: docs\ncategory: Overview\npermalink: docs/animations.html\nnext: accessibility\n---\n\nReactXP supports a powerful animation abstraction. Individual style elements (e.g. transforms, opacity, or backgroundColor) can be animated.\n\n## Animatable Components\n\nFour base RX classes can have animatable styles:\n\n* Animated.View\n\n* Animated.Image\n\n* Animated.Text\n\n* Animated.TextInput\n\nThese component types should be used in place of the normal [View](components/view), [Image](components/image), [Text](components/text) or [TextInput](components/textinput) in the render method. In general, style properties expressed as numeric values or colors can be animated. Properties with text values (e.g. flexDirection or fontWeight) cannot be animated.\n\n## Animated Values\nThe following example shows how to create animated values with an initial value. Animated values are typically stored as instance variables within a component class. They can also be stored in the state structure.\n\n``` javascript\nlet animatedOpacityValue = RX.Animated.createValue(1.0);\nlet animatedScaleValue = RX.Animated.createValue(1.0);\n```\n\nFor animated color values, it is possible to create interpolated values that map from a numeric range to a color range. In this example, the value smoothly transitions from white to red to black as the value increases from 0 to 1.\n\n``` javascript\nlet animatedColorValue = RX.Animated.createValue(0.0);\nlet interpolatedValue = RX.Animated.interpolate(animatedColorValue,\n    [0.0, 0.5, 1.0], ['white', 'red', 'black']);\n```\n\n## Animated Styles\nOnce an animated value is created, it can be associated with an animated style.\n\nSome animated style values are more expensive than others. Some affect the layout of elements (e.g. width, height, top, left), so the layout engine needs to be invoked during each stage of the animations. It's faster to avoid these and stick to styles that don't affect the layout (e.g. opacity and transforms).\n\nThis example demonstrates how a style sheet can contain multiple animated values.\n``` javascript\nlet animatedStyle = RX.Styles.createAnimatedViewStyle({\n    opacity: animatedOpacityValue,\n    transform: [{\n        scale: animatedScaleValue\n    }]\n});\n```\n\nAnimated style sheets can be combined with other static styles.\n``` javascript\nrender() {\n    <RX.Animated.View style={ [_styles.staticStyle, animatedStyle] } />\n}\n```\n\n## Simple Timing Animations\nTo describe an animation, specify the final value of the animated value and a duration (specified in milliseconds). An optional easing function allows for a variety of animation curves including linear, step-wise, and cubic bezier.\n\nOnce an animation is defined, a call to the start() method starts the animation. The start method takes an optional parameter, a callback that is executed when the animation completes.\n\n``` javascript\nlet opacityAnimation = RX.Animated.timing(animatedScaleValue,\n    { toValue: 0.0, duration: 250, easing: RX.Animated.Easing.InOut() }\n);\n\nopacityAnimation.start(() => this._doSomethingWhenAnimationCompletes());\n```\n\n## Composite Animations\nSometimes it's useful to execute multiple animations in parallel or in sequence. This is easily accommodated by calling RX.Animated.parallel() or RX.Animated.sequence(). Composite animations can be nested to create sophisticated sequences.\n\n``` javascript\nlet compositeAnimation = RX.Animated.parallel([\n    RX.Animated.timing(animatedScaleValue,\n        { toValue: 0.0, duration: 250, easing: RX.Animated.Easing.InOut() }\n    ),\n    RX.Animated.timing(animatedOpacityValue,\n        { toValue: 1.1, duration: 250, easing: RX.Animated.Easing.Linear() }\n    )\n]);\n\ncompositeAnimation.start();\n```\n\n## Directly Setting Animated Value\nThe value of an Animated Value can be set directly by calling the method ```setValue```. If this method is called while the value is being animated, the behavior is undefined. Setting the value of an Animated Value directly is faster than using a non-animated style attribute and re-rendering the component with a new attribute value.\n\n``` javascript\nlet animatedOpacityValue = RX.Animated.createValue(1.0);\n\nanimatedOpacityValue.setValue(0.0);\n```\n\n## Web Limitations\nReactXP animation APIs on the web are implemented using DOM style transitions, as opposed to using JavaScript code to drive the animation. This results in much better performance and (in most cases) glitch-free animations, but it imposes some limitations on the use of the animation APIs.\n* All active animated values associated with a particular element must share the same timing parameters (duration, easing function, delay, loop) and must be started at the same time.\n* Each animated value can be associated with only one animated attribute that is actively running.\n* Interpolated values used with startTransition are limited to only two values -- a begin and end value -- and must be specified in increasing order.\n* Interpolated values not used with startTransition must have numeric outputValues, since we're interpolating between them ourselves.\n* For interpolated values, the starting and ending values of a transition animation must correspond to the two interpolation keys.\n* If an animation is stopped, the value will not reflect the intermediate position in the case of transforms and interpolated values.\n"
  },
  {
    "path": "docs/docs/apis/accessibility.md",
    "content": "---\nid: apis/accessibility\ntitle: Accessibility\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/accessibility.html\nnext: apis/alert\n---\n\nThis interface provides methods and events related to accessibility.\n\nSometimes it's important to announce state changes in the app (for example, an incoming message) so visually-impaired users are aware that something changed on the screen. Multiple announcements can be queued.\n\n## Events\n``` javascript\n// Triggered when the high-contrast setting changes.\nhighContrastChangedEvent: SubscribableEvent<(isEnabled: boolean) => void>;\n\n// Triggered when the screen reader setting changes.\nscreenReaderChangedEvent: SubscribableEvent<(isEnabled: boolean) => void>;\n```\n\n## Methods\n``` javascript\n// Sends the specified string to the screen reader.\nannounceForAccessibility(announcement: string): void;\n\n// Indicates whether a screen reader is currently enabled.\nisScreenReaderEnabled(): boolean;\n\n// Indicates whether the OS-level \"high-contrast\" setting is enabled.\nisHighContrastEnabled(): boolean;\n```\n"
  },
  {
    "path": "docs/docs/apis/alert.md",
    "content": "---\nid: apis/alert\ntitle: Alert\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/alert.html\nnext: apis/app\n---\n\nThis interface displays an OS-specific alert over the top of the current screen. The appearance of the alert is dictated by the underlying OS platform. Some platforms allow alerts to be displayed even when the app is not in the foreground.\n\nThere is no ability to customize the alert by embedding ReactXP views within it or using ReactXP styles.\n\n## Types\n``` javascript\ninterface AlertButtonSpec {\n    // Button text\n    text?: string;\n\n    // Invoked when button is pressed\n    onPress?: () => void;\n\n    // Alert style to use (supported on some platforms)\n    style?: 'default' | 'cancel' | 'destructive';\n}\n\ninterface AlertModalTheme {\n    // Modal background style\n    bodyStyle?: StyleRuleSet<ViewStyle>;\n\n    // Style for title text\n    titleTextStyle?: StyleRuleSet<TextStyle>;\n\n    // Style for message text\n    messageTextStyle?: StyleRuleSet<TextStyle>;\n\n    // Style for button control\n    buttonStyle?: StyleRuleSet<ButtonStyle>;\n\n    // Style applied when hovering over button\n    buttonHoverStyle?: StyleRuleSet<ButtonStyle>;\n\n    // Style for button text\n    buttonTextStyle?: StyleRuleSet<TextStyle>;\n\n    // Override style for cancel button\n    cancelButtonStyle?: StyleRuleSet<ButtonStyle>;\n\n    // Override style for cancel button hover state\n    cancelButtonHoverStyle?: StyleRuleSet<ButtonStyle>;\n\n    // Override style for cancel button\n    cancelButtonTextStyle?: StyleRuleSet<TextStyle>;;\n}\n\ninterface AlertOptions {\n    // Optional icon (web only)\n    icon?: string;\n\n    // Optional theme (web only)\n    theme?: AlertModalTheme;\n\n    // (Android, iOS, and Windows only)\n    // Optional: the id of the root view this alert is associated with.\n    // Defaults to the view set by UserInterface.setMainView().\n    rootViewId?: string;\n\n    // Optional: Prevent the dialog from being dismissed when pressing away from the dialog\n    preventDismissOnPress?: boolean;\n}\n\n```\n\n## Methods\n``` javascript\n// Displays an alert over the top of the current screen. Theming support is\n// provided for web only and is ignored on other platforms.\nshow(title: string, message?: string, buttons? AlertButtonSpec[], options?: AlertOptions): void;\n```\n"
  },
  {
    "path": "docs/docs/apis/app.md",
    "content": "---\nid: apis/app\ntitle: App\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/app.html\nnext: apis/clipboard\n---\n\nThis interface provides core methods associated with the application. It also exposes events for low-memory conditions and activity state changes.\n\n## Types\n``` javascript\n// Indicates whether the app is active or inactive\nenum AppActivationState {\n    // App is running and in foreground\n    Active = 1,\n\n    // App is running and in background\n    Background = 2,\n\n    // App is inactive\n    // On RN mobile platforms, it is an intermediate state between when app transitions between foreground and background.\n    // On desktop platforms, this is currently not being used.\n    Inactive = 3,\n\n    // iOS specific activation state for extensions implemented\n    // with react-native\n    Extension = 4\n}\n```\n\n## Methods\n``` javascript\n// Initializes the app. This should be one of the first calls made.\n// Specifies whether app is running in \"debug\" mode, typically with\n// asserts and unminified code. Also specifies whether in \"development\"\n// mode, which can indicate that additional logging or fewer security\n// checks are appropriate.\ninitialize(debug: boolean, development: boolean): void;\n\n// Returns the current activitation state for the app\ngetActivationState(): AppActivationState;\n```\n\n## Events\n``` javascript\n// Triggered when the activation state changes\nactivationStateChangedEvent: SubscribableEvent<\n    (state: AppActivationState) => void>;\n\n// Triggered when a low-memory warning occurs\nmemoryWarningEvent: SubscribableEvent<() => void>;\n```\n"
  },
  {
    "path": "docs/docs/apis/clipboard.md",
    "content": "---\nid: apis/clipboard\ntitle: Clipboard\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/clipboard.html\nnext: apis/input\n---\n\nThis interface provides access to the system's clipboard.\n\n## Methods\n``` javascript\n// Retrieves the text from the clipboard (not supported on web)\ngetText(): SyncTasks.Promise<string>;\n\n// Places the specified text on the clipboard\nsetText(text: string): void;\n```\n"
  },
  {
    "path": "docs/docs/apis/input.md",
    "content": "---\nid: apis/input\ntitle: Input\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/input.html\nnext: apis/international\n---\n\nThis interface provides events that are triggered when specific user input events occur.\n\n## Events\n``` javascript\n// Triggered when the hardware back button is pressed (Android only).\n// Events are triggered in the reverse order in which they were registered.\n// Pass true to stop propagation.\nbackButtonEvent: SubscribableEvent<() => boolean>();\n\n// Triggered when a hardware key up/down event occurs. Events are triggered\n// in the reverse order in which they were registered. Pass true to stop\n// propagation.\nkeyDownEvent: SubscribableEvent<(e: Types.KeyboardEvent) => boolean>();\nkeyUpEvent: SubscribableEvent<(e: Types.KeyboardEvent) => boolean>();\n```\n"
  },
  {
    "path": "docs/docs/apis/international.md",
    "content": "---\nid: apis/international\ntitle: International\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/international.html\nnext: apis/linking\n---\n\nThis interface provides interfaces related to globalization (g11n) and internationalization (i18n).\n\nSome languages read right to left. In such cases, it's preferable for the UI to be \"mirrored\". Buttons that are on the left side of the screen in left-to-right languages are flipped to the right side of the screen for right-to-left languages. This mirroring is mostly automatic, but some code changes may be required --- for example, to flip icons or images that depend on placement. For more details about React Native's support for right-to-left languages, see this helpful [blog article](https://facebook.github.io/react-native/blog/2016/08/19/right-to-left-support-for-react-native-apps.html).\n\n## Methods\n``` javascript\n// By default, right-to-left mirroring is enabled based on the\n// OS or browser settings. This method allows the app to disable\n// right-to-left mirroring.\nallowRTL(allow: boolean): void;\n\n// This method overrides the right-to-left setting of the system\n// or browser, forcing right-to-left mirroring behavior if true.\nforceRTL(force: boolean): void;\n\n// Indicates whether the app is currently running in right-to-left mode.\nisRTL(): boolean;\n```\n"
  },
  {
    "path": "docs/docs/apis/linking.md",
    "content": "---\nid: apis/linking\ntitle: Linking\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/linking.html\nnext: apis/location\n---\n\nThis interface handles deep linking in both incoming and outgoing directions. Incoming deep links instruct the app to take actions requested by other apps. Outgoing deep links instruct other apps to perform actions.\n\n## Types\n``` javascript\n// Information used to invoke the default SMS app\ninterface SmsInfo {\n    phoneNumber?: string;\n    body?: string;\n}\n\n// Information used to invoke the default email app\ninterface EmailInfo {\n    to?: string[];\n    cc?: string[];\n    bcc?: string[];\n    subject?: string;\n    body?: string;\n}\n\n// Error returned by promise if the request fails\ninterface LinkingErrorInfo {\n    code: LinkingError;\n    url: string;\n    error?: string;\n}\n\nenum LinkingErrorCode {\n    NoAppFound = 0,\n    UnexpectedFailure = 1,\n    Blocked = 2,\n    InitialUrlNotFound = 3\n}\n```\n\n## Methods\n``` javascript\n// Returns the URL that was used to launch the application\ngetInitialUrl(): SyncTasks.Promise<string>;\n\n// Requests the URL to be opened by the default app for that protocol\n// (e.g. http or https would typically open the system browser)\nopenUrl(url: string): SyncTasks.Promise<void>;\n\n// Requests the default SMS app to be invoked\nlaunchSms(smsData: SmsInfo): SyncTasks.Promise<void>;\n\n// Requests the default mail app to be invoked\nlaunchEmail(emailData: EmailInfo): SyncTasks.Promise<void>;\n```\n\n## Events\n``` javascript\n// Triggered when a new deep link request arrives\ndeepLinkRequestEvent: SubscribableEvent<(url: string) => void>;\n```\n"
  },
  {
    "path": "docs/docs/apis/location.md",
    "content": "---\nid: apis/location\ntitle: Location\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/location.html\nnext: apis/modal\n---\n\nThis interface provides access to geolocation data.\n\n## Types\n``` javascript\nenum LocationErrorType {\n    // User has not granted the app access to location data\n    PermissionDenied,\n\n    // Geolocation information is not currently available\n    PositionUnavailable,\n\n    // Geolocation request has timed out\n    Timeout\n}\n\ninterface PositionOptions {\n    // Enable high-accuracy mode; consumes more battery\n    enableHighAccuracy?: boolean;\n\n    // Number of milliseconds before timeout\n    timeout?: number;\n\n    // Max age (in milliseconds) before cached location is invalidated\n    maximumAge?: number;\n}\n\n// ID for a pending \"watch\" request\ntype LocationWatchId = number;\n\n// Delegates that are invoked when call succeeds or fails\ntype LocationSuccessCallback = (position: Position) => void;\ntype LocationFailureCallback = (error: LocationErrorType) => void;\n\n```\n\n## Methods\n``` javascript\n// Indicates whether geolocation services are available on this platform\nisAvailable(): boolean;\n\n// Returns the current location\ngetCurrentPosition(options?: PositionOptions): SyncTasks.Promise<Position>;\n\n// Requests a callback when the position changes; useful for geofencing\nwatchPosition(successCallback: LocationSuccessCallback,\n    errorCallback?: LocationFailureCallback,\n    options?: PositionOptions): SyncTasks.Promise<LocationWatchId>;\n\n// Clears a location watch request\nclearWatch(watchID: LocationWatchId): void;\n```\n"
  },
  {
    "path": "docs/docs/apis/modal.md",
    "content": "---\nid: apis/modal\ntitle: Modal\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/modal.html\nnext: apis/network\n---\n\nThis interface displays a view that overlays all other views rendered by the app, preventing any direct user interaction with the overlayed views.\n\nA modal is identified by a caller-supplied \"modal ID\". These should be unique.\n\nOnly one modal can be displayed at a time. If a modal is already displayed, a newly-displayed modal is pushed onto the modal stack. When a modal is dismissed, it is popped off the stack, and the next modal becomes visible.\n\nA modal can be displayed and dismissed using methods within the ReactXP.App namespace.\n\nA modal covers the entire screen but is transparent. Its children define the visible contents and their position on the screen.\n\n## Types\n``` javascript\ninterface ModalOptions {\n    // Android, iOS, and Windows only.\n    // The id of the root view this modal is associated with.\n    // Defaults to the view set by UserInterface.setMainView();\n    rootViewId?: string;\n}\n```\n\n## Methods\n``` javascript\n// Removes the modal from the modal stack, unmounting it if it's currently\n// on the top of the stack and showing the next modal in the stack.\ndismiss(modalId: string);\n\n// Removes all modals from the modal stack.\ndismissAll();\n\n// Indicates whether the specified modal is in the modal stack. If no id provided indicates if some modal is displayed.\nisDisplayed(modalId?: string): boolean;\n\n// Pushes the modal onto the modal stack.\nshow(modal: React.ReactElement<ViewProps>, modalId: string, options?: ModalOptions);\n```\n\n## Sample Usage\n\n``` javascript\nconst _modalId = 'ErrorDialog';\n\nshowDialog() {\n    let dialog = (\n        <RX.View style={ _styles.errorDialog }>\n            <RX.Text style={ _styles.descriptionText }>\n                'An error occurred'\n            </RX.Text>\n            <RX.Button style={ _styles.button }\n                    onPress={ this._onOkButtonPress }>\n                <RX.Text style={ _styles.buttonText }>\n                    'OK'\n                </RX.Text>\n            </RX.Button>\n        </RX.View>\n    );\n\n    RX.Modal.show(dialog, _modalId);\n}\n\nprivate _onOkButtonPress = (e: RX.Types.SyntheticEvent) => {\n    RX.Modal.dismiss(_modalId);\n};\n```\n\n\n"
  },
  {
    "path": "docs/docs/apis/network.md",
    "content": "---\nid: apis/network\ntitle: Network\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/network.html\nnext: apis/platform\n---\n\nThis has been deprecated from ReactXP Core and moved to an extension (reactxp-netinfo) inline with the React Native Lean Core initiative."
  },
  {
    "path": "docs/docs/apis/platform.md",
    "content": "---\nid: apis/platform\ntitle: Platform\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/platform.html\nnext: apis/popup\n---\n\nThis interface provides information about the OS or runtime platform on which the app is running.\n\n## Types\n``` javascript\ntype PlatformType = 'web' | 'ios' | 'android' | 'windows';\n```\n\n## Methods\n``` javascript\n// Returns the platform type\ngetType(): Types.PlatformType;\n\n// Returns the value in `specifics` for the current platform type.\nselect<T>(specifics: { [ platform in Types.PlatformType | 'default' ]?: T }): T | undefined;\n```\n\n"
  },
  {
    "path": "docs/docs/apis/popup.md",
    "content": "---\nid: apis/popup\ntitle: Popup\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/popup.html\nnext: apis/statusbar\n---\n\nA popup is not technically a component. Rather, it's a collection of methods on the ReactXP.App namespace that allow the app to display a view that overlays a portion of the screen. Popups can be \"anchored\" to mounted components and follow them as they move around the screen (e.g. in reaction to scroll events).\n\nWhen a popup is displayed, the caller specifies a PopupOptions structure that includes several callbacks, including a renderPopup method.\n\nPopups by default will not act like a toggle. When Popup.show is called, it will always show the Popup. If a Popup is required to act like a toggle, PopupOptions.dismissIfShown should be set to true. In this case, if Popup.show is called once for a component, it will show the popup. A subsequent call from the same component will dismiss the popup and so on.\n\nThe overall dimensions of a popup are assumed to remain constant for the lifetime of the popup. This allows the dimensions to be measured once, and the popup can then be positioned relative to the anchor.\n\nPopups are identified by a caller-specified ID that should be unique.\n\n## Types\n``` javascript\n// 'context' mode makes it attempt to behave like a context menu -- defaulting\n// to the lower right of the anchor element and working its way around.  It is not supported\n// with inner positioning and will throw an exception if used there.\ntype PopupPosition  = 'top' | 'right' | 'bottom' | 'left' | 'context';\n\ninterface PopupOptions {\n    // Returns a mounted component instance that serves as the\n    // \"anchor\" for the popup. Often a button.\n    getAnchor: () => React.Component<any, any>;\n\n    // Renders the contents of the popup. This is called twice. The\n    // first time it is called, the parameters are all defaults\n    // (default position and 0 offset and dimensions). This allows\n    // the popup to be measured and positioned. It is called a second\n    // time with the position, offset and dimensions specified. This\n    // allows the method to modify the appearance based on these\n    // parameters. The dimensions should not be modified, however.\n    renderPopup: (anchorPosition: PopupPosition, anchorOffset: number,\n        popupWidth: number, popupHeight: number) => ReactNode;\n\n    // Returns a mounted component instance that controls the triggering\n    // of the popup. In the majority of cases, \"anchor\" of popup has\n    // handlers to control when the popup will be seen and this function\n    // is not required. In a few cases, where anchor is not the same as\n    // the whole component that triggers when the popup wil be seen,\n    // this can be used. For instance, a button combined with a chevron\n    // icon, which on click triggers a popup below the chevron icon. In\n    // this example, getElementTriggeringPopup() can return the container\n    // with button and chevron icon.\n    getElementTriggeringPopup?: () => React.Component<any, any>;\n\n    // Called when the popup is dismissed. Popup.isDisplayed() will return\n    // false for the popup being dismissed when this callback runs.\n    onDismiss?: () => void;\n\n    // Prioritized order of positions. Popup is positioned\n    // relative to the anchor such that it remains on screen.\n    // Default is ['bottom', 'right', 'top', 'left'].\n    positionPriorities?: string[];\n\n    // Position the popup inside its anchor.\n    // In this mode only the first position priority will be used.\n    useInnerPositioning?: boolean;\n\n    // On pressed handler to notify whoever wanted to create the popup\n    // that its anchor has been pressed.\n    // IMPORTANT NOTE: This handler may be called when the component is\n    // already unmounted as it uses a time delay accommodate\n    // fade-out animations.\n    onAnchorPressed?: (e: SyntheticEvent) => void;\n\n    // Determines if the anchor invoking the popup should behave like a toggle.\n    // If true, calling Popup.show will show the popup. A subsequent call\n    // will hide the popup. If false or undefined (default), calling Popup.show\n    // will always show the popup.\n    dismissIfShown?: boolean;\n\n    // By default, clicks or taps outside of a popup (unless they are on the\n    // anchor) will not dismiss the active popup. If true, this overrides the\n    // default behavior, in which case the popup must be dismissed explicitly.\n    preventDismissOnPress?: boolean;\n\n    // The popup may be left in the DOM after it's dismissed. This is a\n    // performance optimization to make the popup appear faster when it's shown\n    // again, intended for popups that tend to be shown repeatedly. Note that\n    // this is only a hint, so callers shouldn't rely on caching behavior.\n    cacheable?: boolean;\n\n    // Android, iOS, and Windows only.\n    // The id of the root view this popup is associated with.\n    // Defaults to the view set by UserInterface.setMainView();\n    rootViewId?: string;\n}\n```\n\n## Methods\n\n``` javascript\n// Dismisses an already-displayed popup after a specified number\n// of milliseconds\nautoDismiss(popupId: string, dismissDelay: number = 0): void;\n\n// Dismisses an already-displayed popup immediately\ndismiss(popupId: string): void;\n\n// Dismisses all popups immediately\ndismissAll(): void;\n\n// Displays a popup. Returns true if successful, false if the popup is\n// already displayed\nshow(options: PopupOptions, popupId: string, showDelay: number = 0): boolean;\n\n// Indicates whether the specified popup is displayed. If no id provided indicates if some popup is displayed.\nisDisplayed(popupId?: string): boolean;\n```\n\n## Sample Usage\n\n``` javascript\nconst _popupId = 'myPopup';\nlet _popupDisplayed = false;\n\nonHoverStart() {\n    if (!this._popupDisplayed) {\n        this.displayPopup();\n    }\n};\n\nonHoverEnd() {\n    RX.Popup.autoDismiss(_popupId, 2000);\n};\n\ndisplayPopup() {\n    let popupOptions: RX.Types.PopupOptions = {\n        getAnchor: () => {\n            return this._mountedButton;\n        },\n        renderPopup: (anchorPosition: Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n            return this._renderPopupView(anchorPosition,\n                anchorOffset, popupWidth, popupHeight);\n        },\n        positionPriorities: ['right', 'left', 'bottom', 'top'],\n        onDismiss: () => {\n            this._popupDisplayed = false;\n        }\n    };\n\n    RX.Popup.show(popupOptions, _popupId, 500);\n    this._popupDisplayed = true;\n}\n```\n\n"
  },
  {
    "path": "docs/docs/apis/statusbar.md",
    "content": "---\nid: apis/statusbar\ntitle: StatusBar\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/statusbar.html\nnext: apis/storage\n---\n\nThis interface provides control over the system status bar at the top of the screen on mobile platforms.\n\n## Methods\n``` javascript\n// Indicates whether the status bar overlays the app's main view (e.g. on iOS)\nisOverlay(): boolean;\n\n// Hides or shows the status bar with an optional animation\nsetHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void;\n\n// Specifies the status bar visual style\nsetBarStyle(style: 'default' | 'light-content' | 'dark-content',\n    animated: boolean): void;\n\n// Specifies whether the network activity indicator is visible.\nsetNetworkActivityIndicatorVisible(value: boolean): void;\n\n// Specifies the background color of the status bar (applies on Android only)\nsetBackgroundColor(color: string, animated: boolean): void;\n\n// Specifies whether the status bar is translucent or transparent\nsetTranslucent(translucent: boolean): void;\n```\n"
  },
  {
    "path": "docs/docs/apis/storage.md",
    "content": "---\nid: apis/storage\ntitle: Storage\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/storage.html\nnext: apis/userinterface\n---\n\nThis interface provides a simple key-based local storage mechanism. If you need more powerful options to persist data and work with them, consider using ReactXP's [Database Extension](/reactxp/docs/extensions/database).\n\n## Methods\n``` javascript\n// Clears all local storage keys\nclear(): SyncTasks.Promise<void>;\n\n// Returns an item by key\ngetItem(key: string): SyncTasks.Promise<string>;\n\n// Deletes an item by key\nremoveItem(key: string): SyncTasks.Promise<void>;\n\n// Sets or replaces the value of an item by key\nsetItem(key: string, value: string): SyncTasks.Promise<void>;\n```\n\n"
  },
  {
    "path": "docs/docs/apis/userinterface.md",
    "content": "---\nid: apis/userinterface\ntitle: UserInterface\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/userinterface.html\nnext: apis/userpresence\n---\n\nThis interface provides a variety of UI-related methods.\n\n## Types\n``` javascript\ninterface LayoutInfo {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n}\n```\n\n## Methods\n``` javascript\n// Specifies the \"main view\" of the app, which is rendered on the full\n// screen beneath any open modals or popups\nsetMainView(element: React.ReactElement<any>): void;\n\n// Android & iOS only.\n// Wrapper around RN.AppRegistry.registerComponent();\n// IMPORTANT: Some APIs, e.g. Popup & Modal, require a string\n// `reactxp_rootViewId` prop to be set on the component from the\n// native-side.\nregisterRootView(viewKey: string, getComponentFunc: Function);\n\n// Specifies whether custom scrollbars should be enabled (applies\n// to web only)\nuseCustomScrollbars(enable: boolean): void;\n\n// Indicates whether the screen is \"high density\" (e.g. retina displays)\nisHighPixelDensityScreen(): boolean;\n\n// Measure the location and dimensions of a mounted component relative\n// to the window or one of its other containing views\nmeasureLayoutRelativeToWindow(component: React.Component<any, any>):\n    SyncTasks.Promise<LayoutInfo>;\nmeasureLayoutRelativeToAncestor(component: React.Component<any, any>,\n    ancestor: React.Component<any, any>): SyncTasks.Promise<LayoutInfo>;\n\n// Measures the dimension of window (based on specified root view id or \n// defaults to main window or screen, in the case\n// of non-windowed platforms); the dimensions can also be obtained for any\n// view (including your app's top-level view) using the onLayout\n// callback\nmeasureWindow(rootViewId?: string): Types.Dimensions;\n\n// Indicates the \"size multiplier\" for text increase or decrease, which\n// can be adjusted by users on some platforms; defaults to 1.0\ngetContentSizeMultiplier(): SyncTasks.Promise<number>;\n\n// Dismisses the on-screen keyboard (on applicable platforms)\ndismissKeyboard(): void;\n\n// Enables native -> script touch event latency diagnostic events.\n// When latency greater than latencyThresholdMs is observed, the\n// touchLatencyEvent will fire (on applicable platforms).\nenableTouchLatencyEvents(latencyThresholdMs: number): void;\n\n// Returns true if the application is in the keyboard navigation state,\n// when the user is using Tab key to navigate through the focusable\n// elements (on applicable platforms).\nisNavigatingWithKeyboard(): boolean;\n```\n\n## Events\n``` javascript\n// Triggered when the content size multiplier changes while the\n// app is running\ncontentSizeMultiplierChangedEvent: SubscribableEvent<\n    (multiplier: number) => void>();\n\n// Triggered when enableTouchLatencyEvents has been called and\n// native -> script touch latency exceeding the threshold has\n// been observed (on applicable platforms).\ntouchLatencyEvent: SubscribableEvent<\n    (observedLatencyMs: number) => void>();\n\n// Triggered when the keyboard navigation state is changed\n// (on applicable platforms).\nkeyboardNavigationEvent: SubscribableEvent<\n    (isNavigatingWithKeyboard: boolean) => void>();\n```\n\n"
  },
  {
    "path": "docs/docs/apis/userpresence.md",
    "content": "---\nid: apis/userpresence\ntitle: UserPresence\nlayout: docs\ncategory: Interfaces\npermalink: docs/apis/userpresence.html\nnext: extensions/database\n---\n\nThis interface provides information about whether the user is currently present. The technique for detecting presence differs by platform. On mobile platforms, the user is assumed to be present as long as the app is in the foreground. On web platforms, the user is assumed to be present if the window is in the foreground, the tab is foremost, and some mouse or keyboard activity has been seen within the window within the past minute.\n\n# Methods\n``` javascript\n// Indicates whether the user is currently present\n// On web platforms, it indicates whether the user has focused on the app and interacted with the app in the last 60 seconds\nisUserPresent(): boolean;\n```\n\n## Events\n``` javascript\n// Triggered when the user presence changes\nuserPresenceChangedEvent: SubscribableEvent<\n    (isPresent: boolean) => void>();\n```\n\n"
  },
  {
    "path": "docs/docs/components/activityindicator.md",
    "content": "---\nid: components/activityindicator\ntitle: ActivityIndicator\nlayout: docs\ncategory: Components\npermalink: docs/components/activityindicator.html\nnext: components/button\n---\n\nThis component displays an animated \"spinner\" control that tells the user that an operation is pending. Animation continues as long as the component is displayed.\n\n## Props\n``` javascript\n// Color of indicator\ncolor: color;\n\n// Number of ms to wait before displaying\ndeferTime: number = 0;\n\n// Size of indicator (exact sizes are platform-specific)\nsize: 'large' | 'medium' | 'small' | 'tiny';\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n```\n\n## Styles\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n\n## Methods\nNo methods\n\n"
  },
  {
    "path": "docs/docs/components/button.md",
    "content": "---\nid: components/button\ntitle: Button\nlayout: docs\ncategory: Components\npermalink: docs/components/button.html\nnext: components/gestureview\n---\n\nLike View, this component is a generic container for other components. However, it adds some additional capabilities -- support for presses or clicks and hovering.\n\n## Props\nIn addition to the [common accessibility props](/reactxp/docs/accessibility.html), the following props are supported.\n\n``` javascript\n// Text to be used by screen readers\naccessibilityLabel: boolean = false;\n\n// Traits used to hint screen readers, etc.\naccessibilityTraits: AccessibilityTrait | AccessibilityTrait[] = undefined;\n\n// It is hard or impossible to tell by a reference to an instance of a component\n// from where this component has been instantiated. You can assign this property\n// and check instance.props.accessibilityId. For example accessibilityId is used\n// in View's FocusArbitrator callback.\naccessibilityId: string = undefined;\n\n// Opacity value the button should animate to on button touch\nactiveOpacity: number = undefined; // iOS and Android only\n\n// Id of an expandable element revealed by the button. Describes a relation\n// between button and element to screen reader.\nariaControls: string = undefined; // Web only\n\n// Specifies a unique id for an HTML element\n// NOTE: This property may be going away in future versions.\nid: string = undefined; // Web only\n\n// Expose the element and/or its children as accessible to Screen readers\nimportantForAccessibility?: ImportantForAccessibility = ImportantForAccessibility.Yes;\n\n// Delay in ms before onLongPress is called\ndelayLongPress: number = 1000;\n\n// If disabled, touch and mouse input events are ignored\ndisabled: boolean = false;\n\n// By default, opacity of a disabled element is 0.5. This value can be\n// overriden with this property\ndisabledOpacity: number = undefined;\n\n// Disable default opacity animation on touch of buttons\ndisableTouchOpacityAnimation: boolean = false;  // iOS and Android only\n\n// Should be focused when the component is mounted, see also View's arbitrateFocus\n// property.\n// WARNING: autoFocus=true means that this Button's requestFocus() method will be\n// called, however calling requestFocus() might have no effect (for example the\n// button is disabled), the application has to handle this either while setting\n// this property or in the View's FocusArbitrator callback.\nautoFocus: boolean = false;\n\n// Called when VoiceOver is on and the user double tapped to\n// activate a control\nonAccessibilityTapIOS: (e: SyntheticEvent) => void; // iOS Only\n\n// Focus Events\nonFocus: (e: FocusEvent) => void = undefined;\nonBlur: (e: FocusEvent) => void = undefined;\n\n// Called when the mouse cursor enters or leaves the view bounds\nonHoverStart: (e: SyntheticEvent) => void;\nonHoverEnd: (e: SyntheticEvent) => void;\n\n// Keyboard Events\nonKeyPress: (e: KeyboardEvent) => void = undefined;\n\n// Called when the user has pressed and held for a specified duration\nonLongPress: (e: SyntheticEvent) => void;\n\n// Called when the touch or mouse button is released within the\n// bounds of the view and the press has not been canceled\nonPress: (e: SyntheticEvent) => void;\n\n// Called when touch is initiated or mouse button is pressed\nonPressIn: (e: SyntheticEvent) => void;\n\n// Called when touch or the mouse button is released or the\n// user's finger or mouse cursor is no longer over the view\nonPressOut: (e: SyntheticEvent) => void;\n\n// Rasterize contents using offscreen bitmap (perf optimization)\nshouldRasterizeIOS: boolean = false; // iOS only\n\n// See below for supported styles\nstyle: ButtonStyleRuleSet | ButtonStyleRuleSet[] = [];\n\n// Keyboard tab order\ntabIndex: number = undefined;\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Text for a tooltip\ntitle: string = undefined;\n\n// Background color that will be visible on button touch\nunderlayColor: string = undefined; // iOS and Android only\n```\n\n## Styles\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the accessibility focus to the component.\nfocus(): void;\n\n// The preferable way to focus the component. When requestFocus() is called,\n// the actual focus() will be deferred, and if requestFocus() has been\n// called for several components, only one of those components will actually\n// get a focus() call. By default, last component for which requestFocus() is\n// called will get a focus() call, but you can specify arbitrateFocus property\n// of a parent View and provide the callback to decide which one of that View's\n// descendants should be focused. This is useful for the accessibility: when\n// consecutive focus() calls happen one after another, the next one interrupts\n// the screen reader announcement for the previous one and the user gets\n// confused. autoFocus property of focusable components also uses requestFocus().\nrequestFocus(): void;\n\n// Blurs the component.\nblur(): void;\n```\n\n"
  },
  {
    "path": "docs/docs/components/gestureview.md",
    "content": "---\nid: components/gestureview\ntitle: GestureView\nlayout: docs\ncategory: Components\npermalink: docs/components/gestureview.html\nnext: components/image\n---\n\nThis component provides support for common touch gestures -- tapping, double-tapping, long-pressing, panning, and pinching. It also handles common mouse-based gestures including double clicking and scroll wheel input.\n\nInformation about pending gestures is returned through event handlers. A caller can specify which gestures they are interested in by specifying those event handlers. For example, if you are interested in double taps and horizontal pans, provide an onDoubleTap and onPanHorizontal handler.\n\n## Props\n``` javascript\n// Alternate text for screen readers.\naccessibilityLabel: string = undefined;\n\n// Traits used to hint screen readers, etc.\naccessibilityTraits: AccessibilityTrait | AccessibilityTrait[] = undefined;\n\n// Expose the element and/or its children as accessible to Screen readers\nimportantForAccessibility?: ImportantForAccessibility =\n    ImportantForAccessibility.Yes;\n\n// Gestures and attributes that apply only to touch inputs\nonPinchZoom: (gestureState: MultiTouchGestureState) => void = undefined;\nonRotate: (gestureState: MultiTouchGestureState) => void = undefined;\n\n// Gestures and attributes that apply only to mouse inputs\nonScrollWheel: (gestureState: ScrollWheelGestureState) => void = undefined;\nmouseOverCursor: GestureMouseCursor = undefined;\n\n// Gestures and attributes that apply to either touch or mouse inputs\nonPan: (gestureState: PanGestureState) => void = undefined;\nonPanVertical: (gestureState: PanGestureState) => void = undefined;\nonPanHorizontal: (gestureState: PanGestureState) => void = undefined;\nonTap: (gestureState: TapGestureState) => void = undefined;\nonDoubleTap: (gestureState: TapGestureState) => void = undefined;\nonContextMenu: (gestureState: TapGestureState) => void = undefined;\nonLongPress: (gestureState: TapGestureState) => void = undefined;\n\n// Focus Events\nonFocus: (e: FocusEvent) => void = undefined;\nonBlur: (e: FocusEvent) => void = undefined;\n\n// Keyboard Events\nonKeyPress: (e: KeyboardEvent) => void = undefined;\n\n// We can set vertical or horizontal as preferred\npreferredPan: PreferredPanGesture = undefined; // Horizontal or vertical\n\n// How many pixels (in either horizontal or vertical direction) until\n// pan is recognized? Default is 10. Can be any value > 0.\npanPixelThreshold: number = undefined;\n\n// Something else wants to become responder. Should this view\n// release the responder? Setting true allows release.\nreleaseOnRequest: boolean = false;\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n```\n\n## Styles\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the accessibility focus to the component.\nfocus(): void;\n```\n\n"
  },
  {
    "path": "docs/docs/components/image.md",
    "content": "---\nid: components/image\ntitle: Image\nlayout: docs\ncategory: Components\npermalink: docs/components/image.html\nnext: components/link\n---\n\nThis component displays an image, which can come from a local source or from the network. It supports JPEG, GIF and PNG formats.\n\nIf child elements are specified, the image acts as a background, and the children are rendered on top of it.\n\nIf headers contains 'Cache-Control: max-stale' with no value specified and the image fails to load, the component tries again passing cache: 'only-if-cached' to the underlying native Image (iOS only). This way the app can render otherwise inaccessible stale cached images.\n\n## Props\n``` javascript\n// Alternate text to display if the image cannot be loaded\n// or by screen readers\naccessibilityLabel: string = undefined;\n\n// HTTP headers to include when fetching the URL.\nheaders: { [headerName: string]: string } = undefined;\n\n// Called when an error occurs that prevents the image from loading\nonError: (err?: Error) => void;\n\n// Called when the image successfully loads\nonLoad: (size: Dimensions) => void;\n\n// Android-specific resize property\nresizeMethod: 'auto' | 'resize' | 'scale' = 'auto'; // Android only\n\n// Determines how to resize the image if its natural size\n// does not match the size of the container\n// Note: In Web version, 'auto' doesn't scale down image\n//   if width/height smaller than the original image size\nresizeMode: 'stretch' | 'contain' | 'cover' | 'auto' | 'repeat' = 'contain';\n\n// URL to image\nsource: string = undefined;\n\n// See below for supported styles\nstyle: ImageStyleRuleSet | ImageStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Tooltip for image\ntitle: string = undefined;\n```\n\n## Styles\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Returns the native width and height of the image. Can be called only after\n// the onLoad has been called and only while the component is mounted.\ngetNativeHeight(): number;\ngetNativeWidth(): number;\n```\n\n## Static Methods\n```javascript\n// Prefetches a remote image and stores it in a cache. This can decrease the\n// amount of time it takes when you later want to show the image because the\n// image only has to be fetched from the local cache rather than over the\n// network.\nprefetch(url: string): Promise<boolean>;\n\n// Similarly to [prefetch], this method loads a remote image and stores it in\n// a cache. If prefetching was successful it will also get image dimensions. It will be\n// useful if you need [getNativeHeight] or [getNativeWidth] after image\n// was loaded because you will get this info together with prefetching and before\n// you actually need to show the image.\ngetMetadata(url: string): Promise<ImageMetadata>\n```\n"
  },
  {
    "path": "docs/docs/components/link.md",
    "content": "---\nid: components/link\ntitle: Link\nlayout: docs\ncategory: Components\npermalink: docs/components/link.html\nnext: components/picker\n---\n\nThis component displays a hyperlink. On the web, it translates to an &lt;a&gt; tag.\n\n## Props\n``` javascript\n// It is hard or impossible to tell by a reference to an instance of a component\n// from where this component has been instantiated. You can assign this property\n// and check instance.props.accessibilityId. For example accessibilityId is used\n// in View's FocusArbitrator callback.\naccessibilityId: string = undefined;\n\n// Should fonts be scaled according to system setting?\nallowFontScaling: boolean = true; // Android and iOS only\n\n// Should be focused when the component is mounted, see also View's arbitrateFocus\n// property.\nautoFocus: boolean = false;\n\n// For non-zero values, truncates with ellipsis if necessary\nnumberOfLines: number = 0;\n\n// Called when the mouse cursor enters or leaves the view bounds\nonHoverStart: (e: SyntheticEvent) => void = undefined;\nonHoverEnd: (e: SyntheticEvent) => void = undefined;\n\n// Event called when the touch or mouse button is released\n// within the bounds of the view and the press has not been canceled\nonPress: (e: SyntheticEvent, url: string) => void = undefined;\n\n// Event called when a long touch or mouse (> 1000ms) button is released\n// within the bounds of the view and the press has not been canceled\nonLongPress: (e: SyntheticEvent, url:string) => void = undefined;\n\n// Event called when context menu is triggered, either by\n// right mouse button click or context menu key\nonContextMenu: (e: MouseEvent) => void = undefined;\n\n// Can the link be included in a text selection?\nselectable: boolean = false;\n\n// See below for supported styles\nstyle: LinkStyleRuleSet | LinkStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Text for a tooltip\ntitle: string = undefined;\n\n// URL to follow for hyperlink\nurl: string;\n```\n\n## Styles\n\n[**Text Styles**](/reactxp/docs/styles.html#text-style-attributes)\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the focus to the component.\nfocus(): void;\n\n// The preferable way to focus the component. When requestFocus() is called,\n// the actual focus() will be deferred, and if requestFocus() has been\n// called for several components, only one of those components will actually\n// get a focus() call. By default, last component for which requestFocus() is\n// called will get a focus() call, but you can specify arbitrateFocus property\n// of a parent View and provide the callback to decide which one of that View's\n// descendants should be focused. This is useful for the accessibility: when\n// consecutive focus() calls happen one after another, the next one interrupts\n// the screen reader announcement for the previous one and the user gets\n// confused. autoFocus property of focusable components also uses requestFocus().\nrequestFocus(): void;\n\n// Blurs the component.\nblur(): void;\n```\n"
  },
  {
    "path": "docs/docs/components/picker.md",
    "content": "---\nid: components/picker\ntitle: Picker\nlayout: docs\ncategory: Components\npermalink: docs/components/picker.html\nnext: components/scrollview\n---\n\nThis component displays a control that allows the user to pick from a list of items.\n\n## Types\n``` javascript\ninterface PickerPropsItem {\n    label: string;\n    value: string;\n}\n```\n\n## Props\n``` javascript\n// List of items to be displayed in the picker\nitems: PickerPropsItem[] = [];\n\n// 'dialog': Show a modal dialog\n// 'dropdown': Shows a dropdown anchored to the picker view\nmode: 'dialog' | 'dropdown' = 'dialog'; // Android only\n\n// Invoked when the selected value changes\nonValueChange: (itemValue: string, itemPosition: number) => void;\n\n// Initially-selected item\nselectedValue: string;\n\n// See below for supported styles\nstyle: PickerStyleRuleSet | PickerStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n```\n\n## Styles\n\n``` javascript\n**Text Color**\ncolor: 'string';\n```\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n\nNo methods\n\n\n## Sample Usage\n\n``` javascript\nconst pickerItems: RX.Types.PickerPropsItem[] = [\n    {\n        label: 'Cool',\n        value: 'cool'\n    },\n    {\n        label: 'Super',\n        value: 'super'\n    },\n    {\n        label: 'Great',\n        value: 'great'\n    }\n];\n\nclass MyComponent extends RX.Component<null, { selectedValue: string }> {\n    constructor() {\n        super();\n\n        this.state = {\n            selectedValue: 'cool'\n        }\n    }\n\n    render(): JSX.Element {\n        return (\n            <RX.View>\n                <RX.Text>\n                    { 'How are you feeling?' }\n                </RX.Text>\n                <RX.Picker\n                    items={ pickerItems }\n                    selectedValue={ this.state.selectedValue }\n                    onValueChange={ this._onValueChange }\n                />\n            </RX.View>\n        );\n    }\n\n    private _onValueChange = (itemValue: string, itemIndex: number) => {\n        this.setState({ selectedValue: itemValue });\n    }\n}\n```\n"
  },
  {
    "path": "docs/docs/components/scrollview.md",
    "content": "---\nid: components/scrollview\ntitle: ScrollView\nlayout: docs\ncategory: Components\npermalink: docs/components/scrollview.html\nnext: components/text\n---\n\nLike a View, this component is a container for other components. However, it supports scrolling (panning) and zooming so it is possible to view larger contents.\n\nScrollViews must have a bounded height (or width, if it scrolls horizontally) since its children are of unbounded height (or width). To bound the dimensions of a ScrollView, either set the height/width directly or make sure that its parent's height/width is bounded.\n\n## Props\n``` javascript\n// Should scroll bar bounce when user hits the bounds?\nbounces: boolean = true; // iOS only\n\n// Controls the scroll direction. When false or undefined, only vertical scroll is enabled, when true, only horizontal scroll is enabled\nhorizontal: boolean = false;\n\n// When the user scrolls the view, how should the on-screen keyboard react?\nkeyboardDismissMode: 'none' | 'interactive' | 'on-drag'; // Native only\n\n// Should the on-screen keyboard remain visible when the user taps\n// the scroll view?\nkeyboardShouldPersistTaps: boolean | 'always' | 'never' | 'handled' = 'never'; // Native only\n\n// Invoked when the contents of the scroll view change\nonContentSizeChange: (width: number, height: number) => void = undefined;\n\n// Focus Events\nonFocus: (e: FocusEvent) => void = undefined;\nonBlur: (e: FocusEvent) => void = undefined;\n\n// Keyboard Events\nonKeyPress: (e: KeyboardEvent) => void = undefined;\n\n// Invoked when view dimensions or position changes\nonLayout: (e: ViewOnLayoutEvent) => void = undefined;\n\n// Called when the scroll position changes\nonScroll: (newScrollTop: number, newScrollLeft: number) => void = undefined;\n\n// Called when the user starts or stops scrolling (touch-based systems only)\nonScrollBeginDrag: () => void = undefined;\nonScrollEndDrag: () => void = undefined;\n\n// Animation helpers to allow usage of the RN.Animated.Event system through ReactXP.\n// AnimatedValue objects hooked up to either (or both) of these properties will be automatically\n// hooked into the onScroll handler of the scrollview and .setValue() will be called on them\n// with the updated values.  On supported platforms, it will use RN.Animated.event() to do\n// a native-side/-backed coupled animation.\nscrollXAnimatedValue?: RX.Types.AnimatedValue;\nscrollYAnimatedValue?: RX.Types.AnimatedValue;\n\n// Android only property to control overScroll mode\noverScrollMode?: 'auto' | 'always' | 'never';\n\n// Snap to page boundaries?\npagingEnabled: boolean = false; // Android & iOS only\nsnapToInterval: number = undefined; // iOS only\n\n// Is scrolling enabled?\nscrollEnabled: boolean = true;\n\n// Minimum duration (in milliseconds) between scroll events\nscrollEventThrottle: number = undefined;\n\n// Inset (in pixels) of scroll indicator from top/bottom (vertical)\n// or left/right (horizontal)\nscrollIndicatorInsets: ScrollIndicatorInsets = undefined;\n\n// If true, this scroll bar scrolls to the top when the user\n// taps on the status bar.\nscrollsToTop: boolean = false; // iOS only\n\n// Should the indicator be displayed?\nshowsHorizontalScrollIndicator: boolean = [same as horizontal];\nshowsVerticalScrollIndicator: boolean = [same as horizontal];\n\n// See below for supported styles\nstyle: ViewStyleRuleSet | ViewStyleRuleSet[] = [];\n\n// Windows-only property to control tab navigation inside the view\ntabNavigation?: 'local' | 'cycle' | 'once';\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n```\n\n## Styles\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the accessibility focus to the component.\nfocus(): void;\n\n// Sets the absolute top or left position (measured in pixels) of the\n// viewport within the scroll view. Optionally animates from the current\n// position.\nsetScrollLeft(scrollLeft: number, animate: boolean): void;\nsetScrollTop(scrollTop: number, animate: boolean): void;\n```\n\n\n"
  },
  {
    "path": "docs/docs/components/text.md",
    "content": "---\nid: components/text\ntitle: Text\nlayout: docs\ncategory: Components\npermalink: docs/components/text.html\nnext: components/textinput\n---\n\nThis component displays basic text. Its children must be a string literal or a series of children that are either Text components or View components with a fixed height and width.\n\nUnlike other ReactXP components, some of the style attributes for an Text cascade to its children. In the following example, the title and body both inherit the styles from their parent RX.Text component, but they can also override specific style elements.\n\nAnother difference between Text and other components is that Text children are not layed out according to flexbox layout rules. Instead, an inline text layout is used.\n\n## Props\n\n``` javascript\n// Should fonts be scaled according to system setting?\nallowFontScaling: boolean = true; // Android and iOS only\n\n// When numberOfLines is set, this prop defines how text will be truncated.\n// head: The line is displayed so that the end fits in the container and\n//   the missing text at the beginning of the line is indicated by an\n//   ellipsis glyph. e.g., \"...wxyz\"\n// middle: The line is displayed so that the beginning and end fit in\n//   the container and the missing text in the middle is indicated by an\n//   ellipsis glyph. \"ab...yz\"\n// tail: The line is displayed so that the beginning fits in the container\n//   and the missing text at the end of the line is indicated by an ellipsis\n//   glyph. e.g., \"abcd...\"\nellipsizeMode: 'head' | 'middle' | 'tail'; // Android & iOS only\n\n// Specifies a unique id for an HTML element.\n// NOTE: This property may be going away in future versions.\nid: string = undefined; // Web only\n\n// Expose the element and/or its children as accessible to Screen readers\nimportantForAccessibility: ImportantForAccessibility =\n    ImportantForAccessibility.Yes;\n\n// It is hard or impossible to tell by a reference to an instance of a component\n// from where this component has been instantiated. You can assign this property\n// and check instance.props.accessibilityId. For example accessibilityId is used\n// in View's FocusArbitrator callback.\naccessibilityId: string = undefined;\n\n// Should be focused when the component is mounted, see also View's arbitrateFocus\n// property.\n// WARNING: autoFocus=true means that this Text's requestFocus() method will be\n// called, however calling requestFocus() for Text might make sense only on mobile\n// for the accessibility reasons, on web it has no effect, the application has to\n// handle this either while setting this property or in the View's FocusArbitrator\n// callback.\nautoFocus: boolean = false;\n\n// For non-zero values, truncates with ellipsis if necessary. Web platform\n// doesn't support values greater than 1. Web platform may also not truncate\n// properly if text contains line breaks, so it may be necessary to replace\n// line breaks before rendering.\nnumberOfLines: number = 0;\n\n// Mouse & Touch Events\nonPress?: (e: SyntheticEvent) => void = undefined;\nonContextMenu?: (e: SyntheticEvent) => void = undefined;\n\n// Is the text selectable (affects mouse pointer and copy command)\nselectable: boolean = false;\n\n// See below for supported styles\nstyle: TextStyleRuleSet | TextStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n```\n\n## Styles\n\n[**Text Styles**](/reactxp/docs/styles.html#text-style-attributes)\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the accessibility focus to the component.\nfocus(): void;\n\n// The preferable way to focus the component. When requestFocus() is called,\n// the actual focus() will be deferred, and if requestFocus() has been\n// called for several components, only one of those components will actually\n// get a focus() call. By default, last component for which requestFocus() is\n// called will get a focus() call, but you can specify arbitrateFocus property\n// of a parent View and provide the callback to decide which one of that View's\n// descendants should be focused. This is useful for the accessibility: when\n// consecutive focus() calls happen one after another, the next one interrupts\n// the screen reader announcement for the previous one and the user gets\n// confused. autoFocus property of focusable components also uses requestFocus().\nrequestFocus(): void;\n\n// Blurs the component.\nblur(): void;\n\n// When selection is enabled, retrieves the selected text.\ngetSelectedText(): string; // Windows only\n```\n\n## Sample Usage\n\n``` javascript\n    <RX.Text style={ _styles.defaultText }>\n        <RX.Text style={ _styles.titleText }>\n            { this.props.title }\n        </RX.Text>\n        <RX.Text style={ _styles.bodyText }>\n            { this.props.body }\n        </RX.Text>\n    </RX.Text>\n```\n\n``` javascript\n    static _styles = {\n        redBox: RX.Styles.createViewStyle({\n            width: 10,\n            height: 10,\n            backgroundColor: 'red'\n        })\n    }\n\n    <RX.Text style={ _styles.defaultText } numberOfLines={ 1 }>\n        <RX.Text> { 'Red box ' } </RX.Text>\n        <RX.View style={ _styles.redBox } />\n        <RX.Text> { ' inlined view example' } </RX.Text>\n    </RX.Text>\n```\n\n"
  },
  {
    "path": "docs/docs/components/textinput.md",
    "content": "---\nid: components/textinput\ntitle: TextInput\nlayout: docs\ncategory: Components\npermalink: docs/components/textinput.html\nnext: components/view\n---\n\nThis component provides basic text input capabilities.\n\nIt can be used in one of two modes. In the first mode, the contents of the text input are static and are specified by the `value` prop. Any attempt to modify the value will result in `onChangeText`, which allows the owning component to re-render with an updated `value`. In the second mode, `value` is unspecified, and the text input value is allowed to be modified as long as it remains mounted. In this mode, the caller can specify an optional `defaultValue` prop to specify the initial value.\n\n## Props\nIn addition to the [common accessibility props](/reactxp/docs/accessibility.html), the following props are supported.\n\n``` javascript\n// Text to be used by screen readers\naccessibilityLabel: boolean = false;\n\n// It is hard or impossible to tell by a reference to an instance of a component\n// from where this component has been instantiated. You can assign this property\n// and check instance.props.accessibilityId. For example accessibilityId is used\n// in View's FocusArbitrator callback.\naccessibilityId: string = undefined;\n\n// Should fonts be scaled according to system setting?\nallowFontScaling: boolean = true; // Android and iOS only\n\n// Auto-capitalization mode\nautoCapitalize: 'none' | 'sentences' | 'words' | 'characters';\n\n// Should auto-correction be applied to contents?\nautoCorrect: boolean = true;\n\n// Should be focused when the component is mounted, see also View's arbitrateFocus\n// property.\n// WARNING: autoFocus=true means that this TextInput's requestFocus() method will be\n// called, however calling requestFocus() might have no effect (for example the\n// input is disabled), the application has to handle this either while setting this\n// property or in the View's FocusArbitrator callback.\nautoFocus: boolean = false;\n\n// Should focus be lost after submitting?\nblurOnSubmit: boolean = false;\n\n// iOS and Windows only property for controlling when the clear button\n// should appear on the right side of the text view. Default behavior\n// dependends on platform: equivalent to 'never' on iOS, and 'always'\n// on Windows.\nclearButtonMode: 'never' | 'while-editing' | 'unless-editing' | 'always';\n\n// Initial value that will change when the user starts typing\ndefaultValue: string = undefined;\n\n// Disable full screen editor mode?\ndisableFullscreenUI: boolean = false; // Android-specific\n\n// Can text be edited by the user?\neditable: boolean = true;\n\n// iOS-only prop for controlling the keyboard appearance\nkeyboardAppearance: 'default' | 'light' | 'dark';\n\n// On-screen keyboard type to display\nkeyboardType: 'default' | 'numeric' | 'email-address' | 'number-pad';\n\n// Maximum character count\nmaxLength: number = undefined;\n\n// Should the control support multiple lines of text?\nmultiline: boolean = false;\n\n// Called when the control loses focus\nonBlur: () => void = undefined;\n\n// Called when the text value changes\nonChangeText: (newValue: string) => void = undefined;\n\n// Called when the control obtains focus\nonFocus: () => void = undefined;\n\n// Called on a key event\nonKeyPress: (e: KeyboardEvent) => void = undefined;\n\n// Called when text is pasted into the control (not currently\n// supported on iOS or Android)\nonPaste: (e: ClipboardEvent) => void = undefined;\n\n// Called when the selection scrolls due to overflow\nonScroll: (newScrollLeft: number, newScrollTop: number) => void = undefined;\n\n// Called when the selection range or insertion point location changes\nonSelectionChange: (start: number, end: number) => void = undefined;\n\n// Called when the text input submit button is pressed; invalid if\n// multiline is true\nonSubmitEditing: () => void = undefined;\n\n// Placeholder text to dislpay when input is empty\nplaceholder: string = undefined;\n\n// Color of placeholder text\nplaceholderTextColor: color = '#ccc';\n\n// iOS and android prop for controlling return key type\nreturnKeyType: 'done' | 'go' | 'next' | 'search' | 'send';\n\n// Obscure the text input (for passwords)?\nsecureTextEntry: boolean = false;\n\n// Should spell checking be applied to contents?\nspellCheck: boolean = [value of autoCorrect];\n\n// See below for supported styles\nstyle: TextInputStyleRuleSet | TextInputStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Text for a tooltip\ntitle: string = undefined;\n\n// If defined, the control value is forced to match this value;\n// if undefined, control value can be modified by the user\nvalue: string = undefined;\n```\n\n## Styles\n[**Text Styles**](/reactxp/docs/styles.html#text-style-attributes)\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Forces the control to give up focus\nblur(): void;\n\n// Gives the control focus. For mobile, use setAccessibilityFocus()\n// for setting screen reader focus\nfocus(): void;\n\n// The preferable way to focus the component. When requestFocus() is called,\n// the actual focus() will be deferred, and if requestFocus() has been\n// called for several components, only one of those components will actually\n// get a focus() call. By default, last component for which requestFocus() is\n// called will get a focus() call, but you can specify arbitrateFocus property\n// of a parent View and provide the callback to decide which one of that View's\n// descendants should be focused. This is useful for the accessibility: when\n// consecutive focus() calls happen one after another, the next one interrupts\n// the screen reader announcement for the previous one and the user gets\n// confused. autoFocus property of focusable components also uses requestFocus().\nrequestFocus(): void;\n\n// Gives the control accessibility-only focus\n// E.g. screen reader focus is needed, but popping up of native\n// keyboard is undesirable\nsetAccessibilityFocus(): void;\n\n// Does control currently have focus?\nisFocused(): boolean;\n\n// Extends selection to include all contents\nselectAll(): void;\n\n// Selects a range of text\nselectRange(start: number, end: number): void;\n\n// Returns the current selection range\ngetSelectionRange(): { start: number, end: number };\n\n// Sets the current value\nsetValue(value: string): void;\n```\n\n\n"
  },
  {
    "path": "docs/docs/components/view.md",
    "content": "---\nid: components/view\ntitle: View\nlayout: docs\ncategory: Components\npermalink: docs/components/view.html\nnext: components/webview\n---\n\nThis component is a generic container for other components.\n\n## Props\nIn addition to the [common accessibility props](/reactxp/docs/accessibility.html), the following props are supported.\n\n``` javascript\n// Alternate text for screen readers.\n// If not defined, title prop is used.\naccessibilityLabel: string = undefined;\n\n// Traits used to hint screen readers, etc.\naccessibilityTraits: AccessibilityTrait | AccessibilityTrait[] = undefined;\n\n// Region for accessibility mechanisms\naccessibilityLiveRegion: AccessibilityLiveRegion =\n    undefined; // Android and web only\n\n// It is hard or impossible to tell by a reference to an instance of a component\n// from where this component has been instantiated. You can assign this property\n// and check instance.props.accessibilityId. For example accessibilityId is used\n// in View's FocusArbitrator callback.\naccessibilityId: string = undefined;\n\n// Opacity value the button should animate to, on touch on views that\n// have onPress handlers\nactiveOpacity: number = undefined; // iOS and Android only\n\n// Animation of children\n//   - Every child must have a `key`.\n//   - String refs aren't supported on children. Only callback refs are.\nanimateChildEnter: boolean = false;\nanimateChildLeave: boolean = false;\nanimateChildMove: boolean = false;\n\n// Id of an element that describes the view for screenreader.\nariaLabelledBy?: string = undefined; // Web only\n\n// A custom role description to be read by the screen readers.\nariaRoleDescription?: string = undefined; // Web only\n\n// Block touches for this component and all of its children\nblockPointerEvents: boolean = false;\n\n// Disable default opacity animation on touch on views that have\n// onPress handlers\ndisableTouchOpacityAnimation: boolean = false;  // iOS and Android only\n\n// Specifies a unique id for an HTML element\n// NOTE: This property may be going away in future versions.\nid: string = undefined; // Web only\n\n// Ignore clicks and other mouse events, allowing children or\n// components behind to receive them\nignorePointerEvents: boolean = false;\n\n// Expose the element and/or its children as accessible to Screen readers\nimportantForAccessibility?: ImportantForAccessibility = Auto;\n\n// When the keyboard navigation is happening, restrict the focusable\n// elements within this view. Useful for popups and modals, you\n// might want to prevent the focus from going outside of the popup or\n// modal. The views with restrictFocusWithin are stacked and the last\n// mounted view is a winner. This means if you, for example, have\n// restricted the focus within some modal, and you have a popup (which\n// also desires for a restricted focus) inside this modal, the popup\n// will get the restriction, but when dismissed, the restriction will\n// be restored for the modal. See also the companion method\n// setFocusRestricted() below.\n// WARNING: For the sake of performance, this property is readonly and\n// changing it during the View life cycle will produce an error.\nrestrictFocusWithin: boolean = false;\n\n// When the keyboard navigation is happening, do not focus on this view\n// and on all focusable elements inside this view. See also the companion\n// method setFocusLimited() below.\n// Useful for the list items, allows to skip the consecutive focusing on\n// one list item (and item's internal focusable elements) after another\n// using the Tab key and implement the switching between the items using\n// the arrow keys (or using some other behaviour).\n// When limitFocusWithin=LimitFocusType.Limited, the View and the focusable\n// components inside the View get both tabIndex=-1 and aria-hidden=true.\n// When limitFocusWithin=LimitFocusType.Accessible, the View and the focusable\n// components inside the View get only tabIndex=-1.\n// WARNING: For the sake of performance, this property is readonly and\n// changing it during the View life cycle will produce an error.\nlimitFocusWithin: LimitFocusType = LimitFocusType.Unlimited;\n\n// Should be focused when the component is mounted, see also arbitrateFocus\n// property below.\n// WARNING: autoFocus=true means that this View's requestFocus() method will be\n// called, however calling requestFocus() might have no effect (for example on web\n// View is focusable only when tabIndex is specified), the application has to handle\n// this either while setting this property or in the View's FocusArbitrator callback.\nautoFocus: boolean = false;\n\n// When multiple components with autoFocus=true inside this View are mounting at\n// the same time, and/or multiple components inside this view have received focus()\n// call during the same render cycle, this callback will be called so that it's\n// possible for the application to decide which one should actually be focused.\narbitrateFocus: FocusArbitrator = undefined;\n\n// Additional invisible DOM elements will be added inside the view\n// to track the size changes that are performed behind our back by\n// the browser's layout engine faster (ViewBase checks for the layout\n// updates once a second and sometimes it's not fast enough)\nimportantForLayout: boolean = false; // web only\n\n// Mouse-specific Events\n// For drag specific events, if onDragStart is present, the view is draggable.\n// onDragStart/onDrag/onDragEnd are source specific events\n// onDragEnter/onDragOver/onDragLeave/onDrop are destination specific events\nonDragStart: (e: DragEvent) => void = undefined;\nonDrag: (e: DragEvent) => void = undefined;\nonDragEnd: (e: DragEvent) => void = undefined;\nonDragEnter: (e: DragEvent) => void = undefined;\nonDragOver: (e: DragEvent) => void = undefined;\nonDragLeave: (e: DragEvent) => void = undefined;\nonDrop: (e: DragEvent) => void = undefined;\nonMouseEnter: (e: MouseEvent) => void = undefined;\nonMouseLeave: (e: MouseEvent) => void = undefined;\nonMouseMove: (e: MouseEvent) => void = undefined;\nonMouseOver: (e: MouseEvent) => void = undefined;\n\n// Mouse & Touch Events\nonContextMenu: (e: React.SyntheticEvent) => void;\nonPress: (e: SyntheticEvent) => void = undefined;\n\n// Focus Events\nonFocus: (e: FocusEvent) => void = undefined;\nonBlur: (e: FocusEvent) => void = undefined;\n\n// Keyboard Events\nonKeyPress: (e: KeyboardEvent) => void = undefined;\n\n// Touch-specific Events\nonTouchStartCapture: (e: React.SyntheticEvent) => void = undefined;\nonTouchMoveCapture: (e: React.SyntheticEvent) => void = undefined;\nonLongPress: (e: SyntheticEvent) => void = undefined;\nonMoveShouldSetResponder: (e: React.SyntheticEvent) => boolean =\n    undefined;\nonMoveShouldSetResponderCapture: (e: React.SyntheticEvent) => boolean =\n    undefined;\nonResponderGrant: (e: React.SyntheticEvent) => void = undefined;\nonResponderReject: (e: React.SyntheticEvent) => void = undefined;\nonResponderRelease: (e: React.SyntheticEvent) => void = undefined;\nonResponderStart: (e: React.TouchEvent) => void = undefined;\nonResponderMove: (e: React.TouchEvent) => void = undefined;\nonResponderEnd: (e: React.TouchEvent) => void = undefined;\nonResponderTerminate: (e: React.SyntheticEvent) => void = undefined;\nonResponderTerminationRequest: (e: React.SyntheticEvent) => boolean =\n    undefined;\nonStartShouldSetResponder: (e: React.SyntheticEvent) => boolean =\n    undefined;\nonStartShouldSetResponderCapture: (e: React.SyntheticEvent) => boolean =\n    undefined;\n\n// Other Events\nonLayout: (e: ViewOnLayoutEvent) => void = undefined;\n\n// Rasterize contents using offscreen bitmap (perf optimization)\nshouldRasterizeIOS: boolean = false; // iOS only\n\n// Keyboard tab order\ntabIndex: number = undefined;\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Text for a tooltip\ntitle: string = undefined;\n\n// See below for supported styles\nstyle: ViewStyleRuleSet | ViewStyleRuleSet[] = [];\n\n// Should use hardware or software rendering?\nviewLayerTypeAndroid: 'none' | 'software' | 'hardware'; // Android only property\n\n// Background color that will be visible on touch on views that have onPress\n// handlers\nunderlayColor: string = undefined; // iOS and Android only\n\n// When true\n//  - renders children within the safe area boundaries of a device, i.e. with\n//    padding with ensure the children don't cover navigation bars,\n//    toolbars etc.\n//  - Applies a style of { flex: 1, alignSelf: 'stretch' } to this view.\n//  - Some ViewProps may be ignored.\nuseSafeInsets: boolean = false; // iOS only\n```\n\n## Styles\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\n``` javascript\n// Sets the focus to the component.\nfocus(): void;\n\n// The preferable way to focus the component. When requestFocus() is called,\n// the actual focus() will be deferred, and if requestFocus() has been\n// called for several components, only one of those components will actually\n// get a focus() call. By default, last component for which requestFocus() is\n// called will get a focus() call, but you can specify arbitrateFocus property\n// of a parent View and provide the callback to decide which one of that View's\n// descendants should be focused. This is useful for the accessibility: when\n// consecutive focus() calls happen one after another, the next one interrupts\n// the screen reader announcement for the previous one and the user gets\n// confused. autoFocus property of focusable components also uses requestFocus().\nrequestFocus(): void;\n\n// Blurs the component.\nblur(): void;\n\n// The focus does not go outside the view with restrictFocusWithin by default,\n// setFocusRestricted() allows to turn this restriction off and back on.\nsetFocusRestricted(restricted: boolean): void; // web only\n\n\n// The focus does not go inside the view with limitFocusWithin by default,\n// setFocusLimited() allows to turn this limitation off and back on.\nsetFocusLimited(limited: boolean): void; // web only\n```\n"
  },
  {
    "path": "docs/docs/components/webview.md",
    "content": "---\nid: components/webview\ntitle: WebView\nlayout: docs\ncategory: Components\npermalink: docs/components/webview.html\nnext: apis/alert\n---\n\nThis has been deprecated from ReactXP Core and moved to an extension (reactxp-webview) inline with the React Native Lean Core initiative.\n"
  },
  {
    "path": "docs/docs/extensions/database.md",
    "content": "---\nid: extensions/database\ntitle: Database\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/database.html\nnext: extensions/imagesvg\n---\n\nReactXP provides a [Storage API](/reactxp/docs/apis/storage) for reading and writing simple key/value pairs. Many apps have more complex storage requirements. For this, we developed a no-SQL database wrapper that works on React Native and on browsers. The solution isn't tied to ReactXP, but they work well together.\n\nFor more details, refer to the [NoSqlProvider](https://github.com/Microsoft/NoSQLProvider) GitHub site.\n\nTo install: ```npm install nosqlprovider```\n"
  },
  {
    "path": "docs/docs/extensions/imagesvg.md",
    "content": "---\nid: extensions/imagesvg\ntitle: ImageSvg\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/imagesvg.html\nnext: extensions/navigator\n---\n\nThis component displays a vector image (SVG format). Props control the fill color, stroke color and stroke width.\n\nThe path(s) are specified using the standard SVG string format. Paths must be specified in a nested SvgPath component instance. Multiple SvgPath children can be specified, each with different stroke and fill parameters.  SvgRect children\nare also supported at this time, with the limited props available in react-native-svg.\n\nTo install: ```npm install reactxp-imagesvg``` or  ```yarn add reactxp-imagesvg```\n\n## ImageSvg Props\n``` javascript\n// See below for supported styles\nstyle: RX.ImageSvgStyleRuleSet | RX.ImageSvgStyleRuleSet[] = [];\n\n// Color and opacity of fill; default values are provided by SVG\nfillColor: color;\nfillOpacity: number;\n\n// Preserve aspect ratio or stretch?\npreserveAspectRatio: boolean = true;\n\n// Color, width and opacity of stroke; default values are provided by SVG\nstrokeColor: color;\nstrokeWidth: number;\nstrokeOpacity: number;\n\n// Tooltip for image\ntitle: string = undefined;\n\n// Bounding box\nviewBox: string = undefined;\n\n// Shadow\nwebShadow: boolean = false; // web-specific\n```\n\n## SvgCommon Props\nThese props apply to all of the sub-SVG-element types below:\n\n``` javascript\n// Color and opacity of fill; default values are provided by SVG\nfillColor: color;\nfillOpacity: number;\n\n// Color, width and opacity of stroke; default values are provided by SVG\nstrokeColor: color;\nstrokeWidth: number;\nstrokeOpacity: number;\n```\n\n## SvgPath Props\n``` javascript\n// Path definition string\nd: string = undefined;\n```\n\n## SvgRect Props\n``` javascript\n// Position and dimension information for the rect\nx: number;\ny: number;\nwidth: number;\nheight: number;\n```\n\n## Styles\n\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n## Methods\nNo methods\n\n## Sample Usage\n``` javascript\nimport { default as RXImageSvg, SvgPath as RXSvgPath, Types as SvgTypes }\n    from 'reactxp-imagesvg';\n\nreturn (\n    <RXImageSvg height={ 20 } width={ 20 }>\n        <RXSvgPath\n            fillColor={ 'orange' }\n            d={ 'M 0 0 h 20 v 20 z' }\n        />\n        <RXSvgRect\n            fillColor={ 'blue' }\n            x={ 10 }\n            y={ 20 }\n            width={ 30 }\n            height={ 40 }\n        />\n    </RXImageSvg>\n);\n```\n\n\n"
  },
  {
    "path": "docs/docs/extensions/navigator.md",
    "content": "---\nid: extensions/navigator\ntitle: Navigator\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/navigator.html\nnext: extensions/netinfo\n---\n\nThis component provides a way for the app to present a virtual stack of \"cards\", allowing the user to push or pop those cards onto the stack in an animated manner. The caller can control the animation type and direction.\n\nWhen a new card is presented, the Navigator calls the renderScene method, allowing the caller to render the contents. Cards are identified by \"routes\", which contain a unique ID and configuration parameters that control the behavior of the transition.\n\nWhen a Navigator is first mounted, the stack is empty. The caller must wait for the mount to complete, then specify the list of routes to present.\n\nThe current implementation of Navigator on React Native makes use of the deprecated \"Navigator Experimental\". We will look at moving away from this implementation to the now-recommended \"react-navigation\" in the near future. Some of the more advanced interfaces may need to change. These are listed at the end of this article. Use these with caution.\n\nTo install: ```npm install reactxp-navigation```\n\n## Types\n``` javascript\n// Specifies the behavior when transitioning from one\n// card to another within the stack.\nenum NavigatorSceneConfigType {\n    FloatFromRight,\n    FloatFromLeft,\n    FloatFromBottom,\n    Fade,\n    FadeWithSlide\n}\n\n// Provides information about a card and how it should\n// be presented when pushed onto the stack or popped\n// off the stack.\ninterface NavigatorRoute {\n    // Uniquely identifies the card\n    routeId: number;\n\n    // Animation parameter\n    sceneConfigType: NavigatorSceneConfigType;\n\n    // Optional gesture response distance override;\n    // 0 is equivalent to disabling gestures;\n    // works only on React Native platforms\n    gestureResponseDistance?: number;\n\n    // Optional custom scene config;\n    // works only on React Native platforms\n    customSceneConfig?: CustomNavigatorSceneConfig;\n}\n```\n\n## Props\n``` javascript\n// Style to apply to the card\ncardStyle: ViewStyleRuleSet = undefined;\n\n// Called to render the specified scene\nrenderScene: (route: NavigatorRoute) => JSX.Element = undefined;\n\n// Called when a transition between cards is complete\ntransitionCompleted: () => void = undefined;\n```\n\n## Methods\n``` javascript\n// Returns the current list of routes\ngetCurrentRoutes(): Types.NavigatorRoute[];\n\n// Replaces the current list of routes with a new list\nimmediatelyResetRouteStack(\n    nextRouteStack: Types.NavigatorRoute[]): void;\n\n// Pops the top route off the stack\npop(): void;\n\n// Pops zero or more routes off the top of the stack until\n// the specified route is top-most\npopToRoute(route: Types.NavigatorRoute): void;\n\n// Pops all routes off the stack except for the last\n// remaining item in the stack\npopToTop(): void;\n\n// Push a new route onto the stack\npush(route: Types.NavigatorRoute): void;\n\n// Replaces the top-most route with a new route\nreplace(route: Types.NavigatorRoute): void;\n\n// Replaces an existing route (identified by index) with\n// a new route\nreplaceAtIndex(route: Types.NavigatorRoute, index: number): void;\n\n// Replaces the next-to-top-most route with a new route\nreplacePrevious(route: Types.NavigatorRoute): void;\n```\n\n## Sample Usage\n\nThis sample demonstrates how an app can use Navigator to present a two-card stack, allowing the user to navigate between them. It omits some details for brevity. For a full working example, check out the hello-world sample app.\n\n``` javascript\nenum NavigationRouteId {\n    MainPanel,\n    SecondPanel\n};\n\nclass App extends RX.Component<null, null> {\n    private _navigator: RX.Navigator;\n\n    componentDidMount() {\n        // Now that the app is mounted, specify the initial\n        // navigator route.\n        this._navigator.immediatelyResetRouteStack([{\n            routeId: NavigationRouteId.MainPanel,\n            sceneConfigType: RX.Types.NavigatorSceneConfigType.Fade\n        }]);\n    }\n\n    render() {\n        return (\n            <RX.Navigator\n                ref={ this._onNavigatorRef }\n                renderScene={ this._renderScene }\n            />\n        );\n    }\n\n    private _onNavigatorRef = (navigator: RX.Navigator) => {\n        // Stash away a reference to the mounted navigator\n        this._navigator = navigator;\n    }\n\n    private _renderScene = (navigatorRoute: NavigatorRoute) => {\n        switch (navigatorRoute.routeId) {\n            case NavigationRouteId.MainPanel:\n                return (\n                    <MainPanel\n                        onPressNavigate={ this._onPressNavigate }\n                    />\n                );\n\n            case NavigationRouteId.SecondPanel:\n                return (\n                    <SecondPanel\n                        onNavigateBack={ this._onPressBack }\n                    />\n                );\n        }\n\n        return null;\n    }\n\n    // Called when the user presses a button on the MainPanel\n    // to navigate to the SecondPanel.\n    private _onPressNavigate = () => {\n        this._navigator.push({\n            routeId: NavigationRouteId.SecondPanel,\n            sceneConfigType:\n                RX.Types.NavigatorSceneConfigType.FloatFromRight,\n            customSceneConfig: {\n                hideShadow: true\n            }\n        });\n    }\n\n    // Called when the user presses a back button on the\n    // SecondPanel to navigate back to the MainPanel.\n    private _onPressBack = () => {\n        this._navigator.pop();\n    }\n}\n```\n\n\n## Experimental Types\n\nThese types apply only to React Native platforms, and they currently rely on the soon-to-be-deprecated \"Experimental Navigator\". Some or all of these types may be deprecated in the near future, so use with caution.\n\n``` javascript\n// Additional options that affect card transitions\ntype CustomNavigatorSceneConfig = {\n  // Optional transition styles\n  transitionStyle?: (sceneIndex: number,\n    sceneDimensions: Dimensions) =>\n    NavigationTransitionStyleConfig;\n\n  // Optional overrides for duration, easing, and timing\n  transitionSpec?: NavigationTransitionSpec;\n\n  // Optional cardStyle override\n  cardStyle?: ViewStyleRuleSet;\n\n  // Optionally hide drop shadow\n  hideShadow?: boolean;\n\n  // Optionally flip the visual order of the last two scenes\n  presentBelowPrevious?: boolean;\n};\n\n// Parameters to control transition animations\ntype NavigationTransitionSpec = {\n    duration?: number;\n    easing?: Animated.EasingFunction;\n};\n\n// Parameters to control transition appearance\ntype NavigationTransitionStyleConfig = {\n  // By default, input range is defined as [index - 1, index, index + 1];\n  // Input and output ranges must contain the same number of elements\n  inputRange?: number[];\n  opacityOutput: number | number[];\n  scaleOutput: number | number[];\n  translateXOutput: number | number[];\n  translateYOutput: number | number[];\n};\n```\n\n## Experimental Props\n\nThese props apply only to React Native platforms, and they currently rely on the soon-to-be-deprecated \"Experimental Navigator\". Some or all of these props may be deprecated in the near future, so use with caution.\n\n``` javascript\n// Called after the user swipes back in the stack and the transition\n// is complete\nnavigateBackCompleted: () => void;\n\n// Called when a transition begins; works only\n// on native\ntransitionStarted: (progress?: RX.AnimatedValue,\n    toRouteId?: string, fromRouteId?: string,\n    toIndex?: number, fromIndex?: number) => void = undefined;\n```\n\n"
  },
  {
    "path": "docs/docs/extensions/netinfo.md",
    "content": "---\nid: extensions/netinfo\ntitle: NetInfo\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/netinfo.html\nnext: extensions/restclient\n---\n\nThis interface provides information about network connectivity.\n\n## Types\n``` javascript\nenum DeviceNetworkType {\n    Unknown,\n    None,\n    Wifi,\n    Mobile2G,\n    Mobile3G,\n    Mobile4G\n}\n```\n\n## Methods\n``` javascript\n// Returns a promise that specifies whether the device currently\n// has network connectivity\nisConnected(): SyncTasks.Promise<boolean>;\n\n// Returns the type of network\ngetType(): SyncTasks.Promise<DeviceNetworkType>;\n```\n\n## Events\n``` javascript\n// Triggered when the connectivity changes\nconnectivityChangedEvent: SubscribableEvent<(isConnected: boolean) => void>;\n```\n\n## Sample Usage\n\n``` javascript\nprivate isConnected: boolean;\n\nconstructor() {\n    // Query the initial connectivity state.\n    this.isConnected = false;\n    RXNetInfo.isConnected().then(isConnected => {\n        this.isConnected = isConnected;\n    });\n\n    RXNetInfo.connectivityChangedEvent.subscribe(isConnected => {\n        // Update the connectivity state.\n        this.isConnected = isConnected;\n    });\n}\n```\n\n## Other Notes\n\nOn Android, the following permission must be added to make use of the network interfaces.\n\n``` xml\n<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n```\n"
  },
  {
    "path": "docs/docs/extensions/restclient.md",
    "content": "---\nid: extensions/restclient\ntitle: REST Client\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/restclient.html\nnext: extensions/video\n---\n\nReactXP provides basic [Network APIs](/reactxp/docs/apis/network) for determining network connectivity, but it doesn't provide ways to access the network once connected.\n\nThis extension provides a cross-platform mechanism for wrapping a simple REST API. It supports optional retry logic (including exponential backoff).\n\nFor more details, refer to the [SimpleRestClients](https://github.com/Microsoft/SimpleRestClients) GitHub site.\n\nTo install: ```npm install simplerestclients``` or  ```yarn add simplerestclients```\n\n### Sample Usage\n\n``` javascript\nimport { GenericRestClient, ApiCallOptions }  from 'simplerestclients';\nimport SyncTasks = require('synctasks');\n\nexport interface User {\n    id: string;\n    firstName: string;\n    lastName: string;\n}\n\nexport default class MyRestClient extends GenericRestClient {\n    constructor(private _appId: string) {\n        super('https://myhost.com/api/v1/');\n    }\n\n    // Override _getHeaders to append a custom header with the app ID.\n    protected _getHeaders(options: ApiCallOptions): { [key: string]: string } {\n        let headers = super._getHeaders(options);\n        headers['X-AppId'] = this._appId;\n        return headers;\n    }\n\n    // Define public methods that expose the APIs provided through\n    // the REST service.\n    getAllUsers(): SyncTasks.Promise<User[]> {\n        return this.performApiGet<User[]>('users');\n    }\n\n    getUserById(id: string): SyncTasks.Promise<User> {\n        return this.performApiGet<User>('user/' + id);\n    }\n\n    setUser(user: User): SyncTasks.Promise<void> {\n        return this.performApiPut<void>('user/' + user.id, user);\n    }\n}\n```\n"
  },
  {
    "path": "docs/docs/extensions/video.md",
    "content": "---\nid: extensions/video\ntitle: Video\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/video.html\nnext: extensions/virtuallistview\n---\n\nThis component provides video playback capabilities, presenting optional controls for play, pause, etc.\n\nTo install: ```npm install reactxp-video```\n\n## Types\n``` javascript\n// Used to return progress information in the onProgress callback\ninterface VideoProgress {\n    currentTime: number;\n    playableDuration: number;\n    atValue?: number;\n    target?: number;\n    atTimeScale?: number;\n}\n\n// Used to return information about the video once its metadata\n// has been loaded; returned by the onLoadedData callback\ninterface VideoInfo {\n    duration?: number;\n    naturalSize?: {\n        width: number;\n        height: number;\n    };\n}\n```\n\n## Props\n``` javascript\n// Alternate text to display if the image cannot be loaded\n// or by screen readers\naccessibilityLabel: string = undefined;\n\n// Authentication token to include in request (not supported\n// on some React Native implementations)\nauthToken: string = undefined;\n\n// Should video playback loop to beginning after it completes?\nloop: boolean = false;\n\n// Called when the video is paused for buffering\nonBuffer: () => void = undefined;\n\n// Called when enough of the video has been loaded that playback\n// is possible\nonCanPlay: () => void = undefined;\n\n// Called when enough of the video has been loaded that playback\n// can proceed all the way to the end without buffering pauses\nonCanPlayThrough: () => void = undefined;\n\n// Called when the video playback reaches the end\nonEnded: () => void = undefined;\n\n// Called when the video cannot be loaded\nonError: () => void = undefined;\n\n// Called when the video's metadata has been loaded; returns\n// information about the video\nonLoadedData: (info: VideoInfo) => void = undefined;\n\n// Called when the video data is starting to load\nonLoadStart: () => void = undefined;\n\n// Called periodically when the video is playing; reports\n// progress information\nonProgress: (progress: VideoProgress) => void = undefined;\n\n// Indiciates which portion of the video should be pre-loaded\n// when the component is mounted\npreload: 'auto'|'metadata'|'none' = 'none';\n\n// Determines how to resize the image if its natural size\n// does not match the size of the container\nresizeMode: 'contain'|'cover'|'stretch' = 'contain';\n\n// Displays controls for play, pause, etc.\nshowControls: boolean = false;\n\n// Source of video (URL) or resource `id` as resolved by `require()` for `react-native` targets.\nsource: string | number;\n\n// See below for supported styles\nstyle: ViewStyleRuleSet | ViewStyleRuleSet[] = [];\n```\n\n## Styles\n[**Flexbox Styles**](/reactxp/docs/styles.html#flexbox-style-attributes)\n\n[**View Styles**](/reactxp/docs/styles.html#view-style-attributes)\n\n[**Transform Styles**](/reactxp/docs/styles.html#transform-style-attributes)\n\n\n## Methods\n``` javascript\n// Mutes or unmutes the sound for the video\nmute(muted: boolean): void;\n\n// Pauses the video\npause(): void;\n\n// Plays the video at its current position\nplay(): void;\n\n// Seeks to the specified position (specified in seconds)\nseek(position: number): void;\n```\n\n## Sample Usage\n``` javascript\nreturn (\n    <RX.Video\n        source={ 'http://mydomain.com/coolvideo.mp4' }\n    />\n);\n```\n"
  },
  {
    "path": "docs/docs/extensions/virtuallistview.md",
    "content": "---\nid: extensions/virtuallistview\ntitle: VirtualListView\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/virtuallistview.html\nnext: extensions/webview\n---\n\nThis components supports a vertical list of items within a scrolling area. The visible portion of the list is referred to as the \"view port\". The list is virtualized, which means that items are rendered only when they are within the view port (or just above or below the view port).\n\nUnlike other list views (such as the ListView provided in React Native), this component supports lists of heterogeneous items with different heights and completely different types.\n\nEach item in the list is described by a VirtualListViewItemInfo object. The list of items is specified by an ordered list passed in the itemList prop. When an item comes into view, it is rendered through the use of the renderItem callback. Additional fields can be added to the VirtualListViewItemInfo by the caller as it sees fit. For example, it is sometimes useful to include additional identifying information such as an item type or an item-specific render method.\n\nA height must be specified for each item. By default, this height is assumed to be accurate and constant. If you do not know the height of the object or it may change, the height can be measured at runtime. This option is expensive, so it should be avoided if possible.\n\nIt optionally supports animation of items when they are added, removed or moved within the list.\n\nWhen items are added before or after the visible region, it attempts to maintain the current position of the visible items, adjusting the scroll position and list height as necessary.\n\nTo install: ```npm install reactxp-virtuallistview```\n\n## Performance Techniques\n\nThe VirtualListView employs a number of tricks to improve performance.\n\nIt uses a technique called \"cell recycling\" to minimize the number of mounts and unmounts. A cell is a container for a list item. When a cell is no longer visible, it can be temporarily hidden and then reused for the next item that becomes visible. This optimization is most effective when the recycled cell and its contents are used for an item that is similar in content. For this reason, callers need to specify a \"template\" field to identify similar items. In some cases, disabling cell recycling can be benificial as recycled cells continue their regular react lifecycle even when not visible, which can lead to excessive background re-rendering in some cases. When combining VLV with react libraries (like ReSub) that have subscriptions managed by components can cause this behaviour to manifest.  To disable cell recycling on specific cells, exclude the template field from the item descriptor.\n\nIt also supports \"overdraw\" to render items above and below the view port. This minimizes chances that the user will scroll to a new portion of the list before new items can be rendered in that area. Overdraw is employed only after the view port is initially filled. This reduces the performance impact of rendering.\n\nIt also limits the number of items it renders each time to avoid consuming too many cycles on the javascript thread.\n\nIt supports a special mode where items are re-rendered only if the corresponding VirtualListViewItemInfo changes. This mode requires that the renderItem method use only information within this object. To use this mode, set the skipRenderIfItemUnchanged prop to true.\n\n## Example\n``` javascript\nimport { VirtualListView, VirtualListViewItemInfo }\n    from 'reactxp-virtuallistview';\n\n// Extend VirtualListViewItemInfo to include display text\ninterface FruitListItemInfo extends VirtualListViewItemInfo {\n    text: string;\n}\n\ninterface FruitListState {\n    items: FruitListItemInfo[];\n}\n\nconst _headerItemHeight = 20;\nconst _fruitItemHeight = 32;\nconst _headerItemTemplate = 'header';\nconst _fruitItemTemplate = 'fruit';\n\nclass FruitListView extends RX.Component<null, FruitListState> {\n    constructor() {\n        super();\n\n        this.state = {\n            items: [{\n                key: 'header1',\n                height: _headerItemHeight,\n                text: 'Domstic Fruits',\n                template: _headerItemTemplate\n            }, {\n                key: 'bannana',\n                height: _fruitItemHeight,\n                text: 'Banana',\n                template: _fruitItemTemplate\n            }, {\n                key: 'apple',\n                height: _fruitItemHeight,\n                text: 'Apple',\n                template: _fruitItemTemplate\n            }]\n        };\n    }\n\n    render() {\n        return (\n            <VirtualListView\n                itemList={ this.state.items }\n                renderItem={ this._renderItem }\n                animateChanges={ true }\n                skipRenderIfItemUnchanged={ true }\n            />\n        );\n    }\n\n    private _renderItem(details: VirtualListViewCellRenderDetails<FruitListItemInfo>) {\n        const viewStyle = RX.Styles.createViewStyle({\n            height: details.item.height,\n            backgroundColor: item.template === _headerItemTemplate ?\n                '#ddd' : '#fff',\n            alignItems: 'center'\n        }, false);\n\n        return (\n            <RX.View style={ viewStyle }>\n                <RX.Text>\n                    { details.item.text }\n                </RX.Text>\n            </RX.View>\n        );\n    }\n}\n```\n\n\n## Interfaces\n``` javascript\ninterface VirtualListViewItemInfo {\n    // A string that uniquely identifies this item.\n    key: string;\n\n    // Specifies the known height of the item or a best guess if the\n    // height isn't known.\n    height: number;\n\n    // Specifies that the height is not known and needs to be measured\n    // dynamically. This has a big perf overhead because it requires a\n    // double layout (once offscreen to measure the item). It also\n    // disables cell recycling. Wherever possible, it should be avoided,\n    // especially for perf-critical views.\n    measureHeight?: boolean;\n\n    // Specify the same \"template\" string for items that are rendered\n    // with identical or similar view hierarchies. When a template is\n    // specified, the list view attempts to recycle cells whose templates\n    // match. When an item scrolls off the screen and others appear on\n    // screen, the contents of the cell are simply updated rather than\n    // torn down and rebuilt.\n    template: string;\n\n    // Is the item navigable by keyboard or through accessibility\n    // mechanisms?\n    isNavigable?: boolean;\n}\n```\n\n## Props\n``` javascript\n// Should the list animate additions, removals and moves within the list?\nanimateChanges?: boolean;\n\ninitialSelectedKey?: string;\n\n// Ordered list of descriptors for items to display in the list.\nitemList: VirtualListViewItemInfo[];\n\n// Use this if you want to vertically offset the focused item from the \n// top of the viewport when using keyboard nav\nkeyboardFocusScrollOffset?: number;\n\n// Logging callback to debug issues related to the VirtualListView.\nlogInfo?: (textToLog: string) => void;\n\n// Callback when an item in the VLV is selected\nonItemSelected?: (item: ItemInfo) => void;\n\n// Optional padding around the scrolling content within the list.\npadding?: number;\n\n// Callback for rendering item when it becomes visible within view port.\nrenderItem: (renderDetails: VirtualListCellRenderDetails<ItemInfo>) => \n    JSX.Element | JSX.Element[];\n\n// If true, allows each item to overflow its visible cell boundaries;\n// by default, item contents are clipped to cell boundaries.\nshowOverflow?: boolean;\n\n// By default, VirtualListView re-renders every item during the render.\n// Setting this flag to true allows the list view to re-render only\n// items from itemList whose descriptor has changed, thus avoiding\n// unnecessary rendering. It uses _.isEqual to perform this check. In\n// this mode, renderItem should not depend on any external state, only\n// on VirtualListViewItemInfo, to render item.\nskipRenderIfItemUnchanged?: boolean;\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// Pass-through properties for scroll view.\nkeyboardDismissMode?: 'none' | 'interactive' | 'on-drag';\nkeyboardShouldPersistTaps?: boolean;\ndisableScrolling?: boolean;\nscrollsToTop?: boolean; // iOS only, scroll to top when user taps on status bar\ndisableBouncing?: boolean; // iOS only, bounce override\nscrollIndicatorInsets?: { top: number, left: number,\n    bottom: number, right: number }; // iOS only\nonLayout?: (e: RX.Types.ViewOnLayoutEvent) => void;\nscrollEventThrottle?: number;\nonScroll?: (scrollTop: number, scrollLeft: number) => void;\nscrollXAnimatedValue?: RX.Types.AnimatedValue;\nscrollYAnimatedValue?: RX.Types.AnimatedValue;\n\n```\n\n## Methods\n``` javascript\n// Scrolls the view to the specified top value (specified in pixels).\nscrollToTop(animated = true, top = 0);\n\n// Sets selection & focus to specified key\nselectItemKey(key: string);\n```\n\n"
  },
  {
    "path": "docs/docs/extensions/webview.md",
    "content": "---\nid: extensions/webview\ntitle: WebView\nlayout: docs\ncategory: Extensions\npermalink: docs/extensions/webview.html\n---\n\nThis component displays HTML contents in an embedded browser control.\n\nTo limit the functionality of the browser control, specify one or more sandbox options. For detailed definitions of sandbox flags, refer to the [HTML documentation](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe).\n\n\n## Types\n``` javascript\nenum WebViewSandboxMode {\n    None = 0,\n    AllowForms = 1 << 0,\n    AllowModals = 1 << 1,\n    AllowOrientationLock = 1 << 2,\n    AllowPointerLock = 1 << 3,\n    AllowPopups = 1 << 4,\n    AllowPopupsToEscapeSandbox = 1 << 5,\n    AllowPresentation = 1 << 6,\n    AllowSameOrigin = 1 << 7,\n    AllowScripts = 1 << 8,\n    AllowTopNavigation = 1 << 9,\n\n    // Control https mixed content behavior, never by default\n    AllowMixedContentAlways = 1 << 10,\n    AllowMixedContentCompatibilityMode = 1 << 11\n}\n\ninterface WebViewNavigationState {\n    canGoBack: boolean;\n    canGoForward: boolean;\n    loading: boolean;\n    url: string;\n    title: string;\n    readonly navigationType:\n        | 'click'\n        | 'formsubmit'\n        | 'backforward'\n        | 'reload'\n        | 'formresubmit'\n        | 'other';\n}\n\ninterface WebViewErrorState {\n    description: string;\n    domain: string;\n    code: string;\n}\n\ninterface WebViewSource {\n    html: string;\n    baseUrl?: string; // Native only\n}\n```\n\n## Props\n``` javascript\n// Allow javascript code to call storage methods?\ndomStorageEnabled: boolean = true; // Native only\n\n// JavaScript code that is injected into the control and executed\ninjectedJavaScript: string = undefined; // Native only\n\n// Is JavaScript executed within the control?\njavaScriptEnabled: boolean = true;\n\n// Determines whether HTML5 audio and video requires the user to tap them before they start playing.\nmediaPlaybackRequiresUserAction: boolean = true; // Native only\n\n// Determines whether HTML5 videos play inline or use the native full-screen controller.\nallowsInlineMediaPlayback: boolean = false; // iOS only\n\n// HTTP headers to include when fetching the URL.\nheaders: { [headerName: string]: string } = undefined;\n\n// Called when an error occurs that prevents the contents from loading\nonError: (e: SyntheticEvent) => void = undefined; // Native only\n\n// Called when the contents successfully load\nonLoad: (e: SyntheticEvent) => void = undefined;\n\n// Called when the contents start to load\nonLoadStart: (e: SyntheticEvent) => void = undefined; // Native only\n\n// Called when a message is posted from within a WebView\nonMessage: (e: WebViewMessageEvent) => void = undefined;\n\n// Called when the navigation state changes\nonNavigationStateChange: (navigationState: WebViewNavigationState) => void; // Native only\n\n// Flags that restrict behaviors within the control\nsandbox: WebViewSandboxMode = None;\n\n// Zooms the page contents to fit the available space; deprecated on\n// iOS in RN 0.57\nscalesPageToFit: boolean = false; // Native only\n\n// HTML to display in webview (if url is not specified)\nsource: WebViewSource = undefined;\n\n// Start loading immediately or wait for reload?\nstartInLoadingState: boolean = true; // Native only\n\n// See below for supported styles\nstyle: WebViewStyleRuleSet | WebViewStyleRuleSet[] = [];\n\n// ID that can be used to identify the instantiated element for testing purposes.\ntestId: string = undefined;\n\n// URL to HTML content\nurl: string = undefined;\n```\n\n## Styles\nNo specialized styles\n\n## Methods\n``` javascript\n// Navigate back and forward\ngoBack();\ngoForward();\n\n// Posts a message to the web control, allowing for communication between\n// the app and the JavaScript code running within the web control. On native\n// platforms, the targetOrigin is ignored.\npostMessage(message: string, targetOrigin?: string = '*'): void;\n\n// Force the page to reload\nreload();\n```\n\n"
  },
  {
    "path": "docs/docs/extensions.md",
    "content": "---\nid: extensions\ntitle: Extensions\nlayout: docs\ncategory: Overview\npermalink: docs/extensions.html\nnext: components/activityindicator\n---\n\nThe ReactXP library is designed to be as lightweight as possible, including only those cross-platform APIs and \"primitive\" components that are required by almost every app. Functionality that is needed less commonly is provided in the form of optional extensions.\n\nThere are two distinct types of extensions.\n1. Higher-level components that contain no platform-specific code but build upon the lower-level primitives to provide new (typically more complex) functionality.\n2. Additional APIs or \"primitive\" components that have separate implementations for each of the supported platforms.\n\nExtensions are published as separate npm packages. They typically start with the prefix \"reactxp-\".\n\n\n## Higher-level ReactXP Components\n\nUsing a higher-level component is just like using any other component in React. Because these components are built on cross-platform ReactXP primitives, they also work in a cross-platform manner.\n\n\n## Primitive ReactXP Extensions\n\nTo use a primitive extension in your app, add it to your package.json like any other npm module. Then import it at the top of the code module where you want to consume it.\n\nHere is an example of how to use a hypothetical extension that provides video playback capabilities in a cross-platform manner.\n\n``` typescript\nimport RXVideoPlayer from 'reactxp-videoplayer';\n\nclass MyVideoPanel extends RX.Component<null, null> {\n    render() {\n        return (\n            <RXVideoPlayer\n                source={ this.props.source }\n                showControls={ true }\n                onProgress={ this._onVideoProgress }\n                onEnded={ this._onVideoEnded }\n            />\n        );\n    }\n}\n```\n\n### Implementing a new \"Primitive\"\n\nA new \"primitive\" extension (either a component or an API namespace) must have a cross-platform interface and a platform-specific implementation of this interface for each of the platforms supported by ReactXP. In some cases, the implementation may be shared between platforms.\n\nAn implementation should be provided for each of the supported platforms. Web, iOS and Android are required. React Native for MacOS and Windows are still under development and are currently considered optional, but they may become required in the future. The main implementation file for each platform is named ```index.[platform].js```. For the web, the platform is omitted (that is, the file is named ```index.js```). These implementation files must live at the top level of the extension's published directory, but it is typical for them to simply import code from a ```dist``` directory.\n\nMany ReactXP apps are written in TypeScript, so it's highly recommended that all ReactXP extensions provide a type definition file that defines the cross-platform interface to the extension. The extension's ```package.json``` should refer to this type file. For example: ```\"types\": \"dist/MyExtension.d.ts\"```. If you are implementing the extension in TypeScript, the compiler can be used to ensure that the implementation for each platform matches the public interface.\n\n\n## Sample Extensions\n\nRefer to the \"Extensions\" section of the documentation for a full list of available ReactXP extensions. Some of these are in separate git repositories, and others are in the [extensions](https://github.com/Microsoft/reactxp/tree/master/extensions) directory of the reactxp repository. The [reactxp-video](https://github.com/Microsoft/reactxp/tree/master/extensions/video) extension is a good example of a complete extension that involves native code for each of the supported platforms. To build any of these sample extensions:\n\n1. Clone the repository.\n2. Switch to the top-level directory of the extension (e.g. ```reactxp/extensions/video```).\n3. Install the dependent npm packages: ```npm install```.\n4. Build the code: ```npm run build```.\n\nThe resulting code will be found in the ```dist``` directory.\n\n"
  },
  {
    "path": "docs/docs/faq.md",
    "content": "---\nid: faq\ntitle: Frequently Asked Questions\nlayout: docs\ncategory: Overview\npermalink: docs/faq.html\nnext: react_concepts\n---\n\n### What platforms does ReactXP support?\n\nReactXP currently supports the following platforms:\n* iOS (React Native)\n* Android (React Native)\n* Web (React)\n* Windows 10 -- UWP (React Native) - in progress\n\nOther platforms such as Windows 7 & 8, MacOS, and Linux can be targeted using a web wrapper solution like [Electron](https://electron.atom.io/).\n\n\n### What browsers does ReactXP support?\n\nWe've tested ReactXP with recent versions of the following browsers:\n* Chrome (Windows and Mac)\n* Internet Explorer (9 and newer)\n* Edge\n* Firefox\n\nOther HTML5 browsers should theoretically work as well.\n\n\n### Can I use ReactXP without TypeScript?\n\nYes, you can write your application's code in JavaScript or any language that compiles to JavaScript (TypeScript, Flow, etc.). ReactXP is implemented in TypeScript, and the distribution includes TypeScript type definitions for the ReactXP interface.\n\n\n### How does ReactXP relate to React Native?\n\nReactXP builds upon React Native. ReactXP's components and APIs are inspired by React Native --- and in most cases are the same as React Native. ReactXP generally exposes APIs, props, style attributes, and animation interfaces that are common to the React Native implementations on iOS and Android (as well as the nascent implementation on Windows). It also implements these same APIs, props, style attributes, and animation interfaces on the web.\n\nReactXP is neither a proper subset nor a proper superset of React Native. It doesn't expose every component provided by React Native. In particular, it doesn't expose any components that are platform-specific (such as PickerIOS or MapView). It also exposes some components and APIs that are not implemented in React Native, such as [GestureView](components/gestureview.html) and [UserPresence](apis/userpresence.html).\n\nApps that use ReactXP can directly access React Native components and APIs. They can also directly access React DOM elements on the web. But such code will need to include build-time or run-time conditionals to avoid using these components or APIs on platforms where they don't apply.\n\nAll components and APIs exposed through ReactXP are implemented for all supported platforms. In some cases, API calls are no-ops, but they are guaranteed to be implemented. For example, Input.backButtonEvent is a no-op on iOS and the web, and StatusBar APIs are no-ops on the web. Apps that use only ReactXP abstractions can generally avoid per-platform conditional checks.\n\n\n### How does ReactXP differ from React Native for Web?\n\n[React Native for Web](https://github.com/necolas/react-native-web) is an open-sourced library developed by engineers at Twitter. We started implementing ReactXP before React Native for Web was available.\n\nThe goals behind these two efforts are similar, but the approaches differ. ReactXP is a layer that sits on top of React Native and React, whereas React Native for Web is a parallel implementation of React Native --- a sibling to React Native for iOS and Android.\n\nReactXP generally exposes only those props, style attributes, and APIs that are available across all platforms. If you write to ReactXP's abstraction, you can have high confidence that it will run on all supported platforms in the same manner. The same can be achieved with React Native for Web/iOS/Android, but you need to be more careful about which components, props, and APIs you use.\n\nOne of our goals in writing ReactXP was to enable developers to write and debug code in whatever platform environment they felt most comfortable while having confidence that the resulting code would run the same on other platforms.\n\n\n### How does ReactXP differ from Xamarin?\n\n[Xamarin](https://www.xamarin.com/) is a cross-platform solution that allows developers to create apps on iOS, Android and Windows Phone using a single code base. Xamarin apps are written in C# and XAML, allowing .NET developers to leverage their skills and experience. Xamarin apps can be more efficient than React Native apps, which are limited by JavaScript performance and the overhead of the React Native bridge. Xamarin was acquired by Microsoft in early 2016 and is supported by a dedicated team of engineers. It offers a comprehensive development solution including tools for coding, debugging, performance analysis, builds, automated testing, and distribution.\n\nReactXP, unlike Xamarin, provides a way to create mobile apps _and_ web apps using the same source base. ReactXP (like React and React Native) allow experienced web developers to make use of their existing skills and knowledge. ReactXP was developed by the Skype team at Microsoft in support of their development needs. ReactXP builds upon the work of Facebook and the broader React open source community.\n\nBoth Xamarin and ReactXP are great solutions, but they solve somewhat different problems.\n\n"
  },
  {
    "path": "docs/docs/getting-started.md",
    "content": "---\nid: getting-started\ntitle: Getting Started\nlayout: docs\ncategory: Overview\npermalink: docs/getting-started.html\nnext: using-reactxp\nredirect_from:\n  - \"docs/index.html\"\n---\n\n## Building Your First ReactXP App\n\nTo create your first ReactXP app, do the following:\n1. Clone the ReactXP repo locally: ```git clone https://github.com/microsoft/reactxp```.\n2. Open the ```samples``` directory and pick one of the samples and copy its directory to a new location. [Hello-World](https://github.com/Microsoft/reactxp/tree/master/samples/hello-world) provides a bare-bones starting app. [Hello-World-js](https://github.com/Microsoft/reactxp/tree/master/samples/hello-world-js) is a variant of Hello-World written in Javascript rather than TypeScript. [TodoList](https://github.com/Microsoft/reactxp/tree/master/samples/TodoList) is a more complex example and is a more appropriate starting point for production applications.\n3. Follow the build instructions for the sample you've chosen.\n4. If desired, rename the directory and project files to reflect the name of your app.\n\nIf you want to create a new ReactXP app, use the command-line tool [create-rx-app](https://github.com/a-tarasyuk/create-rx-app).\n\n## Web Technologies\n\nReact apps are written using web programming techniques. This documentation assumes that you are already familiar with web programming concepts including the use of JavaScript, the browser DOM, browser event handling, and CSS styling. There are many online tutorials that cover these concepts.\n\nWhile it is possible to write ReactXP apps in JavaScript, we recommend using TypeScript or Flow instead. These languages add type safety, compile-time error detection, and IntelliSense capabilities to JavaScript. If you are already familiar with JavaScript, it is easy to learn TypeScript. Here is a recommended [TypeScript tutorial](http://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html).\n\n## Understanding React\n\nIf you are new to React, you should first familiarize yourself with the core concepts. We provide an overview and some [simple examples](react_concepts.html). Also refer to the official [React](https://reactjs.org/) and [React Native](https://facebook.github.io/react-native/) documentation sites.\n\n"
  },
  {
    "path": "docs/docs/react_concepts.md",
    "content": "---\nid: react_concepts\ntitle: React Concepts\nlayout: docs\ncategory: Overview\npermalink: docs/react_concepts.html\nnext: react_lifecycle\n---\n\n## Components\n\nUI elements in React are called *components*. A component defines the appearance (layout, style, motion) and the behavior of the UI element. Once a component is defined, it can be incorporated within other components to build a complete user interface.\n\n## Rendering\n\nReact components derive from the templated base class React.Component<P, S>. P and S refer to *props* and *state*, two concepts that we will explore below. The most important method in a React component is the *render* method. The example below shows a minimal React component that simply renders some text.\n\n    class HelloWorld extends React.Component<void, void> {\n        render() {\n            return <div>Hello World</div>;\n        }\n    }\n\nThis example uses the JSX angle bracket syntax. TypeScript 1.6 contains native support for this notation. Simply name your source file with a \"tsx\" file extension rather than \"ts\".\n\nNote that this component is emitting a \"div\" tag, which is valid only in browser environments. To make this into a ReactXP component, simply replace the \"div\" with a \"RX.Text\" tag.\n\n    class HelloWorld extends RX.Component<void, void> {\n        render() {\n            return <RX.Text>Hello World</RX.Text>;\n        }\n    }\n\nAlso note that `RX.Component` replaces `React.Component` in the above example. [ReactXP *re-exports* `React.Component`](https://github.com/Microsoft/reactxp/blob/master/src/web/ReactXP.ts#L131) as `RX.Component` so your imports remain tidy, you don't need to import `React` specifically.\n\n## Props\nIt's convenient for parent components to customize child components by specifying parameters. React allows components to define a set of properties (or \"props\" for short). Some props are required, others are optional. Props can be simple values, objects, or even functions.\n\nWe will modify the Hello World example to introduce an optional \"userName\" prop. If specified, the component will render a hello message to the user. Methods within the component class can access the props using \"this.props\".\n\n    interface HelloWorldProps {\n        userName?: string; // Question mark indicates prop is optional\n    }\n\n    class HelloWorld extends RX.Component<HelloWorldProps, void> {\n        render() {\n            return (\n                <RX.Text>\n                    { 'Hello ' + (this.props.userName || 'World') }\n                </RX.Text>\n            );\n        }\n    }\n\n## Styles\nThe example above renders a string using default styles (font, size, color, etc.). You can override style defaults by specifying a \"style\" prop. In this example, we render bold text on a green background. Note that styles within React (and ReactXP) borrow heavily from CSS.\n\n    // By convention, styles are created statically and referenced\n    // through a private (not exported) _styles object.\n    const _styles = {\n        container: RX.Styles.createViewStyle({\n            backgroundColor: 'green'\n        }),\n        text: RX.Styles.createTextStyle({\n            color: 'red',\n            fontSize: 36, // Size in pixels\n            fontWeight: 'bold'\n        })\n    };\n\n    class HelloWorld extends RX.Component<void, void> {\n        render() {\n            return (\n                <RX.View style={ _styles.container }>\n                    <RX.Text style={ _styles.text }>\n                        Hello World\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n    }\n\nFor more details about style attributes, refer to the [styles](/reactxp/docs/styles.html) documentation or the documentation for each component.\n\n## Layout Directives\n\nReact uses flexbox directives for component layout. These directives are specified along with styling information. A number of flexbox tutorials are available online. [Here](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) is one we especially recommend. Using flexbox directives, you can specify the primary layout direction (row or column), justification, alignment, and spacing.\n\nReact also adopts the notion of margin and padding from CSS. Margin is the amount of space around a component, and padding is the amount of space between the boundary of the component and its children.\n\nHere is an example style that incorporates margin, padding and flexbox directives.\n\n    const _styles = {\n        container: RX.Styles.createViewStyle({\n            flexDirection: 'column',\n            flexGrow: 1,\n            flexShrink: 1,\n            alignSelf: 'stretch',\n            justifyContent: 'center',\n            margin: 4,\n            padding: 4,\n            backgroundColor: 'green'\n        })\n    };\n\nFor more details about layout directives, refer to the [styles](/reactxp/docs/styles.html) documentation.\n\n## Event Handling\n\nEvents, such as user gestures, key presses or mouse actions, are reported by way of event-handler callbacks that are specified as props. In this example, the component registers an onPress callback for a button.\n\n    class CancelButton extends RX.Component<void, void> {\n        render() {\n            return (\n                <RX.Button onPress={ this._onPress }>\n                    Cancel\n                </RX.Button>\n            );\n        }\n\n        private _onPress = (e: RX.SyntheticEvent) => {\n            e.stopPropagation();\n\n            // Cancelation logic goes here.\n        }\n    }\n\nThis example makes use of a TypeScript lambda function to bind the _onPress variable to the method instance at class creation time. It also demonstrates a few conventions (use of the variable name \"e\" to represent the event object and a method name beginning with an underscore to indicate that it's private). It also demonstrates a best practice (calling the stopPropagation method to indicate that the event was handled).\n\n## State\n\nAs we saw in the examples above, a component's appearance and behavior can change based on externally-provided props. It can also change based on its own internally-managed state. As a simple example, the visual style may change when a user mouses over the component.\n\nReact components can define a *state* object. When this object is updated through the use of the *setState* method, the component's render method is automatically called. In the example below, we implement a simple stop light with two states. Depending on the current state, the light is drawn in red or green. A press or click toggles the state.\n\n    interface StopLightState {\n        // Fields within a state object are usually defined as optional\n        // (hence the question mark below) because calls to setState\n        // typically update only a subset of the fields.\n        isStopped?: boolean;\n    }\n\n    const _styles = {\n        redButton: RX.Styles.createViewStyle({\n            width: 30,\n            height: 30,\n            borderRadius: 15,\n            backgroundColor: 'red'\n        }),\n        greenButton: RX.Styles.createViewStyle({\n            width: 30,\n            height: 30,\n            borderRadius: 15,\n            backgroundColor: 'green'\n        })\n    };\n\n    class StopLight extends RX.Component<void, StopLightState> {\n        getInitialState(): StopLightState {\n            return { isStopped: true };\n        }\n\n        render() {\n            // Choose the appropriate style for the current state.\n            var buttonStyle = this.state.isStopped ?\n                _styles.redButton : _styles.greenButton;\n\n            return (\n                <RX.Button style={ buttonStyle }\n                    onPress={ this._onToggleState } />\n            );\n        }\n\n        private _onToggleState = (e: RX.MouseEvent) => {\n            e.stopPropagation();\n\n            // Flip the value of \"isStopped\" and re-render.\n            this.setState({ isStopped: !this.state.isStopped });\n        }\n    }\n\nComponent state can also be stored as instance variables defined by the class. However, if a piece of data is used by the render method, it is better to add it to the state object and update it through the use of a setState call. That way, the rendered component will always reflect the current state.\n\n"
  },
  {
    "path": "docs/docs/react_lifecycle.md",
    "content": "---\nid: react_lifecycle\ntitle: Component Lifecycle\nlayout: docs\ncategory: Overview\npermalink: docs/react_lifecycle.html\nnext: react_stores\n---\n## Virtual DOM\n\nAs we learned from previous examples, a component's *render* method returns a tree of component specs. The React framework converts these specs into actual DOM elements (in the case of React JS) or native controls (in the case of React Native).\n\nWe also saw in previous examples that the render method is called every time the props change or the internal state is modified through the setState method. It would be very inefficient if every one of these changes resulted in the deallocation and re-allocation of a DOM element or native control. React avoids this overhead by allocating the DOM element or control the first time it appears in the component spec tree and deallocating it only when it no longer appears in the spec tree. Any other changes result in lightweight updates.\n\nHow does React know whether a component instance already exists -- or whether it requires updating? It makes use of a *virtual DOM*, a cached instance of the component spec tree. Using simple differencing logic, it efficiently determines whether nodes within this tree need to be added, removed, or updated (when props change).\n\n## Keys\n\nLists of components present an interesting challenge for React's tree diffing approach. How can the diffing algorithm efficiently detect the case where a component is moved to a new location in the list? This is done through the use of *keys*. A key is a string that uniquely identifies a component instance from other components in a list. A key must be specified by the render method any time a list child components of the same type are returned.\n\nIn this example, a UserInfoCard component is rendered for each user in a list. Each UserInfoCard instance is given a key based on a unique ID corresponding to each user.\n\n    render() {\n        var users = _.map(this.state.userList, user => {\n            return (\n                <UserInfoCard\n                    key={ user.id }\n                    user={ user }\n                >\n            );\n        });\n\n        return (\n            <RX.View>\n                { users }\n            </RX.View>\n        );\n    }\n\n## Mounting & Unmounting\n\nWhen React encounters a component spec that has no corresponding node in the current virtual DOM, it inserts the spec into the virtual DOM. It also allocates a corresponding DOM element (in the case of React JS) or native control (in the case of React Native). This is referred to as *mounting* a component. Likewise, when a component instance is removed from the real DOM or native control hierarchy, it is said to be *unmounted*. Certain methods, such as *setState*, can be called only while a component is mounted.\n\nThe React.Component base class, from which all components derive, defines several methods that are called immediately before and after a component is mounted and before a component is unmounted. Component classes can override these methods if desired. For example, if you want to set the focus to a text input box, this can be done within the componentDidMount method.\n\n    protected componentWillMount();\n    protected componentDidMount();\n    protected componentWillUnmount();\n\n## Updating\n\nA previously-mounted component can be updated in one of two ways -- through modification of its props or its state. By default, React performs a deep comparison of props and state to determine whether they have changed. Components may override this behavior to provide optimized comparison logic based on more detailed knowledge about the component.\n\n    protected shouldComponentUpdate(nextProps: P, nextState: S);\n\nOnce it is determined that a component should be updated, it is informed before and after the update.\n\n    protected componentWillReceiveProps(props: P);\n    protected componentWillUpdate(nextProps: P, nextState: S);\n    protected componentDidUpdate(prevProps: P, prevState: S);\n"
  },
  {
    "path": "docs/docs/react_stores.md",
    "content": "---\nid: react_stores\ntitle: Stores & Services\nlayout: docs\ncategory: Overview\npermalink: docs/react_stores.html\nnext: styles\n---\n\n## Stores\n\nReact is concerned only with the view layer of your app. It doesn't dictate the data model layer. However, it is common within React apps to refer to the data sources as _stores_. There are many ways that stores can be used, but most of them employ some form of subscription model whereby components register with a store, indicating that they are interested in all or part of the store's data. When the data within a store changes, it notifies all components that have expressed an interest in the change. Components can then update their internal state accordingly, triggering a re-render if appropriate.\n\n## Flux\n\nOne popular model for stores and store updates is called _Flux_. It was designed by Facebook engineers for use with React. There are several good tutorials about Flux online. [Here](https://drewdevault.com/2015/07/20/A-practical-understanding-of-Flux.html) is one that we recommend. It is worth noting that Flux is a programming pattern -- a set of principles, not a framework or collection of APIs. You may choose to adopt all or some of the Flux principles.\n\n## ReSub\n\nThe Skype team initially adopted the Flux principles, but we found it to be cumbersome. It requires the introduction of a bunch of new classes (dispatchers, action creators, and dispatch events), and program flow becomes difficult to follow and debug. Over time, we abandoned Flux and created a simpler model for stores. It leverages a new language feature in TypeScript (annotations) to automatically create subscriptions between components and stores. This eliminates most of the code involved in subscribing and unsubscribing. This pattern, which we refer to as [ReSub](https://github.com/Microsoft/ReSub), is independent of ReactXP, but they work well together.\n\n"
  },
  {
    "path": "docs/docs/styles.md",
    "content": "---\nid: styles\ntitle: Styles\nlayout: docs\ncategory: Overview\npermalink: docs/styles.html\nnext: animations\n---\n\nEach component type supports a predefined set of style attributes. ReactXP defines strongly-typed style objects for each base component. This allows for compile-time checking and IntelliSense. Styles must be allocated using the provided RX.Styles methods. These methods also perform validation of values and simple platform-specific or browser-specific transforms. Here are a few examples:\n\n``` javascript\nconst myViewStyle = RX.Styles.createViewStyle({\n    backgroundColor: 'green'\n});\n\nconst myTextStyle = RX.Styles.createTextStyle({\n    fontSize: 36,\n    fontWeight: 'bold'\n});\n```\n\nMany base components share common subsets of style attributes. For example, almost every base component supports the flexbox attributes. See below for some of these common attribute sets.\n\n## Combining Styles\n\nAll of the base components support a *style* prop that can accept a single style or an array of styles (or a nested array). If an array of styles is provided, the styles are combined in a depth-first manner left to right. Falsy values (false, null, undefined) can also be specified in a style array. This allows for the following common pattern.\n\n``` javascript\n    let buttonTextStyles = [_styles.baseText, this.state.hovering && _styles.hoverText];\n```\n\nHere is another variant that does the same thing -- a little more verbose but arguably easier to read.\n\n``` javascript\nlet buttonTextStyles = [_styles.baseText];\nif (this.state.hovering) {\n    buttonTextStyles.push(_styles.hoverText);\n}\n```\n\nIf \"margin\" and \"padding\" attributes are combined with edge-specific attributes (e.g. \"marginLeft\" or \"paddingBottom\"), the specific attributes always override the general. This matches the [combining behavior of React Native](https://github.com/necolas/react-native-web/blob/0.10.0/docs/guides/style.md#how-styles-are-resolved) (but differs from CSS).\n\n``` javascript\n// this.props.style might be undefined, a single style, or a (potentially-nested)\n// array of styles.\n<RX.View style={ [_styles.defaultStyle, this.props.style] } />\n```\n\n\n## Style Caching\n\nBy default, styles allocated by ReactXP are cached. This allows callers to refer to the style by a handle rather than rebuilding a full style structure each time it is used. For styles that depend on dynamic parameters or are allocated in non-static code paths, it is important to disable caching. Failing to do so will result in memory leaks. To disable caching, specify false as a second parameter to the creation method.\n\n``` javascript\nlet dynamicViewStyle = RX.Styles.createViewStyle({\n    backgroundColor: userColor\n}, false);\n```\n\n## Style Documentation Conventions\n\nFor each style attribute, the type and default value is specified. For enumerated values, the first item in the enumeration is the default value.\n\nColor values are specified as strings. They can be specified as color names (e.g. 'red'), three-digit or six-digit hex values (e.g. '#444' or '#ff00ee'), or rgb or rgba values (e.g. 'rgb(255, 0, 67)' or 'rgba(255, 0, 67, 0.5)').\n\n## Flexbox Style Attributes\nReactXP adopts the simplified flexbox rules and defaults defined by React Native. It differs somewhat from the flexbox standard in CSS in the following ways.\n\n+ All components follow flex rules by default (with the notable exception of Text). Unlike CSS, there is no need to specify \"display: flex\".\n\n+ Widths, heights, and other measurements are assumed to be pixel values. Other units (including percentages) are not supported.\n\n+ While it is possible to specify flexGrow, flexShrink and flexBasis values independently, it is more common to specify the flex parameters using a shortcut called \"flex\". It accepts an integer value and covers the following common cases.\n    * \"flex: 0\" implies \"flex: 0 0 auto\"\n    * \"flex: n\" (where n is negative) implies \"flex: 0 n auto\"\n    * \"flex: p\" (where p is positive) implies \"flex: p 1 auto\"\n\n+ The default flexDirection is 'column' rather than 'row'.\n\n+ The default position for all elements is 'relative' rather than 'auto'.\n\n+ The default justifyContent for buttons is 'center' rather than 'flex-start'.\n\n**Container layout**\n```javascript\nflex: number = 0;\nalignSelf: 'auto' | 'flex-start' | 'flex-end' | 'center' | 'stretch';\n```\n\n**Child layout**\n```javascript\nalignContent: 'auto' | 'flex-start' | 'flex-end' | 'center' | 'stretch';\nalignItems: 'stretch' | 'flex-start' | 'flex-end' | 'center';\nflexWrap: 'wrap' | 'nowrap';\nflexDirection: 'column' | 'row' | 'column-reverse' | 'row-reverse';\njustifyContent: 'flex-start' | 'flex-end' | 'center' | 'space-between' |\n    'space-around';\n```\n\n**Size Overrides**\n```javascript\nheight: number = undefined; // Can be animated\nwidth: number = undefined; // Can be animated\nmaxHeight: number = undefined;\nmaxWidth: number = undefined;\nminHeight: number = undefined;\nminWidth: number = undefined;\n```\n\n**Position Overrides**\n```javascript\nposition: 'absolute' | 'relative';\ntop: number = undefined; // Can be animated\nright: number = undefined; // Can be animated\nbottom: number = undefined; // Can be animated\nleft: number = undefined; // Can be animated\n```\n\n**Margins**\n```javascript\nmargin: number; // Sets all four margin attributes\nmarginHorizontal: number; // Sets left and right\nmarginVertical: number; // Sets top and bottom\nmarginTop: number = 0;\nmarginRight: number = 0;\nmarginBottom: number = 0;\nmarginLeft: number = 0;\n```\n\n**Padding**\n```javascript\npadding: number; // Sets all four padding attributes\npaddingHorizontal: number; // Sets left and right\npaddingVertical: number; // Sets top and bottom\npaddingTop: number = 0;\npaddingRight: number = 0;\npaddingBottom: number = 0;\npaddingLeft: number = 0;\n```\n\n## View Style Attributes\n\n**Color & Opacity**\n```javascript\nbackgroundColor: color = undefined; // Value is animatable\nopacity: number = 1.0; // Value is animatable\nacrylicOpacityUWP: number = 1.0; // UWP only\nacrylicSourceUWP: 'host' | 'app'; // UWP only\nacrylicTintColorUWP: string = undefined; // UWP only; default = backgroundColor\n```\n\n**Overflow**\n```javascript\noverflow: 'hidden' | 'visible';\n```\n\n**Borders**\n```javascript\nborderWidth: number;\nborderTopWidth: number;\nborderRightWidth: number;\nborderBottomWidth: number;\nborderLeftWidth: number;\nborderColor: color;\nborderStyle: 'solid' | 'dotted' | 'dashed' | 'none';\nborderRadius: number;  // Sets all four border radius attributes; value is animatable\nborderTopRightRadius: number = 0;\nborderBottomRightRadius: number = 0;\nborderBottomLeftRadius: number = 0;\nborderTopLeftRadius: number = 0;\n```\n\n**Shadows**\n```javascript\n// NOTE: If applied to a Text element, these properties translate to text shadows,\n// not a box shadow.\nshadowOffset: { height: number; width: number } = { 0, 0 };\nshadowRadius: number = 0;\nshadowColor: color = 'black';\nelevation: number; // Android only\n```\n\n**Miscellaneous**\n```javascript\nwordBreak: 'break-all' | 'break-word'; // Web only\nappRegion: 'drag' | 'no-drag'; // Web only\ncursor: 'pointer' | 'default'; // Web only\n```\n\n## Transform Style Attributes\n\n**Transforms**\n```javascript\ntransform: {\n    // All transform values are animatable\n    perspective: string = undefined;\n    rotate: string = undefined;\n    rotateX: string = undefined;\n    rotateY: string = undefined;\n    rotateZ: string = undefined;\n    scale: number = 0;\n    scaleX: number = 0;\n    scaleY: number = 0;\n    translateX: number = 0;\n    translateY: number = 0;\n}\n```\n\n## Text Style Attributes\n\n**Font Information**\n```javascript\n// Attributes in this group cascade to child RX.Text components\nfontFamily: string = undefined;\nfontStyle: 'normal' | 'italic';\nfontWeight: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' |\n    '600' | '700' | '800' | '900';\nfontSize: number = undefined;\n\n// Shortcut that sets all three font attributes\nfont: {\n    fontFamily: string = undefined;\n    fontStyle: 'normal' | 'italic';\n    fontWeight: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' |\n        '600' | '700' | '800' | '900';\n}\n```\n\n**Text Color**\n```javascript\n// Attributes in this group cascade to child RX.Text components\ncolor: color = 'black'; // Value is animatable\n```\n\n**Spacing Overrides**\n```javascript\n// Attributes in this group cascade to child RX.Text components\nletterSpacing: number = 1;\nlineHeight: number = 1;\n```\n\n**Alignment**\n```javascript\ntextAlign: 'auto' | 'left' | 'right' | 'center' | 'justify';\ntextAlignVertical: 'auto' | 'top' | 'bottom' | 'center'; // Android specific\n```\n\n**Text Decoration**\n```javascript\ntextDecorationLine: 'none' | 'underline' | 'line-through' |\n    'underline line-through';\ntextDecorationStyle: 'solid' | 'double' | 'dotted' | 'dashed';\ntextDecorationColor: string = 'black';\n```\n\n**Writing Direction**\n```javascript\nwritingDirection?: 'auto' | 'ltr' | 'rtl';\n```\n\n**Miscellaneous**\n```javascript\nincludeFontPadding: boolean = true; // Android specific\n```\n"
  },
  {
    "path": "docs/docs/using-reactxp.md",
    "content": "---\nid: using-reactxp\ntitle: Using ReactXP\nlayout: docs\ncategory: Overview\npermalink: docs/using-reactxp.html\nnext: faq\n---\n\n## Tips for Web\n\nReactXP assumes that your main web page will have a DOM element container called \"app-container\". The root view of the app will be rendered within this container. Typically, this DOM element will be a &lt;div&gt; that covers the entire page.\n\n## Tips for Native\n\nThe main module is assumed to be called \"RXApp\", and it must be registered as such by the native code. Refer to the sample app for how to register the module in Android and iOS.\n\n## TypeScript Support\n\nReactXP is written in TypeScript and includes TypeScript type definition (\".d.ts\") files for the library.\n\n## TSLint Support\n\nReactXP includes several [tslint](https://www.npmjs.com/package/tslint) custom rules that can be used in your project.\n\nTo use these rules, modify your tslint.json file to point to the rules within the reactxp dist directory, as follows.\n\n```\n    \"rulesDirectory\": [\n        \"./node_modules/reactxp/dist/tslint\"\n    ]\n```\n\nThe following tslint rules are provided:\n\n### grouped-import\nThis rule enforces that all ambient (non-relative) module imports are grouped together and are above the group of relative imports.\n\n### incorrect-this-props\nThis rule checks for common errors in referencing ```this.props``` within methods that pass ```props``` as an input parameter.\n\n### no-unreferenced-styles\nThis rule detects and reports any unreferenced entries within a ```_styles``` array.\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\nlayout: hero\ntitle: A library for building cross-platform apps\nid: home\n---\n\n<section class=\"light home-section\">\n  <div class=\"marketing-row\">\n    <div class=\"marketing-col\">\n      <h3>Building on React</h3>\n      <p>ReactXP builds on the popular React JS and React Native frameworks.</p>\n    </div>\n    <div class=\"marketing-col\">\n      <h3>XP means X-Platform</h3>\n      <p>Share most of your code between the web, iOS, Android, and Windows.</p>\n    </div>\n    <div class=\"marketing-col\">\n      <h3>Apps Users Will Love</h3>\n      <p>Create great-looking, responsive web pages and mobile apps that feel native.</p>\n    </div>\n  </div>\n</section>\n<hr class=\"home-divider\" />\n<section class=\"home-section\">\n  <div id=\"overview\">\n    <div class=\"overview-section\">\n      <p>\n        The authors of React use the phrase “learn once, write anywhere”. With React and React \n        Native, your web app can share most its logic with your iOS and Android apps, but the view \n        layer needs to be implemented separately for each platform. We have taken this a step further \n        and developed a thin cross-platform layer we call ReactXP. If you write your app to this \n        abstraction, you can share your view definitions, styles and animations across multiple target \n        platforms. Of course, you can still provide platform-specific UI variants, but this can be done\n        selectively where desired.\n      </p>\n      <p>\n        ReactXP is designed with cross-platform development in mind. In general, it exposes\n        APIs, components, props, styles and animation parameters that are implemented in\n        a consistent way across React JS (HTML) and React Native for iOS and Android. A few\n        platform-specific props and style attributes have been exposed, but we have tried to\n        keep these to a minimum.\n      </p>\n      <p>\n        ReactXP is meant to be as lightweight as possible. The “core” components and APIs are\n        limited to the functionality required for almost all applications. Extensions to\n        ReactXP expose more specialized functionality in a similar cross-platform manner.\n      </p>\n    </div>\n  </div>\n</section>\n<hr class=\"home-divider\" />\n"
  },
  {
    "path": "docs/versions/version_history.md",
    "content": "---\nid: version_history\ntitle: Version History\nlayout: hero\nsectionid: versions\npermalink: versions/version_history.html\nredirect_from:\n  - \"versions/index.html\"\n---\n\n## ReactXP Versioning\n\n### Versioning Strategy\nA new version of ReactXP will be released periodically following the same general update timeline of React Native. Each new version will get its own branch, allowing consumers of the library to take a dependency on a stable code base.\n\nFollowing semver rules, the major version (the first number in the version string) will be incremented for breaking changes. The minor version (the second number) will be incremented for major new functionality that does not break existing contracts or behaviors.\n\n\n### Version History\n\n#### Version 2.0.0 of reactxp - _30 November 2019_\n* All releases and notes going forward will be tracked on the [Github ReactXP Releases page](https://github.com/microsoft/reactxp/releases)\n\n#### Version 2.0.0-rc.2 of reactxp-video - _9 October 2019_\n* Updated react-native-video to 4.X\n\n#### Version 2.0.0-rc.2 of reactxp-webview - _12 September 2019_\n* Upgraded react-native-webview dependency\n\n#### Version 2.0.0-rc.1 of reactxp - _27 July 2019_\n* Adopted new major version number to reflect breaking changes with netinfo and webview.\n* No other functionality since 1.7.0-rc.1 was published.\n\n#### Version 1.7.0-rc.1 of reactxp-video, reactxp-imagesvg, reactxp-navigation - _14 July 2019_\n* No new functionality, just version and dependency updates.\n\n#### Version 1.7.0-rc.1 of reactxp - _14 July 2019_\n* #1077: Added longPress support for web.\n* #1080: Addes upport for delayLongPress on web.\n* #1079: Fixed bug that caused onTouchMove not to trigger on mobile web.\n* #1082: Added support on web for onTouchStart, onTouchEnd, and onTouchCancel props for RX.View.\n* #1087: Added support on web for onHoverEnd.\n* #1059: Improved support for RN 0.59.\n* #1089: Added support on web for onTouchMoveCapture and onTouchStartCapture props of RX.View.\n* #1098: Fixed bug on web where reference to HTML element was not released properly, resulting in leak.\n* #1088: Added support on web for scrollEnabled prop in RX.ScrollView.\n* #1098: Fixed bug in handling of images on RN platforms.\n* #1118: Fixed bug on web related to pan gestures.\n* #1114: Fixed crash on Android relating to TextInput event processing.\n* #1102: Fixed bug on web where animated properties were not properly updated if they were interpolated.\n* #1117: Added support on web for blockPointerEvents prop on RX.View.\n* #1101: Extracted RX.WebView out of ReactXP core into an extension.\n* #1091: Fixed bug on web in onPressIn processing where event could get triggered twice.\n\n#### Version 2.0.0 of reactxp-virtuallistview - _6 Apr 2019_\n* #1073: Removed internal string-based refs with React.RefObject.\n\n#### Version 1.6.1 of reactxp - _23 Mar 2019_\n* #1062: Fixed TextInput defaultValue not working on native platforms\n* #1060: Fixed Ref<T> type.\n* #1058: Fixed ref assert on Windows.\n\n#### Version 1.6.1 of reactxp-video - _23 Mar 2019_\n* #1066: Fixed video extension to support react-native local assets.\n\n#### Version 1.6.1 of reactxp-navigation - _23 Mar 2019_\n* #1063: Fixed regression in reactxp-navigation.\n\n#### Version 1.6.0 of reactxp-imagesvg, reactxp-navigation, reactxp-video - _16 Mar 2019_\n* No new features; updated dependencies.\n\n#### Version 1.6.0 of reactxp - _16 Mar 2019_\n* No new features; updated dependencies.\n\n#### Version 1.6.0-rc.4 of reactxp - _15 Mar 2019_\n* #1055: Fixed crash due to incompatibilty with newly-released RN 59.\n\n#### Version 1.6.0-rc.3 of reactxp - _10 Mar 2019_\n* #891: Fixed bad interaction between RX.Clipboard.getText() and iOS Safari.\n\n#### Version 1.6.0-rc.2 of reactxp - _9 Mar 2019_\n* #1041: Fixed textDecorationStyle and textDecorationColor on web.\n* #1042: Fixed transform rotate styles on web so they take a unit (e.g. \"deg\") for consistency with RN.\n* #1040: Fixed auto-dismissing popups on the web.\n* #1026: Changed margin and padding style combination rules on web to match RN.\n\n#### Version 1.6.0-rc.1 of reactxp - _17 Feb 2019_\n* #961: Fixed crash when calling setScrollTop/Left on native version of ScrollView.\n* #972: If blurOnSubmit is specified on a TextInput, the code now respects that value.\n* #974: Fixed bug in native Button implementation where 'false' style would be passed when disableTouchOpacityAnimation was specified.\n* #980: Fixed bug in web implementation of onLongPress.\n* #976: Made multiline TextInput growth behavior on web match native.\n* #984: Added code to catch exception in web implementation of Storage.setItem method.\n* #996: Added stronger typings for ref callbacks.\n* #993: Added support for mediaPlaybackRequiresUserAction and allowsInlinedMediaPlayer props for WebView.\n* #957: Added context mode to the popup container handling type list.\n* #994: Removed msHyphens css property in web implementation of Text.\n* #1001: Fixed units for rotateZ translation type for web animations.\n* #1004: Fixed bug that resulted in crash when ReactXP ran in node (test) environment.\n* #1006: Made selectItemKey scrollTo behaviour configurable - scrolling isn't always desired.\n* #1016: View responder events props are now triggered properly.\n* #1024: Added more mouse cursor types for web version of GestureView.\n* Added support for interpolated animation values that have angle units (e.g. \"90deg\") on web.\n\n#### Version 2.0.0-rc.3 of reactxp-virtuallistview - _30 Jan 2019_\n* #1006: Make selectItemKey scrollTo behaviour configurable - scrolling isn't always desired\n* #1007: Perf Improvements\n\n#### Version 2.0.0-rc.2 of reactxp-virtuallistview - _15 Jan 2019_\n* #989: Auto-scroll VLV on mount when initialScrollKey prop is provided\n* #989: Fix keyboard scrolling bugs when non-keyboard-navigable items are interspersed with keyboard-navigable items\n\n#### Version 2.0.0-rc.1 of reactxp-virtuallistview - _11 Jan 2019_\n* #944: Rework VirtualListView for improved accessibility/performance (this contains breaking API changes - see documentation for new API)\n\n#### Version 1.5.0 of reactxp-imagesvg, reactxp-navigation, reactxp-video, reactxp-virtuallistview - _1 Dec 2018_\n* No new features; updated dependencies.\n\n#### Version 1.5.0 of reactxp - _1 Dec 2018_\n* #935: Maded ReactXP compatible with React.Fragment.\n* #933: Reset VoiceOver queue when app goes inactive or in background (iOS and Windows).\n* #939: Added keyboard event mapping for kePress handling in View (Windows and MacOS).\n* #941: Updated RX.Animated.InterpolatedValue to allow for chaining interpolations.\n* #942: Added key mappings for MacOS and wired onKeyPress for RX.View.\n* #943: Added focus and blur calls for RX.Button, RX.Link, RX.Text and RX.View.\n* #946: Fixed crashing bug in accessibility for iOS and MacOS.\n* #949: Added onFocus, onBlur and onKeyPress support for GestureView.\n* #948: Respect negative tabIndex in Button on MacOS.\n* #953: Wired up tabIndex prop for web implementation of RX.TextInput.\n\n#### Version 1.5.0-rc.4 of reactxp - _18 Nov 2018_\n* #909: Eliminated not-prebound callbacks in view resize detector on web (perf improvement).\n* #912: Fixed VoiceOver iOS 12 issue.\n* #913 and #923: Added key codes that are specific for MacOS.\n* #916: Added basic tabindex handling on views for MacOS.\n* #920: Removed deep comparison on every button prop change (perf improvement).\n* #917: Added onKeyDown support for MacOS ScrollView.\n* #922: Removed undocumented and broken (onRN) API: addToScrolLeft and addToScrollTop on RX.ScrollView.\n* #928: Fixed bug in _buildInternalProps of View relating to tabIndex.\n* #927: Fixed drag support on MacOS.\n* Added CONTRIBUTION guide.\n\n#### Version 1.5.0-rc.1 of reactxp-virtuallistview - _11 Nov 2018_\n* #899: Fix web accessibility\n* #902: Mac accessibility improvements (keyboard focus).\n\n#### Version 1.5.0-rc.3 of reactxp - _11 Nov 2018_\n* #898: Ensure taht onKeyDown/Focus/Blur events are sent from ScrollView.\n* #895: On Windows, make FocusManager track View instances with negative tabIndex.\n* #901: Optimization on native platforms: when there are no accessibilityTraits, don't create an additional unneeded array.\n* #902: Mac accessibility improvements (keyboard focus).\n\n#### Version 1.5.0-rc.2 of reactxp - _28 Oct 2018_\n* Fixed regression introduced recently in web version of ScrollView.\n\n#### Version 1.5.0-rc.1 of reactxp - _27 Oct 2018_\nNew functionality:\n* #848: Added support for RTL (right-to-left) change event on native platforms.\n* #843: Added new AlertOption preventDismissOnPress.\n* #847: Added support for Animated.Event, which allows animations to be associated with scroll events.\n* #868: Added support for placeholder text color on web platform.\nBug fixes:\n* #833: Eliminated rerender of app when mousing over popups.\n* #846: Disabled mouse gestures in main view when a modal dialog is overlaying the main view.\n* #854: Removed draggable=\"false\" in web implementation of View, since this is the default value.\n* #853: Emulate cache-control: max stale on iOS.\n* #869: Eliminate excess focus calls.\n* #877 and #875: Fixed crashes relating to popups due to race condition in unmounting.\n* #873: Fixed scroll view focus issue on MacOS.\n* Fixed several \"hanging promises\" that didn't properly deal with error conditions.\n\n#### Version 1.4.0 of reactxp - _30 Sep 2018_\n* Added the ability to programmatically retrieve the text selection for RX.Text (if selectable attribute is true). Includes test cases in RXPTest sample.\n* Added drag and drop capabilities to RX.View (including onDragStart, onDrag, onDragEnd props). Includes test cases in RXPTest sample.\n\n#### Version 1.4.0-rc.1 of reactxp-navigation - _21 Sep 2018_\n* Changed renderScene to accept a return value of null rather than undefined, making it consistent with other render functions.\n\n#### Version 1.4.0-rc.2 of reactxp - _15 Sep 2018_\n* Fixed bug #800: If there are only cached popups and no visible one the main remains inaccessible for screen readers.\n* Fixed bug #815: Show warning in console if disallowed style combinations appear.\n\n#### Version 1.4.0-rc.1 of reactxp - _9 Sep 2018_\n* Worked around change in recent versions of RN that removed support for Images with children.\n* Changed announceForAccessibility implementation to use Assertive live region type instead of Polite.\n* In web implementation of RX.Image, always show the img tag if XHR request option is used.\n* Fixed bug #744: On web implementation, styling behavior differed between developmenta nd production.\n* Added support for the new React.RefObject variant of ref prop.\n* Added support for multi-window apps to RX.Alert.\n* Added support for onLongPress to RX.GestureView.\n* Fixed bug #793: In web implementation, cursor type was overridden in some cases.\n* Added useWebKit prop for native RN.WebView in prep for NR 0.57 on iOS.\n* Fixed bug that caused testID not to be set properly for RX.View instances.\n\n#### Version 1.3.2 of reactxp-imagesvg - _25 Aug 2018_\n* Added support for SvgRect children within SvgImage.\n\n#### Version 1.3.1 of reactxp-imagesvg - _7 Aug 2018_\n* Fixed bug in native implementation that caused runtime warning every time SvgPath was used.\n\n#### Version 1.3.2 of reactxp - _2 Aug 2018_\n* Fixed bug #745: WebView.onMessage receives additional props which are not defined in Types.WebViewMessageEvent.\n* Fixed bug #746 relating to cursor overrides for buttons on the web implementation.\n* Fixed bug #749: Set size attribute of input HTML element to 1.\n* Fixed bug #753: isRightMouseButton implementation that works also on Mac.\n* Fixed bug #752: Accessibility fix for Clipboard.\n* Fixed bug #756: Prevent a crash during onLayout handling on web.\n* Fixed bug #761: Update usages of findDOMNode to indicate that it returns null.\n* Fixed bug #767: buttonStyles may be undefined; fixed inconsistency in onAccessibilityTapIOS definition for Button and View.\n* Fixed regression in Timers.ts. Some environments don't define \"global\" and use \"window\" instead for the built-in timer functions.\n* Use semver for reactxp dependencies.\n* Feature #764: Add support for Android WebView compatibility modes.\n\n#### Version 1.3.1 of reactxp-virtuallistview - _2 Aug 2018_\n* Added support for testId prop.\n\n#### Version 1.3.2 of reactxp - _7 Jul 2018_\n* Updated custom tslint rule groupedImportRule to treat imports starting with '@' as relative rather than ambient.\n* Made 'auto' a valid resizeMode for images in web implementation.\n* Added support for 'title' prop on RX.TextInput.\n\n#### Version 1.3.0 of reactxp-imagesvg, reactxp-navigation, reactxp-video, reactxp-virtuallistview - _28 Jun 2018_\n* No new features; updated dependencies.\n\n#### Version 1.3.0 of reactxp - _28 Jun 2018_\n* Added support for function keys in native desktop implmenetations.\n* Fixed recent regression that caused a crash when using the web implementation in a non-browser environment like node.\n* Reverted change in behavior on web implementation of ActivityState.Inactive. This state is no longer used on the web, as before 1.3.0-rc.4.\n\n#### Version 1.3.0-rc.6 of reactxp - _25 Jun 2018_\n* Added support for testId prop to all reactxp components. On native, it uses testID. On web, it adds a data-test-id attribute to the node.\n* Added three new tslint custom rules that are useful for reactxp projects.\n\n#### Version 1.3.0-rc.5 of reactxp - _24 Jun 2018_\n* Added missing definition for getMetadata method in RX.Image.\n* Implemented RX.International methods for web platform.\n\n#### Version 1.3.0-rc.4 of reactxp - _19 Jun 2018_\n* Enabled context menu on keyboard input in Windows UWP implementation.\n* On web implementation, augmented AppActivityState. Inactive state now indicates that main window is not in focus.\n* On web implementation, eliminated dependency on ifvisible library, shrinking the footprint of reactxp.\n\n#### Version 1.3.0-rc.3 of reactxp - _16 Jun 2018_\n* [Breaking Change] Removed hideDeleteButton prop in RX.TextInput in favor of clearButtonMode prop, which applies to iOS and Windows UWP.\n\n#### Version 1.3.0-rc.2 of reactxp - _14 Jun 2018_\n* [Breaking Change] Renamed several methods in RX.Animated.ValueListener that were meant to be private.\n* Improved screen reader support in Windows UWP implementation.\n* On iOS implementation, automatically set decelerationRate to \"fast\" if snapToInterval is set.\n* Added hideDeleteButton prop to RX.TextInput for Windows UWP.\n\n#### Version 1.3.0-rc.1 of reactxp - _13 Jun 2018_\n* Fixed accessibility issues with screen reader in Windows UWP implementation.\n* Removed shouldRasterizeIOS prop on RX.Image. It was never supported in RN, so it was just a no-op.\n* Fixed bug in RX.Network.getType() which returned the wrong response if the device was connected to ethernet on Android.\n\n#### Version 1.3.0-rc.0 of reactxp - _10 Jun 2018_\n* Fixed a few bugs in keyboard focus handling for Windows UWP.\n* Web implementation of RX.Image now uses credentials for image fetches if origin header is specified.\n* Added support for text shadows in RX.Text (shadowColor, shadowOffset, shadowRadius style attributes).\n* Fixed keyboard navigation logic for multi-root-view case.\n* Wired up tooltips in web implementation of RX.Button, RX.Image, RX.Link, and RX.View (title prop).\n* Extended RX.UserInterface.measureWindow to support multi-root-view case. It now takes an optional rootViewId parameter.\n* Added drag and drop handler support for Mac OS.\n* Added new static API RX.Image.getMetadata that returns dimensions of an image.\n* Avoided the use of the deprecated RN.NetInfo \"change\" event in favor of \"connectionChange\" so RN doesn't emit warning.\n* Added back parameter to onBlur event handler that was incorrectly removed in version 1.2.x.\n\n#### Version 1.2.1 of reactxp - _24 May 2018_\n* Wired up onPaste handler for Windows implementation.\n* Fixed bug that resulted in cached popups to appear when they shouldn't.\n* Fixed bug in web implementation of RX.ScrollView that resulted in incorrect screen reader announcements.\n\n#### Version 1.2.0 of reactxp-imagesvg, reactxp-navigation, reactxp-video, reactxp-virtuallistview - _22 May 2018_\n* Automatically suppressed system context menu for selectable RX.Text items on Windows if containing view has onContextMenu handler.\n\n#### Version 1.2.0 of reactxp - _22 May 2018_\n* Automatically suppressed system context menu for selectable RX.Text items on Windows if containing view has onContextMenu handler.\n\n#### Version 1.1.2-rc.3 of reactxp - _21 May 2018_\n* Fixed bug in RX.Linking.getInitialUrl, which was returning null rather than undefined for the url in some cases.\n* Added support for Dilaog trait to trigger yes-dont-hide importantForAccessibility behavior in Windows implementation.\n* Fixed UWP accessibility announce to make it act the same way as Android.\n* Create correct Animated.TextInput for Windows.\n\n#### Version 1.1.2-rc.2 of reactxp - _15 May 2018_\n* Improved keyboard focus support. Added focus, blur and requestFocus methods to several existing components. Added new focusArbitrator prop to RX.View, which allows callback to arbitrate between multiple children that are requesting autofocus.\n* Fixed bug that caused group view children to be invisible to UI automation.\n* Improved keyboard support for Windows implementation.\n\n#### Version 1.1.2-rc.1 of reactxp - _9 May 2018_\n* Fixed bug in Windows implementation that prevented RX.Input.keyDownEvent from being dispatched.\n* Fixed bugs in Windows implementation that reported wrong key codes for keyboard events.\n* Fixed focus management for cacheable popups in Windows implementation.\n* Fixed type definitions of GestureView, ScrollView and WebView. They were incorrectly extending ViewBase, which pulled in a number of unsupported props.\n* Fixed bug that caused cached popups to appear on screen when not appropriate.\n* Added onContextMenu prop to GestureView.\n* Added accessibility trait for ListItem.\n* In Windows implementation, use RNW.Hyperlink for rendering RX.Link.\n* Removed \"justifyEnd\" prop from RX.ScrollView. It was never implemented as documented.\n* Added useSafeInsets prop onR X.View to support rendering within safe area on iOS.\n* Fixed bug RX.StatusBar.setBarStyle where animated parameter was not properly passed to RN.\n* Added onContextMenu to RX.Link.\n\n#### Version 1.1.1 of reactxp - _13 Apr 2018_\n* Fixed reentrancy issue in popup support. Displaying a popup from within the onDismiss callback was recently broken.\n* Added disabledOpacity prop for RX.Button component.\n* Improved handling of RX.Clipboard.setText on web. It now properly handles carriage returns.\n* Fixed TextInput focusability after focus restriction on Windows.\n* Fixed accessibility issue related to voice over on web.\n\n#### Version 1.0.18 of reactxp-navigation - _10 Apr 2018_\n* Fixed bug in web implementation that caused a problem when popping multiple items from the navigation stack.\n\n#### Version 0.2.10 of reactxp-imagesvg, 1.0.17 of reactxp-navigation, 0.2.5 of reactxp-video, 0.1.9 of reactxp-virtuallistview - _4 Apr 2018_\n* Rebuilt using reactxp 1.1.0.\n\n#### Version 1.1.0 of reactxp - _4 Apr 2018_\n* Added workaround to enable the keyboard navigation mode when the screen reader is used.\n\n#### Version 1.1.0-rc.2 of reactxp - _28 Mar 2018_\n* Fixed bug in web implementation of animation where completion callback was called multiple times in some cases.\n\n#### Version 1.1.0-rc.1 of reactxp - _26 Mar 2018_\n* Added support for \"cacheable\" popups. This is useful for popups that involve many views and are costly to recreate from scratch.\n* Fixed keyboard handler in RX.Link, it was defferring to base class only when onPress was defined, and that was wrong.\n* Fixed bug in native implementation of TextInput where selection was sometimes lost.\n* Fixed TextInput reference for focus control on windows.\n* Implemented hidden scroll indicators in web/ScrollView.\n\n#### Version 1.0.2 of reactxp - _16 Mar 2018_\n* Fixed bug in web TextInput implementation that resulted in a console warning with the latest versions of ReactJS.\n* Fixed bug in native Button implementation that resulted in corrupted styles.\n* Fixed accessibility (screen reader) bug in web implementation.\n\n#### Version 1.0.1 of reactxp - _5 Mar 2018_\n* Moved event handlers from ViewProps to ViewPropsShared so AnimatedView has them too.\n* Fixed recent regression in handling of popups in native implementation.\n* Events passed to onPress and onLongPress now include touch or mouse coordinates.\n\n#### Version 0.2.9 of reactxp-imagesvg, 1.0.16 of reactxp-navigation, 0.2.4 of reactxp-video,  0.1.8 of reactxp-virtuallistview - _2 Mar 2018_\n* Rebuilt using reactxp 1.0.0 and latest typescript compiler version.\n\n#### Version 1.0.0 of reactxp - _2 Mar 2018_\n* Filled in fields for MouseEvent on web.\n* Fixed a few style leaks in web implementation.\n\n#### Version 1.0.0-rc.1 of reactxp - _28 Feb 2018_\n* Improved accessibility handling for Button.\n* Added select<T>() method to RX.Platform namespace to make it easier to implement platform-specific behavior.\n* Improved accessibility performance.\n* Improved performance by avoiding triggering synchronous layout on web.\n* Fixed behavior of onContextMenu.\n* Removed unused \"type\" field from RX.CommonProps interface.\n* Updated typescript compiler to 2.7.2 and enabled strictPropertyInitialization.\n* Added ability to set limitFocusWithin without automatically setting aria-hidden=true on web.\n* Implemented RX.Linking APIs for Windows UWP platform.\n* Removed \"currentTarget\" from SyntheticEvent.\n* Added coordinates/modifiers/button information to MouseEvent definition.\n\n#### Version 1.0.0-alpha.2 of reactxp - _21 Feb 2018_\n* Switched to new versioning scheme that's independent of RN.\n* Updated default RN dependency from 0.51.x to 0.53.x, although backward compatibility is maintained.\n* Added support for numeric keyboards in mobile browsers.\n* Fixed announceForAccessibility API for Mac.\n* Added MacOS implementation of Button and Animated.\n* Added valuenow attribute for slider role support.\n* Fixed bug in web implementation of Animated where it wasn't properly managing listener subscriptions when animated styles were added to (or removed from) an animated component.\n* Fix random Android crashes when Talkback is enabled.\n* Fixed bug in web animation that caused certain CSS properties not to animate correctly because transition was specifying the attribute using camel case rather than CSS (hyphenated) case. This affected attributes like \"backgroundColor\".\n* Removed parameter from onBlur event.\n* Fixed bug in RX.TextInput that affected Windows version: Pass selection in render only after explicitly set.\n* Added right-click support for Windows platform.\n* Added more accessibility support for Windows platform.\n* Use white-space:pre for the aria-live region.\n\n#### Version 0.51.1 of reactxp - _19 Jan 2018_\n* Fixed regression in native implementation of Animated.View's blur() method.\n\n#### Version 0.2.3 of reactxp-video, 1.0.15 of reactxp-navigator, 0.2.8 of reactxp-imagesvg, 0.1.7 of reactxp-virtuallistview - _18 Jan 2018_\n* Updated for RN 0.51 compatibility.\n\n#### Version 0.51.0 of reactxp - _18 Jan 2018_\n* Fixed focusable View condition for VoiceOver in web implementation.\n* Exposed web-specific ariaRoleDescription prop to work around other VoiceOver issues.\n* Updated RN for Windows UWP dependency.\n* Fixed recent regression that broke focus and blur calls in iOS and Android implementations of AnimatedTextInput.\n\n#### Version 0.51.0-alpha.9 of reactxp - _17 Jan 2018_\n* Removed console error related to animations of values not currently associated with any mounted component. It was too noisy.\n\n#### Version 0.51.0-alpha.8 of reactxp - _16 Jan 2018_\n* Fixed bug in Windows UWP implementation related to selection ranges in TextInput.\n* Fixed screen reader issue in Mac implementation.\n* Removed ```textAlign``` prop from TextInput. It was extraneous, since it's already supported as a style attribute.\n* Updated Windows UWP dependency to use the latest version of RN for UWP.\n* Worked around issue with screen readers on Chrome browsers.\n* Added currentTarget field back to SyntheticEvent.\n* Added support for \"switch\" aria type (web implementation).\n* Fixed recent regression in web animation code.\n\n#### Version 0.51.0-alpha.5 of reactxp - _11 Jan 2018_\n* Eliminated limitation within RX.Button where only one child element was allowed.\n* Fixed regression where native implementation of RX.View with onPress handler didn't provide touch feedback.\n\n#### Version 0.51.0-alpha.4 of reactxp - _10 Jan 2018_\n* Added code to native implementation of RX.Network so it works with versions of RN before and after 0.48.x.\n* Fixed regression in web implementation of RX.TextInput.\n* Fixed bug that caused incorrect behavior of RX.Modal on native platforms.\n\n#### Version 0.51.0-alpha.2 of reactxp - _9 Jan 2018_\n* Fixed bug in native implementation of RX.ActivityIndicator. It wasn't properly handling the delay prop.\n* Added support in web implementation of RX.TextInput for custom keyboard types on mobile web browsers.\n* Added focus and keyboard navigation support for native UWP platform.\n* Added support for injection of HTML content into RX.WebView.\n* Added support for postMessage and onMessage handler in RX.WebView for bidirectional communication.\n\n#### Version 0.51.0-alpha.1 of reactxp - _6 Jan 2018_\n* Fixed break in device dimension change event due to change in RN.\n* Removed use of RX.Button implementation within RX.View for native-common implementation.\n* Fixed bug in web implementation of RX.Clipboard.getText. It shouldn't throw.\n* Fixed timing bug in web implementation of GestureView.\n* Fixed popup positioning for right-to-left languages in native-common implementation.\n* Fixed bug in web implementation of TextInput that caused assertion in React.\n* Breaking change: Removed 'cursor' prop from RX.Button. It was redundant with the 'cursor' style.\n* New feature: RX.Input.key[Up|Down]Event now allow event subscribers to cancel the event.\n* New feature: Changed RX.Modal.isDisplayed to accept undefined parameter, in which case it determines whether _any_ modal is displayed.\n* New feature: Added RX.Popup.isDisplayed method.\n* Reimplemented web implementation of animation APIs. Removed many limitations of previous implementation and fixed several bugs. Documented remaining limitations.\n* Fixed bug in web implementation of RX.TextInput that resulted in assertions within React.\n* Fixed bug in web implementation of RX.Picker. It wasn't correctly combining styles.\n* Added support in web implementation of RX.TextInput for keyboard type (applicable on mobile web browsers).\n* Removed use of deprecated RX.NetInfo.fetch method.\n\n#### Version 0.46.6 of reactxp - _13 Dec 2017_\n* Fixed potential crash in web implementation of RX.ScrollView.\n* Fixed bug in UWP implementation of RX.Popup, allowing background to be clickable.\n* In web implementation of RX.ScrollView, added support for clicking on scroll bar to adjust position of thumb.\n* Added dev warning when using nested RX.Button items.\n* Fixed a potential crash in web implementation of RX.GestureView.\n* Implemented drag-and-drop support in UWP implementation of RX.View.\n\n#### Version 0.46.5 of reactxp - _31 Oct 2017_\n* Added Android \"mode\" prop to Picker.\n* Added type definitions for RX.Stateless and RX.ComponentBase.\n* Updated to React 16.0.0 and React-Dom 16.0.0.\n* Added RX.UserInterface.registerRootView API to allow registration of secondary views. Also added rootViewId option to RX.Modal and RX.Popup so they can be displayed on secondary views.\n* Fixed bug in focus restoration on web implementation.\n* Replaced use of deprecated BackAndroid with BackHandler, avoiding deprecation warnings.\n* Fixed bug in RX.Button RN implementation where opacity was not property restored after changing disabled prop.\n\n#### Version 0.46.3 of reactxp - _7 Oct 2017_\n* Added missing focus() method to RX.Animated.View interface.\n* Exported RX.AnimatedImage, RX.AnimatedText, RX.AnimatedTextInput, and RX.AnimatedView.\n* Added accessibilityLiveRegion prop to ViewProps for Android and web.\n* Exported explicit types for ShadowOffset, ScrollIndicatorInsets.\n* Fixed crash in web RootView when clicking on a popup anchor.\n* Fixed race condition in hover of Button on web.\n\n#### Version 0.2.2 of reactxp-video, 1.0.13 of reactxp-navigator, 0.2.7 of reactxp-imagesvg, 0.1.6 of reactxp-virtuallistview - _21 Sep 2017_\n* Updated for RN 0.46 compatibility.\n* Removed custom react.d.ts and react-dom.d.ts files in favor of public versions.\n\n#### Version 0.46.2 of reactxp - _21 Sep 2017_\n* Added onContextMenu support on web for Text components.\n* Exposed attributes to make menus and listboxes accessible on web.\n* Added new RX.Animated.createValue and RX.Animated.interpolate methods. The old way of instantiating a value and creating an interpolation will be deprecated going forward.\n* Made a breaking change to Alert.show interface - combined optional parameters into an AlertOptions interface. This will allow for better extensibility in the future.\n* Updated RN dependency to 0.46.\n* Removed custom react.d.ts and react-dom.d.ts files in favor of public versions.\n\n#### Version 0.46.0_rc.2 of reactxp - _19 Sep 2017_\n* Changed RX.Link props to make url mandatory.\n* Added new Alert implementation for web. It now presents a modal-based themable dialog box.\n* Fixed bug in ScrollView styles from previous release.\n* Exposed aria-checked property on button type for web.\n* Added key attribute to KeyboardEvent.\n* Fixed bug in web code where onScrollBeginDrag and onScrollEndDrag were called unconditionally even if they were undefined.\n* Enabled strict null checks in TS compiler and fixed a number of bugs that were exposed.\n\n#### Version 0.46.0_rc.1 of reactxp - _5 Sep 2017_\n* First pre-release version of 0.46.\n* Removed Navigator component and moved to an extension.\n* Fixed style definition for ScrollView so it doesn't include child-related flexbox styles, which aren't supported.\n\n#### Version 0.42.0 of reactxp - _5 Sep 2017_\n* Removed rc from version.\n\n#### Version 0.42.0_rc.25 of reactxp - _18 Aug 2017_\n* On web, if there's a queued onScroll event when the scroll position is manually set, cancel the onScroll.\n\n#### Version 0.42.0_rc.24 of reactxp - _9 Aug 2017_\n* Added accessibility support for GestureView.\n* Fixed bug in web version that prevented animated fontSize from working.\n\n#### Version 0.42.0_rc.22 of reactxp - _30 July 2017_\n* On RN platforms, initialProps is now passed to the main view.\n* Added new PopupOptions field preventDismissOnPress that prevents the popup from being dismissed implicitly when the user clicks or taps outside of the popup or the anchor.\n* Fixed bug in web implementation of TextInput where border styling was not honored.\n* Fixed bug on Android that allowed presses to background of Modal to go through.\n\n#### Version 0.42.0_rc.20 of reactxp - _15 July 2017_\n* Updated to TypeScript 2.4, which caught several bugs in the ReactXP code.\n* Made Styles.combine much more flexible - it now supports arbitrarily nested arrays of styles.\n* Changed Network API namespace for detecting network type so it's consistent with other ReactXP APIs. Added documentation.\n\n#### Version 0.1.6 of reactxp-video - _15 July 2017_\n* Updated to TypeScript 2.4 and made changes to work with latest ReactXP core.\n\n#### Version 0.2.4 of reactxp-imagesvg - _15 July 2017_\n* Updated to TypeScript 2.4 and made changes to work with latest ReactXP core.\n\n#### Version 0.42.0_rc.18 of reactxp - _13 July 2017_\n* Fixed runtime crash when running web implementation in Electron.\n* Added a way to provide screen reader focus to TextInput on web.\n\n#### Version 0.42.0_rc.17 of reactxp - _4 July 2017_\n* Added ability to set accessibility focus for text input controls.\n* Added support for iOS-specific ActivationState for RN extensions.\n\n#### Version 0.42.0_rc.16 of reactxp - _30 June 2017_\n* Fixed another bug in handling of default border width on web.\n* Added setFocusRestricted and setFocusLimited methods and support for nested keyboard focus on web.\n* Added isNavigatingWithKdyboard method and keyboardNavigationEvent.\n\n#### Version 0.42.0_rc.12 of reactxp - _16 June 2017_\n* Added support for new limitFocusWidth prop for constraining keyboard focus.\n* Fixed bug in handling of mailto URLs on web in the Link component.\n* Added support for flexGrow, flexShrink, and flexBasis props.\n\n#### Version 0.42.0_rc.11 of reactxp - _13 June 2017_\n* Fixed bugs in web implementation of focus manager.\n* Added new API (enableTouchLatencyEvents) and event (touchLatencyEvent) in UserInterface namespace for detecting delays in touch event handling.\n* Fixed crash in native implementation of Link component that resulted in uncaught exception for some types of links.\n* Fixed flexDirection style default for web implementation in Image component.\n* Fixed inconsistency in handling of borders between web and RN when borderStyle is not specified.\n\n#### Version 0.42.0_rc.10 of reactxp - _25 May 2017_\n* Added new International API namespace for controlling right-to-left mirroring behavior.\n\n#### Version 0.1.2 of reactxp-virtualistview - _23 May 2017_\n* Republished because index files were missing in previous publish.\n\n#### Version 0.42.0_rc.9 of reactxp - _17 May 2017_\n* Fixed bug in Navigator that caused crash in hello-world sample.\n\n#### Version 0.42.0_rc.8 of reactxp - _16 May 2017_\n* Removed Profiling API namespace and dependency on react-addons-perf.\n\n#### Version 0.1.1 of reactxp-virtualistview - _11 May 2017_\n* Republished because \"dist\" directory was missing in previous publish.\n\n#### Version 0.1.2 of reactxp-video - _11 May 2017_\n* Published first version of reactxp-video extension.\n\n#### Version 0.2.0 of reactxp-imagesvg - _10 May 2017_\n* Switched from old version of react-native-art-svg to latest version of react-native-svg.\n\n#### Version 0.42.0_rc.5 of reactxp - _10 May 2017_\n* Fixed incorrect import path (using wrong case).\n* Fixed bug in native View implementation - was using stale props.\n* Added importantForLayout prop on View (web specific).\n* Fixed bug in native NavigatorExperimentalDelegate - was using wrong props.\n\n#### Version 0.42.0_rc.4 of reactxp - _27 Apr 2017_\n* Changed web implementation of Text to prevent copying text to clipboard.\n* Eliminated the need to specify box-sizing CSS in external CSS file.\n* Fixed accessibility focus bugs.\n\n#### Version 0.42.0_rc.3 of reactxp - _26 Apr 2017_\n* Added onLongPress prop for Link.\n* Fixed accessibility bug relating to Modal dialogs.\n\n#### Version 0.42.0_rc.2 of reactxp - _18 Apr 2017_\n* Added missing box-sizing CSS directives for web.\n* Fixed bug in native implementation of View related to accessibility.\n\n#### Version 0.1.0 of reactxp-imagesvg - _26 Apr 2017_\n* Published first version of reactxp-imagesvg extension.\n\n#### Version 0.42.0_rc.1 of reactxp - _9 Apr 2017_\n* Updated project to use recent versions of React (15.5.3) and React Native (0.42.3).\n\n#### Version 0.34.3 of reactxp - _7 Apr 2017_\n* Added new props to ScrollView. Updated package.json to properly reflect peerDependencies on react and react-native.\n\n#### Version 0.34.1 of reactxp - _6 Apr 2017_\n* This is the initial public release of the ReactXP core library. It is built against React Native 0.34. We are working on updating it to a newer version of React Native, and this will be released shortly.\n"
  },
  {
    "path": "extensions/README.md",
    "content": "﻿# ReactXP Extensions\nThe ReactXP library is designed to be as lightweight as possible, including only those cross-platform APIs and \"primitive\" components that are required by almost every app. Functionality that is needed less commonly is provided in the form of optional extensions.\n\nThere are two distinct types of extensions.\n1. Additional APIs or \"primitive\" components that have separate implementations for each of the supported platforms.\n2. Higher-level components that contain no platform-specific code but build upon the lower-level primitives to provide new (typically more complex) functionality.\n\n"
  },
  {
    "path": "extensions/imagesvg/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {},\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"PluginBaseChecker.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/imagesvg/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\npackage-lock.json\n\n# Optional npm cache directory\n.npm\n\n# Build artifacts\n**/dist\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\n"
  },
  {
    "path": "extensions/imagesvg/.npmignore",
    "content": "/node_modules\n/src/.vs\n/src/bin\n/src/obj\n*.user\n"
  },
  {
    "path": "extensions/imagesvg/README.md",
    "content": "# reactxp-imagesvg\nThis module provides cross-platform support for SVG (Scalable Vector Graphics) within the [ReactXP](https://microsoft.github.io/reactxp/) library.\n\n## Documentation\nFor detailed documentation, look [here](https://microsoft.github.io/reactxp/docs/extensions/imagesvg.html).\n\n### Prerequisites\n* [ReactXP](https://github.com/microsoft/reactxp/)\n\n## Contributing\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/imagesvg/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/android/PluginBase.js');\n"
  },
  {
    "path": "extensions/imagesvg/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/ios/PluginBase.js');\n"
  },
  {
    "path": "extensions/imagesvg/index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/PluginBase.js');\n"
  },
  {
    "path": "extensions/imagesvg/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/macos/PluginBase.js');\n"
  },
  {
    "path": "extensions/imagesvg/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/windows/PluginBase.js');\n"
  },
  {
    "path": "extensions/imagesvg/package.json",
    "content": "{\n  \"name\": \"reactxp-imagesvg\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Plugin for ReactXP that provides support for SVG (scalable vector graphics) for all platforms\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"react-native-svg\": \"^9.13.3\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3\",\n    \"reactxp\": \"^2.0.0\",\n    \"react-dom\": \"^16.3\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/react-native\": \"^0.60.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"types\": \"dist/web/PluginBase.d.ts\"\n}\n"
  },
  {
    "path": "extensions/imagesvg/src/android/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Android implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport ImageSvg from '../native-common/ImageSvg';\nimport SvgPath from '../native-common/SvgPath';\nimport SvgRect from '../native-common/SvgRect';\n\nexport { ImageSvg as default, SvgPath, SvgRect, Types };\n"
  },
  {
    "path": "extensions/imagesvg/src/common/Interfaces.ts",
    "content": "/*\n * Interfaces.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Interface exposed by ImageSvg component.\n */\n\nimport * as React from 'react';\n\nimport * as Types from './Types';\n\nexport abstract class ImageSvg extends React.Component<Types.ImageSvgProps, any> {\n}\n\nexport abstract class SvgPath extends React.Component<Types.SvgPathProps, any> {\n}\n\nexport abstract class SvgRect extends React.Component<Types.SvgRectProps, any> {\n}\n\nexport interface PluginInterface {\n    Types: typeof Types;\n\n    default: typeof ImageSvg;\n    SvgPath: typeof SvgPath;\n    SvgRect: typeof SvgRect;\n}\n"
  },
  {
    "path": "extensions/imagesvg/src/common/PluginBaseChecker.ts",
    "content": "/*\n * PluginBaseChecker.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type check all the pluginbase exports against the desired interface.\n */\n\nimport * as AndroidPlugin from '../android/PluginBase';\nimport * as iOSPlugin from '../ios/PluginBase';\nimport * as macOSPlugin from '../macos/PluginBase';\nimport * as WebPlugin from '../web/PluginBase';\nimport * as WindowsPlugin from '../windows/PluginBase';\n\nimport * as Interfaces from './Interfaces';\n\nconst _typeCheckerAndroid: Interfaces.PluginInterface = AndroidPlugin;\nconst _typeCheckeriOS: Interfaces.PluginInterface = iOSPlugin;\nconst _typeCheckermacOS: Interfaces.PluginInterface = macOSPlugin;\nconst _typeCheckerWeb: Interfaces.PluginInterface = WebPlugin;\nconst _typeCheckerWindows: Interfaces.PluginInterface = WindowsPlugin;\n"
  },
  {
    "path": "extensions/imagesvg/src/common/Types.ts",
    "content": "/*\n * Types.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definitions to support the plugin.\n */\n\nimport { Types as RXTypes } from 'reactxp';\nimport * as React from 'react';\n\nexport interface ImageSvgStyle extends RXTypes.ViewStyle {\n}\n\nexport declare type ImageSvgStyleRuleSet = RXTypes.StyleRuleSet<ImageSvgStyle>;\n\nexport interface SvgCommonProps {\n    key?: string | number;\n    strokeColor?: string;\n    strokeWidth?: number;\n    strokeOpacity?: number;\n    fillColor?: string;\n    fillOpacity?: number;\n}\n\nexport interface ImageSvgProps extends SvgCommonProps, RXTypes.CommonStyledProps<ImageSvgStyleRuleSet, ImageSvg> {\n    children?: RXTypes.ReactNode;\n    height: number;\n    width: number;\n    accessibilityLabel?: string;\n    title?: string;\n    viewBox?: string;\n    preserveAspectRatio?: string;\n    webShadow?: string;\n}\n\nexport interface SvgPathProps extends SvgCommonProps {\n    d?: string;\n}\n\nexport interface SvgRectProps extends SvgCommonProps {\n    width: number;\n    height: number;\n    x: number;\n    y: number;\n}\n\nexport class ImageSvg extends React.Component<ImageSvgProps, RXTypes.Stateless> {}\n"
  },
  {
    "path": "extensions/imagesvg/src/common/assert.ts",
    "content": "/**\n * assert\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n */\nconst assert = (cond: any, message?: string | undefined): void => {\n    if (!cond) {\n        throw new Error(message || 'Assertion Failed');\n    }\n};\n\nexport default assert;\n"
  },
  {
    "path": "extensions/imagesvg/src/ios/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the iOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport ImageSvg from '../native-common/ImageSvg';\nimport SvgPath from '../native-common/SvgPath';\nimport SvgRect from '../native-common/SvgRect';\n\nexport { ImageSvg as default, SvgPath, SvgRect, Types };\n"
  },
  {
    "path": "extensions/imagesvg/src/macos/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the iOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport ImageSvg from '../native-common/ImageSvg';\nimport SvgPath from '../native-common/SvgPath';\nimport SvgRect from '../native-common/SvgRect';\n\nexport { ImageSvg as default, SvgPath, SvgRect, Types };\n"
  },
  {
    "path": "extensions/imagesvg/src/native-common/ImageSvg.tsx",
    "content": "﻿/**\n * ImageSvg.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG (scalable vector graphics) images.\n */\n\nimport * as React from 'react';\nimport * as RNSvg from 'react-native-svg';\n\nimport assert from '../common/assert';\nimport { ImageSvgProps } from '../common/Types';\n\nexport class ImageSvg extends React.Component<ImageSvgProps, {}> {\n    render() {\n        assert(this.props.width && this.props.height, 'The width and height on imagesvg are mandatory.');\n\n        if (this.props.width > 0 && this.props.height > 0) {\n            return (\n                <RNSvg.Svg\n                    width={ this.props.width.toString() }\n                    height={ this.props.height.toString() }\n                    style={ this.props.style }\n                    opacity={ this.props.strokeOpacity }\n                    preserveAspectRatio={ this.props.preserveAspectRatio }\n                    viewBox={ this.props.viewBox }\n                >\n                    { this.props.children }\n                </RNSvg.Svg>\n            );\n        }\n\n        return null;\n    }\n}\n\nexport default ImageSvg;\n"
  },
  {
    "path": "extensions/imagesvg/src/native-common/SvgPath.tsx",
    "content": "/**\n * SvgPath.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG Path elements.\n */\n\nimport * as React from 'react';\nimport * as RNSvg from 'react-native-svg';\n\nimport { SvgPathProps } from '../common/Types';\n\nexport class SvgPath extends React.Component<SvgPathProps, {}> {\n    render() {\n        return (\n            <RNSvg.Path\n                fill={ this.props.fillColor || '#fff' }\n                strokeWidth={ this.props.strokeWidth }\n                strokeOpacity={ this.props.strokeOpacity }\n                fillOpacity={ this.props.fillOpacity }\n                stroke={ this.props.strokeColor }\n                d={ this.props.d }\n            />\n        );\n    }\n}\n\nexport default SvgPath;\n"
  },
  {
    "path": "extensions/imagesvg/src/native-common/SvgRect.tsx",
    "content": "/**\n * SvgPath.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG Rect elements.\n */\n\nimport * as React from 'react';\nimport * as RNSvg from 'react-native-svg';\n\nimport { SvgRectProps } from '../common/Types';\n\nexport class SvgRect extends React.Component<SvgRectProps, {}> {\n    render() {\n        return (\n            <RNSvg.Rect\n                fill={ this.props.fillColor || '#fff' }\n                strokeWidth={ this.props.strokeWidth }\n                strokeOpacity={ this.props.strokeOpacity }\n                fillOpacity={ this.props.fillOpacity }\n                stroke={ this.props.strokeColor }\n                width={ this.props.width }\n                height={ this.props.height }\n                x={ this.props.x }\n                y={ this.props.y }\n            />\n        );\n    }\n}\n\nexport default SvgRect;\n"
  },
  {
    "path": "extensions/imagesvg/src/typings/react-native-svg.d.ts",
    "content": "/**\n * react-native-svg.d.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definition file for the React Native SVG module.\n * https://github.com/react-native-community/react-native-svg\n */\n\ndeclare module 'react-native-svg' {\n\n    import * as React from 'react';\n    import * as RN from 'react-native';\n\n    type ArrayType = [string] | [number];\n\n    interface SvgProps extends RN.ComponentPropsBase {\n        height?: string;\n        width?: string;\n        viewBox?: string;\n        opacity?: number;\n        preserveAspectRatio?: string;\n        style?: RN.StyleRuleSet;\n    }\n\n    interface BaseProps extends RN.ComponentPropsBase {\n        fill?: string; // The fill prop refers to the color inside the shape.\n        fillOpacity?: number; // This prop specifies the opacity of the color or the content the current object is filled with.\n        stroke?: string; // The stroke prop controls how the outline of a shape appears.\n        strokeWidth?: number; // The strokeWidth prop specifies the width of the outline on the current object.\n        strokeOpacity?: number; // The strokeOpacity prop specifies the opacity of the outline on the current object.\n        x?: number;\n        y?: number;\n        strokeLinecap?: string; // oneOf(['butt', 'square', 'round']),\n        strokeCap?: string; // .oneOf(['butt', 'square', 'round']),\n        strokeLinejoin?: string; // oneOf(['miter', 'bevel', 'round']),\n        strokeJoin?: string; // .oneOf(['miter', 'bevel', 'round']),\n        strokeDasharray?: ArrayType;\n        scale?: number; // Scale value on the current object.\n        rotate?: number; // Rotation degree value on the current object.\n        originX?: number; // Transform originX coordinates for the current object.\n        originY?: number;  // Transform originY coordinates for the current object.\n    }\n\n    interface TransformProps extends BaseProps {\n        scaleX: number;\n        scaleY: number;\n        transform: number;\n    }\n\n    interface PathProps extends BaseProps {\n        d: string;\n    }\n\n    interface RectProps extends BaseProps {\n        width?: number;\n        height?: number;\n    }\n\n    interface TextProps extends BaseProps {\n        textAnchor: ('start' | 'middle' | 'end');\n        fontFamily: string;\n        fontSize: number;\n    }\n\n    export class Svg extends React.Component<SvgProps, {}> { }\n    export class Path extends React.Component<PathProps, {}> { }\n    export class Rect extends React.Component<RectProps, {}> { }\n    export class Text extends React.Component<TextProps, {}> { }\n}\n"
  },
  {
    "path": "extensions/imagesvg/src/web/ImageSvg.tsx",
    "content": "﻿/*\n * ImageSvg.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform abstraction for\n * SVG (scalable vector graphics) images.\n */\n\nimport * as React from 'react';\nimport { Styles as RXStyles } from 'reactxp';\n\nimport assert from '../common/assert';\nimport { ImageSvgProps } from '../common/Types';\n\nexport class ImageSvg extends React.Component<ImageSvgProps, {}> {\n    render() {\n        assert(this.props.width && this.props.height, 'The width and height on imagesvg are mandatory.');\n\n        if (this.props.width > 0 && this.props.height > 0) {\n            const combinedStyles = RXStyles.combine([{\n                display: 'flex',\n                position: 'relative',\n            } as any, this.props.style]);\n\n            if (this.props.fillColor !== undefined) {\n                combinedStyles.fill = this.props.fillColor;\n            }\n\n            if (this.props.fillOpacity !== undefined) {\n                combinedStyles.fillOpacity = this.props.fillOpacity.toString();\n            }\n\n            if (this.props.strokeColor !== undefined) {\n                combinedStyles.stroke = this.props.strokeColor;\n            }\n\n            if (this.props.strokeOpacity !== undefined) {\n                combinedStyles.strokeOpacity = this.props.strokeOpacity.toString();\n            }\n\n            if (this.props.strokeWidth !== undefined) {\n                combinedStyles.strokeWidth = this.props.strokeWidth.toString();\n            }\n\n            if (combinedStyles.flex === undefined) {\n                combinedStyles.flex = '0 0 auto';\n            }\n\n            if (combinedStyles.overflow === undefined) {\n                combinedStyles.overflow = 'hidden';\n            }\n\n            if (this.props.webShadow) {\n                const aliases = RXStyles.getCssPropertyAliasesCssStyle();\n\n                if (this._isFilterDropShadowSupported()) {\n                    const filterAlias = aliases.filter || 'filter';\n                    combinedStyles[filterAlias] = 'drop-shadow(' + this.props.webShadow + ')';\n                }\n            }\n\n            return (\n                <svg\n                    viewBox={ this.props.viewBox }\n                    style={ combinedStyles }\n                    height={ this.props.height  }\n                    width={ this.props.width }\n                >\n                    { this.props.children }\n                </svg>\n            );\n        } else {\n            return null;\n        }\n    }\n\n    private _isFilterDropShadowSupported() {\n        // Edge (actually, Windows 10) contains a bug where it renders this incorrectly.\n        // We'll disable it specifically on Edge browsers for now.\n        // Safari also has a bug where it renders this incorrectly (transparent background),\n        // so we'll disable it there also.\n        // For now, enable it in Chrome only.\n        let isChrome = window.hasOwnProperty('chrome');\n\n        // The latest versions of Edge implement the \"chrome\" global variable (presumably\n        // for compatibility with Chrome browser), so we need to do one more check\n        // to make sure it's really chrome.\n        if (isChrome && navigator.appName === 'Netscape' && navigator.appVersion.indexOf('Edge') >= 0) {\n            isChrome = false;\n        }\n\n        return isChrome;\n    }\n}\n\nexport default ImageSvg;\n"
  },
  {
    "path": "extensions/imagesvg/src/web/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Web implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport ImageSvg from './ImageSvg';\nimport SvgPath from './SvgPath';\nimport SvgRect from './SvgRect';\n\nexport { ImageSvg as default, SvgPath, SvgRect, Types };\n"
  },
  {
    "path": "extensions/imagesvg/src/web/SvgPath.tsx",
    "content": "/*\n * SvgPath.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform abstraction for\n * SVG Path elements.\n */\n\nimport * as React from 'react';\n\nimport { SvgPathProps } from '../common/Types';\n\nexport class SvgPath extends React.Component<SvgPathProps, {}> {\n    render() {\n        return (\n            <path\n                fill={ this.props.fillColor }\n                fillOpacity={ this.props.fillOpacity }\n                stroke={ this.props.strokeColor }\n                strokeOpacity={ this.props.strokeOpacity }\n                strokeWidth={ this.props.strokeWidth }\n                d={ this.props.d }\n            />\n        );\n    }\n}\n\nexport default SvgPath;\n"
  },
  {
    "path": "extensions/imagesvg/src/web/SvgRect.tsx",
    "content": "/*\n * SvgRect.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform abstraction for\n * SVG Rect elements.\n */\n\nimport * as React from 'react';\n\nimport { SvgRectProps } from '../common/Types';\n\nexport class SvgRect extends React.Component<SvgRectProps, {}> {\n    render() {\n        return (\n            <rect\n                fill={ this.props.fillColor }\n                fillOpacity={ this.props.fillOpacity }\n                stroke={ this.props.strokeColor }\n                strokeOpacity={ this.props.strokeOpacity }\n                strokeWidth={ this.props.strokeWidth }\n                width={ this.props.width }\n                height={ this.props.height }\n                x={ this.props.x }\n                y={ this.props.y }\n            />\n        );\n    }\n}\n\nexport default SvgRect;\n"
  },
  {
    "path": "extensions/imagesvg/src/windows/ImageSvg.tsx",
    "content": "/**\n * ImageSvg.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG (scalable vector graphics) images.\n */\n\nimport * as React from 'react';\n\nimport { ImageSvgProps } from '../common/Types';\n\n// TODO: #694092 Not implemented\n\nexport class ImageSvg extends React.Component<ImageSvgProps, {}> {\n    render(): any {\n        return null;\n    }\n}\n\nexport default ImageSvg;\n"
  },
  {
    "path": "extensions/imagesvg/src/windows/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the UWP implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport ImageSvg from './ImageSvg';\nimport SvgPath from './SvgPath';\nimport SvgRect from './SvgRect';\n\nexport { ImageSvg as default, SvgPath, SvgRect, Types };\n"
  },
  {
    "path": "extensions/imagesvg/src/windows/SvgPath.tsx",
    "content": "/*\n * SvgPath.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG Path elements.\n */\n\nimport * as React from 'react';\n\nimport { SvgPathProps } from '../common/Types';\n\n// TODO: #694092 Not implemented\n\nexport class SvgPath extends React.Component<SvgPathProps, {}> {\n    render(): any {\n        return null;\n    }\n}\n\nexport default SvgPath;\n"
  },
  {
    "path": "extensions/imagesvg/src/windows/SvgRect.tsx",
    "content": "/*\n * SvgRect.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform abstraction for\n * SVG Rect elements.\n */\n\nimport * as React from 'react';\n\nimport { SvgRectProps } from '../common/Types';\n\n// TODO: #694092 Not implemented\n\nexport class SvgRect extends React.Component<SvgRectProps, {}> {\n    render(): any {\n        return null;\n    }\n}\n\nexport default SvgRect;\n"
  },
  {
    "path": "extensions/imagesvg/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"jsx\": \"react\",\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"experimentalDecorators\": true,\n        \"noImplicitAny\": true,\n        \"outDir\": \"dist/\",\n        \"skipLibCheck\": true\n    },\n    \"include\": [\n        \"src/**/*\"\n    ],\n    \"exclude\": [\n        \"dist\",\n        \"node_modules\"\n    ]\n}"
  },
  {
    "path": "extensions/navigation/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {\n    \"no-console\": [\n      \"error\",\n      {\n        \"allow\": [\n          \"error\"\n        ]\n      }\n    ]\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"Navigator.tsx\"\n      ],\n      \"rules\": {\n        \"no-duplicate-imports\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"*.d.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\",\n        \"@typescript-eslint/member-naming\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/navigation/.gitignore",
    "content": "dist\nnode_modules\n.DS_Store\npackage-lock.json"
  },
  {
    "path": "extensions/navigation/.npmignore",
    "content": "!dist\n"
  },
  {
    "path": "extensions/navigation/README.md",
    "content": "# reactxp-navigation\nThis module provides cross-platform navigation support [ReactXP](https://microsoft.github.io/reactxp/) library.\n\n## Documentation\nFor detailed documentation, look [here](https://microsoft.github.io/reactxp/docs/extensions/navigator.html).\n\n### Prerequisites\n* [ReactXP](https://github.com/microsoft/reactxp/)\n\n## Contributing\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/navigation/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/native-common/Navigator');"
  },
  {
    "path": "extensions/navigation/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/native-common/Navigator');"
  },
  {
    "path": "extensions/navigation/index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/Navigator');"
  },
  {
    "path": "extensions/navigation/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/native-common/Navigator');\n"
  },
  {
    "path": "extensions/navigation/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/native-common/Navigator');"
  },
  {
    "path": "extensions/navigation/package.json",
    "content": "{\n  \"name\": \"reactxp-navigation\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Plugin for ReactXP that provides a navigation framework\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Microsoft/reactxp/tree/master/extensions/navigation\"\n  },\n  \"keywords\": [\n    \"react-native\",\n    \"reactxp\",\n    \"react\"\n  ],\n  \"dependencies\": {\n    \"lodash\": \"^4.17.15\",\n    \"rebound\": \"^0.1.0\",\n    \"reactxp-experimental-navigation\": \"1.0.14\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"react-dom\": \"^16.3.0\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash\": \"^4.14.149\",\n    \"@types/react-dom\": \"^16.9.4\",\n    \"@types/react-native\": \"^0.60.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.20.0\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"react\": \"^16.3.0\",\n    \"react-dom\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"types\": \"dist/web/Navigator.d.ts\"\n}\n"
  },
  {
    "path": "extensions/navigation/src/common/Types.ts",
    "content": "/**\n * Types.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n * Type definitions for reactxp-naviigation extension.\n */\n\n// Use only for type data\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nexport type ReactNode = React.ReactNode;\n\n//\n// Navigator\n// ----------------------------------------------------------------------\nexport enum NavigatorSceneConfigType {\n    FloatFromRight,\n    FloatFromLeft,\n    FloatFromBottom,\n    Fade,\n    FadeWithSlide\n}\n\nexport interface NavigatorRoute {\n    routeId: number;\n    // Route's animation configuration\n    sceneConfigType: NavigatorSceneConfigType;\n\n    // NOTE: The following props are for the experimental navigator.\n    // They aren't considered when working with the standard navigator.\n    // Optional gesture response distance override\n    // 0 is equivalent to disabling gestures\n    gestureResponseDistance?: number;\n    // Optional custom scene config\n    customSceneConfig?: CustomNavigatorSceneConfig;\n}\n\n// NOTE: Experimental navigator only\nexport interface NavigationTransitionSpec {\n    duration?: number;\n\n    // NOTE: Elastic and bounce easing will not work as expected due to how the navigator interpolates styles\n    easing?: RX.Types.Animated.EasingFunction;\n}\n\n// NOTE: Experimental navigator only\nexport interface NavigationTransitionStyleConfig {\n    // By default input range is defined as [index - 1, index, index + 1];\n    // Input and output ranges must contain the same number of elements\n    inputRange?: number[];\n    opacityOutput: number | number[];\n    scaleOutput: number | number[];\n    translateXOutput: number | number[];\n    translateYOutput: number | number[];\n}\n\n// NOTE: Experimental navigator only\nexport interface CustomNavigatorSceneConfig {\n    // Optional transition styles\n    transitionStyle: (sceneIndex: number, sceneDimensions: RX.Types.Dimensions) => NavigationTransitionStyleConfig;\n    // Optional overrides for duration, easing, and timing\n    transitionSpec?: NavigationTransitionSpec;\n    // Optional cardStyle override\n    cardStyle?: RX.Types.ViewStyleRuleSet;\n    // Optionally hide drop shadow\n    hideShadow?: boolean;\n    // Optionally flip the visual order of the last two scenes\n    presentBelowPrevious?: boolean;\n}\n\nexport interface NavigatorProps extends RX.CommonProps {\n    renderScene: (route: NavigatorRoute) => JSX.Element | null;\n    navigateBackCompleted?: () => void;\n    // NOTE: Arguments are only passed to transitionStarted by the experimental navigator\n    transitionStarted?: (progress?: RX.Types.AnimatedValue,\n        toRouteId?: string,\n        fromRouteId?: string,\n        toIndex?: number,\n        fromIndex?: number) => void;\n    transitionCompleted?: () => void;\n    cardStyle?: RX.Types.ViewStyleRuleSet;\n    children?: ReactNode;\n    // Selector of the navigator delegate. Currently make difference only in react-native.\n    delegateSelector?: NavigatorDelegateSelector;\n}\n\nexport enum CommandType {\n    Push,\n    Pop,\n    Replace\n}\n\nexport interface CommandParam {\n    route?: NavigatorRoute;\n    value?: number;\n}\n\nexport interface NavigationCommand {\n    type: CommandType;\n    param: CommandParam;\n}\n\n// Empty state\nexport interface NavigatorState {\n}\n\nexport abstract class Navigator<S> extends React.Component<NavigatorProps, S> {\n    abstract push(route: NavigatorRoute): void;\n    abstract pop(): void;\n    abstract replace(route: NavigatorRoute): void;\n    abstract replacePrevious(route: NavigatorRoute): void;\n    abstract replaceAtIndex(route: NavigatorRoute, index: number): void;\n    abstract immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void;\n    abstract popToRoute(route: NavigatorRoute): void;\n    abstract popToTop(): void;\n    abstract getCurrentRoutes(): NavigatorRoute[];\n}\n\nexport interface NavigatorDelegateSelector {\n    getNavigatorDelegate(navigator: Navigator<NavigatorState>): NavigatorDelegate;\n}\n\nexport abstract class NavigatorDelegate {\n    protected _owner: Navigator<NavigatorState>;\n\n    constructor(navigator: Navigator<NavigatorState>) {\n        this._owner = navigator;\n    }\n\n    onBackPress = (): boolean => {\n        const routes = this.getRoutes();\n        if (routes.length > 1) {\n            this.handleBackPress();\n\n            if (this._owner.props.navigateBackCompleted) {\n                this._owner.props.navigateBackCompleted();\n            }\n\n            // Indicate that we handled the event.\n            return true;\n        }\n\n        return false;\n    };\n\n    abstract getRoutes(): NavigatorRoute[];\n    abstract immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void;\n    abstract render(): JSX.Element | null;\n    abstract processCommand(commandQueue: NavigationCommand[]): void;\n    abstract handleBackPress(): void;\n}\n"
  },
  {
    "path": "extensions/navigation/src/common/assert.ts",
    "content": "/**\n * assert\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n */\nconst assert = (cond: any, message?: string | undefined): void => {\n    if (!cond) {\n        throw new Error(message || 'Assertion Failed');\n    }\n};\n\nexport default assert;\n"
  },
  {
    "path": "extensions/navigation/src/common/lodashMini.ts",
    "content": "/**\n * lodashMini.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Imports a subset of lodash library needed for ReactXP's implementation.\n */\n\nimport assign = require('lodash/assign');\nimport clone = require('lodash/clone');\nimport cloneDeep = require('lodash/cloneDeep');\nimport flatten = require('lodash/flatten');\nimport get = require('lodash/get');\nimport isEmpty = require('lodash/isEmpty');\nimport isEqual = require('lodash/isEqual');\nimport isNumber = require('lodash/isNumber');\nimport map = require('lodash/map');\nimport mapValues = require('lodash/mapValues');\n\nexport interface Dictionary<T> {\n    [index: string]: T;\n}\n\nexport {\n    assign,\n    clone,\n    cloneDeep,\n    flatten,\n    get,\n    isEmpty,\n    isEqual,\n    isNumber,\n    map,\n    mapValues,\n};\n"
  },
  {
    "path": "extensions/navigation/src/native-common/Navigator.tsx",
    "content": "﻿/**\n * Navigator.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common native implementation for Navigator on mobile.\n */\nimport * as RX from 'reactxp';\n\nimport * as Types from '../common/Types';\nimport {\n    Navigator as BaseNavigator,\n    NavigatorDelegate,\n    NavigatorDelegateSelector as DelegateSelector,\n    NavigationCommand,\n    NavigatorState,\n    NavigatorProps,\n    NavigatorRoute,\n    CommandType,\n} from '../common/Types';\n\nimport NavigatorExperimentalDelegate from './NavigatorExperimentalDelegate';\n\nexport class DefaultDelegateSelector implements DelegateSelector {\n    getNavigatorDelegate(navigator: BaseNavigator<NavigatorState>) {\n        return new NavigatorExperimentalDelegate(navigator);\n    }\n}\n\nexport class NavigatorImpl extends BaseNavigator<NavigatorState> {\n    private _delegate: NavigatorDelegate;\n    private _commandQueue: NavigationCommand[] = [];\n\n    constructor(initialProps: NavigatorProps) {\n        super(initialProps);\n        if (!initialProps.delegateSelector) {\n            this._delegate = new NavigatorExperimentalDelegate(this);\n        } else {\n            this._delegate = initialProps.delegateSelector.getNavigatorDelegate(this);\n        }\n    }\n\n    componentDidMount() {\n        RX.Input.backButtonEvent.subscribe(this._delegate.onBackPress);\n    }\n\n    componentWillUnmount() {\n        RX.Input.backButtonEvent.unsubscribe(this._delegate.onBackPress);\n    }\n\n    componentDidUpdate() {\n        // Catch up with any pending commands\n        this._processCommand();\n    }\n\n    protected getRoutes(): NavigatorRoute[] {\n        return this._delegate.getRoutes();\n    }\n\n    // Push a new route if initial route doesn't exist\n    push(route: NavigatorRoute): void {\n        this._enqueueCommand({\n            type: CommandType.Push,\n            param: {\n                route: route,\n            },\n        });\n    }\n\n    pop(): void {\n        this._enqueueCommand({\n            type: CommandType.Pop,\n            param: {},\n        });\n    }\n\n    replace(route: NavigatorRoute): void {\n        this._enqueueCommand({\n            type: CommandType.Replace,\n            param: {\n                route: route,\n            },\n        });\n    }\n\n    replacePrevious(route: NavigatorRoute): void {\n        this._enqueueCommand({\n            type: CommandType.Replace,\n            param: {\n                route: route,\n                value: -1,\n            },\n        });\n    }\n\n    // This method replaces the route at the given index of the stack and pops to that index.\n    replaceAtIndex(route: NavigatorRoute, index: number): void {\n        const routes = this.getRoutes();\n\n        // Pop to index route and then replace if not last one\n        if (index < routes.length - 1) {\n            const route = routes[index];\n            this.popToRoute(route);\n        }\n\n        // Schedule a replace\n        this.replace(route);\n    }\n\n    // Reset route stack with default route stack\n    immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void {\n        this._delegate.immediatelyResetRouteStack(nextRouteStack);\n    }\n\n    popToRoute(route: NavigatorRoute): void {\n        this._enqueueCommand({\n            type: CommandType.Pop,\n            param: {\n                route: route,\n            },\n        });\n    }\n\n    popToTop(): void {\n        this._enqueueCommand({\n            type: CommandType.Pop,\n            param: {\n                value: -1,\n            },\n        });\n    }\n\n    getCurrentRoutes(): NavigatorRoute[] {\n        return this.getRoutes();\n    }\n\n    // Render without initial route to get a reference for Navigator object\n    render(): JSX.Element {\n        return this._delegate.render();\n    }\n\n    private _enqueueCommand(command: NavigationCommand): void {\n        this._commandQueue.push(command);\n        this._processCommand();\n    }\n\n    private _processCommand(): void {\n        this._delegate.processCommand(this._commandQueue);\n    }\n}\n\nexport default NavigatorImpl;\nexport const Navigator = NavigatorImpl;\nexport const NavigatorDelegateSelector = new DefaultDelegateSelector();\nexport { Types };\n"
  },
  {
    "path": "extensions/navigation/src/native-common/NavigatorExperimentalDelegate.tsx",
    "content": "/**\n * NavigatorExperimentalDelegate.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Delegate which encapsulates experimental react-native Navigator experience.\n * The main difference of Experimental Navigator is that it uses Animated for navigation animation\n * so we can enable useNativeDriver options for those animations.\n *\n * Currently, Android support on NativeAnimations is more stable and performant than iOS.\n * That's why we need to have the ability to pick different implementations for different platforms.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RX from 'reactxp';\nimport * as Navigation from 'reactxp-experimental-navigation';\n\nimport assert from '../common/assert';\nimport * as _ from '../common/lodashMini';\nimport {\n    CommandType,\n    CustomNavigatorSceneConfig,\n    Navigator,\n    NavigatorSceneConfigType,\n    NavigationCommand,\n    NavigatorDelegate,\n    NavigatorRoute,\n    NavigatorState,\n} from '../common/Types';\n\ntype NavigationSceneRendererProps = Navigation.NavigationSceneRendererProps;\ntype NavigationState = Navigation.NavigationState;\ntype NavigationRoute = Navigation.NavigationRoute;\ntype NavigationTransitionProps = Navigation.NavigationTransitionProps;\n\nconst StateUtils = Navigation.StateUtils;\n\ninterface NavigationRouteState extends NavigationRoute {\n    route: NavigatorRoute;\n}\n\ninterface TransitionSpec {\n    enableGesture: boolean;\n    direction: Navigation.NavigationGestureDirection;\n    gestureResponseDistance: number;\n    customTransitionConfig?: Navigation.NavigationCustomTransitionConfig;\n    cardStyle?: RX.Types.ViewStyleRuleSet;\n    hideShadow?: boolean;\n}\n\nexport class NavigatorExperimentalDelegate extends NavigatorDelegate {\n\n    private _state: Navigation.NavigationState;\n    private _transitionSpec: TransitionSpec;\n\n    constructor(navigator: Navigator<NavigatorState>) {\n        super(navigator);\n        const route: NavigationRouteState = { key: '0', route: { routeId: 0, sceneConfigType: 0 } };\n        this._state = { index: 0, routes: [route] };\n        this._transitionSpec = this._buildTransitionSpec(this._state);\n    }\n\n    getRoutes(): NavigatorRoute[] {\n        return _.map(this._state.routes, element => {\n            const routeState = element as NavigationRouteState;\n            return routeState.route;\n        });\n    }\n\n    // Reset route stack with default route stack\n    immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void {\n        const prevState = this._state;\n        this._state = this._createParentState(nextRouteStack, prevState);\n        this._transitionSpec = this._buildTransitionSpec(this._state);\n        this._owner.setState({ state: this._state });\n    }\n\n    // Render without initial route to get a reference for Navigator object\n    render(): JSX.Element {\n        return (\n            <Navigation.CardStack\n                direction={ this._transitionSpec.direction }\n                customTransitionConfig={ this._transitionSpec.customTransitionConfig }\n                navigationState={ this._state }\n                onNavigateBack={ this._onNavigateBack }\n                onTransitionStart={ this._onTransitionStart }\n                onTransitionEnd={ this._onTransitionEnd }\n                renderScene={ this._renderScene }\n                cardStyle={ this._transitionSpec.cardStyle || this._owner.props.cardStyle }\n                hideShadow={ this._transitionSpec.hideShadow }\n                enableGestures={ this._transitionSpec.enableGesture }\n                gestureResponseDistance={ this._transitionSpec.gestureResponseDistance }\n            />\n        );\n    }\n\n    private _convertCustomTransitionConfig(\n            config: CustomNavigatorSceneConfig | undefined): Navigation.NavigationCustomTransitionConfig | undefined {\n        if (!config) {\n            return undefined;\n        }\n\n        const nativeConfig: Navigation.NavigationCustomTransitionConfig = {\n            transitionStyle: config.transitionStyle,\n            presentBelowPrevious: config.presentBelowPrevious,\n        };\n\n        if (config.transitionSpec) {\n            const transitionSpec: Navigation.NavigationTransitionSpec = {};\n            if (config.transitionSpec.duration) {\n                transitionSpec.duration = config.transitionSpec.duration;\n            }\n            if (config.transitionSpec.easing) {\n                transitionSpec.easing = config.transitionSpec.easing.function;\n            }\n\n            nativeConfig.transitionSpec = transitionSpec;\n\n        }\n\n        return nativeConfig;\n    }\n\n    private _buildTransitionSpec(state: Navigation.NavigationState): TransitionSpec {\n        const route = (state.routes[state.index] as NavigationRouteState).route;\n        let direction: Navigation.NavigationGestureDirection = 'horizontal';\n        let customSceneConfig: Navigation.NavigationCustomTransitionConfig | undefined;\n        let enableGesture = false;\n        let responseDistance = 0;\n        const hideShadow = route && route.customSceneConfig && route.customSceneConfig.hideShadow;\n        const cardStyle: RX.Types.ViewStyleRuleSet | undefined = route && route.customSceneConfig\n            ? route.customSceneConfig.cardStyle\n            : undefined;\n        let gestureDistanceSet = false;\n\n        if (route) {\n            // If defined, use the gestureResponseDistance override\n            if (route.gestureResponseDistance !== undefined && route.gestureResponseDistance !== null) {\n                responseDistance = route.gestureResponseDistance;\n                gestureDistanceSet = true;\n            }\n            customSceneConfig = this._convertCustomTransitionConfig(route.customSceneConfig);\n            switch (route.sceneConfigType) {\n                case NavigatorSceneConfigType.FloatFromBottom:\n                    direction = 'vertical';\n                    if (!gestureDistanceSet) {\n                        responseDistance = 150;\n                        gestureDistanceSet = true;\n                    }\n                    break;\n                case NavigatorSceneConfigType.Fade:\n                case NavigatorSceneConfigType.FadeWithSlide:\n                    direction = 'fade';\n                    if (!gestureDistanceSet) {\n                        responseDistance = 0;\n                        gestureDistanceSet = true;\n                    }\n                    break;\n                // Currently we support only right to left animation\n                // case NavigatorSceneConfigType.FloatFromRight:\n                // case NavigatorSceneConfigType.FloatFromLeft:\n                default:\n                    break;\n            }\n        }\n\n        // Fall back to 30 as a default for responseDistance\n        if (!gestureDistanceSet) {\n            responseDistance = 30;\n        }\n        // Conditionally enable gestures\n        enableGesture = responseDistance > 0;\n\n        return {\n            enableGesture: enableGesture,\n            gestureResponseDistance: responseDistance,\n            direction: direction,\n            customTransitionConfig: customSceneConfig,\n            cardStyle: cardStyle,\n            hideShadow: hideShadow,\n        };\n    }\n\n    private _onTransitionEnd = () => {\n        this._transitionSpec = this._buildTransitionSpec(this._state);\n        this._owner.setState({ state: this._state });\n\n        if (this._owner.props.transitionCompleted) {\n            this._owner.props.transitionCompleted();\n        }\n    };\n\n    private _onTransitionStart = (transitionProps: NavigationTransitionProps, prevTransitionProps?: NavigationTransitionProps) => {\n        if (this._owner.props.transitionStarted) {\n            const fromIndex = prevTransitionProps && prevTransitionProps.scene ? prevTransitionProps.scene.index : undefined;\n            const toIndex = transitionProps.scene ? transitionProps.scene.index : undefined;\n            const fromRouteId = prevTransitionProps && prevTransitionProps.scene ? prevTransitionProps.scene.route.key : undefined;\n            const toRouteId = transitionProps.scene ? transitionProps.scene.route.key : undefined;\n            this._owner.props.transitionStarted(\n                transitionProps.position,\n                toRouteId,\n                fromRouteId,\n                toIndex,\n                fromIndex);\n        }\n    };\n\n    // Callback from Navigator.js to RX.Navigator\n    private _renderScene = (props: NavigationSceneRendererProps): JSX.Element => {\n        const parentState: NavigationState = props.navigationState;\n        const sceneState: NavigationRouteState = parentState.routes[props.scene.index] as NavigationRouteState;\n\n        // Does the route exist?\n        if (sceneState && sceneState.route) {\n            // Call the renderScene callback.\n            return this._owner.props.renderScene(sceneState.route);\n        }\n\n        // No route? Return empty scene.\n        return <RN.View />;\n    };\n\n    handleBackPress(): void {\n        this._owner.pop();\n    }\n\n    processCommand(commandQueue: NavigationCommand[]): void {\n        // Return if nothing to process\n        if (!commandQueue.length) {\n            return;\n        }\n        const previousState: NavigationState = this._state;\n\n        let useNewStateAsScene = false;\n\n        const command = commandQueue.shift()!;\n        const route = command.param.route;\n        const value = command.param.value;\n\n        switch (command.type) {\n            case CommandType.Push:\n                useNewStateAsScene = true;\n                this._state = StateUtils.push(this._state, this._createState(route));\n                break;\n\n            case CommandType.Pop:\n                if (route !== undefined) {\n                    this._state = this._popToRoute(this._state, route);\n                } else if (value !== undefined) {\n                    if (value > 0) {\n                        this._state = this._popN(this._state, value);\n                    } else {\n                        this._state = this._popToTop(this._state);\n                    }\n                } else {\n                    this._state = StateUtils.pop(this._state);\n                }\n\n                break;\n\n            case CommandType.Replace:\n                if (value === -1) {\n                    this._state = StateUtils.replaceAtIndex(this._state, this._state.routes.length - 2,\n                        this._createState(route));\n                } else {\n                    this._state = StateUtils.replaceAtIndex(this._state, this._state.routes.length - 1,\n                        this._createState(route));\n                }\n\n                break;\n\n            default:\n                console.error('Undefined Navigation command: ', command.type);\n                break;\n        }\n\n        if (previousState !== this._state) {\n            if (useNewStateAsScene) {\n                this._transitionSpec = this._buildTransitionSpec(this._state);\n            } else {\n                this._transitionSpec = this._buildTransitionSpec(previousState);\n            }\n\n            this._owner.setState({ state: this._state });\n        }\n    }\n\n    /**\n     * This method is going to be deprecated in later releases\n    */\n    private _onNavigateBack = () => {\n        this.onBackPress();\n    };\n\n    private _createState(route: NavigatorRoute): NavigationRouteState {\n        return { key: route.routeId.toString(), route: route };\n    }\n\n    private _createParentState(routes: NavigatorRoute[], prevState: NavigationState): NavigationState {\n        const prevRoutes = prevState.routes as NavigationRouteState[];\n        const children = _.map(routes, (element: NavigatorRoute, index: number) => {\n            if (prevRoutes.length > index) {\n                const prevRoute = prevRoutes[index];\n                // Navigator state reducer is a little bit naive,\n                // let's make sure it's scene rendering caching would work properly\n                if (prevRoute.route.routeId === element.routeId) {\n                    return prevRoute;\n                }\n            }\n            return this._createState(element);\n        });\n\n        return { routes: children, index: routes.length - 1 };\n    }\n\n    private _popToTop(state: NavigationState): NavigationState {\n        const popCount: number = state.routes.length - 1;\n        if (popCount > 0) {\n            return this._popN(state, popCount);\n        }\n\n        return state;\n    }\n\n    private _popN(state: NavigationState, n: number): NavigationState {\n        assert(n > 0, 'n < 0 please pass positive value');\n        const initialRoutes = state.routes;\n        const initialLength = initialRoutes.length;\n        assert(initialLength >= n, 'navigation stack underflow');\n\n        const result: NavigationState = _.clone(state);\n        result.routes = initialRoutes.slice(0, initialLength - n);\n        result.index = initialLength - n - 1;\n        return result;\n    }\n\n    private _popToRoute(state: NavigationState, route: NavigatorRoute): NavigationState {\n        let popCount = 0;\n        for (let i = state.routes.length - 1; i >= 0; i--) {\n            const child = state.routes[i] as NavigationRouteState;\n            if (route.routeId === child.route.routeId) {\n                break;\n            } else {\n                popCount++;\n            }\n        }\n\n        if (popCount > 0) {\n            return this._popN(state, popCount);\n        } else {\n            return state;\n        }\n    }\n}\n\nexport default NavigatorExperimentalDelegate;\n"
  },
  {
    "path": "extensions/navigation/src/typings/react-native-deprecated-custom-components.d.ts",
    "content": "declare module 'react-native-deprecated-custom-components' {\n    import * as RN from 'react-native';\n\n    interface NavigatorProps extends RN.ComponentPropsBase {\n        configureScene?: Function;\n        initialRoute?: any;\n        initialRouteStack?: any[];\n        navigatorBar?: any;\n        navigator?: Navigator;\n        onDidFocus?: Function; // deprecated\n        onWillFocus?: Function; // deprecated\n        renderScene: Function;\n        sceneStyle?: RN.StyleRuleSet | RN.StyleRuleSet[];\n    }\n\n    class Navigator extends RN.ReactNativeBaseComponent<NavigatorProps, {}> {\n        static SceneConfigs: {\n            PushFromRight: any;\n            FloatFromRight: any;\n            FloatFromLeft: any;\n            FloatFromBottom: any;\n            FloatFromBottomAndroid: any;\n            FadeAndroid: any;\n            HorizontalSwipeJump: any;\n        };\n        getCurrentRoutes(): any[];\n        jumpBack(): void;\n        jumpForward(): void;\n        jumpTo(route: any): void;\n        push(route: any): void;\n        pop(): void;\n        replace(route: any): void;\n        replaceAtIndex(route: any, index: number): void;\n        replacePrevious(route: any): void;\n        immediatelyResetRouteStack(routeStack: any[]): void;\n        popToRoute(route: any): void;\n        popToTop(): void;\n    }\n}\n"
  },
  {
    "path": "extensions/navigation/src/typings/rebound.d.ts",
    "content": "declare module 'rebound' {\n    class SpringSystem {\n        createSpring(): any;\n    }\n}\n"
  },
  {
    "path": "extensions/navigation/src/web/Navigator.tsx",
    "content": "﻿/*\n * Navigator.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web specific implementation of Navigator. This is inspired from React.Navigator.\n * This component is set with props, which are callback methods. It is primarily driven\n * by state updates instigated by its public helpers like immediatelyResetRouteStack, push,\n * pop, which update the state and cause transitions.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as RX from 'reactxp';\nimport * as rebound from 'rebound';\nimport { Styles, View } from 'reactxp';\n\nimport * as _ from '../common/lodashMini';\nimport * as Types from '../common/Types';\nimport {\n    NavigatorDelegateSelector as DelegateSelector,\n    NavigatorState as BaseNavigatorState,\n    Navigator as NavigatorBase,\n    NavigatorProps,\n} from '../common/Types';\n\nimport { NavigatorSceneConfigFactory, NavigatorSceneConfig } from './NavigatorSceneConfigFactory';\n\n// [Bug:506870] Move web navigator to RX animated API\nexport interface SpringSystem {\n    createSpring(): any;\n}\n\nexport interface Spring {\n    setRestSpeedThreshold?: (restSpeed: number) => void;\n    setCurrentValue?: (val: number) => any;\n    addListener?: (obj: any) => any;\n    getCurrentValue? (): any;\n    setOvershootClampingEnabled? (a: boolean): void;\n    getSpringConfig? (): any;\n    setVelocity?(velocity: any): any;\n    setEndValue?(endVal: number): any;\n}\n\n// Default styles\nconst _styles = {\n    container: Styles.createViewStyle({\n        flex: 1,\n        flexDirection: 'column',\n        alignSelf: 'stretch',\n        overflow: 'hidden',\n    }),\n    defaultSceneStyle: Styles.createViewStyle({\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        bottom: 0,\n        top: 0,\n    }),\n    baseScene: Styles.createViewStyle({\n        position: 'absolute',\n        overflow: 'hidden',\n        left: 0,\n        right: 0,\n        bottom: 0,\n        top: 0,\n    }),\n    disabledScene: Styles.createViewStyle({\n        top: 0,\n        bottom: 0,\n        flex: 1,\n    }),\n    transitioner: Styles.createViewStyle( {\n        flex: 1,\n        flexDirection: 'column',\n        backgroundColor: 'transparent',\n        overflow: 'hidden',\n        alignItems: 'stretch',\n    }),\n    sceneStyle: Styles.createViewStyle({\n        flex: 1,\n        shadowOffset: { height: 0, width: 0 },\n        shadowRadius: 40,\n        shadowColor: 'rgba(0, 0, 0, 0.2)',\n    }),\n};\n\n// Transition types\nexport type TransitionToCallback = () => void;\nexport type ReplaceAtIndexCallback = () => void;\n\nexport interface TransitionToQueueItem {\n    // The destination route index.\n    destIndex: number;\n\n    // The callback to call after this transition is finished.\n    transitionFinished: TransitionToCallback;\n\n    // This velocity will be passed to the spring system for transitioning. If no velocity is specified, a default value\n    // will be used.\n    velocity: number;\n}\n\nexport interface NavigatorState extends BaseNavigatorState {\n    // Current stack of animation configurations for a scene\n    sceneConfigStack?: NavigatorSceneConfig[];\n\n    // The current stack of user-defined route objects.\n    routeStack?: Types.NavigatorRoute[];\n\n    // The currently presented route index.\n    presentedIndex?: number;\n\n    // During transition, the presentedIndex will be updated at the beginning and transitionFromIndex will be set to the\n    // previous index.\n    transitionFromIndex?: number;\n\n    // If told to transition while another transition is occurring, it will be added to this queue and executed after.\n    transitionQueue?: TransitionToQueueItem[];\n\n    // The callback to call after the current transition is finished.\n    transitionFinished?: TransitionToCallback;\n}\n\nexport class NavigatorImpl extends NavigatorBase<NavigatorState> {\n    // Keep a map of all rendered scenes, keyed off their routeId\n    private _renderedSceneMap: { [routeId: number]: JSX.Element } = {};\n\n    // References to mounted components.\n    private _containerRef: RX.View | null;\n    private _sceneRefs: { [sceneIndex: string]: RX.View } = {};\n\n    // Save a public reference to the parent navigator if one was given in props.\n    navigatorReference: Navigator;\n\n    // [Bug:506870] Move web navigator to RX animated API\n    // Spring system and spring used for transitions.\n    springSystem: SpringSystem;\n    spring: Spring;\n\n    // Cache the dimensions of the navigator so scenes can transition with that size in mind.\n    private _dimensions: RX.Types.Dimensions;\n\n    // Receives initial props and sets initial state for Navigator\n    constructor(initialProps?: NavigatorProps) {\n        super(initialProps);\n\n        // Default navigator state\n        this.state = {\n            sceneConfigStack: [],\n            routeStack: [],\n            presentedIndex: 0,\n            transitionFromIndex: undefined,\n            transitionQueue: [],\n        };\n    }\n\n    UNSAFE_componentWillMount() {\n        this.springSystem = new rebound.SpringSystem();\n        this.spring = this.springSystem.createSpring();\n        this.spring.setRestSpeedThreshold(0.05);\n        this.spring.setCurrentValue(0).setAtRest();\n        this.spring.addListener({\n            onSpringUpdate: () => {\n                this._handleSpringUpdate();\n            },\n            onSpringAtRest: () => {\n                this._completeTransition();\n            },\n        });\n    }\n\n    componentDidMount() {\n        this._updateDimensionsCache();\n        this._handleSpringUpdate();\n    }\n\n    componentDidUpdate() {\n        this._updateDimensionsCache();\n    }\n\n    render() {\n        const newRenderedSceneMap: { [routeId: number]: JSX.Element } = {};\n        let scenes: JSX.Element[];\n\n        if (this.state.routeStack.length > 0) {\n            scenes = this.state.routeStack.map((route, index) => {\n                let renderedScene: JSX.Element;\n\n                if (this._renderedSceneMap[route.routeId] &&\n                    index !== this.state.presentedIndex) {\n                    renderedScene = this._renderedSceneMap[route.routeId];\n                } else {\n                    renderedScene = this._renderNavigatorScene(route, index);\n                }\n\n                newRenderedSceneMap[route.routeId] = renderedScene;\n\n                return renderedScene;\n            });\n        } else {\n            scenes = [];\n        }\n\n        this._renderedSceneMap = _.clone(newRenderedSceneMap);\n\n        return (\n            <View\n                key={ 'container' }\n                style={ _styles.container }\n            >\n                <View\n                    style={ _styles.transitioner }\n                    ref={ this._onMountContainer }\n                >\n                    { scenes }\n                </View>\n            </View>\n        );\n    }\n\n    // Public Navigator Helper methods. These methods modify Navigator state, which kicks of\n    // re-renders for the Navigator\n    jumpTo(route: Types.NavigatorRoute): void {\n        const destIndex = this.state.routeStack.indexOf(route);\n        this._jumpN(destIndex - this.state.presentedIndex);\n    }\n\n    jumpForward(): void {\n        this._jumpN(1);\n    }\n\n    jumpBack(): void {\n        this._jumpN(-1);\n    }\n\n    push(route: Types.NavigatorRoute): void {\n        this._invariant(!!route, 'Must supply route to push');\n        const activeLength = this.state.presentedIndex + 1;\n        const activeStack = this.state.routeStack.slice(0, activeLength);\n        const activeAnimationConfigStack = this.state.sceneConfigStack.slice(0, activeLength);\n        const nextStack = activeStack.concat([route]);\n        const destIndex = nextStack.length - 1;\n        const nextAnimationConfigStack: NavigatorSceneConfig [] = activeAnimationConfigStack.concat([\n            this._getSceneConfigFromRoute(route),\n        ]);\n\n        this.setState({\n            routeStack: nextStack,\n            sceneConfigStack: nextAnimationConfigStack,\n        }, () => {\n            this._enableScene(destIndex);\n            this._transitionTo(destIndex);\n        });\n    }\n\n    immediatelyResetRouteStack(nextRouteStack: Types.NavigatorRoute[]): void {\n        const destIndex = nextRouteStack.length - 1;\n\n        this.setState({\n            // Build a sceneConfigStack\n            sceneConfigStack: _.map(nextRouteStack, route => this._getSceneConfigFromRoute(route)),\n            routeStack: nextRouteStack,\n            presentedIndex: destIndex,\n            transitionFromIndex: undefined,\n            transitionQueue: [],\n        }, () => {\n            this._handleSpringUpdate();\n            if (destIndex >= 0) {\n                this._enableScene(destIndex, true);\n            }\n        });\n    }\n\n    pop(): void {\n        if (this.state.transitionQueue.length) {\n            // This is the workaround to prevent user from firing multiple `pop()` calls that may pop the routes beyond\n            // the limit. Because `this.state.presentedIndex` does not update until the transition starts, we can't\n            // reliably use `this.state.presentedIndex` to know whether we can safely keep popping the routes or not at\n            // this moment.\n            return;\n        }\n\n        if (this.state.presentedIndex > 0) {\n            this._popN(1);\n        }\n    }\n\n    // This method replaces the route at the given index of the stack and pops to that index.\n    replaceAtIndex(route: Types.NavigatorRoute, index: number): void {\n        this._invariant(!!route, 'Must supply route to replace');\n\n        if (index < 0) {\n            index += this.state.routeStack.length;\n        }\n\n        if (this.state.routeStack.length <= index) {\n            return;\n        }\n\n        const nextRouteStack = this.state.routeStack.slice(0, index + 1);\n        const nextAnimationModeStack = this.state.sceneConfigStack.slice(0, index + 1);\n        nextRouteStack[index] = route;\n        nextAnimationModeStack[index] = this._getSceneConfigFromRoute(route);\n\n        this.setState({\n            routeStack: nextRouteStack,\n            sceneConfigStack: nextAnimationModeStack,\n        });\n    }\n\n    replace(route: Types.NavigatorRoute): void {\n        this.replaceAtIndex(route, this.state.presentedIndex);\n    }\n\n    replacePrevious(route: Types.NavigatorRoute): void {\n        this.replaceAtIndex(route, this.state.presentedIndex - 1);\n    }\n\n    popToTop(): void {\n        this.popToRoute(this.state.routeStack[0]);\n    }\n\n    popToRoute(route: Types.NavigatorRoute): void {\n        const indexOfRoute = this.state.routeStack.indexOf(route);\n        this._invariant(indexOfRoute !== -1, 'Calling popToRoute for a route that doesn\\'t exist!');\n\n        const numToPop = this.state.presentedIndex - indexOfRoute;\n        this._popN(numToPop);\n    }\n\n    replacePreviousAndPop(route: Types.NavigatorRoute): void {\n        if (this.state.routeStack.length < 2) {\n            return;\n        }\n\n        this.replacePrevious(route);\n        this.pop();\n    }\n\n    getCurrentRoutes(): Types.NavigatorRoute[] {\n        // Clone before returning to avoid caller mutating the stack.\n        return this.state.routeStack.slice();\n    }\n\n    private _onMountContainer = (comp: RX.View | null) => {\n        this._containerRef = comp;\n    };\n\n    private _updateDimensionsCache() {\n        if (this._containerRef) {\n            const transitioner = ReactDOM.findDOMNode(this._containerRef) as HTMLElement | null;\n            if (transitioner) {\n                this._dimensions = {\n                    width: transitioner.offsetWidth,\n                    height: transitioner.offsetHeight,\n                };\n            }\n        }\n    }\n\n    // Helper method to extract Navigator's Scene config from the route\n    private _getSceneConfigFromRoute(route: Types.NavigatorRoute): NavigatorSceneConfig {\n        // route exists? query the factory to generate a scene configuration\n        if (route) {\n            return NavigatorSceneConfigFactory.createConfig(route.sceneConfigType);\n        }\n        return undefined;\n    }\n\n    // Render a scene for the navigator\n    private _renderNavigatorScene(route: Types.NavigatorRoute, index: number): JSX.Element {\n        const styles: RX.Types.ViewStyleRuleSet[] = [_styles.baseScene, _styles.sceneStyle, _styles.defaultSceneStyle];\n\n        if (index !== this.state.presentedIndex) {\n            // update styles\n            styles.push(_styles.disabledScene);\n        }\n\n        // Wraps the callback passed as a prop to Navigator to render the scene\n        return (\n            <View\n                key={ 'scene_' + this._getRouteID(route) }\n                ref={ comp => this._onMountScene(comp, index) }\n                style={ styles }\n            >\n                { this.props.renderScene(route) }\n            </View>\n        );\n    }\n\n    private _onMountScene(comp: RX.View | null, sceneIndex: number) {\n        const sceneId = 'scene_' + sceneIndex;\n\n        if (!comp) {\n            delete this._sceneRefs[sceneId];\n        } else {\n            this._sceneRefs[sceneId] = comp;\n        }\n    }\n\n    // Push a scene below the others so they don't block touches sent to the presented scenes.\n    private _disableScene(sceneIndex: number) {\n        const sceneId = 'scene_' + sceneIndex;\n\n        if (this._sceneRefs[sceneId]) {\n            this._setNativeStyles(this._sceneRefs[sceneId], {\n                opacity: 0,\n                zIndex: -10,\n            });\n        }\n    }\n\n    // Add styles on the scene - At this time, the scene should be mounted and sitting in the\n    // DOM. We are just adding giving styles to this current scene.\n    private _enableScene(sceneIndex: number, force = false) {\n        const sceneStyle = Styles.combine([_styles.baseScene, _styles.sceneStyle, _styles.defaultSceneStyle]) as any;\n\n        // Then restore the top value for this scene.\n        const enabledSceneNativeProps = {\n            style: {\n                top: sceneStyle.top,\n                bottom: sceneStyle.bottom,\n                opacity: 1,\n                zIndex: 0,\n                transform: '',\n            },\n        };\n\n        if (!force && sceneIndex !== this.state.transitionFromIndex &&\n            sceneIndex !== this.state.presentedIndex) {\n            // If we are not in a transition from this index, make sure opacity is 0 to prevent the enabled scene from\n            // flashing over the presented scene.\n            (enabledSceneNativeProps.style as any).opacity = 0;\n        }\n\n        const sceneId = 'scene_' + sceneIndex;\n        if (this._sceneRefs[sceneId]) {\n            this._setNativeStyles(this._sceneRefs[sceneId], enabledSceneNativeProps.style);\n        }\n    }\n\n    private _transitionTo(destIndex: number, velocity?: number, jumpSpringTo?: number, cb?: TransitionToCallback) {\n        // If we're already presenting this index, bail here.\n        if (destIndex === this.state.presentedIndex) {\n            return;\n        }\n\n        // If we're already transitioning to another index, queue this one.\n        if (this.state.transitionFromIndex !== undefined) {\n            const newTransitionQueue = _.cloneDeep(this.state.transitionQueue);\n            newTransitionQueue.push({\n                destIndex: destIndex,\n                velocity: velocity,\n                transitionFinished: cb,\n            });\n            // set new transition queue\n            this.setState ({ transitionQueue: newTransitionQueue });\n            return;\n        }\n\n        // Set new state values.\n        this.setState({\n            transitionFromIndex: this.state.presentedIndex,\n            presentedIndex: destIndex,\n            transitionFinished: cb,\n        });\n\n        // Grab the scene config from the route we're leaving.\n        const sceneConfig = this.state.sceneConfigStack[this.state.transitionFromIndex] ||\n            this.state.sceneConfigStack[this.state.presentedIndex];\n        this._invariant(!!sceneConfig, 'Cannot configure scene at index ' + this.state.transitionFromIndex);\n\n        // Set the spring in motion. Updates will trigger _handleSpringUpdate.\n        if (jumpSpringTo !== undefined) {\n            this.spring.setCurrentValue(jumpSpringTo);\n        }\n        this.spring.setOvershootClampingEnabled(true);\n        this.spring.getSpringConfig().friction = sceneConfig.springFriction;\n        this.spring.getSpringConfig().tension = sceneConfig.springTension;\n        this.spring.setVelocity(velocity || sceneConfig.defaultTransitionVelocity);\n        this.spring.setEndValue(1);\n\n        if (this.props.transitionStarted) {\n            this.props.transitionStarted();\n        }\n    }\n\n    private _completeTransition() {\n        const newState: NavigatorState = {};\n\n        this.setState({\n            transitionFromIndex: undefined,\n        });\n        this.spring.setCurrentValue(0).setAtRest();\n        this._hideScenes();\n\n        // Do we have pending transitions? trigger transitions then\n        if (this.state.transitionQueue.length) {\n            const newTransitionQueue = _.cloneDeep(this.state.transitionQueue);\n            const queuedTransition = newTransitionQueue.shift();\n\n            // add styles on the scene we are about to transition to\n            this._enableScene(queuedTransition.destIndex);\n\n            this._transitionTo(\n                queuedTransition.destIndex,\n                queuedTransition.velocity,\n                undefined,\n                queuedTransition.transitionFinished,\n            );\n\n            if (this.state.transitionFinished) {\n                this.state.transitionFinished();\n                newState.transitionFinished = undefined;\n            }\n\n            newState.transitionQueue = newTransitionQueue;\n\n            // New setState\n            this.setState(newState);\n        } else {\n            if (this.props.transitionCompleted) {\n                this.props.transitionCompleted();\n            }\n\n            if (this.state.transitionFinished) {\n                this.state.transitionFinished();\n            }\n        }\n    }\n\n    private _hideScenes() {\n        for (let i = 0; i < this.state.routeStack.length; i++) {\n            if (i === this.state.presentedIndex ||\n                i === this.state.transitionFromIndex) {\n                continue;\n            }\n\n            this._disableScene(i);\n        }\n    }\n\n    // This happens for each frame of either a gesture or a transition. If both are happening, we only set values for\n    // the transition and the gesture will catch up later.\n    private _handleSpringUpdate() {\n        // Prioritize handling transition in progress over a gesture:\n        if (this.state.transitionFromIndex !== undefined) {\n            this._transitionBetween(\n                this.state.transitionFromIndex,\n                this.state.presentedIndex,\n                this.spring.getCurrentValue(),\n            );\n        }\n    }\n\n    private _transitionSceneStyle(fromIndex: number, toIndex: number, progress: number, index: number) {\n        const sceneId = 'scene_' + index;\n        const viewAtIndex = this._sceneRefs[sceneId];\n        if (viewAtIndex === undefined) {\n            return;\n        }\n\n        // Use toIndex animation when we move forwards. Use fromIndex when we move back.\n        const sceneConfigIndex = fromIndex < toIndex ? toIndex : fromIndex;\n        let sceneConfig = this.state.sceneConfigStack[sceneConfigIndex];\n\n        // This happens for overswiping when there is no scene at toIndex.\n        if (!sceneConfig) {\n            sceneConfig = this.state.sceneConfigStack[sceneConfigIndex - 1];\n        }\n\n        const styleToUse: RX.Types.ViewStyleRuleSet = {};\n        const useFn = index < fromIndex || index < toIndex ?\n            sceneConfig.animationInterpolators.out :\n            sceneConfig.animationInterpolators.into;\n        const directionAdjustedProgress = fromIndex < toIndex ? progress : 1 - progress;\n        const didChange = useFn(styleToUse, this._dimensions, directionAdjustedProgress);\n        if (didChange) {\n            this._setNativeStyles(viewAtIndex, styleToUse);\n        }\n    }\n\n    private _transitionBetween(fromIndex: number, toIndex: number, progress: number) {\n        this._transitionSceneStyle(fromIndex, toIndex, progress, fromIndex);\n        this._transitionSceneStyle(fromIndex, toIndex, progress, toIndex);\n    }\n\n    private _getDestIndexWithinBounds(n: number) {\n        const currentIndex = this.state.presentedIndex;\n        const destIndex = currentIndex + n;\n        this._invariant(destIndex >= 0, 'Cannot jump before the first route.');\n\n        const maxIndex = this.state.routeStack.length - 1;\n        this._invariant(maxIndex >= destIndex, 'Cannot jump past the last route.');\n\n        return destIndex;\n    }\n\n    private _jumpN(n: number) {\n        const destIndex = this._getDestIndexWithinBounds(n);\n        this._invariant(destIndex !== -1, 'Cannot jump to route that is not in the route stack');\n\n        this._enableScene(destIndex);\n        this._transitionTo(destIndex);\n    }\n\n    private _popN(n: number) {\n        if (n === 0) {\n            return;\n        }\n\n        this._invariant(this.state.presentedIndex - n >= 0, 'Cannot pop below zero');\n\n        const popIndex = this.state.presentedIndex - n;\n        this._enableScene(popIndex);\n\n        this._transitionTo(\n            popIndex,\n            undefined, // default velocity\n            undefined, // no spring jumping\n            () => this._cleanScenesPastIndex(popIndex),\n        );\n    }\n\n    private _cleanScenesPastIndex(index: number) {\n        const newStackLength = index + 1;\n\n        // Remove any unneeded rendered routes.\n        if (newStackLength < this.state.routeStack.length) {\n            this.setState({\n                sceneConfigStack: this.state.sceneConfigStack.slice(0, newStackLength),\n                routeStack: this.state.routeStack.slice(0, newStackLength),\n            });\n        }\n    }\n\n    // Get routeId for the incoming route\n    private _getRouteID(route: Types.NavigatorRoute): number {\n        return route.routeId;\n    }\n\n    // Define an inconstiant method like React.Navigator\n    private _invariant(test: boolean, failureMessage: string) {\n        if (!test) {\n            throw failureMessage;\n        }\n    }\n\n    // Manually override the styles in the DOM for the given component. This method is a hacky equivalent of React Native's\n    // setNativeProps.\n    private _setNativeStyles(component: React.ReactInstance, currentStyles: any) {\n        // Grab the actual element from the DOM.\n        const element = ReactDOM.findDOMNode(component) as HTMLElement|null;\n        if (element) {\n            const flatStyles: RX.Types.ViewStyleRuleSet = Array.isArray(currentStyles) ? _.flatten(currentStyles) : currentStyles;\n\n            // Modify styles\n            _.assign(element.style, flatStyles);\n        }\n    }\n}\n\nexport default NavigatorImpl;\nexport const Navigator = NavigatorImpl;\nexport const NavigatorDelegateSelector: DelegateSelector = undefined;\nexport { Types };\n"
  },
  {
    "path": "extensions/navigation/src/web/NavigatorSceneConfigFactory.tsx",
    "content": "/**\n * NavigatorSceneConfigFactory.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * NavigatorSceneConfigFactory creates an 'object' of type NavigatorSceneConfig,\n * which is consumed by the Navigator. This object contains properties to execute\n * spring animation for transition between scenes. NavigatorSceneConfigFactory and\n * NavigatorSceneConfig are both exported.\n */\n\nimport * as RX from 'reactxp';\n\nimport * as _ from '../common/lodashMini';\nimport * as Types from '../common/Types';\n\n// Interpolator type, which accepts a combination of these types and returns a interpolated/calculated result\n// Interpolator wrapper, which is given as a callback method to Navigator to call the animation interpolator\nexport type Interpolator = (progress: number, dimension?: RX.Types.Dimensions) => number;\nexport type InterpolatorWrapper = (previousStyleSet: RX.Types.ViewStyleRuleSet,\n    dimensions: RX.Types.Dimensions, progress: number) => boolean;\n\n// Interface to define the transition styles for multiple views\nexport interface TransitionStyle {\n    translateX?: (progress: number, dimension: RX.Types.Dimensions) => string;\n    translateY?: (progress: number, dimension: RX.Types.Dimensions) => string;\n    translateZ?: (progress: number, dimension: RX.Types.Dimensions) => string;\n    // Note: Weird type: Either a 'function type' or a 'number'\n    opacity?: ((progress: number) => number) | number;\n    rotateX?: ((progress: number) => number) | number;\n    rotateY?: ((progress: number) => number) | number;\n    rotateZ?: ((progress: number) => number) | number;\n    scaleX?: (progress: number) => number;\n    scaleY?: (progress: number) => number;\n    scaleZ?: (progress: number) => number;\n}\n\n// Defined style interpolators for each transition type\nclass SceneConfigStyles {\n    static fadeToTheLeft: TransitionStyle = {\n        translateX: (t, dimensions) =>(t * -dimensions.width * 0.3) + 'px',\n        opacity: 1,\n    };\n\n    static fadeToTheRight: TransitionStyle = {\n        translateX: (t, dimensions) => (t * dimensions.width * 0.3) + 'px',\n        opacity: 1,\n    };\n\n    static fadeIn: TransitionStyle = {\n        opacity: t => t,\n    };\n\n    static fadeOut: TransitionStyle = {\n        opacity: t => 1 - t,\n    };\n\n    static fadeOutToTop: TransitionStyle = {\n        opacity: t => 1 - t,\n        translateY: (t, dimensions) => (t * -0.1 * dimensions.height) + 'px',\n    };\n\n    static toTheLeft: TransitionStyle = {\n        translateX: (t, dimensions) => (t * -dimensions.width) + 'px',\n    };\n\n    static toTheUp: TransitionStyle = {\n        translateY: (t, dimensions) => (t * -dimensions.height) + 'px',\n    };\n\n    static toTheDown: TransitionStyle = {\n        translateY: (t, dimensions) => (t * dimensions.height) + 'px',\n    };\n\n    static fromTheRight: TransitionStyle = {\n        opacity: 1,\n        translateX: (t, dimensions) => (dimensions.width - (t * dimensions.width)) + 'px',\n    };\n\n    static fromTheLeft: TransitionStyle = {\n        opacity: 1,\n        translateX: (t, dimensions) => (-dimensions.width + (t * dimensions.width)) + 'px',\n    };\n\n    static fromTheDown: TransitionStyle = {\n        translateY: (t, dimensions) => (dimensions.height - t * dimensions.height) + 'px',\n    };\n\n    static fromTheUp: TransitionStyle = {\n        opacity: 1,\n        translateY: (t, dimensions) => (-dimensions.height + t * dimensions.height) + 'px',\n    };\n\n    static fromTheFront: TransitionStyle = {\n        opacity: 1,\n        translateY: (t, dimensions) => (dimensions.height - t * dimensions.height) + 'px',\n    };\n\n    static toTheBack: TransitionStyle = {\n        scaleX: t => (1 - (t * 0.05)),\n        scaleY: t => (1 - (t * 0.05)),\n        opacity: 1,\n    };\n\n    // CSS requires all transforms to be combined into one transform property. bundleCompoundStyles searches a style\n    // definition for separate transforms and melts it down to a \"transform\" property.\n    static bundleCompoundStyles(styles: { [name: string]: string | number }): any {\n        const transforms: { [name: string]: string | number } = { };\n        const remaining: { [name: string]: string | number } = { };\n\n        for (const name in styles) {\n            if (styles.hasOwnProperty(name)) {\n                switch (name) {\n                    case 'translateX':\n                    case 'translateY':\n                    case 'translateZ':\n                    case 'scaleX':\n                    case 'scaleY':\n                    case 'scaleZ':\n                    case 'rotateX':\n                    case 'rotateY':\n                    case 'rotateZ':\n                        transforms[name] = styles[name];\n                        break;\n\n                    default:\n                        remaining[name] = styles[name];\n                        break;\n                }\n            }\n        }\n\n        // Add transforms into remaining object\n        if (!_.isEmpty(transforms)) {\n            remaining.transform = _.map(transforms, (val, key) => key + '(' + val + ')').join(' ');\n        }\n\n        return remaining;\n    }\n}\n\n// Navigator config class. Navigator works on the instances of this class\nexport class NavigatorSceneConfig {\n    // Rebound spring parameters when transitioning FROM this scene\n    springFriction = 26;\n    springTension = 200;\n\n    // Velocity to start at when transitioning without gesture\n    defaultTransitionVelocity = 1.5;\n\n    // Returns an object of functions that return a function\n    animationInterpolators: {\n        into: InterpolatorWrapper;\n        out: InterpolatorWrapper;\n    };\n\n    constructor(intoStyle: TransitionStyle, outStyle: TransitionStyle) {\n        // Into, Out interpolators are required to do a scene transition\n        this.animationInterpolators = {\n            into: this._styleInterpolator(intoStyle),\n            out: this._styleInterpolator(outStyle),\n        };\n    }\n\n    // Private method that hangs as a callback on animationInterpolator object\n    // It calculates new styles and updates the previousStyles object sent to decide\n    // if the animation triggered or not in the component that calls it\n    private _styleInterpolator(styles: TransitionStyle): InterpolatorWrapper {\n        return (previousStyleSet: RX.Types.ViewStyleRuleSet, dimensions: RX.Types.Dimensions, progress: number): boolean => {\n            // Calls the interpolator method for each type and calculates\n            const newStyleSet = SceneConfigStyles.bundleCompoundStyles(\n                _.mapValues(styles, (interpolator: Interpolator | number) => (\n                    _.isNumber(interpolator) ? interpolator : interpolator(progress, dimensions)\n                )) as any);\n\n            // Check if anything has changed since last frame.\n            if (_.isEqual(previousStyleSet, newStyleSet)) {\n                return false;\n            }\n\n            // Copy the new props into the previous object.\n            for (const prop in newStyleSet) {\n                if (newStyleSet.hasOwnProperty(prop)) {\n                    _.assign(previousStyleSet, {[prop]: _.get(newStyleSet, prop)});\n                }\n            }\n\n            return true;\n        };\n    }\n}\n\n// Factory class to create Navigator scene configurations for each type of transition between routes\nexport class NavigatorSceneConfigFactory {\n\n    // Helper method that creates a new Animation config for a scene\n    static createConfig(configType: Types.NavigatorSceneConfigType): NavigatorSceneConfig {\n        switch (configType) {\n            case Types.NavigatorSceneConfigType.FloatFromRight:\n                return new NavigatorSceneConfig(SceneConfigStyles.fromTheRight, SceneConfigStyles.fadeToTheLeft);\n\n            case Types.NavigatorSceneConfigType.FloatFromLeft:\n                return new NavigatorSceneConfig(SceneConfigStyles.fromTheLeft, SceneConfigStyles.fadeToTheRight);\n\n            case Types.NavigatorSceneConfigType.FloatFromBottom:\n                return new NavigatorSceneConfig(SceneConfigStyles.fromTheFront, SceneConfigStyles.toTheBack);\n\n            case Types.NavigatorSceneConfigType.Fade:\n                return new NavigatorSceneConfig(SceneConfigStyles.fadeIn, SceneConfigStyles.fadeOut);\n\n            case Types.NavigatorSceneConfigType.FadeWithSlide:\n                return new NavigatorSceneConfig(SceneConfigStyles.fadeIn, SceneConfigStyles.fadeOutToTop);\n\n            default:\n                // Float from Right\n                return new NavigatorSceneConfig(SceneConfigStyles.fromTheLeft, SceneConfigStyles.fadeToTheRight);\n        }\n    }\n}\n"
  },
  {
    "path": "extensions/navigation/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"experimentalDecorators\": true,\n        \"noImplicitAny\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"outDir\": \"dist\",\n        \"jsx\": \"react\",\n        \"lib\": [\"es5\", \"dom\"]\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"node_modules\",\n        \"dist\"\n    ]\n}\n"
  },
  {
    "path": "extensions/netinfo/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\"],\n  \"rules\": {},\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"PluginBaseChecker.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/netinfo/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\npackage-lock.json\n\n# Optional npm cache directory\n.npm\n\n# Build artifacts\n**/dist\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\n\n"
  },
  {
    "path": "extensions/netinfo/.npmignore",
    "content": "/node_modules\n/src/.vs\n/src/bin\n/src/obj\n*.user\n"
  },
  {
    "path": "extensions/netinfo/README.md",
    "content": "# reactxp-netinfo\nThis module provides cross-platform support for detecting network ionformation within the [ReactXP](https://microsoft.github.io/reactxp/) library. This used to be a part of ReactXP core, but was extracted to be a standalone module inline with React Native `Lean Core` initiative. This exists as a standalone module to prevent users of ReactXP from having to link native modules when getting started.\n\n## Getting Started\nThis module relies on [@react-native-community/netinfo](https://www.npmjs.com/packages/@react-native-community/netinfo) and will need to be linked into the react-native project.\nThis can be done by following the linking instructions in the React Native documentation or by running\n```react-native link @react-native-community/netinfo```\n\n## Documentation\nFor detailed documentation, look [here](https://microsoft.github.io/reactxp/docs/extensions/netinfo.html).\n\n### Prerequisites\n* [ReactXP](https://github.com/microsoft/reactxp/)\n\n## Contributing\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/netinfo/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/android/PluginBase.js');\n"
  },
  {
    "path": "extensions/netinfo/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/ios/PluginBase.js');\n"
  },
  {
    "path": "extensions/netinfo/index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/PluginBase.js');\n"
  },
  {
    "path": "extensions/netinfo/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/macos/PluginBase.js');"
  },
  {
    "path": "extensions/netinfo/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/windows/PluginBase.js');\n"
  },
  {
    "path": "extensions/netinfo/package.json",
    "content": "{\n  \"name\": \"reactxp-netinfo\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Plugin for ReactXP that provides information about network connectivity\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"@react-native-community/netinfo\": \"^4.6.1\"\n  },\n  \"peerDependencies\": {\n    \"reactxp\": \"^2.0.0\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"types\": \"dist/web/PluginBase.d.ts\"\n}\n"
  },
  {
    "path": "extensions/netinfo/src/android/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Android implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport NetInfo from '../native-common/NetInfo';\n\nexport { NetInfo as default, Types };\n"
  },
  {
    "path": "extensions/netinfo/src/common/Interfaces.ts",
    "content": "/*\n * Interfaces.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Interface definition for cross-platform ReactXP plugin for gathering network/connectivity\n * info. This was extracted from the reactxp core\n */\n\nimport SubscribableEvent from 'subscribableevent';\n\nimport * as Types from './Types';\n\nexport abstract class NetInfo {\n    abstract isConnected(): Promise<boolean>;\n    abstract getType(): Promise<Types.DeviceNetworkType>;\n    connectivityChangedEvent = new SubscribableEvent<(isConnected: boolean) => void>();\n}\n\nexport interface PluginInterface {\n    Types: typeof Types;\n\n    default: NetInfo;\n}\n"
  },
  {
    "path": "extensions/netinfo/src/common/PluginBaseChecker.ts",
    "content": "/*\n * PluginBaseChecker.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type check all the pluginbase exports against the desired interface.\n */\n\nimport * as AndroidPlugin from '../android/PluginBase';\nimport * as iOSPlugin from '../ios/PluginBase';\nimport * as macOSPlugin from '../macos/PluginBase';\nimport * as WebPlugin from '../web/PluginBase';\nimport * as WindowsPlugin from '../windows/PluginBase';\n\nimport * as Interfaces from './Interfaces';\n\nconst _typeCheckerAndroid: Interfaces.PluginInterface = AndroidPlugin;\nconst _typeCheckeriOS: Interfaces.PluginInterface = iOSPlugin;\nconst _typeCheckermacOS: Interfaces.PluginInterface = macOSPlugin;\nconst _typeCheckerWeb: Interfaces.PluginInterface = WebPlugin;\nconst _typeCheckerWindows: Interfaces.PluginInterface = WindowsPlugin;\n"
  },
  {
    "path": "extensions/netinfo/src/common/Types.ts",
    "content": "/*\n * Types.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definitions to support the plugin.\n */\n\nexport enum DeviceNetworkType {\n    Unknown,\n    None,\n    Wifi,\n    Mobile2G,\n    Mobile3G,\n    Mobile4G\n}\n"
  },
  {
    "path": "extensions/netinfo/src/ios/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the iOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport NetInfo from '../native-common/NetInfo';\n\nexport { NetInfo as default, Types };\n"
  },
  {
    "path": "extensions/netinfo/src/macos/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Mac implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport NetInfo from '../native-common/NetInfo';\n\nexport { NetInfo as default, Types };\n"
  },
  {
    "path": "extensions/netinfo/src/native-common/NetInfo.tsx",
    "content": "/**\n * NetInfo.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of network information APIs.\n */\n\nimport * as RNNetInfo from '@react-native-community/netinfo';\n\nimport * as Types from '../common/Types';\nimport * as Interfaces from '../common/Interfaces';\n\nexport class NetInfo extends Interfaces.NetInfo {\n    constructor() {\n        super();\n\n        const onEventOccurredHandler =  (state: RNNetInfo.NetInfoState) => {\n            this.connectivityChangedEvent.fire(state.isConnected);\n        };\n\n        RNNetInfo.addEventListener(onEventOccurredHandler);\n    }\n\n    isConnected(): Promise<boolean> {\n        return RNNetInfo.fetch()\n            .then((state: RNNetInfo.NetInfoState) => state.isConnected)\n            .catch(() => Promise.reject('NetInfo.isConnected.fetch() failed'));\n    }\n\n    getType(): Promise<Types.DeviceNetworkType> {\n        return RNNetInfo.fetch().then((state: RNNetInfo.NetInfoState) => NetInfo._getNetworkTypeFromConnectionInfo(state));\n    }\n\n    private static _getNetworkTypeFromConnectionInfo(state: RNNetInfo.NetInfoState): Types.DeviceNetworkType {\n        if (state.type === RNNetInfo.NetInfoStateType.cellular) {\n            if (state.details === null || state.details.cellularGeneration === null) {\n                return Types.DeviceNetworkType.Unknown;\n            } else if (state.details.cellularGeneration === '2g') {\n                return Types.DeviceNetworkType.Mobile2G;\n            } else if (state.details.cellularGeneration === '3g') {\n                return Types.DeviceNetworkType.Mobile3G;\n            } else if (state.details.cellularGeneration === '4g') {\n                return Types.DeviceNetworkType.Mobile4G;\n            }\n        } else if (state.type === RNNetInfo.NetInfoStateType.wifi ) {\n            return Types.DeviceNetworkType.Wifi;\n        } else if (state.type === RNNetInfo.NetInfoStateType.ethernet ) {\n            return Types.DeviceNetworkType.Wifi;\n        } else if (state.type === RNNetInfo.NetInfoStateType.wimax ) {\n            return Types.DeviceNetworkType.Wifi;\n        } else if (state.type === RNNetInfo.NetInfoStateType.none) {\n            return Types.DeviceNetworkType.None;\n        }\n\n        return Types.DeviceNetworkType.Unknown;\n    }\n}\n\nexport default new NetInfo();\n"
  },
  {
    "path": "extensions/netinfo/src/web/NetInfo.tsx",
    "content": "/**\n * Video.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Video abstraction.\n */\n\nimport * as Types from '../common/Types';\nimport * as Interfaces from '../common/Interfaces';\n\nexport class NetInfo extends Interfaces.NetInfo {\n    constructor() {\n        super();\n\n        const onEventOccuredHandler = () => {\n            this.connectivityChangedEvent.fire(navigator.onLine);\n        };\n\n        // Avoid accessing window if it's not defined (for test environment).\n        if (typeof(window) !== 'undefined') {\n            window.addEventListener('online', onEventOccuredHandler);\n            window.addEventListener('offline', onEventOccuredHandler);\n        }\n    }\n\n    isConnected(): Promise<boolean> {\n        return Promise.resolve(navigator.onLine);\n    }\n\n    getType(): Promise<Types.DeviceNetworkType> {\n        return Promise.resolve(Types.DeviceNetworkType.Unknown);\n    }\n}\n\nexport default new NetInfo();\n"
  },
  {
    "path": "extensions/netinfo/src/web/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Web implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport NetInfo from './NetInfo';\n\nexport { NetInfo as default, Types };\n"
  },
  {
    "path": "extensions/netinfo/src/windows/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Windows implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport NetInfo from '../native-common/NetInfo';\n\nexport { NetInfo as default, Types };\n"
  },
  {
    "path": "extensions/netinfo/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"forceConsistentCasingInFileNames\": true,\n        \"strictPropertyInitialization\": true,\n        \"experimentalDecorators\": true,\n        \"noImplicitReturns\": true,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"noImplicitAny\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"target\": \"es5\",\n        \"module\": \"commonjs\",\n        \"outDir\": \"dist\",\n        \"jsx\": \"react\",\n        \"lib\": [\"es2015.promise\", \"es5\", \"DOM\"]\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"node_modules\",\n        \"dist\"\n    ]\n}\n"
  },
  {
    "path": "extensions/video/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {},\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"PluginBaseChecker.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/video/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\npackage-lock.json\n\n# Optional npm cache directory\n.npm\n\n# Build artifacts\n**/dist\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\n\n"
  },
  {
    "path": "extensions/video/.npmignore",
    "content": "/node_modules\n/src/.vs\n/src/bin\n/src/obj\n*.user\n"
  },
  {
    "path": "extensions/video/README.md",
    "content": "# reactxp-video\nThis module provides cross-platform support for video playback within the [ReactXP](https://microsoft.github.io/reactxp/) library.\n\n## Documentation\nFor detailed documentation, look [here](https://microsoft.github.io/reactxp/docs/extensions/video.html).\n\n### Prerequisites\n* [ReactXP](https://github.com/microsoft/reactxp/)\n\n## Contributing\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/video/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/android/PluginBase.js');\n"
  },
  {
    "path": "extensions/video/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/ios/PluginBase.js');\n"
  },
  {
    "path": "extensions/video/index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/PluginBase.js');\n"
  },
  {
    "path": "extensions/video/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/macos/PluginBase.js');"
  },
  {
    "path": "extensions/video/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/windows/PluginBase.js');\n"
  },
  {
    "path": "extensions/video/package.json",
    "content": "{\n  \"name\": \"reactxp-video\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Plugin for ReactXP that provides a video player component for all platforms\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.15\",\n    \"react-native-video\": \"^5.0.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"react-dom\": \"^16.3.0\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash\": \"^4.14.149\",\n    \"@types/react-dom\": \"^16.9.4\",\n    \"@types/react-native\": \"^0.60.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"types\": \"dist/web/PluginBase.d.ts\"\n}\n"
  },
  {
    "path": "extensions/video/src/android/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Android implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport Video from '../native-common/Video';\n\nexport { Video as default, Types };\n"
  },
  {
    "path": "extensions/video/src/common/Interfaces.ts",
    "content": "/*\n * Interfaces.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Interface definition for cross-platform ReactXP plugin for\n * display videos and controlling video playback.\n */\n\nimport * as RX from 'reactxp';\n\nimport * as Types from './Types';\n\nexport abstract class Video extends RX.Component<Types.VideoProps, RX.Stateless> {\n    abstract seek(position: number): void;\n    abstract play(): void;\n    abstract pause(): void;\n    abstract mute(muted: boolean): void;\n}\n\nexport interface PluginInterface {\n    Types: typeof Types;\n\n    default: typeof Video;\n}\n"
  },
  {
    "path": "extensions/video/src/common/PluginBaseChecker.ts",
    "content": "/*\n * PluginBaseChecker.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type check all the pluginbase exports against the desired interface.\n */\n\nimport * as AndroidPlugin from '../android/PluginBase';\nimport * as iOSPlugin from '../ios/PluginBase';\nimport * as macOSPlugin from '../macos/PluginBase';\nimport * as WebPlugin from '../web/PluginBase';\nimport * as WindowsPlugin from '../windows/PluginBase';\n\nimport * as Interfaces from './Interfaces';\n\nconst _typeCheckerAndroid: Interfaces.PluginInterface = AndroidPlugin;\nconst _typeCheckeriOS: Interfaces.PluginInterface = iOSPlugin;\nconst _typeCheckermacOS: Interfaces.PluginInterface = macOSPlugin;\nconst _typeCheckerWeb: Interfaces.PluginInterface = WebPlugin;\nconst _typeCheckerWindows: Interfaces.PluginInterface = WindowsPlugin;\n"
  },
  {
    "path": "extensions/video/src/common/Types.ts",
    "content": "/*\n * Types.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definitions to support the plugin.\n */\n\nimport * as React from 'react';\nimport { Types as RXTypes } from 'reactxp';\n\n// Video interfaces from react-native-video\nexport interface VideoProgress {\n    currentTime: number;\n    playableDuration: number;\n    atValue?: number;\n    target?: number;\n    atTimeScale?: number;\n}\n\nexport interface VideoInfo {\n    duration?: number;\n    naturalSize?: {\n        width: number;\n        height: number;\n    };\n}\n\nexport interface VideoProps extends RXTypes.CommonStyledProps<RXTypes.ViewStyleRuleSet, Video> {\n    source: string | number;\n    accessibilityLabel?: string;\n    showControls?: boolean;\n    preload?: 'auto'|'metadata'|'none';\n    resizeMode?: 'contain'|'cover'|'stretch';\n    loop?: boolean;\n    authToken?: string;\n    shouldRedirectForAndroidHLS?: boolean;\n\n    onBuffer?: () => void;\n    onCanPlay?: () => void;\n    onCanPlayThrough?: () => void;\n    onEnded?: () => void;\n    onError?: () => void;\n    onLoadStart?: () => void;\n    onLoadedData?: (info: VideoInfo) => void;\n    onProgress?: (progress: VideoProgress) => void;\n}\n\nexport abstract class Video extends React.Component<VideoProps, RXTypes.Stateless> {}\n"
  },
  {
    "path": "extensions/video/src/ios/PluginBase.tsx",
    "content": "/**\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the iOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport Video from '../native-common/Video';\n\nexport { Video as default, Types };\n"
  },
  {
    "path": "extensions/video/src/macos/PluginBase.tsx",
    "content": "/**\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the MacOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport Video from '../native-common/Video';\n\nexport { Video as default, Types };\n"
  },
  {
    "path": "extensions/video/src/native-common/Video.tsx",
    "content": "/**\n * Video.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Video abstraction.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\nimport { default as RNVideo, VideoInfo, VideoBufferInfo } from 'react-native-video';\n\nimport * as Types from '../common/Types';\n\nexport interface VideoState {\n    isPlaying?: boolean;\n    isMuted?: boolean;\n    duration?: number;\n}\n\nclass Video extends RX.Component<Types.VideoProps, VideoState> {\n    private _mountedComponent: RNVideo|null = null;\n\n    constructor(props: Types.VideoProps) {\n        super(props);\n\n        this.state = {\n            isPlaying: false,\n            isMuted: false,\n        };\n    }\n\n    render() {\n        const source = typeof this.props.source === 'number'\n            ? this.props.source\n            : { uri: this.props.source };\n        return (\n            <RNVideo\n                ref={ this._onMount }\n                controls={ this.props.showControls }\n                paused={ !this.state.isPlaying }\n                muted={ this.state.isMuted }\n                repeat={ this.props.loop }\n                source={ source }\n                style={ this.props.style }\n                useTextureView={ false }\n                onEnd={ this._onEnd }\n                onBuffer={ this._onBuffer }\n                onLoadStart={ this.props.onLoadStart }\n                onProgress={ this.props.onProgress }\n                onReadyForDisplay={ this._onLoad }\n                onLoad={ this._onLoadData }\n                onError={ this._onError }\n                resizeMode={ this.props.resizeMode || 'contain' }\n            />\n        );\n    }\n\n    private _onMount = (component: any) => {\n        this._mountedComponent = component as RNVideo;\n    };\n\n    private _onError = () => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        if (this.props.onError) {\n            this.props.onError();\n        }\n    };\n\n    private _onLoad = () => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        // The native control calls _onLoad only if you are\n        // not displaying the native play controls.\n        if (!this.props.showControls && this.props.onCanPlay) {\n            this.props.onCanPlay();\n        }\n    };\n\n    private _onLoadData = (loadInfo: VideoInfo) => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        if (this.props.onLoadedData) {\n            this.props.onLoadedData(loadInfo);\n        }\n\n        // The native control calls _onLoad only if you are\n        // not displaying the native play controls.\n        if (this.props.showControls && this.props.onCanPlay) {\n            this.props.onCanPlay();\n        }\n\n        this.setState({ duration: loadInfo.duration });\n    };\n\n    private _onBuffer = (bufferInfo: VideoBufferInfo) => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        if (bufferInfo.isBuffering) {\n            if (this.props.onBuffer) {\n                this.props.onBuffer();\n            }\n        } else {\n            if (this.props.onCanPlayThrough) {\n                this.props.onCanPlayThrough();\n            }\n        }\n    };\n\n    private _onEnd = () => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        if (!this.props.loop) {\n            // Stop it so it doesn't auto-start.\n            this.setState({ isPlaying: false });\n\n            // Seek video to start.\n            this.seek(0);\n        }\n\n        if (this.props.onEnded) {\n            this.props.onEnded();\n        }\n    };\n\n    seek(position: number) {\n        if (this._mountedComponent) {\n            this._mountedComponent.seek(position);\n        }\n    }\n\n    seekPercent(percentage: number) {\n        if (this._mountedComponent) {\n            if (this.state.duration) {\n                this._mountedComponent.seek(this.state.duration * percentage);\n            }\n        }\n    }\n\n    play() {\n        this.setState({ isPlaying: true });\n    }\n\n    pause() {\n        this.setState({ isPlaying: false });\n    }\n\n    stop() {\n        this.pause();\n        this.seek(0);\n    }\n\n    mute(muted: boolean) {\n        this.setState({ isMuted: muted });\n    }\n}\n\nexport default Video;\n"
  },
  {
    "path": "extensions/video/src/typings/react-native-video.d.ts",
    "content": "/**\n * react-native-video.d.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definition for the React Native implementation\n * of video player:\n * https://github.com/brentvatne/react-native-video\n */\n\ndeclare module 'react-native-video' {\n    import * as React from 'react';\n    import * as RN from 'react-native';\n\n    interface VideoProgress {\n        atValue: number;\n        target: number;\n        playableDuration: number;\n        atTimeScale: number;\n        currentTime: number;\n    }\n\n    interface VideoInfo {\n        duration?: number;\n        naturalSize?: {\n            width: number;\n            height: number;\n        };\n    }\n\n    interface VideoBufferInfo {\n        isBuffering: boolean;\n    }\n\n    interface VideoProps extends RN.ComponentPropsBase {\n        source: {\n            uri: string;\n            type?: string;\n\n            // Some versions of react-native-video may not support this option.\n            authToken?: string;\n        } | number;\n\n        resizeMode?: string;\n        poster?: string;\n        repeat?: boolean;\n        paused?: boolean;\n        muted?: boolean;\n        volume?: number; // 0 is muted, 1 is normal\n        rate?: number; // 0 is paused, 1 is normal\n        playInBackground?: boolean;\n        playWhenInactive?: boolean;\n        ignoreSilentSwitch?: 'ignore'|'obey';\n        disableFocus?: boolean;\n        controls?: boolean;\n        currentTime?: number;\n        progressUpdateInterval?: number;\n        useTextureView?: boolean;\n        onLoadStart?: () => void;\n        onLoad?: (info: VideoInfo) => void;\n        onBuffer?: (bufferInfo: VideoBufferInfo) => void;\n        onError?: () => void;\n        onProgress?: (progress: VideoProgress) => void;\n        onSeek?: () => void;\n        onEnd?: () => void;\n        onFullscreenPlayerWillPresent?: () => void;\n        onFullscreenPlayerDidPresent?: () => void;\n        onFullscreenPlayerWillDismiss?: () => void;\n        onFullscreenPlayerDidDismiss?: () => void;\n        onReadyForDisplay?: () => void;\n        onPlaybackStalled?: () => void;\n        onPlaybackResume?: () => void;\n        onPlaybackRateChange?: () => void;\n        onAudioFocusChanged?: () => void;\n        onAudioBecomingNoisy?: () => void;\n\n        style?: any;\n    }\n\n    export default class Video extends React.Component<VideoProps, {}> {\n        seek(position: number): void;\n    }\n}\n"
  },
  {
    "path": "extensions/video/src/web/PluginBase.ts",
    "content": "/**\n * PluginBase.ts\n * Author: David de Regt\n * Copyright: Microsoft 2016\n *\n * Base export for the Web implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport Video from './Video';\n\nexport { Video as default, Types };\n"
  },
  {
    "path": "extensions/video/src/web/Video.tsx",
    "content": "/**\n * Video.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Video abstraction.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport * as RX from 'reactxp';\n\nimport extend = require('lodash/extend');\n\nimport * as Types from '../common/Types';\n\nclass Video extends RX.Component<Types.VideoProps, {}> {\n    componentDidMount() {\n        // We need to manually install the onEnded handler because. React doesn't support this.\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.onended = () => {\n                if (this.props.onEnded) {\n                    this.props.onEnded();\n                }\n            };\n        }\n    }\n\n    componentWillUnmount() {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            // Prevent Chrome based browsers  to leak video elements\n            videoDOM.src = '';\n        }\n    }\n\n    render() {\n        let combinedStyles = extend(RX.Styles.combine(this.props.style), {\n            display: 'flex',\n        });\n\n        if (this.props.resizeMode === 'cover') {\n            combinedStyles = extend(combinedStyles, {\n                position: 'absolute',\n                minWidth: '100%',\n                minHeight: '100%',\n                width: 'auto',\n                height: 'auto',\n                top: '50%',\n                left: '50%',\n                WebkitTransform: 'translate(-50%,-50%)',\n                MozTransform: 'translate(-50%,-50%)',\n                msTransform: 'translate(-50%,-50%)',\n                transform: 'translate(-50%,-50%)',\n            });\n        } else if (this.props.resizeMode === 'contain') {\n            combinedStyles = extend(combinedStyles, {\n                width: '100%',\n                height: '100%',\n            });\n        } else {\n            combinedStyles = extend(combinedStyles, {\n                width: 'auto',\n                height: 'auto',\n                maxWidth: '100%',\n                maxHeight: '100%',\n            });\n        }\n\n        // The HTML version of video doesn't support numeric-based source\n        // references, only string-based URIs.\n        const source = typeof this.props.source === 'string' ? this.props.source : '';\n\n        return (\n            <video\n                ref='video'\n                style={ combinedStyles }\n                src={ source }\n                controls={ this.props.showControls }\n                loop={ this.props.loop }\n                onLoadedData={ this._onLoadedData }\n                onError={ this.props.onError }\n                onEnded={ this.props.onEnded }\n                onLoadStart={ this.props.onLoadStart }\n                onCanPlay={ this.props.onCanPlay }\n                onCanPlayThrough={ this.props.onCanPlayThrough }\n                onTimeUpdate={ this.props.onProgress ? this._onTimeUpdate : undefined }\n            />\n        );\n    }\n\n    seek(position: number) {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.currentTime = position;\n        }\n    }\n\n    seekPercent(percentage: number) {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.currentTime = percentage * videoDOM.duration;\n        }\n    }\n\n    play() {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            // eslint-disable-next-line @typescript-eslint/no-floating-promises\n            videoDOM.play();\n        }\n    }\n\n    pause() {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.pause();\n        }\n    }\n\n    stop() {\n        const  videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.pause();\n            videoDOM.currentTime = 0;\n        }\n    }\n\n    mute(muted: boolean) {\n        const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n        if (videoDOM) {\n            videoDOM.muted = muted;\n        }\n    }\n\n    private _onLoadedData = () => {\n        if (this.props.onLoadedData) {\n            const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n\n            if (videoDOM) {\n                const loadInfo: Types.VideoInfo = {\n                    duration: videoDOM.duration,\n                    naturalSize: {\n                        width: videoDOM.videoWidth,\n                        height: videoDOM.videoHeight,\n                    },\n                };\n                this.props.onLoadedData(loadInfo);\n            }\n        }\n    };\n\n    private _onTimeUpdate = () => {\n        if (this.props.onProgress) {\n            const videoDOM = ReactDOM.findDOMNode(this) as HTMLVideoElement | null;\n            if (videoDOM) {\n                this.props.onProgress({\n                    currentTime: videoDOM.currentTime,\n                    playableDuration: videoDOM.duration,\n                });\n            }\n        }\n    };\n}\n\nexport default Video;\n"
  },
  {
    "path": "extensions/video/src/windows/PluginBase.ts",
    "content": "/**\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the web implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport Video from './Video';\n\nexport { Video as default, Types };\n"
  },
  {
    "path": "extensions/video/src/windows/Video.tsx",
    "content": "/**\n * Video.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows-specific implementation of the cross-platform Video abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RX from 'reactxp';\nimport extend = require('lodash/extend');\n\nimport * as Types from '../common/Types';\n\nexport interface VideoState {\n    isPlaying?: boolean;\n    duration?: number;\n}\n\nclass Video extends RX.Component<Types.VideoProps, VideoState> {\n    // TODO(uwp): #694149 Not implemented\n    render() {\n        const combinedStyles = extend(RX.Styles.combine(this.props.style), {\n            backgroundColor: 'red',\n        });\n\n        return (\n            <RN.View\n                style={ combinedStyles }\n            >\n                <RN.Text>Video</RN.Text>\n            </RN.View>\n        );\n    }\n\n    seek(position: number) {\n        // TODO(uwp): #694149 Not implemented\n    }\n\n    seekPercent(percentage: number) {\n        // TODO(uwp): #694149 Not implemented\n    }\n\n    play() {\n        // TODO(uwp): #694149 Not implemented\n    }\n\n    pause() {\n        // TODO(uwp): #694149 Not implemented\n    }\n\n    stop() {\n        this.pause();\n        this.seek(0);\n    }\n\n    mute(muted: boolean) {\n        // TODO(uwp): #694149 Not implemented\n    }\n}\n\nexport default Video;\n"
  },
  {
    "path": "extensions/video/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"forceConsistentCasingInFileNames\": true,\n        \"strictPropertyInitialization\": true,\n        \"experimentalDecorators\": true,\n        \"noImplicitReturns\": true,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"noImplicitAny\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"target\": \"es5\",\n        \"module\": \"commonjs\",\n        \"outDir\": \"dist\",\n        \"jsx\": \"react\",\n        \"lib\": [\"es2015.promise\", \"es2018.promise\", \"es5\", \"dom\"]\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"node_modules\",\n        \"dist\"\n    ]\n}\n"
  },
  {
    "path": "extensions/virtuallistview/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {},\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/virtuallistview/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\n\n# Optional npm cache directory\n.npm\n\n# Build artifacts\n/dist\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\npackage-lock.json"
  },
  {
    "path": "extensions/virtuallistview/.npmignore",
    "content": "/node_modules\n*.user\n"
  },
  {
    "path": "extensions/virtuallistview/LICENSE",
    "content": "ReactXP\n\nCopyright (c) Microsoft Corporation\nAll rights reserved. \n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this\nsoftware and associated documentation files (the Software), to deal in the Software\nwithout restriction, including without limitation the rights to use, copy, modify, merge,\npublish, distribute, sublicense, and/or sell copies of the Software, and to permit\npersons to whom the Software is furnished to do so, subject to the following conditions:\n \nThe above copyright notice and this permission notice shall be included in all copies\nor substantial portions of the Software.\n \nTHE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE\nFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "extensions/virtuallistview/README.md",
    "content": "# ReactXP VirtualListView\nVirtualListView is a flexible, generalized list view built on [ReactXP](https://microsoft.github.io/reactxp/).\n\n[Detailed documentation](https://microsoft.github.io/reactxp/docs/extensions/virtuallistview.html) can be found on the ReactXP site.\n\n### Prerequisites\n* [ReactXP](https://microsoft.github.io/reactxp/)\n\n## Contributing\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/virtuallistview/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/VirtualListView.js');\n"
  },
  {
    "path": "extensions/virtuallistview/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/VirtualListView.js');\n"
  },
  {
    "path": "extensions/virtuallistview/index.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/VirtualListView.js');\n"
  },
  {
    "path": "extensions/virtuallistview/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/VirtualListView.js');\n"
  },
  {
    "path": "extensions/virtuallistview/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/VirtualListView.js');\n"
  },
  {
    "path": "extensions/virtuallistview/package.json",
    "content": "{\n  \"name\": \"reactxp-virtuallistview\",\n  \"version\": \"2.1.0\",\n  \"description\": \"General-purpose virtualized list view built on the cross-platform ReactXP library\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.15\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3\",\n    \"reactxp\": \"^2.0.0\",\n    \"react-dom\": \"^16.3\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash\": \"^4.14.149\",\n    \"@types/react-dom\": \"^16.9.4\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"homepage\": \"https://microsoft.github.io/reactxp/docs/extensions/virtuallistview.html\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/reactxp/\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/microsoft/reactxp/issues\"\n  },\n  \"types\": \"dist/VirtualListView.d.ts\"\n}\n"
  },
  {
    "path": "extensions/virtuallistview/src/VirtualListCell.tsx",
    "content": "/**\n * VirtualListCell.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * This helper class is used in conjunction with VirtualListView. It represents the\n * container for a single list item.\n */\n\nimport { createRef } from 'react';\nimport * as RX from 'reactxp';\n\nimport assert from './assert';\n\nexport interface VirtualListCellInfo {\n    key: string;\n\n    disableTouchOpacityAnimation?: boolean;\n}\n\nexport interface VirtualListCellRenderDetails<T extends VirtualListCellInfo> {\n    item: T;\n    selected: boolean;\n    focused: boolean;\n}\n\nexport interface VirtualListCellProps<ItemInfo extends VirtualListCellInfo> extends RX.CommonProps {\n    // All callbacks should be prebound to optimize performance.\n    onLayout?: (itemKey: string, height: number) => void;\n    onAnimateStartStop?: (itemKey: string, start: boolean) => void;\n    onItemFocused?: (item: ItemInfo | undefined) => void;\n    onItemSelected?: (item: ItemInfo) => void;\n    renderItem: (details: VirtualListCellRenderDetails<ItemInfo>) => JSX.Element | JSX.Element[];\n    onKeyPress: (ev: RX.Types.KeyboardEvent) => void;\n\n    // Props that do not impact render (position is set by animated style).\n    itemKey: string | undefined;\n    left: number;\n    top: number;\n    width: number;\n    isVisible: boolean;\n    useNativeDriver?: boolean;\n    showOverflow?: boolean;\n\n    // We need to disable animation and the native animation driver in screen reader mode.\n    isScreenReaderModeEnabled?: boolean;\n\n    // Props that impact render, should be validated in shouldComponentUpdate.\n    isActive: boolean;\n    isFocused: boolean;\n    isSelected: boolean;\n    tabIndex?: number;\n    shouldUpdate: boolean;\n    item: ItemInfo | undefined;\n}\n\ninterface StaticRendererProps<ItemInfo extends VirtualListCellInfo> extends RX.CommonProps {\n    shouldUpdate: boolean;\n    isFocused: boolean;\n    isSelected: boolean;\n    item: ItemInfo | undefined;\n    renderItem: (details: VirtualListCellRenderDetails<ItemInfo>) => JSX.Element | JSX.Element[];\n}\n\nconst _styles = {\n    cellView: RX.Styles.createViewStyle({\n        position: 'absolute',\n    }),\n    overflowVisible: RX.Styles.createViewStyle({\n        overflow: 'visible',\n    }),\n    overflowHidden: RX.Styles.createViewStyle({\n        overflow: 'hidden',\n    }),\n};\n\nconst _isNativeMacOS = RX.Platform.getType() === 'macos';\nconst _skypeEaseInAnimationCurve = RX.Animated.Easing.CubicBezier(1, 0, 0.78, 1);\nconst _skypeEaseOutAnimationCurve = RX.Animated.Easing.CubicBezier(0.33, 0, 0, 1);\nconst _keyCodeEnter = 13;\nconst _keyCodeSpace = 32;\nconst _keyCodeReturn = 3;\n\nexport class VirtualListCell<ItemInfo extends VirtualListCellInfo> extends RX.Component<VirtualListCellProps<ItemInfo>, RX.Stateless> {\n    // Helper class used to render child elements. If we know that none of the children changed - we would like to skip\n    // the render completely, to improve performance.\n    // eslint-disable-next-line @typescript-eslint/member-naming\n    private static StaticRenderer = class <CellItemInfo extends VirtualListCellInfo>\n        extends RX.Component<StaticRendererProps<CellItemInfo>, RX.Stateless> {\n\n        constructor(props: StaticRendererProps<CellItemInfo>) {\n            super(props);\n        }\n\n        shouldComponentUpdate(nextProps: StaticRendererProps<CellItemInfo>): boolean {\n            return nextProps.shouldUpdate ||\n                this.props.isFocused !== nextProps.isFocused ||\n                this.props.isSelected !== nextProps.isSelected;\n        }\n\n        render() {\n            // If we don't have an item to render, return null here\n            if (!this.props.item) {\n                return null;\n            }\n\n            return (\n                <RX.Fragment>\n                    { this.props.renderItem({\n                        item: this.props.item,\n                        selected: this.props.isSelected,\n                        focused: this.props.isFocused,\n                    }) }\n                </RX.Fragment>\n            );\n        }\n    };\n\n    private static _hiddenTopValue = -32768;\n\n    private _isVisible = false;\n    private _top: number = VirtualListCell._hiddenTopValue;\n    private _calculatedHeight = 0;\n\n    private _topValue: RX.Animated.Value;\n    private _leftValue: RX.Animated.Value;\n    private _widthValue: RX.Animated.Value;\n    private _ref = createRef<RX.Animated.View>();\n\n    // we need to split style for position and width because we use native driver for position,\n    // but native driver doesnt support width\n    private _animatedStylePosition: RX.Types.AnimatedViewStyleRuleSet;\n    private _animatedStyleWidth: RX.Types.AnimatedViewStyleRuleSet;\n    private _topAnimation: RX.Types.Animated.CompositeAnimation | undefined;\n\n    private _itemKey: string | undefined;\n\n    constructor(props: VirtualListCellProps<ItemInfo>) {\n        super(props);\n\n        this._isVisible = props.isVisible;\n        this._top = props.top;\n        this._itemKey = props.itemKey;\n\n        const topValue = this._isVisible ? this._top : VirtualListCell._hiddenTopValue;\n        this._topValue = RX.Animated.createValue(topValue);\n\n        const leftValue = props.left || 0;\n        this._leftValue = RX.Animated.createValue(leftValue);\n\n        if (!props.isScreenReaderModeEnabled && !_isNativeMacOS) {\n            // On native platforms, we'll stick with translate[X|Y] because it has a performance advantage.\n            this._animatedStylePosition = RX.Styles.createAnimatedViewStyle({\n                transform: [{\n                    translateY: this._topValue,\n                }],\n                left: this._leftValue,\n            });\n        } else {\n            // We need to work around an IE-specific bug. It doesn't properly handle\n            // translateY in this case. In particular, if separate translations are used\n            // within the item itself, it doesn't handle that combination.\n            this._animatedStylePosition = RX.Styles.createAnimatedViewStyle({\n                top: this._topValue,\n                left: this._leftValue,\n            });\n        }\n\n        this._widthValue = RX.Animated.createValue(props.width || 0);\n\n        this._animatedStyleWidth = RX.Styles.createAnimatedViewStyle({\n            width: this._widthValue,\n        });\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: VirtualListCellProps<ItemInfo>) {\n        // If it's inactive, it had better be invisible.\n        assert(nextProps.isActive || !nextProps.isVisible);\n\n        assert(nextProps.useNativeDriver === this.props.useNativeDriver);\n\n        // All callbacks should be prebound to optimize performance.\n        assert(this.props.onLayout === nextProps.onLayout, 'onLayout callback changed');\n        assert(this.props.onItemSelected === nextProps.onItemSelected, 'onItemSelected callback changed');\n        assert(this.props.onItemFocused === nextProps.onItemFocused, 'onItemFocused callback changed');\n        assert(this.props.onAnimateStartStop === nextProps.onAnimateStartStop, 'onAnimateStartStop callback changed');\n        assert(this.props.renderItem === nextProps.renderItem, 'renderItem callback changed');\n\n        // We assume this prop doesn't change for perf reasons. Callers should modify\n        // the key to force an unmount/remount if these need to change.\n        assert(this.props.isScreenReaderModeEnabled === nextProps.isScreenReaderModeEnabled);\n\n        this.setItemKey(nextProps.itemKey);\n\n        if (this.props.left !== nextProps.left) {\n            this._leftValue.setValue(nextProps.left);\n        }\n\n        if (this.props.width !== nextProps.width) {\n            this._widthValue.setValue(nextProps.width);\n        }\n\n        if (this.props.itemKey !== nextProps.itemKey) {\n            this.setVisibility(nextProps.isVisible);\n            this.setTop(nextProps.top);\n        }\n    }\n\n    shouldComponentUpdate(nextProps: VirtualListCellProps<ItemInfo>): boolean {\n        // No need to update inactive (recycled) cells.\n        if (!nextProps.isActive) {\n            return false;\n        }\n\n        // Check if props important for rendering changed.\n        if (this.props.tabIndex !== nextProps.tabIndex ||\n            this.props.itemKey !== nextProps.itemKey ||\n            this.props.isFocused !== nextProps.isFocused ||\n            this.props.isSelected !== nextProps.isSelected) {\n            return true;\n        }\n\n        return nextProps.shouldUpdate;\n    }\n\n    componentDidUpdate(prevProps: VirtualListCellProps<ItemInfo>) {\n        // We need to simulate a layout event here because recycled cells may not\n        // generate a layout event if the cell contents haven't changed.\n        if (this.props.onLayout && this.props.isActive && this._calculatedHeight && this._itemKey) {\n            this.props.onLayout(this._itemKey, this._calculatedHeight);\n        }\n    }\n\n    componentWillUnmount() {\n        // Stop any pending animation.\n        if (this._topAnimation) {\n            this._topAnimation.stop();\n        }\n    }\n\n    setVisibility(isVisible: boolean) {\n        if (isVisible !== this._isVisible) {\n            this._isVisible = isVisible;\n\n            if (this._topAnimation) {\n                this._topAnimation.stop();\n            }\n\n            this._topValue.setValue(this._isVisible ? this._top : VirtualListCell._hiddenTopValue);\n        }\n    }\n\n    isVisible() {\n        return this._isVisible;\n    }\n\n    setTop(top: number, animate = false, animationDelay = 0, animationOvershoot = 0) {\n        if (top !== this._top) {\n            this._top = top;\n\n            if (this._isVisible) {\n                let isReplacingPendingAnimation = false;\n\n                // Stop any pending animation.\n                if (this._topAnimation) {\n                    const animationToCancel = this._topAnimation;\n\n                    // The call to stop() will invoke the stop callback. If we are\n                    // going to replace a pending animation, we'll make it look like\n                    // a continuous animation rather than calling the callback multiple\n                    // times. If we're not replacing the animation with another animation,\n                    // allow the onAnimateStartStop to proceed.\n                    if (animate) {\n                        this._topAnimation = undefined;\n                    }\n                    animationToCancel.stop();\n                    isReplacingPendingAnimation = true;\n                }\n\n                if (animate) {\n                    if (animationOvershoot !== 0) {\n                        this._topAnimation = RX.Animated.sequence([\n                            RX.Animated.timing(this._topValue, {\n                                toValue: top + animationOvershoot,\n                                duration: 200,\n                                delay: animationDelay,\n                                easing: _skypeEaseInAnimationCurve,\n                            }),\n                            RX.Animated.timing(this._topValue, {\n                                toValue: top,\n                                duration: 400,\n                                easing: _skypeEaseOutAnimationCurve,\n                            }),\n                        ]);\n                    } else {\n                        this._topAnimation = RX.Animated.timing(this._topValue, {\n                            toValue: top,\n                            duration: 200,\n                            delay: animationDelay,\n                            easing: RX.Animated.Easing.InOut(),\n                        });\n                    }\n\n                    if (!isReplacingPendingAnimation && this.props.onAnimateStartStop && this._itemKey) {\n                        this.props.onAnimateStartStop(this._itemKey, true);\n                    }\n                    this._topAnimation.start(() => {\n                        // Has the animation been canceled?\n                        if (this._topAnimation) {\n                            this._topAnimation = undefined;\n                            if (this.props.onAnimateStartStop && this._itemKey) {\n                                this.props.onAnimateStartStop(this._itemKey, false);\n                            }\n                        }\n                    });\n                } else {\n                    this._topValue.setValue(top);\n                }\n            }\n        }\n    }\n\n    cancelPendingAnimation() {\n        if (this._topAnimation) {\n            this._topAnimation.stop();\n        }\n    }\n\n    setItemKey(key: string | undefined) {\n        this._itemKey = key;\n    }\n\n    getTop() {\n        return this._top;\n    }\n\n    focus() {\n        if (this._ref.current && this.props.tabIndex) {\n            const virtualCellComponent = this._ref.current;\n            virtualCellComponent.focus();\n        }\n    }\n\n    render() {\n        const overflow = this.props.showOverflow ? _styles.overflowVisible : _styles.overflowHidden;\n\n        return (\n            <RX.Animated.View\n                style={ [_styles.cellView, overflow, this._animatedStylePosition, this._animatedStyleWidth] }\n                ref={ this._ref }\n                tabIndex={ this.props.tabIndex }\n                onLayout={ this.props.onLayout ? this._onLayout : undefined }\n                onFocus={ this.props.onItemFocused ? this._onFocus : undefined }\n                onBlur={ this.props.onItemFocused ? this._onBlur : undefined }\n                onPress={ this.props.onItemSelected ? this._onPress : undefined }\n                onKeyPress={ this.props.onKeyPress || this.props.onItemSelected ? this._onKeyPress : undefined }\n                disableTouchOpacityAnimation={ this.props.item ? this.props.item.disableTouchOpacityAnimation : undefined }\n            >\n                <VirtualListCell.StaticRenderer\n                    shouldUpdate={ this.props.shouldUpdate }\n                    isFocused={ this.props.isFocused }\n                    isSelected={ this.props.isSelected }\n                    item={ this.props.item }\n                    renderItem={ this.props.renderItem }\n                />\n            </RX.Animated.View>\n        );\n    }\n\n    private _onKeyPress = (e: RX.Types.KeyboardEvent) => {\n        const isSelectItemKeyPress = e.keyCode === _keyCodeEnter ||\n            e.keyCode === _keyCodeSpace ||\n            e.keyCode === _keyCodeReturn;\n        if (isSelectItemKeyPress && this.props.onItemSelected && this.props.item) {\n            this.props.onItemSelected(this.props.item);\n            e.stopPropagation();\n        }\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(e);\n        }\n    };\n\n    private _onFocus = (e: RX.Types.FocusEvent) => {\n        if (this.props.onItemFocused) {\n            this.props.onItemFocused(this.props.item);\n        }\n    };\n\n    private _onPress = (e: RX.Types.SyntheticEvent) => {\n        if (this.props.onItemSelected && this.props.item) {\n            this.props.onItemSelected(this.props.item);\n            e.stopPropagation();\n        }\n    };\n\n    private _onBlur = (e: RX.Types.FocusEvent) => {\n        if (this.props.onItemFocused) {\n            this.props.onItemFocused(undefined);\n        }\n    };\n\n    private _onLayout = (layoutInfo: RX.Types.ViewOnLayoutEvent) => {\n        if (this.props.onLayout && this.props.isActive && this._itemKey) {\n            this._calculatedHeight = layoutInfo.height;\n            this.props.onLayout(this._itemKey, layoutInfo.height);\n        }\n    };\n}\n"
  },
  {
    "path": "extensions/virtuallistview/src/VirtualListView.tsx",
    "content": "/**\n * VirtualListView.tsx\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A cross-platform virtualized list view supporting variable-height items and\n * methods to navigate to specific items by index.\n *\n * Misc notes to help understand the flow:\n * 1. There are only a few ways to enter calculation flows:\n *    * _updateStateFromProps: We got new props\n *    * _onLayoutContainer: Our outer container rendered and/or changed size\n *    * _onLayoutItem: An item rendered and/or changed changed size\n *    * _onScroll: The user scrolled the container\n *    Everything else is a helper function for these four entry points.\n * 2. We largely ignore the React lifecycle here. We completely eschew state in favor of forceUpdate when\n *    we know that we need to  call render(). We cheat and use the animation code to move items and make\n *    them opaque/invisible at the right time outside of the render cycle.\n * 3. Items are rendered in containers called \"cells\". Cells are allocated on demand and given their own keys.\n *    When an item is no longer within the view port (e.g. in response to the the user scrolling), the corresponding\n *    cell is recycled to avoid unmounting and mounting. These recycled cells are rendered in a position that is\n *    not visible to the user. When a new cell is needed, we consult the recycled cell list to find one that matches\n *    the specified \"template\" of the new item. Callers should set the template field in a way that all similar items\n *     share the same template. This will minimize the amount of work that React needs to be done to reuse the recycled\n *    cell.\n * 3. The intended render flow is as follows:\n *    * Start filling hidden items from top down\n *    * Wait for items to be measured (or if heights are known, then bypass this step)\n *    * Set the translation of all items such that they appear in view at the same time without new items popping\n *      into existence afterward.\n * 4. We address the issue of unexpected item heights tracking _heightAboveRenderAdjustment. When this is\n *    non-zero, it means that our initial guess for one or more items was wrong, so the _containerHeight is\n *    currently incorrect. Correcting this is an expensive and potentially disruptive action because it\n *    involves setting the container height, repositioning all visible cells and setting the scroll\n *    position all in the same frame if possible.\n */\n\nimport * as _ from 'lodash';\nimport { createRef, RefObject } from 'react';\nimport * as RX from 'reactxp';\n\nimport assert from './assert';\nimport { VirtualListCell, VirtualListCellInfo, VirtualListCellRenderDetails } from './VirtualListCell';\n\n// Specifies information about each item to be displayed in the list.\nexport interface VirtualListViewItemInfo extends VirtualListCellInfo {\n    // Specifies the known height of the item or a best guess if the height isn't known.\n    height: number;\n\n    // Specifies that the height is not known and needs to be measured dynamically.\n    // This has a big perf overhead because it requires a double layout (once offscreen\n    // to measure the item). It also disables cell recycling. Wherever possible, it\n    // should be avoided, especially for perf-critical views.\n    measureHeight?: boolean;\n\n    // Specify the same \"template\" string for items that are rendered\n    // with identical or similar view hierarchies. When a template is specified,\n    // the list view attempts to recycle cells whose templates match. When an item\n    // scrolls off the screen and others appear on screen, the contents of the\n    // cell are simply updated rather than torn down and rebuilt.\n    template?: string;\n\n    // Is the item navigable by keyboard or through accessibility mechanisms?\n    isNavigable?: boolean;\n}\n\nexport interface VirtualListViewCellRenderDetails<T extends VirtualListViewItemInfo> extends VirtualListCellRenderDetails<T> {\n\n}\n\nexport interface VirtualListViewProps<ItemInfo extends VirtualListViewItemInfo>\n    extends RX.CommonStyledProps<RX.Types.ViewStyleRuleSet, VirtualListView<ItemInfo>> {\n\n    testId?: string;\n\n    // Ordered list of descriptors for items to display in the list.\n    itemList: ItemInfo[];\n\n    // Callback for rendering item when it becomes visible within view port.\n    renderItem: (renderDetails: VirtualListCellRenderDetails<ItemInfo>) => JSX.Element | JSX.Element[];\n    onItemSelected?: (item: ItemInfo) => void;\n    onItemFocused?: (item: ItemInfo | undefined) => void;\n\n    initialSelectedKey?: string;\n\n    // Optional padding around the scrolling content within the list.\n    padding?: number;\n\n    // If true, allows each item to overflow its visible cell boundaries; by default,\n    // item contents are clipped to cell boundaries.\n    showOverflow?: boolean;\n\n    // Should the list animate additions, removals and moves within the list?\n    animateChanges?: boolean;\n\n    // By default, VirtualListView re-renders every item during the render. Setting\n    // this flag to true allows the list view to re-render only items from itemList\n    // whose descriptor has changed, thus avoiding unnecessary rendering. It uses\n    // _.isEqual to perform this check. In this mode, renderItem should not depend\n    // on any external state, only on VirtualListViewItemInfo, to render item.\n    skipRenderIfItemUnchanged?: boolean;\n\n    // Pass-through properties for scroll view.\n    keyboardDismissMode?: 'none' | 'interactive' | 'on-drag';\n    keyboardShouldPersistTaps?: boolean;\n    disableScrolling?: boolean;\n    scrollsToTop?: boolean; // iOS only, scroll to top when user taps on status bar\n    disableBouncing?: boolean; // iOS only, bounce override\n    scrollIndicatorInsets?: {\n        top: number;\n        left: number;\n        bottom: number;\n        right: number;\n    }; // iOS only\n    scrollEventThrottle?: number;\n    onScroll?: (scrollTop: number, scrollLeft: number) => void;\n    onLayout?: (e: RX.Types.ViewOnLayoutEvent) => void;\n    scrollXAnimatedValue?: RX.Types.AnimatedValue;\n    scrollYAnimatedValue?: RX.Types.AnimatedValue;\n\n    // Use this if you want to vertically offset the focused item when using keyboard nav\n    keyboardFocusScrollOffset?: number;\n\n    // Logging callback to debug issues related to the VirtualListView.\n    logInfo?: (textToLog: string) => void;\n}\n\nexport interface VirtualListViewState {\n    lastFocusedItemKey?: string;\n    isFocused?: boolean;\n    selectedItemKey?: string;\n}\n\nexport interface VirtualCellInfo<ItemInfo extends VirtualListViewItemInfo> {\n    cellRef: RefObject<VirtualListCell<ItemInfo>>;\n    virtualKey: string;\n    itemTemplate?: string;\n    isHeightConstant: boolean;\n    height: number;\n    cachedItemKey: string;\n    top: number;\n    isVisible: boolean;\n    shouldUpdate: boolean;\n}\n\nenum FocusDirection {\n    Up = -1,\n    Down = 1\n}\n\nconst _styles = {\n    scrollContainer: RX.Styles.createScrollViewStyle({\n        flex: 1,\n        position: 'relative',\n        flexDirection: 'column',\n    }),\n    staticContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        flexDirection: 'column',\n    }),\n};\n\nconst _isNativeAndroid = RX.Platform.getType() === 'android';\nconst _isNativeIOS = RX.Platform.getType() === 'ios';\nconst _isWeb = RX.Platform.getType() === 'web';\n\n// How many items with unknown heights will we allow? A larger value will fill the view more\n// quickly but will result in a bunch of long-running work that can cause frame skips during\n// animations.\nconst _maxSimultaneousMeasures = 16;\n\n// Recycled cells remain mounted to reduce the allocations and deallocations.\n// This value controls how many we maintain before culling.\nconst _maxRecycledCells = 50;\n\nconst _maxRecycledCellsForAccessibility = 0;\n\nconst _virtualKeyPrefix = 'vc_';\nconst _accessibilityVirtualKeyPrefix = 'ac_';\n\n// Key codes used on web/RN (keycodes for arrows are different between web and native, unfortunately)\n// (a resolution for https://github.com/Microsoft/reactxp/issues/419 will make this look better, hopefuly)\nconst _keyCodeUpArrow = _isWeb ? 38 : 19;\nconst _keyCodeDownArrow = _isWeb ? 40 : 20;\n\nexport class VirtualListView<ItemInfo extends VirtualListViewItemInfo>\n    extends RX.Component<VirtualListViewProps<ItemInfo>, VirtualListViewState> {\n\n    private _lastScrollTop = 0;\n    private _layoutHeight = 0;\n    private _layoutWidth = 0;\n\n    // Cache the width for rendered items for reuse/optimization\n    private _contentWidth = -1;\n\n    private _isMounted = false;\n\n    // Controls the full height of the scrolling view, independent of the view port height\n    private _containerHeight = 0;\n    private _containerHeightValue = RX.Animated.createValue(this._containerHeight);\n    private _containerAnimatedStyle = RX.Styles.createAnimatedViewStyle({\n        height: this._containerHeightValue,\n    });\n\n    // A dictionary of items that maps item keys to item indexes.\n    private _itemMap = new Map<string, number>();\n\n    private _scrollViewRef = createRef<RX.ScrollView>();\n\n    // When we need to actually re-render, mark this until it's resolved\n    private _isRenderDirty = false;\n\n    // Number of pending item animations. We defer some actions while animations are pending.\n    private _pendingAnimations = new Set<string>();\n    // We attempt to guess the size of items before we render them, but if we're wrong, we need to accumulate the guess\n    // error so that we can correct it later.\n    private _heightAboveRenderAdjustment = 0;\n\n    // Cache the heights of blocks of the list\n    private _heightAboveRenderBlock = 0;\n    private _heightOfRenderBlock = 0;\n    private _heightBelowRenderBlock = 0;\n\n    // Count the number of items above, in, and below the render block\n    private _itemsAboveRenderBlock = 0;\n    private _itemsInRenderBlock = 0;\n    private _itemsBelowRenderBlock = 0;\n\n    // Items that we're waiting on a measure from\n    private _pendingMeasurements = new Set<string>();\n\n    // We first render items to fill the visible screen, and then render past it in another render pass.\n    private _isInitialFillComplete = false;\n\n    // Save a height cache of things that are no longer being rendered because we may scroll them off screen and still\n    // want to know what their height is to calculate the size.\n    private _heightCache = new Map<string, number>();\n\n    // Next cell key. We keep incrementing this value so we always generate unique keys.\n    private static _nextCellKey = 1;\n\n    // Cells that contain visible items.\n    private _activeCells = new Map<string, VirtualCellInfo<ItemInfo>>();\n\n    // Cells that were previously allocated but no longer contain items that are visible.\n    // They are kept around and reused to avoid exceess allocations.\n    private _recycledCells: VirtualCellInfo<ItemInfo>[] = [];\n\n    // List of cells that are rendered\n    private _navigatableItemsRendered: {\n        key: string;\n        // eslint-disable-next-line @typescript-eslint/camelcase\n        vc_key: string;\n    }[] = [];\n\n    private _pendingFocusDirection: FocusDirection | undefined;\n\n    // Recycled cells remain mounted to reduce the allocations and deallocations.\n    // This value controls how many we maintain before culling.\n    private _maxRecycledCells = _maxRecycledCells;\n\n    private _isScreenReaderEnabled = false;\n\n    // Fraction of screen height that we render above and below the visible screen.\n    private _renderOverdrawFactor = 0.5;\n    private _minOverdrawAmount = 512;\n    private _maxOverdrawAmount = 4096;\n\n    // These must be at least as big as the numbers above to avoid feedback loops.\n    private _cullFraction = 1.0;\n    private _minCullAmount = this._minOverdrawAmount * 2;\n\n    constructor(props: VirtualListViewProps<ItemInfo>) {\n        super(props);\n\n        this._updateStateFromProps(props, true);\n        this.state = {\n            lastFocusedItemKey: _.some(props.itemList, item => item.key === props.initialSelectedKey) ?\n                props.initialSelectedKey :\n                undefined,\n            selectedItemKey: _.some(props.itemList, item => item.key === props.initialSelectedKey) ?\n                props.initialSelectedKey :\n                undefined,\n        };\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: VirtualListViewProps<ItemInfo>): void {\n        if (!_.isEqual(this.props, nextProps)) {\n            this._updateStateFromProps(nextProps, false);\n        }\n    }\n\n    UNSAFE_componentWillUpdate(nextProps: VirtualListViewProps<ItemInfo>, nextState: VirtualListViewState) {\n        const updatedState: Partial<VirtualListViewState> = {};\n        let updateState = false;\n        if (nextState.lastFocusedItemKey && !_.some(nextProps.itemList, item => item.key === nextState.lastFocusedItemKey)) {\n            updateState = true;\n            updatedState.lastFocusedItemKey = undefined;\n        }\n        if (nextState.selectedItemKey && !_.some(nextProps.itemList, item => item.key === nextState.selectedItemKey)) {\n            updateState = true;\n            updatedState.selectedItemKey = undefined;\n        }\n\n        if (updateState) {\n            this.setState(updatedState);\n        }\n    }\n\n    private _setupForAccessibility() {\n        if (this.props.logInfo) {\n            this.props.logInfo('Screen reader enabled.');\n        }\n        this._isScreenReaderEnabled = true;\n\n        if (_isNativeIOS || _isNativeAndroid) {\n            // Clear recycled cells and turn off recycling.\n            if (this._recycledCells.length > 0) {\n                this._recycledCells = [];\n                this._isRenderDirty = true;\n            }\n\n            this._maxRecycledCells = _maxRecycledCellsForAccessibility;\n        }\n    }\n\n    private _tearDownForAccessibility() {\n        if (this.props.logInfo) {\n            this.props.logInfo('Screen reader disabled.');\n        }\n\n        this._isScreenReaderEnabled = false;\n\n        if (_isNativeIOS || _isNativeAndroid) {\n            // Enable recycling.\n            this._maxRecycledCells = _maxRecycledCells;\n        }\n    }\n\n    private _isAndroidScreenReaderEnabled() {\n        return this._isScreenReaderEnabled && _isNativeAndroid;\n    }\n\n    private _updateStateFromProps(props: VirtualListViewProps<ItemInfo>, initialBuild: boolean) {\n        if (props.logInfo) {\n            props.logInfo('Rebuilding VirtualListView State - initial: ' + initialBuild +\n                ', items: ' + props.itemList.length);\n        }\n\n        if (initialBuild && props.skipRenderIfItemUnchanged) {\n            // When we are using smart rerender we can make overdraw much larger\n            this._renderOverdrawFactor = 5;\n            this._minOverdrawAmount = 2048;\n            this._maxOverdrawAmount = 4096;\n            this._cullFraction = 6;\n            this._minCullAmount = 3072;\n        }\n\n        if (initialBuild || !_.isEqual(this.props.itemList, props.itemList)) {\n            this._handleItemListChange(props);\n            this._calcNewRenderedItemState(props);\n        }\n\n        this._renderIfDirty(props);\n    }\n\n    private _handleItemListChange(props: VirtualListViewProps<ItemInfo>) {\n        // Build a new item map.\n        const newItemMap = new Map<string, number>();\n        let itemIndex = -1;\n        for (const item of props.itemList) {\n            itemIndex++;\n            // Make sure there are no duplicate keys.\n            if (newItemMap.has(item.key)) {\n                assert(false, 'Found a duplicate key: ' + item.key);\n                if (props.logInfo) {\n                    props.logInfo('Item with key ' + item.key + ' is duplicated at positions ' + itemIndex +\n                        ' and ' + newItemMap.get(item.key)!);\n                }\n            }\n            newItemMap.set(item.key, itemIndex);\n\n            if (this.props && this.props.itemList) {\n                const cell = this._activeCells.get(item.key);\n                if (cell) {\n                    const oldItemIndex = this._itemMap.get(item.key);\n                    if (oldItemIndex === undefined) {\n                        cell.shouldUpdate = true;\n                    } else {\n                        const oldItem = this.props.itemList[oldItemIndex];\n                        if (this.props.skipRenderIfItemUnchanged || !_.isEqual(oldItem, item)) {\n                            cell.shouldUpdate = true;\n                        }\n                    }\n                }\n            }\n        }\n\n        // Stop tracking the heights of deleted items.\n        const oldItems = (this.props && this.props.itemList) ? this.props.itemList : [];\n        itemIndex = -1;\n        for (const item of oldItems) {\n            itemIndex++;\n            if (!newItemMap.has(item.key)) {\n                // If we're deleting an item that's above the current render block,\n                // update the adjustment so we avoid an unnecessary scroll.\n\n                // Update focused item if it's the one removed, if we're unable to, reset focus\n                if (item.key === this.state.lastFocusedItemKey) {\n                    if (!this._focusSubsequentItem(FocusDirection.Down, false, false) &&\n                            !this._focusSubsequentItem(FocusDirection.Up, false, false)) {\n                        this.setState({ lastFocusedItemKey: undefined });\n                    }\n                }\n\n                if (itemIndex < this._itemsAboveRenderBlock) {\n                    this._heightAboveRenderAdjustment += this._getHeightOfItem(oldItems[itemIndex]);\n                }\n\n                this._heightCache.delete(item.key);\n                this._pendingMeasurements.delete(item.key);\n\n                // Recycle any deleted active cells up front so they can be recycled below.\n                if (this._activeCells.has(item.key)) {\n                    this._recycleCell(item.key);\n                }\n            }\n        }\n\n        const overdrawAmount = this._calcOverdrawAmount();\n        const renderBlockTopLimit = this._lastScrollTop - overdrawAmount;\n        const renderBlockBottomLimit = this._lastScrollTop + this._layoutHeight + overdrawAmount;\n\n        let yPosition = this._heightAboveRenderAdjustment;\n        let lookingForStartOfRenderBlock = true;\n\n        this._itemsAboveRenderBlock = 0;\n        this._itemsInRenderBlock = 0;\n\n        // Determine the new bounds of the render block.\n        itemIndex = -1;\n        for (const item of props.itemList) {\n            itemIndex++;\n            const itemHeight = this._getHeightOfItem(item);\n\n            yPosition += itemHeight;\n\n            if (yPosition <= renderBlockTopLimit) {\n                if (this._activeCells.has(item.key)) {\n                    this._recycleCell(item.key);\n                }\n            } else {\n                if (lookingForStartOfRenderBlock) {\n                    this._itemsAboveRenderBlock = itemIndex;\n                    lookingForStartOfRenderBlock = false;\n                }\n\n                if (yPosition - itemHeight < renderBlockBottomLimit) {\n                    // We're within the render block.\n                    this._itemsInRenderBlock++;\n\n                    if (this._activeCells.has(item.key)) {\n                        this._setCellTopAndVisibility(item.key, this._shouldShowItem(item, props),\n                            yPosition - itemHeight, !!props.animateChanges);\n                    } else {\n                        this._allocateCell(item.key, item.template, itemIndex, !item.measureHeight, item.height,\n                            yPosition - itemHeight, this._shouldShowItem(item, props));\n\n                        if (!this._isItemHeightKnown(item)) {\n                            this._pendingMeasurements.add(item.key);\n                        }\n                    }\n                } else {\n                    // We're past the render block.\n                    if (this._activeCells.has(item.key)) {\n                        this._recycleCell(item.key);\n                    }\n                }\n            }\n        }\n\n        // Replace the item map with the updated version.\n        this._itemMap = newItemMap;\n\n        this._itemsBelowRenderBlock = props.itemList.length - this._itemsAboveRenderBlock -\n            this._itemsInRenderBlock;\n        this._heightAboveRenderBlock = this._calcHeightOfItems(props, 0, this._itemsAboveRenderBlock - 1);\n        this._heightOfRenderBlock = this._calcHeightOfItems(props, this._itemsAboveRenderBlock,\n            this._itemsAboveRenderBlock + this._itemsInRenderBlock - 1);\n        this._heightBelowRenderBlock = this._calcHeightOfItems(props,\n            this._itemsAboveRenderBlock + this._itemsInRenderBlock, props.itemList.length - 1);\n\n        // Pre-populate the container height with known values early - if there are dynamically sized items in the list, this will be\n        // corrected during the onLayout phase\n        if (this._containerHeight === 0) {\n            this._containerHeight = this._heightAboveRenderBlock + this._heightOfRenderBlock + this._heightBelowRenderBlock;\n            this._containerHeightValue.setValue(this._containerHeight);\n        }\n    }\n\n    private _calcOverdrawAmount() {\n        return this._isInitialFillComplete ?\n            Math.min(Math.max(this._layoutHeight * this._renderOverdrawFactor, this._minOverdrawAmount), this._maxOverdrawAmount) :\n            0;\n    }\n\n    private _onLayoutContainer = (e: RX.Types.ViewOnLayoutEvent) => {\n        if (!this._isMounted) {\n            return;\n        }\n\n        let layoutWidth = e.width;\n        if (this.props.padding) {\n            layoutWidth -= this.props.padding;\n        }\n        const layoutHeight = e.height;\n\n        if (layoutWidth !== this._layoutWidth) {\n            if (this.props.logInfo) {\n                this.props.logInfo('New layout width: ' + layoutWidth);\n            }\n\n            this._layoutWidth = layoutWidth;\n            this._resizeAllItems(this.props);\n        }\n\n        if (layoutHeight !== this._layoutHeight) {\n            if (this.props.logInfo) {\n                this.props.logInfo('New layout height: ' + layoutHeight);\n            }\n\n            this._layoutHeight = layoutHeight;\n            this._calcNewRenderedItemState(this.props);\n            this._renderIfDirty(this.props);\n\n            // See if we have accumulated enough error to require an adjustment.\n            this._reconcileCorrections(this.props);\n        }\n\n        if (this.props.onLayout) {\n            this.props.onLayout(e);\n        }\n    };\n\n    private _onLayoutItem = (itemKey: string, newHeight: number) => {\n        if (!this._isMounted) {\n            return;\n        }\n\n        const itemIndex = this._itemMap.get(itemKey);\n\n        // Because this event is async on some platforms, the index may have changed or\n        // the item could have been removed by the time the event arrives.\n        if (itemIndex === undefined) {\n            return;\n        }\n\n        const item = this.props.itemList[itemIndex];\n        const oldHeight = this._getHeightOfItem(item);\n\n        if (!item.measureHeight) {\n            // Trust constant-height items, even if the layout tells us otherwise.\n            // We shouldn't even get this callback, since we don't specify an onLayout in this case.\n            if (this.props.logInfo) {\n                this.props.logInfo('Item ' + itemKey + ' listed as known height (' + oldHeight +\n                    '), but got an itemOnLayout anyway? (Reported Height: ' + newHeight + ')');\n            }\n            return;\n        }\n\n        this._heightCache.set(itemKey, newHeight);\n\n        if (itemIndex < this._itemsAboveRenderBlock || itemIndex >= this._itemsAboveRenderBlock + this._itemsInRenderBlock) {\n            // Getting a response for a culled item (no longer in tracked render block), so track the height but don't update anything.\n            return;\n        }\n\n        let needsRecalc = false;\n\n        if (oldHeight !== newHeight) {\n            if (this.props.logInfo) {\n                this.props.logInfo('onLayout: Item Height Changed: ' + itemKey + ' - Old: ' + oldHeight + ', New: ' + newHeight);\n            }\n\n            this._heightOfRenderBlock += (newHeight - oldHeight);\n\n            if (this._isInitialFillComplete) {\n                // See if there are any visible items before this one.\n                let foundVisibleItemBefore = false;\n                for (let i = this._itemsAboveRenderBlock; i < this._itemsAboveRenderBlock + this._itemsInRenderBlock; i++) {\n                    if (this._isCellVisible(this.props.itemList[i].key)) {\n                        foundVisibleItemBefore = true;\n                        break;\n                    }\n\n                    if (i === itemIndex) {\n                        break;\n                    }\n                }\n\n                if (!foundVisibleItemBefore) {\n                    // It's in a safe block above the known-height render area.\n                    if (this.props.logInfo) {\n                        this.props.logInfo('Added delta to fake space offset: ' + (oldHeight - newHeight) + ' -> ' +\n                            (this._heightAboveRenderAdjustment + (oldHeight - newHeight)));\n                    }\n\n                    this._heightAboveRenderAdjustment += (oldHeight - newHeight);\n                }\n            }\n\n            needsRecalc = true;\n        }\n\n        this._pendingMeasurements.delete(itemKey);\n        needsRecalc = needsRecalc || this._pendingMeasurements.size === 0;\n\n        if (needsRecalc) {\n            this._calcNewRenderedItemState(this.props);\n            this._renderIfDirty(this.props);\n        }\n\n        // See if we have accumulated enough error to require an adjustment.\n        this._reconcileCorrections(this.props);\n    };\n\n    private _onAnimateStartStopItem = (itemKey: string, animateStart: boolean) => {\n        if (this._isMounted) {\n            const hasAnimation = this._pendingAnimations.has(itemKey);\n            if (animateStart) {\n                assert(!hasAnimation, 'unexpected animation start');\n                this._pendingAnimations.add(itemKey);\n            } else {\n                assert(hasAnimation, 'unexpected animation complete');\n                this._pendingAnimations.delete(itemKey);\n\n                // We defer this because there are cases where we can cancel animations\n                // because we've received new props. We don't want to re-enter the\n                // routines with the old props, so we'll defer and wait for this.props\n                // to be updated.\n                _.defer(() => {\n                    if (this._isMounted) {\n                        if (this._pendingAnimations.size === 0 && this._isMounted) {\n                            // Perform deferred actions now that all animations are complete.\n                            this._reconcileCorrections(this.props);\n                        }\n                    }\n                });\n            }\n        }\n    };\n\n    private _onScroll = (scrollTop: number, scrollLeft: number) => {\n        if (this._lastScrollTop === scrollTop) {\n            // Already know about it!\n            if (this.props.logInfo) {\n                this.props.logInfo('Got Known Scroll: ' + scrollTop);\n            }\n            return;\n        }\n\n        this._lastScrollTop = scrollTop;\n\n        // We scrolled, so update item state.\n        this._calcNewRenderedItemState(this.props);\n\n        this._renderIfDirty(this.props);\n\n        // See if we have accumulated enough error to require an adjustment.\n        this._reconcileCorrections(this.props);\n\n        if (this.props.onScroll) {\n            this.props.onScroll(scrollTop, scrollLeft);\n        }\n    };\n\n    // Some things to keep in mind during this function:\n    // * Item heights are all in a fixed state from the beginning to the end of the function. The total\n    //   container height will never change through the course of the function. We're only deciding what\n    //   to bother rendering/culling and where to place items within the container.\n    // * We're going to, in order: cull unnecessary items, add new items, and position them within the container.\n    private _calcNewRenderedItemState(props: VirtualListViewProps<ItemInfo>): void {\n        if (this._layoutHeight === 0) {\n            // Wait until we get a height before bothering.\n            return;\n        }\n\n        if (props.itemList.length === 0) {\n            // Can't possibly be rendering anything.\n            return;\n        }\n\n        if (this._pendingMeasurements.size > 0) {\n            // Don't bother if we're still measuring things. Wait for the last batch to end.\n            return;\n        }\n\n        // What's the top/bottom line that we'll cull items that are wholly outside of?\n        const cullMargin = Math.max(this._layoutHeight * this._cullFraction, this._minCullAmount);\n        const topCullLine = this._lastScrollTop - cullMargin;\n        const bottomCullLine = this._lastScrollTop + this._layoutHeight + cullMargin;\n\n        // Do we need to cut anything out of the top because we've scrolled away from it?\n        while (this._itemsInRenderBlock > 0) {\n            const itemIndex = this._itemsAboveRenderBlock;\n            const item = props.itemList[itemIndex];\n            if (!this._isItemHeightKnown(item)) {\n                break;\n            }\n\n            const itemHeight = this._getHeightOfItem(item);\n            if (this._heightAboveRenderAdjustment + this._heightAboveRenderBlock + itemHeight >= topCullLine) {\n                // We're rendering up to the top render line, so don't need to nuke any more.\n                break;\n            }\n\n            this._itemsInRenderBlock--;\n            this._heightOfRenderBlock -= itemHeight;\n            this._itemsAboveRenderBlock++;\n            this._heightAboveRenderBlock += itemHeight;\n            this._recycleCell(item.key);\n\n            if (props.logInfo) {\n                props.logInfo('Culled Item From Top: ' + item.key);\n            }\n        }\n\n        // Do we need to cut anything out of the bottom because we've scrolled away from it?\n        while (this._itemsInRenderBlock > 0) {\n            const itemIndex = this._itemsAboveRenderBlock + this._itemsInRenderBlock - 1;\n            const item = props.itemList[itemIndex];\n            if (!this._isItemHeightKnown(item)) {\n                break;\n            }\n\n            const itemHeight = this._getHeightOfItem(item);\n            if (this._heightAboveRenderAdjustment + this._heightAboveRenderBlock + this._heightOfRenderBlock\n                - itemHeight <= bottomCullLine) {\n                break;\n            }\n\n            this._itemsInRenderBlock--;\n            this._heightOfRenderBlock -= itemHeight;\n            this._itemsBelowRenderBlock++;\n            this._heightBelowRenderBlock += itemHeight;\n            this._recycleCell(item.key);\n\n            if (props.logInfo) {\n                props.logInfo('Culled Item From Bottom: ' + item.key);\n            }\n        }\n\n        // Determine what the line is that we're rendering up to. If we haven't yet filled a screen,\n        // first get the screen full before over-rendering.\n        const overdrawAmount = this._calcOverdrawAmount();\n        let renderMargin = this._isInitialFillComplete ? overdrawAmount : 0;\n        let renderBlockTopLimit = this._lastScrollTop - renderMargin;\n        let renderBlockBottomLimit = this._lastScrollTop + this._layoutHeight + renderMargin;\n\n        if (this._itemsInRenderBlock === 0) {\n            let yPosition = this._heightAboveRenderAdjustment;\n            this._itemsAboveRenderBlock = 0;\n\n            // Find the first item that's in the render block and add it.\n            for (let i = 0; i < props.itemList.length; i++) {\n                const item = props.itemList[i];\n                const itemHeight = this._getHeightOfItem(item);\n\n                yPosition += itemHeight;\n\n                if (yPosition > renderBlockTopLimit) {\n                    this._itemsAboveRenderBlock = i;\n                    this._itemsInRenderBlock = 1;\n\n                    this._allocateCell(item.key, item.template, i, !item.measureHeight, item.height,\n                        yPosition - itemHeight, this._shouldShowItem(item, props));\n\n                    if (!this._isItemHeightKnown(item)) {\n                        this._pendingMeasurements.add(item.key);\n                    }\n                    break;\n                }\n            }\n\n            this._itemsBelowRenderBlock = props.itemList.length - this._itemsAboveRenderBlock - this._itemsInRenderBlock;\n            this._heightAboveRenderBlock = this._calcHeightOfItems(props, 0, this._itemsAboveRenderBlock - 1);\n            this._heightOfRenderBlock = this._calcHeightOfItems(props, this._itemsAboveRenderBlock,\n                this._itemsAboveRenderBlock + this._itemsInRenderBlock - 1);\n            this._heightBelowRenderBlock = this._calcHeightOfItems(props,\n                this._itemsAboveRenderBlock + this._itemsInRenderBlock, props.itemList.length - 1);\n        }\n\n        // What is the whole height of the scroll region? We need this both for calculating bottom\n        // offsets as well as for making the view render to the proper height since we're using\n        // position: absolute for all placements.\n        const itemBlockHeight = this._heightAboveRenderAdjustment + this._heightAboveRenderBlock +\n            this._heightOfRenderBlock + this._heightBelowRenderBlock;\n        const containerHeight = Math.max(itemBlockHeight, this._layoutHeight);\n\n        // Render the actual items now!\n        let yPosition = this._heightAboveRenderBlock + this._heightAboveRenderAdjustment;\n\n        let topOfRenderBlockY = yPosition;\n\n        // Start by checking heights/visibility of everything in the render block before we add to it.\n        for (let i = 0; i < this._itemsInRenderBlock; i++) {\n            const itemIndex = this._itemsAboveRenderBlock + i;\n            const item = props.itemList[itemIndex];\n\n            this._setCellTopAndVisibility(item.key, this._shouldShowItem(item, props),\n                yPosition, !!this.props.animateChanges);\n\n            const height = this._getHeightOfItem(item);\n            yPosition += height;\n        }\n\n        let bottomOfRenderBlockY = yPosition;\n\n        // See if the container height needs adjusting.\n        if (containerHeight !== this._containerHeight) {\n            if (props.logInfo) {\n                props.logInfo('Container Height Change: ' + this._containerHeight + ' to ' + containerHeight);\n            }\n            this._containerHeight = containerHeight;\n            this._containerHeightValue.setValue(containerHeight);\n        }\n\n        // Reuse an item-builder.\n        const buildItem = (itemIndex: number, above: boolean) => {\n            const item = props.itemList[itemIndex];\n            const isHeightKnown = this._isItemHeightKnown(item);\n            const itemHeight = this._getHeightOfItem(item);\n            assert(itemHeight > 0, 'list items should always have non-zero height');\n\n            this._itemsInRenderBlock++;\n            this._heightOfRenderBlock += itemHeight;\n            let yPlacement: number;\n            if (above) {\n                this._itemsAboveRenderBlock--;\n                this._heightAboveRenderBlock -= itemHeight;\n                topOfRenderBlockY -= itemHeight;\n                yPlacement = topOfRenderBlockY;\n            } else {\n                this._itemsBelowRenderBlock--;\n                this._heightBelowRenderBlock -= itemHeight;\n                yPlacement = bottomOfRenderBlockY;\n                bottomOfRenderBlockY += itemHeight;\n            }\n\n            if (!isHeightKnown) {\n                this._pendingMeasurements.add(item.key);\n            }\n\n            this._allocateCell(item.key, item.template, itemIndex, !item.measureHeight, item.height,\n                yPlacement, this._shouldShowItem(item, props));\n\n            if (props.logInfo) {\n                props.logInfo('New Item On ' + (above ? 'Top' : 'Bottom') + ': ' + item.key);\n            }\n        };\n\n        // Try to add items to the bottom of the current render block.\n        while (this._pendingMeasurements.size < _maxSimultaneousMeasures) {\n            // Stop if we go beyond the bottom render limit.\n            if (this._itemsBelowRenderBlock <= 0 ||\n                this._heightAboveRenderAdjustment + this._heightAboveRenderBlock +\n                this._heightOfRenderBlock >= renderBlockBottomLimit) {\n                break;\n            }\n\n            buildItem(this._itemsAboveRenderBlock + this._itemsInRenderBlock, false);\n        }\n\n        // Try to add an item to the top of the current render block.\n        while (this._pendingMeasurements.size < _maxSimultaneousMeasures) {\n            if (this._itemsAboveRenderBlock <= 0 ||\n                this._heightAboveRenderAdjustment + this._heightAboveRenderBlock <= renderBlockTopLimit) {\n                break;\n            }\n\n            buildItem(this._itemsAboveRenderBlock - 1, true);\n        }\n\n        // See if we've filled the screen and rendered it, and we're not waiting on any measurements.\n        if (!this._isInitialFillComplete && !this._isRenderDirty && this._pendingMeasurements.size === 0) {\n            // Time for overrender. Recalc render lines.\n            renderMargin = overdrawAmount;\n            renderBlockTopLimit = this._lastScrollTop - renderMargin;\n            renderBlockBottomLimit = this._lastScrollTop + this._layoutHeight + renderMargin;\n\n            this._popInvisibleIntoView(props);\n\n            // Render pass again!\n            this._componentDidRender();\n        }\n\n        if (props.logInfo) {\n            props.logInfo('CalcNewRenderedItemState: O:' + this._heightAboveRenderAdjustment +\n                ' + A:' + this._heightAboveRenderBlock + ' + R:' + this._heightOfRenderBlock + ' + B:' +\n                    this._heightBelowRenderBlock + ' = ' + itemBlockHeight + ', FilledViewable: ' + this._isInitialFillComplete);\n        }\n    }\n\n    private _reconcileCorrections(props: VirtualListViewProps<ItemInfo>) {\n        // If there are pending animations, don't adjust because it will disrupt\n        // the animations. When all animations are complete, we will get called back.\n        if (this._pendingAnimations.size > 0) {\n            return;\n        }\n\n        // Calculate the max amount of error we want to accumulate before we adjust\n        // the content height size. We don't want to do this too often because it's\n        // expensive, but we also don't want to let the error get too great because\n        // the scroll bar thumb will not accurately reflect the scroll position.\n        let maxFakeSpaceOffset = 0; // Math.max(this._layoutHeight / 2, 256);\n\n        // If the user has scrolled all the way to the boundary of the rendered area,\n        // we can't afford any error.\n        if (this._lastScrollTop === 0 || this._lastScrollTop < this._heightAboveRenderAdjustment) {\n            maxFakeSpaceOffset = 0;\n        }\n\n        // Did the error amount exceed our limit?\n        if (Math.abs(this._heightAboveRenderAdjustment) > maxFakeSpaceOffset) {\n            if (props.logInfo) {\n                props.logInfo('Removing _heightAboveRenderAdjustment');\n            }\n\n            // We need to adjust the content height, the positions of the rendered items\n            // and the scroll position as atomically as possible.\n            const newContainerHeight = this._containerHeight - this._heightAboveRenderAdjustment;\n            if (props.logInfo) {\n                props.logInfo('Container Height Change: ' + this._containerHeight + ' to ' + newContainerHeight);\n            }\n            this._containerHeight = newContainerHeight;\n            this._containerHeightValue.setValue(newContainerHeight);\n\n            for (let i = this._itemsAboveRenderBlock; i < this._itemsAboveRenderBlock + this._itemsInRenderBlock; i++) {\n                const item = props.itemList[i];\n                const cell = this._activeCells.get(item.key)!;\n                this._setCellTopAndVisibility(item.key, cell.isVisible,\n                    cell.top - this._heightAboveRenderAdjustment, false);\n            }\n\n            // Clear the adjustment.\n            this._heightAboveRenderAdjustment = 0;\n        }\n    }\n\n    private _popInvisibleIntoView(props: VirtualListViewProps<ItemInfo>) {\n        if (props.logInfo) {\n            props.logInfo('Popping invisible items into view');\n        }\n\n        this._isInitialFillComplete = true;\n\n        // Update styles now to snap everything into view.\n        for (let i = 0; i < this._itemsInRenderBlock; i++) {\n            const itemIndex = this._itemsAboveRenderBlock + i;\n            const item = props.itemList[itemIndex];\n            const cellInfo = this._activeCells.get(item.key)!;\n            this._setCellTopAndVisibility(item.key, this._shouldShowItem(item, props),\n                cellInfo.top, false);\n        }\n    }\n\n    private _resizeAllItems(props: VirtualListViewProps<ItemInfo>) {\n        if (this._layoutWidth > 0 && this._layoutWidth !== this._contentWidth) {\n            this._contentWidth = this._layoutWidth;\n            this.forceUpdate();\n        }\n    }\n\n    private _renderIfDirty(props: VirtualListViewProps<ItemInfo>): void {\n        if (this._isRenderDirty) {\n            if (this._isMounted) {\n                this.forceUpdate();\n            }\n        }\n    }\n\n    // Cell Management Methods\n\n    private _allocateCell(itemKey: string, itemTemplate: string | undefined, itemIndex: number, isHeightConstant: boolean,\n            height: number, top: number, isVisible: boolean): VirtualCellInfo<ItemInfo> {\n        let newCell = this._activeCells.get(itemKey);\n\n        if (!newCell) {\n            // If there's a specified template, see if we can find an existing\n            // recycled cell that we can reuse with the same template.\n            if (itemTemplate && isHeightConstant) {\n                // See if we can find an exact match both in terms of template and previous key.\n                // This has the greatest chance of rendering the same as previously.\n                let bestOptionIndex = _.findIndex(this._recycledCells, cell => cell.itemTemplate === itemTemplate &&\n                    cell.cachedItemKey === itemKey && cell.height === height);\n\n                // We couldn't find an exact match. Try to find one with the same template.\n                if (bestOptionIndex < 0) {\n                    bestOptionIndex = _.findIndex(this._recycledCells, cell => cell.itemTemplate === itemTemplate);\n                }\n\n                if (bestOptionIndex >= 0) {\n                    newCell = this._recycledCells[bestOptionIndex];\n                    this._recycledCells.splice(bestOptionIndex, 1);\n                }\n            }\n        }\n\n        if (newCell) {\n            // We found an existing cell. Repurpose it.\n            newCell.isVisible = isVisible;\n            newCell.top = top;\n            newCell.shouldUpdate = true;\n\n            assert(newCell.isHeightConstant === isHeightConstant, 'isHeightConstant assumed to not change');\n            assert(newCell.itemTemplate === itemTemplate, 'itemTemplate assumed to not change');\n\n            const mountedCell = newCell.cellRef.current;\n            if (mountedCell) {\n                mountedCell.setVisibility(isVisible);\n                mountedCell.setTop(top);\n                mountedCell.setItemKey(itemKey);\n            }\n        } else {\n            // We didn't find a recycled cell that we could use. Allocate a new one.\n            newCell = {\n                cellRef: createRef<VirtualListCell<ItemInfo>>(),\n                virtualKey: _virtualKeyPrefix + VirtualListView._nextCellKey,\n                itemTemplate: itemTemplate,\n                isHeightConstant: isHeightConstant,\n                height: height,\n                cachedItemKey: itemKey,\n                top: top,\n                isVisible: isVisible,\n                shouldUpdate: true,\n            };\n            VirtualListView._nextCellKey += 1;\n        }\n\n        this._isRenderDirty = true;\n        this._activeCells.set(itemKey, newCell);\n        return newCell;\n    }\n\n    private _recycleCell(itemKey: string) {\n        const virtualCellInfo = this._activeCells.get(itemKey);\n\n        if (virtualCellInfo) {\n            if (this._maxRecycledCells > 0) {\n                this._setCellTopAndVisibility(itemKey, false, virtualCellInfo.top, false);\n\n                // Is there a \"template\" hint associated with this cell? If so,\n                // we may be able to reuse it later.\n                if (virtualCellInfo.itemTemplate && virtualCellInfo.isHeightConstant) {\n                    this._recycledCells.push(virtualCellInfo);\n\n                    if (this._recycledCells.length > this._maxRecycledCells) {\n                        // Delete the oldest recycled cell.\n                        this._recycledCells.splice(0, 1);\n                        this._isRenderDirty = true;\n                    }\n                } else {\n                    // Re-render to force the cell to be unmounted.\n                    this._isRenderDirty = true;\n                }\n            }\n\n            this._activeCells.delete(itemKey);\n        }\n    }\n\n    private _setCellTopAndVisibility(itemKey: string, isVisibile: boolean, top: number,\n            animateIfPreviouslyVisible: boolean) {\n\n        const cellInfo = this._activeCells.get(itemKey);\n        if (!cellInfo) {\n            assert(false, 'Missing cell');\n            return;\n        }\n\n        // Disable animation for Android when screen reader is on.\n        // This is needed to make sure screen reader order is correct.\n        const animate = animateIfPreviouslyVisible && cellInfo.isVisible && !this._isAndroidScreenReaderEnabled();\n\n        cellInfo.isVisible = isVisibile;\n        cellInfo.top = top;\n\n        // Set the \"live\" values as well.\n        const cell = cellInfo.cellRef.current;\n        if (cell) {\n            cell.setVisibility(isVisibile);\n            cell.setTop(top, animate);\n        }\n    }\n\n    private _isCellVisible(itemKey: string): boolean {\n        const cellInfo = this._activeCells.get(itemKey);\n        return (!!cellInfo && cellInfo.isVisible);\n    }\n\n    scrollToTop = (animated = true, top = 0) => {\n        const scrollView = this._scrollViewRef.current;\n        if (scrollView) {\n            scrollView.setScrollTop(top, animated);\n        }\n    };\n\n    render() {\n        const itemsRendered: JSX.Element[] = [];\n        this._navigatableItemsRendered = [];\n\n        if (this.props.logInfo) {\n            this.props.logInfo('Rendering ' + this._itemsInRenderBlock + ' Items...');\n        }\n\n        // Build a list of all the cells we're going to render. This includes all of the active\n        // cells plus any recycled (offscreen) cells.\n        let cellList: {\n            cellInfo: VirtualCellInfo<ItemInfo>;\n            item: ItemInfo | undefined;\n            itemIndex: number | undefined;\n        }[] = [];\n\n        for (let i = 0; i < this._itemsInRenderBlock; i++) {\n            const itemIndex = this._itemsAboveRenderBlock + i;\n            const item = this.props.itemList[itemIndex];\n\n            const virtualCellInfo = this._activeCells.get(item.key)!;\n            assert(virtualCellInfo, 'Active Cell not found for key ' + item.key + ', index=' + i);\n\n            cellList.push({\n                cellInfo: virtualCellInfo,\n                item: item,\n                itemIndex: itemIndex,\n            });\n\n            if (item.isNavigable) {\n                this._navigatableItemsRendered.push({ key: item.key, vc_key: virtualCellInfo.virtualKey });\n            }\n        }\n\n        for (const virtualCellInfo of this._recycledCells) {\n            assert(virtualCellInfo, 'Recycled Cells array contains a null/undefined object');\n            cellList.push({\n                cellInfo: virtualCellInfo,\n                item: undefined,\n                itemIndex: undefined,\n            });\n        }\n\n        // Sort the list of cells by virtual key so the order doesn't change. Otherwise\n        // the underlying render engine (the browser or React Native) treat it as a DOM\n        // change, and perf suffers.\n        cellList = cellList.sort((a, b) => a.cellInfo.virtualKey < b.cellInfo.virtualKey ? 1 : -1);\n\n        let focusIndex: number | undefined;\n        if (this.state.lastFocusedItemKey === undefined) {\n            const itemToFocus = _.minBy(cellList, cell => {\n                if (!cell.item || !cell.item.isNavigable) {\n                    return Number.MAX_VALUE;\n                }\n                return cell.itemIndex;\n            });\n\n            if (itemToFocus) {\n                focusIndex = itemToFocus.itemIndex;\n            }\n        }\n\n        for (const cell of cellList) {\n            let tabIndexValue = -1;\n            let isFocused = false;\n            let isSelected = false;\n            if (cell.item) {\n                if (cell.item.isNavigable) {\n                    if (cell.itemIndex === focusIndex) {\n                        tabIndexValue = 0;\n                    } else {\n                        tabIndexValue = cell.item.key === this.state.lastFocusedItemKey ? 0 : -1;\n                    }\n\n                    if (cell.item.key === this.state.selectedItemKey) {\n                        isSelected = true;\n                    }\n                }\n\n                if (cell.item.key === this.state.lastFocusedItemKey) {\n                    isFocused = true;\n                }\n            }\n\n            // We disable transform in Android because it creates problem for screen reader order.\n            // We update the keys in order to make sure we re-render cells, as once we enable native animation for a view.\n            // We can't disable it.\n            itemsRendered.push(\n                <VirtualListCell\n                    ref={ cell.cellInfo.cellRef }\n                    key={ this._isAndroidScreenReaderEnabled() ? _accessibilityVirtualKeyPrefix +\n                        cell.cellInfo.virtualKey : cell.cellInfo.virtualKey }\n                    onLayout={ !cell.cellInfo.isHeightConstant ? this._onLayoutItem : undefined }\n                    onAnimateStartStop={ this._onAnimateStartStopItem }\n                    itemKey={ cell.item ? cell.item.key : undefined }\n                    item={ cell.item }\n                    left={ 0 }\n                    width={ this._contentWidth }\n                    top={ cell.cellInfo.top }\n                    isVisible={ cell.cellInfo.isVisible }\n                    isActive={ cell.item ? true : false }\n                    isFocused={ isFocused }\n                    isSelected={ isSelected }\n                    tabIndex={ tabIndexValue }\n                    onItemFocused={ this._onItemFocused }\n                    onItemSelected={ this._onItemSelected }\n                    shouldUpdate={ !this.props.skipRenderIfItemUnchanged || cell.cellInfo.shouldUpdate }\n                    showOverflow={ this.props.showOverflow }\n                    isScreenReaderModeEnabled={ this._isAndroidScreenReaderEnabled() }\n                    renderItem={ this.props.renderItem }\n                    onKeyPress={ this._onKeyDown }\n                />,\n            );\n\n            cell.cellInfo.shouldUpdate = false;\n        }\n\n        if (this.props.logInfo) {\n            // [NOTE: For debugging] This shows the order in which virtual cells are laid out.\n            const domOrder = _.map(cellList, c => {\n                const itemKey = c.item ? c.item.key : null;\n                const itemIndex = c.item ? c.itemIndex : null;\n                return 'vKey: ' + c.cellInfo.virtualKey + ' iKey: ' + itemKey + ' iIdx: ' + itemIndex;\n            }).join('\\n');\n            this.props.logInfo(domOrder);\n            this.props.logInfo('Item Render Complete');\n        }\n\n        const scrollViewStyle = [_styles.scrollContainer];\n        let staticContainerStyle: (RX.Types.ViewStyleRuleSet | RX.Types.AnimatedViewStyleRuleSet)[] = [_styles.staticContainer];\n        if (this.props.style) {\n            if (Array.isArray(this.props.style)) {\n                staticContainerStyle = staticContainerStyle.concat(this.props.style as RX.Types.ViewStyleRuleSet[]);\n            } else {\n                staticContainerStyle.push(this.props.style as RX.Types.ViewStyleRuleSet);\n            }\n        }\n\n        staticContainerStyle.push(this._containerAnimatedStyle);\n\n        return (\n            <RX.ScrollView\n                ref={ this._scrollViewRef }\n                testId={ this.props.testId }\n                onLayout={ this._onLayoutContainer }\n                onScroll={ this._onScroll }\n                scrollXAnimatedValue={ this.props.scrollXAnimatedValue }\n                scrollYAnimatedValue={ this.props.scrollYAnimatedValue }\n                keyboardDismissMode={ this.props.keyboardDismissMode }\n                keyboardShouldPersistTaps={ this.props.keyboardShouldPersistTaps }\n                scrollsToTop={ this.props.scrollsToTop }\n                scrollEventThrottle={ this.props.scrollEventThrottle || 32 } // 32ms throttle -> ~30 events per second max\n                style={ scrollViewStyle }\n                bounces={ !this.props.disableBouncing }\n                onKeyPress={ this._onKeyDown }\n                scrollEnabled={ !this.props.disableScrolling }\n                scrollIndicatorInsets={ this.props.scrollIndicatorInsets }\n            >\n                <RX.Animated.View style={ staticContainerStyle }>\n                    { itemsRendered }\n                </RX.Animated.View>\n            </RX.ScrollView>\n        );\n    }\n\n    private _onItemFocused = (itemInfo?: ItemInfo) => {\n        if (itemInfo) {\n            this.setState({\n                lastFocusedItemKey: itemInfo.key,\n                isFocused: true,\n            });\n        } else {\n            this.setState({ isFocused: false });\n        }\n\n        if (this.props.onItemFocused) {\n            this.props.onItemFocused(itemInfo);\n        }\n    };\n\n    // Sets selection & focus to specified key\n    selectItemKey(key: string, scrollToItem = true) {\n        // Set focus and selection\n        this.setState({\n            lastFocusedItemKey: key,\n            selectedItemKey: key,\n        });\n        if (scrollToItem) {\n            this._scrollToItemKey(key);\n        }\n    }\n\n    private _onItemSelected = (itemInfo?: ItemInfo) => {\n        if (itemInfo) {\n            this.selectItemKey(itemInfo.key, false);\n            if (this.props.onItemSelected) {\n                this.props.onItemSelected(itemInfo);\n            }\n        }\n    };\n\n    private _onKeyDown = (e: RX.Types.KeyboardEvent) => {\n        if (!this._scrollViewRef.current ||\n                (e.keyCode !== _keyCodeUpArrow && e.keyCode !== _keyCodeDownArrow)) {\n            return;\n        }\n\n        // Is it an \"up arrow\" key?\n        if (e.keyCode === _keyCodeUpArrow) {\n            this._focusSubsequentItem(FocusDirection.Up, true);\n            e.preventDefault();\n        // Is it a \"down arrow\" key?\n        } else if (e.keyCode === _keyCodeDownArrow) {\n            this._focusSubsequentItem(FocusDirection.Down, true);\n            e.preventDefault();\n        }\n    };\n\n    private _scrollToItemKey(key: string): void {\n        let indexToSelect: number | undefined;\n        _.each(this.props.itemList, (item, idx) => {\n            if (item.key === key) {\n                indexToSelect = idx;\n                return true;\n            }\n        });\n\n        if (indexToSelect !== undefined) {\n            this._scrollToItemIndex(indexToSelect);\n        }\n    }\n\n    private _scrollToItemIndex(index: number): void {\n        this.scrollToTop(false, this._calcHeightOfItems(this.props, 0, index - 1) - (this.props.keyboardFocusScrollOffset || 0));\n    }\n\n    // Returns true if successfully found/focused, false if not found/focused\n    private _focusSubsequentItem(direction: FocusDirection, viaKeyboard: boolean, retry = true): boolean {\n        let index: number | undefined = _.findIndex(this._navigatableItemsRendered, item => item.key === this.state.lastFocusedItemKey);\n\n        if (index !== -1 && index + direction > -1 && index + direction < this._navigatableItemsRendered.length) {\n            const newFocusKey = this._navigatableItemsRendered[index + direction].key;\n            const cellForFocus = this._activeCells.get(newFocusKey);\n            if (cellForFocus && cellForFocus.cellRef.current) {\n                const newElementForFocus = cellForFocus.cellRef.current;\n                newElementForFocus.focus();\n                if (viaKeyboard && newElementForFocus.props.itemKey) {\n                    this._scrollToItemKey(newElementForFocus.props.itemKey);\n                }\n            }\n            return true;\n        }\n\n        if (index === -1 && retry && this.state.lastFocusedItemKey !== undefined) {\n            index = this._itemMap.get(this.state.lastFocusedItemKey);\n\n            if (index === undefined) {\n                assert(false, 'Something went wrong in finding last focused item');\n                return false;\n            }\n\n            const height = index === 0 ? 0 : this._calcHeightOfItems(this.props, 0, index - 1);\n            this.scrollToTop(false, height);\n            this._pendingFocusDirection = direction;\n            return true;\n        }\n        return false;\n    }\n\n    private _screenReaderStateChanged = (isEnabled: boolean) => {\n        if (isEnabled) {\n            this._setupForAccessibility();\n\n            if (_isNativeAndroid) {\n                // We need to re-render virtual cells.\n                this._isRenderDirty = true;\n            }\n\n            this._renderIfDirty(this.props);\n        } else {\n            this._tearDownForAccessibility();\n        }\n    };\n\n    componentDidMount() {\n        RX.Accessibility.screenReaderChangedEvent.subscribe(this._screenReaderStateChanged);\n\n        if (RX.Accessibility.isScreenReaderEnabled()) {\n            this._setupForAccessibility();\n        }\n\n        this._isMounted = true;\n        this._componentDidRender();\n\n        // If an initial selection key was provided, ensure that we scroll to the item\n        if (this.props.initialSelectedKey) {\n            this._scrollToItemKey(this.props.initialSelectedKey);\n        }\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n\n        RX.Accessibility.screenReaderChangedEvent.unsubscribe(this._screenReaderStateChanged);\n    }\n\n    componentDidUpdate(prevProps: VirtualListViewProps<ItemInfo>) {\n        this._componentDidRender();\n    }\n\n    protected _componentDidRender() {\n        if (this.props.logInfo) {\n            this.props.logInfo('Component Did Render');\n        }\n\n        this._isRenderDirty = false;\n\n        // If we don't defer this, we can end up overflowing the stack\n        // because one render immediately causes another render to be started.\n        _.defer(() => {\n            if (this._isMounted) {\n                this._calcNewRenderedItemState(this.props);\n                this._renderIfDirty(this.props);\n                this._reconcileCorrections(this.props);\n                this._setFocusIfNeeded();\n            }\n        });\n    }\n\n    // If there was a pending focus setting before we re-rendered, set the same.\n    private _setFocusIfNeeded() {\n        if (this._pendingFocusDirection) {\n            this._focusSubsequentItem(this._pendingFocusDirection, false, false /* do not retry if this fails */);\n            this._pendingFocusDirection = undefined;\n        }\n    }\n\n    // Local helper functions for item information\n    private _shouldShowItem(item: VirtualListViewItemInfo, props: VirtualListViewProps<ItemInfo>): boolean {\n        const isMeasuring = !this._isItemHeightKnown(item);\n        const shouldHide = isMeasuring || !this._isInitialFillComplete;\n        return !shouldHide;\n    }\n\n    private _calcHeightOfItems(props: VirtualListViewProps<ItemInfo>, startIndex: number, endIndex: number) {\n        let count = 0;\n        for (let i = startIndex; i <= endIndex; i++) {\n            count += this._getHeightOfItem(props.itemList[i]);\n        }\n        return count;\n    }\n\n    private _isItemHeightKnown(item: VirtualListViewItemInfo) {\n        return !item.measureHeight || this._heightCache.has(item.key);\n    }\n\n    private _getHeightOfItem(item: VirtualListViewItemInfo | undefined) {\n        if (!item) {\n            return 0;\n        }\n\n        // See if the item height was passed as \"known\"\n        if (!item.measureHeight) {\n            return item.height;\n        }\n\n        // See if we have it cached\n        const cachedHeight = this._heightCache.get(item.key);\n        if (cachedHeight !== undefined) {\n            return cachedHeight;\n        }\n\n        // Nope -- use guess given to us\n        return item.height;\n    }\n}\n"
  },
  {
    "path": "extensions/virtuallistview/src/assert.ts",
    "content": "/**\n * assert\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n */\nconst assert = (cond: any, message?: string | undefined): void => {\n    if (!cond) {\n        throw new Error(message || 'Assertion Failed');\n    }\n};\n\nexport default assert;\n"
  },
  {
    "path": "extensions/virtuallistview/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"importHelpers\": true,\n        \"downlevelIteration\": false,\n        \"jsx\": \"react\",\n        \"reactNamespace\": \"RX\",\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"outDir\": \"dist/\",\n        \"skipLibCheck\": true,\n        \"strict\": true,\n        \"lib\": [\n            \"es5\",\n            \"dom\",\n            \"es2015.collection\",\n            \"es2015.iterable\"\n        ],\n        \"types\" : [\"lodash\", \"react\", \"react-dom\"]\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"dist\",\n        \"node_modules\"\n    ]\n}\n"
  },
  {
    "path": "extensions/webview/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {},\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"PluginBaseChecker.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "extensions/webview/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Dependency directories\nnode_modules\npackage-lock.json\n\n# Optional npm cache directory\n.npm\n\n# Build artifacts\n**/dist\n\n# Miscellaneous user files\n*.user\n.vscode\n.DS_STORE\n\n"
  },
  {
    "path": "extensions/webview/.npmignore",
    "content": "/node_modules\n/src/.vs\n/src/bin\n/src/obj\n*.user\n"
  },
  {
    "path": "extensions/webview/README.md",
    "content": "# reactxp-webview\nThis module provides a cross-platform control that allows the display of an independent web page within the [ReactXP](https://microsoft.github.io/reactxp/) library. This used to be a part of ReactXP core, but was extracted to be a standalone module inline with React Native `Lean Core` initiative. This exists as a standalone module to prevent users of ReactXP from having to link native modules when getting started.\n\n## Getting Started\nThis module relies on [react-native-webview](https://www.npmjs.com/package/react-native-webview) and will need to be added into the react native project. Follow the instructions in their [Getting Started](https://github.com/react-native-webview/react-native-webview/blob/HEAD/docs/Getting-Started.md) guide to properly add the package to the project.\n\n## Documentation\nFor detailed documentation, look [here](https://microsoft.github.io/reactxp/docs/extensions/webview.html).\n\n### Prerequisites\n* [ReactXP](https://github.com/microsoft/reactxp/)\n\n## Contributing\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. \n\nYou must sign a Contribution License Agreement (CLA) before your PR will be merged. This a one-time requirement for Microsoft projects in GitHub. You can read more about [Contribution License Agreements (CLA)](https://en.wikipedia.org/wiki/Contributor_License_Agreement) on Wikipedia. You can sign the Microsoft Contribution License Agreement by visiting https://cla.microsoft.com/. Use your GitHub account to login.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "extensions/webview/index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/android/PluginBase.js');\n"
  },
  {
    "path": "extensions/webview/index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/ios/PluginBase.js');\n"
  },
  {
    "path": "extensions/webview/index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/PluginBase.js');\n"
  },
  {
    "path": "extensions/webview/index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/macos/PluginBase.js');\n"
  },
  {
    "path": "extensions/webview/index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/windows/PluginBase.js');\n"
  },
  {
    "path": "extensions/webview/package.json",
    "content": "{\n  \"name\": \"reactxp-webview\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Plugin for ReactXP that provides a control that allows the display of an independent web page\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"react-native-webview\": \"^7.5.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"react-dom\": \"^16.3\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/react-native\": \"0.60.30\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"react\": \"^16.3.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"types\": \"dist/web/PluginBase.d.ts\"\n}\n"
  },
  {
    "path": "extensions/webview/src/android/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Android implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport WebView from '../native-common/WebView';\n\nexport { WebView as default, Types };\n"
  },
  {
    "path": "extensions/webview/src/common/Interfaces.ts",
    "content": "/*\n * Interfaces.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Interface definition for cross-platform ReactXP plugin for a control that allows the\n * display of an independent web page. This was extracted from the reactxp core\n */\n\nimport * as Types from './Types';\n\nexport interface PluginInterface {\n    Types: typeof Types;\n\n    default: typeof Types.WebView;\n}\n"
  },
  {
    "path": "extensions/webview/src/common/PluginBaseChecker.ts",
    "content": "/*\n * PluginBaseChecker.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type check all the pluginbase exports against the desired interface.\n */\n\nimport * as AndroidPlugin from '../android/PluginBase';\nimport * as iOSPlugin from '../ios/PluginBase';\nimport * as macOSPlugin from '../macos/PluginBase';\nimport * as WebPlugin from '../web/PluginBase';\nimport * as WindowsPlugin from '../windows/PluginBase';\n\nimport * as Interfaces from './Interfaces';\n\nconst _typeCheckerAndroid: Interfaces.PluginInterface = AndroidPlugin;\nconst _typeCheckeriOS: Interfaces.PluginInterface = iOSPlugin;\nconst _typeCheckermacOS: Interfaces.PluginInterface = macOSPlugin;\nconst _typeCheckerWeb: Interfaces.PluginInterface = WebPlugin;\nconst _typeCheckerWindows: Interfaces.PluginInterface = WindowsPlugin;\n"
  },
  {
    "path": "extensions/webview/src/common/Types.ts",
    "content": "/*\n * Types.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definitions to support the plugin.\n */\n\nimport { Component as ReactComponent } from 'react';\nimport { Types as RXTypes } from 'reactxp';\n\nexport interface WebViewNavigationState {\n    canGoBack: boolean;\n    canGoForward: boolean;\n    loading: boolean;\n    url: string;\n    title: string;\n    readonly navigationType: 'click' | 'formsubmit' | 'backforward' | 'reload' | 'formresubmit' | 'other';\n}\n\nexport interface WebViewErrorState extends WebViewNavigationState {\n    description: string;\n    domain: string;\n    code: string;\n}\n\nexport enum WebViewSandboxMode {\n    None = 0,\n    AllowForms = 1 << 0,\n    AllowModals = 1 << 1,\n    AllowOrientationLock = 1 << 2,\n    AllowPointerLock = 1 << 3,\n    AllowPopups = 1 << 4,\n    AllowPopupsToEscapeSandbox = 1 << 5,\n    AllowPresentation = 1 << 6,\n    AllowSameOrigin = 1 << 7,\n    AllowScripts = 1 << 8,\n    AllowTopNavigation = 1 << 9,\n    AllowMixedContentAlways = 1 << 10,\n    AllowMixedContentCompatibilityMode = 1 << 11\n}\n\nexport interface WebViewSource {\n    html: string;\n    baseUrl?: string;\n}\n\nexport interface WebViewShouldStartLoadEvent {\n    url: string;\n}\n\nexport interface WebViewNavigationEvent extends RXTypes.SyntheticEvent {\n    nativeEvent: WebViewNavigationState;\n}\n\nexport interface WebViewErrorEvent extends RXTypes.SyntheticEvent {\n    nativeEvent: WebViewErrorState;\n}\n\nexport interface WebViewMessageEvent extends RXTypes.SyntheticEvent {\n    data: string;\n    origin: string;\n}\n\nexport interface WebViewProps extends RXTypes.CommonStyledProps<RXTypes.ViewStyleRuleSet, WebView> {\n    url?: string;\n    source?: WebViewSource;\n    headers?: Headers;\n    onLoad?: (e: RXTypes.SyntheticEvent) => void;\n    onNavigationStateChange?: (navigationState: WebViewNavigationState) => void;\n    scalesPageToFit?: boolean;\n    injectedJavaScript?: string;\n    javaScriptEnabled?: boolean;\n    mediaPlaybackRequiresUserAction?: boolean;\n    allowsInlineMediaPlayback?: boolean;\n\n    // Native only\n    startInLoadingState?: boolean;\n    domStorageEnabled?: boolean;\n    onShouldStartLoadWithRequest?: (shouldStartLoadEvent: WebViewShouldStartLoadEvent) => boolean;\n    onLoadStart?: (e: RXTypes.SyntheticEvent) => void;\n    onError?: (e: RXTypes.SyntheticEvent) => void;\n    onMessage?: (e: WebViewMessageEvent) => void;\n\n    // Web only; overrides javaScriptEnabled if used\n    sandbox?: WebViewSandboxMode;\n}\n\nexport abstract class WebView extends ReactComponent<WebViewProps, RXTypes.Stateless> {\n    abstract postMessage(message: string, targetOrigin?: string): void;\n    abstract reload(): void;\n    abstract goBack(): void;\n    abstract goForward(): void;\n}\n"
  },
  {
    "path": "extensions/webview/src/ios/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the iOS implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport WebView from '../native-common/WebView';\n\nexport { WebView as default, Types };\n"
  },
  {
    "path": "extensions/webview/src/macos/PluginBase.tsx",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Mac implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport WebView from '../native-common/WebView';\n\nexport { WebView as default, Types };\n"
  },
  {
    "path": "extensions/webview/src/native-common/WebView.tsx",
    "content": "/**\n * WebView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A control that allows the display of an independent web page.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport { WebView as RNWebView } from 'react-native-webview';\nimport {\n    WebViewMessageEvent as RNWebViewMessageEvent,\n    WebViewSourceHtml as RNWebViewSourceHtml,\n    WebViewSourceUri as RNWebViewSourceUri,\n} from 'react-native-webview/lib/WebViewTypes';\n\nimport * as RX from 'reactxp';\n\nimport * as Types from '../common/Types';\n\nconst _styles = {\n    webViewDefault: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n    }),\n};\n\ntype MixedContentMode = 'never' | 'always' | 'compatibility' | undefined;\n\nexport class WebView extends React.Component<Types.WebViewProps, RX.Types.Stateless> implements Types.WebView {\n    private _mountedComponent: RNWebView | undefined;\n\n    render() {\n        const styles = [_styles.webViewDefault, this.props.style] as RN.StyleProp<RN.ViewStyle>;\n        const source = this._buildSource();\n        const injectedJavascript = this._buildInjectedJavascript();\n\n        return (\n            <RNWebView\n                ref={ this._onMount }\n                style={ styles }\n                source={ source }\n                startInLoadingState={ this.props.startInLoadingState }\n                javaScriptEnabled={ this.props.javaScriptEnabled }\n                allowsInlineMediaPlayback={ this.props.allowsInlineMediaPlayback }\n                mediaPlaybackRequiresUserAction={ this.props.mediaPlaybackRequiresUserAction }\n                injectedJavaScript={ injectedJavascript }\n                domStorageEnabled={ this.props.domStorageEnabled }\n                scalesPageToFit={ this.props.scalesPageToFit }\n                onNavigationStateChange={ this.props.onNavigationStateChange }\n                onShouldStartLoadWithRequest={ this.props.onShouldStartLoadWithRequest }\n                onLoadStart={ this.props.onLoadStart }\n                onLoad={ this.props.onLoad }\n                onError={ this.props.onError }\n                onMessage={ this.props.onMessage ? this._onMessage : undefined }\n                testID={ this.props.testId }\n                mixedContentMode={ this._sandboxToMixedContentMode(this.props.sandbox) }\n            />\n        );\n    }\n\n    private _sandboxToMixedContentMode(sandbox?: Types.WebViewSandboxMode): MixedContentMode {\n        if (sandbox) {\n            if (sandbox & Types.WebViewSandboxMode.AllowMixedContentAlways) {\n                return 'always';\n            }\n\n            if (sandbox & Types.WebViewSandboxMode.AllowMixedContentCompatibilityMode) {\n                return 'compatibility';\n            }\n        }\n        return 'never';\n    }\n\n    protected _onMount = (component: RNWebView | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    protected _onMessage = (e: RNWebViewMessageEvent) => {\n        if (this.props.onMessage) {\n            const event: Types.WebViewMessageEvent = {\n                defaultPrevented: e.defaultPrevented,\n                nativeEvent: e.nativeEvent,\n                cancelable: e.cancelable,\n                timeStamp: e.timeStamp,\n                bubbles: e.bubbles,\n                origin: '*',\n                data: e.nativeEvent.data,\n                stopPropagation: () => e.stopPropagation(),\n                preventDefault: () => e.preventDefault(),\n            };\n\n            this.props.onMessage(event);\n        }\n    };\n\n    private _buildSource(): RNWebViewSourceUri | RNWebViewSourceHtml | undefined {\n        const { headers, source, url } = this.props;\n\n        if (url) {\n            return { headers, uri: url };\n        }\n\n        if (source) {\n            return source;\n        }\n\n        return undefined;\n    }\n\n    private _buildInjectedJavascript(): string {\n        // Keep compatibility with old code that uses window.postMessage. For more information,\n        // see https://github.com/react-native-community/react-native-webview/releases/tag/v5.0.0\n        let injectedJavascript = `\n            // WebView -> Native\n            (function() {\n                if (window.ReactNativeWebView && window.ReactNativeWebView.postMessage) {\n                    window.postMessage = function(data) {\n                        window.ReactNativeWebView.postMessage(data);\n                    };\n                }\n            })();\n\n            // Native -> WebView\n            (function() {\n                window.postMessageFromReactXP = function(message) {\n                    var event;\n                    try {\n                        event = new MessageEvent('message', { data: message });\n                    } catch (e) {\n                        event = document.createEvent('MessageEvent');\n                        event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);\n                    }\n                    document.dispatchEvent(event);\n                };\n            })();`;\n\n        if (this.props.injectedJavaScript !== undefined) {\n            injectedJavascript += this.props.injectedJavaScript;\n        }\n\n        // End the injectedJavascript with 'true;' or else you'll sometimes get silent failures\n        injectedJavascript += ';true;';\n\n        return injectedJavascript;\n    }\n\n    postMessage(message: string, targetOrigin = '*') {\n        if (this._mountedComponent) {\n            this._mountedComponent.injectJavaScript(`window.postMessageFromReactXP('${message}');`);\n        }\n    }\n\n    reload() {\n        if (this._mountedComponent) {\n            this._mountedComponent.reload();\n        }\n    }\n\n    goBack() {\n        if (this._mountedComponent) {\n            this._mountedComponent.goBack();\n        }\n    }\n\n    goForward() {\n        if (this._mountedComponent) {\n            this._mountedComponent.goForward();\n        }\n    }\n}\n\nexport default WebView;\n"
  },
  {
    "path": "extensions/webview/src/web/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Web implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\n\nimport WebView from './WebView';\n\nexport { WebView as default, Types };\n"
  },
  {
    "path": "extensions/webview/src/web/WebView.tsx",
    "content": "/**\n * WebView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A control that allows the display of an independent web page.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nimport * as Types from '../common/Types';\n\nconst _styles = {\n    webViewDefault: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        borderStyle: 'none',\n    }),\n    webViewContainer: RX.Styles.createViewStyle({\n        flexDirection: 'column',\n        flex: 1,\n        alignSelf: 'stretch',\n    }),\n};\n\nexport interface WebViewState {\n    postComplete?: boolean;\n    webFormIdentifier?: string;\n    webFrameIdentifier?: string;\n}\n\ninterface WebViewMessageEventInternal extends Types.WebViewMessageEvent {\n    __propagationStopped: boolean;\n}\n\nexport class WebView extends React.Component<Types.WebViewProps, WebViewState> implements Types.WebView {\n    private static _webFrameNumber = 1;\n    private static _onMessageReceived: RX.Types.SubscribableEvent<(e: WebViewMessageEventInternal) => void>;\n    private static _messageListenerInstalled = false;\n\n    private _mountedComponent: HTMLIFrameElement | null = null;\n    private _onMessageReceivedToken: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: Types.WebViewProps) {\n        super(props);\n\n        this.state = {\n            postComplete: false,\n            webFormIdentifier: `form${WebView._webFrameNumber}`,\n            webFrameIdentifier: `frame${WebView._webFrameNumber}`,\n        };\n\n        WebView._webFrameNumber++;\n    }\n\n    componentDidMount() {\n        this._postRender();\n\n        const customContents = this._getCustomHtml(this.props);\n        if (customContents) {\n            this._setContents(customContents);\n        }\n    }\n\n    componentDidUpdate(prevProps: Types.WebViewProps, prevState: WebViewState) {\n        this._postRender();\n\n        const oldCustomContents = this._getCustomHtml(prevProps);\n        const newCustomContents = this._getCustomHtml(this.props);\n\n        if (newCustomContents) {\n            if (oldCustomContents !== newCustomContents) {\n                this._setContents(newCustomContents);\n            }\n        }\n    }\n\n    componentWillUnmount() {\n        if (this._onMessageReceivedToken) {\n            this._onMessageReceivedToken.unsubscribe();\n            this._onMessageReceivedToken = undefined;\n        }\n    }\n\n    private _getCustomHtml(props: Types.WebViewProps): string | undefined {\n        if (props.url || !props.source) {\n            return undefined;\n        }\n\n        return props.source.html;\n    }\n\n    private _setContents(html: string) {\n        const iframeDOM = this._mountedComponent;\n        if (iframeDOM && iframeDOM.contentWindow) {\n            try {\n                // Some older browsers don't support this, so\n                // be prepared to catch an exception.\n                (iframeDOM as any).srcdoc = html;\n            } catch {\n                // Swallow exceptions\n            }\n        }\n    }\n\n    private _installMessageListener() {\n        // Don't install global message listener twice.\n        if (!WebView._messageListenerInstalled) {\n            // Set up the global event.\n            WebView._onMessageReceived = new RX.Types.SubscribableEvent<(e: WebViewMessageEventInternal) => void>(true);\n\n            window.addEventListener('message', (e: MessageEvent) => {\n                const event: WebViewMessageEventInternal = {\n                    data: e.data,\n                    origin: e.origin,\n                    nativeEvent: e,\n                    bubbles: e.bubbles,\n                    cancelable: e.cancelable,\n                    defaultPrevented: e.defaultPrevented,\n                    __propagationStopped: false,\n                    stopPropagation: () => {\n                        e.stopPropagation();\n                        event.__propagationStopped = true;\n                    },\n                    preventDefault: () => {\n                        e.preventDefault();\n                    },\n                    timeStamp: e.timeStamp,\n                };\n\n                WebView._onMessageReceived.fire(event);\n            });\n\n            WebView._messageListenerInstalled = true;\n        }\n\n        // Subscribe to the global event if we haven't already done so.\n        if (!this._onMessageReceivedToken) {\n            this._onMessageReceivedToken = WebView._onMessageReceived.subscribe(e => {\n                if (this.props.onMessage) {\n                    this.props.onMessage(e);\n\n                    // Stop the event from propagating further.\n                    return e.__propagationStopped;\n                }\n\n                return false;\n            });\n        }\n    }\n\n    private _postRender() {\n        // If the caller wants to receive posted messages\n        // from the web view, we need to install a global\n        // message handler.\n        if (this.props.onMessage) {\n            this._installMessageListener();\n        }\n\n        if (!this.state.postComplete) {\n            this.setState({\n                postComplete: true,\n            });\n        }\n    }\n\n    render() {\n        const styles = RX.Styles.combine([_styles.webViewDefault, this.props.style]) as React.CSSProperties;\n        const sandbox = this.props.sandbox !== undefined\n            ? this.props.sandbox\n            : (this.props.javaScriptEnabled ? Types.WebViewSandboxMode.AllowScripts : Types.WebViewSandboxMode.None);\n\n        // width 100% is needed for Edge - it doesn't grow iframe. Resize needs to be done with wrapper\n        return (\n            <RX.View style={ _styles.webViewContainer }>\n                <iframe\n                    ref={ this._onMount }\n                    name={ this.state.webFrameIdentifier }\n                    id={ this.state.webFrameIdentifier }\n                    style={ styles }\n                    src={ this.props.url }\n                    onLoad={ this._onLoad }\n                    sandbox={ this._sandboxToStringValue(sandbox) }\n                    width={ '100%' }\n                    data-test-id={ this.props.testId }\n                />\n            </RX.View>\n        );\n    }\n\n    protected _onMount = (component: HTMLIFrameElement | null) => {\n        this._mountedComponent = component;\n    };\n\n    private _onLoad = (e: RX.Types.SyntheticEvent) => {\n        if (this.props.onLoad) {\n            this.props.onLoad(e);\n        }\n    };\n\n    private _sandboxToStringValue = (sandbox: Types.WebViewSandboxMode) => {\n        const values: string[] = [];\n\n        if (sandbox & Types.WebViewSandboxMode.AllowForms) {\n            values.push('allow-forms');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowModals) {\n            values.push('allow-modals');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowOrientationLock) {\n            values.push('allow-orientation-lock');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowPointerLock) {\n            values.push('allow-pointer-lock');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowPopups) {\n            values.push('allow-popups');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowPopupsToEscapeSandbox) {\n            values.push('allow-popups-to-escape-sandbox');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowPresentation) {\n            values.push('allow-presentation');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowSameOrigin) {\n            values.push('allow-same-origin');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowScripts) {\n            values.push('allow-scripts');\n        }\n        if (sandbox & Types.WebViewSandboxMode.AllowTopNavigation) {\n            values.push('allow-top-navigation');\n        }\n\n        return values.join(' ');\n    };\n\n    postMessage(message: string, targetOrigin = '*') {\n        const iframeDOM = this._mountedComponent;\n        if (iframeDOM && iframeDOM.contentWindow) {\n            iframeDOM.contentWindow.postMessage(message, targetOrigin);\n        }\n    }\n\n    reload() {\n        const iframeDOM = this._mountedComponent;\n        if (iframeDOM && iframeDOM.contentWindow) {\n            iframeDOM.contentWindow.location.reload(true);\n        }\n    }\n\n    goBack() {\n        const iframeDOM = this._mountedComponent;\n        if (iframeDOM && iframeDOM.contentWindow) {\n            iframeDOM.contentWindow.history.back();\n        }\n    }\n\n    goForward() {\n        const iframeDOM = this._mountedComponent;\n        if (iframeDOM && iframeDOM.contentWindow) {\n            iframeDOM.contentWindow.history.forward();\n        }\n    }\n}\n\nexport default WebView;\n"
  },
  {
    "path": "extensions/webview/src/windows/PluginBase.ts",
    "content": "/*\n * PluginBase.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base export for the Windows implementation of the plugin.\n */\n\nimport * as Types from '../common/Types';\nimport WebView from '../native-common/WebView';\n\nexport { WebView as default, Types };\n"
  },
  {
    "path": "extensions/webview/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"forceConsistentCasingInFileNames\": true,\n        \"strictPropertyInitialization\": true,\n        \"experimentalDecorators\": true,\n        \"noImplicitReturns\": true,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"noImplicitAny\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"target\": \"es5\",\n        \"module\": \"commonjs\",\n        \"outDir\": \"dist\",\n        \"jsx\": \"react\"\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"node_modules\",\n        \"dist\"\n    ]\n}\n"
  },
  {
    "path": "index.android.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/android/ReactXP.js');\n"
  },
  {
    "path": "index.ios.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/ios/ReactXP.js');\n"
  },
  {
    "path": "index.js",
    "content": "'use strict';\n\n// Export web by default. Other platforms have custom index.[platform].js files\nmodule.exports = require('./dist/web/ReactXP.js');\n"
  },
  {
    "path": "index.macos.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/macos/ReactXP.js');\n"
  },
  {
    "path": "index.windows.js",
    "content": "'use strict';\n\nmodule.exports = require('./dist/windows/ReactXP.js');\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"reactxp\",\n  \"version\": \"2.0.0\",\n  \"description\": \"Cross-platform abstraction layer for writing React-based applications a single time that work identically across web, React Native, and Electron distribution\",\n  \"author\": \"ReactXP Team <reactxp@microsoft.com>\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"watch\": \"tsc --watch\",\n    \"lint\": \"eslint --ext .ts,.tsx src\",\n    \"lint:fix\": \"npm run lint -- --fix\"\n  },\n  \"dependencies\": {\n    \"lodash\": \"^4.17.15\",\n    \"prop-types\": \"^15.7.2\",\n    \"rebound\": \"^0.1.0\",\n    \"subscribableevent\": \"^1.0.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.3.0\",\n    \"react-dom\": \"^16.3.0\",\n    \"react-native\": \">=0.57\",\n    \"react-native-windows\": \"^0.57.1\"\n  },\n  \"devDependencies\": {\n    \"@types/lodash\": \"4.14.149\",\n    \"@types/react\": \"16.9.15\",\n    \"@types/react-dom\": \"16.9.4\",\n    \"@types/react-native\": \"0.60.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.15.0\",\n    \"eslint\": \"6.8.0\",\n    \"eslint-config-skype\": \"1.5.0\",\n    \"eslint-plugin-import\": \"2.19.1\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"react\": \"^16.3.0\",\n    \"tslint\": \"5.20.1\",\n    \"tsutils\": \"3.17.1\",\n    \"typescript\": \"3.7.4\"\n  },\n  \"homepage\": \"https://microsoft.github.io/reactxp/\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/microsoft/reactxp/\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/microsoft/reactxp/issues\"\n  },\n  \"types\": \"dist/ReactXP.d.ts\"\n}\n"
  },
  {
    "path": "samples/ImageList/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"warnOnUnsupportedTypeScriptVersion\": false,\n    \"ecmaFeatures\": { \"jsx\": true },\n    \"ecmaVersion\": 2018,\n    \"sourceType\": \"module\",\n    \"project\": \"./tsconfig.json\"\n  },\n  \"plugins\": [\"@typescript-eslint\", \"reactxp\", \"react\", \"jest\"],\n  \"extends\": [\n    \"eslint:recommended\",\n    \"plugin:@typescript-eslint/eslint-recommended\",\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:@typescript-eslint/recommended-requiring-type-checking\",\n    \"plugin:reactxp/recommended\",\n    \"plugin:react/recommended\",\n    \"plugin:jest/recommended\"\n  ],\n  \"env\": {\n    \"browser\": true,\n    \"node\": true,\n    \"es6\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/explicit-function-return-type\": \"off\",\n    \"indent\": \"off\",\n    \"@typescript-eslint/indent\": [\"error\", 4],\n    \"react/jsx-curly-brace-presence\": [2, { \"props\": \"always\" }],\n    \"max-len\": [\"error\", 140]\n  },\n  \"globals\": {\n    \"__DEV__\": true\n  },\n  \"settings\": {\n    \"react\": { \"version\": \"latest\" }\n  }\n}\n"
  },
  {
    "path": "samples/ImageList/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\n#\nbuck-out/\n\\.buckd/\n*.keystore\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/\n\n*/fastlane/report.xml\n*/fastlane/Preview.html\n*/fastlane/screenshots\n\n# Bundle artifact\n#\n*.jsbundle\n\n# Web dist\n#\ndist-*\n"
  },
  {
    "path": "samples/ImageList/README.md",
    "content": "# RXPImageList\nThis sample demonstrates a ReactXP app that fetches information from a REST service (Giphy) and displays a virtualized list of images. The app works on React Native (iOS, Android, Windows) and web.\n\nThe commands in the instructions below assume you are in the root of this repo.\n\n### Building\n\n- From the RXPImageList directory, run `npm install`. This fetches the dependencies.\n\n### To run your app on Web:\n  ```shell\n  npm run start:web\n  ```\n\n### To build Web production version of your app:\n  ```shell\n  npm run build:web\n  ```\n\n### To run your app on iOS:\n  ```shell\n  npm run start:ios\n  ```\n##### - or -\n  open ios/RXPImageList.xcodeproj project in Xcode\n  press the Run button\n\n### To run your app on Android:\nHave an Android emulator running (quickest way to get started), or a device connected\n\n  ```shell\n  npm run start:android\n  ```\n#####  - or -\n  open android/ project in Android Studio\n  press the Run button\n\n### To run your app on Windows:\n  ```shell\n  npm run start:windows\n  ```\n##### - or -\n  open windows/RXPImageList.sln project in Visual Studio\n  press the Run button\n"
  },
  {
    "path": "samples/ImageList/android/app/BUCK",
    "content": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm start` - to start the packager\n# - `cd android`\n# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\"`\n# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck\n# - `buck install -r android/app` - compile, install and run application\n#\n\nload(\":build_defs.bzl\", \"create_aar_targets\", \"create_jar_targets\")\n\nlib_deps = []\n\ncreate_aar_targets(glob([\"libs/*.aar\"]))\n\ncreate_jar_targets(glob([\"libs/*.jar\"]))\n\nandroid_library(\n    name = \"all-libs\",\n    exported_deps = lib_deps,\n)\n\nandroid_library(\n    name = \"app-code\",\n    srcs = glob([\n        \"src/main/java/**/*.java\",\n    ]),\n    deps = [\n        \":all-libs\",\n        \":build_config\",\n        \":res\",\n    ],\n)\n\nandroid_build_config(\n    name = \"build_config\",\n    package = \"com.rxpimagelist\",\n)\n\nandroid_resource(\n    name = \"res\",\n    package = \"com.rxpimagelist\",\n    res = \"src/main/res\",\n)\n\nandroid_binary(\n    name = \"app\",\n    keystore = \"//android/keystores:debug\",\n    manifest = \"src/main/AndroidManifest.xml\",\n    package_type = \"debug\",\n    deps = [\n        \":app-code\",\n    ],\n)\n"
  },
  {
    "path": "samples/ImageList/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation\n *   entryFile: \"index.android.js\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    entryFile: \"index.js\"\n]\n\napply from: \"../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.rxpimagelist\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n        ndk {\n            abiFilters \"armeabi-v7a\", \"x86\"\n        }\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits\n            def versionCodes = [\"armeabi-v7a\":1, \"x86\":2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    implementation \"com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}\"\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n"
  },
  {
    "path": "samples/ImageList/android/app/build_defs.bzl",
    "content": "\"\"\"Helper definitions to glob .aar and .jar targets\"\"\"\n\ndef create_aar_targets(aarfiles):\n    for aarfile in aarfiles:\n        name = \"aars__\" + aarfile[aarfile.rindex(\"/\") + 1:aarfile.rindex(\".aar\")]\n        lib_deps.append(\":\" + name)\n        android_prebuilt_aar(\n            name = name,\n            aar = aarfile,\n        )\n\ndef create_jar_targets(jarfiles):\n    for jarfile in jarfiles:\n        name = \"jars__\" + jarfile[jarfile.rindex(\"/\") + 1:jarfile.rindex(\".jar\")]\n        lib_deps.append(\":\" + name)\n        prebuilt_jar(\n            name = name,\n            binary_jar = jarfile,\n        )\n"
  },
  {
    "path": "samples/ImageList/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "samples/ImageList/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "samples/ImageList/android/app/src/debug/res/xml/react_native_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n  <domain-config cleartextTrafficPermitted=\"true\">\n    <domain includeSubdomains=\"false\">localhost</domain>\n    <domain includeSubdomains=\"false\">10.0.2.2</domain>\n    <domain includeSubdomains=\"false\">10.0.3.2</domain>\n  </domain-config>\n</network-security-config>\n"
  },
  {
    "path": "samples/ImageList/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.rxpimagelist\"\n>\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "samples/ImageList/android/app/src/main/assets/.gitignore",
    "content": ""
  },
  {
    "path": "samples/ImageList/android/app/src/main/java/com/rxpimagelist/MainActivity.java",
    "content": "package com.rxpimagelist;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n    /**\n     * Returns the name of the main component registered from JavaScript.\n     * This is used to schedule rendering of the component.\n     */\n    @Override\n    protected String getMainComponentName() {\n        return \"RXApp\";\n    }\n}\n"
  },
  {
    "path": "samples/ImageList/android/app/src/main/java/com/rxpimagelist/MainApplication.java",
    "content": "package com.rxpimagelist;\n\nimport android.app.Application;\n\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.shell.MainReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage()\n      );\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return \"index\";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n  }\n}\n"
  },
  {
    "path": "samples/ImageList/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RXPImageList</string>\n</resources>\n"
  },
  {
    "path": "samples/ImageList/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "samples/ImageList/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n        supportLibVersion = \"28.0.0\"\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:3.4.0\")\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url \"$rootDir/../node_modules/react-native/android\"\n        }\n    }\n}\n"
  },
  {
    "path": "samples/ImageList/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "samples/ImageList/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "samples/ImageList/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "samples/ImageList/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      http://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/ImageList/android/keystores/BUCK",
    "content": "keystore(\n    name = \"debug\",\n    properties = \"debug.keystore.properties\",\n    store = \"debug.keystore\",\n    visibility = [\n        \"PUBLIC\",\n    ],\n)\n"
  },
  {
    "path": "samples/ImageList/android/keystores/debug.keystore.properties",
    "content": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "samples/ImageList/android/settings.gradle",
    "content": "rootProject.name = 'RXPImageList'\n\ninclude ':app'\n"
  },
  {
    "path": "samples/ImageList/babel.config.js",
    "content": "module.exports = function(api) {\n  api.cache.forever();\n\n  const presets = [\n    ['module:metro-react-native-babel-preset'],\n  ];\n\n  const plugins = [\n    ['@babel/proposal-decorators', { legacy: true }],\n  ];\n\n  if (process.env.platform === 'web') {\n    return {\n      presets: ['@babel/env', ...presets],\n      plugins,\n    }\n  }\n\n  return { presets, plugins };\n};\n"
  },
  {
    "path": "samples/ImageList/index.js",
    "content": "import './src/index';\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/AppDelegate.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/AppDelegate.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge\n                                                   moduleName:@\"RXApp\"\n                                            initialProperties:nil];\n\n  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n#if DEBUG\n  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index\" fallbackResource:nil];\n#else\n  return [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n#endif\n}\n\n@end\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RXPImageList\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>RXPImageList</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n    <key>NSAllowsArbitraryLoads</key>\n    <true/>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList/main.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList-tvOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList-tvOSTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };\n\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };\n\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };\n\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };\n\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };\n\t\t00E356F31AD99517003FC87E /* RXPImageListTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPImageListTests.m */; };\n\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };\n\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };\n\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; };\n\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; };\n\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; };\n\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };\n\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };\n\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };\n\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };\n\t\t2DCD954D1E0B4F2C00145EB5 /* RXPImageListTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPImageListTests.m */; };\n\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };\n\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };\n\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };\n\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };\n\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTActionSheet;\n\t\t};\n\t\t00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTGeolocation;\n\t\t};\n\t\t00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5115D1A9E6B3D00147676;\n\t\t\tremoteInfo = RCTImage;\n\t\t};\n\t\t00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B511DB1A9E6C8500147676;\n\t\t\tremoteInfo = RCTNetwork;\n\t\t};\n\t\t00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 832C81801AAF6DEF007FA2F7;\n\t\t\tremoteInfo = RCTVibration;\n\t\t};\n\t\t00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13B07F861A680F5B00A75B9A;\n\t\t\tremoteInfo = RXPImageList;\n\t\t};\n\t\t139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTSettings;\n\t\t};\n\t\t139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3C86DF461ADF2C930047B81A;\n\t\t\tremoteInfo = RCTWebSocket;\n\t\t};\n\t\t146834031AC3E56700842450 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;\n\t\t\tremoteInfo = React;\n\t\t};\n\t\t2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;\n\t\t\tremoteInfo = \"RXPImageList-tvOS\";\n\t\t};\n\t\t2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ADD01A681E09402E00F6D226;\n\t\t\tremoteInfo = \"RCTBlob-tvOS\";\n\t\t};\n\t\t2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D001F3B181A0099AA32;\n\t\t\tremoteInfo = fishhook;\n\t\t};\n\t\t2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32;\n\t\t\tremoteInfo = \"fishhook-tvOS\";\n\t\t};\n\t\t2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BDC1FC498900052F4D5;\n\t\t\tremoteInfo = jsinspector;\n\t\t};\n\t\t2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;\n\t\t\tremoteInfo = \"jsinspector-tvOS\";\n\t\t};\n\t\t2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7ECE1E25DB7D00323FB7;\n\t\t\tremoteInfo = \"third-party\";\n\t\t};\n\t\t2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D3C1EBD27B6005632C8;\n\t\t\tremoteInfo = \"third-party-tvOS\";\n\t\t};\n\t\t2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7E881E25C6D100323FB7;\n\t\t\tremoteInfo = \"double-conversion\";\n\t\t};\n\t\t2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D621EBD27B9005632C8;\n\t\t\tremoteInfo = \"double-conversion-tvOS\";\n\t\t};\n\t\t2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 9936F3131F5F2E4B0010BF04;\n\t\t\tremoteInfo = privatedata;\n\t\t};\n\t\t2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 9936F32F1F5F2E5B0010BF04;\n\t\t\tremoteInfo = \"privatedata-tvOS\";\n\t\t};\n\t\t3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A283A1D9B042B00D4039D;\n\t\t\tremoteInfo = \"RCTImage-tvOS\";\n\t\t};\n\t\t3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28471D9B043800D4039D;\n\t\t\tremoteInfo = \"RCTLinking-tvOS\";\n\t\t};\n\t\t3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28541D9B044C00D4039D;\n\t\t\tremoteInfo = \"RCTNetwork-tvOS\";\n\t\t};\n\t\t3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28611D9B046600D4039D;\n\t\t\tremoteInfo = \"RCTSettings-tvOS\";\n\t\t};\n\t\t3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A287B1D9B048500D4039D;\n\t\t\tremoteInfo = \"RCTText-tvOS\";\n\t\t};\n\t\t3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28881D9B049200D4039D;\n\t\t\tremoteInfo = \"RCTWebSocket-tvOS\";\n\t\t};\n\t\t3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28131D9B038B00D4039D;\n\t\t\tremoteInfo = \"React-tvOS\";\n\t\t};\n\t\t3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C059A1DE3340900C268FA;\n\t\t\tremoteInfo = yoga;\n\t\t};\n\t\t3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C06751DE3340C00C268FA;\n\t\t\tremoteInfo = \"yoga-tvOS\";\n\t\t};\n\t\t3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;\n\t\t\tremoteInfo = cxxreact;\n\t\t};\n\t\t3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;\n\t\t\tremoteInfo = \"cxxreact-tvOS\";\n\t\t};\n\t\t3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4;\n\t\t\tremoteInfo = jschelpers;\n\t\t};\n\t\t3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9181DE5FBD800167DC4;\n\t\t\tremoteInfo = \"jschelpers-tvOS\";\n\t\t};\n\t\t5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTAnimation;\n\t\t};\n\t\t5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28201D9B03D100D4039D;\n\t\t\tremoteInfo = \"RCTAnimation-tvOS\";\n\t\t};\n\t\t78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTLinking;\n\t\t};\n\t\t832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5119B1A9E6C1200147676;\n\t\t\tremoteInfo = RCTText;\n\t\t};\n\t\tADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 358F4ED71D1E81A9004DF814;\n\t\t\tremoteInfo = RCTBlob;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTActionSheet.xcodeproj; path = \"../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTGeolocation.xcodeproj; path = \"../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTImage.xcodeproj; path = \"../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTNetwork.xcodeproj; path = \"../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVibration.xcodeproj; path = \"../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00E356EE1AD99517003FC87E /* RXPImageListTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RXPImageListTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t00E356F21AD99517003FC87E /* RXPImageListTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RXPImageListTests.m; sourceTree = \"<group>\"; };\n\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTSettings.xcodeproj; path = \"../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTWebSocket.xcodeproj; path = \"../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t13B07F961A680F5B00A75B9A /* RXPImageList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RXPImageList.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RXPImageList/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RXPImageList/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RXPImageList/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RXPImageList/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RXPImageList/main.m; sourceTree = \"<group>\"; };\n\t\t146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = React.xcodeproj; path = \"../node_modules/react-native/React/React.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2D02E47B1E0B4A5D006451C7 /* RXPImageList-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"RXPImageList-tvOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D02E4901E0B4A5D006451C7 /* RXPImageList-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"RXPImageList-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTAnimation.xcodeproj; path = \"../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTLinking.xcodeproj; path = \"../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTText.xcodeproj; path = \"../node_modules/react-native/Libraries/Text/RCTText.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTBlob.xcodeproj; path = \"../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t00E356EB1AD99517003FC87E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,\n\t\t\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */,\n\t\t\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,\n\t\t\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,\n\t\t\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,\n\t\t\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,\n\t\t\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,\n\t\t\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,\n\t\t\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,\n\t\t\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,\n\t\t\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */,\n\t\t\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00C302A81ABCB8CE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302B61ABCB90400DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302BC1ABCB91800DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,\n\t\t\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302D41ABCB9D200DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,\n\t\t\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302E01ABCB9EE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356EF1AD99517003FC87E /* RXPImageListTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F21AD99517003FC87E /* RXPImageListTests.m */,\n\t\t\t\t00E356F01AD99517003FC87E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = RXPImageListTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356F01AD99517003FC87E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F11AD99517003FC87E /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139105B71AF99BAD00B5F7CC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,\n\t\t\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139FDEE71B06529A00C62182 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,\n\t\t\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,\n\t\t\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */,\n\t\t\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* RXPImageList */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = RXPImageList;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t146834001AC3E56700842450 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t146834041AC3E56700842450 /* libReact.a */,\n\t\t\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */,\n\t\t\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */,\n\t\t\t\t3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */,\n\t\t\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */,\n\t\t\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,\n\t\t\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2DF0FFEB2056DD460020B375 /* libprivatedata.a */,\n\t\t\t\t2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E91572E1DD0AC6500FF2AA8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78C398B11ACF4ADC00677621 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */,\n\t\t\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,\n\t\t\t\t146833FF1AC3E56700842450 /* React.xcodeproj */,\n\t\t\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,\n\t\t\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */,\n\t\t\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,\n\t\t\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,\n\t\t\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,\n\t\t\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,\n\t\t\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,\n\t\t\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,\n\t\t\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,\n\t\t\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341B11AAA6A8300B99B32 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */,\n\t\t\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* RXPImageList */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t00E356EF1AD99517003FC87E /* RXPImageListTests */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* RXPImageList.app */,\n\t\t\t\t00E356EE1AD99517003FC87E /* RXPImageListTests.xctest */,\n\t\t\t\t2D02E47B1E0B4A5D006451C7 /* RXPImageList-tvOS.app */,\n\t\t\t\t2D02E4901E0B4A5D006451C7 /* RXPImageList-tvOSTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tADBDB9201DFEBF0600ED6528 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */,\n\t\t\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t00E356ED1AD99517003FC87E /* RXPImageListTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPImageListTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t00E356EA1AD99517003FC87E /* Sources */,\n\t\t\t\t00E356EB1AD99517003FC87E /* Frameworks */,\n\t\t\t\t00E356EC1AD99517003FC87E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RXPImageListTests;\n\t\t\tproductName = RXPImageListTests;\n\t\t\tproductReference = 00E356EE1AD99517003FC87E /* RXPImageListTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t13B07F861A680F5B00A75B9A /* RXPImageList */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPImageList\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RXPImageList;\n\t\t\tproductName = \"Hello World\";\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* RXPImageList.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E47A1E0B4A5D006451C7 /* RXPImageList-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPImageList-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E4771E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E4791E0B4A5D006451C7 /* Resources */,\n\t\t\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"RXPImageList-tvOS\";\n\t\t\tproductName = \"RXPImageList-tvOS\";\n\t\t\tproductReference = 2D02E47B1E0B4A5D006451C7 /* RXPImageList-tvOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E48F1E0B4A5D006451C7 /* RXPImageList-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPImageList-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E48C1E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E48E1E0B4A5D006451C7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"RXPImageList-tvOSTests\";\n\t\t\tproductName = \"RXPImageList-tvOSTests\";\n\t\t\tproductReference = 2D02E4901E0B4A5D006451C7 /* RXPImageList-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t00E356ED1AD99517003FC87E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tTestTargetID = 13B07F861A680F5B00A75B9A;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E47A1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E48F1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 2D02E47A1E0B4A5D006451C7;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPImageList\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;\n\t\t\t\t\tProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */;\n\t\t\t\t\tProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 78C398B11ACF4ADC00677621 /* Products */;\n\t\t\t\t\tProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;\n\t\t\t\t\tProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 832341B11AAA6A8300B99B32 /* Products */;\n\t\t\t\t\tProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139FDEE71B06529A00C62182 /* Products */;\n\t\t\t\t\tProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 146834001AC3E56700842450 /* Products */;\n\t\t\t\t\tProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* RXPImageList */,\n\t\t\t\t00E356ED1AD99517003FC87E /* RXPImageListTests */,\n\t\t\t\t2D02E47A1E0B4A5D006451C7 /* RXPImageList-tvOS */,\n\t\t\t\t2D02E48F1E0B4A5D006451C7 /* RXPImageList-tvOSTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTActionSheet.a;\n\t\t\tremoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTGeolocation.a;\n\t\t\tremoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTImage.a;\n\t\t\tremoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTNetwork.a;\n\t\t\tremoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVibration.a;\n\t\t\tremoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTSettings.a;\n\t\t\tremoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTWebSocket.a;\n\t\t\tremoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t146834041AC3E56700842450 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTBlob-tvOS.a\";\n\t\t\tremoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libfishhook.a;\n\t\t\tremoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libfishhook-tvOS.a\";\n\t\t\tremoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsinspector.a;\n\t\t\tremoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsinspector-tvOS.a\";\n\t\t\tremoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFEB2056DD460020B375 /* libprivatedata.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libprivatedata.a;\n\t\t\tremoteRef = 2DF0FFEA2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFED2056DD460020B375 /* libprivatedata-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libprivatedata-tvOS.a\";\n\t\t\tremoteRef = 2DF0FFEC2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTImage-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTLinking-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTNetwork-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTSettings-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTText-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTWebSocket-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjschelpers.a;\n\t\t\tremoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjschelpers.a;\n\t\t\tremoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTLinking.a;\n\t\t\tremoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTText.a;\n\t\t\tremoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTBlob.a;\n\t\t\tremoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t00E356EC1AD99517003FC87E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4791E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48E1E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native Code And Images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t00E356EA1AD99517003FC87E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t00E356F31AD99517003FC87E /* RXPImageListTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4771E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,\n\t\t\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48C1E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DCD954D1E0B4F2C00145EB5 /* RXPImageListTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13B07F861A680F5B00A75B9A /* RXPImageList */;\n\t\t\ttargetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;\n\t\t};\n\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 2D02E47A1E0B4A5D006451C7 /* RXPImageList-tvOS */;\n\t\t\ttargetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = RXPImageList;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t00E356F61AD99517003FC87E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = RXPImageListTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPImageList.app/RXPImageList\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t00E356F71AD99517003FC87E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tINFOPLIST_FILE = RXPImageListTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPImageList.app/RXPImageList\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tINFOPLIST_FILE = RXPImageList/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList\";\n\t\t\t\tPRODUCT_NAME = RXPImageList;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tINFOPLIST_FILE = RXPImageList/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList\";\n\t\t\t\tPRODUCT_NAME = RXPImageList;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4971E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPImageList-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E4981E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPImageList-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4991E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPImageList-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPImageList-tvOS.app/RXPImageList-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E49A1E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPImageList-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPImageList-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPImageList-tvOS.app/RXPImageList-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPImageListTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t00E356F61AD99517003FC87E /* Debug */,\n\t\t\t\t00E356F71AD99517003FC87E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPImageList\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPImageList-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4971E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E4981E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPImageList-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4991E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E49A1E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPImageList\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList.xcodeproj/xcshareddata/xcschemes/RXPImageList-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D2A28121D9B038B00D4039D\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React-tvOS\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"RXPImageList-tvOS.app\"\n               BlueprintName = \"RXPImageList-tvOS\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPImageList-tvOSTests.xctest\"\n               BlueprintName = \"RXPImageList-tvOSTests\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPImageList-tvOSTests.xctest\"\n               BlueprintName = \"RXPImageList-tvOSTests\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPImageList-tvOS.app\"\n            BlueprintName = \"RXPImageList-tvOS\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPImageList-tvOS.app\"\n            BlueprintName = \"RXPImageList-tvOS\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPImageList-tvOS.app\"\n            BlueprintName = \"RXPImageList-tvOS\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageList.xcodeproj/xcshareddata/xcschemes/RXPImageList.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"83CBBA2D1A601D0E00E9B192\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"RXPImageList.app\"\n               BlueprintName = \"RXPImageList\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPImageListTests.xctest\"\n               BlueprintName = \"RXPImageListTests\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPImageListTests.xctest\"\n               BlueprintName = \"RXPImageListTests\"\n               ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPImageList.app\"\n            BlueprintName = \"RXPImageList\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPImageList.app\"\n            BlueprintName = \"RXPImageList\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPImageList.app\"\n            BlueprintName = \"RXPImageList\"\n            ReferencedContainer = \"container:RXPImageList.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageListTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/ImageList/ios/RXPImageListTests/RXPImageListTests.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n#import <XCTest/XCTest.h>\n\n#import <React/RCTLog.h>\n#import <React/RCTRootView.h>\n\n#define TIMEOUT_SECONDS 600\n#define TEXT_TO_LOOK_FOR @\"Welcome to React Native!\"\n\n@interface RXPImageListTests : XCTestCase\n\n@end\n\n@implementation RXPImageListTests\n\n- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test\n{\n  if (test(view)) {\n    return YES;\n  }\n  for (UIView *subview in [view subviews]) {\n    if ([self findSubviewInView:subview matching:test]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n- (void)testRendersWelcomeScreen\n{\n  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];\n  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];\n  BOOL foundElement = NO;\n\n  __block NSString *redboxError = nil;\n  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {\n    if (level >= RCTLogLevelError) {\n      redboxError = message;\n    }\n  });\n\n  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {\n    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n\n    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {\n      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {\n        return YES;\n      }\n      return NO;\n    }];\n  }\n\n  RCTSetLogFunction(RCTDefaultLogFunction);\n\n  XCTAssertNil(redboxError, @\"RedBox error: %@\", redboxError);\n  XCTAssertTrue(foundElement, @\"Couldn't find element with text '%@' in %d seconds\", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);\n}\n\n\n@end\n"
  },
  {
    "path": "samples/ImageList/jest/enzyme.config.js",
    "content": "import Enzyme from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nEnzyme.configure({ adapter: new Adapter() });\n"
  },
  {
    "path": "samples/ImageList/jest/jest.config.js",
    "content": "module.exports = {\n  rootDir: '../',\n  roots: ['<rootDir>/src'],\n\n  moduleFileExtensions: [\n    'ts', 'tsx', 'js', 'json', 'node',\n  ],\n\n  moduleDirectories: ['node_modules'],\n\n  snapshotSerializers: [\n    'enzyme-to-json/serializer',\n  ],\n\n  setupFiles: [\n    '<rootDir>/jest/enzyme.config.js',\n  ],\n\n  testRegex: '(/__tests__/.*|(\\\\.|/)(test|spec))\\\\.((t|j)sx?)$',\n};\n"
  },
  {
    "path": "samples/ImageList/metro.config.js",
    "content": "module.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: { experimentalImportSupport: false, inlineRequires: false },\n    }),\n  },\n};\n"
  },
  {
    "path": "samples/ImageList/package.json",
    "content": "{\n  \"name\": \"rxpimagelist\",\n  \"private\": true,\n  \"main\": \"index.js\",\n  \"version\": \"2.0.0\",\n  \"scripts\": {\n    \"rn-cli\": \"node scripts/react-native.js\",\n    \"start:android\": \"npm run rn-cli run-android\",\n    \"start:windows\": \"npm run rn-cli run-windows\",\n    \"start:ios\": \"npm run rn-cli run-ios\",\n    \"start:web\": \"cross-env platform=web webpack-dev-server --config=web/webpack/dev.js --progress --colors --mode=development\",\n    \"start:rn-dev-server\": \"npm run rn-cli start --reset-cache\",\n    \"build:web\": \"cross-env platform=web webpack --config=web/webpack/prod.js --progress --colors --mode=production\",\n    \"test\": \"jest -c jest/jest.config.js\",\n    \"test:watch\": \"npm run test --watch\",\n    \"test:debug\": \"node --inspect-brk node_modules/.bin/jest -c jest/jest.config.js --runInBand\",\n    \"build:types\": \"tsc --emitDeclarationOnly\",\n    \"type-check\": \"tsc --noEmit\",\n    \"type-check:watch\": \"npm run type-check -w\",\n    \"lint\": \"eslint --config .eslintrc --ext .ts,.tsx src\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"7.7.4\",\n    \"@babel/plugin-proposal-decorators\": \"7.7.4\",\n    \"@babel/preset-env\": \"7.7.4\",\n    \"@react-native-community/cli\": \"9.3.2\",\n    \"@types/enzyme\": \"3.10.3\",\n    \"@types/jest\": \"24.0.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.9.0\",\n    \"@typescript-eslint/parser\": \"2.9.0\",\n    \"babel-loader\": \"8.3.0\",\n    \"compression-webpack-plugin\": \"3.0.0\",\n    \"cross-env\": \"6.0.3\",\n    \"enzyme\": \"3.10.0\",\n    \"enzyme-adapter-react-16\": \"1.15.1\",\n    \"enzyme-to-json\": \"3.4.3\",\n    \"eslint\": \"6.7.1\",\n    \"eslint-loader\": \"4.0.2\",\n    \"eslint-plugin-jest\": \"23.1.0\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"eslint-plugin-reactxp\": \"0.1.7\",\n    \"fork-ts-checker-webpack-plugin\": \"3.1.1\",\n    \"html-webpack-plugin\": \"5.5.0\",\n    \"jest\": \"29.1.2\",\n    \"metro-react-native-babel-preset\": \"0.57.0\",\n    \"rnpm-plugin-windows\": \"0.3.8\",\n    \"typescript\": \"3.7.2\",\n    \"webpack\": \"5.75.0\",\n    \"webpack-cli\": \"5.0.1\",\n    \"webpack-dev-server\": \"3.9.0\",\n    \"webpack-merge\": \"4.2.2\"\n  },\n  \"dependencies\": {\n    \"react\": \"16.12.0\",\n    \"react-dom\": \"16.12.0\",\n    \"react-native\": \"0.70.6\",\n    \"react-native-windows\": \"0.59.0-rc.3\",\n    \"reactxp\": \"^2.0.0\",\n    \"reactxp-virtuallistview\": \"^2.1.0\",\n    \"resub\": \"^1.2.2\",\n    \"simplerestclients\": \"^0.2.11\",\n    \"synctasks\": \"^0.3.3\"\n  }\n}\n"
  },
  {
    "path": "samples/ImageList/scripts/react-native.js",
    "content": "require('@react-native-community/cli').run();"
  },
  {
    "path": "samples/ImageList/src/App.tsx",
    "content": "/**\n * Main entry point for sample image fetching app.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nimport { DEBUG, DEV } from './config';\nimport RootView from './views/RootView';\n\nclass App {\n    init() {\n        RX.App.initialize(DEBUG, DEV);\n        RX.UserInterface.setMainView(this._renderRootView());\n    }\n\n    private _renderRootView() {\n        return (\n            <RootView />\n        );\n    }\n}\n\nexport default new App();\n"
  },
  {
    "path": "samples/ImageList/src/config.ts",
    "content": "declare const __DEV__: boolean;\n\nexport const DEBUG = __DEV__;\nexport const DEV = __DEV__;\n"
  },
  {
    "path": "samples/ImageList/src/controls/SearchField.tsx",
    "content": "/**\n * ImageListPanel.tsx\n *\n * Display first screen of the image list sample application.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nexport interface SearchFieldProps {\n    onChange: (value: string) => void;\n}\n\ninterface SearchFieldState {\n    value: string;\n}\n\nconst _styles = {\n    input: RX.Styles.createTextInputStyle({\n        borderStyle: 'solid',\n        borderColor: '#999',\n        borderWidth: 1,\n        fontSize: 16,\n        padding: 5,\n        margin: 10,\n        height: 30\n    })\n};\n\nexport class SearchField extends RX.Component<SearchFieldProps, SearchFieldState> {\n    readonly state: SearchFieldState = { value: '' };\n\n    render() {\n        return (\n            <RX.TextInput\n                accessibilityId={ 'SearchFieldInput' }\n                placeholder={ 'Search for a GIF' }\n                autoFocus={ true }\n                style={ _styles.input }\n                value={ this.state.value }\n                onChangeText={ this._handleChangeText }\n            />\n        );\n    }\n\n    private _handleChangeText = (value: string) => (\n        this.setState({ value }, () => this.props.onChange(value))\n    )\n}\n\nexport default SearchField;\n"
  },
  {
    "path": "samples/ImageList/src/index.tsx",
    "content": "import App from './App';\n\nApp.init();\n"
  },
  {
    "path": "samples/ImageList/src/services/GiphyClient.ts",
    "content": "/**\n * REST client \"adapter\" for talking to Giphy service.\n */\n\nimport * as SyncTasks from 'synctasks';\nimport { GenericRestClient } from 'simplerestclients';\n\ninterface GiphyImageDescriptor {\n    height: string;\n    width: string;\n    url: string;\n}\n\ninterface GiphyImages {\n    fixed_height_downsampled: GiphyImageDescriptor;\n    fixed_height_still: GiphyImageDescriptor;\n    fixed_height: GiphyImageDescriptor;\n    fixed_width_still: GiphyImageDescriptor;\n    fixed_width: GiphyImageDescriptor;\n    original: GiphyImageDescriptor;\n}\n\ninterface GiphyDataImage {\n    images: GiphyImages;\n}\n\ninterface GiphySearchResponse {\n    data: GiphyDataImage[];\n}\n\nexport interface GiphySearchResult {\n    originalUrl: string;\n    smallUrl: string;\n}\n\nconst GIPHY_API_URL = 'https://api.giphy.com/v1/gifs/search';\nconst GIPHY_API_KEY = 'dc6zaTOxFJmzC';\n\nexport class GiphyClient extends GenericRestClient {\n    searchImages(query: string, limit = 25, offset = 0, rating = 'g'): SyncTasks.Promise<GiphySearchResult[]> {\n        const url = this._buildUrl(query, limit, offset, rating);\n\n        return this._performApiCall<GiphySearchResponse>(url, 'GET', undefined, undefined)\n            .then(response => {\n                if (!response.body || !response.body.data) {\n                    return [];\n                }\n\n                return response.body.data.map(this._normilizeResponse);\n            });\n    }\n\n    private _buildUrl = (query: string, limit: number, offset: number, rating: string): string => (\n        `?api_key=${ GIPHY_API_KEY }&q=${ encodeURIComponent(query) }&limit=${ limit }&offset=${ offset }&rating=${ rating }`\n    )\n\n    private _normilizeResponse = ({ images }: GiphyDataImage): GiphySearchResult => ({\n        originalUrl: images.original.url,\n        smallUrl: images.fixed_height.url\n    })\n}\n\nexport default new GiphyClient(GIPHY_API_URL);\n"
  },
  {
    "path": "samples/ImageList/src/stores/ImageStore.ts",
    "content": "/**\n * Basic store based on ReSub.\n */\n\nimport * as SyncTasks from 'synctasks';\nimport { StoreBase, AutoSubscribeStore, autoSubscribe } from 'resub';\n\nimport GiphyClient from '../services/GiphyClient';\n\nexport interface Image {\n    originalUrl: string;\n    smallUrl: string;\n}\n\n@AutoSubscribeStore\nexport class ImageStore extends StoreBase {\n    private _isSearchPending = false;\n    private _isFirstSearch = true;\n    private _lastSearchQuery = '';\n    private _searchQuery = '';\n    private _images: Image[] = [];\n\n    private _request: SyncTasks.Promise<void> | null = null;\n\n    @autoSubscribe\n    getImages() {\n        return this._images;\n    }\n\n    @autoSubscribe\n    getSearchQuery() {\n        return this._searchQuery;\n    }\n\n    @autoSubscribe\n    isPerformingSearch() {\n        return this._isSearchPending;\n    }\n\n    @autoSubscribe\n    isFirstSearch() {\n        return this._isFirstSearch;\n    }\n\n    updateImages(searchQuery: string) {\n        const searchQueryTrimmed = searchQuery.trim();\n        this._searchQuery = searchQuery;\n\n        if (this._shouldSkipSearch(searchQueryTrimmed)) {\n            return;\n        }\n\n        this._isFirstSearch = false;\n        this._lastSearchQuery = searchQueryTrimmed;\n        this._images = [];\n\n        // If the query is empty, don't bother with the API call.\n        if (!searchQuery) {\n            this._cancelPreviousSearch();\n            this.trigger();\n            return;\n        }\n\n        this._isSearchPending = true;\n        this.trigger();\n\n        this._cancelPreviousSearch();\n        this._request = this._searchImages(searchQuery);\n    }\n\n    private _searchImages(query: string): SyncTasks.Promise<void> {\n        return GiphyClient.searchImages(query)\n            .then(images => {\n                this._images = images;\n                this._isSearchPending = false;\n                this.trigger();\n            })\n            .catch(({ canceled }) => {\n                if (!canceled) {\n                    this._isSearchPending = false;\n                    this.trigger();\n                }\n            });\n    }\n\n    private _cancelPreviousSearch(): void {\n        if (this._request) {\n            this._request.cancel();\n            this._request = null;\n        }\n    }\n\n    // If this is the same as the last query or initial query is empty - don't bother.\n    private _shouldSkipSearch(query: string): boolean {\n        return (!query && !this._images.length) || (query === this._lastSearchQuery);\n    }\n}\n\nexport default new ImageStore();\n"
  },
  {
    "path": "samples/ImageList/src/views/ImageList.tsx",
    "content": "/**\n * Displays a simple list of images.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\nimport { VirtualListView, VirtualListViewItemInfo, VirtualListViewCellRenderDetails } from 'reactxp-virtuallistview';\n\nimport ImageStore, { Image } from '../stores/ImageStore';\n\ninterface ImageListItemInfo extends VirtualListViewItemInfo {\n    image: Image;\n}\n\ninterface ImageListState {\n    isPerformingSearch: boolean;\n    isFirstSearch: boolean;\n    searchQuery: string;\n    images: ImageListItemInfo[];\n}\n\nconst _itemHeight = 120;\n\nconst _styles = {\n    list: RX.Styles.createViewStyle({\n        backgroundColor: '#fff',\n        flexDirection: 'column',\n        alignSelf: 'stretch',\n        margin: 0\n    }),\n    row: RX.Styles.createViewStyle({\n        borderBottomWidth: 1,\n        borderTopWidth: 1,\n        borderColor: '#ccc',\n        borderStyle: 'solid',\n        flexDirection: 'row',\n        alignItems: 'center',\n        flex: 1,\n        height: _itemHeight\n    }),\n    image: RX.Styles.createImageStyle({\n        height: 100,\n        width: 133\n    }),\n    main: RX.Styles.createViewStyle({\n        justifyContent: 'center',\n        alignItems: 'center',\n        alignSelf: 'stretch',\n        flex: 1\n    }),\n    labelText: RX.Styles.createTextStyle({\n        textAlign: 'center',\n        fontSize: 30\n    }),\n    linkText: RX.Styles.createLinkStyle({\n        padding: 12,\n        fontSize: 14,\n        color: 'blue',\n        flex: -1\n    }),\n    searchQueryText: RX.Styles.createTextStyle({\n        fontWeight: 'bold',\n        fontSize: 30\n    })\n};\n\nexport class ImageList extends ComponentBase<{}, ImageListState> {\n    render() {\n        const { isPerformingSearch, isFirstSearch, searchQuery, images } = this.state;\n\n        // If the search is pending, render a spinner.\n        if (isPerformingSearch) {\n            return (\n                <RX.View style={ _styles.main }>\n                    <RX.ActivityIndicator color={ '#ccc' } size={ 'large' } />\n                </RX.View>\n            );\n        }\n\n        if (!isFirstSearch && !images.length && searchQuery) {\n            return (\n                <RX.View style={ _styles.main }>\n                    <RX.Text style={ _styles.labelText }>\n                        No Results for <RX.Text style={ _styles.searchQueryText }>{ searchQuery }</RX.Text>\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n\n        return (\n            <VirtualListView\n                itemList={ images }\n                style={ _styles.list }\n                renderItem={ this._renderItem }\n            />\n        );\n    }\n\n    protected _buildState(): ImageListState {\n        return {\n            isPerformingSearch: ImageStore.isPerformingSearch(),\n            isFirstSearch: ImageStore.isFirstSearch(),\n            searchQuery: ImageStore.getSearchQuery(),\n            images: ImageStore.getImages().map(this._normilizeImage)\n        };\n    }\n\n    private _renderItem = (details: VirtualListViewCellRenderDetails<ImageListItemInfo>) => {\n        const item = details.item;\n        return (\n            <RX.View style={ _styles.row }>\n                <RX.Image\n                    resizeMode={ 'cover' }\n                    source={ item.image.smallUrl }\n                    style={ _styles.image }\n                />\n\n                <RX.Link style={ _styles.linkText } url={ item.image.originalUrl }>\n                    { item.image.originalUrl }\n                </RX.Link>\n            </RX.View>\n        );\n    }\n\n    private _normilizeImage = (image: Image) => ({\n        template: 'image',\n        height: _itemHeight,\n        image,\n        key: image.smallUrl\n    })\n}\n\nexport default ImageList;\n"
  },
  {
    "path": "samples/ImageList/src/views/RootView.tsx",
    "content": "/**\n * RootView.tsx\n *\n * Display first screen of the image list sample application.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nimport ImageStore from '../stores/ImageStore';\nimport SearchField from '../controls/SearchField';\nimport ImageList from './ImageList';\n\nconst _styles = {\n    main: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        flex: 1\n    }),\n    images: RX.Styles.createViewStyle({\n        marginTop: 10,\n        padding: 10,\n        alignSelf: 'stretch',\n        flex: 1\n    }),\n    statusSpacer: RX.Styles.createViewStyle({\n        marginTop: 22\n    })\n};\n\nclass RootView extends RX.Component {\n    render() {\n        return (\n            <RX.View\n                useSafeInsets={ true }\n                style={ [_styles.main, RX.StatusBar.isOverlay() ? _styles.statusSpacer : undefined] }\n            >\n                <SearchField onChange={ this._updateImages } />\n                <RX.View style={ _styles.images }>\n                    <ImageList />\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _updateImages = (query: string) => (\n        ImageStore.updateImages(query)\n    )\n}\n\nexport default RootView;\n"
  },
  {
    "path": "samples/ImageList/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"forceConsistentCasingInFileNames\": true,\n    \"strictPropertyInitialization\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"experimentalDecorators\": true,\n    \"noUnusedParameters\": true,\n    \"noImplicitReturns\": true,\n    \"moduleResolution\": \"node\",\n    \"strictNullChecks\": true,\n    \"esModuleInterop\": true,\n    \"noUnusedLocals\": true,\n    \"noImplicitThis\": true,\n    \"declarationDir\": \"dist-types\",\n    \"importHelpers\": true,\n    \"noImplicitAny\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": true,\n    \"jsxFactory\": \"React\",\n    \"noResolve\": false,\n    \"module\": \"es2015\",\n    \"target\": \"es2015\",\n    \"jsx\": \"react\",\n    \"lib\": [\"es5\", \"es2015\", \"dom\"]\n  },\n\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\"]\n}"
  },
  {
    "path": "samples/ImageList/web/index.hmr.js",
    "content": "import '../index';\nmodule.hot.accept();\n"
  },
  {
    "path": "samples/ImageList/web/template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>RXPImageList</title>\n  <style>\n    html,\n    body,\n    .app-container {\n      font-family: proxima-nova, \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif;\n      padding: 0;\n      margin: 0;\n      border: none;\n      height: 100%;\n      width: 100%;\n    }\n    *:focus {\n        outline: 0;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"app-container\"></div>\n</body>\n</html>"
  },
  {
    "path": "samples/ImageList/web/webpack/common.js",
    "content": "const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst webpack = require('webpack');\nconst path = require('path');\n\nconst ROOT_PATH = path.join(__dirname, '..', '..');\nconst DIST_PATH = path.join(ROOT_PATH, 'dist-web');\nconst APP_PATH = path.join(ROOT_PATH, 'src');\nconst WEB_PATH = path.join(ROOT_PATH, 'web');\nconst TS_CONFIG_PATH = path.join(ROOT_PATH, 'tsconfig.json');\n\nconst buildConfig = (env, argv) => ({\n  entry: ROOT_PATH,\n\n  resolve: {\n    extensions: ['.ts', '.tsx', '.js'],\n  },\n\n  module: {\n    rules: [\n      { test: /\\.jsx?$/, loader: 'eslint-loader', include: APP_PATH, enforce: 'pre' },\n      { test: /\\.tsx?$/, loader: 'babel-loader', include: APP_PATH }\n    ],\n  },\n\n  plugins: [\n    new webpack.DefinePlugin({ __DEV__: argv.mode === 'development' }),\n    new HtmlWebpackPlugin({ inject: true, template: path.join(WEB_PATH, 'template.html') }),\n    new ForkTsCheckerWebpackPlugin({ tsconfig: TS_CONFIG_PATH, async: true }),\n  ],\n});\n\nmodule.exports = {\n  buildConfig,\n  APP_PATH,\n  DIST_PATH,\n  WEB_PATH,\n};\n"
  },
  {
    "path": "samples/ImageList/web/webpack/dev.js",
    "content": "const webpack = require('webpack');\nconst merge = require('webpack-merge');\nconst path = require('path');\nconst { buildConfig, APP_PATH, WEB_PATH } = require('./common');\n\nmodule.exports = (env, argv) => (\n  merge(buildConfig(env, argv), {\n    entry: path.join(WEB_PATH, 'index.hmr.js'),\n    devtool: 'inline-source-map',\n\n    plugins: [\n      new webpack.HotModuleReplacementPlugin(),\n    ],\n\n    devServer: {\n      contentBase: APP_PATH,\n      openPage: '',\n      inline: true,\n      stats: 'minimal',\n      open: true,\n      port: 9999,\n      hot: true,\n    },\n  })\n);\n"
  },
  {
    "path": "samples/ImageList/web/webpack/prod.js",
    "content": "const CompressionPlugin = require('compression-webpack-plugin');\nconst merge = require('webpack-merge');\nconst { buildConfig, DIST_PATH } = require('./common');\n\nmodule.exports = (env, argv) => merge(buildConfig(env, argv), {\n  devtool: false,\n\n  output: {\n    filename: 'bundle-[hash].js',\n    path: DIST_PATH,\n  },\n\n  plugins: [\n    new CompressionPlugin({ algorithm: 'gzip', filename: '[path].gz' }),\n  ],\n});\n"
  },
  {
    "path": "samples/ImageList/windows/.gitignore",
    "content": "*AppPackages*\n*BundleArtifacts*\n\n#OS junk files\n[Tt]humbs.db\n*.DS_Store\n\n#Visual Studio files\n*.[Oo]bj\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vssscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.[Cc]ache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.sdf\n*.opensdf\n*.opendb\n*.unsuccessfulbuild\nipch/\n[Oo]bj/\n[Bb]in\n[Dd]ebug*/\n[Rr]elease*/\nAnkh.NoLoad\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n#MonoDevelop\n*.pidb\n*.userprefs\n\n#Tooling\n_ReSharper*/\n*.resharper\n[Tt]est[Rr]esult*\n*.sass-cache\n\n#Project files\n[Bb]uild/\n\n#Subversion files\n.svn\n\n# Office Temp Files\n~$*\n\n# vim Temp Files\n*~\n\n#NuGet\npackages/\n*.nupkg\n\n#ncrunch\n*ncrunch*\n*crunch*.local.xml\n\n# visual studio database projects\n*.dbmdl\n\n#Test files\n*.testsettings\n\n#Other files\n*.DotSettings\n.vs/\n*project.lock.json\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/App.xaml",
    "content": "<rn:ReactApplication\n    x:Class=\"RXPImageList.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rn=\"using:ReactNative\"\n    RequestedTheme=\"Light\">\n\n</rn:ReactApplication>\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/App.xaml.cs",
    "content": "using ReactNative;\n\nnamespace RXPImageList\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : ReactApplication\n    {\n        private readonly ReactNativeHost _host = new MainReactNativeHost();\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// The React Native host.\n        /// </summary>\n        public override ReactNativeHost Host => _host;\n    }\n}\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/MainReactNativeHost.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Core;\nusing ReactNative.Shell;\nusing System.Collections.Generic;\n\nnamespace RXPImageList\n{\n    class MainReactNativeHost : ReactNativeHost\n    {\n        public override string MainComponentName => \"RXApp\";\n\n#if !BUNDLE || DEBUG\n        public override bool UseDeveloperSupport => true;\n#else\n        public override bool UseDeveloperSupport => false;\n#endif\n\n        protected override string JavaScriptMainModuleName => \"index\";\n\n#if BUNDLE\n        protected override string JavaScriptBundleFile => \"ms-appx:///ReactAssets/index.windows.bundle\";\n#endif\n\n        protected override List<IReactPackage> Packages => new List<IReactPackage>\n        {\n            new MainReactPackage(),\n        };\n    }\n}\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/Package.appxmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"1b559638-7434-4bd0-96b6-e80f4bd71838\"\n    Publisher=\"CN=user\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"1b559638-7434-4bd0-96b6-e80f4bd71838\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>RXPImageList</DisplayName>\n    <PublisherDisplayName>React Native for UWP</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"RXPImageList.App\">\n      <uap:VisualElements\n        DisplayName=\"RXPImageList\"\n        Square150x150Logo=\"Assets\\Square150x150Logo.png\"\n        Square44x44Logo=\"Assets\\Square44x44Logo.png\"\n        Description=\"RXPImageList\"\n        BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"Assets\\Wide310x150Logo.png\"/>\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"RXPImageList\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RXPImageList\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for RXPImageList.MyClass and all of its public/private members\n    <Type Name=\"RXPImageList.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"RXPImageList.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/RXPImageList.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>e1a04243-db95-4b1a-97de-1aa66875892d</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RXPImageList</RootNamespace>\n    <AssemblyName>RXPImageList</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>RXPImageList_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <PackageCertificateThumbprint>D61C83D73FE27BA89E6F8D76ACE8A828936D91C0</PackageCertificateThumbprint>\n\n    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug' or '$(Configuration)' == 'DebugBundle'\">\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release' or '$(Configuration)' == 'ReleaseBundle'\">\n    <DependencyConfiguration>Release</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'\">\n    <OutputPath>bin\\x86\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'\">\n    <OutputPath>bin\\ARM\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'\">\n    <OutputPath>bin\\x64\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainReactNativeHost.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"RXPImageList_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Assets\\StoreLogo.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-200.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\">\n      <Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>\n      <Name>ReactNative</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'\">\n    <Content Include=\"ReactAssets\\**\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NETCore.UniversalWindowsPlatform\">\n      <Version>6.0.6</Version>\n    </PackageReference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\bin\\Universal\\$(Platform)\\$(DependencyConfiguration)\\yoga.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Visible>False</Visible>\n    </Content>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList/ReactAssets/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "samples/ImageList/windows/RXPImageList.sln",
    "content": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.271\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RXPImageList\", \"RXPImageList\\RXPImageList.csproj\", \"e1a04243-db95-4b1a-97de-1aa66875892d\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C} = {2EACF721-73B5-46AE-9775-4A8674D05A9C}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNative\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\", \"{C7673AD5-E3AA-468C-A5FD-FA38154E205C}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ReactNative.Shared\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj\", \"{EEA8B852-4D07-48E1-8294-A21AB5909FE5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ChakraBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj\", \"{4B72C796-16D5-4E3A-81C0-3E36F531E578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNativeWebViewBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNativeWebViewBridge\\ReactNativeWebViewBridge.csproj\", \"{7596216B-669C-41F8-86DA-F3637F6545C0}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"Facebook.Yoga.Shared\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.shproj\", \"{91C42D32-291D-4B72-90B4-551663D60B8B}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"yoga.uwp\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\Yoga.Universal.vcxproj\", \"{2EACF721-73B5-46AE-9775-4A8674D05A9C}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tDebugBundle|ARM = DebugBundle|ARM\n\t\tDebugBundle|x64 = DebugBundle|x64\n\t\tDebugBundle|x86 = DebugBundle|x86\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\t\tReleaseBundle|ARM = ReleaseBundle|ARM\n\t\tReleaseBundle|x64 = ReleaseBundle|x64\n\t\tReleaseBundle|x86 = ReleaseBundle|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x64.Build.0 = Debug|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x86.Build.0 = Debug|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|ARM.Build.0 = DebugBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x64.ActiveCfg = DebugBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x64.Build.0 = DebugBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x64.Deploy.0 = DebugBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x86.ActiveCfg = DebugBundle|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x86.Build.0 = DebugBundle|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.DebugBundle|x86.Deploy.0 = DebugBundle|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|ARM.Build.0 = Release|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x64.ActiveCfg = Release|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x64.Build.0 = Release|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x64.Deploy.0 = Release|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x86.ActiveCfg = Release|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x86.Build.0 = Release|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.Release|x86.Deploy.0 = Release|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86\n\t\t{e1a04243-db95-4b1a-97de-1aa66875892d}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/README.md",
    "content": "# ReactXP Sample Code\n\nHere are some small projects that demonstrate how to use ReactXP.\n\n[Image List](https://github.com/Microsoft/reactxp/tree/master/samples/ImageList) <br/>\n[RXP Test](https://github.com/Microsoft/reactxp/tree/master/samples/RXPTest) <br/>\n[To Do List](https://github.com/Microsoft/reactxp/tree/master/samples/TodoList) <br/>\n[Hello World](https://github.com/Microsoft/reactxp/tree/master/samples/hello-world) <br/>\n[Hello World JS](https://github.com/Microsoft/reactxp/tree/master/samples/hello-world-js) <br/>\n"
  },
  {
    "path": "samples/RXPTest/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\nbuck-out/\n\\.buckd/\n*.keystore\n\n.vscode\ndist/\n*package-lock.json\n"
  },
  {
    "path": "samples/RXPTest/README.md",
    "content": "# RXPTest\n\nThis app provides tests for all of the functionality exposed by ReactXP.\n\n### Caveat: Development Dependencies on ReactXP\n*If/when RXPTest has development dependencies on (as yet) unpublished changes to ReactXP, a successfull build may require following the [Testing your Change](https://github.com/Microsoft/reactxp/blob/master/CONTRIBUTING.md#testing-your-change) instructions to copy the appropriate `dist` folder structure to RXPTest. It may also require appropriate types being specified in \"devDependencies\" in RXPTest's package.json  eg `\"@types/react\": \"16.7.20\"`*  \n\n### Building\n\n- From the RXPTest directory, run `npm install`. This fetches the dependencies.\n\n### Building RXPTest for Web\n\n- Run `npm run web-watch`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- Open `index.html` in your browser to run the test in a browser.\n\n### Building for React Native\n\n- Run `npm run rn-watch`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- In another command prompt run `npm start`. This starts the React Native Packager.\n- For iOS or Android: Use Xcode or Android Studio to build and deploy the native app code just like you would with any other React Native project.\n- For Windows: Open `windows\\RXPTest.sln` in Visual Studio 2017. Build and run the app for x64 or x86.\n"
  },
  {
    "path": "samples/RXPTest/android/app/BUCK",
    "content": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm start` - to start the packager\n# - `cd android`\n# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\"`\n# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck\n# - `buck install -r android/app` - compile, install and run application\n#\n\nload(\":build_defs.bzl\", \"create_aar_targets\", \"create_jar_targets\")\n\nlib_deps = []\n\ncreate_aar_targets(glob([\"libs/*.aar\"]))\n\ncreate_jar_targets(glob([\"libs/*.jar\"]))\n\nandroid_library(\n    name = \"all-libs\",\n    exported_deps = lib_deps,\n)\n\nandroid_library(\n    name = \"app-code\",\n    srcs = glob([\n        \"src/main/java/**/*.java\",\n    ]),\n    deps = [\n        \":all-libs\",\n        \":build_config\",\n        \":res\",\n    ],\n)\n\nandroid_build_config(\n    name = \"build_config\",\n    package = \"com.rxptest\",\n)\n\nandroid_resource(\n    name = \"res\",\n    package = \"com.rxptest\",\n    res = \"src/main/res\",\n)\n\nandroid_binary(\n    name = \"app\",\n    keystore = \"//android/keystores:debug\",\n    manifest = \"src/main/AndroidManifest.xml\",\n    package_type = \"debug\",\n    deps = [\n        \":app-code\",\n    ],\n)\n"
  },
  {
    "path": "samples/RXPTest/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation\n *   entryFile: \"index.android.js\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    entryFile: \"index.js\"\n]\n\napply from: \"../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.rxptest\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits\n            def versionCodes = [\"armeabi-v7a\":1, \"x86\":2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation project(':@react-native-community_netinfo')\n    implementation project(':react-native-webview')\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    implementation \"com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}\"\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n"
  },
  {
    "path": "samples/RXPTest/android/app/build_defs.bzl",
    "content": "\"\"\"Helper definitions to glob .aar and .jar targets\"\"\"\n\ndef create_aar_targets(aarfiles):\n    for aarfile in aarfiles:\n        name = \"aars__\" + aarfile[aarfile.rindex(\"/\") + 1:aarfile.rindex(\".aar\")]\n        lib_deps.append(\":\" + name)\n        android_prebuilt_aar(\n            name = name,\n            aar = aarfile,\n        )\n\ndef create_jar_targets(jarfiles):\n    for jarfile in jarfiles:\n        name = \"jars__\" + jarfile[jarfile.rindex(\"/\") + 1:jarfile.rindex(\".jar\")]\n        lib_deps.append(\":\" + name)\n        prebuilt_jar(\n            name = name,\n            binary_jar = jarfile,\n        )\n"
  },
  {
    "path": "samples/RXPTest/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Disabling obfuscation is useful if you collect stack traces from production crashes\n# (unless you are using a system that supports de-obfuscate the stack traces).\n-dontobfuscate\n\n# React Native\n\n# Keep our interfaces so they can be used by other ProGuard rules.\n# See http://sourceforge.net/p/proguard/bugs/466/\n-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip\n-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters\n-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip\n\n# Do not strip any method/class that is annotated with @DoNotStrip\n-keep @com.facebook.proguard.annotations.DoNotStrip class *\n-keep @com.facebook.common.internal.DoNotStrip class *\n-keepclassmembers class * {\n    @com.facebook.proguard.annotations.DoNotStrip *;\n    @com.facebook.common.internal.DoNotStrip *;\n}\n\n-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {\n  void set*(***);\n  *** get*();\n}\n\n-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }\n-keep class * extends com.facebook.react.bridge.NativeModule { *; }\n-keepclassmembers,includedescriptorclasses class * { native <methods>; }\n-keepclassmembers class *  { @com.facebook.react.uimanager.UIProp <fields>; }\n-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }\n-keepclassmembers class *  { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }\n\n-dontwarn com.facebook.react.**\n\n# okhttp\n\n-keepattributes Signature\n-keepattributes *Annotation*\n-keep class okhttp3.** { *; }\n-keep interface okhttp3.** { *; }\n-dontwarn okhttp3.**\n\n# okio\n\n-keep class sun.misc.Unsafe { *; }\n-dontwarn java.nio.file.*\n-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement\n-dontwarn okio.**\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.rxptest\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/main/java/com/rxphelloworld/MainActivity.java",
    "content": "package com.rxptest;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n    /**\n     * Returns the name of the main component registered from JavaScript.\n     * This is used to schedule rendering of the component.\n     */\n    @Override\n    protected String getMainComponentName() {\n        return \"RXApp\";\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/main/java/com/rxphelloworld/MainApplication.java",
    "content": "package com.rxptest;\n\nimport android.app.Application;\n\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.shell.MainReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport com.reactnativecommunity.netinfo.NetInfoPackage;\nimport com.reactnativecommunity.webview.RNCWebViewPackage;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage(),\n          new NetInfoPackage(),\n          new RNCWebViewPackage()\n      );\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return \"index.android\";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n  }\n}\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RXPTest</string>\n</resources>\n"
  },
  {
    "path": "samples/RXPTest/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "samples/RXPTest/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n        supportLibVersion = \"28.0.0\"\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.3.1'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url \"$rootDir/../node_modules/react-native/android\"\n        }\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.10.3-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "samples/RXPTest/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nandroid.useDeprecatedNdk=true\n"
  },
  {
    "path": "samples/RXPTest/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "samples/RXPTest/android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/RXPTest/android/keystores/BUCK",
    "content": "keystore(\n    name = \"debug\",\n    properties = \"debug.keystore.properties\",\n    store = \"debug.keystore\",\n    visibility = [\n        \"PUBLIC\",\n    ],\n)\n"
  },
  {
    "path": "samples/RXPTest/android/keystores/debug.keystore.properties",
    "content": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "samples/RXPTest/android/settings.gradle",
    "content": "rootProject.name = 'RXPTest'\ninclude ':@react-native-community_netinfo'\nproject(':@react-native-community_netinfo').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/netinfo/android')\ninclude ':react-native-webview'\nproject(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android')\ninclude ':app'\n"
  },
  {
    "path": "samples/RXPTest/index.android.js",
    "content": "require('./dist/index');\n"
  },
  {
    "path": "samples/RXPTest/index.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title></title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <meta charset='utf-8'>\n  <style>\n    html, body, .app-container {\n      width: 100%;\n      height: 100%;\n      padding: 0;\n      border: none;\n      margin: 0;\n      font-family: proxima-nova, \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif\n    }\n    *:focus {\n        outline: 0;\n    }\n    button,\n    button > *  {\n      -moz-user-select: none;\n      -webkit-user-select: none;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"app-container\"></div>\n  <script src=\"dist/bundle.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "samples/RXPTest/index.ios.js",
    "content": "require('./dist/index');\n"
  },
  {
    "path": "samples/RXPTest/index.windows.js",
    "content": "require('./dist/index');\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/AppDelegate.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/AppDelegate.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge\n                                                   moduleName:@\"RXApp\"\n                                            initialProperties:nil];\n\n  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n#if DEBUG\n  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index.ios\" fallbackResource:nil];\n#else\n  return [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n#endif\n}\n\n@end\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RXPTest\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>RXPTest</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest/main.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };\n\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };\n\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };\n\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };\n\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };\n\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };\n\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };\n\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t6D5B77E9E6F648EB8ADF799E /* libRNCNetInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D84626BC41A4406DAC31CDCF /* libRNCNetInfo.a */; };\n\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };\n\t\tD2278308222FDC55009150CC /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2278307222FDC55009150CC /* JavaScriptCore.framework */; };\n\t\tDC59425A11A24663A46F6493 /* libRNCWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C292C692AED4DC2B496B1DB /* libRNCWebView.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTActionSheet;\n\t\t};\n\t\t00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTGeolocation;\n\t\t};\n\t\t00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5115D1A9E6B3D00147676;\n\t\t\tremoteInfo = RCTImage;\n\t\t};\n\t\t00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B511DB1A9E6C8500147676;\n\t\t\tremoteInfo = RCTNetwork;\n\t\t};\n\t\t00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 832C81801AAF6DEF007FA2F7;\n\t\t\tremoteInfo = RCTVibration;\n\t\t};\n\t\t07AE0CFA1F74268D0035D6C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7ECE1E25DB7D00323FB7;\n\t\t\tremoteInfo = \"third-party\";\n\t\t};\n\t\t07AE0CFC1F74268D0035D6C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D3C1EBD27B6005632C8;\n\t\t\tremoteInfo = \"third-party-tvOS\";\n\t\t};\n\t\t07AE0CFE1F74268D0035D6C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7E881E25C6D100323FB7;\n\t\t\tremoteInfo = \"double-conversion\";\n\t\t};\n\t\t07AE0D001F74268D0035D6C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D621EBD27B9005632C8;\n\t\t\tremoteInfo = \"double-conversion-tvOS\";\n\t\t};\n\t\t07C03E341EC4EB8600E549B0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28131D9B038B00D4039D;\n\t\t\tremoteInfo = \"React-tvOS\";\n\t\t};\n\t\t07C03E361EC4EB8600E549B0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C06751DE3340C00C268FA;\n\t\t\tremoteInfo = \"yoga-tvOS\";\n\t\t};\n\t\t07C03E381EC4EB8600E549B0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;\n\t\t\tremoteInfo = \"cxxreact-tvOS\";\n\t\t};\n\t\t0CFA0AE922987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;\n\t\t\tremoteInfo = jsi;\n\t\t};\n\t\t0CFA0AEB22987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC73B214B45A300DD5AC8;\n\t\t\tremoteInfo = jsiexecutor;\n\t\t};\n\t\t0CFA0AED22987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FB6214C9A0900B7C4FE;\n\t\t\tremoteInfo = \"jsi-tvOS\";\n\t\t};\n\t\t0CFA0AEF22987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FEE214C9CF800B7C4FE;\n\t\t\tremoteInfo = \"jsiexecutor-tvOS\";\n\t\t};\n\t\t0CFA0AF722987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6ACD0BF3CAC840B79C2544A5 /* RNCNetInfo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RNCNetInfo;\n\t\t};\n\t\t0CFA0AF922987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 6ACD0BF3CAC840B79C2544A5 /* RNCNetInfo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B5027B1B2237B30F00F1AABA;\n\t\t\tremoteInfo = \"RNCNetInfo-tvOS\";\n\t\t};\n\t\t0CFA0AFC22987EC4007F740A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 16D0CEE186654808941ED16F /* RNCWebView.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RNCWebView;\n\t\t};\n\t\t139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTSettings;\n\t\t};\n\t\t139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3C86DF461ADF2C930047B81A;\n\t\t\tremoteInfo = RCTWebSocket;\n\t\t};\n\t\t146834031AC3E56700842450 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;\n\t\t\tremoteInfo = React;\n\t\t};\n\t\t3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A283A1D9B042B00D4039D;\n\t\t\tremoteInfo = \"RCTImage-tvOS\";\n\t\t};\n\t\t3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28471D9B043800D4039D;\n\t\t\tremoteInfo = \"RCTLinking-tvOS\";\n\t\t};\n\t\t3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28541D9B044C00D4039D;\n\t\t\tremoteInfo = \"RCTNetwork-tvOS\";\n\t\t};\n\t\t3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28611D9B046600D4039D;\n\t\t\tremoteInfo = \"RCTSettings-tvOS\";\n\t\t};\n\t\t3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A287B1D9B048500D4039D;\n\t\t\tremoteInfo = \"RCTText-tvOS\";\n\t\t};\n\t\t3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28881D9B049200D4039D;\n\t\t\tremoteInfo = \"RCTWebSocket-tvOS\";\n\t\t};\n\t\t3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C059A1DE3340900C268FA;\n\t\t\tremoteInfo = yoga;\n\t\t};\n\t\t3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;\n\t\t\tremoteInfo = cxxreact;\n\t\t};\n\t\t5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTAnimation;\n\t\t};\n\t\t5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28201D9B03D100D4039D;\n\t\t\tremoteInfo = \"RCTAnimation-tvOS\";\n\t\t};\n\t\t78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTLinking;\n\t\t};\n\t\t832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5119B1A9E6C1200147676;\n\t\t\tremoteInfo = RCTText;\n\t\t};\n\t\t8CCE8B8F2182ACCF00855E24 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BDC1FC498900052F4D5;\n\t\t\tremoteInfo = jsinspector;\n\t\t};\n\t\t8CCE8B912182ACCF00855E24 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;\n\t\t\tremoteInfo = \"jsinspector-tvOS\";\n\t\t};\n\t\tD4A8C3B020247A9D008BE855 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D001F3B181A0099AA32;\n\t\t\tremoteInfo = fishhook;\n\t\t};\n\t\tD4A8C3B220247A9D008BE855 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32;\n\t\t\tremoteInfo = \"fishhook-tvOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTActionSheet.xcodeproj; path = \"../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTGeolocation.xcodeproj; path = \"../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTImage.xcodeproj; path = \"../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTNetwork.xcodeproj; path = \"../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVibration.xcodeproj; path = \"../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTSettings.xcodeproj; path = \"../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTWebSocket.xcodeproj; path = \"../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t13B07F961A680F5B00A75B9A /* RXPTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RXPTest.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RXPTest/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RXPTest/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RXPTest/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RXPTest/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RXPTest/main.m; sourceTree = \"<group>\"; };\n\t\t146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = React.xcodeproj; path = \"../node_modules/react-native/React/React.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t16D0CEE186654808941ED16F /* RNCWebView.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = \"wrapper.pb-project\"; name = RNCWebView.xcodeproj; path = \"../node_modules/react-native-webview/ios/RNCWebView.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTAnimation.xcodeproj; path = \"../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t6ACD0BF3CAC840B79C2544A5 /* RNCNetInfo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = \"wrapper.pb-project\"; name = RNCNetInfo.xcodeproj; path = \"../node_modules/@react-native-community/netinfo/ios/RNCNetInfo.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t6C292C692AED4DC2B496B1DB /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = \"<group>\"; };\n\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTLinking.xcodeproj; path = \"../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTText.xcodeproj; path = \"../node_modules/react-native/Libraries/Text/RCTText.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tD2278307222FDC55009150CC /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tD84626BC41A4406DAC31CDCF /* libRNCNetInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCNetInfo.a; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2278308222FDC55009150CC /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */,\n\t\t\t\t5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,\n\t\t\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,\n\t\t\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,\n\t\t\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,\n\t\t\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,\n\t\t\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,\n\t\t\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,\n\t\t\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,\n\t\t\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,\n\t\t\t\t6D5B77E9E6F648EB8ADF799E /* libRNCNetInfo.a in Frameworks */,\n\t\t\t\tDC59425A11A24663A46F6493 /* libRNCWebView.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00C302A81ABCB8CE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302B61ABCB90400DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302BC1ABCB91800DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,\n\t\t\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302D41ABCB9D200DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,\n\t\t\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302E01ABCB9EE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CFA0AC522987EC1007F740A /* Recovered References */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD84626BC41A4406DAC31CDCF /* libRNCNetInfo.a */,\n\t\t\t\t6C292C692AED4DC2B496B1DB /* libRNCWebView.a */,\n\t\t\t);\n\t\t\tname = \"Recovered References\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CFA0AF122987EC4007F740A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CFA0AF822987EC4007F740A /* libRNCNetInfo.a */,\n\t\t\t\t0CFA0AFA22987EC4007F740A /* libRNCNetInfo-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0CFA0AF322987EC4007F740A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0CFA0AFD22987EC4007F740A /* libRNCWebView.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139105B71AF99BAD00B5F7CC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,\n\t\t\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139FDEE71B06529A00C62182 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,\n\t\t\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,\n\t\t\t\tD4A8C3B120247A9D008BE855 /* libfishhook.a */,\n\t\t\t\tD4A8C3B320247A9D008BE855 /* libfishhook-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* RXPTest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = RXPTest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t146834001AC3E56700842450 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t146834041AC3E56700842450 /* libReact.a */,\n\t\t\t\t07C03E351EC4EB8600E549B0 /* libReact.a */,\n\t\t\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t07C03E371EC4EB8600E549B0 /* libyoga.a */,\n\t\t\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t07C03E391EC4EB8600E549B0 /* libcxxreact.a */,\n\t\t\t\t8CCE8B902182ACCF00855E24 /* libjsinspector.a */,\n\t\t\t\t8CCE8B922182ACCF00855E24 /* libjsinspector-tvOS.a */,\n\t\t\t\t07AE0CFB1F74268D0035D6C1 /* libthird-party.a */,\n\t\t\t\t07AE0CFD1F74268D0035D6C1 /* libthird-party.a */,\n\t\t\t\t07AE0CFF1F74268D0035D6C1 /* libdouble-conversion.a */,\n\t\t\t\t07AE0D011F74268D0035D6C1 /* libdouble-conversion.a */,\n\t\t\t\t0CFA0AEA22987EC4007F740A /* libjsi.a */,\n\t\t\t\t0CFA0AEC22987EC4007F740A /* libjsiexecutor.a */,\n\t\t\t\t0CFA0AEE22987EC4007F740A /* libjsi-tvOS.a */,\n\t\t\t\t0CFA0AF022987EC4007F740A /* libjsiexecutor-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E91572E1DD0AC6500FF2AA8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78C398B11ACF4ADC00677621 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */,\n\t\t\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,\n\t\t\t\t146833FF1AC3E56700842450 /* React.xcodeproj */,\n\t\t\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,\n\t\t\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,\n\t\t\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,\n\t\t\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,\n\t\t\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,\n\t\t\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,\n\t\t\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,\n\t\t\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,\n\t\t\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,\n\t\t\t\t6ACD0BF3CAC840B79C2544A5 /* RNCNetInfo.xcodeproj */,\n\t\t\t\t16D0CEE186654808941ED16F /* RNCWebView.xcodeproj */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341B11AAA6A8300B99B32 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */,\n\t\t\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* RXPTest */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\tD22782DB222FDC54009150CC /* Frameworks */,\n\t\t\t\t0CFA0AC522987EC1007F740A /* Recovered References */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* RXPTest.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD22782DB222FDC54009150CC /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD2278307222FDC55009150CC /* JavaScriptCore.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t13B07F861A680F5B00A75B9A /* RXPTest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPTest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RXPTest;\n\t\t\tproductName = RXPTest;\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* RXPTest.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t13B07F861A680F5B00A75B9A = {\n\t\t\t\t\t\tDevelopmentTeam = UBF8T346G9;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPTest\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;\n\t\t\t\t\tProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 78C398B11ACF4ADC00677621 /* Products */;\n\t\t\t\t\tProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;\n\t\t\t\t\tProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 832341B11AAA6A8300B99B32 /* Products */;\n\t\t\t\t\tProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139FDEE71B06529A00C62182 /* Products */;\n\t\t\t\t\tProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 146834001AC3E56700842450 /* Products */;\n\t\t\t\t\tProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 0CFA0AF122987EC4007F740A /* Products */;\n\t\t\t\t\tProjectRef = 6ACD0BF3CAC840B79C2544A5 /* RNCNetInfo.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 0CFA0AF322987EC4007F740A /* Products */;\n\t\t\t\t\tProjectRef = 16D0CEE186654808941ED16F /* RNCWebView.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* RXPTest */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTActionSheet.a;\n\t\t\tremoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTGeolocation.a;\n\t\t\tremoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTImage.a;\n\t\t\tremoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTNetwork.a;\n\t\t\tremoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVibration.a;\n\t\t\tremoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07AE0CFB1F74268D0035D6C1 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 07AE0CFA1F74268D0035D6C1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07AE0CFD1F74268D0035D6C1 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 07AE0CFC1F74268D0035D6C1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07AE0CFF1F74268D0035D6C1 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 07AE0CFE1F74268D0035D6C1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07AE0D011F74268D0035D6C1 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 07AE0D001F74268D0035D6C1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07C03E351EC4EB8600E549B0 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 07C03E341EC4EB8600E549B0 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07C03E371EC4EB8600E549B0 /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 07C03E361EC4EB8600E549B0 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t07C03E391EC4EB8600E549B0 /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 07C03E381EC4EB8600E549B0 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AEA22987EC4007F740A /* libjsi.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsi.a;\n\t\t\tremoteRef = 0CFA0AE922987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AEC22987EC4007F740A /* libjsiexecutor.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsiexecutor.a;\n\t\t\tremoteRef = 0CFA0AEB22987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AEE22987EC4007F740A /* libjsi-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsi-tvOS.a\";\n\t\t\tremoteRef = 0CFA0AED22987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AF022987EC4007F740A /* libjsiexecutor-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsiexecutor-tvOS.a\";\n\t\t\tremoteRef = 0CFA0AEF22987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AF822987EC4007F740A /* libRNCNetInfo.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRNCNetInfo.a;\n\t\t\tremoteRef = 0CFA0AF722987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AFA22987EC4007F740A /* libRNCNetInfo-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRNCNetInfo-tvOS.a\";\n\t\t\tremoteRef = 0CFA0AF922987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t0CFA0AFD22987EC4007F740A /* libRNCWebView.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRNCWebView.a;\n\t\t\tremoteRef = 0CFA0AFC22987EC4007F740A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTSettings.a;\n\t\t\tremoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTWebSocket.a;\n\t\t\tremoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t146834041AC3E56700842450 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTImage-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTLinking-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTNetwork-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTSettings-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTText-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTWebSocket-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTLinking.a;\n\t\t\tremoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTText.a;\n\t\t\tremoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8CCE8B902182ACCF00855E24 /* libjsinspector.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsinspector.a;\n\t\t\tremoteRef = 8CCE8B8F2182ACCF00855E24 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8CCE8B922182ACCF00855E24 /* libjsinspector-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsinspector-tvOS.a\";\n\t\t\tremoteRef = 8CCE8B912182ACCF00855E24 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tD4A8C3B120247A9D008BE855 /* libfishhook.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libfishhook.a;\n\t\t\tremoteRef = D4A8C3B020247A9D008BE855 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tD4A8C3B320247A9D008BE855 /* libfishhook-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libfishhook-tvOS.a\";\n\t\t\tremoteRef = D4A8C3B220247A9D008BE855 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = RXPTest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tDEVELOPMENT_TEAM = UBF8T346G9;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios\",\n\t\t\t\t\t\"$(SRCROOT)/../node_modules/react-native-webview/ios\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = RXPTest/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/RXPTest\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = RXPTest;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = UBF8T346G9;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios\",\n\t\t\t\t\t\"$(SRCROOT)/../node_modules/react-native-webview/ios\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = RXPTest/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/RXPTest\\\"\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = RXPTest;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPTest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPTest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest.xcodeproj/xcshareddata/xcschemes/RXPTest-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D2A28121D9B038B00D4039D\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React-tvOS\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"RXPTest-tvOS.app\"\n               BlueprintName = \"RXPTest-tvOS\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPTest-tvOSTests.xctest\"\n               BlueprintName = \"RXPTest-tvOSTests\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPTest-tvOSTests.xctest\"\n               BlueprintName = \"RXPTest-tvOSTests\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPTest-tvOS.app\"\n            BlueprintName = \"RXPTest-tvOS\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPTest-tvOS.app\"\n            BlueprintName = \"RXPTest-tvOS\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPTest-tvOS.app\"\n            BlueprintName = \"RXPTest-tvOS\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/RXPTest/ios/RXPTest.xcodeproj/xcshareddata/xcschemes/RXPTest.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"83CBBA2D1A601D0E00E9B192\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"RXPTest.app\"\n               BlueprintName = \"RXPTest\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPTestTests\"\n               BlueprintName = \"RXPTestTests\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPTestTests\"\n               BlueprintName = \"RXPTestTests\"\n               ReferencedContainer = \"container:RXPTest.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPTest.app\"\n            BlueprintName = \"RXPTest\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPTest.app\"\n            BlueprintName = \"RXPTest\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPTest.app\"\n            BlueprintName = \"RXPTest\"\n            ReferencedContainer = \"container:RXPTest.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/RXPTest/metro.config.js",
    "content": "/**\n * Metro configuration for React Native\n * https://github.com/facebook/react-native\n *\n * @format\n */\n\nmodule.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: {\n        experimentalImportSupport: false,\n        inlineRequires: false,\n      },\n    }),\n  },\n};\n"
  },
  {
    "path": "samples/RXPTest/package.json",
    "content": "{\n  \"name\": \"rxptest\",\n  \"version\": \"2.0.0\",\n  \"private\": true,\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"sync\": \"sync-glob '../../dist' ./node_modules/reactxp/dist\",\n    \"web-watch\": \"webpack --progress --colors --watch\",\n    \"rn-watch\": \"tsc --watch\",\n    \"start\": \"node node_modules/react-native/local-cli/cli.js start\",\n    \"android\": \"node node_modules/react-native/local-cli/cli.js run-android\",\n    \"ios\": \"node node_modules/react-native/local-cli/cli.js run-ios\",\n    \"windows\": \"node node_modules/react-native/local-cli/cli.js run-windows\",\n    \"web\": \"webpack-dev-server\",\n    \"tslint\": \"tslint --project tsconfig.json -r tslint.json -r ./node_modules/tslint-microsoft-contrib --fix || true\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"^12.12.14\",\n    \"@types/webpack\": \"^4.41.0\",\n    \"awesome-typescript-loader\": \"^5.2.1\",\n    \"rnpm-plugin-windows\": \"^0.3.8\",\n    \"source-map-loader\": \"^0.2.4\",\n    \"sync-glob\": \"^1.4.0\",\n    \"ts-node\": \"^8.5.4\",\n    \"tslint\": \"^5.20.1\",\n    \"tslint-loader\": \"^3.5.4\",\n    \"tslint-microsoft-contrib\": \"^6.2.0\",\n    \"typescript\": \"^3.7.2\",\n    \"webpack\": \"^4.41.2\",\n    \"webpack-cli\": \"^3.3.10\",\n    \"webpack-dev-server\": \"^3.9.0\"\n  },\n  \"dependencies\": {\n    \"react\": \"16.12.0\",\n    \"react-dom\": \"16.12.0\",\n    \"react-native\": \"0.59.10\",\n    \"react-native-windows\": \"0.59.0-rc.3\",\n    \"reactxp\": \"^2.0.0\",\n    \"reactxp-netinfo\": \"^2.0.0\",\n    \"reactxp-webview\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "samples/RXPTest/src/App.tsx",
    "content": "/*\n* This file provides a test framework for ReactXP.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport { TestContainer } from './TestContainer';\nimport { TestListView } from './TestListView';\nimport TestRegistry from './TestRegistry';\n\ninterface AppState {\n    selectedTest: string;\n    runAll: boolean;\n}\n\nclass App extends RX.Component<RX.CommonProps, AppState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            selectedTest: '',\n            runAll: false\n        };\n    }\n\n    render(): RX.Types.ReactNode {\n        if (this.state.selectedTest) {\n            return (\n                <TestContainer\n                    key={ this.state.selectedTest }\n                    test={ this.state.selectedTest }\n                    prevResult={ TestRegistry.getResult(this.state.selectedTest) }\n                    autoRun={ this.state.runAll }\n                    onBack={ this._onBack }\n                />\n            );\n        } else {\n            return (\n                <TestListView\n                    onSelectTest={ this._onSelectTest }\n                    onRunAll={ this._onRunAll }\n                />\n            );\n        }\n    }\n\n    private _onBack = () => {\n        if (this.state.runAll) {\n            let testPaths = _.keys(TestRegistry.getAllTests());\n            let curTestIndex = _.indexOf(testPaths, this.state.selectedTest);\n\n            // If there are more tests to run, move on to the next one.\n            if (curTestIndex + 1 < testPaths.length) {\n                console.log('state selectedTest moving to: ', testPaths[curTestIndex + 1]);\n                this.setState({ selectedTest: testPaths[curTestIndex + 1] });\n                return;\n            }\n        }\n\n        // Clear the selected test.\n        this.setState({ runAll: false, selectedTest: '' });\n    }\n\n    private _onSelectTest = (path: string) => {\n        this.setState({ selectedTest: path });\n    }\n\n    private _onRunAll = () => {\n        let firstTest = _.first(_.keys(TestRegistry.getAllTests()));\n\n        this.setState({ runAll: true, selectedTest: firstTest || '' });\n    }\n}\n\nexport = App;\n"
  },
  {
    "path": "samples/RXPTest/src/CommonStyles.tsx",
    "content": "/*\n* Styles and style parameters that are used throughout the app.\n*/\n\nexport const generalFontSize = 14;\n\nexport const buttonFontSize = generalFontSize;\nexport const buttonTextColor = '#333';\nexport const buttonBackgroundColor = '#eee';\nexport const buttonBorderColor = '#aaa';\nexport const buttonBorderRadius = 8;\nexport const buttonBorderWidth = 1;\n\nexport const headerBackgroundColor = '#ddd';\nexport const headerBorderColor = '#aaa';\n\nexport const explainTextColor = '#999';\nexport const errorTextColor = 'red';\nexport const warningTextColor = 'orange';\nexport const successTextColor = 'green';\n"
  },
  {
    "path": "samples/RXPTest/src/Test.tsx",
    "content": "/*\n* A base class for all tests.\n*/\n\nimport RX = require('reactxp');\n\nexport const enum TestType {\n    // The test needs to be executed but requires no user interaction or validation\n    AutoExecutable,\n\n    // The test requires interaction with the user for validation\n    Interactive\n}\n\nexport class TestResult {\n    constructor() {\n        this.errors = [];\n        this.userValidated = false;\n    }\n\n    errors: string[];\n    userValidated: boolean;\n}\n\nexport interface Test {\n    // Returns slash-delimited path of the test (e.g. \"Components/View/OnPress\")\n    getPath(): string;\n\n    // Returns the type of test\n    getTestType(): TestType;\n\n    // Optional value that allows a test to specify that the test container\n    // should be a full-screen view rather than a scrolling view (which\n    // accommodates arbitrary-sized contents).\n    useFullScreenContainer?: boolean;\n\n    // Renders the UI for the test\n    render(onMount: (component: any) => void): RX.Types.ReactNode;\n}\n\nexport interface AutoExecutableTest extends Test {\n    // Runs the test, calling back the \"complete\" callback when finished\n    execute(component: any, complete: (result: TestResult) => void): void;\n}\n"
  },
  {
    "path": "samples/RXPTest/src/TestContainer.tsx",
    "content": "/*\n* A visual container for an individual test. It includes\n* UI elements for executing the test and for reporting status.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from './CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from './Test';\nimport TestRegistry from './TestRegistry';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch'\n    }),\n    header: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        flex: 0,\n        backgroundColor: CommonStyles.headerBackgroundColor,\n        flexDirection: 'row',\n        justifyContent: 'space-between',\n        alignItems: 'center',\n        borderBottomWidth: 1,\n        borderColor: CommonStyles.headerBorderColor\n    }),\n    headerSpacer: RX.Styles.createViewStyle({\n        paddingTop: 20\n    }),\n    button: RX.Styles.createButtonStyle({\n        flex: 0,\n        margin: 8,\n        height: 28,\n        backgroundColor: CommonStyles.buttonBackgroundColor,\n        borderRadius: CommonStyles.buttonBorderRadius,\n        borderWidth: CommonStyles.buttonBorderWidth,\n        borderColor: CommonStyles.buttonBorderColor\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.buttonFontSize,\n        marginHorizontal: 12,\n        color: CommonStyles.buttonTextColor\n    }),\n    titleText: RX.Styles.createTextStyle({\n        flex: -1,\n        fontSize: CommonStyles.buttonFontSize,\n        marginHorizontal: 12\n    }),\n    resultContainer: RX.Styles.createViewStyle({\n        height: 100,\n        alignSelf: 'stretch',\n        borderBottomWidth: 1,\n        borderColor: '#ddd'\n    }),\n    resultScrollView: RX.Styles.createScrollViewStyle({\n        flex: 1,\n        alignSelf: 'stretch'\n    }),\n    resultItem: RX.Styles.createViewStyle({\n        marginHorizontal: 12,\n        marginTop: 8\n    }),\n    notRunText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    errorText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.errorTextColor\n    }),\n    successText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.successTextColor\n    }),\n    fullScreenContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch'\n    })\n};\n\nexport interface TestContainerProps extends RX.CommonProps {\n    test: string;\n    prevResult?: TestResult;\n    autoRun: boolean;\n    onBack: () => void;\n}\n\nexport interface TestContainerState {\n    mountedComponent?: any;\n    isTestRunning?: boolean;\n    result?: TestResult;\n}\n\nexport class TestContainer extends RX.Component<TestContainerProps, TestContainerState> {\n    constructor(props: TestContainerProps) {\n        super(props);\n\n        this.state = {\n            mountedComponent: undefined,\n            isTestRunning: false\n        };\n    }\n\n    componentDidUpdate(prevProps: TestContainerProps, prevState: TestContainerState) {\n        if (this.props.autoRun) {\n            if (!prevState.isTestRunning && !this.state.isTestRunning) {\n                this._executeTest();\n            }\n        }\n    }\n\n    render() {\n        let test = TestRegistry.getTest(this.props.test);\n        let testType = test.getTestType();\n\n        let testResults: JSX.Element;\n        let result = this.state.result || this.props.prevResult;\n        let resultText: JSX.Element[] = [];\n        if (!result) {\n            resultText.push(\n                <RX.View style={ _styles.resultItem } key='notrun'>\n                    <RX.Text style={ _styles.notRunText }>\n                        { this.state.isTestRunning ? 'Test is running' : 'Test not run' }\n                    </RX.Text>\n                </RX.View>\n            );\n        } else {\n            result.errors.forEach((error, index) => {\n                resultText.push(\n                    <RX.View style={ _styles.resultItem } key={ 'error' + index }>\n                        <RX.Text style={ _styles.errorText }>\n                            { error }\n                        </RX.Text>\n                    </RX.View>\n                );\n            });\n\n            if (resultText.length === 0) {\n                resultText.push(\n                    <RX.View style={ _styles.resultItem } key={ 'success' }>\n                        <RX.Text style={ _styles.successText }>\n                            { 'Test succeeded' }\n                        </RX.Text>\n                    </RX.View>\n                );\n            }\n        }\n\n        // Include results if it's not a render-only test.\n        let optionalResultSection: JSX.Element | undefined;\n        if (testType === TestType.AutoExecutable) {\n            optionalResultSection = (\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.ScrollView style={ _styles.resultScrollView }>\n                        { resultText }\n                    </RX.ScrollView>\n                </RX.View>\n            );\n        }\n\n        let rightButton: JSX.Element;\n        if (testType === TestType.Interactive) {\n            rightButton = (\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ this._onCompleteInteractiveTest }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Validate' }\n                    </RX.Text>\n                </RX.Button>\n            );\n        } else {\n            rightButton = (\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ this._onRunTest }\n                    disabled={ this.state.isTestRunning || testType !== TestType.AutoExecutable }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Run' }\n                    </RX.Text>\n                </RX.Button>\n            );\n        }\n\n        let renderedTest = test.render(this._onMountTestUI);\n\n        let testContainer: JSX.Element;\n        if (test.useFullScreenContainer) {\n            testContainer = (\n                <RX.View style={ _styles.fullScreenContainer }>\n                    { renderedTest }\n                </RX.View>\n            );\n        } else {\n            testContainer = (\n                <RX.ScrollView>\n                    <RX.View>\n                    { renderedTest }\n                    </RX.View>\n                </RX.ScrollView>\n            );\n        }\n\n        return (\n            <RX.View useSafeInsets={ true } style={ _styles.container }>\n                <RX.View style={ [_styles.header, RX.StatusBar.isOverlay() ? _styles.headerSpacer : undefined] }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onBack }\n                        disabled={ this.state.isTestRunning }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Back' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.titleText } numberOfLines={ 1 }>\n                        { TestRegistry.formatPath(test.getPath()) }\n                    </RX.Text>\n                    { rightButton }\n                </RX.View>\n                { optionalResultSection }\n                { testContainer }\n            </RX.View>\n        );\n    }\n\n    private _onBack = () => {\n        this.props.onBack();\n    }\n\n    private _onRunTest = () => {\n        this._executeTest();\n    }\n\n    private _executeTest() {\n        this.setState({ isTestRunning: true });\n\n        let test = TestRegistry.getTest(this.props.test);\n        let testType = test.getTestType();\n\n        if (testType === TestType.AutoExecutable) {\n            (test as AutoExecutableTest).execute(this.state.mountedComponent, result => {\n                // Record the results.\n                TestRegistry.setResult(this.props.test, result);\n\n                this.setState({ isTestRunning: false, result });\n\n                // Automatically go back.\n                if (this.props.autoRun) {\n                    this.props.onBack();\n                }\n            });\n        } else {\n            let result = new TestResult();\n            if (testType === TestType.Interactive) {\n                result.userValidated = false;\n                TestRegistry.setResult(this.props.test, result);\n            } else {\n                // For render-only tests, always report success.\n                TestRegistry.setResult(this.props.test, result);\n            }\n\n            // Automatically go back.\n            if (this.props.autoRun) {\n                this.props.onBack();\n            }\n        }\n    }\n\n    private _onCompleteInteractiveTest = () => {\n        // This should be called only if the test type is interactive.\n        let result = new TestResult();\n        result.userValidated = true;\n        TestRegistry.setResult(this.props.test, result);\n\n        this.props.onBack();\n    }\n\n    private _onMountTestUI = (component: any) => {\n        // Record the mounted component. This will trigger\n        // the test to run if the autoRun prop is set.\n        if (component) {\n            this.setState({ mountedComponent: component });\n        }\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/src/TestListView.tsx",
    "content": "/*\n* A view that includes a list of all tests, allowing the user to\n* select or deselect particular tests and run them.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from './CommonStyles';\nimport { Test, TestResult, TestType } from './Test';\nimport TestRegistry from './TestRegistry';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch'\n    }),\n    header: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        flex: 0,\n        backgroundColor: CommonStyles.headerBackgroundColor,\n        flexDirection: 'row',\n        justifyContent: 'space-between',\n        alignItems: 'center',\n        borderBottomWidth: 1,\n        borderColor: CommonStyles.headerBorderColor\n    }),\n    headerSpacer: RX.Styles.createViewStyle({\n        paddingTop: 20\n    }),\n    button: RX.Styles.createButtonStyle({\n        flex: 0,\n        margin: 8,\n        height: 28,\n        backgroundColor: CommonStyles.buttonBackgroundColor,\n        borderRadius: CommonStyles.buttonBorderRadius,\n        borderWidth: CommonStyles.buttonBorderWidth,\n        borderColor: CommonStyles.buttonBorderColor\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.buttonFontSize,\n        marginHorizontal: 12,\n        color: CommonStyles.buttonTextColor\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        marginHorizontal: 12,\n        color: CommonStyles.explainTextColor\n    }),\n    scrollView: RX.Styles.createScrollViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n    }),\n    itemContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        justifyContent: 'center',\n        height: 32,\n        cursor: 'pointer'\n    }),\n    itemTextContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        alignSelf: 'stretch',\n        justifyContent: 'center'\n    }),\n    resultContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        justifyContent: 'flex-end',\n        alignItems: 'center',\n        marginHorizontal: 12\n    }),\n    itemText: RX.Styles.createTextStyle({\n        flex: 1,\n        fontSize: CommonStyles.generalFontSize,\n        marginHorizontal: 12\n    }),\n    notRunText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    errorText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.errorTextColor\n    }),\n    warningText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.warningTextColor\n    }),\n    successText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.successTextColor\n    })\n};\n\nexport interface TestListViewProps extends RX.CommonProps {\n    onSelectTest: (path: string) => void;\n    onRunAll: () => void;\n}\n\nexport interface TestListViewState {\n    results?: {[path: string]: TestResult };\n}\n\nexport class TestListView extends RX.Component<TestListViewProps, TestListViewState> {\n    constructor(props: TestListViewProps) {\n        super(props);\n\n        this.state = {\n            results: {}\n        };\n    }\n\n    render() {\n        let tests = TestRegistry.getAllTests();\n\n        let testListItems: JSX.Element[] = _.map(tests, (test, path) => {\n            let testPath = test.getPath();\n            let testType = test.getTestType();\n            let result = TestRegistry.getResult(testPath);\n            let resultText: JSX.Element;\n\n            if (!result) {\n                resultText = (\n                    <RX.Text style={ _styles.notRunText } numberOfLines={ 1 }>\n                        { 'not run' }\n                    </RX.Text>\n                );\n            } else if (result.errors.length > 0) {\n                resultText = (\n                    <RX.Text style={ _styles.errorText } numberOfLines={ 1 }>\n                        { result.errors.length + (result.errors.length > 1 ? ' errors' : ' error') }\n                    </RX.Text>\n                );\n            } else if (testType === TestType.Interactive && !result.userValidated) {\n                resultText = (\n                    <RX.Text style={ _styles.warningText } numberOfLines={ 1 }>\n                        { 'needs validation' }\n                    </RX.Text>\n                );\n            } else {\n                resultText = (\n                    <RX.Text style={ _styles.successText } numberOfLines={ 1 }>\n                        { testType === TestType.Interactive ? 'validated' : 'success' }\n                    </RX.Text>\n                );\n            }\n\n            return (\n                <RX.View\n                    style={ _styles.itemContainer }\n                    key={ path }\n                    onPress={ () => this._onPressItem(testPath) }\n                >\n                    <RX.View style={ _styles.itemTextContainer}>\n                        <RX.Text style={ _styles.itemText } numberOfLines={ 1 }>\n                            { TestRegistry.formatPath(test.getPath()) }\n                        </RX.Text>\n                        <RX.View style={ _styles.resultContainer }>\n                            { resultText }\n                        </RX.View>\n                    </RX.View>\n                </RX.View>\n            );\n        });\n\n        return (\n            <RX.View useSafeInsets={ true } style={ _styles.container }>\n                <RX.View style={ [_styles.header, RX.StatusBar.isOverlay() ? _styles.headerSpacer : undefined] }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Select test to run' }\n                    </RX.Text>\n                    <RX.Button style={ _styles.button } onPress={ this._runAll }>\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Run All' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.ScrollView style={ _styles.scrollView }>\n                    { testListItems }\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    private _onPressItem(path: string) {\n        this.props.onSelectTest(path);\n    }\n\n    private _runAll = (e: RX.Types.SyntheticEvent) => {\n        this.props.onRunAll();\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/src/TestRegistry.ts",
    "content": "/*\n* A registry of all tests indexed by path along with\n* the last result of each test run.\n*/\n\nimport { Test, TestResult } from './Test';\n\nimport AccessibilityTest from './Tests/AccessibilityTest';\nimport AlertTest from './Tests/AlertTest';\nimport AppTest from './Tests/AppTest';\nimport ActivityIndicatorTest from './Tests/ActivityIndicatorTest';\nimport AnimationTest from './Tests/AnimationTest';\nimport ButtonTest from './Tests/ButtonTest';\nimport ClipboardTest from './Tests/ClipboardTest';\nimport DragAndDropTest from './Tests/DragAndDropTest';\nimport GestureViewTest from './Tests/GestureViewTest';\nimport ImageApiTest from './Tests/ImageApiTest';\nimport ImageInteractiveTest from './Tests/ImageInteractiveTest';\nimport InputTest from './Tests/InputTest';\nimport InternationalTest from './Tests/InternationalTest';\nimport LinkTest from './Tests/LinkTest';\nimport LinkingTest from './Tests/LinkingTest';\nimport LocationTest from './Tests/LocationTest';\nimport ModalTest from './Tests/ModalTest';\nimport NetworkTest from './Tests/NetworkTest';\nimport PickerTest from './Tests/PickerTest';\nimport PlatformTest from './Tests/PlatformTest';\nimport PopupTest from './Tests/PopupTest';\nimport ScrollViewBasicTest from './Tests/ScrollViewBasicTest';\nimport ScrollViewEventTest from './Tests/ScrollViewEventTest';\nimport StatusBarTest from './Tests/StatusBarTest';\nimport StorageTest from './Tests/StorageTest';\nimport TextTest from './Tests/TextTest';\nimport TextInputApiTest from './Tests/TextInputApiTest';\nimport TextInputInteractiveTest from './Tests/TextInputInteractiveTest';\nimport UserInterfaceTest from './Tests/UserInterfaceTest';\nimport UserPresenceTest from './Tests/UserPresenceTest';\nimport ViewBasicTest from './Tests/ViewBasicTest';\nimport ViewMouseTest from './Tests/ViewMouseTest';\nimport ViewTouchTest from './Tests/ViewTouchTest';\nimport WebViewBasicTest from './Tests/WebViewBasicTest';\nimport WebViewDynamicTest from './Tests/WebViewDynamicTest';\n\nclass TestRegistry {\n    private _tests: {[path: string]: Test } = {};\n    private _results: {[path: string]: TestResult } = {};\n\n    constructor() {\n        // API tests\n        this.registerTest(AccessibilityTest);\n        this.registerTest(AlertTest);\n        this.registerTest(AnimationTest);\n        this.registerTest(AppTest);\n        this.registerTest(ClipboardTest);\n        this.registerTest(DragAndDropTest);\n        this.registerTest(InputTest);\n        this.registerTest(InternationalTest);\n        this.registerTest(LinkingTest);\n        this.registerTest(LocationTest);\n        this.registerTest(ModalTest);\n        this.registerTest(NetworkTest);\n        this.registerTest(PlatformTest);\n        this.registerTest(PopupTest);\n        this.registerTest(StatusBarTest);\n        this.registerTest(StorageTest);\n        this.registerTest(UserInterfaceTest);\n        this.registerTest(UserPresenceTest);\n\n        // Component tests\n        this.registerTest(ActivityIndicatorTest);\n        this.registerTest(ButtonTest);\n        this.registerTest(GestureViewTest);\n        this.registerTest(ImageApiTest);\n        this.registerTest(ImageInteractiveTest);\n        this.registerTest(LinkTest);\n        this.registerTest(PickerTest);\n        this.registerTest(ScrollViewBasicTest);\n        this.registerTest(ScrollViewEventTest);\n        this.registerTest(TextTest);\n        this.registerTest(TextInputApiTest);\n        this.registerTest(TextInputInteractiveTest);\n        this.registerTest(ViewBasicTest);\n        this.registerTest(ViewMouseTest);\n        this.registerTest(ViewTouchTest);\n        this.registerTest(WebViewBasicTest);\n        this.registerTest(WebViewDynamicTest);\n\n        // Add more tests here...\n    }\n\n    registerTest(test: Test) {\n        this._tests[test.getPath()] = test;\n    }\n\n    getAllTests(): {[path: string]: Test } {\n        return this._tests;\n    }\n\n    getTest(path: string): Test {\n        return this._tests[path];\n    }\n\n    getResult(path: string): TestResult {\n        return this._results[path];\n    }\n\n    setResult(path: string, result: TestResult): void {\n        this._results[path] = result;\n    }\n\n    formatPath(path: string): string {\n        return path.replace(/\\//ig, ' - ');\n    }\n}\n\nexport default new TestRegistry();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/AccessibilityTest.tsx",
    "content": "/*\n* Tests the RX.Accessibility APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface AccessibilityState {\n    isHighContrastEnabled?: boolean;\n    isScreenReaderEnabled?: boolean;\n}\n\nclass AccessibilityView extends RX.Component<RX.CommonProps, AccessibilityState> {\n    private _highContrastEvent: RX.Types.SubscriptionToken | undefined;\n    private _screenReaderEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isHighContrastEnabled: RX.Accessibility.isHighContrastEnabled(),\n            isScreenReaderEnabled: RX.Accessibility.isScreenReaderEnabled()\n        };\n    }\n\n    componentDidMount() {\n        this._highContrastEvent = RX.Accessibility.highContrastChangedEvent.subscribe(isEnabled => {\n            this.setState({ isHighContrastEnabled: isEnabled });\n        });\n\n        this._screenReaderEvent = RX.Accessibility.screenReaderChangedEvent.subscribe(isEnabled => {\n            this.setState({ isScreenReaderEnabled: isEnabled });\n        });\n    }\n\n    componentWillUnmount() {\n        if (this._highContrastEvent) {\n            this._highContrastEvent.unsubscribe();\n        }\n\n        if (this._screenReaderEvent) {\n            this._screenReaderEvent.unsubscribe();\n        }\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is the screen reader enabled?' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.isScreenReaderEnabled ? 'Screen Reader On' : 'Screen Reader Off' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is high-contrast mode enabled?' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.isHighContrastEnabled ? 'High Contrast On' : 'High Contrast Off' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press button to send \"Hello\" to the screen reader.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._sendTextToScreenReader('Hello') }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Send \"Hello\" to Screen Reader' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Validate that the screen reader reads \"5, Mock Slider, Slider\" when focus is on \"Mock Slider\" text below.' }\n                    </RX.Text>\n                    <RX.View\n                        ariaValueNow={ 5 }\n                        accessibilityTraits={ RX.Types.AccessibilityTrait.Adjustable }\n                        accessibilityLabel={ 'Mock Slider' }\n                        tabIndex={ 0 }>\n                        <RX.Text>\n                            { 'Mock Slider' }\n                        </RX.Text>\n                    </RX.View>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _sendTextToScreenReader(text: string) {\n        RX.Accessibility.announceForAccessibility(text);\n    }\n}\n\nclass AccessibilityTest implements Test {\n    getPath(): string {\n        return 'APIs/Accessibility';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <AccessibilityView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new AccessibilityTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ActivityIndicatorTest.tsx",
    "content": "/*\n* Tests the basic functionality of an ActivityIndicator component.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'center'\n    }),\n    aiContainer: RX.Styles.createViewStyle({\n        margin: 20\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    })\n};\n\ninterface ActivityIndicatorViewState {\n    renderIndicators?: boolean;\n}\n\nclass ActivityIndicatorView extends RX.Component<RX.CommonProps, ActivityIndicatorViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            renderIndicators: false\n        };\n    }\n\n    render() {\n        let optionalIndicators: JSX.Element[] = [];\n\n        if (this.state.renderIndicators) {\n            // Render large indicator with no delay.\n            optionalIndicators.push(\n                <RX.View style={ _styles.aiContainer }  key={ 'large' }>\n                    <RX.ActivityIndicator\n                        size={ 'large' }\n                        color={ '#333' }\n                        testId={ 'activityIndicator1' }\n                    />\n                </RX.View>\n            );\n\n            // Render medium indicator with 250ms delay.\n            optionalIndicators.push(\n                <RX.View style={ _styles.aiContainer } key={ 'medium' }>\n                    <RX.ActivityIndicator\n                        size={ 'medium' }\n                        color={ 'red' }\n                        deferTime={ 250 }\n                    />\n                </RX.View>\n            );\n\n            // Render small indicator with 500ms delay.\n            optionalIndicators.push(\n                <RX.View style={ _styles.aiContainer } key={ 'small' }>\n                    <RX.ActivityIndicator\n                        size={ 'small' }\n                        color={ 'green' }\n                        deferTime={ 500 }\n                    />\n                </RX.View>\n            );\n\n            // Render tiny indicator with 1000ms delay.\n            optionalIndicators.push(\n                <RX.View style={ _styles.aiContainer } key={ 'tiny' }>\n                    <RX.ActivityIndicator\n                        size={ 'tiny' }\n                        color={ 'black' }\n                        deferTime={ 1000 }\n                    />\n                </RX.View>\n            );\n        }\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'When the test is run, four activity indicators should appear with varying sizes and delays' }\n                    </RX.Text>\n                </RX.View>\n                { optionalIndicators }\n            </RX.View>\n        );\n    }\n\n    execute(finished: () => void) {\n        this.setState({ renderIndicators: true });\n\n        _.delay(() => {\n            this.setState({ renderIndicators: false });\n            finished();\n        }, 1500);\n    }\n}\n\nclass ActivityIndicatorTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'Components/ActivityIndicator';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ActivityIndicatorView\n                ref={ onMount }\n            />\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        // Nothing to do but report success\n        let results = new TestResult();\n\n        let aiView = component as ActivityIndicatorView;\n        aiView.execute(() => {\n            complete(results);\n        });\n    }\n}\n\nexport default new ActivityIndicatorTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/AlertTest.tsx",
    "content": "/*\n* Tests the RX.Alert APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    buttonPanel: RX.Styles.createViewStyle({\n        flexDirection: 'column'\n    }),\n    alertBody: RX.Styles.createViewStyle({\n        backgroundColor: '#333',\n        borderWidth: 3,\n        borderColor: 'black',\n        borderRadius: 8\n    }),\n    alertTitleText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontStyle: 'italic',\n        color: '#eee'\n    }),\n    alertMessageText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: '#eee'\n    }),\n    alertButton: RX.Styles.createButtonStyle({\n        backgroundColor: '#ff8',\n        borderRadius: 8\n    }),\n    alertButtonHover: RX.Styles.createButtonStyle({\n        backgroundColor: '#dd8'\n    }),\n    alertButtonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    alertCancelButton: RX.Styles.createButtonStyle({\n        backgroundColor: '#f88',\n        borderRadius: 8\n    }),\n    alertCancelButtonHover: RX.Styles.createButtonStyle({\n        backgroundColor: '#fcc'\n    }),\n    alertCancelButtonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        fontWeight: 'bold',\n        color: 'white'\n    })\n};\n\ninterface AlertViewState {\n    lastOption?: string;\n}\n\nclass AlertView extends RX.Component<RX.CommonProps, AlertViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            lastOption: ''\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={_styles.container}>\n                <RX.View style={_styles.textContainer} key={'explanation1'}>\n                    <RX.Text style={_styles.explainText}>\n                        {'Press the button to display an alert.'}\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={_styles.buttonPanel}>\n                    <RX.Button\n                        style={_styles.button}\n                        onPress={() => this._showAlert(false, false)}\n                    >\n                        <RX.Text style={_styles.buttonText}>\n                            {'Alert (Default)'}\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={_styles.button}\n                        onPress={() => this._showAlert(false, true)}\n                    >\n                        <RX.Text style={_styles.buttonText}>\n                            {'Alert (Default - preventDismissOnPress)'}\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={_styles.button}\n                        onPress={() => this._showAlert(true, false)}\n                    >\n                        <RX.Text style={_styles.buttonText}>\n                            {'Alert (Custom)'}\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={_styles.textContainer}>\n                    <RX.Text style={_styles.labelText}>\n                        {this.state.lastOption && 'You chose: ' + this.state.lastOption}\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _showAlert(custom: boolean, preventDismissOnPress: boolean) {\n        const theme = {\n            bodyStyle: _styles.alertBody,\n            titleTextStyle: _styles.alertTitleText,\n            messageTextStyle: _styles.alertMessageText,\n            buttonStyle: _styles.alertButton,\n            buttonHoverStyle: _styles.alertButtonHover,\n            buttonTextStyle: _styles.alertButtonText,\n            cancelButtonStyle: _styles.alertCancelButton,\n            cancelButtonHoverStyle: _styles.alertCancelButtonHover,\n            cancelButtonTextStyle: _styles.alertCancelButtonText,\n        };\n\n        RX.Alert.show('Default Alert', 'Which option would you like to choose?',\n            [\n                { text: 'Option 1', onPress: () => this._setLastOption('Option 1'), style: 'default' },\n                { text: 'Option 2', onPress: () => this._setLastOption('Option 2') },\n                { text: 'Option 3', onPress: () => this._setLastOption('Option 3') },\n                { text: 'Destructive', onPress: () => this._setLastOption('Destructive'), style: 'destructive' },\n                { text: 'Cancel', onPress: () => this._setLastOption('Cancel'), style: 'cancel' }\n            ],\n            {\n                preventDismissOnPress,\n                theme: custom ? theme : undefined\n            }\n        );\n    }\n\n    private _setLastOption(option: string) {\n        this.setState({ lastOption: option });\n    }\n}\n\nclass AlertTest implements Test {\n    getPath(): string {\n        return 'APIs/Alert';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <AlertView\n                ref={onMount}\n            />\n        );\n    }\n}\n\nexport default new AlertTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/AnimationTest.tsx",
    "content": "/*\n* Tests the animation functionality in an automated manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        justifyContent: 'space-between',\n        alignItems: 'center',\n        margin: 12\n    }),\n    button: RX.Styles.createButtonStyle({\n        marginLeft: 20,\n        paddingHorizontal: 8,\n        paddingVertical: 4,\n        backgroundColor: '#eee',\n        borderWidth: 1,\n        borderColor: '#999',\n        borderRadius: 8\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize\n    }),\n    explainText: RX.Styles.createTextStyle({\n        flex: -1,\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    animationCanvas: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        flexDirection: 'row',\n        height: 120,\n        margin: 12,\n        backgroundColor: '#eee',\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    animatedImage: RX.Styles.createImageStyle({\n        height: 100,\n        width: 100\n    }),\n    animatedViewTest2: RX.Styles.createViewStyle({\n        height: 40,\n        width: 40,\n        backgroundColor: 'red'\n    }),\n    animatedText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        fontStyle: 'italic',\n        color: 'blue'\n    }),\n    animatedViewTest4: RX.Styles.createViewStyle({\n        height: 40,\n        width: 40,\n        borderRadius: 20,\n        backgroundColor: 'green'\n    }),\n    limitBox: RX.Styles.createViewStyle({\n        width: 1,\n        height: 40,\n        backgroundColor: 'black'\n    })\n};\n\nconst _test1Radius = 40;\nconst _test2Duration = 500;\nconst _test4Duration = 1000;\n\ninterface AnimationViewState {\n    isAutoRunning?: boolean;\n    isRunningTest1?: boolean;\n    isRunningTest2?: boolean;\n    isRunningTest3?: boolean;\n    isRunningTest4?: boolean;\n}\n\nconst _testValue1 = 'A long test value for the text input box';\n\nclass AnimationView extends RX.Component<RX.CommonProps, AnimationViewState> {\n    private _isMounted = false;\n    private _testResult: TestResult | undefined;\n    private _testCompletion: ((result: TestResult) => void) | undefined;\n    private _nextTestStage = 0;\n\n    // Test 1 animation variables\n    private _test1Angle = 0;\n    private _test1OffsetH = new RX.Animated.Value(_test1Radius);\n    private _test1OffsetV = new RX.Animated.Value(0);\n    private _test1Animation = RX.Styles.createAnimatedImageStyle({\n        transform: [{\n            translateX: this._test1OffsetH\n        }, {\n            translateY: this._test1OffsetV\n        }]\n    });\n\n    // Test 2 animation variables\n    private _test2OffsetH = new RX.Animated.Value(-100);\n    private _test2Color = new RX.Animated.Value(0);\n    private _test2Animation = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            translateX: this._test2OffsetH\n        }],\n        backgroundColor: RX.Animated.interpolate(\n            this._test2Color, [0, 0.5, 1], ['red', 'blue', 'green'])\n    });\n\n    // Test 3 animation variables\n    private _test3Angle = new RX.Animated.Value(0);\n    private _test3Animation = RX.Styles.createAnimatedTextStyle({\n        transform: [{\n            rotate: RX.Animated.interpolate(this._test3Angle, [0, 1], ['0deg', '360deg'])\n        }, {\n            rotateZ: RX.Animated.interpolate(this._test3Angle, [0, 1], ['0deg', '90deg'])\n        }]\n    });\n\n    // Test 4 animation variables\n    private _test4OffsetH = new RX.Animated.Value(-100);\n    private _test4Animation = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            translateX: this._test4OffsetH\n        }]\n    });\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isAutoRunning: false,\n            isRunningTest1: false,\n            isRunningTest2: false,\n            isRunningTest3: false,\n            isRunningTest4: false\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'A simple animation driven by JavaScript code.' }\n                    </RX.Text>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._runTest1 }\n                        disabled={ this.state.isAutoRunning || this.state.isRunningTest1 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Animate' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={ _styles.animationCanvas }>\n                    <RX.Animated.Image\n                        source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                        resizeMode={ 'contain' }\n                        style={ [_styles.animatedImage, this._test1Animation] }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Animation of translation and color using parallel and serial animations.' }\n                    </RX.Text>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._runTest2 }\n                        disabled={ this.state.isAutoRunning || this.state.isRunningTest2 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Animate' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={ _styles.animationCanvas }>\n                    <RX.Animated.View style={ [_styles.animatedViewTest2, this._test2Animation] }/>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Rotation animation that uses 250ms delay and loop.' }\n                    </RX.Text>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._runTest3 }\n                        disabled={ this.state.isAutoRunning || this.state.isRunningTest3 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Animate' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={ _styles.animationCanvas }>\n                    <RX.Animated.Text\n                        style={ [_styles.animatedText, this._test3Animation] }\n                    >\n                        { 'Cool Rotation!' }\n                    </RX.Animated.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Animation that is interrupted. It should move halfway to the black line and back.' }\n                    </RX.Text>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._runTest4 }\n                        disabled={ this.state.isAutoRunning || this.state.isRunningTest4 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Animate' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={ _styles.animationCanvas }>\n                    <RX.Animated.View style={ [_styles.animatedViewTest4, this._test4Animation] }/>\n                    <RX.View style={ _styles.limitBox }/>\n                </RX.View>\n\n            </RX.View>\n        );\n    }\n\n    private _executeNextStage() {\n        // If we're not running in \"auto\" mode, don't run the next stage.\n        if (!this.state.isAutoRunning) {\n            return;\n        }\n\n        const testStages: (() => void)[] = [() => {\n            this._runTest1();\n        }, () => {\n            this._runTest2();\n        }, () => {\n            this._runTest3();\n        }, () => {\n            this._runTest4();\n        }];\n\n        // Are we done?\n        if (this._nextTestStage! >= testStages.length) {\n            this._testCompletion!(this._testResult!);\n            this._testCompletion = undefined;\n            this._testResult = undefined;\n\n            if (this._isMounted) {\n                this.setState({ isAutoRunning: false });\n            }\n        } else {\n            // Run the next stage after a brief delay.\n            _.delay(() => {\n                testStages[this._nextTestStage]();\n                this._nextTestStage++;\n            }, 200);\n        }\n    }\n\n    private _runTest1 = () => {\n        this._test1Angle = 0;\n        this.setState({ isRunningTest1: true });\n\n        let setNextValues = () => {\n            // Are we done?\n            if (this._test1Angle >= 2 * Math.PI) {\n                if (this._isMounted) {\n                    this.setState({ isRunningTest1: false });\n                }\n                this._executeNextStage();\n                return;\n            }\n\n            // Update the values.\n            this._test1OffsetH.setValue(_test1Radius * Math.cos(this._test1Angle));\n            this._test1OffsetV.setValue(_test1Radius * Math.sin(this._test1Angle));\n            this._test1Angle += 2 * Math.PI / 36;\n\n            _.delay(() => {\n                setNextValues();\n            }, 1000 / 60);\n        };\n        setNextValues();\n    }\n\n    private _runTest2 = () => {\n        this.setState({ isRunningTest2: true });\n\n        let animation = RX.Animated.sequence([\n            RX.Animated.parallel([\n                RX.Animated.timing(this._test2Color, {\n                    toValue: 1,\n                    duration: _test2Duration,\n                    easing: RX.Animated.Easing.InOut()\n                }),\n                RX.Animated.timing(this._test2OffsetH, {\n                    toValue: 100,\n                    duration: _test2Duration,\n                    easing: RX.Animated.Easing.Linear()\n                })\n            ]),\n            RX.Animated.parallel([\n                RX.Animated.timing(this._test2Color, {\n                    toValue: 0,\n                    duration: _test2Duration,\n                    easing: RX.Animated.Easing.InOut()\n                }),\n                RX.Animated.timing(this._test2OffsetH, {\n                    toValue: -100,\n                    duration: _test2Duration,\n                    easing: RX.Animated.Easing.Linear()\n                })\n            ])\n        ]);\n\n        animation.start(() => {\n            if (this._isMounted) {\n                this.setState({ isRunningTest2: false });\n            }\n            this._executeNextStage();\n        });\n    }\n\n    private _runTest3 = () => {\n        this.setState({ isRunningTest3: true });\n\n        let animation = RX.Animated.timing(this._test3Angle, {\n            toValue: 1,\n            duration: 250,\n            easing: RX.Animated.Easing.Linear(),\n            delay: 250,\n            loop: {\n                restartFrom: 0\n            }\n        });\n\n        animation.start();\n\n        // Allow it to run for a while.\n        _.delay(() => {\n            animation.stop();\n            this._test3Angle.setValue(0);\n            if (this._isMounted) {\n                this.setState({ isRunningTest3: false });\n            }\n            this._executeNextStage();\n        }, 2000);\n    }\n\n    private _runTest4 = () => {\n        this.setState({ isRunningTest4: true });\n\n        let animation = RX.Animated.timing(this._test4OffsetH, {\n            toValue: 0,\n            duration: _test4Duration,\n            easing: RX.Animated.Easing.Linear()\n        });\n\n        let isFinished: boolean|undefined;\n        let wasCompletionCalled = false;\n        animation.start(completeInfo => {\n            if (isFinished !== undefined) {\n                this._testResult!.errors.push('Completion callback \"finished\" called multiple times');\n            }\n            isFinished = completeInfo.finished;\n            wasCompletionCalled = true;\n        });\n\n        // Set a timer for half-way through the animation. This will\n        // stop the animation and start it again in the opposite direction.\n        _.delay(() => {\n            if (this._isMounted) {\n                animation.stop();\n\n                // Make sure the completion was executed and the \"finished\" parameter was false.\n                if (!wasCompletionCalled) {\n                    this._testResult!.errors.push('Completion callback was not called when animation was stopped');\n                } else if (isFinished === undefined || isFinished !== false) {\n                    this._testResult!.errors.push('Completion callback \"finished\" parameter was not false as expected');\n                }\n\n                RX.Animated.timing(this._test4OffsetH, {\n                    toValue: -100,\n                    duration: _test4Duration / 2,\n                    easing: RX.Animated.Easing.Linear()\n                }).start(completeInfo => {\n                    if (!completeInfo.finished) {\n                        this._testResult!.errors.push('Completion callback \"finished\" parameter was not true as expected');\n                    }\n\n                    if (this._isMounted) {\n                        this.setState({ isRunningTest4: false });\n                    }\n                    this._executeNextStage();\n                });\n            }\n        }, _test4Duration / 2);\n    }\n\n    execute(complete: (result: TestResult) => void): void {\n        this._nextTestStage = 0;\n        this._testResult = new TestResult();\n        this._testCompletion = complete;\n\n        this.setState({ isAutoRunning: true });\n\n        // Kick off the first stage. Defer to make sure\n        // setState above has taken effect.\n        _.defer(() => {\n            this._executeNextStage();\n        });\n    }\n}\n\nclass AnimationTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/Animation';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <AnimationView ref={ onMount }/>\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let animationView = component as AnimationView;\n\n        animationView.execute(complete);\n    }\n}\n\nexport default new AnimationTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/AppTest.tsx",
    "content": "/*\n* Tests the RX.App APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    historyText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface AppState {\n    activationState: RX.Types.AppActivationState;\n    activationHistory: string;\n\n    memoryWarningCount: number;\n}\n\nclass AppView extends RX.Component<RX.CommonProps, AppState> {\n    private _appActivationEvent: RX.Types.SubscriptionToken | undefined;\n    private _memoryWarningEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        let curState = RX.App.getActivationState();\n\n        this.state = {\n            activationState: curState,\n            activationHistory: this._activationStateToString(curState),\n            memoryWarningCount: 0\n        };\n    }\n\n    componentDidMount() {\n        this._appActivationEvent = RX.App.activationStateChangedEvent.subscribe(state => {\n            this.setState({\n                activationState: state,\n                activationHistory: this.state.activationHistory + '\\n' + this._activationStateToString(state)\n            });\n        });\n\n        this._memoryWarningEvent = RX.App.memoryWarningEvent.subscribe(() => {\n            this.setState({ memoryWarningCount: this.state.memoryWarningCount + 1 });\n        });\n    }\n\n    componentWillUnmount() {\n        if (this._appActivationEvent) {\n            this._appActivationEvent.unsubscribe();\n        }\n\n        if (this._memoryWarningEvent) {\n            this._memoryWarningEvent.unsubscribe();\n        }\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Current app activation state:' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this._activationStateToString(this.state.activationState) }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Move app into background and foreground to change the state. The history is recorded here.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.historyText }>\n                        { this.state.activationHistory }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Launch other apps to create memory pressure.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.historyText }>\n                        { 'Memory warning events received: ' + this.state.memoryWarningCount }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _activationStateToString(state: RX.Types.AppActivationState): string {\n        switch (state) {\n            case RX.Types.AppActivationState.Active:\n                return 'Active';\n\n            case RX.Types.AppActivationState.Background:\n                return 'Background';\n\n            case RX.Types.AppActivationState.Inactive:\n                return 'Inactive';\n\n            case RX.Types.AppActivationState.Extension:\n                return 'Extension';\n\n            default:\n                return 'Unknown';\n        }\n    }\n}\n\nclass AppTest implements Test {\n    getPath(): string {\n        return 'APIs/App';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <AppView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new AppTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ButtonTest.tsx",
    "content": "/*\n* Tests the functionality of a Button component rendering\n* that requires user interaction.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    button1: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 20,\n        padding: 12,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    button1Hover: RX.Styles.createButtonStyle({\n        backgroundColor: '#666'\n    }),\n    button1Text: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    button1TextHover: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'white'\n    }),\n    button2: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 20,\n        padding: 12,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonCursor: RX.Styles.createButtonStyle({\n        cursor: 'default'\n    }),\n    button2Text: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    buttonWithLabelContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row'\n    }),\n    buttonLabelContainer: RX.Styles.createViewStyle({\n        flexDirection: 'column',\n        margin: 20\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    dropView: RX.Styles.createTextStyle({\n        flexDirection: 'row',\n        margin: 20,\n        backgroundColor: '#4575',\n        borderWidth: 1,\n        borderColor: '#457'\n    }),\n    wait: RX.Styles.createViewStyle({\n        backgroundColor: 'orange',\n    }),\n    ready: RX.Styles.createViewStyle({\n        backgroundColor: 'green',\n    })\n};\n\ninterface ButtonViewState {\n    button1Hover: boolean;\n\n    button4PressInCount: number;\n    button4PressOutCount: number;\n    button4PressCount: number;\n\n    button5PressCount: number;\n    button5LongPressCount: number;\n\n    longPressed: boolean;\n    onResponderReleaseReceived: boolean;\n    onPressReceived: boolean;\n}\n\nclass ButtonView extends RX.Component<RX.CommonProps, ButtonViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            button1Hover: false,\n            button4PressInCount: 0,\n            button4PressOutCount: 0,\n            button4PressCount: 0,\n            button5PressCount: 0,\n            button5LongPressCount: 0,\n            longPressed: false,\n            onResponderReleaseReceived: false,\n            onPressReceived: false\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should change in appearance when the mouse pointer is above ' +\n                          'it (valid only on mouse-based platforms).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ [_styles.button1, this.state.button1Hover ? _styles.button1Hover : undefined] }\n                    onHoverStart={ () => { this.setState({ button1Hover: true }); } }\n                    onHoverEnd={ () => { this.setState({ button1Hover: false }); } }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                    testId={ 'button1' }\n                >\n                    <RX.Text style={ [_styles.button1Text, this.state.button1Hover ? _styles.button1TextHover : undefined] }>\n                        { 'Button With Hover' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should be disabled and respond to no clicks, presses, or hovers. ' +\n                          'The mouse pointer should not turn into a pointer.' +\n                          'The opacity of the disabled button should be its default value of 0.5' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button2 }\n                    disabled={ true }\n                    onLongPress={() => alert('Long press')}\n                    onPress={() => alert('press')}\n                >\n                    <RX.Text style={ _styles.button2Text }>\n                        { 'Disabled Button' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should be disabled and respond to no clicks, presses, or hovers. ' +\n                          'The mouse pointer should not turn into a pointer.' +\n                          'The opacity of the disabled button should be 0.3' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button2 }\n                    disabled={ true }\n                    disabledOpacity={ 0.3 }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                >\n                    <RX.Text style={ _styles.button2Text }>\n                        { 'Disabled Button' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button have a tooltip when hovering over it (mouse-based platforms only).' +\n                        ' It should also display an arrow cursor rather than the default pointer cursor.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ [_styles.button2, _styles.buttonCursor] }\n                    title={ 'Do you see this tooltip?' }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                >\n                    <RX.Text style={ _styles.button2Text }>\n                        { 'Button with tooltip' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should receive pressIn, pressOut and press events when you click or tap on it.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonWithLabelContainer }>\n                    <RX.Button\n                        style={ _styles.button2 }\n                        onPressIn={ () => this.setState({ button4PressInCount: this.state.button4PressInCount + 1 }) }\n                        onPressOut={ () => this.setState({ button4PressOutCount: this.state.button4PressOutCount + 1 }) }\n                        onPress={ () => this.setState({ button4PressCount: this.state.button4PressCount + 1 }) }\n                    >\n                        <RX.Text style={ _styles.button2Text }>\n                            { 'Button with press' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.View style={ _styles.buttonLabelContainer }>\n                        <RX.Text style={ _styles.labelText } key={ 'pressIn' }>\n                            { 'PressIn count: ' + this.state.button4PressInCount }\n                        </RX.Text>\n                        <RX.Text style={ _styles.labelText } key={ 'pressOut' }>\n                            { 'PressOut count: ' + this.state.button4PressOutCount }\n                        </RX.Text>\n                        <RX.Text style={ _styles.labelText } key={ 'press' }>\n                            { 'Press count: ' + this.state.button4PressCount }\n                        </RX.Text>\n                    </RX.View>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation6' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should differentiate between press and long-press actions. ' +\n                          'Click or tap and hold for more than one second for a long press.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonWithLabelContainer }>\n                    <RX.Button\n                        style={ _styles.button2 }\n                        delayLongPress={ 1000 }\n                        onPress={ () => this.setState({ button5PressCount: this.state.button5PressCount + 1 }) }\n                        onLongPress={ () => this.setState({ button5LongPressCount: this.state.button5LongPressCount + 1 }) }\n                    >\n                        <RX.Text style={ _styles.button2Text }>\n                            { 'Button with long press' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.View style={ _styles.buttonLabelContainer }>\n                        <RX.Text style={ _styles.labelText } key={ 'press' }>\n                            { 'Press count: ' + this.state.button5PressCount }\n                        </RX.Text>\n                        <RX.Text style={ _styles.labelText } key={ 'longpress' }>\n                            { 'Long press count: ' + this.state.button5LongPressCount }\n                        </RX.Text>\n                    </RX.View>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation7' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should change opacity to 25% when pressing (touch-based platforms only). ' +\n                          'The underlay color should appear red.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button2 }\n                    activeOpacity={ 0.25 }\n                    underlayColor={ 'red' }\n                    disableTouchOpacityAnimation={ false }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                >\n                    <RX.Text style={ _styles.button2Text }>\n                        { 'Button with opacity' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation8' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This button should not exhibit any opacity animation when pressed (touch-based platforms only).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button2 }\n                    disableTouchOpacityAnimation={ true }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                >\n                    <RX.Text style={ _styles.button2Text }>\n                        { 'Button with no opacity' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation9' }>\n                    <RX.Text style={ _styles.explainText }>\n                        Long press the button and leave it to release the touch in the blue View.\n                        The View should turn green when receiving the onResponderRelease (touch) or onPress (mouse) event\n                        only when the long press has been triggered.\n                    </RX.Text>\n                </RX.View>\n                <RX.View>\n                    <RX.View \n                        style={ [\n                            _styles.dropView,\n                            this.state.onResponderReleaseReceived || this.state.onPressReceived ? _styles.ready : undefined\n                        ] }\n                        onPress={ () => {\n                            if (this.state.longPressed) {\n                                this.setState({ onPressReceived: true });\n                            }\n                        } }\n                        onResponderRelease={ () => {\n                            if (this.state.longPressed) {\n                                this.setState({ onResponderReleaseReceived: true });\n                            }\n                        } }\n                    >\n                        <RX.Button\n                            style={ [_styles.button2, this.state.longPressed ? _styles.ready : _styles.wait] }\n                            onPressIn={ () => this.setState({\n                                longPressed: false,\n                                onResponderReleaseReceived: false,\n                                onPressReceived: false\n                            }) }\n                            onLongPress={ () => this.setState({ longPressed: true }) }\n                        >\n                            <RX.Text style={ _styles.button2Text }>Long press here</RX.Text>\n                        </RX.Button>\n                        <RX.Text style={ _styles.button2Text }>Release here, on the parent View</RX.Text>\n                    </RX.View>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass ButtonTest implements Test {\n    getPath(): string {\n        return 'Components/Button';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ButtonView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new ButtonTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ClipboardTest.tsx",
    "content": "/*\n* Tests the RX.Clipboard APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface ClipboardViewState {\n    copyIteration: number;\n    pastedText: string;\n}\n\nconst _copyString = 'Text to copy\\n(including line breaks)\\n';\n\nclass ClipboardView extends RX.Component<RX.CommonProps, ClipboardViewState> {\n    private _presencesChangedEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            copyIteration: 1,\n            pastedText: ''\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press the button to copy the following text to the clipboard. Switch to another app and paste to verify.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { _copyString + this.state.copyIteration }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._doCopy() }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Copy to Clipboard' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press the button to paste the text contents of the clipboard.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._doPaste() }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Paste from Clipboard' }\n                    </RX.Text>\n                </RX.Button>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.pastedText }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _doCopy() {\n        RX.Clipboard.setText(_copyString + this.state.copyIteration);\n\n        this.setState({\n            copyIteration: this.state.copyIteration + 1\n        });\n    }\n\n    private _doPaste() {\n        RX.Clipboard.getText().then(text => {\n            this.setState({\n                pastedText: text\n            });\n        }).catch(err => {\n            this.setState({\n                pastedText: '(Received error when pasting: ' + err + ')'\n            });\n        });\n    }\n}\n\nclass ClipboardTest implements Test {\n    getPath(): string {\n        return 'APIs/Clipboard';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ClipboardView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new ClipboardTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/DragAndDropTest.tsx",
    "content": "/*\n* Tests the Drag and Drop in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'stretch'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        margin: 8,\n        borderColor: CommonStyles.buttonBorderColor,\n        borderStyle: 'solid',\n        borderWidth: 1,\n        height: 70,\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    labelContainerHover: RX.Styles.createViewStyle({\n        backgroundColor: CommonStyles.buttonBorderColor\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    dragAndDropContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        flex: 1,\n        height: 70\n    }),\n    dragAndDropView: RX.Styles.createViewStyle({\n        flex: 1,\n        borderColor: CommonStyles.buttonBorderColor,\n        borderStyle: 'solid',\n        borderWidth: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        padding: 5\n    }),\n    dragAndDropObject: RX.Styles.createViewStyle({\n        height: 40,\n        width: 40,\n        backgroundColor: CommonStyles.successTextColor,\n        marginTop: 5\n    })\n};\n\ninterface DragAndDropViewState {\n    isFileDragAndDropHover: boolean;\n    logViewDragAndDrop: string[];\n    filesDropped: FileInfo[];\n    isViewDragAndDropHover: boolean;\n    viewDragStartDateAndTime: string;\n}\n\ninterface FileInfo {\n    fileName: string;\n    fileSize: number;\n}\n\nclass DragAndDropView extends RX.Component<RX.CommonProps, DragAndDropViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isFileDragAndDropHover: false,\n            logViewDragAndDrop: [],\n            filesDropped: [],\n            isViewDragAndDropHover: false,\n            viewDragStartDateAndTime: ''\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Drag one or more files over to the container below' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View \n                    style={ [ _styles.labelContainer, this.state.isFileDragAndDropHover ? _styles.labelContainerHover : undefined ] }\n                    onDragEnter={ this._onDragEnterForFiles }\n                    onDragLeave={ this._onDragLeaveForFiles }\n                    onDragOver={ this._onDragOverForFiles }\n                    onDrop={ this._onDropForFiles }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Drop target' }\n                    </RX.Text>\n                </RX.View>\n\n                { this._renderDroppedFiles() }\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Drag the square from the left side to the right side' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ [ _styles.textContainer, _styles.dragAndDropContainer ] }>\n                    <RX.View style={ [ _styles.dragAndDropView, _styles.explainText ] }>\n                        <RX.View \n                            onDragStart={ this._onDragStartForViews }\n                            style={ _styles.dragAndDropObject }\n                            >\n                        </RX.View>\n                    </RX.View>\n                    <RX.View style={ _styles.dragAndDropView }>\n                        <RX.Text style={ _styles.explainText }>\n                            { 'Not allowed to drop here' }\n                        </RX.Text>\n                    </RX.View>\n                    <RX.View \n                        style={ [ _styles.dragAndDropView, this.state.isViewDragAndDropHover ? _styles.labelContainerHover : undefined ] }\n                        onDragEnter={ this._onDragEnterForViews }\n                        onDragLeave={ this._onDragLeaveForViews }\n                        onDragOver={ this._onDragOverForViews }\n                        onDrop={ this._onDropForViews }>\n                        <RX.Text style={ _styles.explainText }>\n                            { 'Drop target' }\n                        </RX.Text>\n                    </RX.View>\n                </RX.View>\n\n                { this._renderViewDragStart() }\n\n            </RX.View>\n        );\n    }\n\n    private _renderDroppedFiles(): JSX.Element | undefined {\n        if (this.state.filesDropped.length === 0) {\n            return undefined;\n        }\n\n        let filesInfo: JSX.Element[] = [];\n        _.each(this.state.filesDropped, fileInfo => {\n            filesInfo.push(this._formatFileInfo(fileInfo));\n        });\n\n        return (\n            <RX.View style={ _styles.textContainer } key={ ' droppedFiles ' }>\n                <RX.Text style={ _styles.explainText }>\n                    { 'You dropped' }\n                </RX.Text>\n                { filesInfo }\n            </RX.View>\n        );\n    }\n\n    private _formatFileInfo(file: FileInfo): JSX.Element {\n        return (\n            <RX.Text key={ file.fileName } style={ _styles.explainText }>\n                { file.fileName + ', size: ' + file.fileSize + 'kb' }\n            </RX.Text>\n        );\n    }\n\n    private _renderViewDragStart(): JSX.Element | undefined {\n        if (this.state.viewDragStartDateAndTime === '') {\n            return undefined;\n        }\n\n        return (\n            <RX.View style={ _styles.textContainer } key={ ' droppedView ' }>\n                <RX.Text style={ _styles.explainText } key={ 'drag' }>\n                    { 'You started dragging at ' + this.state.viewDragStartDateAndTime }\n                </RX.Text>\n                <RX.Text style={ _styles.explainText } key={ 'drop' }>\n                    { 'You dropped at ' + new Date().toLocaleTimeString() }\n                </RX.Text>\n            </RX.View>\n        );\n    }\n\n    private _onDragEnterForFiles = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isFileDragAndDropHover: true\n        });\n    }\n\n    private _onDragLeaveForFiles = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isFileDragAndDropHover: false\n        });\n    }\n\n    private _onDragOverForFiles = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isFileDragAndDropHover: true\n        });\n    }\n\n    private _onDropForFiles = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        let filesDropped: FileInfo[] = [];\n        _.each(e.dataTransfer.files, fileData => {\n            const fileInfo: FileInfo = {\n                fileName: fileData.name,\n                fileSize: Math.round(fileData.size / 1024)\n            };\n\n            filesDropped.push(fileInfo);\n        });\n\n        this.setState({\n            isFileDragAndDropHover: false,\n            filesDropped: filesDropped\n        });\n    }\n\n    private _onDragStartForViews = (e: RX.Types.DragEvent) => {\n        e.dataTransfer.dropEffect = 'move';\n        e.dataTransfer.setData('transferData', new Date().toLocaleTimeString());\n    }\n\n    private _onDragEnterForViews = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isViewDragAndDropHover: true\n        });\n    }\n\n    private _onDragLeaveForViews = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isViewDragAndDropHover: false\n        });\n    }\n\n    private _onDragOverForViews = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isViewDragAndDropHover: true\n        });\n    }\n\n    private _onDropForViews = (e: RX.Types.DragEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.setState({\n            isViewDragAndDropHover: false,\n            viewDragStartDateAndTime: e.dataTransfer.getData('transferData')\n        });\n    }\n}\n\nclass DragAndDropTest implements Test {\n    getPath(): string {\n        return 'APIs/DragAndDrop';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <DragAndDropView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new DragAndDropTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/GestureViewTest.tsx",
    "content": "/*\n* Tests the functionality of a GestureView component\n* through user interaction.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    gestureView: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        height: 150,\n        backgroundColor: '#eee',\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    smallBox: RX.Styles.createViewStyle({\n        height: 50,\n        width: 50,\n        backgroundColor: 'blue'\n    }),\n    button: RX.Styles.createButtonStyle({\n        borderColor: 'black',\n        borderWidth: 1,\n        borderRadius: 8,\n        paddingHorizontal: 8,\n        paddingVertical: 4\n    }),\n    modalDialog: RX.Styles.createTextStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        backgroundColor: 'rgba(0, 0, 0, 0.1)',\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    modalBox1: RX.Styles.createTextStyle({\n        padding: 20,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n        borderWidth: 1,\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    modalText: RX.Styles.createViewStyle({\n        margin: 8\n    })\n};\n\nconst _colors = ['red', 'green', 'blue'];\nconst _shades = ['#000', '#333', '#666', '#999', '#CCC', '#FFF'];\n\nconst modal1Id = 'modal1';\n\ninterface GestureViewState {\n    test1ColorIndex: number;\n    test2ColorIndex: number;\n    test3ColorIndex: number;\n    test4ColorIndex: number;\n}\n\nclass GestureViewView extends RX.Component<RX.CommonProps, GestureViewState> {\n    private _test1RotateValue = new RX.Animated.Value(0);\n    private _test1ScaleNumericValue = 1;\n    private _test1ScaleValue = new RX.Animated.Value(1);\n    private _test1AnimatedStyle = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            scale: this._test1ScaleValue\n        }, {\n            rotate: this._test1RotateValue.interpolate({\n                inputRange: [0, 360],\n                outputRange: ['0deg', '360deg']\n            }),\n        }]\n    });\n\n    private _test2HorizontalOffset = new RX.Animated.Value(0);\n    private _test2VerticalOffset = new RX.Animated.Value(0);\n    private _test2AnimatedStyle = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            translateX: this._test2HorizontalOffset\n        }, {\n            translateY: this._test2VerticalOffset\n        }]\n    });\n\n    private _test3HorizontalOffset = new RX.Animated.Value(0);\n    private _test3VerticalOffset = new RX.Animated.Value(0);\n    private _test3AnimatedStyle = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            translateX: this._test3HorizontalOffset\n        }, {\n            translateY: this._test3VerticalOffset\n        }]\n    });\n\n    private _test4HorizontalOffset = new RX.Animated.Value(0);\n    private _test4VerticalOffset = new RX.Animated.Value(0);\n    private _test4AnimatedStyle = RX.Styles.createAnimatedViewStyle({\n        transform: [{\n            translateX: this._test4HorizontalOffset\n        }, {\n            translateY: this._test4VerticalOffset\n        }]\n    });\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1ColorIndex: 0,\n            test2ColorIndex: 1,\n            test3ColorIndex: 2,\n            test4ColorIndex: 3\n        };\n    }\n\n    render() {\n        // Create dynamic styles.\n        let test1ColorStyle = RX.Styles.createViewStyle({\n            backgroundColor: _colors[this.state.test1ColorIndex]\n        }, false);\n\n        let test2ColorStyle = RX.Styles.createViewStyle({\n            backgroundColor: _colors[this.state.test2ColorIndex]\n        }, false);\n\n        let test3ColorStyle = RX.Styles.createViewStyle({\n            backgroundColor: _colors[this.state.test3ColorIndex]\n        }, false);\n\n        let test4ColorStyle = RX.Styles.createViewStyle({\n            backgroundColor: _shades[this.state.test4ColorIndex]\n        }, false);\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Pinch-and-zoom and rotate gestures will grow and rotate the square (touch only). ' +\n                            'Scroll wheel will grow the square (mouse). ' +\n                            'Double-tap/click will change the color.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.GestureView\n                    style={ _styles.gestureView }\n                    onPinchZoom={ state => this._onPinchZoomTest1(state) }\n                    onRotate={ state => this._onRotateTest1(state) }\n                    onDoubleTap={ state => this._onDoubleTapTest1(state) }\n                    mouseOverCursor={ RX.Types.GestureMouseCursor.Pointer }\n                    onScrollWheel={ state => this._onScrollWheelTest1(state) }\n                    testId={ 'gestureView1' }\n                >\n                    <RX.Animated.View\n                        style={ [_styles.smallBox, test1ColorStyle, this._test1AnimatedStyle] }\n                    />\n                </RX.GestureView>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Horizontal and vertical panning (or dragging) will move the square. ' +\n                          'Single tap/click will change the color.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.GestureView\n                    style={ _styles.gestureView }\n                    onTap={ state => this._onTapTest2(state) }\n                    onPanHorizontal={ state => this._onPanHorizontalTest2(state) }\n                    onPanVertical={ state => this._onPanVerticalTest2(state) }\n                    preferredPan={ RX.Types.PreferredPanGesture.Vertical }\n                    mouseOverCursor={ RX.Types.GestureMouseCursor.Grab }\n                >\n                    <RX.Animated.View\n                        style={ [_styles.smallBox, test2ColorStyle, this._test2AnimatedStyle] }\n                    />\n                </RX.GestureView>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Panning and dragging will move the square (20-pixel threshold). ' +\n                          'Long-pressing will change the color.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.GestureView\n                    style={ _styles.gestureView }\n                    onPan={ state => this._onPanTest3(state) }\n                    onLongPress={ this._onLongPressTest3 }\n                    panPixelThreshold={ 20 }\n                    mouseOverCursor={ RX.Types.GestureMouseCursor.Grab }\n                >\n                    <RX.Animated.View\n                        style={ [_styles.smallBox, test3ColorStyle, this._test3AnimatedStyle] }\n                    />\n                </RX.GestureView>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Desktop platforms: Left click will make the box lighter. ' +\n                          'Right click (context menu) will make the box darker.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.GestureView\n                    style={ _styles.gestureView }\n                    onTap={ state => this._onTapTest4(state) }\n                    onContextMenu={ e => this._onContextMenu4(e) }\n                    mouseOverCursor={ RX.Types.GestureMouseCursor.Pointer }\n                >\n                    <RX.Animated.View\n                        style={ [_styles.smallBox, test4ColorStyle, this._test4AnimatedStyle] }\n                    />\n                </RX.GestureView>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation5' }>\n                    <RX.Button style={ _styles.button } onPress={ this._onShowModal }>\n                        <RX.Text style={ _styles.explainText }>\n                            { 'Show Modal Dialog' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onShowModal = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n        RX.Modal.show((\n            <RX.View style={ _styles.modalDialog }>\n                <RX.View style={ _styles.modalBox1 } onPress={ this._onDismissDialog }>\n                <RX.Text style={ _styles.modalText }>\n                        { 'Gesture targets should be disabled' }\n                    </RX.Text>\n                    <RX.Text style={ _styles.modalText }>\n                        { 'Click here to dismiss dialog' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        ),\n        modal1Id);\n    }\n\n    private _onDismissDialog = (e: RX.Types.SyntheticEvent) => {\n        RX.Modal.dismiss(modal1Id);\n    }\n\n    private _onPinchZoomTest1(state: RX.Types.MultiTouchGestureState) {\n        // Determine ratio of distance to initial distance.\n        let zoomRatio = state.distance / state.initialDistance;\n\n        // Clamp to range [0.25, 2].\n        zoomRatio = Math.max(Math.min(zoomRatio, 2), 0.25);\n        this._test1ScaleNumericValue = zoomRatio;\n        this._test1ScaleValue.setValue(zoomRatio);\n    }\n\n    private _onRotateTest1(state: RX.Types.MultiTouchGestureState) {\n        let relativeAngle = state.angle - state.initialAngle;\n\n        this._test1RotateValue.setValue(relativeAngle);\n    }\n\n    private _onDoubleTapTest1(state: RX.Types.TapGestureState) {\n        // Change the color.\n        this.setState({\n            test1ColorIndex: (this.state.test1ColorIndex + 1) % _colors.length\n        });\n    }\n\n    private _onScrollWheelTest1(state: RX.Types.ScrollWheelGestureState) {\n        let zoomRatio = this._test1ScaleNumericValue;\n        zoomRatio *= Math.pow(1.01, state.scrollAmount);\n\n        zoomRatio = Math.max(Math.min(zoomRatio, 2), 0.25);\n        this._test1ScaleNumericValue = zoomRatio;\n        this._test1ScaleValue.setValue(zoomRatio);\n    }\n\n    private _onTapTest2(gestureState: RX.Types.TapGestureState) {\n        // Change the color.\n        this.setState({\n            test2ColorIndex: (this.state.test2ColorIndex + 1) % _colors.length\n        });\n    }\n\n    private _onPanHorizontalTest2(state: RX.Types.PanGestureState) {\n        if (state.isComplete) {\n            this._test2HorizontalOffset.setValue(0);\n        } else {\n            this._test2HorizontalOffset.setValue(state.pageX - state.initialPageX);\n        }\n    }\n\n    private _onPanVerticalTest2(state: RX.Types.PanGestureState) {\n        if (state.isComplete) {\n            this._test2VerticalOffset.setValue(0);\n        } else {\n            this._test2VerticalOffset.setValue(state.pageY - state.initialPageY);\n        }\n    }\n\n    private _onPanTest3(state: RX.Types.PanGestureState) {\n        if (state.isComplete) {\n            this._test3HorizontalOffset.setValue(0);\n            this._test3VerticalOffset.setValue(0);\n        } else {\n            this._test3HorizontalOffset.setValue(state.pageX - state.initialPageX);\n            this._test3VerticalOffset.setValue(state.pageY - state.initialPageY);\n        }\n    }\n\n    private _onLongPressTest3 = (state: RX.Types.TapGestureState) => {\n        // Change the color.\n        this.setState({\n            test3ColorIndex: (this.state.test3ColorIndex + 1) % _colors.length\n        });\n    }\n\n    private _onTapTest4(gestureState: RX.Types.TapGestureState) {\n        // Change the color.\n        this.setState({\n            test4ColorIndex: Math.min(this.state.test4ColorIndex + 1, _shades.length - 1)\n        });\n    }\n\n    private _onContextMenu4(gestureState: RX.Types.TapGestureState) {\n        this.setState({\n            test4ColorIndex: Math.max(this.state.test4ColorIndex - 1, 0)\n        });\n    }\n}\n\nclass GestureViewTest implements Test {\n    useFullScreenContainer = true;\n\n    getPath(): string {\n        return 'Components/GestureView';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <GestureViewView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new GestureViewTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ImageApiTest.tsx",
    "content": "/*\n* Tests the functionality of a Image component that can be\n* auto-validated.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\nimport { approxEquals } from '../Utilities';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    image: RX.Styles.createImageStyle({\n        height: 100,\n        width: 100\n    })\n};\n\nconst image1ExpectedWidth = 118;\nconst image1ExpectedHeight = 200;\n\ninterface ImageViewState {\n    isTestRunning?: boolean;\n}\n\nclass ImageView extends RX.Component<RX.CommonProps, ImageViewState> {\n    private _isMounted = false;\n    private _image1Ref: RX.Image | undefined;\n    private _textRef: RX.Text | undefined;\n    private _test1Complete = false;\n    private _test2Complete = false;\n    private _test3Complete = false;\n    private _test4Complete = false;\n    private _test5Complete = false;\n    private _testResult: TestResult | undefined;\n    private _testCompletion: ((result: TestResult) => void) | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isTestRunning: false\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        let optionalImages: JSX.Element | undefined;\n        if (this.state.isTestRunning) {\n            optionalImages = (\n                <RX.View>\n                    <RX.Image\n                        style={ _styles.image }\n                        source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                        onLoad={ this._onLoadTest1 }\n                        onError={ this._onErrorTest1 }\n                        ref={ (comp: any) => { this._image1Ref = comp; } }\n                        testId={ 'image1' }\n                    />\n                    <RX.Image\n                        style={ _styles.image }\n                        source={ 'https://microsoft.github.io/reactxp/img/tests/bogus.jpg' }\n                        onLoad={ this._onLoadTest2 }\n                        onError={ this._onErrorTest2 }\n                    />\n\n                    <RX.Image\n                        style={ _styles.image }\n                        source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                        ref={ this._onMountImageChildTest }\n                    >\n                        <RX.Text ref={(comp: any) => { this._textRef = comp; }}>Child Text</RX.Text>\n                    </RX.Image>\n                </RX.View>\n            );\n\n            // Kicking-off Image API calls\n            RX.Image.prefetch('https://microsoft.github.io/reactxp/img/tests/bogus.jpg')\n                .then(this._prefetchedTest3)\n                .catch(this._prefetchedFailedTest3);\n\n            RX.Image.getMetadata('https://microsoft.github.io/reactxp/img/tests/bulb.jpg')\n                .then(this._getMetadataTest4)\n                .catch(this._getMetadataFailedTest4);\n        }\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Tests various aspects of the Image component that can be automatically validated.' }\n                    </RX.Text>\n                </RX.View>\n\n                { optionalImages }\n\n            </RX.View>\n        );\n    }\n\n    private _onLoadTest1 = (dimensions: RX.Types.Dimensions) => {\n        this._test1Complete = true;\n\n        if (this._testResult) {\n            const pixelRatio = RX.UserInterface.getPixelRatio();\n\n            if (!dimensions) {\n                this._testResult.errors.push('Received undefined dimensions from onLoad');\n            } else if (!approxEquals(dimensions.width, image1ExpectedWidth / pixelRatio) ||\n                    !approxEquals(dimensions.height, image1ExpectedHeight / pixelRatio)) {\n                this._testResult.errors.push(`Expected dimensions from onLoad to be ${image1ExpectedWidth}x${image1ExpectedHeight}. ` +\n                    `Got ${dimensions.width}x${dimensions.height}`);\n            }\n\n            // Now call the component back to see if we get the same dimensions.\n            const width = this._image1Ref!.getNativeWidth();\n            const height = this._image1Ref!.getNativeHeight();\n            if (width == null || !approxEquals(width, image1ExpectedWidth / pixelRatio)) {\n                this._testResult.errors.push(`Expected width from getNativeWidth to be ${image1ExpectedWidth}. Got ${width}`);\n            }\n            if (height == null || !approxEquals(height, image1ExpectedHeight / pixelRatio)) {\n                this._testResult.errors.push(`Expected height from getNativeHeight to be ${image1ExpectedHeight}. Got ${height}`);\n            }\n        }\n\n        this._checkAllTestsComplete();\n    }\n\n    private _onErrorTest1 = () => {\n        this._test1Complete = true;\n        if (this._testResult) {\n            this._testResult.errors.push('Could not load test image');\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _onLoadTest2 = (dimensions: RX.Types.Dimensions) => {\n        this._test2Complete = true;\n        if (this._testResult) {\n            this._testResult.errors.push('Was unexpected able to load bogus test image');\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _onErrorTest2 = () => {\n        this._test2Complete = true;\n        this._checkAllTestsComplete();\n    }\n\n    private _prefetchedTest3 = (success: boolean) => {\n        this._test3Complete = true;\n        if (success && this._testResult) {\n            this._testResult.errors.push('Was unexpected able to prefetch bogus test image');\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _prefetchedFailedTest3 = (error: any) => {\n        this._test3Complete = true;\n        if (this._testResult && !error) {\n            this._testResult.errors.push('Prefetching bogus test image failed but error is empty.');\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _getMetadataTest4 = (metaData: RX.Types.ImageMetadata) => {\n        this._test4Complete = true;\n        if (this._testResult) {\n            if (!metaData) {\n                this._testResult.errors.push('Received undefined image data from getMetadata');\n            }\n\n            if (metaData.height !== image1ExpectedHeight) {\n                this._testResult.errors.push('Received unexpected height from getMetadata');\n            }\n\n            if (metaData.width !== image1ExpectedWidth) {\n                this._testResult.errors.push('Received unexpected width from getMetadata');\n            }\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _getMetadataFailedTest4 = (error: any) => {\n        this._test4Complete = true;\n        if (this._testResult) {\n            this._testResult.errors.push('getMetadata for bulb test image failed with error: ', error);\n        }\n        this._checkAllTestsComplete();\n    }\n\n    private _checkAllTestsComplete() {\n        // If all of the tests are complete, report the result.\n        if (this._test1Complete && this._test2Complete && this._test3Complete && this._test4Complete) {\n\n            // Make sure we report the result only once.\n            if (this._testResult) {\n                this._testCompletion!(this._testResult);\n                this._testResult = undefined;\n            }\n\n            if (this._isMounted) {\n                this.setState({ isTestRunning: false });\n            }\n        }\n    }\n\n    private _onMountImageChildTest = (image: any) => {\n        this._test5Complete = true;\n\n        if (this._isMounted && image && !this._textRef) {\n            if (this._testResult) {\n                this._testResult.errors.push('\"children\" elements were not rendered');\n            }\n        }\n\n        this._checkAllTestsComplete();\n    }\n\n    execute(complete: (result: TestResult) => void): void {\n        this._test1Complete = false;\n        this._test2Complete = false;\n        this._test3Complete = false;\n        this._test4Complete = false;\n        this._test5Complete = false;\n        this._testResult = new TestResult();\n        this._testCompletion = complete;\n\n        // Re-render to kick off the test.\n        this.setState({ isTestRunning: true });\n    }\n}\n\nclass ImageApiTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'Components/Image/APIs';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ImageView ref={ onMount }/>\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let imageView = component as ImageView;\n\n        imageView.execute(complete);\n    }\n}\n\nexport default new ImageApiTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ImageInteractiveTest.tsx",
    "content": "/*\n* Tests the functionality of the Image component\n* that requires manual user validation.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    image: RX.Styles.createImageStyle({\n        height: 100,\n        width: 250,\n        marginHorizontal: 32,\n        borderWidth: 1,\n        borderColor: '#ccc'\n    })\n};\n\nclass ImageView extends RX.Component<RX.CommonProps, RX.Stateless> {\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'JPEG image using \"stretch\" resize option. Hovering should display a tooltip.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Image\n                    style={ _styles.image }\n                    source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                    resizeMode={ 'stretch' }\n                    title={ 'This is a tooltip' }\n                />\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'PNG image using \"contain\" resize option. Uses rasterize option on iOS.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Image\n                    style={ _styles.image }\n                    source={ 'https://microsoft.github.io/reactxp/img/tests/globe.png' }\n                    resizeMode={ 'contain' }\n                />\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Animated GIF image using \"cover\" resize option.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Image\n                    style={ _styles.image }\n                    source={ 'https://microsoft.github.io/reactxp/img/tests/heart.gif' }\n                    resizeMode={ 'cover' }\n                />\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'JPEG image using \"repeat\" resize option.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Image\n                    style={ _styles.image }\n                    source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                    resizeMode={ 'repeat' }\n                />\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'JPEG image using \"auto\" resize option.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Image\n                    style={ _styles.image }\n                    source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                    resizeMode={ 'auto' }\n                />\n\n            </RX.View>\n        );\n    }\n}\n\nclass ImageInteractiveTest implements Test {\n    getPath(): string {\n        return 'Components/Image/Interactive';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ImageView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new ImageInteractiveTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/InputTest.tsx",
    "content": "/*\n* Tests the RX.Input APIs.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface InputState {\n    backButtonCount?: number;\n\n    keyDownCount?: number;\n    lastKeyDownKey?: string;\n    lastKeyDownModifiers?: string;\n\n    keyUpCount?: number;\n    lastKeyUpKey?: string;\n    lastKeyUpModifiers?: string;\n}\n\nclass InputView extends RX.Component<RX.CommonProps, InputState> {\n    private _backButtonEvent: RX.Types.SubscriptionToken | undefined;\n    private _keyDownEvent: RX.Types.SubscriptionToken | undefined;\n    private _keyUpEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            backButtonCount: 0,\n            keyDownCount: 0,\n            lastKeyDownKey: '',\n            lastKeyDownModifiers: '',\n            keyUpCount: 0,\n            lastKeyUpKey: '',\n            lastKeyUpModifiers: ''\n        };\n    }\n\n    componentDidMount() {\n        this._backButtonEvent = RX.Input.backButtonEvent.subscribe(() => {\n            this.setState({\n                backButtonCount: this.state.backButtonCount! + 1\n            });\n            return true;\n        });\n\n        this._keyDownEvent = RX.Input.keyDownEvent.subscribe(e => {\n            this.setState({\n                keyDownCount: this.state.keyDownCount! + 1,\n                lastKeyDownKey: 'Key = \"' + e.key + '\", Code = ' + e.keyCode,\n                lastKeyDownModifiers: 'Ctrl = ' + e.ctrlKey + ', Alt = ' + e.altKey +\n                    ', Shift = ' + e.shiftKey\n\n            });\n            return true;\n        });\n\n        this._keyUpEvent = RX.Input.keyUpEvent.subscribe(e => {\n            this.setState({\n                keyUpCount: this.state.keyUpCount! + 1,\n                lastKeyUpKey: 'Key = \"' + e.key + '\", Code = ' + e.keyCode,\n                lastKeyUpModifiers: 'Ctrl = ' + e.ctrlKey + ', Alt = ' + e.altKey +\n                    ', Shift = ' + e.shiftKey\n\n            });\n            return true;\n        });\n\n    }\n\n    componentWillUnmount() {\n        if (this._backButtonEvent) {\n            this._backButtonEvent.unsubscribe();\n        }\n\n        if (this._keyDownEvent) {\n            this._keyDownEvent.unsubscribe();\n        }\n\n        if (this._keyUpEvent) {\n            this._keyUpEvent.unsubscribe();\n        }\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Pressing the back button (Android only) should increment the count below.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.textContainer } key={ 'back' }>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Back button events: ' + this.state.backButtonCount }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Pressing a keyboard button (keyboard-based platforms only) should increment the counts below.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.textContainer } key={ 'keyDown' }>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Key down events: ' + this.state.keyDownCount }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Last key: ' + this.state.lastKeyDownKey }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Last modifiers: ' + this.state.lastKeyDownModifiers }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.textContainer } key={ 'keyUp' }>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Key up events: ' + this.state.keyUpCount }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Last key: ' + this.state.lastKeyUpKey }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Last modifiers: ' + this.state.lastKeyUpModifiers }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass InputTest implements Test {\n    getPath(): string {\n        return 'APIs/Input';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <InputView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new InputTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/InternationalTest.tsx",
    "content": "/*\n* Tests the RX.International APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface InternationalState {\n    isRtlAllowed?: boolean;\n    isRtlForced?: boolean;\n}\n\nclass InternationalView extends RX.Component<RX.CommonProps, InternationalState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isRtlAllowed: true,\n            isRtlForced: false\n        };\n    }\n\n    componentWillUnmount() {\n        // Restore default values.\n        if (!this.state.isRtlAllowed) {\n            RX.International.allowRTL(true);\n        }\n\n        if (this.state.isRtlForced) {\n            RX.International.forceRTL(false);\n        }\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is the app currently running in left-to-right (LTR) or right-to-left (RTL) mode?' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { RX.International.isRTL() ? 'RTL' : 'LTR' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is RTL allowed? This change won\\'t be visible because it must be set at app start time.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ this._toggleAllowRtl }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { this.state.isRtlAllowed ? 'Prevent RTL' : 'Allow RTL' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Force the use of RTL? This change won\\'t be visible because it must be set at app start time.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ this._toggleForceRtl }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { this.state.isRtlForced ? 'Don\\'t Force RTL' : 'Force RTL' }\n                    </RX.Text>\n                </RX.Button>\n            </RX.View>\n        );\n    }\n\n    private _toggleAllowRtl = () => {\n        RX.International.allowRTL(!this.state.isRtlAllowed);\n        this.setState({ isRtlAllowed: !this.state.isRtlAllowed });\n    }\n\n    private _toggleForceRtl = () => {\n        RX.International.forceRTL(!this.state.isRtlForced);\n        this.setState({ isRtlForced: !this.state.isRtlForced });\n    }\n}\n\nclass InternationalTest implements Test {\n    getPath(): string {\n        return 'APIs/International';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <InternationalView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new InternationalTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/LinkTest.tsx",
    "content": "/*\n* Tests the functionality of the Link component\n* with manual user validation.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    resultText: RX.Styles.createTextStyle({\n        marginLeft: 20,\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    linkContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        marginHorizontal: 24,\n        marginBottom: 12\n    }),\n    constrainedLinkContainer: RX.Styles.createViewStyle({\n        maxWidth: 150,\n        marginHorizontal: 24,\n        marginBottom: 12\n    }),\n    link: RX.Styles.createLinkStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: '#00f',\n        textDecorationLine: 'underline',\n        textDecorationColor: '#00f'\n    }),\n    linkHover: RX.Styles.createLinkStyle({\n        color: '#88f',\n        textDecorationColor: '#88f'\n    })\n};\n\ninterface LinkViewState {\n    test1Hovering?: boolean;\n    test1Result?: string;\n}\n\nclass LinkView extends RX.Component<RX.CommonProps, LinkViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1Hovering: false,\n            test1Result: ''\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press on this link to test press callback. Hold to test long presses. ' +\n                          'Right click to test context menu callback. ' +\n                          ' Move mouse pointer to test hovering.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.linkContainer }>\n                    <RX.Link\n                        style={ [_styles.link, this.state.test1Hovering ? _styles.linkHover : undefined] }\n                        url={ '' }\n                        onPress={ () => { this.setState({ test1Result: 'Press detected' }); } }\n                        onLongPress={ () => { this.setState({ test1Result: 'Long press detected' }); } }\n                        onHoverStart={ () => { this.setState({ test1Hovering: true }); } }\n                        onHoverEnd={ () => { this.setState({ test1Hovering: false }); } }\n                        onContextMenu={ () => { this.setState({ test1Result: 'Context menu detected' }); } }\n                        allowFontScaling={ false }\n                        testId={ 'link1' }\n                    >\n                        { 'Press or hold' }\n                    </RX.Link>\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.test1Result }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This link is artificially constrained to one line and should appear ' +\n                          'truncated. Press to open a browser target. Hover to display tooltip.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.constrainedLinkContainer }>\n                    <RX.Link\n                        style={ _styles.link }\n                        url={ 'https://microsoft.github.io/reactxp/docs/components/link.html' }\n                        title={ 'Open RX.Link documentation in browser' }\n                        numberOfLines={ 1 }\n                    >\n                        { 'Documentation for RX.Link' }\n                    </RX.Link>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        <RX.Text selectable={ true }>\n                            { 'Links can also be used with other ' }\n                        </RX.Text>\n                        <RX.Link\n                            style={ _styles.link }\n                            title={ 'Open RX.Text documentation in browser' }\n                            url={ 'https://microsoft.github.io/reactxp/docs/components/text.html' }\n                            selectable={ true }\n                        >\n                            { 'RX.Text' }\n                        </RX.Link>\n                        <RX.Text selectable={ true }>\n                            { ' components. The link and text should be selectable. '}\n                        </RX.Text>\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass LinkTest implements Test {\n    getPath(): string {\n        return 'Components/Link';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <LinkView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new LinkTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/LinkingTest.tsx",
    "content": "/*\n* Tests the RX.Linking APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    resultText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    buttonContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        alignItems: 'center'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface LinkingState {\n    initialUrl?: string;\n    openValidUrlResult?: string;\n    openInvalidUrlResult?: string;\n    openSmsResult?: string;\n    openEmailResult?: string;\n}\n\nclass LinkingView extends RX.Component<RX.CommonProps, LinkingState> {\n    private _isMounted = false;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            initialUrl: undefined,\n            openValidUrlResult: '',\n            openInvalidUrlResult: '',\n            openSmsResult: '',\n            openEmailResult: ''\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        RX.Linking.getInitialUrl().then(url => {\n            if (this._isMounted) {\n                if (!url) {\n                    this.setState({ initialUrl: '(blank URL)' });\n                } else {\n                    this.setState({ initialUrl: url });\n                }\n            }\n        }).catch(err => {\n            if (this._isMounted) {\n                this.setState({ initialUrl: '(Received error: ' + err + ')' });\n            }\n        });\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Initial URL used to launch the app:' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.initialUrl }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Open \"https://microsoft.github.io/reactxp/\" into the default browser' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonContainer }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._openValidUrl }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Open valid URL' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.openValidUrlResult }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Open \"foo://reactxp\" into the default browser' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonContainer }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._openInvalidUrl }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Open invalid URL' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.openInvalidUrlResult }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Open in default SMS app' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonContainer }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._openSms }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Launch SMS' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.openSmsResult }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Open in default email app' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonContainer }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._openEmail }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Launch Email' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.openEmailResult }\n                    </RX.Text>\n                </RX.View>\n\n            </RX.View>\n        );\n    }\n\n    private _openValidUrl = () => {\n        RX.Linking.openUrl('https://microsoft.github.io/reactxp/').then(() => {\n            if (this._isMounted) {\n                this.setState({ openValidUrlResult: 'Succeeded' });\n            }\n        }).catch(err => {\n            let linkErr = err as RX.Types.LinkingErrorInfo;\n            if (this._isMounted) {\n                this.setState( { openValidUrlResult: this._formatLinkingError(linkErr) } );\n            }\n        });\n    }\n\n    private _openInvalidUrl = () => {\n        RX.Linking.openUrl('foo://reactxp').then(() => {\n            if (this._isMounted) {\n                this.setState({ openInvalidUrlResult: 'Succeeded' });\n            }\n        }).catch(err => {\n            let linkErr = err as RX.Types.LinkingErrorInfo;\n            if (this._isMounted) {\n                this.setState( { openInvalidUrlResult: this._formatLinkingError(linkErr) } );\n            }\n        });\n    }\n\n    private _openSms = () => {\n        let smsData: RX.Types.SmsInfo = {\n            phoneNumber: '1-555-555-5555',\n            body: 'You up?'\n        };\n        RX.Linking.launchSms(smsData).then(() => {\n            if (this._isMounted) {\n                this.setState({ openSmsResult: 'Succeeded' });\n            }\n        }).catch(err => {\n            let linkErr = err as RX.Types.LinkingErrorInfo;\n            if (this._isMounted) {\n                this.setState( { openSmsResult: this._formatLinkingError(linkErr) } );\n            }\n        });\n    }\n\n    private _openEmail = () => {\n        let emailInfo: RX.Types.EmailInfo = {\n            to: ['reactxp@microsoft.com', 'a@foo.com', 'b@foo.com'],\n            cc: ['d@foo.com', 'e@foo.com'],\n            bcc: ['reactxp@microsoft.com'],\n            subject: 'Test - please ignore',\n            body: 'Nothing to see here'\n        };\n        RX.Linking.launchEmail(emailInfo).then(() => {\n            if (this._isMounted) {\n                this.setState({ openEmailResult: 'Succeeded' });\n            }\n        }).catch(err => {\n            let linkErr = err as RX.Types.LinkingErrorInfo;\n            if (this._isMounted) {\n                this.setState( { openEmailResult: this._formatLinkingError(linkErr) } );\n            }\n        });\n    }\n\n    private _formatLinkingError(err: RX.Types.LinkingErrorInfo): string {\n        let errString = 'Unknown';\n        switch (err.code) {\n            case RX.Types.LinkingErrorCode.NoAppFound:\n                errString = 'No App Found';\n                break;\n\n            case RX.Types.LinkingErrorCode.UnexpectedFailure:\n                errString = 'Unexpected Error';\n                break;\n\n            case RX.Types.LinkingErrorCode.Blocked:\n                errString = 'Blocked';\n                break;\n\n            case RX.Types.LinkingErrorCode.InitialUrlNotFound:\n                errString = 'Initial URL Not Found';\n                break;\n        }\n\n        return 'Error: ' + errString;\n    }\n}\n\nclass LinkingTest implements Test {\n    getPath(): string {\n        return 'APIs/Linking';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <LinkingView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new LinkingTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/LocationTest.tsx",
    "content": "/*\n* Tests the RX.Location APIs in an automated manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    historyText: RX.Styles.createTextStyle({\n        marginHorizontal: 32,\n        marginBottom: 12,\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\nconst msPerSample = 2000;\nconst totalSamplesInTest = 3;\n\ninterface LocationState {\n    isLocationAvailable?: boolean;\n\n    // Used for polling the location\n    polledPositionHistory?: string;\n\n    // Used for \"watching\" the location (geofencing)\n    watchPositionHistory?: string;\n}\n\nclass LocationView extends RX.Component<RX.CommonProps, LocationState> {\n    private _isMounted = false;\n    private _locationWatchId: RX.Types.LocationWatchId | undefined;\n    private _timerId = 0;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isLocationAvailable: RX.Location.isAvailable(),\n            polledPositionHistory: '',\n            watchPositionHistory: ''\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        if (this._locationWatchId !== undefined) {\n            RX.Location.clearWatch(this._locationWatchId);\n        }\n\n        this._isMounted = false;\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Are geolocation services available on this platform?' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.isLocationAvailable ? 'Geolocation Available' : 'Geolocation Not Available' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Polled location (low accuracy):' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Text style={ _styles.historyText }>\n                    { this.state.polledPositionHistory || '(no history available)' }\n                </RX.Text>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Watched location (high accuracy):' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Text style={ _styles.historyText }>\n                    { this.state.watchPositionHistory || '(no history available)' }\n                </RX.Text>\n            </RX.View>\n        );\n    }\n\n    execute(complete: (result: TestResult) => void) {\n        let result = new TestResult();\n\n        // If services are not available, return success immediately.\n        if (!this.state.isLocationAvailable) {\n            return complete(result);\n        }\n\n        this.setState({\n            polledPositionHistory: '',\n            watchPositionHistory: ''\n        });\n\n        let loggedPolledLocationError = false;\n        let sampleCount = 0;\n\n        let loggedWatchedLocationError = false;\n        let watchId: RX.Types.LocationWatchId;\n\n        let pollLocation = () => {\n            RX.Location.getCurrentPosition({\n                enableHighAccuracy: false,\n                timeout: msPerSample * 0.9\n            }).then(position => {\n                this.setState({\n                    polledPositionHistory: this.state.polledPositionHistory +\n                        this._formatPosition(position) + '\\n'\n                });\n            }).catch(err => {\n                // Log the error, but make sure we don't log it more than once.\n                const errCode = err.code as RX.Types.LocationErrorType;\n\n                // Don't log a timeout as an error.\n                if (errCode !== RX.Types.LocationErrorType.Timeout) {\n                    if (!loggedPolledLocationError) {\n                        result.errors.push('RX.Location.getCurrentPosition returned error: ' +\n                            this._formatError(errCode));\n                        loggedPolledLocationError = true;\n                    }\n                }\n\n                this.setState({\n                    polledPositionHistory: this.state.polledPositionHistory +\n                        '(' + this._formatError(err.code as RX.Types.LocationErrorType) + ')\\n'\n                });\n            }).finally(() => {\n                sampleCount++;\n                if (sampleCount < totalSamplesInTest) {\n                    _.delay(() => {\n                        pollLocation();\n                    }, msPerSample);\n                } else {\n                    // Stop watching the position.\n                    if (watchId !== undefined) {\n                        RX.Location.clearWatch(watchId);\n                    }\n\n                    // Mark the test as complete.\n                    complete(result);\n                }\n            });\n        };\n        _.defer(() => {\n            // Start polling, but do it in a deferred manner to allow\n            // for setState to take effect first.\n            pollLocation();\n        });\n\n        let logWatchedLocationError = (err: RX.Types.LocationErrorType) => {\n            // Log the error, but make sure we don't log it more than once.\n            const errCode = err as RX.Types.LocationErrorType;\n            \n            // Don't log a timeout as an error.\n            if (errCode !== RX.Types.LocationErrorType.Timeout) {\n                if (!loggedWatchedLocationError) {\n                    result.errors.push('RX.Location.watchPosition returned error: ' +\n                        this._formatError(errCode));\n                    loggedWatchedLocationError = true;\n                }\n            }\n\n            this.setState({\n                watchPositionHistory: this.state.watchPositionHistory +\n                    '(' + this._formatError(err as RX.Types.LocationErrorType) + ')\\n'\n            });\n        };\n\n        // Start the watched position in parallel.\n        RX.Location.watchPosition(position => {\n            this.setState({\n                watchPositionHistory: this.state.watchPositionHistory +\n                    this._formatPosition(position) + '\\n'\n            });\n        }, err => {\n            logWatchedLocationError(err);\n        }, {\n            enableHighAccuracy: true,\n            timeout: msPerSample * (totalSamplesInTest - 1),\n            maximumAge: msPerSample\n        }).then(id => {\n            watchId = id;\n        }).catch(err => {\n            logWatchedLocationError(err.code);\n        });\n    }\n\n    private _formatPosition(pos: Position) {\n        return 'Lat: ' + pos.coords.latitude +\n            ', Long: ' + pos.coords.longitude +\n            ', Alt: ' + pos.coords.altitude +\n            ', Speed: ' + pos.coords.speed +\n            ', Heading: ' + pos.coords.heading +\n            ', Accur: ' + pos.coords.accuracy +\n            ', AltAccur: ' + pos.coords.altitudeAccuracy;\n    }\n\n    private _formatError(error: RX.Types.LocationErrorType): string {\n        switch (error) {\n            case RX.Types.LocationErrorType.PermissionDenied:\n                return 'Permission Denied';\n\n            case RX.Types.LocationErrorType.Timeout:\n                return 'Timeout';\n\n            case RX.Types.LocationErrorType.PositionUnavailable:\n                return 'Position Unavailable';\n\n            default:\n                return 'Unknown Error (' + error + ')';\n        }\n    }\n}\n\nclass LocationTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/Location';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <LocationView\n                ref={ onMount }\n            />\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let locationView = component as LocationView;\n        locationView.execute(complete);\n    }\n}\n\nexport default new LocationTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ModalTest.tsx",
    "content": "/*\n* Tests the RX.Modal APIs in an automated manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    modalText: RX.Styles.createViewStyle({\n        margin: 8\n    }),\n    modalBox1: RX.Styles.createTextStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        margin: 50,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n        borderWidth: 1,\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    modalBox2: RX.Styles.createTextStyle({\n        alignSelf: 'stretch',\n        marginHorizontal: 25,\n        backgroundColor: '#ccf',\n        borderColor: 'black',\n        borderWidth: 1,\n        alignItems: 'center',\n        justifyContent: 'center'\n    })\n};\n\nconst modal1Id = 'modal1';\nconst modal2Id = 'modal2';\n\nclass ModalView extends RX.Component<RX.CommonProps, RX.Stateless> {\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This test displays and then dismisses several modals in succession. ' +\n                          'You should see a large gray modal cover nearly the entire screen followed ' +\n                          'by a wide, short purple modal.' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    execute(complete: (result: TestResult) => void) {\n        let result = new TestResult();\n\n        // Show modal 1.\n        RX.Modal.show(\n            <RX.View style={ _styles.modalBox1 }>\n                <RX.Text style={ _styles.modalText }>\n                    { 'This is modal 1' }\n                </RX.Text>\n            </RX.View>,\n        modal1Id);\n\n        // Wait for a brief time, then show modal 2.\n        _.delay(() => {\n            RX.Modal.show(\n                <RX.View style={ _styles.modalBox2 }>\n                    <RX.Text style={ _styles.modalText }>\n                        { 'This is modal 2' }\n                    </RX.Text>\n                </RX.View>,\n            modal2Id);\n\n            // Wait for a brief time, then dismiss modal 1.\n            _.delay(() => {\n                // Validate that both modals are \"displayed\" (even though only one is visible).\n                if (!RX.Modal.isDisplayed(modal1Id)) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return true for modal 1');\n                }\n                if (!RX.Modal.isDisplayed(modal2Id)) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return true for modal 2');\n                }\n\n                // Dismiss the first modal.\n                RX.Modal.dismiss(modal1Id);\n\n                // Validate that only modal 2 is now displayed.\n                if (RX.Modal.isDisplayed(modal1Id)) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return false for modal 1');\n                }\n                if (!RX.Modal.isDisplayed(modal2Id)) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return true for modal 2');\n                }\n                if (!RX.Modal.isDisplayed()) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return true for undefined');\n                }\n\n                // Dismiss all modals.\n                RX.Modal.dismissAll();\n\n                if (RX.Modal.isDisplayed(modal2Id)) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return false for modal 2');\n                }\n                if (RX.Modal.isDisplayed()) {\n                    result.errors.push('Expected RX.Modal.isDisplayed to return false for undefined');\n                }\n\n                _.delay(() => {\n                    complete(result);\n                }, 250);\n            }, 500);\n        }, 500);\n    }\n}\n\nclass ModalTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/Modal';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ModalView\n                ref={ onMount }\n            />\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let ModalView = component as ModalView;\n        ModalView.execute(complete);\n    }\n}\n\nexport default new ModalTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/NetworkTest.tsx",
    "content": "/*\n* Tests the ~RX.Network~ reatxp-netinfo APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\nimport RXNetInfo, { Types as RXNetInfoTypes } from 'reactxp-netinfo';\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    })\n};\n\ninterface NetworkState {\n    connectionState?: string;\n    networkType?: string;\n}\n\nclass NetworkView extends RX.Component<RX.CommonProps, NetworkState> {\n    private _isMounted = false;\n    private _connectivityChangedEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            connectionState: '',\n            networkType: ''\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        this._connectivityChangedEvent = RXNetInfo.connectivityChangedEvent.subscribe(isConnected => {\n            this.setState({\n                connectionState: isConnected ? 'Connected' : 'Disconnected'\n            });\n\n            this._queryNetworkState();\n        });\n\n        this._queryConnectivityState();\n        this._queryNetworkState();\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n\n        if (this._connectivityChangedEvent) {\n            this._connectivityChangedEvent.unsubscribe();\n        }\n    }\n\n    private _queryConnectivityState() {\n        RXNetInfo.isConnected().then(isConnected => {\n            if (this._isMounted) {\n                this.setState({\n                    connectionState: isConnected ? 'Connected' : 'Disconnected'\n                });\n            }\n        }).catch(err => {\n            if (this._isMounted) {\n                this.setState({\n                    connectionState: 'Error: (' + err + ')'\n                });\n            }\n        });\n    }\n\n    private _queryNetworkState() {\n        RXNetInfo.getType().then(type => {\n            if (this._isMounted) {\n                this.setState({\n                    networkType: this._formatNetworkType(type)\n                });\n            }\n        }).catch(err => {\n            if (this._isMounted) {\n                this.setState({\n                    networkType: 'Error: (' + err + ')'\n                });\n            }\n        });\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Current network connectivity:' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.connectionState }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Device network type:' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.networkType }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _formatNetworkType(type: RXNetInfoTypes.DeviceNetworkType): string {\n        switch (type) {\n            case RXNetInfoTypes.DeviceNetworkType.Unknown:\n                return 'Unknown';\n\n            case RXNetInfoTypes.DeviceNetworkType.None:\n                return 'None';\n\n            case RXNetInfoTypes.DeviceNetworkType.Wifi:\n                return 'WiFi';\n\n            case RXNetInfoTypes.DeviceNetworkType.Mobile2G:\n                return 'Mobile 2G';\n\n            case RXNetInfoTypes.DeviceNetworkType.Mobile3G:\n                return 'Mobile 3G';\n\n            case RXNetInfoTypes.DeviceNetworkType.Mobile4G:\n                return 'Mobile 4G';\n\n            default:\n                return 'Unknown (' + type + ')';\n        }\n    }\n}\n\nclass NetworkTest implements Test {\n    getPath(): string {\n        return 'APIs/Network';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <NetworkView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new NetworkTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/PickerTest.tsx",
    "content": "/*\n* Tests the functionality of the Picker component\n* with manual user validation.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    resultText: RX.Styles.createTextStyle({\n        marginLeft: 20,\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    pickerContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        alignItems: 'center'\n    }),\n    picker: RX.Styles.createPickerStyle({\n        alignSelf: 'stretch'\n    }),\n    pickerWeb: RX.Styles.createPickerStyle({\n        alignSelf: 'center',\n        marginVertical: 12,\n        height: 24,\n        width: 100\n    })\n};\n\ninterface PickerViewState {\n    test1Value: string;\n    test2Value: string;\n}\n\nclass PickerView extends RX.Component<RX.CommonProps, PickerViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1Value: 'platform1',\n            test2Value: ''\n        };\n    }\n\n    render() {\n        const picker1Items: RX.Types.PickerPropsItem[] = [\n            {\n                label: 'Windows',\n                value: 'platform1'\n            }, {\n                label: 'iOS',\n                value: 'platform2'\n            }, {\n                label: 'Android',\n                value: 'platform3'\n            }\n        ];\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Select item from picker.' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.pickerContainer }>\n                    <RX.Picker\n                        style={ [_styles.picker, RX.Platform.getType() === 'web' ? _styles.pickerWeb : undefined] }\n                        selectedValue={ this.state.test1Value || '' }\n                        items={ picker1Items }\n                        mode={ 'dialog' }\n                        onValueChange={ this._onValueChanged1 }\n                        testId={ 'picker1' }\n                    />\n                    <RX.Text style={ _styles.resultText }>\n                        { 'You selected \"' +\n                            _.find(picker1Items, item => item.value === this.state.test1Value)!.label + '\"'\n                        }\n                    </RX.Text>\n                </RX.View>\n\n            </RX.View>\n        );\n    }\n\n    private _onValueChanged1 = (itemValue: string, itemPosition: number) => {\n        this.setState({ test1Value: itemValue });\n    }\n}\n\nclass PickerTest implements Test {\n    getPath(): string {\n        return 'Components/Picker';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <PickerView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new PickerTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/PlatformTest.tsx",
    "content": "/*\n* Tests the RX.Platform APIs.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'center'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    platformText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    })\n};\n\ninterface PlatformState {\n    platformType?: RX.Types.PlatformType;\n}\n\nclass PlatformView extends RX.Component<RX.CommonProps, PlatformState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            platformType: undefined\n        };\n    }\n\n    render() {\n        const platformTypeText = RX.Platform.select({\n            'web': 'Browser (web)',\n            'ios': 'iOS',\n            'android': 'Android',\n            'windows': 'Windows (UWP)',\n            'default': `Unknown (${JSON.stringify(this.state.platformType)})`\n        });\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'When the test is run, the platform type will be displayed below.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.textContainer } key={ 'platform' }>\n                    <RX.Text style={ _styles.platformText }>\n                        { platformTypeText }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    execute() {\n        this.setState({\n            platformType: RX.Platform.getType()\n        });\n    }\n}\n\nclass PlatformTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/Platform';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <PlatformView\n                ref={ onMount }\n            />\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        // Nothing to do but report success\n        let results = new TestResult();\n\n        let platformView = component as PlatformView;\n        platformView.execute();\n\n        complete(results);\n    }\n}\n\nexport default new PlatformTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/PopupTest.tsx",
    "content": "/*\n* Tests the RX.Popup APIs in an automated manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _indicatorWidth = 8;\nconst _popupMargin = 8;\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    anyDisplayedText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        marginTop: 20,\n    }),\n    popupText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        margin: 8\n    }),\n    popupBox: RX.Styles.createTextStyle({\n        margin: _popupMargin,\n        backgroundColor: '#ffd',\n        borderColor: 'black',\n        borderWidth: 1,\n        alignItems: 'center',\n        justifyContent: 'center',\n        overflow: 'visible'\n    }),\n    popupContainer: RX.Styles.createViewStyle({\n        overflow: 'visible'\n    }),\n    anchorText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize\n    }),\n    popupAnchor: RX.Styles.createViewStyle({\n        position: 'absolute',\n        borderRadius: 15,\n        height: 30,\n        width: 160,\n        backgroundColor: '#eee',\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    popupAnchor1: RX.Styles.createViewStyle({\n        left: 10,\n        top: 150\n    }),\n    popupAnchor2: RX.Styles.createViewStyle({\n        right: 10,\n        top: 250\n    }),\n    popupAnchor3: RX.Styles.createViewStyle({\n        left: 10,\n        bottom: 10\n    }),\n    popupAnchor4: RX.Styles.createViewStyle({\n        right: 10,\n        bottom: 10\n    }),\n    anchorIndicator: RX.Styles.createViewStyle({\n        position: 'absolute',\n        height: _indicatorWidth,\n        width: _indicatorWidth,\n        borderRadius: _indicatorWidth / 2,\n        backgroundColor: 'black'\n    }),\n    textInput: RX.Styles.createTextInputStyle({\n        alignSelf: 'center',\n        height: 24,\n        width: 140,\n        borderWidth: 1,\n        borderColor: '#999',\n        fontSize: 12\n    }),\n    comboBoxPopup: RX.Styles.createViewStyle({\n        borderWidth: 1,\n        borderColor: '#999',\n        padding: 4,\n        width: 140\n    }),\n    comboBoxText: RX.Styles.createTextStyle({\n        fontSize: 14,\n        color: '#666'\n    }),\n    popupAnchor6: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        borderRadius: 15,\n        height: 30,\n        width: 160,\n        marginTop: 40,\n        backgroundColor: '#eee',\n        alignItems: 'center',\n        justifyContent: 'center',\n    }),\n};\n\nconst popup1Id = 'popup1';\nconst popup2Id = 'popup2';\nconst popup3Id = 'popup3';\nconst popup4Id = 'popup4';\nconst popup5Id = 'popup5';\nconst popup6Id = 'popup6';\n\ninterface PopupBoxProps extends RX.CommonProps {\n    text: string;\n    anchorPosition: RX.Types.PopupPosition;\n    anchorOffset: number;\n    popupHeight: number;\n    popupWidth: number;\n    onPress?: () => void;\n}\n\ninterface PopupViewState {\n    textInputValue?: string;\n    selectedComboValue?: string;\n}\n\nclass PopupBox extends RX.Component<PopupBoxProps, RX.Stateless> {\n    render() {\n        let top = 0;\n        let bottom = 0;\n        let left = 0;\n        let right = 0;\n\n        switch (this.props.anchorPosition) {\n            case 'left':\n                right = -_indicatorWidth / 2;\n                top = this.props.anchorOffset - _popupMargin - _indicatorWidth / 2;\n                break;\n\n            case 'right':\n                left = -_indicatorWidth / 2;\n                top = this.props.anchorOffset - _popupMargin - _indicatorWidth / 2;\n                break;\n\n            case 'top':\n                bottom = -_indicatorWidth / 2;\n                left = this.props.anchorOffset - _popupMargin - _indicatorWidth / 2;\n                break;\n\n            case 'bottom':\n                top = -_indicatorWidth / 2;\n                left = this.props.anchorOffset - _popupMargin - _indicatorWidth / 2;\n                break;\n        }\n\n        // Dynamically allocate a non-cached style to position the indicator.\n        let indicatorPosition = RX.Styles.createViewStyle({\n            top,\n            left,\n            bottom,\n            right\n        }, false);\n\n        return (\n            <RX.View style={ _styles.popupBox } onPress={ this.props.onPress }>\n                <RX.View style={ _styles.popupContainer }>\n                    <RX.Text style={ _styles.popupText }>\n                        { this.props.text }\n                    </RX.Text>\n                    <RX.View style={ [_styles.anchorIndicator, indicatorPosition] }/>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass PopupView extends RX.Component<RX.CommonProps, PopupViewState> {\n    private _anchor1: RX.Button | undefined;\n    private _anchor2: RX.Button | undefined;\n    private _anchor3: RX.Button | undefined;\n    private _anchor4: RX.Button | undefined;\n    private _anchor5: RX.TextInput | undefined;\n    private _anchor6: RX.Button | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {};\n    }\n\n    componentWillUnmount() {\n        RX.Popup.dismissAll();\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Click or tap on anchor buttons to display popups. ' +\n                          'The black circle should align to the anchor. ' }\n                    </RX.Text>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Resize the window or rotate the device when a popup is displayed ' +\n                          'to confirm that it follows the location of the anchor.' }\n                    </RX.Text>\n                    <RX.Text style={ _styles.anyDisplayedText }>\n                        { `Any Popup displayed = ${RX.Popup.isDisplayed()}`}\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ [_styles.popupAnchor, _styles.popupAnchor1] }\n                    ref={ (comp: any) => { this._anchor1 = comp; } }\n                    onPress={ this._showPopup1 }\n                >\n                    <RX.Text style={ _styles.anchorText }>\n                        { `1: isDisplayed = ${RX.Popup.isDisplayed(popup1Id)}` }\n                    </RX.Text>\n                </RX.Button>\n                <RX.Button\n                    style={ [_styles.popupAnchor, _styles.popupAnchor2] }\n                    ref={ (comp: any) => { this._anchor2 = comp; } }\n                    onPress={ this._showPopup2 }\n                >\n                    <RX.Text style={ _styles.anchorText }>\n                        { `2: isDisplayed = ${RX.Popup.isDisplayed(popup2Id)}` }\n                    </RX.Text>\n                </RX.Button>\n                <RX.Button\n                    style={ [_styles.popupAnchor, _styles.popupAnchor3] }\n                    ref={ (comp: any) => { this._anchor3 = comp; } }\n                    onPress={ this._showPopup3 }\n                >\n                    <RX.Text style={ _styles.anchorText }>\n                        { `3: isDisplayed = ${RX.Popup.isDisplayed(popup3Id)}` }\n                    </RX.Text>\n                </RX.Button>\n                <RX.Button\n                    style={ [_styles.popupAnchor, _styles.popupAnchor4] }\n                    ref={ (comp: any) => { this._anchor4 = comp; } }\n                    onPress={ this._showPopup4 }\n                >\n                    <RX.Text style={ _styles.anchorText }>\n                        { `4: isDisplayed = ${RX.Popup.isDisplayed(popup4Id)}` }\n                    </RX.Text>\n                </RX.Button>\n                <RX.TextInput\n                    style={ _styles.textInput }\n                    ref={ (comp: any) => { this._anchor5 = comp; } }\n                    onFocus={ this._onFocusTextInput }\n                    value={ this.state.textInputValue || '' }\n                    onChangeText={ this._onChangeTextInput }\n                />\n                <RX.Button\n                    style={ [_styles.popupAnchor6] }\n                    ref={ (comp: any) => { this._anchor6 = comp; } }\n                    onPress={ this._showPopup6 }\n                >\n                    <RX.Text style={ _styles.anchorText }>\n                        { `6: isDisplayed = ${RX.Popup.isDisplayed(popup6Id)}` }\n                    </RX.Text>\n                </RX.Button>\n            </RX.View>\n        );\n    }\n\n    private _showPopup1 = () => {\n        RX.Popup.show({\n            getAnchor: () => {\n                return this._anchor1!;\n            },\n            dismissIfShown: true,\n            positionPriorities: ['right', 'top', 'bottom'],\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n\n                return (\n                    <PopupBox\n                        text={ 'Click on anchor to toggle' }\n                        anchorOffset={ anchorOffset }\n                        anchorPosition={ anchorPosition }\n                        popupWidth={ popupWidth }\n                        popupHeight={ popupHeight }\n                    />\n                );\n            }\n        }, popup1Id);\n    }\n\n    private _showPopup2 = () => {\n        RX.Popup.show({\n            getAnchor: () => {\n                return this._anchor2!;\n            },\n            preventDismissOnPress: true,\n            positionPriorities: ['left', 'top', 'bottom'],\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n\n                return (\n                    <PopupBox\n                        text={ 'Must click on this\\npopup to dismiss' }\n                        anchorOffset={ anchorOffset }\n                        anchorPosition={ anchorPosition }\n                        popupWidth={ popupWidth }\n                        popupHeight={ popupHeight }\n                        onPress={ () => { RX.Popup.dismiss(popup2Id); } }\n                    />\n                );\n            }\n        }, popup2Id);\n    }\n\n    private _showPopup3 = () => {\n        RX.Popup.show({\n            getAnchor: () => {\n                return this._anchor3!;\n            },\n            getElementTriggeringPopup: () => {\n                return this._anchor3!;\n            },\n            positionPriorities: ['right', 'bottom', 'left', 'top'],\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n\n                return (\n                    <PopupBox\n                        text={ 'Auto-dismissing popup\\n(after 2 seconds)' }\n                        anchorOffset={ anchorOffset }\n                        anchorPosition={ anchorPosition }\n                        popupWidth={ popupWidth }\n                        popupHeight={ popupHeight }\n                    />\n                );\n            }\n        }, popup3Id);\n\n        RX.Popup.autoDismiss(popup3Id, 2000);\n    }\n\n    private _showPopup4 = () => {\n        RX.Popup.show({\n            dismissIfShown: true,\n            cacheable: true,\n            getAnchor: () => {\n                return this._anchor4!;\n            },\n            getElementTriggeringPopup: () => {\n                return this._anchor3!;\n            },\n            positionPriorities: ['left', 'top', 'bottom'],\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n\n                return (\n                    <PopupBox\n                        text={ 'Cacheable popup\\n(may be still rendered when dismissed)' }\n                        anchorOffset={ anchorOffset }\n                        anchorPosition={ anchorPosition }\n                        popupWidth={ popupWidth }\n                        popupHeight={ popupHeight }\n                    />\n                );\n            }\n        }, popup4Id);\n    }\n\n    private _showPopup6 = () => {\n        RX.Popup.show({\n            dismissIfShown: true,\n            cacheable: true,\n            getAnchor: () => {\n                return this._anchor6!;\n            },\n            getElementTriggeringPopup: () => {\n                return this._anchor6!;\n            },\n            positionPriorities: ['context'],\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                popupWidth: number, popupHeight: number) => {\n\n                return (\n                    <PopupBox\n                        text={ 'Context Menu Behavior' }\n                        anchorOffset={ anchorOffset }\n                        anchorPosition={ anchorPosition }\n                        popupWidth={ popupWidth }\n                        popupHeight={ popupHeight }\n                    />\n                );\n            }\n        }, popup6Id);\n    }\n\n    private _onChangeTextInput = (newText: string) => {\n        this.setState({ textInputValue: newText });\n        this._showTextComboBox(newText);\n    }\n\n    private _onFocusTextInput = () => {\n        this._showTextComboBox(this.state.textInputValue || '');\n    }\n\n    private _getFilteredComboItems(textInputValue: string) {\n        let itemsText = ['apple', 'banana', 'cat', 'cottage', 'dog', 'dogfish'];\n        let lowerText = textInputValue.toLowerCase();\n\n        return _.filter(itemsText, (item: string) => {\n            return item.substr(0, lowerText.length) === lowerText;\n        });\n    }\n\n    private _renderComboItems(itemsText: string[]) {\n        return _.map(itemsText, item => {\n            return (\n                <RX.Button\n                    key={ item }\n                    onPress={ e => this._onPressComboBoxItem(e, item) }\n                >\n                    <RX.Text style={ _styles.comboBoxText}>\n                        { item }\n                    </RX.Text>\n                </RX.Button>\n            );\n        });\n    }\n\n    private _showTextComboBox(typedText: string) {\n        let filteredItems: string[] = [];\n        if (typedText) {\n            filteredItems = this._getFilteredComboItems(typedText);\n        }\n\n        if (filteredItems.length > 0) {\n            RX.Popup.show({\n                getAnchor: () => {\n                    return this._anchor5!;\n                },\n                positionPriorities: ['bottom', 'right'],\n                renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number,\n                    popupWidth: number, popupHeight: number) => {\n\n                    return (\n                        <RX.View style={ _styles.comboBoxPopup }>\n                            { this._renderComboItems(filteredItems) }\n                        </RX.View>\n                    );\n                }\n            }, popup5Id);\n        } else {\n            RX.Popup.dismiss(popup5Id);\n            this.setState({ selectedComboValue: '' });\n        }\n    }\n\n    private _onPressComboBoxItem(e: RX.Types.SyntheticEvent, itemText: string) {\n        this.setState({ textInputValue: itemText });\n\n        RX.Popup.dismiss(popup5Id);\n        this.setState({ selectedComboValue: '' });\n    }\n}\n\nclass PopupTest implements Test {\n    useFullScreenContainer = true;\n\n    getPath(): string {\n        return 'APIs/Popup';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <PopupView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new PopupTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ScrollViewBasicTest.tsx",
    "content": "/*\n* Tests the functionality of a ScrollView component\n* through user interaction.\n*\n* We need to split the ScrollView tests into multiple pages because\n* we can't embed ScrollViews within a parent ScrollView.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    scrollViewContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        alignSelf: 'stretch',\n        height: 150,\n        width: 320\n    }),\n    scrollView1: RX.Styles.createScrollViewStyle({\n    }),\n    numberGrid: RX.Styles.createViewStyle({\n        width: 400,\n        backgroundColor: '#eef',\n        flexDirection: 'row',\n        flexWrap: 'wrap'\n    }),\n    numberContainer: RX.Styles.createViewStyle({\n        height: 50,\n        width: 50,\n        borderWidth: 1,\n        borderColor: '#ccc',\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    numberText: RX.Styles.createTextStyle({\n        fontSize: 24\n    }),\n    listContainer: RX.Styles.createViewStyle({\n    }),\n    numberItem: RX.Styles.createViewStyle({\n        paddingHorizontal: 12,\n        height: 50,\n        borderWidth: 1,\n        borderColor: '#eee',\n        justifyContent: 'center'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.buttonFontSize,\n        marginHorizontal: 12,\n        color: CommonStyles.buttonTextColor\n    })\n};\n\nconst _colors = ['red', 'green', 'blue'];\n\ninterface ScrollViewState {\n    horizontalIndicator: boolean;\n    verticalIndicator: boolean;\n}\n\nclass ScrollViewView extends RX.Component<RX.CommonProps, ScrollViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            horizontalIndicator: true,\n            verticalIndicator: true\n        };\n    }\n\n    render() {\n        let numberBoxes: JSX.Element[] = [];\n        for (let i = 0; i < 40; i++) {\n            numberBoxes.push(\n                <RX.View style={ _styles.numberContainer } key={ 'Box' + i }>\n                    <RX.Text style={ _styles.numberText }>\n                        { i }\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n\n        let numberItems: JSX.Element[] = [];\n        for (let i = 0; i < 20; i++) {\n            numberItems.push(\n                <RX.View style={ _styles.numberItem } key={ 'Item' + i }>\n                    <RX.Text style={ _styles.numberText }>\n                        { 'List item ' + i }\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Scroll view with both vertical and horizontal scrolling. ' +\n                          'Bouncing (iOS) and over-scroll (Android) are disabled. ' +\n                          'Press buttons to toggle scroll indicators.' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => {\n                        this.setState({ horizontalIndicator: !this.state.horizontalIndicator });\n                    } }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Horizontal indicator: ' + (this.state.horizontalIndicator ? 'On' : 'Off') }\n                    </RX.Text>\n                </RX.Button>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => {\n                        this.setState({ verticalIndicator: !this.state.verticalIndicator });\n                    } }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Vertical indicator: ' + (this.state.verticalIndicator ? 'On' : 'Off') }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.scrollViewContainer }>\n                    <RX.ScrollView\n                        style={ _styles.scrollView1 }\n                        horizontal={ true }\n                        bounces={ false }\n                        overScrollMode={ 'never' }\n                        showsHorizontalScrollIndicator={ this.state.horizontalIndicator }\n                        showsVerticalScrollIndicator={ this.state.verticalIndicator }\n                        testId={ 'scrollView1' }\n                    >\n                        <RX.View style={ _styles.numberGrid }>\n                            { numberBoxes }\n                        </RX.View>\n                    </RX.ScrollView>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Scroll view with vertical paging with 50px pages.' +\n                          'Scrolls to top (iOS) when tapping on the status bar.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.scrollViewContainer }>\n                    <RX.ScrollView\n                        style={ _styles.scrollView1 }\n                        snapToInterval={ 50 }\n                        scrollsToTop={ true }\n                    >\n                        <RX.View style={ _styles.listContainer }>\n                            { numberItems }\n                        </RX.View>\n                    </RX.ScrollView>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Scroll is disabled' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.scrollViewContainer }>\n                    <RX.ScrollView\n                        style={ _styles.scrollView1 }\n                        scrollEnabled={ false }\n                    >\n                        <RX.View style={ _styles.listContainer }>\n                            { numberItems }\n                        </RX.View>\n                    </RX.ScrollView>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass ScrollViewTest implements Test {\n    useFullScreenContainer = true;\n\n    getPath(): string {\n        return 'Components/ScrollView/Basic';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ScrollViewView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new ScrollViewTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ScrollViewEventTest.tsx",
    "content": "/*\n* Tests the functionality of a ScrollView event callbacks\n* through user interaction.\n*\n* We need to split the ScrollView tests into multiple pages because\n* we can't embed ScrollViews within a parent ScrollView.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    scrollViewContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        alignSelf: 'stretch',\n        height: 150,\n        width: 320\n    }),\n    scrollView1: RX.Styles.createScrollViewStyle({\n        alignSelf: 'stretch'\n    }),\n    numberText: RX.Styles.createTextStyle({\n        fontSize: 24\n    }),\n    numberItem: RX.Styles.createViewStyle({\n        paddingHorizontal: 12,\n        height: 50,\n        borderWidth: 1,\n        borderColor: '#eee',\n        justifyContent: 'center'\n    }),\n    labelText: RX.Styles.createTextStyle({\n        marginVertical: 8,\n        marginHorizontal: 24,\n        fontSize: CommonStyles.generalFontSize\n    })\n};\n\nconst _colors = ['red', 'green', 'blue'];\n\ninterface ScrollViewState {\n    test1ScrollTop: number;\n    test1ContentWidth: number;\n    test1ContentHeight: number;\n    test1ItemCount: number;\n    test1DragStartTime: number;\n    test1DragEndTime: number;\n}\n\nclass ScrollViewView extends RX.Component<RX.CommonProps, ScrollViewState> {\n    private _isMounted = false;\n    private _test1Timer: number | undefined;\n\n    private _scrollAnimEventValue = RX.Animated.createValue(0);\n    private _coupledOpacityValue = this._scrollAnimEventValue.interpolate({\n        inputRange: [0, 500],\n        outputRange: [1, 0.2]\n    });\n    private _coupledTranslateXValue = this._scrollAnimEventValue.interpolate({\n        inputRange: [0, 500],\n        outputRange: [500, 0]\n    });\n    private _coupledAnimStyle = RX.Styles.createAnimatedViewStyle({\n        opacity: this._coupledOpacityValue,\n        transform: [{ translateX: this._coupledTranslateXValue }]\n    });\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1ScrollTop: 0,\n            test1ContentWidth: 0,\n            test1ContentHeight: 0,\n            test1ItemCount: 20,\n            test1DragStartTime: 0,\n            test1DragEndTime: 0\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        // Start a timer to update the number of items to display.\n        this._test1Timer = window.setInterval(() => {\n            // Go from 20 to 29\n            this.setState({\n                test1ItemCount: (this.state.test1ItemCount + 1) % 10 + 20\n            });\n        }, 1000);\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n\n        window.clearInterval(this._test1Timer);\n    }\n\n    render() {\n        let numberItems: JSX.Element[] = [];\n        for (let i = 0; i < this.state.test1ItemCount; i++) {\n            numberItems.push(\n                <RX.View style={ _styles.numberItem } key={ 'Item' + i }>\n                    <RX.Text style={ _styles.numberText }>\n                        { 'List item ' + i }\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This scroll view has 20px indicator insets.' +\n                          'Has event handlers for scroll begin/end, scroll (throttled ' +\n                          'to 1 sec) and content size changes. Content size should ' +\n                          'change each second.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.scrollViewContainer }>\n                    <RX.ScrollView\n                        style={ _styles.scrollView1 }\n                        scrollEventThrottle={ 1000 }\n                        scrollIndicatorInsets={ { top: 20, left: 0, bottom: 20, right: 0 } }\n                        onScroll={ this._onScrollTest1 }\n                        scrollYAnimatedValue={ this._scrollAnimEventValue }\n                        onContentSizeChange={ this._onContentSizeChangeTest1 }\n                        onScrollBeginDrag={ this._onScrollBeginDragTest1 }\n                        onScrollEndDrag={ this._onScrollEndDragTest1 }\n                    >\n                        <RX.View>\n                            { numberItems }\n                        </RX.View>\n                    </RX.ScrollView>\n                </RX.View>\n                <RX.Animated.View style={ this._coupledAnimStyle }>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'This should move left and go translucent as you scroll.' }\n                    </RX.Text>\n                </RX.Animated.View>\n                <RX.View>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Scroll top: ' + this.state.test1ScrollTop }\n                    </RX.Text>\n                </RX.View>\n                <RX.View>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Content size: W=' + this.state.test1ContentWidth +\n                            ' H=' + this.state.test1ContentHeight }\n                    </RX.Text>\n                </RX.View>\n                <RX.View>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Drag start time: ' + this.state.test1DragStartTime }\n                    </RX.Text>\n                </RX.View>\n                <RX.View>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Drag end time: ' + this.state.test1DragEndTime }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onScrollTest1 = (newScrollTop: number, newScrollLeft: number) => {\n        this.setState({\n            test1ScrollTop: newScrollTop\n        });\n    }\n\n    private _onContentSizeChangeTest1 = (width: number, height: number) => {\n        this.setState({\n            test1ContentWidth: width,\n            test1ContentHeight: height\n        });\n    }\n\n    private _onScrollBeginDragTest1 = () => {\n        this.setState({\n            test1DragStartTime: Date.now()\n        });\n    }\n\n    private _onScrollEndDragTest1 = () => {\n        this.setState({\n            test1DragEndTime: Date.now()\n        });\n    }\n}\n\n// TODO: need to add tests for the following props\n// showsHorizontalScrollIndicator?: boolean;\n// showsVerticalScrollIndicator?: boolean;\n// scrollEnabled?: boolean;\n// keyboardDismissMode?: 'none' | 'interactive' | 'on-drag';\n// keyboardShouldPersistTaps?: boolean;\n\n// TODO: need to add tests for the following methods\n// focus\n// setScrollLeft\n// setScrollTop\n\nclass ScrollViewTest implements Test {\n    useFullScreenContainer = true;\n\n    getPath(): string {\n        return 'Components/ScrollView/Events';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ScrollViewView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new ScrollViewTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/StatusBarTest.tsx",
    "content": "/*\n* Tests the RX.StatusBar APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 16,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    }),\n    buttonBank: RX.Styles.createViewStyle({\n        flexDirection: 'row'\n    })\n};\n\ninterface StatusBarViewState {\n    isStatusBarHidden: boolean;\n    barStyle: 'default' | 'light-content' | 'dark-content';\n    isNetworkVisible: boolean;\n    backgroundColorIndex: number;\n    isTranslucent: boolean;\n}\n\nclass StatusBarView extends RX.Component<RX.CommonProps, StatusBarViewState> {\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isStatusBarHidden: false,\n            barStyle: 'default',\n            isNetworkVisible: true,\n            backgroundColorIndex: 0,\n            isTranslucent: false\n        };\n    }\n\n    componentWillUnmount() {\n        // Reset the status bar state.\n        RX.StatusBar.setHidden(false, 'fade');\n        RX.StatusBar.setBarStyle('default', true);\n        RX.StatusBar.setNetworkActivityIndicatorVisible(true);\n        RX.StatusBar.setBackgroundColor('black', true);\n        RX.StatusBar.setTranslucent(false);\n    }\n\n    render() {\n        let styles = ['default', 'light-content', 'dark-content'];\n        let styleButtons = styles.map(style => {\n            return (\n                <RX.Button\n                    key={ style }\n                    style={ _styles.button }\n                    onPress={ () => this._setStatusBarStyle(style as any) }\n                    disabled={ this.state.barStyle === style }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { style }\n                    </RX.Text>\n                </RX.Button>\n            );\n        });\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is the status bar an \"overlay\" type (as on iOS)?' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer } key={ 'platform' }>\n                    <RX.Text style={ _styles.labelText }>\n                        { RX.StatusBar.isOverlay() ? 'Overlay' : 'Not Overlay' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press button to hide and show the status bar.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._toggleStatusBar('fade') }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { this.state.isStatusBarHidden ? 'Show (Fade)' : 'Hide (Fade)' }\n                    </RX.Text>\n                </RX.Button>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._toggleStatusBar('slide') }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { this.state.isStatusBarHidden ? 'Show (Slide)' : 'Hide (Slide)' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press buttons to change the status bar style.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.buttonBank }>\n                    { styleButtons }\n                </RX.View>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press button to toggle the network activity indicator (iOS only).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._toggleNetworkIndicator() }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { this.state.isNetworkVisible ? 'Hide Network Indicator' : 'Show Network Indicator' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation6' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press button to change the background color of the status bar (Android only).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._changeBackgroundColor() }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Change Background Color' }\n                    </RX.Text>\n                </RX.Button>\n\n                <RX.View style={ _styles.textContainer } key={ 'explanation7' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press button to toggle between transluscent and opaque (Android only).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.Button\n                    style={ _styles.button }\n                    onPress={ () => this._toggleTranslucent() }\n                >\n                    <RX.Text style={ _styles.buttonText }>\n                        { 'Make ' + (this.state.isTranslucent ? 'Opaque' : 'Translucent') }\n                    </RX.Text>\n                </RX.Button>\n\n            </RX.View>\n        );\n    }\n\n    private _toggleStatusBar(effect: 'fade' | 'slide') {\n        RX.StatusBar.setHidden(!this.state.isStatusBarHidden, effect);\n\n        this.setState({\n            isStatusBarHidden: !this.state.isStatusBarHidden\n        });\n    }\n\n    private _setStatusBarStyle(style: 'default' | 'light-content' | 'dark-content') {\n        RX.StatusBar.setBarStyle(style, true);\n\n        this.setState({\n            barStyle: style\n        });\n    }\n\n    private _toggleNetworkIndicator() {\n        RX.StatusBar.setNetworkActivityIndicatorVisible(!this.state.isNetworkVisible);\n\n        this.setState({\n            isNetworkVisible: !this.state.isNetworkVisible\n        });\n    }\n\n    private _changeBackgroundColor() {\n        let colors = ['black', 'white', 'green', 'blue', 'red'];\n        let newIndex = (this.state.backgroundColorIndex + 1) % colors.length;\n\n        RX.StatusBar.setBackgroundColor(colors[newIndex], true);\n\n        this.setState({\n            backgroundColorIndex: newIndex\n        });\n    }\n\n    private _toggleTranslucent() {\n        RX.StatusBar.setTranslucent(!this.state.isTranslucent);\n\n        this.setState({\n            isTranslucent: !this.state.isTranslucent\n        });\n    }\n}\n\nclass StatusBarTest implements Test {\n    getPath(): string {\n        return 'APIs/StatusBar';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <StatusBarView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new StatusBarTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/StorageTest.tsx",
    "content": "/*\n* Tests the basic functionality of a Storage APIs.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _storageKey = 'storageKey1';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'center'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    })\n};\n\nclass StorageBasicTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/Storage';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <RX.View style={ _styles.container} ref={ onMount }>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'When the test is run, the storage APIs will be used to store, retrieve, delete and clear key/value pairs' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let results = new TestResult();\n\n        RX.Storage.setItem(_storageKey, 'value1').then(() => {\n            return RX.Storage.getItem(_storageKey).then(value => {\n                if (value !== 'value1') {\n                    results.errors.push('RX.Storage.getItem returned unexpected value: \"' +\n                        value + '\"; expected value1');\n                }\n                return RX.Storage.setItem(_storageKey, 'value2');\n            }).then(() => {\n                return RX.Storage.getItem(_storageKey);\n            }).then(value => {\n                if (value !== 'value2') {\n                    results.errors.push('RX.Storage.getItem returned unexpected value: \"' +\n                        value + '\"; expected value2');\n                }\n\n                return RX.Storage.removeItem(_storageKey);\n            }).then(() => {\n                return RX.Storage.getItem(_storageKey);\n            }).then(value => {\n                if (value !== undefined) {\n                    results.errors.push('RX.Storage.getItem returned unexpected value: \"' +\n                        value + '\" after removing key; expected undefined');\n                }\n\n                return RX.Storage.setItem(_storageKey, 'value3');\n            }).then(() => {\n                return RX.Storage.clear();\n            }).then(() => {\n                return RX.Storage.getItem(_storageKey);\n            }).then(value => {\n                if (value !== undefined) {\n                    results.errors.push('RX.Storage.getItem returned unexpected value: \"' +\n                        value + '\" after clearing all keys; expected undefined');\n                }\n            });\n        }).catch(error => {\n            results.errors.push('Received unexpected error from RX.Storage');\n        }).finally(() => {\n            complete(results);\n        });\n    }\n}\n\nexport default new StorageBasicTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/TextInputApiTest.tsx",
    "content": "/*\n* Tests the functionality of a TextInput component that can be\n* auto-validated.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    textInput1: RX.Styles.createTextInputStyle({\n        marginHorizontal: 12,\n        alignSelf: 'stretch',\n        borderWidth: 1,\n        fontSize: CommonStyles.generalFontSize,\n        padding: 4,\n        borderColor: '#999'\n    })\n};\n\ninterface TextInputViewState {\n    testInput?: string;\n}\n\nconst _testValue1 = 'A long test value for the text input box';\n\nclass TextInputView extends RX.Component<RX.CommonProps, TextInputViewState> {\n    private _isMounted = false;\n    private _textInput1Ref: RX.TextInput | undefined;\n    private _testResult: TestResult | undefined;\n    private _testCompletion: ((result: TestResult) => void) | undefined;\n    private _nextTestStage: number | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            testInput: ''\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Tests various aspects of the TextInput component that can be automatically validated.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.TextInput\n                    ref={ (comp: any) => { this._textInput1Ref = comp; } }\n                    style={ _styles.textInput1 }\n                    value={ this.state.testInput }\n                    onChangeText={ val => this.setState({ testInput: val }) }\n                    testId={ 'textInput1' }\n                />\n            </RX.View>\n        );\n    }\n\n    private _executeNextStage() {\n        const testStages: (() => void)[] = [() => {\n            // Stage 0\n            // Test focus API.\n            this._textInput1Ref!.focus();\n        }, () => {\n            // Stage 1\n            // Verify focus results.\n            if (!this._textInput1Ref!.isFocused()) {\n                this._testResult!.errors.push('Expected text input to be focused');\n            }\n\n            // Test blur API.\n            this._textInput1Ref!.blur();\n        }, () => {\n            // Verify blur results.\n            if (this._textInput1Ref!.isFocused()) {\n                this._testResult!.errors.push('Expected text input to be blurred');\n            }\n\n            // Test setValue API.\n            this._textInput1Ref!.focus();\n            this._textInput1Ref!.setValue(_testValue1);\n        }, () => {\n            // Verify the results of setValue.\n            if (this.state.testInput !== _testValue1) {\n                this._testResult!.errors.push('Call to setValue did not work as expected');\n            }\n\n            // Test selectRange API.\n            this._textInput1Ref!.selectRange(2, 7);\n        }, () => {\n            // Verify the results of selectRange API.\n            let selectionRange = this._textInput1Ref!.getSelectionRange();\n            if (selectionRange.start !== 2 || selectionRange.end !== 7) {\n                this._testResult!.errors.push('Call to selectRange did not work as expected');\n            }\n\n            // Test selectAll API.\n            this._textInput1Ref!.selectAll();\n        }, () => {\n            // Verify the results of selectAll API.\n            let selectionRange = this._textInput1Ref!.getSelectionRange();\n            if (selectionRange.start !== 0 || selectionRange.end !== _testValue1.length) {\n                this._testResult!.errors.push('Call to selectAll did not work as expected');\n            }\n\n            // Test selectAll API.\n            this._textInput1Ref!.selectAll();\n        }];\n\n        // Are we done?\n        if (this._nextTestStage! >= testStages.length) {\n            this._testCompletion!(this._testResult!);\n        } else {\n            // Run the next stage after a brief delay.\n            _.delay(() => {\n                testStages[this._nextTestStage!]();\n                this._nextTestStage!++;\n                this._executeNextStage();\n            }, 200);\n        }\n    }\n\n    execute(complete: (result: TestResult) => void): void {\n        this._nextTestStage = 0;\n        this._testResult = new TestResult();\n        this._testCompletion = complete;\n\n        // Kick off the first stage.\n        this._executeNextStage();\n    }\n}\n\nclass TextInputApiTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'Components/TextInput/APIs';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <TextInputView ref={ onMount }/>\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let textInputView = component as TextInputView;\n\n        textInputView.execute(complete);\n    }\n}\n\nexport default new TextInputApiTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/TextInputInteractiveTest.tsx",
    "content": "/*\n* Tests the functionality of a TextInput component with\n* the help of user validation.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    resultContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        flexDirection: 'row',\n        alignItems: 'center',\n        alignSelf: 'stretch'\n    }),\n    resultText: RX.Styles.createTextStyle({\n        flex: -1,\n        marginLeft: 12,\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    textInput1: RX.Styles.createTextInputStyle({\n        flex: 1,\n        maxWidth: 200,\n        borderWidth: 1,\n        fontSize: CommonStyles.generalFontSize,\n        padding: 4,\n        borderColor: '#999'\n    }),\n    textInput2: RX.Styles.createTextInputStyle({\n        flex: 1,\n        width: 200,\n        borderWidth: 1,\n        fontSize: CommonStyles.generalFontSize,\n        color: 'green',\n        padding: 4,\n        borderColor: '#999'\n    }),\n    textInput3: RX.Styles.createTextInputStyle({\n        margin: 12,\n        width: 200,\n        height: 100,\n        borderWidth: 1,\n        fontSize: CommonStyles.generalFontSize,\n        padding: 4,\n        borderColor: '#999'\n    }),\n    textInput7: RX.Styles.createTextInputStyle({\n        flex: 1,\n        maxWidth: 200,\n        borderWidth: 1,\n        fontSize: CommonStyles.generalFontSize,\n        padding: 4,\n        borderColor: '#999',\n        shadowColor: 'red',\n        shadowOffset: { width: 1, height: 4 },\n        shadowRadius: 5\n    }),\n    eventHistoryScrollView: RX.Styles.createScrollViewStyle({\n        margin: 12,\n        padding: 8,\n        alignSelf: 'stretch',\n        height: 100,\n        backgroundColor: '#eee'\n    }),\n    eventHistoryText: RX.Styles.createTextStyle({\n        fontSize: 12,\n    }),\n    placeholder: RX.Styles.createViewStyle({\n        width: 1,\n        height: 300\n    }),\n    button: RX.Styles.createButtonStyle({\n        alignSelf: 'flex-start',\n        borderWidth: 1,\n        borderColor: '#666',\n        borderRadius: 6,\n        paddingHorizontal: 8,\n        paddingVertical: 4,\n        marginTop: 4\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: '#666'\n    })\n};\n\ninterface TextInputViewState {\n    test1Input: string;\n    test2Input: string;\n    test6Input: string;\n    test6EventHistory: string[];\n    test7Input: string;\n}\n\nclass TextInputView extends RX.Component<RX.CommonProps, TextInputViewState> {\n    private _multilineTextInput: RX.TextInput | null = null;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1Input: '',\n            test2Input: '',\n            test6Input: '',\n            test6EventHistory: [],\n            test7Input: ''\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This is a single-line text input box. ' +\n                          'The placeholder text is light blue. ' +\n                          'Input is limited to 8 characters in length. ' +\n                          'Text is centered. ' +\n                          'Auto-correct is disabled. ' +\n                          'Auto-focus is enabled. ' +\n                          'The return key type (for on-screen keyboards) is \"done\". ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput1 }\n                        placeholder={ 'Type here' }\n                        placeholderTextColor={ 'blue' }\n                        maxLength={ 10 }\n                        returnKeyType={ 'done' }\n                        value={ this.state.test1Input }\n                        autoCorrect={ false }\n                        accessibilityId={ 'TextInputViewTextInput' }\n                        autoFocus={ true }\n                        onChangeText={ val => this.setState({ test1Input: val }) }\n                    />\n                    <RX.Text style={ _styles.resultText } numberOfLines={ 1 }>\n                        { this.state.test1Input }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This is a multi-line text input box. ' +\n                          'For on-screen keyboards, the return key should be \"go\", and the keyboard should use a light theme. ' +\n                          'Text should be green. ' +\n                          'It supports auto correct, auto capitalization (individual words), and spell checking. ' }\n                    </RX.Text>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Press this button to set the focus to the multi-line text input box below. ' }\n                    </RX.Text>\n                    <RX.Button style={ _styles.button } onPress={ this._onPressFocus }>\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Focus' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        ref={ this._onMountTextInput }\n                        style={ _styles.textInput2 }\n                        placeholder={ 'Placeholder text' }\n                        returnKeyType={ 'go' }\n                        value={ this.state.test2Input }\n                        onChangeText={ val => this.setState({ test2Input: val }) }\n                        allowFontScaling={ false }\n                        autoCorrect={ true }\n                        autoCapitalize={ 'words' }\n                        spellCheck={ true }\n                        blurOnSubmit={ true }\n                        editable={ true }\n                        keyboardAppearance={ 'light' }\n                        multiline={ true }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This text input box uses the \"defaultValue\" to specify the initial value. ' +\n                          'The keyboard type is \"numeric\". ' +\n                          'The text is right-justified. ' +\n                          'The return key type (for on-screen keyboards) is \"send\". ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput1 }\n                        placeholder={ 'PIN' }\n                        returnKeyType={ 'send' }\n                        keyboardType={ 'numeric' }\n                        defaultValue={ '1234' }\n                        disableFullscreenUI={ true }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This text input box is not editable. ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput1 }\n                        placeholder={ 'Disabled' }\n                        editable={ false }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This text input box obscures the text (for password entry). ' +\n                          'It uses an \"email-address\" keyboard type. ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput1 }\n                        placeholder={ 'Enter password' }\n                        secureTextEntry={ true }\n                        keyboardType={ 'email-address' }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation6' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This is a multi-line text input box. ' +\n                          'It records and displays all events (displayed in reverse order). Try focus, blur, typing, ' +\n                          'pasting, scrolling, changing selections, and submitting (hit return). ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.TextInput\n                    style={ _styles.textInput3 }\n                    autoCorrect={ false }\n                    value={ this.state.test6Input }\n                    onChangeText={ this._onChangeTextTest6 }\n                    onKeyPress={ this._onKeyPressTest6 }\n                    onBlur={ this._onBlurTest6 }\n                    onFocus={ this._onFocusTest6 }\n                    onPaste={ this._onPasteTest6 }\n                    onScroll={ this._onScrollTest6 }\n                    onSelectionChange={ this._onSelectionChangeTest6 }\n                    onSubmitEditing={ this._onSubmitEditingTest6 }\n                    multiline={ true }\n                />\n                <RX.View style={ _styles.eventHistoryScrollView }>\n                    <RX.ScrollView>\n                        <RX.Text style={ _styles.eventHistoryText }>\n                            { this.state.test6EventHistory.length ?\n                                this.state.test6EventHistory.join('\\n') :\n                                'Event history will appear here'\n                            }\n                        </RX.Text>\n                    </RX.ScrollView>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation7' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The text entered in this input box will have a red shadow.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput7 }\n                        value={ this.state.test7Input }\n                        onChangeText={ val => this.setState({ test7Input: val }) }\n                    />\n                    <RX.Text style={ _styles.resultText }>\n                        { this.state.test1Input }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation8' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This text input box uses the \"clearButtonMode\" prop to hide the `X` that appears while typing. ' +\n                          '(This is only relevant to iOS and UWP apps). ' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.TextInput\n                        style={ _styles.textInput1 }\n                        placeholder={ 'This box will not have the usual `X` delete button as you type.' }\n                        clearButtonMode={ 'never' }\n                    />\n                </RX.View>\n\n                <RX.View style={ _styles.placeholder }/>\n\n            </RX.View>\n        );\n    }\n\n    private _onMountTextInput = (elem: any) => {\n        this._multilineTextInput = elem;\n    }\n\n    private _onPressFocus = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n        if (this._multilineTextInput) {\n            this._multilineTextInput.focus();\n        }\n    }\n\n    private _onChangeTextTest6 = (value: string) => {\n        this.setState({\n            test6Input: value\n        });\n\n        this._appendHistoryTest6('onChangeText');\n    }\n\n    private _onKeyPressTest6 = (e: RX.Types.KeyboardEvent) => {\n        let eventText = 'onKeyPress: ' + 'Key = \"' + e.key + '\", Code = ' + e.keyCode;\n        this._appendHistoryTest6(eventText);\n    }\n\n    private _onPasteTest6 = (e: RX.Types.ClipboardEvent) => {\n        this._appendHistoryTest6('onPaste');\n    }\n\n    private _onScrollTest6 = (newScrollLeft: number, newScrollTop: number) => {\n        this._appendHistoryTest6('onSroll: (left=' + newScrollLeft +\n            ', top=' + newScrollTop + ')');\n    }\n\n    private _onBlurTest6 = (e: RX.Types.FocusEvent) => {\n        this._appendHistoryTest6(`onBlur: ${this._focusEventToString(e)}`);\n    }\n\n    private _onFocusTest6 = (e: RX.Types.FocusEvent) => {\n        this._appendHistoryTest6(`onFocus: ${this._focusEventToString(e)}`);\n    }\n\n    private _focusEventToString = ({ bubbles, cancelable, defaultPrevented, timeStamp, nativeEvent }: RX.Types.FocusEvent) => {\n        return JSON.stringify({ bubbles, cancelable, defaultPrevented, timeStamp, nativeEvent });\n    }\n\n    private _onSelectionChangeTest6 = (start: number, end: number) => {\n        this._appendHistoryTest6('onSelectionChange: [' + start + ', ' + end + ']');\n    }\n\n    private _onSubmitEditingTest6 = () => {\n        this._appendHistoryTest6('onSubmitEditing');\n    }\n\n    private _appendHistoryTest6(newLine: string) {\n        // Prepend it so we can always see the latest.\n        // Limit to the last 20 items.\n        let newHistory = [newLine].concat(_.slice(this.state.test6EventHistory, 0, 18));\n        this.setState({\n            test6EventHistory: newHistory\n        });\n    }\n}\n\nclass TextInputTest implements Test {\n    getPath(): string {\n        return 'Components/TextInput/Interactive';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <TextInputView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new TextInputTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/TextTest.tsx",
    "content": "/*\n* Tests the functionality of a Text component with\n* the help of user validation.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    resultContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',        \n        marginHorizontal: 36,\n        marginVertical: 12\n    }),\n    test1Text: RX.Styles.createTextStyle({\n        fontSize: 24,\n        color: '#006'\n    }),\n    test1Sub2Text: RX.Styles.createTextStyle({\n        fontSize: 12,\n        color: 'black',\n        textDecorationLine: 'line-through',\n        textDecorationStyle: 'dotted',\n        textDecorationColor: 'green'\n    }),\n    test1Sub3Text: RX.Styles.createTextStyle({\n        fontWeight: 'bold',\n        fontStyle: 'italic',\n        letterSpacing: 2,\n        textDecorationLine: 'underline',\n        textDecorationStyle: 'double',\n        textDecorationColor: 'red'\n    }),\n    test2Text: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize\n    }),\n    test7Text: RX.Styles.createTextStyle({\n        fontSize: 16\n    }),\n    test9Text: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        shadowColor: 'red',\n        shadowOffset: { width: 1, height: 4 },\n        shadowRadius: 5\n    }),\n    inlineImageContainer: RX.Styles.createViewStyle({\n        height: 24,\n        width: 20,\n        marginHorizontal: 8\n    }),\n    inlineImageContainerOffset: RX.Styles.createViewStyle({\n        marginBottom: -8\n    }),\n    inlineImage: RX.Styles.createImageStyle({\n        height: 24,\n        width: 20\n    }),\n    test8Text: RX.Styles.createTextStyle({\n        fontSize: 16,\n        lineHeight: 48,\n        textDecorationLine: 'underline'\n    }),\n    selectTextContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        flexDirection: 'row',\n        alignItems: 'center'\n    }),\n    testSelectText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize\n    }),\n    selectTextButton: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        margin: 20,\n        padding: 12,\n        borderRadius: 8,\n        borderColor: 'black'\n    }),\n    testWarnText: RX.Styles.createTextStyle({\n        color: 'red'\n    })\n};\n\ninterface TextViewState {\n    test5ColorIndex: number;\n    selectedText: string;\n}\n\nconst _dynamicColors = ['black', 'red', 'green', 'blue'];\n\nclass TextView extends RX.Component<RX.CommonProps, TextViewState> {\n    private _selectionText: RX.Text | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test5ColorIndex: 0,\n            selectedText: ''\n        };\n    }\n\n    render() {\n        let test5Style = RX.Styles.createTextStyle({\n            color: _dynamicColors[this.state.test5ColorIndex]\n        }, false);\n\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Text components can be nested and inherit some of their style properties from their parent. ' +\n                          'This is an example of three sub-strings displayed together. ' +\n                          'The second substring has a green dotted strike-through, and the third ' +\n                          'substring has 2x spacing and a red double underline.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text\n                        style={ _styles.test1Text }\n                        importantForAccessibility={ RX.Types.ImportantForAccessibility.Yes }\n                        id={ 'test1' }\n                        allowFontScaling={ false }\n                        testId={ 'text1' }\n                    >\n                        <RX.Text>\n                            { 'Substring 1 ' }\n                        </RX.Text>\n                        <RX.Text style={ _styles.test1Sub2Text }>\n                            { 'substring 2 ' }\n                        </RX.Text>\n                        <RX.Text style={ _styles.test1Sub3Text }>\n                            { 'substring 3 ' }\n                        </RX.Text>\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation2' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Text can wrap to cover multiple lines or constrained to a specified ' +\n                          'number of lines (and truncated if necessary).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text }>\n                        { 'A really long string that will wrap to multiple lines if necessary ' +\n                          'but only if there is insufficient space. ' +\n                          'A really long string that will wrap to multiple lines if necessary ' +\n                          'but only if there is insufficient space.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } numberOfLines={ 2 }>\n                    { 'A really long string that will wrap to two lines if necessary ' +\n                          'but only if there is insufficient space. ' +\n                          'A really long string that will wrap to two lines if necessary ' +\n                          'but only if there is insufficient space. ' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation3' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Truncation can be done at the head, middle or tail.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } numberOfLines={ 1 } ellipsizeMode={ 'head' }>\n                        { 'A really long string that will trunctate to one line if necessary ' +\n                        'but only if there is insufficient space. (Head truncation)' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } numberOfLines={ 1 } ellipsizeMode={ 'middle' }>\n                        { '(Middle truncation) A really long string that will trunctate to one line if necessary ' +\n                        'but only if there is insufficient space.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } numberOfLines={ 1 } ellipsizeMode={ 'tail' }>\n                        { '(Tail truncation) A really long string that will trunctate to one line if necessary ' +\n                        'but only if there is insufficient space.' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation4' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'By default, text is not selectable (on mouse-based systems).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text }>\n                        { 'This text is not selectable' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } selectable={ true }>\n                        { 'This text is selectable' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation5' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Click or tap on the text below to change its color.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text\n                        style={ [_styles.test2Text, test5Style] }\n                        onPress={ this._onPressTest5 }\n                    >\n                        { 'Text with an onPress handler' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation6' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'On some platforms (iOS and Android), text can be scaled according to user preferences.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text } allowFontScaling={ false }>\n                        { 'This text does not scale regardless of system settings' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text }>\n                        { 'This text scales based on system settings' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test2Text }>\n                        { 'This text scales up to 1.2x, no more' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation7' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Fixed-size views can be inlined within a text block.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    { RX.Platform.getType() !== 'web' ? (\n                        <RX.Text style={ _styles.testWarnText }>\n                            { 'Test disabled due to broken RN 0.57 support of inline views' } \n                        </RX.Text>\n                    ) : ( \n                        <RX.Text style={ _styles.test7Text }>\n                            <RX.Text>\n                                { 'Do you have a bright ' }\n                            </RX.Text>\n                            <RX.View style={ _styles.inlineImageContainer }>\n                                <RX.Image\n                                    source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                                    resizeMode={ 'contain' }\n                                    style={ _styles.inlineImage }\n                                />\n                            </RX.View>\n                            <RX.Text>\n                                { ' to share?' }\n                            </RX.Text>\n                        </RX.Text>\n                    )}\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation8' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Max line height can be adjusted for multi-line text blocks.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    { RX.Platform.getType() !== 'web' ? (\n                        <RX.Text style={ _styles.testWarnText }>\n                            { 'Test disabled due to broken RN 0.57 support of inline views' } \n                        </RX.Text>\n                    ) : ( \n                        <RX.Text style={ _styles.test8Text }>\n                            <RX.Text>\n                                { 'This is a really long string with a ' }\n                            </RX.Text>\n                            <RX.View style={ [_styles.inlineImageContainer, _styles.inlineImageContainerOffset] }>\n                                <RX.Image\n                                    source={ 'https://microsoft.github.io/reactxp/img/tests/bulb.jpg' }\n                                    resizeMode={ 'contain' }\n                                    style={ _styles.inlineImage }\n                                />\n                            </RX.View>\n                            <RX.Text>\n                                { ' light bulb inlined within it. It is meant to demonstrate a' +\n                                ' larger-than-normal line height.' }\n                            </RX.Text>\n                        </RX.Text>\n                    )}\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation9' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Text shadows can be applied with the shadow style props.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.resultContainer }>\n                    <RX.Text style={ _styles.test9Text }>\n                        { 'Text with a red shadow.' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.selectTextContainer }>\n                    <RX.Text \n                        style={ _styles.testSelectText } \n                        selectable={ true }\n                        ref={ (comp: any) => { this._selectionText = comp; } }\n                        >\n                        { 'Select from this text.' }\n                    </RX.Text>\n                    <RX.Button\n                        style = { _styles.selectTextButton }\n                        onPress={ this._onPressCopySelectedText }\n                    >\n                        <RX.Text>\n                            { 'Copy selected.' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Text style={ _styles.testSelectText }>\n                        { 'Copied selected text:' }\n                    </RX.Text>\n                    <RX.Text style={ _styles.testSelectText }>\n                        { this.state.selectedText }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onPressTest5 = () => {\n        let newIndex = (this.state.test5ColorIndex + 1) % _dynamicColors.length;\n        this.setState({ test5ColorIndex: newIndex });\n    }\n\n    private _onPressCopySelectedText = () => {\n        if (this._selectionText) {\n            var selectedText: string = '';\n            // TODO Enable when ReactXP dependency is updated.\n            // selectedText = this._selectionText.getSelectedText();\n            this.setState({ selectedText: selectedText });\n        }\n    }\n}\n\nclass TextTest implements Test {\n    getPath(): string {\n        return 'Components/Text';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <TextView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new TextTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/UserInterfaceTest.tsx",
    "content": "/*\n* Tests the RX.UserInterface APIs in an automated manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { AutoExecutableTest, TestResult, TestType } from '../Test';\nimport { approxEquals } from '../Utilities';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    parentContainer: RX.Styles.createViewStyle({\n        marginHorizontal: 32,\n        height: 100,\n        width: 100,\n        padding: 12,\n        backgroundColor: '#eee'\n    }),\n    childView: RX.Styles.createViewStyle({\n        height: 24,\n        width: 24,\n        margin: 8,\n        backgroundColor: 'red'\n    })\n};\n\ninterface UserInterfaceState {\n}\n\nclass UserInterfaceView extends RX.Component<RX.CommonProps, UserInterfaceState> {\n    private _isMounted = false;\n    private _parentView: RX.View | undefined;\n    private _childView: RX.View | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n        };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container }>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'This test executes the various APIs in the UserInterface namespace. ' +\n                          'It uses the views below to test the measurement APIs.' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View\n                    style={ _styles.parentContainer }\n                    ref={ (comp: any) => { this._parentView = comp; } }\n                >\n                    <RX.View\n                        style={ _styles.childView }\n                        ref={ (comp: any) => { this._childView = comp; } }\n                    >\n                    </RX.View>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    execute(complete: (result: TestResult) => void) {\n        let result = new TestResult();\n\n        // Start by calling all of the synchronous APIs.\n\n        // We can't call setMainView because it is called as part of\n        // the app's initialization.\n\n        // We can't call useCustomScrollbars because it must be called\n        // only once before setMainView.\n\n        // measureWindow\n        let screenSize = RX.UserInterface.measureWindow();\n\n        // isHighPixelDensityScreen\n        let isHighDensity = RX.UserInterface.isHighPixelDensityScreen();\n\n        // dismissKeyboard\n        RX.UserInterface.dismissKeyboard();\n\n        // enableTouchLatencyEvents\n        RX.UserInterface.enableTouchLatencyEvents(2000);\n        RX.UserInterface.enableTouchLatencyEvents(0);\n\n        // isNavigatingWithKeyboard\n        let isUsingKeyboard = RX.UserInterface.isNavigatingWithKeyboard();\n\n        // Subscribe to events\n        let sizeMultiplierEvent = RX.UserInterface.contentSizeMultiplierChangedEvent.subscribe(multiplier => {\n            // Nothing to do\n        });\n        sizeMultiplierEvent.unsubscribe();\n\n        let touchLatencyEvent = RX.UserInterface.touchLatencyEvent.subscribe(observedLatency => {\n            // Nothing to do\n        });\n        touchLatencyEvent.unsubscribe();\n\n        let keyboardNavigationEvent = RX.UserInterface.keyboardNavigationEvent.subscribe(isNav => {\n            // Nothing to do\n        });\n        keyboardNavigationEvent.unsubscribe();\n\n        let parentAbsolute: RX.Types.LayoutInfo;\n        let childAbsolute: RX.Types.LayoutInfo;\n        let childRelative: RX.Types.LayoutInfo;\n\n        // Now execute the async APIs.\n        let measureTask = RX.UserInterface.measureLayoutRelativeToWindow(this._parentView!).then(layoutInfo => {\n            parentAbsolute = layoutInfo;\n            return RX.UserInterface.measureLayoutRelativeToWindow(this._childView!);\n        }).then(layoutInfo => {\n            childAbsolute = layoutInfo;\n            return RX.UserInterface.measureLayoutRelativeToAncestor(this._childView!, this._parentView!);\n        }).then(layoutInfo => {\n            childRelative = layoutInfo;\n\n            if (!approxEquals(parentAbsolute.width, 100) || !approxEquals(parentAbsolute.height, 100)) {\n                result.errors.push(`Expected parent view to be 100x100. Got ${parentAbsolute.width}x${parentAbsolute.height}`);\n            }\n\n            if (!approxEquals(childAbsolute.width, 24) || !approxEquals(childAbsolute.height, 24)) {\n                result.errors.push(`Expected child view to be 24x24. Got ${childAbsolute.width}x${childAbsolute.height}`);\n            }\n\n            const xValue = childAbsolute.x - parentAbsolute.x;\n            const yValue = childAbsolute.y - parentAbsolute.y;\n            if (!approxEquals(xValue, 20) || !approxEquals(yValue, 20)) {\n                result.errors.push(`Expected absolute position of child view to be 20x20 from parent. Got ${xValue}x${yValue}`);\n            }\n\n            if (!approxEquals(childRelative.x, 20) || !approxEquals(childRelative.y, 20)) {\n                result.errors.push(`Expected relative position of child view to be 20x20 from parent. ` +\n                    `Got ${childRelative.x}x${childRelative.y}`);\n            }\n        }).catch(err => {\n            result.errors.push('Error occurred when measuring views.');\n        });\n\n        // Execute the content size multiplier API.\n        let multiplierTask = RX.UserInterface.getContentSizeMultiplier().then(mult => {\n            // Nothing to do.\n        }).catch(err => {\n            result.errors.push('Error occurred when calling RX.UserInterface.getContentSizeMultiplier');\n        });\n\n        // Wait for all async tasks to complete.\n        Promise.all([measureTask, multiplierTask]).then(() => {\n            // Mark the test as complete.\n            complete(result);\n        });\n    }\n}\n\nclass UserInterfaceTest implements AutoExecutableTest {\n    getPath(): string {\n        return 'APIs/UserInterface';\n    }\n\n    getTestType(): TestType {\n        return TestType.AutoExecutable;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <UserInterfaceView\n                ref={ onMount }\n            />\n        );\n    }\n\n    execute(component: any, complete: (result: TestResult) => void): void {\n        let UserInterfaceView = component as UserInterfaceView;\n        UserInterfaceView.execute(complete);\n    }\n}\n\nexport default new UserInterfaceTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/UserPresenceTest.tsx",
    "content": "/*\n* Tests the RX.UserPresence APIs in an interactive manner.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        alignItems: 'flex-start'\n    }),\n    textContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        fontSize: 24,\n        fontWeight: 'bold',\n        color: 'black'\n    })\n};\n\ninterface UserPresenceViewState {\n    isUserPresent?: boolean;\n}\n\nclass UserPresenceView extends RX.Component<RX.CommonProps, UserPresenceViewState> {\n    private _presencesChangedEvent: RX.Types.SubscriptionToken | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            isUserPresent: RX.UserPresence.isUserPresent()\n        };\n    }\n\n    componentDidMount() {\n        this._presencesChangedEvent = RX.UserPresence.userPresenceChangedEvent.subscribe(isPresent => {\n            this.setState({\n                isUserPresent: isPresent\n            });\n        });\n    }\n\n    componentWillUnmount() {\n        if (this._presencesChangedEvent) {\n            this._presencesChangedEvent.unsubscribe();\n        }\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.textContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Is the user currently present? Depending on the platform, placing the app in ' +\n                          'the background or leaving it idle may change this state.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer } key={ 'platform' }>\n                    <RX.Text style={ _styles.labelText }>\n                        { this.state.isUserPresent ? 'Present' : 'Away' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass UserPresenceTest implements Test {\n    getPath(): string {\n        return 'APIs/UserPresence';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <UserPresenceView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new UserPresenceTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ViewBasicTest.tsx",
    "content": "/*\n* Tests the basic functionality of a View component.\n*/\n\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    view1: RX.Styles.createViewStyle({\n        margin: 20,\n        backgroundColor: '#ccf',\n        transform: [{\n            rotate: '5deg'\n        }]\n    }),\n    view2: RX.Styles.createViewStyle({\n        margin: 20,\n        backgroundColor: 'orange',\n        borderWidth: 2,\n        borderColor: 'black'\n    }),\n    view2MarginOverride: RX.Styles.createViewStyle({\n        marginLeft: 30,\n        marginRight: 10\n    }),\n    view3: RX.Styles.createViewStyle({\n        margin: 20,\n        backgroundColor: 'yellow',\n        borderWidth: 1,\n        borderColor: 'green',\n        borderBottomLeftRadius: 8,\n        borderBottomRightRadius: 4,\n        borderTopLeftRadius: 2,\n        borderTopRightRadius: 10,\n        alignItems: 'center',\n        justifyContent: 'center'\n    }),\n    view4: RX.Styles.createViewStyle({\n        backgroundColor: 'green',\n        width: 50,\n        height: 50,\n        margin: 20,\n        shadowColor: 'red',\n        shadowOffset: { width: 1, height: 4 },\n        shadowRadius: 5\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelContainer: RX.Styles.createViewStyle({\n        alignSelf: 'center',\n        margin: 8\n    }),\n    labelText: RX.Styles.createTextStyle({\n        margin: 8,\n        fontSize: CommonStyles.generalFontSize,\n    })\n};\n\nfunction accessibilityLabelAndImportantForAccessibilityTestUI(important: RX.Types.ImportantForAccessibility) {\n    return (\n        <RX.View\n            style={ _styles.labelContainer }\n            importantForAccessibility={ important }\n        >\n            <RX.View\n                style={ _styles.labelContainer }\n                importantForAccessibility={ RX.Types.ImportantForAccessibility.Auto}\n            >\n                <RX.Text style={ _styles.labelText }>\n                    { 'Alpha' }\n                </RX.Text>\n            </RX.View>\n            <RX.View style={ _styles.labelContainer }>\n                <RX.View\n                    style={ _styles.labelContainer }\n                    importantForAccessibility={ RX.Types.ImportantForAccessibility.No }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Beta' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.labelContainer }\n                    accessibilityLabel={ 'Gamma' }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Orange' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n            <RX.Text style={ _styles.labelText }>\n                { 'Delta' }\n            </RX.Text>\n            <RX.View\n                style={ _styles.labelContainer }\n                importantForAccessibility={ RX.Types.ImportantForAccessibility.NoHideDescendants }\n            >\n                <RX.View\n                    style={ _styles.labelContainer }\n                    importantForAccessibility={ RX.Types.ImportantForAccessibility.Yes }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Epsilon' }\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        </RX.View>\n    );\n}\n\nclass BasicView extends RX.Component<RX.CommonProps, RX.Stateless> {\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation1' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'A variety of views with different styles should appear below. ' +\n                          'Interact with them to test.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.view1 }\n                    shouldRasterizeIOS={ true }\n                    viewLayerTypeAndroid={ 'hardware' }\n                    tabIndex={ 1 }\n                    title={ 'shouldRasterizeIOS = true\\nviewLayerTypeAndroid = true' }\n                    onLongPress={ () => {\n                        // no-op\n                    } }\n                    id={ 'testId' }\n                    ariaLabelledBy={ 'aria label' }\n                    ariaRoleDescription={ 'custom role' }\n                    accessibilityLabel={ 'accessibility label' }\n                    accessibilityLiveRegion={ RX.Types.AccessibilityLiveRegion.Polite }\n                    importantForAccessibility={ RX.Types.ImportantForAccessibility.Yes }\n                    testId={ 'view1' }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Long press me' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View\n                    style={ _styles.view2 }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                    activeOpacity={ 0.5 }\n                    underlayColor={ '#fee' }\n                    tabIndex={ 3 }\n                >\n                    <RX.Text style={ [_styles.view2MarginOverride, _styles.labelText] }>\n                        { 'Press me' }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View\n                    style={ _styles.view3 }\n                    onPress={ () => {\n                        // no-op\n                    } }\n                    disableTouchOpacityAnimation={ true }\n                    tabIndex={ 2 }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'Press me (no opacity change)\\n' +\n                          'I have differing border radii' }\n                    </RX.Text>\n                </RX.View>\n\n                {/* View's accessibilityLabel (both explicit and automatic recursive generation)\n                  * and importantForAccessibility all possible values and hierarchical combinations. */}\n\n                <RX.View\n                    style={ _styles.explainTextContainer }\n                    key={ 'explanation2' }\n                >\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Should be read by screen reader as a single text element \\\"Alpha Beta Gamma Delta\\\" ' +\n                          'and screen reader should not be able to get to individual texts.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    { accessibilityLabelAndImportantForAccessibilityTestUI(RX.Types.ImportantForAccessibility.Yes) }\n                </RX.View>\n\n                <RX.View\n                    style={ _styles.explainTextContainer }\n                    key={ 'explanation3' }\n                >\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Should be read by screen reader as four separate text elements: ' +\n                          '\\\"Alpha\\\", \\\"Beta\\\", \\\"Gamma\\\", \\\"Delta\\\".' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.labelContainer }>\n                    { accessibilityLabelAndImportantForAccessibilityTestUI(RX.Types.ImportantForAccessibility.No) }\n                </RX.View>\n\n                <RX.View\n                    style={ _styles.explainTextContainer }\n                    key={ 'explanation4' }\n                >\n                    <RX.Text style={ _styles.explainText }>\n                        { 'Box shadow can be applied with the shadow props.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.view4 } />\n            </RX.View>\n        );\n    }\n}\n\n// TODO - need to add tests for the following props:\n// blockPointerEvents: boolean = false; // iOS and Android only\n// ignorePointerEvents: boolean = false; // web only\n// restrictFocusWithin: boolean = false; // web only\n// limitFocusWithin: LimitFocusType = LimitFocusType.Unlimited;\n// importantForLayout: boolean = false; // web only\n// onContextMenu: (e: React.SyntheticEvent) => void;\n// onMoveShouldSetResponder: (e: React.SyntheticEvent) => boolean =\n// onMoveShouldSetResponderCapture: (e: React.SyntheticEvent) => boolean =\n// onResponderGrant: (e: React.SyntheticEvent) => void = undefined;\n// onResponderReject: (e: React.SyntheticEvent) => void = undefined;\n// onResponderRelease: (e: React.SyntheticEvent) => void = undefined;\n// onResponderStart: (e: React.TouchEvent) => void = undefined;\n// onResponderMove: (e: React.TouchEvent) => void = undefined;\n// onResponderEnd: (e: React.TouchEvent) => void = undefined;\n// onResponderTerminate: (e: React.SyntheticEvent) => void = undefined;\n// onResponderTerminationRequest: (e: React.SyntheticEvent) => boolean =\n// onStartShouldSetResponder: (e: React.SyntheticEvent) => boolean =\n// onStartShouldSetResponderCapture: (e: React.SyntheticEvent) => boolean =\n// onLayout: (e: ViewOnLayoutEvent) => void = undefined;\n\n// TODO - need to add tests for the following methods:\n// focus\n// setFocusRestricted\n// setFocusLimited\n\nclass ViewBasicTest implements Test {\n    getPath(): string {\n        return 'Components/View/Basic';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <BasicView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new ViewBasicTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ViewMouseTest.tsx",
    "content": "/*\n* Tests mouse/touch/pointer functionality of a View component.\n*/\n\nimport * as _ from 'lodash';\nimport * as RX from 'reactxp';\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        maxWidth: 800\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        margin: 8,\n        fontSize: CommonStyles.generalFontSize,\n    }),\n    testContainer: RX.Styles.createTextStyle({\n        backgroundColor: '#eee',\n        borderColor: 'black',\n        borderWidth: 1,\n        margin: 20,\n    }),\n\n    row: RX.Styles.createViewStyle({\n        flexDirection: 'row'\n    }),\n    outerPointerEventsBox: RX.Styles.createViewStyle({\n        width: 200,\n        height: 200,\n        backgroundColor: '#AAAAAA',\n        alignSelf: 'center',\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    outerPointerEventsBoxHover: RX.Styles.createViewStyle({\n        width: 200,\n        height: 200,\n        backgroundColor: 'yellow',\n        alignSelf: 'center',\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    innerPointerEventsBox: RX.Styles.createViewStyle({\n        width: 100,\n        height: 100,\n        backgroundColor: '#333333',\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    innerPointerEventsBoxHover: RX.Styles.createViewStyle({\n        width: 100,\n        height: 100,\n        backgroundColor: 'red',\n        justifyContent: 'center',\n        alignItems: 'center'\n    })\n};\n\ninterface MouseViewState {\n    mouseEnterEvent?: RX.Types.MouseEvent;\n    mouseLeaveEvent?: RX.Types.MouseEvent;\n    mouseOverEvent?: RX.Types.MouseEvent;\n    mouseMoveEvent?: RX.Types.MouseEvent;\n    blockPointerEvents: boolean;\n    ignorePointerEvents: boolean;\n    mouseOverOuter: boolean;\n    mouseOverInner: boolean;\n}\n\nclass MouseView extends RX.Component<RX.CommonProps, MouseViewState> {\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n        this.state = { \n            blockPointerEvents: false,\n            ignorePointerEvents: false,\n            mouseOverOuter: false,\n            mouseOverInner: false\n        };\n    }\n\n    private static getMouseEventText(mouseEvent?: RX.Types.MouseEvent): string {\n        if (mouseEvent) {\n            return 'altKey = ' + mouseEvent.altKey +\n                ' button = ' + mouseEvent.button +\n                ' clientX = ' + mouseEvent.clientX +\n                ' clientY = ' + mouseEvent.clientY +\n                ' ctrlKey = ' + mouseEvent.ctrlKey +\n                ' metaKey = ' + mouseEvent.metaKey +\n                ' shiftKey = ' + mouseEvent.shiftKey +\n                ' pageX = ' + mouseEvent.pageX +\n                ' pageY = ' + mouseEvent.pageY;\n        }\n        return 'N/A';\n    }\n\n    private toggleBlockPointerEvents = () => {\n        this.setState((prevState) => ({\n            blockPointerEvents: !prevState.blockPointerEvents\n        }));\n    }\n\n    private toggleIgnorePointerEvents = () => {\n        this.setState((prevState) => ({\n            ignorePointerEvents: !prevState.ignorePointerEvents\n        }));\n    }\n\n    private onOuterMouseEnter = () => {\n        this.setState({ mouseOverOuter: true });\n    }\n    private onOuterMouseLeave = () => {\n        this.setState({ mouseOverOuter: false });\n    }    \n    private onInnerMouseEnter = (e: RX.Types.MouseEvent) => {\n        this.setState({ mouseOverInner: true });\n    }\n    private onInnerMouseLeave = (e: RX.Types.MouseEvent) => {\n        this.setState({ mouseOverInner: false });\n    }\n\n    render(): any {\n        return (\n            <RX.View>\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The view below shows textual representation of the last mouse events it has received.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.testContainer }\n                    onMouseEnter={ e => this.setState({ mouseEnterEvent: _.clone(e) }) }\n                    onMouseLeave={ e => this.setState({ mouseLeaveEvent: _.clone(e) }) }\n                    onMouseOver={ e => this.setState({ mouseOverEvent: _.clone(e) }) }\n                    onMouseMove={ e => this.setState({ mouseMoveEvent: _.clone(e) }) }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'onMouseEnter: ' + MouseView.getMouseEventText(this.state.mouseEnterEvent) }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'onMouseLeave: ' + MouseView.getMouseEventText(this.state.mouseLeaveEvent) }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'onMouseOver: ' + MouseView.getMouseEventText(this.state.mouseOverEvent) }\n                    </RX.Text>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'onMouseMove: ' + MouseView.getMouseEventText(this.state.mouseMoveEvent) }\n                    </RX.Text>\n                </RX.View>\n\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        The views below are designed to test View.blockPointerEvents and View.ignorePointerEvents. \n                        Each view changes color when the mouse hovers over it.\n                    </RX.Text>\n                    <RX.Text style={ _styles.explainText }>\n                        blockPointerEvents is applied to the outer view. When it is enabled, mouse events should be blocked\n                        on both views and neither view should change color on hover.\n                    </RX.Text>\n                    <RX.Text style={ _styles.explainText }>\n                        ignorePointerEvents is applied to the outer view. When it is enabled, mouse events should only be blocked\n                        on the outer view. The inner view should trigger color changes on both views as the mouse events cascade upwards.\n                    </RX.Text>\n                </RX.View>\n                <RX.View \n                    style={this.state.mouseOverOuter ? _styles.outerPointerEventsBoxHover : _styles.outerPointerEventsBox}\n                    blockPointerEvents={this.state.blockPointerEvents}\n                    ignorePointerEvents={this.state.ignorePointerEvents}\n                    onMouseEnter={this.onOuterMouseEnter} \n                    onMouseLeave={this.onOuterMouseLeave}>\n                    <RX.Text>Outer View</RX.Text>\n                    <RX.View style={this.state.mouseOverInner ? _styles.innerPointerEventsBoxHover : _styles.innerPointerEventsBox}\n                        onMouseEnter={this.onInnerMouseEnter} \n                        onMouseLeave={this.onInnerMouseLeave}>\n                        <RX.Text>Inner View</RX.Text>\n                    </RX.View>\n                </RX.View>\n                <RX.View style={_styles.row}>\n                    <RX.Text style={ _styles.labelText }>\n                        { 'blockPointerEvents:' + (this.state.blockPointerEvents ? 'true' : 'false') }\n                    </RX.Text>\n                    <RX.Button onPress={this.toggleBlockPointerEvents}>\n                        <RX.Text style={ _styles.labelText }>\n                            { this.state.blockPointerEvents ? 'Enable' : 'Disable' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.View style={_styles.row}>\n                    <RX.Text style={ _styles.labelText }>\n                        ignorePointerEvents: {this.state.ignorePointerEvents ? 'true' : 'false' }\n                    </RX.Text>\n                    <RX.Button onPress={this.toggleIgnorePointerEvents}>\n                        <RX.Text style={ _styles.labelText }>\n                            {    this.state.ignorePointerEvents ? 'Enable' : 'Disable' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass ViewMouseTest implements Test {\n    getPath(): string {\n        return 'Components/View/Mouse';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <MouseView\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new ViewMouseTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/ViewTouchTest.tsx",
    "content": "/*\n* Tests mouse/touch/pointer functionality of a View component.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestType } from '../Test';\n\nconst _styles = {\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12,\n        alignItems: 'center'\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    labelText: RX.Styles.createTextStyle({\n        margin: 8,\n        fontSize: CommonStyles.generalFontSize,\n    }),\n    testContainer1: RX.Styles.createTextStyle({\n        backgroundColor: '#eee',\n        borderColor: 'black',\n        borderWidth: 1,\n        margin: 20,\n    }),\n    wrapper: RX.Styles.createViewStyle({\n        flexDirection: 'row'\n    }),\n    testContainer2: RX.Styles.createViewStyle({\n        flex: 1,\n        height: 120,\n        margin: 20,        \n        borderWidth: 1,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n    }),\n    testContainer3: RX.Styles.createViewStyle({\n        flex: 1,\n        height: 120,\n        margin: 20,        \n        borderWidth: 1,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n    }),\n    testContainer4: RX.Styles.createViewStyle({\n        flex: 1,\n        height: 150,\n        margin: 20,        \n        borderWidth: 1,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n    }),\n    testContainer5: RX.Styles.createViewStyle({\n        flex: 1,\n        margin: 20,        \n        padding: 20,        \n        borderWidth: 1,\n        backgroundColor: '#eee',\n        borderColor: 'black',\n    }),\n    successText: RX.Styles.createTextStyle({\n       color: 'green'\n    }),\n    success: RX.Styles.createViewStyle({\n        borderWidth: 2,\n        backgroundColor: 'green'\n    })\n};\n\ninterface TouchViewState {\n    view2TouchResponderTestStart: boolean;\n    view2TouchResponderTestGrant: boolean;\n    view2TouchResponderTestRelease: boolean;\n    view3TouchResponderTestStart: boolean;\n    view3TouchResponderTestGrant: boolean;\n    view3TouchResponderTestRelease: boolean;\n    touchPositionOnPage: {\n        x: number | null\n        y: number | null\n    };\n    nestedViewTouchTestParent: boolean;\n    nestedViewTouchTestChild: boolean;\n    pressEvent?: RX.Types.TouchEvent;\n    didCapturedTouchIn?: boolean;\n    didCapturedTouchMove?: boolean;\n}\n\nclass ViewTouch extends RX.Component<RX.CommonProps, TouchViewState> {\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n        this.state = {\n            view2TouchResponderTestStart: false,\n            view2TouchResponderTestGrant: false,\n            view2TouchResponderTestRelease: false,\n            view3TouchResponderTestStart: false,\n            view3TouchResponderTestGrant: false,\n            view3TouchResponderTestRelease: false,\n            touchPositionOnPage: {\n                x: null,\n                y: null\n            },\n            nestedViewTouchTestParent: false,\n            nestedViewTouchTestChild: false,\n        };\n    }\n\n    private static getTouchEventText(touchEvent?: RX.Types.TouchEvent): string {\n        if (touchEvent) {\n            return 'altKey = ' + touchEvent.altKey +\n                ' changedTouches.length = ' + (touchEvent.changedTouches && touchEvent.changedTouches.length) +\n                ' ctrlKey = ' + touchEvent.ctrlKey +\n                ' metaKey = ' + touchEvent.metaKey +\n                ' shiftKey = ' + touchEvent.shiftKey +\n                ' targetTouches = ' + touchEvent.targetTouches +\n                ' locationX = ' + touchEvent.locationX +\n                ' locationY = ' + touchEvent.locationY +\n                ' pageX = ' + touchEvent.pageX +\n                ' pageY = ' + touchEvent.pageY +\n                ' touches = ' + touchEvent.touches;\n        }\n        return 'N/A';\n    }\n\n    private isView2TouchResponderEventHasBeenAllFired = () => {\n        return this.state.view2TouchResponderTestStart &&\n            this.state.view2TouchResponderTestGrant && \n            this.state.view2TouchResponderTestRelease;\n    }\n\n    private isView3TouchResponderEventHasBeenAllFired = () => {\n        return this.state.view3TouchResponderTestStart &&\n            this.state.view3TouchResponderTestGrant && \n            this.state.view3TouchResponderTestRelease;\n    }\n\n    render(): any {\n        return (\n            <RX.View>\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The view below shows textual representation of the last mouse events it has received.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.testContainer1 }\n                    onPress={ e => this.setState({ pressEvent: _.clone(e.nativeEvent as RX.Types.TouchEvent)}) }\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { 'onPress: ' + ViewTouch.getTouchEventText(this.state.pressEvent) }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The two views below should turn green if they received the `StartShouldSetResponder` event.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={_styles.wrapper}>\n                    <RX.View\n                        style={[_styles.testContainer2, this.isView2TouchResponderEventHasBeenAllFired() ? _styles.success : undefined]}\n                        onStartShouldSetResponder={() => {\n                            this.setState({\n                                view2TouchResponderTestStart: true\n                            });\n                            return true;\n                        }}\n                        onResponderGrant={() => {\n                            this.setState({\n                                view2TouchResponderTestGrant: true\n                            });\n                        }}\n                        onResponderRelease={() => {\n                            this.setState({\n                                view2TouchResponderTestRelease: true\n                            });\n                        }}\n                    />\n                    <RX.View\n                        style={[_styles.testContainer3, this.isView3TouchResponderEventHasBeenAllFired() ? _styles.success : undefined]}\n                        onPress={() => null}\n                        onStartShouldSetResponder={() => {\n                            this.setState({\n                                view3TouchResponderTestStart: true\n                            });\n                            return true;\n                        }}\n                        onResponderGrant={() => {\n                            this.setState({\n                                view3TouchResponderTestGrant: true\n                            });\n                        }}\n                        onResponderRelease={() => {\n                            this.setState({\n                                view3TouchResponderTestRelease: true\n                            });\n                        }}\n                    />\n                </RX.View>\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'When touching this view, it will display the page coordinates of the touch position.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.testContainer4 }\n                    onResponderMove={ e => {\n                        const touch = e.touches[0];\n                        if (touch) {\n                            this.setState({ touchPositionOnPage: {\n                                x: Math.round(touch.pageX),\n                                y: Math.round(touch.pageY)\n                            }});\n                        }\n                    }}\n                >\n                    <RX.Text style={ _styles.labelText }>\n                        { `Touch position on page: x: ${this.state.touchPositionOnPage.x} y: ${this.state.touchPositionOnPage.y}`}\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.explainTextContainer }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The view below shows textual representation of the capture phase of a touch in' }\n                        { '  - The text `View captured touch in` should turn green' }\n                        { '  - The text `View captured touch move` should turn green' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View\n                    style={ _styles.testContainer5 }\n                    onTouchStartCapture={ () => this.setState({ didCapturedTouchIn: true }) }\n                    onTouchMoveCapture={ () => this.setState({ didCapturedTouchMove: true }) }\n                >\n                    <RX.Text style={ [_styles.labelText, this.state.didCapturedTouchIn ? _styles.successText : {}] }>\n                        View captured touch in\n                    </RX.Text>\n                    <RX.Text style={ [_styles.labelText, this.state.didCapturedTouchMove ? _styles.successText : {}] }>\n                        View captured touch move\n                    </RX.Text>\n                </RX.View>\n            </RX.View>\n        );\n    }\n}\n\nclass ViewTouchTest implements Test {\n    getPath(): string {\n        return 'Components/View/Touch';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <ViewTouch\n                ref={ onMount }\n            />\n        );\n    }\n}\n\nexport default new ViewTouchTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/WebViewBasicTest.tsx",
    "content": "/*\n* Tests the functionality of a WebView component using manual\n* user validation.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\nimport RXWebView, { Types as RXWebViewTypes } from 'reactxp-webview';\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    webViewContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        height: 200,\n        margin: 12,\n        borderWidth: 1,\n        borderColor: '#ddd'\n    }),\n    webView: RX.Styles.createViewStyle({\n    }),\n    eventHistoryScrollView: RX.Styles.createScrollViewStyle({\n        margin: 12,\n        padding: 8,\n        alignSelf: 'stretch',\n        height: 100,\n        backgroundColor: '#eee'\n    }),\n    eventHistoryText: RX.Styles.createTextStyle({\n        fontSize: 12,\n    }),\n    buttonBank: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        marginHorizontal: 12,\n        marginVertical: 4\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        minWidth: 75,\n        marginLeft: 12,\n        paddingHorizontal: 12,\n        paddingVertical: 4,\n        borderRadius: 8,\n        borderColor: 'black',\n        alignItems: 'center'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface WebViewViewState {\n    test1CanGoBack?: boolean;\n    test1CanGoForward?: boolean;\n    test1EventHistory?: string[];\n}\n\nclass WebViewView extends RX.Component<RX.CommonProps, WebViewViewState> {\n    private _webViewTest1: RXWebView | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            test1CanGoBack: false,\n            test1CanGoForward: false,\n            test1EventHistory: []\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The web view below displays the RX.WebView documentation. ' +\n                          'Click on links and use the \"Back\" and \"Forward\" buttons to navigate. ' +\n                          'The gray area below the web view displays the event stream (most recent ' +\n                          'event first). You should see a \"Load start\" and \"Load\" event. ' +\n                          'The \"Message\" button will cause a message box to appear in the view (web only).' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.webViewContainer }>\n                    <RXWebView\n                        style={ _styles.webView }\n                        url={ 'https://microsoft.github.io/reactxp/docs/extensions/webview.html' }\n                        ref={ (comp: any) => { this._webViewTest1 = comp; } }\n                        onNavigationStateChange={ this._onNavChangeTest1 }\n                        onLoadStart={ this._onLoadStartTest1 }\n                        onLoad={ this._onLoadTest1 }\n                        onError={ this._onErrorTest1 }\n                        testId={ 'webView1' }\n                        mediaPlaybackRequiresUserAction={ true }\n                        allowsInlineMediaPlayback={ false }\n                    />\n                </RX.View>\n                <RX.View style={ _styles.buttonBank }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onBackTest1 }\n                        disabled={ !this.state.test1CanGoBack }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Back' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onForwardTest1 }\n                        disabled={ !this.state.test1CanGoForward }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Forward' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onReloadTest1 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Reload' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.ScrollView style={ _styles.eventHistoryScrollView }>\n                    <RX.Text style={ _styles.eventHistoryText }>\n                        { this.state.test1EventHistory && this.state.test1EventHistory.length ?\n                            this.state.test1EventHistory.join('\\n') :\n                            'Event history will appear here'\n                        }\n                    </RX.Text>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    private _onNavChangeTest1 = (navState: RXWebViewTypes.WebViewNavigationState) => {\n        this._appendHistoryTest1('Nav state changed');\n\n        this.setState({\n            test1CanGoBack: navState.canGoBack,\n            test1CanGoForward: navState.canGoForward\n        });\n    }\n\n    private _onLoadStartTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Load start');\n    }\n\n    private _onLoadTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Loaded');\n    }\n\n    private _onErrorTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Error');\n    }\n\n    private _onBackTest1 = () => {\n        if (this._webViewTest1) {\n            this._webViewTest1.goBack();\n        }\n    }\n\n    private _onForwardTest1 = () => {\n        if (this._webViewTest1) {\n            this._webViewTest1.goForward();\n        }\n    }\n\n    private _onReloadTest1 = () => {\n        if (this._webViewTest1) {\n            this._webViewTest1.reload();\n        }\n    }\n\n    // Keep a local buffer of eventHistory since back-to-back calls to append history can cause data loss (setState may not be synchronous)\n    private _test1EventHistory: string[] = [];\n    private _appendHistoryTest1(newLine: string) {\n        // Prepend it so we can always see the latest.\n        // Limit to the last 20 items.\n        let newHistory = [newLine].concat(_.slice(this._test1EventHistory, 0, 18));\n        this._test1EventHistory = newHistory;\n        this.setState({\n            test1EventHistory: newHistory\n        });\n    }\n}\n\n// TODO - need to test the following props and methods\n// domStorageEnabled\n// sandbox\n// scalesPageToFit\n// startInLoadingState\n\nclass WebViewBasicTest implements Test {\n    getPath(): string {\n        return 'Components/WebView/Basic';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <WebViewView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new WebViewBasicTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Tests/WebViewDynamicTest.tsx",
    "content": "/*\n* Tests the dynamic injection functionality of a WebView component.\n*/\n\nimport _ = require('lodash');\nimport RX = require('reactxp');\nimport RXWebView, { Types as RXWebViewTypes } from 'reactxp-webview';\n\nimport * as CommonStyles from '../CommonStyles';\nimport { Test, TestResult, TestType } from '../Test';\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'column',\n        alignItems: 'flex-start'\n    }),\n    explainTextContainer: RX.Styles.createViewStyle({\n        margin: 12\n    }),\n    explainText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: CommonStyles.explainTextColor\n    }),\n    webViewContainer: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        height: 200,\n        margin: 12,\n        borderWidth: 1,\n        borderColor: '#ddd'\n    }),\n    webView: RX.Styles.createViewStyle({\n    }),\n    eventHistoryScrollView: RX.Styles.createScrollViewStyle({\n        margin: 12,\n        padding: 8,\n        alignSelf: 'stretch',\n        height: 100,\n        backgroundColor: '#eee'\n    }),\n    eventHistoryText: RX.Styles.createTextStyle({\n        fontSize: 12,\n    }),\n    buttonBank: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        marginHorizontal: 12,\n        marginVertical: 4\n    }),\n    button: RX.Styles.createButtonStyle({\n        backgroundColor: '#ddd',\n        borderWidth: 1,\n        minWidth: 75,\n        marginLeft: 12,\n        paddingHorizontal: 12,\n        paddingVertical: 4,\n        borderRadius: 8,\n        borderColor: 'black',\n        alignItems: 'center'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: CommonStyles.generalFontSize,\n        color: 'black'\n    })\n};\n\ninterface WebViewViewState {\n    htmlContent?: string;\n    test1EventHistory?: string[];\n}\n\nclass WebViewView extends RX.Component<RX.CommonProps, WebViewViewState> {\n    private _webViewTest1: RXWebView | undefined;\n\n    constructor(props: RX.CommonProps) {\n        super(props);\n\n        this.state = {\n            htmlContent: WebViewView._getHtmlContent(0),\n            test1EventHistory: []\n        };\n    }\n\n    render() {\n        return (\n            <RX.View style={ _styles.container}>\n                <RX.View style={ _styles.explainTextContainer } key={ 'explanation' }>\n                    <RX.Text style={ _styles.explainText }>\n                        { 'The web view below is injected with custom HTML provided by the test. ' +\n                          'It also has a message handler that can receive messages from outside the control.' }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.webViewContainer }>\n                    <RXWebView\n                        sandbox={ RXWebViewTypes.WebViewSandboxMode.AllowScripts }\n                        style={ _styles.webView }\n                        source={ { html: this.state.htmlContent || '' } }\n                        ref={ (comp: any) => { this._webViewTest1 = comp; } }\n                        onNavigationStateChange={ this._onNavChangeTest1 }\n                        onLoadStart={ this._onLoadStartTest1 }\n                        onLoad={ this._onLoadTest1 }\n                        onError={ this._onErrorTest1 }\n                        onMessage={ this._onMessageReceived }\n                    />\n                </RX.View>\n                <RX.View style={ _styles.buttonBank }>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onLoadContent1 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Page 1' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onLoadContent2 }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Page 2' }\n                        </RX.Text>\n                    </RX.Button>\n                    <RX.Button\n                        style={ _styles.button }\n                        onPress={ this._onPostMessage }\n                    >\n                        <RX.Text style={ _styles.buttonText }>\n                            { 'Post Message' }\n                        </RX.Text>\n                    </RX.Button>\n                </RX.View>\n                <RX.ScrollView style={ _styles.eventHistoryScrollView }>\n                    <RX.Text style={ _styles.eventHistoryText }>\n                        { this.state.test1EventHistory && this.state.test1EventHistory.length ?\n                            this.state.test1EventHistory.join('\\n') :\n                            'Event history will appear here'\n                        }\n                    </RX.Text>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    private static _getHtmlContent(pageNumber: number): string {\n        // Some browsers and web controls require that we install the event listener\n        // on the window, others on the document. We'll install it on both here.\n        const receiverScript = 'window.onload=function() {' +\n            'function receiveMessage(e) { document.getElementById(\"msg\").innerHTML = \"Message Received: \" + e.data; };' +\n            'document.getElementById(\"sendButton\").onclick=function() { window.parent.postMessage(\"Posted message ' +\n            'from WebView!\", \"*\"); };' +\n            'document.addEventListener(\"message\", receiveMessage);' +\n            'window.addEventListener(\"message\", receiveMessage);' +\n        '}';\n\n        let bodyContent = pageNumber ? `Page ${pageNumber.toString()} Content` : 'Tap buttons to load new HTML content.';\n\n        const htmlContent = '<html><head><script>' + receiverScript +\n            '</script></head><body style=\"font-size: 36px; background-color: #eef\">' +\n            bodyContent + '<div id=\"msg\">Tap &ldquo;Post Message&rdquo; to send message to web view.</div>' +\n            '<button id=\"sendButton\" style=\"margin: 20px; font-size: 36px\">Send Message</button>' +\n            '</body></html>';\n\n        return htmlContent;\n    }\n\n    private _onNavChangeTest1 = (navState: RXWebViewTypes.WebViewNavigationState) => {\n        this._appendHistoryTest1('Nav state changed');\n    }\n\n    private _onLoadStartTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Load start');\n    }\n\n    private _onLoadTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Loaded');\n    }\n\n    private _onErrorTest1 = (e: RX.Types.SyntheticEvent) => {\n        this._appendHistoryTest1('Error');\n    }\n\n    private _onMessageReceived = (e: RXWebViewTypes.WebViewMessageEvent) => {\n        this._appendHistoryTest1('Received message: ' + e.data);\n    }\n\n    private _onLoadContent1 = () => {\n        this.setState({ htmlContent: WebViewView._getHtmlContent(1) });\n    }\n\n    private _onLoadContent2 = () => {\n        this.setState({ htmlContent: WebViewView._getHtmlContent(2) });\n    }\n\n    private _onPostMessage = () => {\n        if (this._webViewTest1) {\n            this._webViewTest1.postMessage('ReactXP Is Cool!');\n        }\n    }\n\n    // Keep a local buffer of eventHistory since back-to-back calls to append history can cause data loss (setState may not be synchronous)\n    private _test1EventHistory: string[] = [];\n    private _appendHistoryTest1(newLine: string) {\n        // Prepend it so we can always see the latest.\n        // Limit to the last 20 items.\n        let newHistory = [newLine].concat(_.slice(this._test1EventHistory, 0, 18));\n        this._test1EventHistory = newHistory;\n        this.setState({\n            test1EventHistory: newHistory\n        });\n    }\n}\n\n// TODO - need to test the following props and methods\n// injectedJavaScript\n\nclass WebViewDynamicTest implements Test {\n    getPath(): string {\n        return 'Components/WebView/Dynamic';\n    }\n\n    getTestType(): TestType {\n        return TestType.Interactive;\n    }\n\n    render(onMount: (component: any) => void): RX.Types.ReactNode {\n        return (\n            <WebViewView ref={ onMount }/>\n        );\n    }\n}\n\nexport default new WebViewDynamicTest();\n"
  },
  {
    "path": "samples/RXPTest/src/Utilities.ts",
    "content": "export function approxEquals(value1: number, value2: number, epsilon?: number): boolean {\n    if (epsilon == null) {\n        epsilon = 0.0001;\n    }\n    return Math.abs(value1 - value2) < epsilon;\n}\n"
  },
  {
    "path": "samples/RXPTest/src/index.tsx",
    "content": "/*\n* Main entry point for web app.\n*/\n\nimport RX = require('reactxp');\n\nimport App = require('./App');\n\nRX.App.initialize(true, true);\nRX.UserInterface.useCustomScrollbars(true);\nRX.UserInterface.setMainView(<App />);\n"
  },
  {
    "path": "samples/RXPTest/tsconfig.json",
    "content": "{\n  \"exclude\": [\n    \"node_modules\"\n  ],\n  \"compilerOptions\": {\n    \"declaration\": false,\n    \"noResolve\": false,\n    \"jsx\": \"react\",\n    \"reactNamespace\": \"RX\",\n    \"module\": \"commonjs\",\n    \"target\": \"es5\",\n    \"experimentalDecorators\": true,\n    \"sourceMap\": true,\n    \"noImplicitAny\": true,\n    \"noImplicitReturns\": true,\n    \"outDir\": \"./dist/\",\n    \"types\" : [\"lodash\", \"react\", \"react-dom\"],\n    \"strict\": true,\n    \"lib\": [\n        \"es2015.promise\",\n        \"es2015.iterable\",\n        \"es2018.promise\",\n        \"es5\",\n        \"dom\"\n    ]\n  },\n  \"include\": [\n    \"./src/**/*\"\n  ]\n}"
  },
  {
    "path": "samples/RXPTest/tslint.json",
    "content": "{\n    \"rulesDirectory\": [\n        \"./node_modules/reactxp/dist/tslint\"\n    ],\n    \"rules\": {\n        \"grouped-import\": true,\n        \"no-unreferenced-styles\": true,\n        \"incorrect-this-props\": true,\n\n        \"align\": [true, \"statements\"],\n        \"class-name\": true,\n        \"curly\": true,\n        \"eofline\": true,\n        \"forin\": true,\n        \"indent\": [true, \"spaces\"],\n        \"interface-name\": [true, \"never-prefix\"],\n        \"label-position\": true,\n        \"max-line-length\": [ true, 140 ],\n        \"no-arg\": true,\n        \"no-bitwise\": false,\n        \"no-console\": [true,\n            \"debug\",\n            \"info\",\n            \"time\",\n            \"timeEnd\",\n            \"trace\"\n        ],\n        \"no-consecutive-blank-lines\":  true,\n        \"no-construct\": true,\n        \"no-debugger\": true,\n        \"no-duplicate-variable\": true,\n        \"no-empty\": true,\n        \"no-eval\": true,\n        \"no-switch-case-fall-through\": true,\n        \"no-trailing-whitespace\": false,\n        \"no-unused-expression\": true,\n        \"one-line\": [true,\n            \"check-open-brace\",\n            \"check-catch\",\n            \"check-else\",\n            \"check-whitespace\"\n        ],\n        \"quotemark\": [true, \"single\", \"jsx-single\"],\n        \"radix\": true,\n        \"semicolon\": true,\n        \"triple-equals\": [true, \"allow-null-check\"],\n        \"variable-name\": false,\n        \"whitespace\": [true,\n            \"check-branch\",\n            \"check-decl\",\n            \"check-operator\",\n            \"check-separator\",\n            \"check-type\"\n        ]\n    }\n}"
  },
  {
    "path": "samples/RXPTest/webpack.config.ts",
    "content": "import * as webpack from 'webpack';\n\nconst config: webpack.Configuration = {\n    entry: \"./src/index.tsx\",\n    mode: \"development\",\n    output: {\n        filename: \"dist/bundle.js\",\n    },\n\n    // Enable sourcemaps for debugging webpack's output.\n    devtool: \"source-map\",\n\n    resolve: {\n        // Add '.ts' and '.tsx' as resolvable extensions.\n        extensions: [\".webpack.js\", \".web.js\", \".ts\", \".tsx\", \".js\"]\n    },\n\n    module: {\n        rules: [\n            // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.\n            {\n                test: /\\.tsx?$/,\n                loader: \"awesome-typescript-loader\"\n            },\n            {\n                test: /\\.tsx?$/,\n                loader: \"tslint-loader\"\n            }\n        ]\n    }\n};\n\nexport default config;\n"
  },
  {
    "path": "samples/RXPTest/windows/.gitignore",
    "content": "*AppPackages*\n*BundleArtifacts*\n\n#OS junk files\n[Tt]humbs.db\n*.DS_Store\n\n#Visual Studio files\n*.[Oo]bj\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vssscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.[Cc]ache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.sdf\n*.opensdf\n*.opendb\n*.unsuccessfulbuild\nipch/\n[Oo]bj/\n[Bb]in\n[Dd]ebug*/\n[Rr]elease*/\nAnkh.NoLoad\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n#MonoDevelop\n*.pidb\n*.userprefs\n\n#Tooling\n_ReSharper*/\n*.resharper\n[Tt]est[Rr]esult*\n*.sass-cache\n\n#Project files\n[Bb]uild/\n\n#Subversion files\n.svn\n\n# Office Temp Files\n~$*\n\n# vim Temp Files\n*~\n\n#NuGet\npackages/\n*.nupkg\n\n#ncrunch\n*ncrunch*\n*crunch*.local.xml\n\n# visual studio database projects\n*.dbmdl\n\n#Test files\n*.testsettings\n\n#Other files\n*.DotSettings\n.vs/\n*project.lock.json\n"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/App.xaml",
    "content": "<rn:ReactApplication\n    x:Class=\"rxptest.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rn=\"using:ReactNative\"\n    RequestedTheme=\"Light\">\n\n</rn:ReactApplication>\n"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/App.xaml.cs",
    "content": "using ReactNative;\n\nnamespace rxptest\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : ReactApplication\n    {\n        private readonly ReactNativeHost _host = new MainReactNativeHost();\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// The React Native host.\n        /// </summary>\n        public override ReactNativeHost Host => _host;\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/MainReactNativeHost.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Core;\nusing ReactNative.Shell;\nusing ReactNativeCommunity.NetInfo;\nusing System.Collections.Generic;\n\nnamespace rxptest\n{\n    class MainReactNativeHost : ReactNativeHost\n    {\n        public override string MainComponentName => \"RXApp\";\n\n#if !BUNDLE || DEBUG\n        public override bool UseDeveloperSupport => true;\n#else\n        public override bool UseDeveloperSupport => false;\n#endif\n\n        protected override string JavaScriptMainModuleName => \"index.windows\";\n\n#if BUNDLE\n        protected override string JavaScriptBundleFile => \"ms-appx:///ReactAssets/index.windows.bundle\";\n#endif\n\n        protected override List<IReactPackage> Packages => new List<IReactPackage>\n        {\n            new MainReactPackage(),\n            new RNCNetInfoPackage(),\n        };\n    }\n}\n"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/Package.appxmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"37ff8a1b-4d66-4281-9896-ba00ac6aba85\"\n    Publisher=\"CN=yuzholob\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"37ff8a1b-4d66-4281-9896-ba00ac6aba85\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>rxptest</DisplayName>\n    <PublisherDisplayName>React Native for UWP</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"rxptest.App\">\n      <uap:VisualElements\n        DisplayName=\"rxptest\"\n        Square150x150Logo=\"Assets\\Square150x150Logo.png\"\n        Square44x44Logo=\"Assets\\Square44x44Logo.png\"\n        Description=\"rxptest\"\n        BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"Assets\\Wide310x150Logo.png\"/>\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"rxptest\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"rxptest\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for rxptest.MyClass and all of its public/private members\n    <Type Name=\"rxptest.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"rxptest.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/ReactAssets/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "samples/RXPTest/windows/rxptest/rxptest.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{CD08AF08-321A-4E52-A9A1-4B685D85154A}</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>rxptest</RootNamespace>\n    <AssemblyName>rxptest</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>rxptest_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <PackageCertificateThumbprint>50F7227C472371D7441028F660BDFCDF35B7FA83</PackageCertificateThumbprint>\n    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug' or '$(Configuration)' == 'DebugBundle'\">\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release' or '$(Configuration)' == 'ReleaseBundle'\">\n    <DependencyConfiguration>Release</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'\">\n    <OutputPath>bin\\x86\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'\">\n    <OutputPath>bin\\ARM\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'\">\n    <OutputPath>bin\\x64\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainReactNativeHost.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"rxptest_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Assets\\StoreLogo.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-200.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\node_modules\\%40react-native-community\\netinfo\\windows\\RNCNetInfo\\RNCNetInfo.csproj\">\n      <Project>{4acdd44c-e556-423e-bd74-b4cef3e67ff0}</Project>\n      <Name>RNCNetInfo</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\">\n      <Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>\n      <Name>ReactNative</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'\">\n    <Content Include=\"ReactAssets\\**\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NETCore.UniversalWindowsPlatform\">\n      <Version>6.0.6</Version>\n    </PackageReference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\bin\\Universal\\$(Platform)\\$(DependencyConfiguration)\\yoga.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Visible>False</Visible>\n    </Content>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "samples/RXPTest/windows/rxptest.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"rxptest\", \"rxptest\\rxptest.csproj\", \"{CD08AF08-321A-4E52-A9A1-4B685D85154A}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C} = {2EACF721-73B5-46AE-9775-4A8674D05A9C}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNative\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\", \"{C7673AD5-E3AA-468C-A5FD-FA38154E205C}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ReactNative.Shared\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj\", \"{EEA8B852-4D07-48E1-8294-A21AB5909FE5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ChakraBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj\", \"{4B72C796-16D5-4E3A-81C0-3E36F531E578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNativeWebViewBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNativeWebViewBridge\\ReactNativeWebViewBridge.csproj\", \"{7596216B-669C-41F8-86DA-F3637F6545C0}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"Facebook.Yoga.Shared\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.shproj\", \"{91C42D32-291D-4B72-90B4-551663D60B8B}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"yoga.uwp\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\Yoga.Universal.vcxproj\", \"{2EACF721-73B5-46AE-9775-4A8674D05A9C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RNCNetInfo\", \"..\\node_modules\\@react-native-community\\netinfo\\windows\\RNCNetInfo\\RNCNetInfo.csproj\", \"{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\t..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13\n\t\t..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tDebugBundle|ARM = DebugBundle|ARM\n\t\tDebugBundle|x64 = DebugBundle|x64\n\t\tDebugBundle|x86 = DebugBundle|x86\n\t\tDevelopment|ARM = Development|ARM\n\t\tDevelopment|x64 = Development|x64\n\t\tDevelopment|x86 = Development|x86\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\t\tReleaseBundle|ARM = ReleaseBundle|ARM\n\t\tReleaseBundle|x64 = ReleaseBundle|x64\n\t\tReleaseBundle|x86 = ReleaseBundle|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x64.Build.0 = Debug|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x86.Build.0 = Debug|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|ARM.Build.0 = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x64.ActiveCfg = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x64.Build.0 = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x64.Deploy.0 = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x86.ActiveCfg = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x86.Build.0 = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.DebugBundle|x86.Deploy.0 = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|ARM.Build.0 = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x64.ActiveCfg = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x64.Build.0 = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x64.Deploy.0 = DebugBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x86.ActiveCfg = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x86.Build.0 = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Development|x86.Deploy.0 = DebugBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|ARM.Build.0 = Release|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x64.ActiveCfg = Release|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x64.Build.0 = Release|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x64.Deploy.0 = Release|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x86.ActiveCfg = Release|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x86.Build.0 = Release|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.Release|x86.Deploy.0 = Release|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86\n\t\t{CD08AF08-321A-4E52-A9A1-4B685D85154A}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|x64.Build.0 = Debug|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Debug|x86.Build.0 = Debug|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|ARM.ActiveCfg = Development|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|ARM.Build.0 = Development|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|x64.ActiveCfg = Development|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|x64.Build.0 = Development|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|x86.ActiveCfg = Development|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Development|x86.Build.0 = Development|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|ARM.Build.0 = Release|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|x64.ActiveCfg = Release|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|x64.Build.0 = Release|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|x86.ActiveCfg = Release|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.Release|x86.Build.0 = Release|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{4ACDD44C-E556-423E-BD74-B4CEF3E67FF0}.ReleaseBundle|x86.Build.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/TodoList/.babelrc",
    "content": "{\n    \"presets\": [\n        \"module:metro-react-native-babel-preset\"\n    ],\n    \"plugins\": [\n        \"lodash\",\n        \"./buildtools/inline-require.js\"\n    ]\n}\n"
  },
  {
    "path": "samples/TodoList/.eslintrc.json",
    "content": "{\n  \"parserOptions\": {\n    \"project\": \"./tsconfig.json\"\n  },\n  \"extends\": [\"skype\", \"skype/react\"],\n  \"rules\": {\n    \"@typescript-eslint/naming-convention\": [\n      \"error\",\n        { \"selector\": \"variableLike\", \"format\": [\"camelCase\", \"UPPER_CASE\"], \"leadingUnderscore\": \"allow\" }\n    ]\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.tsx\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/explicit-function-return-type\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"PluginBaseChecker.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-unused-vars\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "samples/TodoList/.gitignore",
    "content": "# node.js\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n/.cache-loader/\n\ntemp/\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# Xcode\nPods/\nrxptodolist.xcworkspace\n\n\n# Certificate information for node webserver\ncert.pem\nkey.pem\n\n# Built files for webserver\nweb/js/\nweb/images/\nweb/fonts/\n\n"
  },
  {
    "path": "samples/TodoList/README.md",
    "content": "# RXPTodoList\n\nThis app works on React Native (iOS, Android, Windows) and web.\n\nThe commands in the instructions below assume you are in the root of this repo.\n\n### Building\n\n- From the RXPTodoList directory, run `npm install`. This fetches the dependencies.\n\n### Building for Web\n\n- Run `npm run start-web`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- Run `node nodeserver.js`. This starts a local web server on localhost port 8080\n  - On Windows, if there is another process already bound to port 8080, the node server will fail to start (\"Error listen EACCES 0.0.0.0:8080\").\n- Within a browser, open http://localhost:8080/\n\n### Building for iOS\n\n- Run `npm run start-ios`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- In another command prompt run `npm run start`. This starts the React Native Packager.\n- In another command prompt run `npx pod-install && npx react-native run-ios`\n\n### Building for Android\n\n- Run `npm run start-android`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- In another command prompt run `npm run start`. This starts the React Native Packager.\n- In another command prompt run `npx react-native run-android`\n\n### Building for Windows\n\n- Run `npm run start-windows`. This compiles the TypeScript code and recompiles it whenever any files are changed.\n- In another command prompt run `npm run start`. This starts the React Native Packager.\n- Open the project (in the windows directory) in Visual Studio and build it like any other React Native project.\n\n\n# Concepts\nThis sample demonstrates a number of concepts that you can leverage within your app. Some of these concepts demonstrate advanced ways to orchestrate the build of a more complex cross-platform app. Others demonstrate coding techniques within the app.\n\n## Gulp-based Build\nMost of the other ReactXP samples use a simple build technique where the build script is implemented entirely within the package.json \"scripts\" section. This sample demonstrates a more sophisticated build that leverages [gulp](https://www.npmjs.com/package/gulp), a popular automation toolkit.\n\nThe script logic is mostly located in the file gulpfile.js. This script also makes use of buildconfig.js, which defines all of the build parameters (such as paths and config options).\n\nThe package.json \"scripts\" section defines two scripts for each platform.\n\n```start-<platform>```: performs an ```npm install``` followed by ```gulp-<platform>```\n\n```gulp-<platform>```: performs the build steps for that platform and continues to watch for changes to the code\n\nIf you are collaborating with others on your project, it's recommended that you run ```start-<project>``` after pulling the latest code. From that point forward, it's sufficient to run ```gulp-<project>```, unless you change the package.json dependencies.\n\nIf you want to add a gulp-based build to your project, you will need to include ```gulp``` and a bunch of related utility packages (like ```path``` and ```yargs```) in your \"devDependencies\". See the list of dependencies required at the top of the ```gulpfile.js``` file.\n\nThe scripts in the sample all set ```MODE_ENV=developement```, which produces development builds. You could easily add variants of these scripts that set ```MODE_ENV=production``` and produce production builds.\n\n\n## Inline Requires\nThis sample shows how to apply a custom babel filter that inlines all requires. This is important for performance reasons because it defers the initialization of a module until it is called the first time. Without this optimization, all modules are initialized at app launch time, before the app's javascript entry point is reached.\n\nThe babel plugin is included in the \"buildtools/inline-require.js\" directory, and it's invoked by the packager (webpack on we builds or the RN packager on native builds).\n\nTo apply this technique to your project, copy the inline-require.js file. Add the babel-* dependencies to the \"devDependencies\" section of your package.json file. Copy the contents of the \".babelrc\" configuration file at the root directory of the project. Modify the webpack.config.ts to include a rule that invokes the babel-loader. Note that the RN packager automatically runs babel and will honor the \".babelrc\" if it's present.\n\n## Replacing Defines\nThe sample shows a technique whereby certain symbols in the source code can be replaced with literal values at build time. For example, the symbol ```__DEV__``` is replaced with ```true``` or ```false``` depending on whether the build is a development or production build.\n\nThis replacement is performed by either a gulp task (see method ```replaceFlags``` in gulpfile.js) for native builds or a webpack plugin (see the \"plugins\" section of \"webpack.config.ts\") on web builds.\n\nIf you want to use this technique in your project, copy those relevant sections from gulpfile.js and webpack.config.ts.\n\n## Platform-specific Code Modules\nReactXP attempts to enable most of your app's code to be platform-agnostic. However, there are times when it's necessary to write platform-specific code. The recommended approach is to encapsulate the functionality within a module that has a common interface but different, per-platform, implementations.\n\nThis sample shows a way to \"link\" the appropriate code based on the platform type. It does this through the use of flexible aliasing in both webpack and the RN packager.\n\nTo write a module that contains platform-specific code, create a new directory under \"modules\", and give it the name of your module. Within that directory, provide platform-specific implementations named ```index.<platform>.ts[x]```. The aliasing mechanism also supports common fallbacks. For example, if you can use the same implementation for all native platforms (ios, android, windows, macos), create a file called ```index.native.ts[x]```. Likewise, a \"universal\" fallback can be provided with the name ```index.ts[x]```.\n\nTo consume a platform-specific module elsewhere within your code, import it with an absolute path that starts with 'module/'. For example, if you created a module called 'linear-gradient', you would import it as follows:\n\n```\nimport LinearGradient from 'module/linear-gradient';\n```\n\nThis aliasing technique is implemented primarily in the buildconfig.js file. Refer to the ```getModuleAliases``` function, which computes the aliases array. These aliases are then applied at build time by either the ```apply-aliases``` gulp step in the case of native builds or through a webpack plugin (see the \"aliases\" section of webpack.config.ts) for web builds.\n\nTo incorporate this techinque into your project, copy the relevant sections of buildconfig.js, gulpfile.js, and webpack.config.ts.\n\n## Local Web Server\nThe other ReactXP samples allow you to run the resulting web app by simply opening the ```index.html``` file in your browser. This sample shows a more advanced technique that uses a simple local web server running in node. This web server is not intended for development only, not for production hosting.\n\nTo configure and run the local web server, refer to the instructions in docs/setup.\n\nTo add this mechanism to your project, copy the nodeserver.js file to the root of your project.\n\n\n## Stores and Auto-subscriptions\nThis sample demonstrates the use of [ReSub](https://www.npmjs.com/package/resub), which provides a way for components to auto-subscribe to data stores and automatically get notified when the underlying data changes. Unlikely many other mechanisms based on flux (e.g. redux), this technique involves minimal boilerplate code because it leverages features within the TypeScript language to install subscriptions automatically.\n\nTo use this mechanism within your project, add resub as a dependency. Use ComponentBase as the base class for your components and StoreBase as the base class for your stores.\n\n## Services & Service Manager\nIt is often necessary within a more complicated app to implement singleton modules that live for extended periods of time - often the entire time the app is running. These so-called \"services\" can perform a wide variety of work. In a more complex app, some services can depend on other services. This dependency tree can be difficult to manage, so we created a ServiceManager and ServiceRegistrar module. The latter is used to register all services. Each service exposes a startup method that returns a promise. THe startup method isn't called until the service is needed. At that time, the ServiceManager starts all other dependent services, then starts the requested service. If the service is already running, it immediately returns.\n\nIf a service must be started at app launch time, it can be started within the app's main entry point. Refer to the method ```_startCriticalServices``` in app/AppBootstrapper.tsx.\n\n## Custom Fonts\nThis sample demonstrates how to include custom fonts within your project. It uses a platform-specific module called \"fonts\" to provide per-platform font selection.\n\nOn the web, the custom fonts are referenced by \"@font-face\" CSS directives in ```web\\css\\app.css```. They are included directly within the various native projects (XCode, gradle, Visual Studio) for the native projects.\n\n## Static Images\nThis sample demonstrates how to include static images within your project. It uses a platform-specific module called \"images\" to provide per-platform image selection. This is required because the RN Packager demands the use of static require paths within the code, whereas web builds require a relative URL.\n\nRefer to the ```modules/images/``` directory for details.\n\n## Navigation Contexts\nThere are many ways to implement navigation in React apps. This sample demonstrates one such technique that allows the app to switch between \"stack-based\" navigation (which is most appropriate for small screen sizes) and \"composite\" navigation where multiple panels are visible side by side (most appropriate for larger screen sizes). The sample app is able to switch between these two modes as you resize your browser.\n\nA \"navigation context\" defines a location in the app. Many nav contexts also include state variables (such as the \"current selected item\") that are related to navigation. Nav contexts can be converted to and from deep links, which take the form of a URI. More on this below.\n\nThe NavContextStore is responsible for maintaining the current navigation location within the app - and a variable that indicates whether the app is currently using stack-based or composite mode. Any changes in navigation must update this store. When an update occurs, the top layers of the view hierarchy are notified of the change, and they initiate a re-render if necessary. Refer to the views/RootView.tsx file for details.\n\nThe NavContextStore module exposes methods for navigating to a new context. See ```navigateToTodoList``` for an example.\n\n## Other Useful Modules\nThe sample implements several other useful modules that you may want to copy into your project.\n\n### Styles\nThe app/Styles module provides common definitions for colors, fonts, font sizes, etc. It's useful to define these within one place to facilitate app-wide themeing and enforce a consistent design language.\n\n### AppConfig\nThe app/AppConfig module provides accessor methods for static configuration information - like platform, app version, development flag, and various paths. This is not considered a \"store\" because the information provided by this module never changes at runtime.\n\n### ResponsiveWidthStore\nThe store/ResponsiveWidthStore module provides subscribers with information about the current width and height of the app's main view area. It defines a small number of \"break points\" that top-level components can use to determine the best layout for a range of screen sizes.\n\n### DeepLinkConverter & PageUrlService\nThe app/DeepLinkConverter module is responsible for converting between deep links (URIs) and nav contexts - and vice versa. It enables deep linking within the app.\n\nThe services/PageUrlService module is a web-specific service that monitors the current nav context and, if necessary, updates the browser's navigation history. It also provides handlers for the browser navigation buttons (back and forward arrows).\n\n### ShimHelpers\nThe utilities/ShimHelpers module provides shim implementations of several methods that are commonly used by npm modules but are not present in some environments like React Native.\n\n### ExceptionReporter\nThe utilities/ExceptionReporter module catches exceptions that are otherwise uncaught and presents them to the user in the form of a dialog. This is useful for development builds. In production builds, these same exceptions should be quietly logged without interrupting the user.\n\n### HoverButton\nThe controls/HoverButton module provides a simple way to track the hover state of a button, which can be re-rendered when the mouse pointer enters or leaves the button's area.\n\n### SimpleButton\nThe controls/SimpleButton module implements a simple text button with rounded corners. You can change the default styling to match the design language of your application.\n\n### SimpleDialog\nThe controls/SimpleDialog module implements a simple dialog box with text and buttons. It handles keyboard input (e.g. enter or esc keys). It also demonstrates how to animate the display and dismissal of a dialog. You can change the default styling to match the design language of your application.\n\n### SimpleMenus\nThe controls/SimpleMenus module implements a simple menu that supports dividers and checkboxes. It's intended to be displayed within an RX.Popup.\n\n"
  },
  {
    "path": "samples/TodoList/android/app/BUCK",
    "content": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm start` - to start the packager\n# - `cd android`\n# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\"`\n# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck\n# - `buck install -r android/app` - compile, install and run application\n#\n\nload(\":build_defs.bzl\", \"create_aar_targets\", \"create_jar_targets\")\n\nlib_deps = []\n\ncreate_aar_targets(glob([\"libs/*.aar\"]))\n\ncreate_jar_targets(glob([\"libs/*.jar\"]))\n\nandroid_library(\n    name = \"all-libs\",\n    exported_deps = lib_deps,\n)\n\nandroid_library(\n    name = \"app-code\",\n    srcs = glob([\n        \"src/main/java/**/*.java\",\n    ]),\n    deps = [\n        \":all-libs\",\n        \":build_config\",\n        \":res\",\n    ],\n)\n\nandroid_build_config(\n    name = \"build_config\",\n    package = \"com.rxptodolist\",\n)\n\nandroid_resource(\n    name = \"res\",\n    package = \"com.rxptodolist\",\n    res = \"src/main/res\",\n)\n\nandroid_binary(\n    name = \"app\",\n    keystore = \"//android/keystores:debug\",\n    manifest = \"src/main/AndroidManifest.xml\",\n    package_type = \"debug\",\n    deps = [\n        \":app-code\",\n    ],\n)\n"
  },
  {
    "path": "samples/TodoList/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation. If none specified and\n *   // \"index.android.js\" exists, it will be used. Otherwise \"index.js\" is\n *   // default. Can be overridden with ENTRY_FILE environment variable.\n *   entryFile: \"index.android.js\",\n *\n *   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format\n *   bundleCommand: \"ram-bundle\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    enableHermes: false,  // clean and rebuild if changing\n]\n\napply from: \"../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\n/**\n * The preferred build flavor of JavaScriptCore.\n *\n * For example, to use the international variant, you can use:\n * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`\n *\n * The international variant includes ICU i18n library and necessary data\n * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that\n * give correct results when using with locales other than en-US.  Note that\n * this variant is about 6MiB larger per architecture than default.\n */\ndef jscFlavor = 'org.webkit:android-jsc:+'\n\n/**\n * Whether to enable the Hermes VM.\n *\n * This should be set on project.ext.react and mirrored here.  If it is not set\n * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode\n * and the benefits of using Hermes will therefore be sharply reduced.\n */\ndef enableHermes = project.ext.react.get(\"enableHermes\", false);\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.rxptodolist\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    signingConfigs {\n        debug {\n            storeFile file('debug.keystore')\n            storePassword 'android'\n            keyAlias 'androiddebugkey'\n            keyPassword 'android'\n        }\n    }\n    buildTypes {\n        debug {\n            signingConfig signingConfigs.debug\n        }\n        release {\n            // Caution! In production, you need to generate your own keystore file.\n            // see https://facebook.github.io/react-native/docs/signed-apk-android.\n            signingConfig signingConfigs.debug\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n\n    packagingOptions {\n        pickFirst \"lib/armeabi-v7a/libc++_shared.so\"\n        pickFirst \"lib/arm64-v8a/libc++_shared.so\"\n        pickFirst \"lib/x86/libc++_shared.so\"\n        pickFirst \"lib/x86_64/libc++_shared.so\"\n    }\n\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // https://developer.android.com/studio/build/configure-apk-splits.html\n            def versionCodes = [\"armeabi-v7a\": 1, \"x86\": 2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    //noinspection GradleDynamicVersion\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n\n    implementation \"androidx.swiperefreshlayout:swiperefreshlayout:1.0.0\"\n\n    debugImplementation(\"com.facebook.flipper:flipper:${FLIPPER_VERSION}\") {\n      exclude group:'com.facebook.fbjni'\n    }\n\n    debugImplementation(\"com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}\") {\n        exclude group:'com.facebook.flipper'\n    }\n\n    debugImplementation(\"com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}\") {\n        exclude group:'com.facebook.flipper'\n    }\n\n    if (enableHermes) {\n        def hermesPath = \"../../node_modules/hermes-engine/android/\";\n        debugImplementation files(hermesPath + \"hermes-debug.aar\")\n        releaseImplementation files(hermesPath + \"hermes-release.aar\")\n    } else {\n        implementation jscFlavor\n    }\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n\napply from: file(\"../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle\"); applyNativeModulesAppBuildGradle(project)\n"
  },
  {
    "path": "samples/TodoList/android/app/build_defs.bzl",
    "content": "\"\"\"Helper definitions to glob .aar and .jar targets\"\"\"\n\ndef create_aar_targets(aarfiles):\n    for aarfile in aarfiles:\n        name = \"aars__\" + aarfile[aarfile.rindex(\"/\") + 1:aarfile.rindex(\".aar\")]\n        lib_deps.append(\":\" + name)\n        android_prebuilt_aar(\n            name = name,\n            aar = aarfile,\n        )\n\ndef create_jar_targets(jarfiles):\n    for jarfile in jarfiles:\n        name = \"jars__\" + jarfile[jarfile.rindex(\"/\") + 1:jarfile.rindex(\".jar\")]\n        lib_deps.append(\":\" + name)\n        prebuilt_jar(\n            name = name,\n            binary_jar = jarfile,\n        )\n"
  },
  {
    "path": "samples/TodoList/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n"
  },
  {
    "path": "samples/TodoList/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "samples/TodoList/android/app/src/debug/java/com/rxptodolist/ReactNativeFlipper.java",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * <p>This source code is licensed under the MIT license found in the LICENSE file in the root\n * directory of this source tree.\n */\npackage com.rxptodolist;\n\nimport android.content.Context;\nimport com.facebook.flipper.android.AndroidFlipperClient;\nimport com.facebook.flipper.android.utils.FlipperUtils;\nimport com.facebook.flipper.core.FlipperClient;\nimport com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;\nimport com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;\nimport com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;\nimport com.facebook.flipper.plugins.inspector.DescriptorMapping;\nimport com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;\nimport com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;\nimport com.facebook.flipper.plugins.network.NetworkFlipperPlugin;\nimport com.facebook.flipper.plugins.react.ReactFlipperPlugin;\nimport com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;\nimport com.facebook.react.ReactInstanceManager;\nimport com.facebook.react.bridge.ReactContext;\nimport com.facebook.react.modules.network.NetworkingModule;\nimport okhttp3.OkHttpClient;\n\npublic class ReactNativeFlipper {\n  public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {\n    if (FlipperUtils.shouldEnableFlipper(context)) {\n      final FlipperClient client = AndroidFlipperClient.getInstance(context);\n\n      client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));\n      client.addPlugin(new ReactFlipperPlugin());\n      client.addPlugin(new DatabasesFlipperPlugin(context));\n      client.addPlugin(new SharedPreferencesFlipperPlugin(context));\n      client.addPlugin(CrashReporterPlugin.getInstance());\n\n      NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();\n      NetworkingModule.setCustomClientBuilder(\n          new NetworkingModule.CustomClientBuilder() {\n            @Override\n            public void apply(OkHttpClient.Builder builder) {\n              builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));\n            }\n          });\n      client.addPlugin(networkFlipperPlugin);\n      client.start();\n\n      // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized\n      // Hence we run if after all native modules have been initialized\n      ReactContext reactContext = reactInstanceManager.getCurrentReactContext();\n      if (reactContext == null) {\n        reactInstanceManager.addReactInstanceEventListener(\n            new ReactInstanceManager.ReactInstanceEventListener() {\n              @Override\n              public void onReactContextInitialized(ReactContext reactContext) {\n                reactInstanceManager.removeReactInstanceEventListener(this);\n                reactContext.runOnNativeModulesQueueThread(\n                    new Runnable() {\n                      @Override\n                      public void run() {\n                        client.addPlugin(new FrescoFlipperPlugin());\n                      }\n                    });\n              }\n            });\n      } else {\n        client.addPlugin(new FrescoFlipperPlugin());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "samples/TodoList/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.rxptodolist\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize|uiMode\"\n        android:launchMode=\"singleTask\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "samples/TodoList/android/app/src/main/java/com/rxptodolist/MainActivity.java",
    "content": "package com.rxptodolist;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n  /**\n   * Returns the name of the main component registered from JavaScript. This is used to schedule\n   * rendering of the component.\n   */\n  @Override\n  protected String getMainComponentName() {\n      return \"RXApp\";\n  }\n}\n"
  },
  {
    "path": "samples/TodoList/android/app/src/main/java/com/rxptodolist/MainApplication.java",
    "content": "package com.rxptodolist;\n\nimport android.app.Application;\nimport android.content.Context;\nimport com.facebook.react.PackageList;\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactInstanceManager;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.soloader.SoLoader;\nimport java.lang.reflect.InvocationTargetException;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost =\n      new ReactNativeHost(this) {\n        @Override\n        public boolean getUseDeveloperSupport() {\n          return BuildConfig.DEBUG;\n        }\n\n        @Override\n        protected List<ReactPackage> getPackages() {\n          @SuppressWarnings(\"UnnecessaryLocalVariable\")\n          List<ReactPackage> packages = new PackageList(this).getPackages();\n          // Packages that cannot be autolinked yet can be added manually here, for example:\n          // packages.add(new MyReactNativePackage());\n          return packages;\n        }\n\n        @Override\n        protected String getJSMainModuleName() {\n          return \"index\";\n        }\n      };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n    initializeFlipper(this, getReactNativeHost().getReactInstanceManager());\n  }\n\n  /**\n   * Loads Flipper in React Native templates. Call this in the onCreate method with something like\n   * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());\n   *\n   * @param context\n   * @param reactInstanceManager\n   */\n  private static void initializeFlipper(\n      Context context, ReactInstanceManager reactInstanceManager) {\n    if (BuildConfig.DEBUG) {\n      try {\n        /*\n         We use reflection here to pick up the class that initializes Flipper,\n        since Flipper library is not available in release mode\n        */\n        Class<?> aClass = Class.forName(\"com.rxptodolist.ReactNativeFlipper\");\n        aClass\n            .getMethod(\"initializeFlipper\", Context.class, ReactInstanceManager.class)\n            .invoke(null, context, reactInstanceManager);\n      } catch (ClassNotFoundException e) {\n        e.printStackTrace();\n      } catch (NoSuchMethodException e) {\n        e.printStackTrace();\n      } catch (IllegalAccessException e) {\n        e.printStackTrace();\n      } catch (InvocationTargetException e) {\n        e.printStackTrace();\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "samples/TodoList/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">rxptodolist</string>\n</resources>\n"
  },
  {
    "path": "samples/TodoList/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"android:textColor\">#000000</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "samples/TodoList/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:3.5.2\")\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url(\"$rootDir/../node_modules/react-native/android\")\n        }\n        maven {\n            // Android JSC is installed from npm\n            url(\"$rootDir/../node_modules/jsc-android/dist\")\n        }\n\n        google()\n        jcenter()\n        maven { url 'https://www.jitpack.io' }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.0.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "samples/TodoList/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n\n# Version of flipper SDK to use with React Native\nFLIPPER_VERSION=0.33.1\n"
  },
  {
    "path": "samples/TodoList/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "samples/TodoList/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/TodoList/android/settings.gradle",
    "content": "rootProject.name = 'rxptodolist'\napply from: file(\"../node_modules/@react-native-community/cli-platform-android/native_modules.gradle\"); applyNativeModulesSettingsGradle(settings)\ninclude ':app'\n"
  },
  {
    "path": "samples/TodoList/app.json",
    "content": "{\n  \"name\": \"rxptodolist\",\n  \"displayName\": \"rxptodolist\"\n}"
  },
  {
    "path": "samples/TodoList/babel.config.js",
    "content": "module.exports = {\n  plugins: [ 'lodash' ],\n  presets: [\n    ['@babel/preset-env', { targets: { node: true } }],\n    'module:metro-react-native-babel-preset',\n  ],\n};\n"
  },
  {
    "path": "samples/TodoList/buildconfig.js",
    "content": "/**\n* buildconfig.js\n* Copyright: Microsoft 2018\n*\n* Configuration parameters for building the app.\n*/\n\n'use strict';\n\nvar _ = require('lodash');\nvar fs = require('fs');\nvar path = require('path-posix');\n\nvar targetPlatform = 'web';\nvar isDevEnv = false;\n\n// Base paths to specific folders\nvar basePaths = {\n    nodeModulesPath: './node_modules',\n    sourcePath : './src/',\n    tempPath: './temp/',\n    webAppPath : './web/'\n};\n\nfunction getTempPath(mypath) {\n    return path.join(basePaths.tempPath, targetPlatform, mypath);\n}\n\nfunction getSourcePath(mypath) {\n    return path.join(basePaths.sourcePath, mypath);\n}\n\nfunction getObjPath(mypath) {\n    return path.join(getTempPath('obj'), mypath);\n}\n\nfunction getWebAppPath(mypath) {\n    return path.join(basePaths.webAppPath, mypath);\n}\n\nfunction getBuildPath(mypath) {\n    if (targetPlatform === 'web') {\n        return getWebAppPath(mypath);\n    } else {\n        return path.join(basePaths.tempPath, targetPlatform, 'rnapp', mypath);\n    }\n}\n\nfunction setTargetPlatform(target) {\n    switch (target) {\n        case 'ios':\n        case 'android':\n        case 'web':\n        case 'windows':\n        case 'electron':\n        case 'macos':\n        case 'tests':\n            targetPlatform = target;\n            break;\n\n        default:\n            targetPlatform = 'web';\n            break;\n    }\n}\n\nfunction setIsDevEnv(dev) {\n    isDevEnv = dev;\n}\n\nfunction getCommonFallback(targetPlatform) {\n    switch (targetPlatform) {\n        case 'android':\n        case 'ios':\n        case 'windows':\n        case 'macos':\n            return 'native';\n        case 'web':\n        case 'electron':\n        case 'tests':\n        default:\n            return 'web';\n    }\n}\n\n// Scan the platform-specific modules directory and determines which alias\n// to use for the target platform. It searches in the following order:\n// 1. modules/<name>/index.<platform>.ts[x]\n// 2. modules/<name>/index.<web|native>.ts[x]\n// 3. modules/<name>/index.ts[x]\nfunction getModuleAliases(targetPlatform) {\n    var aliases = {};\n    var fallbackSearchOrder = ['index.' + getCommonFallback(targetPlatform), 'index'];\n\n    var modules = fs.readdirSync('./src/ts/modules/');\n\n    _.each(modules, function (moduleName) {\n        var fileNameSearchOrder = [];\n        var moduleVariant = 'index.' + targetPlatform;\n\n        _.each(fallbackSearchOrder, function (fallback) {\n            var variantPath = './src/ts/modules/' + moduleName + '/' + moduleVariant;\n            if (fs.existsSync(variantPath + '.ts') || fs.existsSync(variantPath + '.tsx')) {\n                return true;\n            }\n            moduleVariant = fallback;\n        });\n\n        var modulePath = (targetPlatform === 'web' || targetPlatform === 'tests' || targetPlatform === 'electron') ?\n            getSourcePath('ts/modules') : './' + getObjPath('modules');\n        aliases['modules/' + moduleName] = modulePath + '/' + moduleName + '/' + moduleVariant;\n    });\n\n    return aliases;\n}\n\nfunction getConfigInternal() {\n    return {\n        // Clean\n        // --------------------------------------------------------------------- //\n        clean: {\n            temp: getTempPath('*'),\n            web: [\n                getBuildPath('fonts/'),\n                getBuildPath('images/'),\n                getBuildPath('js/')\n            ],\n            tests: getTempPath('tests/'),\n            rnApp: getBuildPath('*')\n        },\n\n        // Copy\n        // --------------------------------------------------------------------- //\n        copy: [\n            // fonts\n            {\n                src: getSourcePath('resources/fonts/**/*.*'),\n                dest: getBuildPath('fonts/')\n            },\n            // images\n            {\n                src: getSourcePath('resources/images/**/*.*'),\n                dest: getBuildPath('images/')\n            }\n        ],\n\n        // Bundling\n        // --------------------------------------------------------------------- //\n        bundling: {\n            aliases: getModuleAliases(targetPlatform)\n        },\n\n        // Build infrastructure\n        // --------------------------------------------------------------------- //\n        infrastructure: {\n            files: [\n                './gulpfile.js',\n                './buildconfig.js',\n                './package.json',\n                './webpack.config.js'\n            ],\n            gulpfile: './gulpfile.js'\n        },\n\n        // TypeScript\n        // --------------------------------------------------------------------- //\n        ts: {\n            src: [getSourcePath('ts/**/*.{ts,tsx}')],\n            srcRoot: getSourcePath('ts'),\n            obj: getObjPath(''),\n            config: './tsconfig.json',\n            RNDest: getBuildPath('js')\n        }\n    }\n}\n\nmodule.exports = function getConfig(newTargetPlatform, isDev) {\n    setTargetPlatform(newTargetPlatform);\n    setIsDevEnv(isDev);\n    return getConfigInternal();\n}\n"
  },
  {
    "path": "samples/TodoList/buildtools/inline-require.js",
    "content": "/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n*\n * Babel plugin that inlines all calls to require(), rather than performing\n * all requires at the top of each module. This prevents the full transitive\n * closure of all modules from being initialized at app launch time.\n */\n\n'use strict';\n\n/**\n * Map of require(...) aliases to module names.\n *\n * `Foo` is an alias for `require('ModuleFoo')` in the following example:\n *   var Foo = require('ModuleFoo');\n */\nvar inlineRequiredDependencyMap;\n\n/**\n * Map of variable names that have not yet been inlined.\n * We track them in case we later remove their require()s,\n * In which case we have to come back and update them.\n */\nvar identifierToPathsMap;\n\n/**\n * This transform inlines top-level require(...) aliases with to enable lazy\n * loading of dependencies.\n *\n * Continuing with the example above, this replaces all references to `Foo` in\n * the module to `require('ModuleFoo')`.\n */\nmodule.exports = function fbjsInlineRequiresTransform(babel) {\n  var t = babel.types;\n\n  function buildRequireCall(name) {\n    var call = t.callExpression(\n      t.identifier('require'),\n      [t.stringLiteral(inlineRequiredDependencyMap[name])]\n    );\n    call.new = true;\n    return call;\n  }\n\n  function buildRequireLodash(name, func) {\n    var call = t.callExpression(\n      t.identifier('require'),\n      [t.stringLiteral(inlineRequiredDependencyMap[name] + '/' + func)]\n    );\n    call.new = true;\n    return call;\n  }\n\n  function inlineRequireLodashFunction(path) {\n    if (t.isMemberExpression(path)) {\n        if (isChain(path.node.property.name)) {\n            throw new Error(\n            'Cannot replace _.chain with inline require of lodash/chain' +\n            'This plugin does not support chain sequences.  ' +\n            '. Line: ' + path.node.loc.start.line + '.'\n            );\n        }\n        path.replaceWith(\n            buildRequireLodash(path.node.object.name, path.node.property.name)\n        );\n    }\n  }\n\n  function inlineRequire(path) {\n    var node = path.node;\n    try {\n        path.replaceWith(\n          path.isReferenced() ? buildRequireCall(node.name) : node\n        );\n    } catch (ex) {\n      return node\n    }\n  }\n\n  /**\n   * When using spread operator like this:\n   * obj.func(a, ...array)\n   * typescript compiles it to:\n   * obj.func.apply(obj, [a].concat([1, 2, 3]));\n   *\n   * in case of lodash, we want to replace the 'obj' argument\n   *\n   */\n  function handleLodashSpread(path) {\n    if (t.isIdentifier(path) &&\n      isLodash(path.node.name) &&\n      t.isCallExpression(path.parent) &&\n      t.isMemberExpression(path.parent.callee) &&\n      path.parent.callee.property.name.toLowerCase() === 'apply') {\n        path.replaceWith(path.scope.buildUndefinedNode());\n        return true;\n    }\n    return false;\n  }\n\n  return {\n    visitor: {\n      Program: function() {\n        resetCollection();\n      },\n\n      /**\n       * Collect top-level require(...) aliases.\n       */\n      CallExpression: function(path) {\n        var node = path.node;\n\n        if (isTopLevelRequireAlias(path)) {\n          var varName = path.parent.id.name;\n          var moduleName = node.arguments[0].value;\n          if (!moduleName || isBlacklistedModule(moduleName) || moduleName.toLowerCase().indexOf('.json') !== -1) {\n            return;\n          }\n\n          inlineRequiredDependencyMap[varName] = moduleName;\n\n          // If we removed require() statements for variables we've already seen,\n          // We need to do a second pass on this program to replace them with require().\n          var maybePaths = identifierToPathsMap[varName];\n          if (Array.isArray(maybePaths)) {\n            maybePaths.forEach(inlineRequire);\n            identifierToPathsMap[varName] = null;\n          }\n\n          // Remove the declaration.\n          path.parentPath.parentPath.remove();\n          // And the associated binding in the scope.\n          path.scope.removeBinding(varName);\n        }\n\n        if (isLodash(node.callee.name)) {\n          throw new Error(\n            'Cannot replace implicit chain expression \"_(...)\" with inline require of lodash/function.' +\n            'This plugin does not support chain sequences.  ' +\n            '. Line: ' + node.loc.start.line + '.'\n          );\n        }\n      },\n\n      /**\n       * Inline require(...) aliases.\n       */\n      Identifier: function (path) {\n        var node = path.node;\n        var parent = path.parent;\n        var scope = path.scope;\n\n        if (!shouldInlineRequire(node, scope)) {\n          // Monitor this name in case we later remove its require().\n          // This won't happen often but if it does we need to come back and update here.\n          if (Array.isArray(identifierToPathsMap[node.name])) {\n            identifierToPathsMap[node.name].push(path);\n          } else {\n            identifierToPathsMap[node.name] = [path];\n          }\n\n          return;\n        }\n\n        if (\n          parent.type === 'AssignmentExpression' &&\n          path.isBindingIdentifier() &&\n          !scope.bindingIdentifierEquals(node.name, node)\n        ) {\n          throw new Error(\n            'Cannot assign to a require(...) alias, ' + node.name +\n            '. Line: ' + node.loc.start.line + '.'\n          );\n        }\n\n        if (isLodash(node.name)) {\n          if (!handleLodashSpread(path)) {\n            if (parent.type === 'MemberExpression') {\n                // it must be a second pass of the plugin, so the _.function  was not correctly replaced by require(lodash/function)\n                inlineRequireLodashFunction(path.parentPath);\n                return;\n            }\n            console.log(path.hub.file.opts.filename );\n            // if we still got a lodash identifier, something went wrong and not all lodash functions were properly imported\n            throw new Error(\n              'Cannot assign ' + node.name + 'to a require(...) alias, all lodash imports should be modularized ' + node.name +\n              '. Line: ' + node.loc.start.line + '.'\n            );\n          }\n        }\n\n        inlineRequire(path);\n      },\n\n      /**\n       * inline replace _.function with require('lodash/function');\n       * Throws an exception when trying to replace chain\n      */\n      MemberExpression: function(path) {\n        if(t.isIdentifier(path.node.object) && isLodash(path.node.object.name)) {\n            inlineRequireLodashFunction(path);\n        }\n      }\n    },\n  };\n};\n\nfunction isChain(name) {\n  return name.toLowerCase() === 'chain';\n}\n\nfunction isLodash(name) {\n  // Check if the name is an alias of lodash import\n  if (!!inlineRequiredDependencyMap[name]) {\n    var moduleName = inlineRequiredDependencyMap[name].toString().toLowerCase();\n    return moduleName === 'lodash' || moduleName === 'lodash/fp';\n  }\n  return false;\n}\n\nfunction resetCollection() {\n  identifierToPathsMap = {};\n  inlineRequiredDependencyMap = {};\n}\n\nfunction isTopLevelRequireAlias(path) {\n  return (\n    isRequireCall(path.node) &&\n    path.parent.type === 'VariableDeclarator' &&\n    path.parent.id.type === 'Identifier' &&\n    path.parentPath.parent.type === 'VariableDeclaration' &&\n    path.parentPath.parent.declarations.length === 1 &&\n    path.parentPath.parentPath.parent.type === 'Program'\n  );\n}\n\nfunction isBlacklistedModule(name) {\n  if (!name) {\n    return false;\n  }\n  var lowerName = name.toLowerCase();\n  // This is required to fix the pako module\n  if (lowerName.indexOf('zlib/constants') !== -1) {\n    return true;\n  }\n\n  // Don't inline modules starting with 'react', but do inline 'reactxp' modules\n  if (lowerName.indexOf('react') !== -1 && lowerName.indexOf('reactxp') === -1) {\n    return true;\n  }\n\n  if (lowerName === 'prop-types') {\n    return true;\n  }\n\n  return false;\n}\n\nfunction shouldInlineRequire(node, scope) {\n\n    if (node && isBlacklistedModule(node.name)) {\n      return false;\n    }\n\n  return (\n    inlineRequiredDependencyMap.hasOwnProperty(node.name) &&\n    !scope.hasBinding(node.name, true /* noGlobals */)\n  );\n}\n\nfunction isRequireCall(node) {\n  return (\n    !node.new &&\n    node.type === 'CallExpression' &&\n    node.callee.type === 'Identifier' &&\n    node.callee.name === 'require' &&\n    node.arguments.length === 1 &&\n    node.arguments[0].type === 'StringLiteral'\n  );\n}\n"
  },
  {
    "path": "samples/TodoList/gulpfile.js",
    "content": "/**\n* gulpfile.js\n* Copyright: Microsoft 2018\n*\n* Script for building the app.\n*/\n\nvar _ = require('lodash');\nvar argv = require('yargs').argv;\nvar async = require('async');\nvar buildConfig = require('./buildconfig');\nvar cached = require('gulp-cached');\nvar del = require('del');\nvar eol = require('gulp-eol');\nvar eventStream = require('event-stream');\nvar fs = require('fs');\nvar gulp = require('gulp');\nvar gutil = require('gulp-util');\nvar jshint = require('gulp-jshint');\nvar notifier = require('node-notifier');\nvar os = require('os');\nvar path = require('path-posix');\nvar prettyTime = require('pretty-hrtime');\nvar rename = require('gulp-rename');\nvar replaceWithSM = require('gulp-replace-with-sourcemaps');\nvar shell = require('gulp-shell');\nvar sourcemaps = require('gulp-sourcemaps');\nvar stylish = require('jshint-stylish');\nvar ts = require('gulp-typescript');\nvar eslint = require('gulp-eslint');\nvar eslintEng = require('eslint');\nvar util = require('util');\nvar watch = require('gulp-watch');\n\nvar PLATFORMS = {\n    WEB: 'web',\n    IOS: 'ios',\n    ANDROID: 'android',\n    WINDOWS: 'windows',\n    MACOS: 'macos',\n    TESTS: 'tests'\n};\n\n// Configurations\n// --------------------------------------------------------------------- //\n\nvar webpackEnv = _.merge({\n    PLATFORM: platform,\n    USESOURCEMAPS: argv.usesourcemaps,\n    USECODECOVERAGE: argv.usecodecoverage,\n    USEBABEL: argv.usebabel,\n    NOLODASHMINI: 'true'\n}, process.env);\n\n// Utility functions\n// --------------------------------------------------------------------- //\n\nfunction getPlatform() {\n    var targetPlatform = argv.platform;\n\n    if (!targetPlatform) {\n        return PLATFORMS.WEB;\n    }\n\n    if ([PLATFORMS.ANDROID, PLATFORMS.IOS, PLATFORMS.WEB, PLATFORMS.WINDOWS, PLATFORMS.TESTS, PLATFORMS.MACOS].indexOf(targetPlatform) < 0) {\n        throw 'Unsupported platform - ' + targetPlatform;\n    }\n\n    return targetPlatform;\n}\n\n// Handle args\nvar platform = getPlatform();\ngutil.log(gutil.colors.yellow('platform: ' + platform));\n\nvar isDevEnv = (process.env.NODE_ENV === 'development');\ngutil.log(gutil.colors.yellow('developer mode: ' + (isDevEnv ? 'enabled' : 'disabled')));\n\nvar enableSrcMaps = (argv.usesourcemaps !== 'no');\ngutil.log(gutil.colors.yellow('source maps: ' + enableSrcMaps));\n\n// Compute the build config\nvar config = buildConfig(platform, isDevEnv);\n\n// Define a generic error handler.\nvar handleError = function(err) {\n    console.log(err.toString());\n\n    beepOnce();\n    notifyOnce({\n      'title': 'Gulp Error',\n      'message': err.toString()\n    });\n};\n\n// Produce a beep only once, even if called several times.\nvar beepOnce = _.throttle(function() {\n    gutil.beep();\n}, 3000, { trailing: false });\n\n// Produce a notification only once, even if called several times.\nvar notifyOnce = _.throttle(notifier.notify.bind(notifier), 3000, { trailing: false });\n\n// Fix for \"EventEmitter memory leak detected\" errors. These aren't memory\n// leaks -- we're just running a lot of concurrent tasks and runSequence\n// is registering them simultaneously.\ngulp.setMaxListeners(100);\n\n// Workaround for https://github.com/gulpjs/gulp/issues/71\nvar origSrc = gulp.src;\ngulp.src = function() {\n    return fixPipe(origSrc.apply(this, arguments));\n};\n\nfunction fixPipe(stream) {\n    var origPipe = stream.pipe;\n    stream.pipe = function (dest) {\n        arguments[0] = dest.on('error', function (error) { // jshint ignore:line\n            var nextStreams = dest._nextStreams;\n            if (nextStreams) {\n                nextStreams.forEach(function (nextStream) {\n                    nextStream.emit('error', error);\n                });\n            } else if (dest.listeners('error').length === 1) {\n                throw error;\n            }\n        });\n        var nextStream = fixPipe(origPipe.apply(this, arguments));\n        (this._nextStreams || (this._nextStreams = [])).push(nextStream);\n        return nextStream;\n    };\n    return stream;\n}\n\n// Get a list of file config from config entry in their pre-copy location.\nvar getFilePathsFromConfig = _.memoize(function(configEntry) {\n    var files = [];\n\n    for (var copyOrderKey in configEntry) {\n        if (configEntry.hasOwnProperty(copyOrderKey)) {\n            if (typeof configEntry[copyOrderKey].files === 'string') {\n                files.push(configEntry[copyOrderKey].files);\n            } else if (util.isArray(configEntry[copyOrderKey].files)) {\n                files = files.concat(configEntry[copyOrderKey].files);\n            }\n        }\n    }\n\n    return _.uniq(files);\n});\n\nfunction usesWebpack() {\n    return (platform === PLATFORMS.WEB || platform === PLATFORMS.TESTS);\n}\n\nfunction getPlatformSpecificResources() {\n    var configKey = {\n        'ios': 'iOS',\n        'android': 'android',\n        'windows': 'windows',\n        'macos':'macos'\n    }[platform];\n\n    return config[configKey] || {};\n}\n\n//var defaultFormatter = new eslintEng.Formatters.StylishFormatter();\nvar createCacheInvalidator = function(cacheName) {\n    function formatter() {}\n    formatter.prototype.format = function(ruleFailures) {\n        // Remove affected files from the cache.\n        if (ruleFailures && ruleFailures.length && cached.caches[cacheName]) {\n            ruleFailures.forEach(function(ruleFailure) {\n                var path = ruleFailure.path || ruleFailure.fileName;\n                // Note: The path does not always use the same folder separator as the cache's key.\n                var pathForwards = path.replace(/\\\\/g, '/');\n                var pathBackwards = path.replace(/\\//g, '\\\\');\n                delete cached.caches[cacheName][path];\n                delete cached.caches[cacheName][pathForwards];\n                delete cached.caches[cacheName][pathBackwards];\n            });\n        }\n\n        // Print the rule failures using a real formatter.\n        return defaultFormatter.format(ruleFailures);\n    };\n    return formatter;\n};\n\n// Note: Cannot have multiple instances of a gulp.task running at the same time. Pass the last parameter to make this print like a task.\nvar eslintRunning = false;\nvar eslintNeedsRun = true;\nfunction _runEsLintInternal(src, cacheName, fakeTaskName) {\n    if (eslintRunning) {\n        eslintNeedsRun = true;\n        return Promise.resolve();\n    }\n\n    eslintRunning = true;\n    eslintNeedsRun = false;\n\n    // Setup for fake gulp.task.\n    var start = process.hrtime();\n    if (fakeTaskName) {\n        gutil.log('Starting \\'' + gutil.colors.cyan(fakeTaskName) + '\\'...');\n    }\n\n    // Run eslint.\n    var stream = gulp.src(src, { base: './' }) // specify base to preserve folder structure\n        .pipe(cached(cacheName, {optimizeMemory: true}))\n        .pipe(eslint({\n            eslint: eslintEng,\n            reporter: 'verbose',\n            formatter: createCacheInvalidator(cacheName),\n            fix: !!argv.fix\n        }))\n        //.pipe(eslint.report({\n        //    // Break non-dev builds on lint\n        //    emitError: !isDevEnv\n        //}))\n        .on('error', handleError);\n\n    // Print duration for the fake gulp.task.\n    if (fakeTaskName) {\n        stream = stream.on('end', function () {\n            var time = process.hrtime(start);\n            gutil.log('Finished \\'' + gutil.colors.cyan(fakeTaskName) + '\\' after ',\n                gutil.colors.magenta(prettyTime(time)));\n        });\n    }\n\n    return stream.on('end', function() {\n        eslintRunning = false;\n        if (eslintNeedsRun) {\n            runEsLintFromWatcher();\n        }\n    });\n}\n\n// Debounce running es-lint. We don't need to call it once per change since it runs over all changed files.\nfunction _debounceEsLintRunner(runner, fakeTaskName) {\n    return _.debounce(function () {\n        runner(fakeTaskName);\n    }, 100, { leading: true, trailing: true });\n}\n\nfunction runEsLint(fakeTaskName) {\n    var src = config.ts.src;\n    var esLintCacheName = 'esLint';\n    return _runEsLintInternal(src, esLintCacheName, fakeTaskName);\n}\nvar runEsLintFromWatcher = _debounceEsLintRunner(runEsLint, 'esLint');\n\nfunction copyMultiple(copyList, callback) {\n    // Iterate over each entry in the copy list. Each has a src\n    // and dest (or possibly multiple of each).\n    async.eachSeries(copyList, function(copyOrder, asyncCallback) {\n        if (!copyOrder){\n            return;\n        }\n        var dests = (_.isArray(copyOrder.dest) ? copyOrder.dest : [copyOrder.dest]);\n        async.each(dests, function(dest, innerCallback) {\n            gulp.src(copyOrder.src, copyOrder.options)\n                .pipe(rename(function (path) {\n                    if (copyOrder.renameTo) {\n                        path.basename = copyOrder.renameTo;\n                    }\n                }))\n                .pipe(gulp.dest(dest))\n                .on('end', innerCallback)\n                .on('error', innerCallback);\n        }, asyncCallback);\n    }, callback);\n}\n\n// helper for creating paths that require accepts\nfunction normalizePath(mypath) {\n    return mypath\n        .replace(/^(?!\\.(?:\\/|\\\\))/, './') // add ./ at beginning if not present\n        .replace(/\\\\/g, '/');              // change path separators\n}\n\n// Search for absolute require paths that correspond to specified aliases and\n// replace them with the corresponding relative path.\nfunction aliasify(aliases) {\n    var reqPattern = new RegExp(/require\\(['\"]([^'\"]+)['\"]\\)/g); // matches requires\n\n    // for all files in the stream apply the replacer\n    return eventStream.map(function(file, done) {\n        if (!file.isNull()) {\n            var fileContent = file.contents.toString();\n            if (reqPattern.test(fileContent)) {\n                file.contents = new Buffer(fileContent.replace(reqPattern, function(req, oldPath) {\n                    if (!aliases[oldPath]) {\n                        return req;\n                    }\n\n                    if (aliases[oldPath][0] === '.') {\n                        var oldFolder = path.dirname(path.resolve(file.path));\n                        var targetFile = path.resolve(aliases[oldPath]);\n                        var newPath = path.relative(oldFolder, targetFile);\n\n                        return \"require('\" + normalizePath(newPath) + \"')\";\n                    } else {\n                        return \"require('\" + aliases[oldPath] + \"')\";\n                    }\n                }));\n            }\n        }\n\n        done(null, file);\n    });\n}\n\n// Replace flags within the code. This replacement method is used\n// only for native platforms. For web, see webpack.config.ts for\n// a similar replacement mechanism. If you make a change here,\n// reflect the same change in the other location.\nfunction replaceFlags(stream) {\n    return stream\n        .pipe(replaceWithSM(/__DEV__(?!\\s*:\\s*boolean)/g, isDevEnv))\n        .pipe(replaceWithSM(/__TEST__(?!\\s*:\\s*boolean)/g, platform === PLATFORMS.TESTS))\n        .pipe(replaceWithSM(/__WEB__(?!\\s*:\\s*boolean)/g, false))\n        .pipe(replaceWithSM(/__ANDROID__(?!\\s*:\\s*boolean)/g, platform === PLATFORMS.ANDROID))\n        .pipe(replaceWithSM(/__IOS__(?!\\s*:\\s*boolean)/g, platform === PLATFORMS.IOS))\n        .pipe(replaceWithSM(/__WINDOWS__(?!\\s*:\\s*boolean)/g, platform === PLATFORMS.WINDOWS))\n        .pipe(replaceWithSM(/__MACOS__(?!\\s*:\\s*boolean)/g, platform === PLATFORMS.MACOS));\n}\n\nfunction fixRelativePathGlob(pathOrGlob) {\n    if (_.isArray(pathOrGlob)) {\n        return _.map(pathOrGlob, function (part) {\n            return fixRelativePathGlob(part);\n        });\n    }\n\n    if (pathOrGlob && typeof pathOrGlob === 'string' && pathOrGlob.length >= 2) {\n        var parsed = path.parse(pathOrGlob);\n        if (parsed && pathOrGlob.search(/^\\.[\\/\\\\]/) === 0) {\n            // Looks like a relative path starting with './'!\n            // Remove './' since 'foo.js' does not match the glob './foo.js' and that breaks gulp-watch.\n            // Note: globs are based from the current directory anyways.\n            return pathOrGlob.substr(2);\n        }\n    }\n    return pathOrGlob;\n}\n\nfunction watcher(glob, callback) {\n    var fixedGlob = fixRelativePathGlob(glob);\n    watch(fixedGlob, { read: false }, callback);\n}\n\n// Gulp Tasks\n// --------------------------------------------------------------------- //\ngulp.task('watch', function(callback) {\n    // Watch for changes in the gulpfile or other package lists.\n    // If changes are made, notify the user.\n    watcher(config.infrastructure.files, function(file) {\n        var stats = fs.statSync(file.path);\n\n        if (!stats || !stats.isFile()) {\n            return;\n        }\n\n        console.log(gutil.colors.bgRed.bold('\\nThe following files were modified, and you likely need to update and re-run gulp:'));\n\n        console.log(gutil.colors.bgRed.bold('- ' + path.relative('./', file.path)));\n\n        setTimeout(function() {\n            console.log('\\n');\n\n            beepOnce();\n            notifier.notify({\n                'title': 'Project Changes',\n                'message': 'Gulp infrastructure files were modified, and you likely need to update and re-run gulp.'\n            });\n        }, 500);\n    });\n\n    // Watch external files to copy.\n    watcher(getFilePathsFromConfig(config.copy), gulp.series('copy'));\n\n    if (!usesWebpack()) {\n        // Watch for ts change & run linter\n        watcher(config.ts.src, gulp.series('compile-rn', 'apply-aliases', runEsLintFromWatcher));\n    }\n\n    callback();\n});\n\ngulp.task('clean', function() {\n    return del(_.flatten([config.clean.temp, config.clean[platform] || config.clean.rnApp]), { force: true });\n});\n\ngulp.task('es-lint', function() {\n    // Webpack runs eslint\n    if (!usesWebpack()) {\n        return runEsLint();\n    }\n    return Promise.resolve();\n});\n\ngulp.task('gulpfile-lint', function() {\n    return gulp.src(config.infrastructure.gulpfile)\n        .pipe(jshint())\n        .pipe(jshint.reporter(stylish))\n        .on('error', handleError);\n});\n\ngulp.task('compile-rn', function () {\n    if (platform === PLATFORMS.WEB || platform === PLATFORMS.TESTS) {\n        return Promise.resolve();\n    }\n\n    var tsProject = ts.createProject(config.ts.config);\n    var rnSource = config.ts.src;\n    var stream = gulp.src(rnSource)\n        .pipe(eol(os.EOL, false))\n        .pipe(enableSrcMaps ? sourcemaps.init() : gutil.noop())\n        .pipe(tsProject());\n\n    if (enableSrcMaps) {\n        stream = stream.pipe(sourcemaps.write('.',\n            { sourceRoot: path.join(process.cwd(), config.ts.srcRoot) }));\n    }\n\n    return stream\n        .pipe(gulp.dest(config.ts.obj))\n        .on('error', handleError);\n});\n\ngulp.task('apply-aliases', function() {\n    var aliases = _.assign({}, config.bundling.aliases, getPlatformSpecificResources().aliases);\n    var stream = gulp.src(path.join(config.ts.obj, '**/*.{js,js.map}'))\n        .pipe(cached('aliases', {optimizeMemory: true}))\n        .pipe(aliasify(aliases));\n\n    // Replace flags in source since RN Packager won't do it for us\n    stream = replaceFlags(stream);\n\n    return stream\n        .pipe(gulp.dest(config.ts.RNDest))\n        .on('error', handleError);\n});\n\ngulp.task('copy', function(callback) {\n    copyMultiple(config.copy, callback);\n});\n\ngulp.task('lint', gulp.series('es-lint', 'gulpfile-lint'));\n\ngulp.task('build', gulp.series('copy', 'compile-rn'));\n\ngulp.task('webpack-js', shell.task('node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js --bail --hide-modules', { env: webpackEnv }));\ngulp.task('webpack-js-watch', shell.task('node --max_old_space_size=4096 ./node_modules/webpack/bin/webpack.js --watch --hide-modules', { env: webpackEnv }));\n\ngulp.task('noop', function(callback) {\n    // NOOP!\n    callback();\n});\n\ngulp.task('run-once', gulp.series('clean', 'lint', 'copy', 'build', 'apply-aliases', usesWebpack() ? 'webpack-js' : 'noop'));\n\ngulp.task('run', gulp.series('clean', 'copy', 'build', 'apply-aliases', 'watch',\n    (usesWebpack() ? 'webpack-js-watch' : 'noop'), 'lint'));\n"
  },
  {
    "path": "samples/TodoList/index.android.js",
    "content": "/**\n* index.android.js\n* Copyright: Microsoft 2018\n*\n* Javascript main entry point for native app.\n*/\n\nvar AppBootstrapperNative = require('./temp/android/rnapp/js/app/AppBootstrapperNative.js');\n\n// This prevents bundlers/optimizers from stripping out the import above.\nif (AppBootstrapperNative) {\n    console.log('App started');\n}\n"
  },
  {
    "path": "samples/TodoList/index.ios.js",
    "content": "/**\n* index.ios.js\n* Copyright: Microsoft 2018\n*\n* Javascript main entry point for native app.\n*/\n\nvar AppBootstrapperNative = require('./temp/ios/rnapp/js/app/AppBootstrapperNative.js');\n\n// This prevents bundlers/optimizers from stripping out the import above.\nif (AppBootstrapperNative) {\n    console.log('App started');\n}\n"
  },
  {
    "path": "samples/TodoList/index.windows.js",
    "content": "/**\n* index.windows.js\n* Copyright: Microsoft 2018\n*\n* Javascript main entry point for native app.\n*/\n\nvar AppBootstrapperNative = require('./temp/windows/rnapp/js/app/AppBootstrapperNative.js');\n\n// This prevents bundlers/optimizers from stripping out the import above.\nif (AppBootstrapperNative) {\n    console.log('App started');\n}\n"
  },
  {
    "path": "samples/TodoList/ios/Podfile",
    "content": "platform :ios, '9.0'\nrequire_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'\n\ndef add_flipper_pods!(versions = {})\n  versions['Flipper'] ||= '~> 0.33.1'\n  versions['DoubleConversion'] ||= '1.1.7'\n  versions['Flipper-Folly'] ||= '~> 2.1'\n  versions['Flipper-Glog'] ||= '0.3.6'\n  versions['Flipper-PeerTalk'] ||= '~> 0.0.4'\n  versions['Flipper-RSocket'] ||= '~> 1.0'\n\n  pod 'FlipperKit', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configuration => 'Debug'\n\n  # List all transitive dependencies for FlipperKit pods\n  # to avoid them being linked in Release builds\n  pod 'Flipper', versions['Flipper'], :configuration => 'Debug'\n  pod 'Flipper-DoubleConversion', versions['DoubleConversion'], :configuration => 'Debug'\n  pod 'Flipper-Folly', versions['Flipper-Folly'], :configuration => 'Debug'\n  pod 'Flipper-Glog', versions['Flipper-Glog'], :configuration => 'Debug'\n  pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configuration => 'Debug'\n  pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configuration => 'Debug'\n  pod 'FlipperKit/Core', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/CppBridge', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FBDefines', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configuration => 'Debug'\n  pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configuration => 'Debug'\nend\n\n# Post Install processing for Flipper\ndef flipper_post_install(installer)\n  installer.pods_project.targets.each do |target|\n    if target.name == 'YogaKit'\n      target.build_configurations.each do |config|\n        config.build_settings['SWIFT_VERSION'] = '4.1'\n      end\n    end\n  end\nend\n\ntarget 'rxptodolist' do\n  # Pods for rxptodolist\n  pod 'FBLazyVector', :path => \"../node_modules/react-native/Libraries/FBLazyVector\"\n  pod 'FBReactNativeSpec', :path => \"../node_modules/react-native/Libraries/FBReactNativeSpec\"\n  pod 'RCTRequired', :path => \"../node_modules/react-native/Libraries/RCTRequired\"\n  pod 'RCTTypeSafety', :path => \"../node_modules/react-native/Libraries/TypeSafety\"\n  pod 'React', :path => '../node_modules/react-native/'\n  pod 'React-Core', :path => '../node_modules/react-native/'\n  pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'\n  pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'\n  pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'\n  pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'\n  pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'\n  pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'\n  pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'\n  pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'\n  pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'\n  pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'\n  pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'\n  pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'\n\n  pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'\n  pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'\n  pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'\n  pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'\n  pod 'ReactCommon/callinvoker', :path => \"../node_modules/react-native/ReactCommon\"\n  pod 'ReactCommon/turbomodule/core', :path => \"../node_modules/react-native/ReactCommon\"\n  pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true\n\n  pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'\n  pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'\n  pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'\n\n  target 'rxptodolistTests' do\n    inherit! :complete\n    # Pods for testing\n  end\n\n  use_native_modules!\n\n  # Enables Flipper.\n  #\n  # Note that if you have use_frameworks! enabled, Flipper will not work and\n  # you should disable these next few lines.\n  add_flipper_pods!\n  post_install do |installer|\n    flipper_post_install(installer)\n  end\nend\n\ntarget 'rxptodolist-tvOS' do\n  # Pods for rxptodolist-tvOS\n\n  target 'rxptodolist-tvOSTests' do\n    inherit! :search_paths\n    # Pods for testing\n  end\nend\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/AppDelegate.h",
    "content": "#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/AppDelegate.m",
    "content": "#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n#if DEBUG\n#import <FlipperKit/FlipperClient.h>\n#import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h>\n#import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h>\n#import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h>\n#import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h>\n#import <FlipperKitReactPlugin/FlipperKitReactPlugin.h>\n\nstatic void InitializeFlipper(UIApplication *application) {\n  FlipperClient *client = [FlipperClient sharedClient];\n  SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];\n  [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];\n  [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];\n  [client addPlugin:[FlipperKitReactPlugin new]];\n  [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];\n  [client start];\n}\n#endif\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n#if DEBUG\n  InitializeFlipper(application);\n#endif\n\n  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge\n                                                   moduleName:@\"RXApp\"\n                                            initialProperties:nil];\n\n  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n#if DEBUG\n  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index\" fallbackResource:nil];\n#else\n  return [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n#endif\n}\n\n@end\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"rxptodolist\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>rxptodolist</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist/main.m",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist-tvOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist-tvOSTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00E356F31AD99517003FC87E /* rxptodolistTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rxptodolistTests.m */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2DCD954D1E0B4F2C00145EB5 /* rxptodolistTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rxptodolistTests.m */; };\n\t\t48B816AAF42DA6244C199756 /* libPods-rxptodolist-rxptodolistTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 082C73C2DED1F9DB664556C6 /* libPods-rxptodolist-rxptodolistTests.a */; };\n\t\t498D57E7B9B76F3506750AF9 /* libPods-rxptodolist.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 354B1B7760D70254C216C97B /* libPods-rxptodolist.a */; };\n\t\tAEEB22791F5216D31CF208A9 /* libPods-rxptodolist-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A21E82B0D1827D0FEFCDDBA /* libPods-rxptodolist-tvOSTests.a */; };\n\t\tDF838E3A8DCDBFC8685B54B9 /* libPods-rxptodolist-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 65B46A432FCB0BB04F067A2F /* libPods-rxptodolist-tvOS.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13B07F861A680F5B00A75B9A;\n\t\t\tremoteInfo = rxptodolist;\n\t\t};\n\t\t2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;\n\t\t\tremoteInfo = \"rxptodolist-tvOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00E356EE1AD99517003FC87E /* rxptodolistTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rxptodolistTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t00E356F21AD99517003FC87E /* rxptodolistTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = rxptodolistTests.m; sourceTree = \"<group>\"; };\n\t\t082C73C2DED1F9DB664556C6 /* libPods-rxptodolist-rxptodolistTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-rxptodolist-rxptodolistTests.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07F961A680F5B00A75B9A /* rxptodolist.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rxptodolist.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = rxptodolist/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = rxptodolist/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = rxptodolist/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = rxptodolist/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = rxptodolist/main.m; sourceTree = \"<group>\"; };\n\t\t2D02E47B1E0B4A5D006451C7 /* rxptodolist-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"rxptodolist-tvOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D02E4901E0B4A5D006451C7 /* rxptodolist-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"rxptodolist-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t354B1B7760D70254C216C97B /* libPods-rxptodolist.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-rxptodolist.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4890428C07BB9EB551F61E35 /* Pods-rxptodolist-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-tvOS.debug.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-tvOS/Pods-rxptodolist-tvOS.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t4A21E82B0D1827D0FEFCDDBA /* libPods-rxptodolist-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-rxptodolist-tvOSTests.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5599837821D41EB799B8E6E0 /* Pods-rxptodolist-rxptodolistTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-rxptodolistTests.release.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-rxptodolistTests/Pods-rxptodolist-rxptodolistTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5C1FF0EA0751FC724C4F26F4 /* Pods-rxptodolist.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist.release.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist/Pods-rxptodolist.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t65B46A432FCB0BB04F067A2F /* libPods-rxptodolist-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-rxptodolist-tvOS.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8310D291EECCAF6461EC63AF /* Pods-rxptodolist.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist.debug.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist/Pods-rxptodolist.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB6D318AB4ED5615CE23C8B03 /* Pods-rxptodolist-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-tvOSTests.debug.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-tvOSTests/Pods-rxptodolist-tvOSTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tBDDF5A4BE6FC02B863E2F3EA /* Pods-rxptodolist-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-tvOS.release.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-tvOS/Pods-rxptodolist-tvOS.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tCE381F97B96B5AA71E2055DF /* Pods-rxptodolist-rxptodolistTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-rxptodolistTests.debug.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-rxptodolistTests/Pods-rxptodolist-rxptodolistTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEEBCDE7E55C8D15CFA4E1C58 /* Pods-rxptodolist-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-rxptodolist-tvOSTests.release.xcconfig\"; path = \"Target Support Files/Pods-rxptodolist-tvOSTests/Pods-rxptodolist-tvOSTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t00E356EB1AD99517003FC87E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t48B816AAF42DA6244C199756 /* libPods-rxptodolist-rxptodolistTests.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t498D57E7B9B76F3506750AF9 /* libPods-rxptodolist.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDF838E3A8DCDBFC8685B54B9 /* libPods-rxptodolist-tvOS.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAEEB22791F5216D31CF208A9 /* libPods-rxptodolist-tvOSTests.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00E356EF1AD99517003FC87E /* rxptodolistTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F21AD99517003FC87E /* rxptodolistTests.m */,\n\t\t\t\t00E356F01AD99517003FC87E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = rxptodolistTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356F01AD99517003FC87E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F11AD99517003FC87E /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* rxptodolist */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = rxptodolist;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\t354B1B7760D70254C216C97B /* libPods-rxptodolist.a */,\n\t\t\t\t082C73C2DED1F9DB664556C6 /* libPods-rxptodolist-rxptodolistTests.a */,\n\t\t\t\t65B46A432FCB0BB04F067A2F /* libPods-rxptodolist-tvOS.a */,\n\t\t\t\t4A21E82B0D1827D0FEFCDDBA /* libPods-rxptodolist-tvOSTests.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* rxptodolist */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t00E356EF1AD99517003FC87E /* rxptodolistTests */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t\t9A5B202055E377682D2574DB /* Pods */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* rxptodolist.app */,\n\t\t\t\t00E356EE1AD99517003FC87E /* rxptodolistTests.xctest */,\n\t\t\t\t2D02E47B1E0B4A5D006451C7 /* rxptodolist-tvOS.app */,\n\t\t\t\t2D02E4901E0B4A5D006451C7 /* rxptodolist-tvOSTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9A5B202055E377682D2574DB /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8310D291EECCAF6461EC63AF /* Pods-rxptodolist.debug.xcconfig */,\n\t\t\t\t5C1FF0EA0751FC724C4F26F4 /* Pods-rxptodolist.release.xcconfig */,\n\t\t\t\tCE381F97B96B5AA71E2055DF /* Pods-rxptodolist-rxptodolistTests.debug.xcconfig */,\n\t\t\t\t5599837821D41EB799B8E6E0 /* Pods-rxptodolist-rxptodolistTests.release.xcconfig */,\n\t\t\t\t4890428C07BB9EB551F61E35 /* Pods-rxptodolist-tvOS.debug.xcconfig */,\n\t\t\t\tBDDF5A4BE6FC02B863E2F3EA /* Pods-rxptodolist-tvOS.release.xcconfig */,\n\t\t\t\tB6D318AB4ED5615CE23C8B03 /* Pods-rxptodolist-tvOSTests.debug.xcconfig */,\n\t\t\t\tEEBCDE7E55C8D15CFA4E1C58 /* Pods-rxptodolist-tvOSTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t00E356ED1AD99517003FC87E /* rxptodolistTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"rxptodolistTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t894790AE12CEA36156276E43 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t00E356EA1AD99517003FC87E /* Sources */,\n\t\t\t\t00E356EB1AD99517003FC87E /* Frameworks */,\n\t\t\t\t00E356EC1AD99517003FC87E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = rxptodolistTests;\n\t\t\tproductName = rxptodolistTests;\n\t\t\tproductReference = 00E356EE1AD99517003FC87E /* rxptodolistTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t13B07F861A680F5B00A75B9A /* rxptodolist */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"rxptodolist\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t12D478E9F0CCE7C2319E2495 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tFD10A7F022414F080027D42C /* Start Packager */,\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = rxptodolist;\n\t\t\tproductName = rxptodolist;\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* rxptodolist.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E47A1E0B4A5D006451C7 /* rxptodolist-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"rxptodolist-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t43C2AB6A829C61E67C9FFD32 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tFD10A7F122414F3F0027D42C /* Start Packager */,\n\t\t\t\t2D02E4771E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E4791E0B4A5D006451C7 /* Resources */,\n\t\t\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"rxptodolist-tvOS\";\n\t\t\tproductName = \"rxptodolist-tvOS\";\n\t\t\tproductReference = 2D02E47B1E0B4A5D006451C7 /* rxptodolist-tvOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E48F1E0B4A5D006451C7 /* rxptodolist-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"rxptodolist-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8269BF85F1E7531778738657 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t2D02E48C1E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E48E1E0B4A5D006451C7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"rxptodolist-tvOSTests\";\n\t\t\tproductName = \"rxptodolist-tvOSTests\";\n\t\t\tproductReference = 2D02E4901E0B4A5D006451C7 /* rxptodolist-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1130;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t00E356ED1AD99517003FC87E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tTestTargetID = 13B07F861A680F5B00A75B9A;\n\t\t\t\t\t};\n\t\t\t\t\t13B07F861A680F5B00A75B9A = {\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E47A1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E48F1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 2D02E47A1E0B4A5D006451C7;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"rxptodolist\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* rxptodolist */,\n\t\t\t\t00E356ED1AD99517003FC87E /* rxptodolistTests */,\n\t\t\t\t2D02E47A1E0B4A5D006451C7 /* rxptodolist-tvOS */,\n\t\t\t\t2D02E48F1E0B4A5D006451C7 /* rxptodolist-tvOSTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t00E356EC1AD99517003FC87E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4791E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48E1E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t12D478E9F0CCE7C2319E2495 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-rxptodolist-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native Code And Images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t43C2AB6A829C61E67C9FFD32 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-rxptodolist-tvOS-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t8269BF85F1E7531778738657 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-rxptodolist-tvOSTests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t894790AE12CEA36156276E43 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-rxptodolist-rxptodolistTests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tFD10A7F022414F080027D42C /* Start Packager */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Start Packager\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export RCT_METRO_PORT=\\\"${RCT_METRO_PORT:=8081}\\\"\\necho \\\"export RCT_METRO_PORT=${RCT_METRO_PORT}\\\" > \\\"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\\\"\\nif [ -z \\\"${RCT_NO_LAUNCH_PACKAGER+xxx}\\\" ] ; then\\n  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\\n    if ! curl -s \\\"http://localhost:${RCT_METRO_PORT}/status\\\" | grep -q \\\"packager-status:running\\\" ; then\\n      echo \\\"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\\\"\\n      exit 2\\n    fi\\n  else\\n    open \\\"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\\\" || echo \\\"Can't start packager automatically\\\"\\n  fi\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tFD10A7F122414F3F0027D42C /* Start Packager */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Start Packager\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export RCT_METRO_PORT=\\\"${RCT_METRO_PORT:=8081}\\\"\\necho \\\"export RCT_METRO_PORT=${RCT_METRO_PORT}\\\" > \\\"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\\\"\\nif [ -z \\\"${RCT_NO_LAUNCH_PACKAGER+xxx}\\\" ] ; then\\n  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\\n    if ! curl -s \\\"http://localhost:${RCT_METRO_PORT}/status\\\" | grep -q \\\"packager-status:running\\\" ; then\\n      echo \\\"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\\\"\\n      exit 2\\n    fi\\n  else\\n    open \\\"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\\\" || echo \\\"Can't start packager automatically\\\"\\n  fi\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t00E356EA1AD99517003FC87E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t00E356F31AD99517003FC87E /* rxptodolistTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4771E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,\n\t\t\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48C1E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DCD954D1E0B4F2C00145EB5 /* rxptodolistTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13B07F861A680F5B00A75B9A /* rxptodolist */;\n\t\t\ttargetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;\n\t\t};\n\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 2D02E47A1E0B4A5D006451C7 /* rxptodolist-tvOS */;\n\t\t\ttargetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = rxptodolist;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t00E356F61AD99517003FC87E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = CE381F97B96B5AA71E2055DF /* Pods-rxptodolist-rxptodolistTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = rxptodolistTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/rxptodolist.app/rxptodolist\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t00E356F71AD99517003FC87E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5599837821D41EB799B8E6E0 /* Pods-rxptodolist-rxptodolistTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tINFOPLIST_FILE = rxptodolistTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/rxptodolist.app/rxptodolist\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8310D291EECCAF6461EC63AF /* Pods-rxptodolist.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"FB_SONARKIT_ENABLED=1\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = rxptodolist/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = rxptodolist;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5C1FF0EA0751FC724C4F26F4 /* Pods-rxptodolist.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tINFOPLIST_FILE = rxptodolist/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)\";\n\t\t\t\tPRODUCT_NAME = rxptodolist;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4971E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 4890428C07BB9EB551F61E35 /* Pods-rxptodolist-tvOS.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"rxptodolist-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.rxptodolist-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E4981E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BDDF5A4BE6FC02B863E2F3EA /* Pods-rxptodolist-tvOS.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"rxptodolist-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.rxptodolist-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4991E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6D318AB4ED5615CE23C8B03 /* Pods-rxptodolist-tvOSTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"rxptodolist-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.rxptodolist-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/rxptodolist-tvOS.app/rxptodolist-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E49A1E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = EEBCDE7E55C8D15CFA4E1C58 /* Pods-rxptodolist-tvOSTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"rxptodolist-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.reactjs.native.example.rxptodolist-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/rxptodolist-tvOS.app/rxptodolist-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"/usr/lib/swift $(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"/usr/lib/swift $(inherited)\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"rxptodolistTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t00E356F61AD99517003FC87E /* Debug */,\n\t\t\t\t00E356F71AD99517003FC87E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"rxptodolist\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"rxptodolist-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4971E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E4981E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"rxptodolist-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4991E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E49A1E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"rxptodolist\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist.xcodeproj/xcshareddata/xcschemes/rxptodolist-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"rxptodolist-tvOS.app\"\n               BlueprintName = \"rxptodolist-tvOS\"\n               ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"rxptodolist-tvOSTests.xctest\"\n               BlueprintName = \"rxptodolist-tvOSTests\"\n               ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"rxptodolist-tvOS.app\"\n            BlueprintName = \"rxptodolist-tvOS\"\n            ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"rxptodolist-tvOS.app\"\n            BlueprintName = \"rxptodolist-tvOS\"\n            ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolist.xcodeproj/xcshareddata/xcschemes/rxptodolist.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1130\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"rxptodolist.app\"\n               BlueprintName = \"rxptodolist\"\n               ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"rxptodolistTests.xctest\"\n               BlueprintName = \"rxptodolistTests\"\n               ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"rxptodolist.app\"\n            BlueprintName = \"rxptodolist\"\n            ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"rxptodolist.app\"\n            BlueprintName = \"rxptodolist\"\n            ReferencedContainer = \"container:rxptodolist.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolistTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/TodoList/ios/rxptodolistTests/rxptodolistTests.m",
    "content": "#import <UIKit/UIKit.h>\n#import <XCTest/XCTest.h>\n\n#import <React/RCTLog.h>\n#import <React/RCTRootView.h>\n\n#define TIMEOUT_SECONDS 600\n#define TEXT_TO_LOOK_FOR @\"Welcome to React\"\n\n@interface rxptodolistTests : XCTestCase\n\n@end\n\n@implementation rxptodolistTests\n\n- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test\n{\n  if (test(view)) {\n    return YES;\n  }\n  for (UIView *subview in [view subviews]) {\n    if ([self findSubviewInView:subview matching:test]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n- (void)testRendersWelcomeScreen\n{\n  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];\n  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];\n  BOOL foundElement = NO;\n\n  __block NSString *redboxError = nil;\n#ifdef DEBUG\n  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {\n    if (level >= RCTLogLevelError) {\n      redboxError = message;\n    }\n  });\n#endif\n\n  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {\n    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n\n    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {\n      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {\n        return YES;\n      }\n      return NO;\n    }];\n  }\n\n#ifdef DEBUG\n  RCTSetLogFunction(RCTDefaultLogFunction);\n#endif\n\n  XCTAssertNil(redboxError, @\"RedBox error: %@\", redboxError);\n  XCTAssertTrue(foundElement, @\"Couldn't find element with text '%@' in %d seconds\", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);\n}\n\n\n@end\n"
  },
  {
    "path": "samples/TodoList/metro.config.js",
    "content": "/**\n * Metro configuration for React Native\n * https://github.com/facebook/react-native\n *\n * @format\n */\n\nmodule.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: {\n        experimentalImportSupport: false,\n        inlineRequires: false,\n      },\n    }),\n  },\n};\n"
  },
  {
    "path": "samples/TodoList/nodeserver.js",
    "content": "/**\n* nodeserver.js\n* Copyright: Microsoft 2018\n*\n* Simple node-based web server that hosts the app.\n*/\n\nvar http = require('http');\nvar fs = require('fs');\nvar _ = require('lodash');\nvar querystring = require('querystring');\nvar serveStatic = require('serve-static');\nvar finalhandler = require('finalhandler');\n\n// Find our static content in the web dir.\nvar serve = serveStatic('./web');\nvar port = 8080;\n\nvar config = {\n    version: '0.0.1.0'\n};\n\nfunction replaceVariables(html, replacements) {\n    _.each(replacements, (val, key) => {\n        // Look for all instances of \"{{ key }}\" and replace them with val.\n        var regEx = new RegExp('\\\\{\\\\{ ' + key + ' \\\\}\\\\}', 'g');\n        html = html.replace(regEx, val);\n    });\n\n    return html;\n}\n\n// Serve up the requested page.\nfunction serveHtmlPage(response, file) {\n    response.writeHead(200, { 'Content-Type': 'text/html' });\n    var html = fs.readFileSync(file, { encoding: 'utf8' });\n    html = replaceVariables(html, {\n        version: config.version\n    });\n    response.end(html);\n}\n\nfunction handler(request, response) {\n    // Require that we're serving files from the proper domain. This is\n    // necessary for OAuth flow and the cert.\n    var knownHosts = [\n        'localhost:8080',\n        'localhost'\n    ];\n\n    if (!_.includes(knownHosts, request.headers.host)) {\n        console.log('Unhandled host: ' + request.headers.host);\n        response.writeHead(404, { 'Content-Type': 'text/html' });\n        response.end('');\n        return;\n    }\n\n    // Serve simple static content through serveStatic/finalhandler.\n    if (request.url.substr(0, 4) === '/js/' || request.url.substr(0, 5) === '/css/' ||\n        request.url.substr(0, 8) === '/images/' || request.url.substr(0, 7) === '/fonts/') {\n        console.log(\"[200] Serving static: \" + request.method + \" to \" + request.url);\n        var done = finalhandler(request, response);\n\n        response.setHeader('Cache-Control', 'private, must-revalidate');\n\n        serve(request, response, done);\n        return;\n    }\n\n    if (request.url.substr(0, 8) === '/version') {\n        console.log(\"[200] Serving static: \" + request.method + \" to \" + request.url);\n        response.writeHead(200, { 'Content-Type': 'application/json' });\n        response.end('{\"AppVersion\": \"' + config.version + '\"}');\n        return;\n    }\n\n    console.log(\"[200] \" + request.method + \" to \" + request.url);\n\n    if (request.url.substr(0, 14) === '/oauthcallback') {\n        response.writeHead(200, { 'Content-Type': 'text/html' });\n        response.end();\n        return;\n    }\n\n    // Everything else falls through to the single index.html file.\n    if (request.method == 'POST') {\n        // Someone's logging in, probably.\n        var body = '';\n        request.on('data', function (chunk) {\n            body += chunk.toString();\n        });\n        request.on('end', function () {\n            var decodedBody = querystring.parse(body);\n            console.log(decodedBody);\n\n            serveHtmlPage(response, 'web/index.html');\n        });\n    } else {\n        serveHtmlPage(response, 'web/index.html');\n    }\n}\n\nconsole.log(\n    '\\n' +\n    '───────────────────────────────────────────────────────────────────────────\\n' +\n    ' Running app on port ' + port + '.\\n\\n' +\n    ' Keep this server running while developing and refresh your browser for\\n' +\n    ' fresh assets.\\n\\n' +\n    ' Assuming your hosts and certs have been configured properly, visit\\n' +\n    ' http://localhost:8080\\n' +\n    '───────────────────────────────────────────────────────────────────────────\\n'\n);\n\nhttp.createServer(handler).listen(port);\n\n"
  },
  {
    "path": "samples/TodoList/package.json",
    "content": "{\n    \"name\": \"todolist\",\n    \"version\": \"2.0.0\",\n    \"private\": true,\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"lint\": \"eslint --ext .ts,.tsx src\",\n        \"lint:fix\": \"npm run lint -- --fix\",\n        \"start-web\": \"npm install && npm run gulp-web\",\n        \"gulp-web\": \"cross-env NODE_ENV=development node node_modules/gulp/bin/gulp run --platform=web\",\n        \"start-windows\": \"npm install && npm run gulp-windows\",\n        \"gulp-windows\": \"cross-env NODE_ENV=development node node_modules/gulp/bin/gulp run --platform=windows\",\n        \"start-ios\": \"npm install && npm run gulp-ios\",\n        \"gulp-ios\": \"cross-env NODE_ENV=development node node_modules/gulp/bin/gulp run --platform=ios\",\n        \"start-android\": \"npm install && npm run gulp-android\",\n        \"gulp-android\": \"cross-env NODE_ENV=development node node_modules/gulp/bin/gulp run --platform=android\",\n        \"start\": \"node node_modules/react-native/local-cli/cli.js start\"\n    },\n    \"devDependencies\": {\n        \"@babel/cli\": \"^7.10.4\",\n        \"@babel/core\": \"^7.10.4\",\n        \"@babel/preset-env\": \"^7.10.4\",\n        \"@babel/runtime\": \"^7.10.4\",\n        \"@react-native-community/cli\": \"^9.1.3\",\n        \"@types/node\": \"^14.0.14\",\n        \"@types/react\": \"^16.9.41\",\n        \"@types/webpack\": \"^4.41.18\",\n        \"async\": \"^3.2.2\",\n        \"babel-loader\": \"^8.3.0\",\n        \"babel-plugin-lodash\": \"^3.3.4\",\n        \"cross-env\": \"^7.0.2\",\n        \"del\": \"^5.1.0\",\n        \"event-stream\": \"4.0.1\",\n        \"finalhandler\": \"^1.1.2\",\n        \"fs-extra\": \"^9.0.1\",\n        \"gulp\": \"^4.0.2\",\n        \"gulp-cached\": \"^1.1.1\",\n        \"gulp-eol\": \"^0.2.0\",\n        \"gulp-jshint\": \"^2.1.0\",\n        \"gulp-rename\": \"^2.0.0\",\n        \"gulp-replace-with-sourcemaps\": \"^0.7.1\",\n        \"gulp-shell\": \"^0.8.0\",\n        \"gulp-sourcemaps\": \"^2.6.5\",\n        \"gulp-typescript\": \"^5.0.1\",\n        \"gulp-util\": \"^3.0.8\",\n        \"gulp-watch\": \"^5.0.1\",\n        \"jshint\": \"^2.11.1\",\n        \"jshint-stylish\": \"^2.2.1\",\n        \"metro-react-native-babel-preset\": \"^0.60.0\",\n        \"node-notifier\": \"^7.0.1\",\n        \"path\": \"^0.12.7\",\n        \"path-posix\": \"^1.0.0\",\n        \"pretty-hrtime\": \"^1.0.3\",\n        \"run-sequence\": \"^2.2.1\",\n        \"serve-static\": \"^1.14.1\",\n        \"ts-loader\": \"^9.4.2\",\n        \"ts-node\": \"^8.10.2\",\n        \"typescript\": \"^3.9.6\",\n        \"webpack\": \"^5.75.0\",\n        \"webpack-cli\": \"^5.0.1\",\n        \"yargs\": \"^15.4.0\"\n    },\n    \"dependencies\": {\n        \"@typescript-eslint/eslint-plugin\": \"^3.5.0\",\n        \"eslint\": \"^7.4.0\",\n        \"eslint-config-skype\": \"^1.7.0\",\n        \"eslint-plugin-import\": \"^2.22.0\",\n        \"eslint-plugin-react\": \"^7.20.3\",\n        \"gulp-eslint\": \"^6.0.0\",\n        \"nosqlprovider\": \"^0.6.23\",\n        \"react\": \"^16.13.1\",\n        \"react-dom\": \"^16.13.1\",\n        \"react-native\": \"0.70.2\",\n        \"react-native-sqlite-storage\": \"^5.0.0\",\n        \"react-native-windows\": \"^0.62.0\",\n        \"reactxp\": \"^2.0.0\",\n        \"reactxp-navigation\": \"^2.0.0\",\n        \"reactxp-virtuallistview\": \"^2.1.0\",\n        \"resub\": \"^2.3.0\",\n        \"simplerestclients\": \"^1.0.0\",\n        \"synctasks\": \"^0.3.3\"\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/AppBootstrapper.tsx",
    "content": "/**\n* AppBootstrapper.tsx\n* Copyright: Microsoft 2018\n*\n* Main entry point for the app, common to both native and web.\n*/\n\nimport { DbProvider } from 'nosqlprovider';\nimport * as RX from 'reactxp';\nimport * as SyncTasks from 'synctasks';\n\nimport NavContextStore from '../stores/NavContextStore';\nimport PageUrlService from '../services/PageUrlService';\nimport ResponsiveWidthStore from '../stores/ResponsiveWidthStore';\nimport RootView from '../views/RootView';\nimport ServiceManager, { Service } from '../services/ServiceManager';\nimport ServiceRegistrar from '../services/ServiceRegistrar';\nimport TodosStore from '../stores/TodosStore';\n\nimport LocalDb from './LocalDb';\nimport DeepLinkConverter from './DeepLinkConverter';\nimport AppConfig from './AppConfig';\n\nexport default abstract class AppBootstrapper {\n    constructor() {\n        RX.App.initialize(__DEV__, __DEV__);\n\n        ServiceRegistrar.init();\n\n        // Open the DB and startup any critical services before displaying the UI.\n        LocalDb.open(this._getDbProvidersToTry()).then(() => this._startCriticalServices()).then(() => {\n            RX.UserInterface.setMainView(this._renderRootView());\n\n            // Convert the initial URL into a navigation context.\n            this._getInitialUrl().then(url => {\n                if (url) {\n                    const context = DeepLinkConverter.getContextFromUrl(url, NavContextStore.isUsingStackNav());\n                    if (context) {\n                        NavContextStore.setNavContext(context);\n                    }\n                }\n            });\n        });\n    }\n\n    private _startCriticalServices(): SyncTasks.Promise<void> {\n        const servicesToStart: Service[] = [TodosStore];\n\n        if (AppConfig.getPlatformType() === 'web') {\n            servicesToStart.push(PageUrlService);\n        }\n\n        return ServiceManager.ensureStarted(servicesToStart);\n    }\n\n    private _renderRootView() {\n        return (\n            <RootView\n                onLayout={ this._onLayoutRootView }\n            />\n        );\n    }\n\n    private _onLayoutRootView = (e: RX.Types.ViewOnLayoutEvent) => {\n        const { width, height } = e;\n        ResponsiveWidthStore.putWindowSize(width, height);\n    };\n\n    // Subclasses must override.\n    protected abstract _getDbProvidersToTry(): DbProvider[];\n    protected abstract _getInitialUrl(): SyncTasks.Promise<string | undefined>;\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/AppBootstrapperNative.tsx",
    "content": "/**\n* AppBootstrapperNative.tsx\n* Copyright: Microsoft 2018\n*\n* Main entry point for the native app.\n*/\n\n// Do shimming before anything else.\nimport * as ShimHelpers from '../utilities/ShimHelpers';\nShimHelpers.shimEnvironment(__DEV__, true);\n\n// Initialize AppConfig.\nimport AppConfig from './AppConfig';\nAppConfig.initialize({});\n\nimport { DbProvider } from 'nosqlprovider';\nimport { CordovaNativeSqliteProvider } from 'nosqlprovider/dist/CordovaNativeSqliteProvider';\nimport { InMemoryProvider } from 'nosqlprovider/dist/InMemoryProvider';\nimport * as RX from 'reactxp';\nimport * as SyncTasks from 'synctasks';\n\nimport AppBootstrapper from './AppBootstrapper';\n\nclass AppBootstrapperNative extends AppBootstrapper {\n    protected _getDbProvidersToTry(): DbProvider[] {\n        const rnSqliteProvider = require('react-native-sqlite-storage');\n\n        // Specify the DB providers that are valid on the RN platforms.\n        return [\n            new CordovaNativeSqliteProvider(rnSqliteProvider),\n            new InMemoryProvider(),\n        ];\n    }\n\n    protected _getInitialUrl(): SyncTasks.Promise<string | undefined> {\n        return SyncTasks.fromThenable(RX.Linking.getInitialUrl());\n    }\n}\n\nexport default new AppBootstrapperNative();\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/AppBootstrapperWeb.tsx",
    "content": "/**\n* AppBootstrapperWeb.tsx\n* Copyright: Microsoft 2018\n*\n* Main entry point for the web app.\n*/\n\n// Do shimming before anything else.\nimport * as ShimHelpers from '../utilities/ShimHelpers';\nShimHelpers.shimEnvironment(__DEV__, false);\n\n// Initialize AppConfig.\nconst appVersionElement = document.getElementById('appVersion')!;\nconst appVersion = (appVersionElement as HTMLInputElement).value;\nappVersionElement.parentElement!.removeChild(appVersionElement);\nAppConfig.initialize({\n    appVersion,\n});\n\nimport { DbProvider } from 'nosqlprovider';\nimport { IndexedDbProvider } from 'nosqlprovider/dist/IndexedDbProvider';\nimport { InMemoryProvider } from 'nosqlprovider/dist/InMemoryProvider';\nimport { WebSqlProvider } from 'nosqlprovider/dist/WebSqlProvider';\nimport * as SyncTasks from 'synctasks';\n\nimport AppConfig from './AppConfig';\n\nimport AppBootstrapper from './AppBootstrapper';\n\nclass AppBootstrapperWeb extends AppBootstrapper {\n    protected _getDbProvidersToTry(): DbProvider[] {\n        // Specify the DB providers that are valid on browser platforms.\n        return [\n            new IndexedDbProvider(),\n            new WebSqlProvider(),\n            new InMemoryProvider(),\n        ];\n    }\n\n    protected _getInitialUrl(): SyncTasks.Promise<string | undefined> {\n        return SyncTasks.Resolved(window.location.href);\n    }\n}\n\nexport default new AppBootstrapperWeb();\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/AppConfig.ts",
    "content": "/**\n* AppConfig.ts\n* Copyright: Microsoft 2018\n*\n* Provides access to configuration information for the app.\n* All of these settings are assumed to be static (set at app\n* launch time) throughout the lifetime of the app.\n*/\n\nimport * as RX from 'reactxp';\n\ninterface InitParams {\n    appVersion?: string;\n}\n\nclass AppConfig {\n    private _appVersion: string;\n    private _frontendHost: string;\n    private _platformType: RX.Types.PlatformType;\n    private _isTouchInterface: boolean;\n    private _startupTime: number;\n\n    constructor() {\n        this._appVersion = '0.0.0.1';\n        this._frontendHost = document && document.location ? document.location.host : '';\n        this._platformType = RX.Platform.getType();\n        this._isTouchInterface = this._platformType === 'ios' || this._platformType === 'android';\n        this._startupTime = Date.now();\n    }\n\n    initialize(params: InitParams) {\n        if (params.appVersion) {\n            this._appVersion = params.appVersion;\n        }\n    }\n\n    isDevelopmentBuild(): boolean {\n        return __DEV__;\n    }\n\n    getPlatformType(): RX.Types.PlatformType {\n        return this._platformType;\n    }\n\n    isTouchInterface(): boolean {\n        return this._isTouchInterface;\n    }\n\n    getStartupTime(): number {\n        return this._startupTime;\n    }\n\n    getAppVersion(): string {\n        return this._appVersion;\n    }\n\n    getFrontendHost(): string {\n        return this._frontendHost;\n    }\n\n    getProtocol(): string {\n        if (this.getPlatformType() === 'web' &&\n            typeof location !== 'undefined' &&\n            typeof location.protocol !== 'undefined') {\n            return location.protocol;\n        }\n        return 'https:';\n    }\n\n    getFrontendBaseUrl(): string {\n        return this.getProtocol() + '//' + this._frontendHost;\n    }\n\n    getDocRoot(): string {\n        return '/';\n    }\n\n    getImagePath(imageName = ''): string {\n        return this.getDocRoot() + 'images/' + imageName;\n    }\n}\n\nexport default new AppConfig();\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/DeepLinkConverter.ts",
    "content": "/*\n* DeepLinkConverter.tsx\n* Copyright: Microsoft 2018\n*\n* Converts between app (deep-link) URLs and navigation contexts.\n*/\n\nimport * as assert from 'assert';\n\nimport * as _ from 'lodash';\n\nimport NavActions from '../app/NavActions';\nimport * as NavModels from '../models/NavModels';\n\nimport AppConfig from './AppConfig';\n\nexport default class DeepLinkConverter {\n    static getUrlFromContext(context: NavModels.RootNavContext): string {\n        let url = AppConfig.getFrontendBaseUrl();\n\n        if (context.isStackNav) {\n            const stackContext = context as NavModels.StackRootNavContext;\n            const topViewContext = stackContext.stack[stackContext.stack.length - 1];\n\n            if (topViewContext instanceof NavModels.TodoListViewNavContext) {\n                url += '/todos';\n                return url;\n            } else if (topViewContext instanceof NavModels.ViewTodoViewNavContext) {\n                url += '/todos?selected=' + encodeURIComponent(topViewContext.todoId);\n                return url;\n            } else if (topViewContext instanceof NavModels.NewTodoViewNavContext) {\n                url += '/todos?selected=new';\n                return url;\n            }\n        } else {\n            const compositeContext = context as NavModels.CompositeRootNavContext;\n            if (compositeContext instanceof NavModels.TodoRootNavContext) {\n                url += '/todos';\n                const todoListContext = context as NavModels.TodoRootNavContext;\n                if (todoListContext.showNewTodoPanel) {\n                    url += '?selected=new';\n                } else if (todoListContext.todoList.selectedTodoId) {\n                    url += '?selected=' + encodeURIComponent(todoListContext.todoList.selectedTodoId);\n                }\n                return url;\n            } else {\n                // TODO - need to implement\n                assert.fail('Unimplemented');\n            }\n        }\n\n        return '';\n    }\n\n    static getContextFromUrl(url: string, isStackNav: boolean): NavModels.RootNavContext | undefined {\n        const urlObj = new URL(url);\n        if (!urlObj) {\n            return undefined;\n        }\n\n        const pathElements = _.map(_.split(urlObj.pathname, '/'), elem => decodeURIComponent(elem));\n        if (pathElements.length < 2) {\n            return undefined;\n        }\n\n        switch (pathElements[1]) {\n            case 'todos':\n                let selectedTodoId: string | undefined;\n                let showNewPanel = false;\n\n                const selectedValue = urlObj.searchParams.get('selected');\n                if (selectedValue === 'new') {\n                    showNewPanel = true;\n                } else if (selectedValue) {\n                    selectedTodoId = selectedValue;\n                }\n\n                return NavActions.createTodoListContext(isStackNav, selectedTodoId, showNewPanel);\n\n            default:\n                return undefined;\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/LocalDb.ts",
    "content": "/**\n* LocalDb.tsx\n* Copyright: Microsoft 2018\n*\n* Local database implementation and interface for the app.\n*/\n\nimport { DbProvider, DbSchema } from 'nosqlprovider';\nimport * as SyncTasks from 'synctasks';\n\nimport * as TodoModels from '../models/TodoModels';\n\n// The actual value is just a string, but the type system can extract this extra info.\ntype DBStore<Name extends string, ObjectType, KeyFormat> = string & { name?: Name; objectType?: ObjectType; keyFormat?: KeyFormat };\ntype DBIndex<Store extends DBStore<string, any, any>, IndexKeyFormat> = string & { store?: Store; indexKeyFormat?: IndexKeyFormat };\n\nconst _appDatabaseName = 'todoDb';\nconst _appSchemaVersion = 1;\nconst Stores = {\n    todoItems: 'todoItems_v1' as DBStore<'TodoItemsStore', TodoModels.Todo, string>,\n};\nconst Indexes = {\n    todoSearchTerms: 'todoItems_searchTerms_v1' as DBIndex<typeof Stores.todoItems, string>,\n};\n\nconst _appSchema: DbSchema = {\n    version: _appSchemaVersion,\n    lastUsableVersion: _appSchemaVersion,\n    stores: [\n        {\n            name: Stores.todoItems,\n            primaryKeyPath: 'id',\n            indexes: [\n                {\n                    name: Indexes.todoSearchTerms,\n                    keyPath: '_searchTerms',\n                    fullText: true,\n                },\n            ],\n        },\n    ],\n};\n\nclass LocalDb {\n    private _db: DbProvider | undefined;\n\n    open(providersToTry: DbProvider[]): SyncTasks.Promise<void> {\n        return this._openListOfProviders(providersToTry, _appDatabaseName, _appSchema).then(prov => {\n            this._db = prov;\n        });\n    }\n\n    private _openListOfProviders(providersToTry: DbProvider[], dbName: string, schema: DbSchema):\n    SyncTasks.Promise<DbProvider> {\n\n        const task = SyncTasks.Defer<DbProvider>();\n        let providerIndex = 0;\n        const errorList: any[] = [];\n\n        console.log('Opening Database: Providers: ' + providersToTry.length);\n\n        const tryNext = () => {\n            if (providerIndex >= providersToTry.length) {\n                task.reject(errorList.length <= 1 ? errorList[0] : errorList);\n                return;\n            }\n\n            const provider = providersToTry[providerIndex];\n            provider.open(dbName, schema, false, false).then(() => {\n                console.log('Provider ' + providerIndex + ': Open Success!');\n                task.resolve(provider);\n            }, err => {\n                console.error('Provider ' + providerIndex + ': Open Failure: ' + JSON.stringify(err));\n                errorList.push(err);\n                providerIndex++;\n                tryNext();\n            });\n        };\n\n        tryNext();\n\n        return task.promise();\n    }\n\n    // Returns all todo items from the DB.\n    getAllTodos(): SyncTasks.Promise<TodoModels.Todo[]> {\n        if (!this._db) {\n            return SyncTasks.Rejected('Database not open');\n        }\n\n        return this._db.openTransaction([Stores.todoItems], false).then(tx => tx.getStore(Stores.todoItems)).then(store => store.openPrimaryKey().getAll() as SyncTasks.Promise<TodoModels.Todo[]>).fail(this._handleDbFail);\n    }\n\n    // Adds a new todo item to the DB.\n    putTodo(todo: TodoModels.Todo): SyncTasks.Promise<void> {\n        if (!this._db) {\n            return SyncTasks.Rejected('Database not open');\n        }\n\n        return this._db.openTransaction([Stores.todoItems], true).then(tx => tx.getStore(Stores.todoItems)).then(store => store.put(todo)).fail(this._handleDbFail);\n    }\n\n    /**\n     * Deletes a todo item from the DB\n     * @param todoId item to delete\n     */\n    deleteTodo(todoId: string): SyncTasks.Promise<void> {\n        if (!this._db) {\n            return SyncTasks.Rejected('Database not open');\n        }\n\n        return this._db.openTransaction([Stores.todoItems], true).then(tx => tx.getStore(Stores.todoItems)).then(store => store.remove(todoId)).fail(this._handleDbFail);\n    }\n\n    private _handleDbFail = (err: any) => {\n        if (err.target) {\n            if (err.target.error) {\n                const error = err.target.error;\n                console.error(`IDBRequest: ${error.name}: ${error.message}`);\n            }\n            if (err.target.transaction && err.target.transaction.error) {\n                const error = err.target.transaction.error;\n                console.error(`IDBTransaction: ${error.name}: ${error.message}`);\n            }\n            if (err.target.source) {\n                const source = err.target.source;\n                console.error(`IDBStore: ${source.name}, ${source.keyPath}, indexes: ${source.indexNames.join()}`);\n            }\n        }\n    };\n}\n\nexport default new LocalDb();\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/NavActions.ts",
    "content": "/*\n* NavActions.tsx\n* Copyright: Microsoft 2018\n*\n* Constructs navigation contexts.\n*/\n\nimport * as NavModels from '../models/NavModels';\n\nexport default class NavActions {\n    static createTodoListContext(useStackNav: boolean, selectedTodoId?: string, showNewTodoPanel = false) {\n        if (useStackNav) {\n            const navContext = new NavModels.StackRootNavContext();\n            navContext.stack.push(new NavModels.TodoListViewNavContext(selectedTodoId));\n            if (showNewTodoPanel) {\n                navContext.stack.push(new NavModels.NewTodoViewNavContext());\n            } else if (selectedTodoId !== undefined) {\n                navContext.stack.push(new NavModels.ViewTodoViewNavContext(selectedTodoId));\n            }\n            return navContext;\n        } else {\n            return new NavModels.TodoRootNavContext(selectedTodoId, showNewTodoPanel);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/README.md",
    "content": "# \"app\" directory\n\nThis directory contains modules that are related to app startup and configuration. It also contains various other app-wide modules that don't have a good home elsewhere.\n\n\n"
  },
  {
    "path": "samples/TodoList/src/ts/app/Styles.tsx",
    "content": "/**\n* Styles.tsx\n* Copyright: Microsoft 2018\n*\n* Shared style information used throughout the application.\n*/\n\nimport { default as FontRefs } from 'modules/fonts';\nimport * as RX from 'reactxp';\n\nexport const enum Colors {\n    black = '#000000',\n\n    white = '#fff',\n    gray66 = '#666',\n    grayEE = '#eee',\n    grayF8 = '#f8f8f8',\n    transparent = 'rgba(0, 0, 0, 0)',\n\n    headerBackground = 'white',\n    contentBackground = 'white',\n    logoColor = '#339933',\n\n    borderSeparator = '#ccc',\n    borderSeparatorLight = '#eee',\n    separator = '#eee',\n    menuText = '#666',\n    menuTextSelected = '#225577',\n    menuTextDisabled = '#bbb',\n    menuTextHover = '#000',\n    menuItemHover = '#eee',\n    menuBackground = '#fff',\n    menuBorder = '#bbb',\n    listItemHover = '#f8f8ff',\n    listItemSelected = '#ddeeff',\n    buttonTextColor = '#666',\n    buttonTextHover = '#000',\n    simpleButtonBackground = '#fff',\n    simpleButtonBackgroundHover = '#eee',\n    simpleButtonBorder = '#999',\n    simpleButtonText = '#666',\n    simpleButtonTextHover = '#000',\n    simpleDialogBackground = '#fff',\n    simpleDialogBorder = '#ddd',\n    simpleDialogText = '#666',\n    simpleDialogBehind = 'rgba(0, 0, 0, 0.05)'\n}\n\nexport const enum FontSizes {\n    size12 = 12,\n    size14 = 14,\n    size16 = 16,\n    size20 = 20,\n    size32 = 32,\n\n    menuItem = 16\n}\n\n// Font infos\nexport class Fonts {\n    static monospace: RX.Types.FontInfo = {\n        fontFamily: FontRefs.monospace,\n    };\n\n    static displayLight: RX.Types.FontInfo = {\n        fontFamily: FontRefs.displayLight,\n    };\n\n    static displayRegular: RX.Types.FontInfo = {\n        fontFamily: FontRefs.displayRegular,\n        fontWeight: '400',\n    };\n\n    static displaySemibold: RX.Types.FontInfo = {\n        fontFamily: FontRefs.displaySemibold,\n        fontWeight: '600',\n    };\n\n    static displayBold: RX.Types.FontInfo = {\n        fontFamily: FontRefs.displayBold,\n        fontWeight: '700',\n    };\n}\n\n// Styles\nexport class Styles {\n    static statusBarTopMargin = RX.Styles.createViewStyle({\n        marginTop: RX.StatusBar.isOverlay() ? 20 : 0,\n    });\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/HoverButton.tsx",
    "content": "/*\n* HoverButton.tsx\n* Copyright: Microsoft 2018\n*\n* A button that renders differently when the mouse pointer\n* is hovering over it.\n*/\n\nimport * as RX from 'reactxp';\n\nexport interface HoverButtonProps extends RX.CommonProps {\n    onRenderChild: (isHovering: boolean) => JSX.Element | null;\n    onPress?: (e: RX.Types.SyntheticEvent) => void;\n    title?: string;\n    disabled?: boolean;\n}\n\nexport interface HoverButtonState {\n    isHovering: boolean;\n}\n\nexport default class HoverButton extends RX.Component<HoverButtonProps, HoverButtonState> {\n    render(): JSX.Element | null {\n        return (\n            <RX.Button\n                onPress={ this._onPress }\n                onHoverStart={ this._onHoverStart }\n                onHoverEnd={ this._onHoverEnd }\n                title={ this.props.title }\n                disabled={ this.props.disabled }\n            >\n                { this.props.onRenderChild(this.state ? this.state.isHovering : false) }\n            </RX.Button>\n        );\n    }\n\n    private _onPress = (e: RX.Types.SyntheticEvent) => {\n        if (this.props.onPress) {\n            this.props.onPress(e);\n        }\n    };\n\n    private _onHoverStart = () => {\n        if (!this.props.disabled) {\n            this.setState({ isHovering: true });\n        }\n    };\n\n    private _onHoverEnd = () => {\n        if (!this.props.disabled) {\n            this.setState({ isHovering: false });\n        }\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/Modal.tsx",
    "content": "/**\n* Modal.ts\n* Copyright: Microsoft 2018\n*\n* Modal dialog container, typically embedded within RX.Modal.\n*/\n\nimport * as assert from 'assert';\n\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport KeyCodes from '../utilities/KeyCodes';\nimport { Colors } from '../app/Styles';\n\ninterface ModalProps extends RX.CommonProps {\n    modalId: string;\n    children?: JSX.Element | JSX.Element[];\n    modalWidth?: number;\n    modalHeight?: number;\n}\n\ninterface ModalState {\n    widthStyle?: RX.Types.ViewStyleRuleSet;\n    heightStyle?: RX.Types.ViewStyleRuleSet;\n}\n\nconst _opacityAnimationDuration = 150;\nconst _scalingAnimationDuration = 250;\nconst _initialScalingRatio = 0.95;\n\nconst _styles = {\n    modalContainerBackground: RX.Styles.createViewStyle({\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: Colors.simpleDialogBehind,\n        flexDirection: 'row',\n    }),\n    modalContainer: RX.Styles.createViewStyle({\n        flex: -1,\n        flexDirection: 'row',\n    }),\n    modalBox: RX.Styles.createViewStyle({\n        flex: -1,\n        margin: 32,\n    }),\n};\n\nexport default class Modal extends ComponentBase<ModalProps, ModalState> {\n    private static _visibleModalMap: { [modalId: string]: Modal } = {};\n\n    private _contentOpacityValue = new RX.Animated.Value(1);\n    private _contentScaleValue = new RX.Animated.Value(_initialScalingRatio);\n    private _contentScaleAnimationStyle = RX.Styles.createAnimatedViewStyle({\n        opacity: this._contentOpacityValue,\n        transform: [{\n            scale: this._contentScaleValue,\n        }],\n    });\n\n    private _opacityAnimationValue = new RX.Animated.Value(1);\n    private _opacityAnimationStyle = RX.Styles.createAnimatedViewStyle({\n        opacity: this._opacityAnimationValue,\n    });\n\n    protected _buildState(props: ModalProps, initialBuild: boolean): Partial<ModalState> {\n        const newState: Partial<ModalState> = {\n        };\n\n        newState.widthStyle = props.modalWidth ? RX.Styles.createViewStyle({\n            width: props.modalWidth,\n        }, false) : undefined;\n\n        newState.heightStyle = props.modalHeight ? RX.Styles.createViewStyle({\n            height: props.modalHeight,\n        }, false) : undefined;\n\n        return newState;\n    }\n\n    UNSAFE_componentWillMount() {\n        // To give children a chance to cancel the ESC handler,\n        // subscribing in componentWillMount so that the children\n        // could subscribe after.\n        RX.Input.keyUpEvent.subscribe(this._onKeyUp);\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n\n        Modal._visibleModalMap[this.props.modalId] = this;\n\n        RX.Animated.timing(this._contentScaleValue, {\n            toValue: 1,\n            duration: _scalingAnimationDuration,\n            easing: RX.Animated.Easing.OutBack(),\n            useNativeDriver: true,\n        }).start();\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n\n        delete Modal._visibleModalMap[this.props.modalId];\n\n        RX.Input.keyUpEvent.unsubscribe(this._onKeyUp);\n    }\n\n    UNSAFE_componentWillUpdate(newProps: ModalProps, newState: ModalState, newContext: any) {\n        // We assume the modalId doesn't change.\n        assert.ok(newProps.modalId === this.props.modalId);\n    }\n\n    render() {\n        const modalBoxStyles = [_styles.modalBox, this.state.widthStyle];\n        const modalContentStyles = [_styles.modalContainer, this._contentScaleAnimationStyle, this.state.heightStyle];\n\n        const modalContent = (\n            <RX.Animated.View style={ modalContentStyles }>\n                <RX.View\n                    style={ modalBoxStyles }\n                    onPress={ this._clickInside }\n                    accessibilityTraits={ RX.Types.AccessibilityTrait.Dialog }\n                    restrictFocusWithin={ true }\n                    disableTouchOpacityAnimation={ true }\n                    tabIndex={ -1 }\n                >\n                    { this.props.children }\n                </RX.View>\n            </RX.Animated.View>\n        );\n\n        return (\n            <RX.Animated.View\n                style={ [_styles.modalContainerBackground, this._opacityAnimationStyle] }\n                onPress={ this._clickOutside }\n                onLongPress={ this._onLongPressOutside }\n                disableTouchOpacityAnimation={ true }\n            >\n                { modalContent }\n            </RX.Animated.View>\n        );\n    }\n\n    private _onKeyUp = (e: RX.Types.KeyboardEvent) => {\n        if (e.keyCode === KeyCodes.Escape) {\n            this._clickOutside(e);\n            return true;\n        }\n        return false;\n    };\n\n    private _clickInside = (e: RX.Types.SyntheticEvent) => {\n        // Do nothing, keeps click/press from propogating up to the dismissal action.\n        e.stopPropagation();\n    };\n\n    private _onLongPressOutside = (e: RX.Types.SyntheticEvent) => {\n        // Do nothing, required to keep onPress from firing on long press.\n        e.stopPropagation();\n    };\n\n    private _clickOutside = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n    };\n\n    private _animateClose(onAnimationComplete: () => void) {\n        RX.Animated.parallel([\n            RX.Animated.timing(this._opacityAnimationValue, {\n                toValue: 0,\n                duration: _opacityAnimationDuration,\n                easing: RX.Animated.Easing.Out(),\n                useNativeDriver: true,\n            }),\n            RX.Animated.timing(this._contentOpacityValue, {\n                toValue: 0,\n                duration: _opacityAnimationDuration,\n                easing: RX.Animated.Easing.Out(),\n                useNativeDriver: true,\n            }),\n            RX.Animated.timing(this._contentScaleValue, {\n                toValue: _initialScalingRatio,\n                duration: _scalingAnimationDuration,\n                easing: RX.Animated.Easing.Out(),\n                useNativeDriver: true,\n            }),\n        ]).start(() => {\n            onAnimationComplete();\n        });\n    }\n\n    static dismissAnimated(modalId: string): Promise<void> {\n        const modal = Modal._visibleModalMap[modalId];\n        if (!modal) {\n            return Promise.reject('Modal ID not found');\n        }\n\n        return new Promise<void>(resolve => {\n            modal._animateClose(() => {\n                RX.Modal.dismiss(modalId);\n                resolve(void 0);\n            });\n        });\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/README.md",
    "content": "# \"controls\" directory\n\nThis directory contains reusable controls that are not specific to this app. They should remain relatively free of dependencies on other modules within the app, facilitating their reuse within other projects."
  },
  {
    "path": "samples/TodoList/src/ts/controls/SimpleButton.tsx",
    "content": "/*\n* SimpleButton.tsx\n* Copyright: Microsoft 2018\n*\n* A \"classic\" button with text as a label.\n*/\n\nimport * as RX from 'reactxp';\n\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\n\nimport HoverButton from './HoverButton';\n\nexport interface SimpleButtonProps {\n    onPress?: (e: RX.Types.SyntheticEvent) => void;\n    title?: string;\n    text: string;\n    disabled?: boolean;\n\n    textStyle?: RX.Types.StyleRuleSetRecursive<RX.Types.TextStyle>;\n    textHoverStyle?: RX.Types.StyleRuleSetRecursive<RX.Types.TextStyle>;\n    buttonStyle?: RX.Types.StyleRuleSetRecursive<RX.Types.ViewStyle>;\n    buttonHoverStyle?: RX.Types.StyleRuleSetRecursive<RX.Types.ViewStyle>;\n}\n\nconst _styles = {\n    button: RX.Styles.createViewStyle({\n        borderWidth: 1,\n        borderRadius: 8,\n        paddingVertical: 4,\n        paddingHorizontal: 12,\n        backgroundColor: Colors.simpleButtonBackground,\n        borderColor: Colors.simpleButtonBorder,\n    }),\n    buttonHover: RX.Styles.createViewStyle({\n        backgroundColor: Colors.simpleButtonBackgroundHover,\n    }),\n    text: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.simpleButtonText,\n    }),\n    textHover: RX.Styles.createTextStyle({\n        color: Colors.simpleButtonTextHover,\n    }),\n};\n\nexport default class SimpleButton extends RX.Component<SimpleButtonProps, RX.Stateless> {\n    render(): JSX.Element | null {\n        return (\n            <HoverButton\n                title={ this.props.title }\n                disabled={ this.props.disabled }\n                onPress={ this.props.onPress }\n                onRenderChild={ this._onRenderButton }\n            />\n        );\n    }\n\n    private _onRenderButton = (isHovering: boolean) => {\n        const buttonStyles = [_styles.button, this.props.buttonStyle];\n        const textStyles = [_styles.text, this.props.textStyle];\n        if (isHovering) {\n            buttonStyles.push(_styles.buttonHover);\n            buttonStyles.push(this.props.buttonHoverStyle);\n            textStyles.push(_styles.textHover);\n            textStyles.push(this.props.textHoverStyle);\n        }\n\n        return (\n            <RX.View style={ buttonStyles }>\n                <RX.Text style={ textStyles }>\n                    { this.props.text }\n                </RX.Text>\n            </RX.View>\n        );\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/SimpleDialog.tsx",
    "content": "/**\n* SimpleDialog.tsx\n* Copyright: Microsoft 2018\n*\n* Defines the contents (including a title and buttons) for\n* a dialog box. Typically embedded within an RX.Modal component.\n*/\n\nimport * as _ from 'lodash';\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport KeyCodes from '../utilities/KeyCodes';\n\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\n\nimport Modal from './Modal';\nimport SimpleButton from './SimpleButton';\n\nexport interface SimpleDialogButton {\n    text?: string;\n    onPress?: () => void;\n    buttonStyle?: RX.Types.ButtonStyleRuleSet;\n    textStyle?: RX.Types.TextStyleRuleSet;\n    isCancel?: boolean;\n    isSubmit?: boolean;\n    isDisabled?: boolean;\n}\n\n// Note: This class is meant to handle only simple dialogs. If you need somewhat more\n// complicated behavior, you may be tempted to extend this class. Please don't do this\n// because it will no longer be \"simple\" if everyone adds these tweaks to it. Instead,\n// implement your custom logic within your own dialog class.\nexport interface SimpleDialogProps {\n    dialogId: string;\n\n    maxWidth?: number;\n    maxHeight?: number;\n\n    containerStyle?: RX.Types.ViewStyleRuleSet;\n\n    title?: string;\n    text?: string;\n    children?: RX.Types.ReactNode;\n    buttons?: SimpleDialogButton[];\n}\n\nconst _modalPadding = 16;\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        backgroundColor: Colors.simpleDialogBackground,\n        borderWidth: 1,\n        borderColor: Colors.simpleDialogBorder,\n    }),\n    titleText: RX.Styles.createTextStyle({\n        font: Fonts.displaySemibold,\n        fontSize: FontSizes.size16,\n        color: Colors.simpleDialogText,\n        textAlign: 'center',\n        paddingVertical: _modalPadding,\n    }),\n    contentText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.simpleDialogText,\n        textAlign: 'left',\n        paddingVertical: _modalPadding,\n    }),\n    contentContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        paddingHorizontal: _modalPadding,\n    }),\n    buttonContainer: RX.Styles.createViewStyle({\n        alignItems: 'stretch',\n        flexDirection: 'row',\n        justifyContent: 'flex-end',\n        padding: _modalPadding,\n    }),\n    button: RX.Styles.createViewStyle({\n        marginLeft: 12,\n    }),\n    panelHeader: RX.Styles.createTextStyle({\n        font: Fonts.displayBold,\n        fontSize: FontSizes.size16,\n        color: Colors.gray66,\n    }),\n    displayText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.gray66,\n    }),\n};\n\nexport default class SimpleDialog extends ComponentBase<SimpleDialogProps, RX.Stateless> {\n    componentDidMount() {\n        super.componentDidMount();\n\n        RX.Input.backButtonEvent.subscribe(this._onBack);\n        RX.Input.keyUpEvent.subscribe(this._onKeyUp);\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n\n        RX.Input.backButtonEvent.unsubscribe(this._onBack);\n        RX.Input.keyUpEvent.unsubscribe(this._onKeyUp);\n    }\n\n    render() {\n        // Title Text\n        let optionalTitleText: JSX.Element | undefined;\n        if (this.props.title) {\n            optionalTitleText = (\n                <RX.View importantForAccessibility={ RX.Types.ImportantForAccessibility.Yes }>\n                    <RX.Text\n                        style={ [_styles.panelHeader, _styles.titleText] }\n                        importantForAccessibility={ RX.Types.ImportantForAccessibility.NoHideDescendants }\n                    >\n                        { this.props.title }\n                    </RX.Text>\n                </RX.View>\n            );\n        }\n\n        // Content (children)\n        let optionalContent: RX.Types.ReactNode | undefined;\n        if (this.props.children) {\n            optionalContent = this.props.children;\n        } else if (this.props.text) {\n            optionalContent = (\n                <RX.Text style={ [_styles.displayText, _styles.contentText] }>\n                    { this.props.text }\n                </RX.Text>\n            );\n        }\n\n        // Buttons\n        let optionalButtonsContainer: JSX.Element | undefined;\n        if (this.props.buttons && this.props.buttons.length > 0) {\n            const optionalButtons = _.map(this.props.buttons, this._renderButton);\n\n            optionalButtonsContainer = (\n                <RX.View style={ _styles.buttonContainer }>\n                    { optionalButtons }\n                </RX.View>\n            );\n        }\n\n        return (\n            <Modal\n                modalId={ this.props.dialogId }\n                modalWidth={ this.props.maxWidth || 450 }\n                modalHeight={ this.props.maxHeight }\n            >\n                <RX.View style={ [_styles.container, this.props.containerStyle] } >\n                    { optionalTitleText }\n                    <RX.View style={ _styles.contentContainer }>\n                        { optionalContent }\n                    </RX.View>\n                    { optionalButtonsContainer }\n                </RX.View>\n            </Modal>\n        );\n    }\n\n    private _renderButton = (buttonDef: SimpleDialogButton, index: number): JSX.Element => (\n        <SimpleButton\n            key={ index }\n            onPress={ e => this._onButtonPress(e, buttonDef) }\n            title={ buttonDef.text }\n            text={ buttonDef.text || '' }\n            disabled={ buttonDef.isDisabled }\n            buttonStyle={ [_styles.button, buttonDef.buttonStyle] }\n            textStyle={ buttonDef.textStyle }\n        />\n    );\n\n    private _onButtonPress(e: RX.Types.SyntheticEvent, buttonDef: SimpleDialogButton) {\n        e.stopPropagation();\n        this._completeButtonPress(buttonDef);\n    }\n\n    private _completeButtonPress(buttonDef: SimpleDialogButton) {\n        if (buttonDef.onPress) {\n            buttonDef.onPress();\n        }\n    }\n\n    private _onKeyUp = (event: RX.Types.KeyboardEvent) => {\n        let buttonToCall: SimpleDialogButton | undefined;\n\n        if (event.keyCode === KeyCodes.Escape) {\n            _.each(this.props.buttons, button => {\n                if (button.isCancel) {\n                    buttonToCall = button;\n                }\n            });\n\n            if (buttonToCall) {\n                this._completeButtonPress(buttonToCall);\n                return true;\n            }\n        }\n\n        return false;\n    };\n\n    private _onBack = () => {\n        let buttonToCall: SimpleDialogButton | undefined;\n\n        // Map the hardware back button to \"cancel\".\n        _.each(this.props.buttons, button => {\n            if (button.isCancel) {\n                buttonToCall = button;\n            }\n        });\n\n        if (buttonToCall) {\n            this._completeButtonPress(buttonToCall);\n            return true;\n        }\n\n        return false;\n    };\n\n    static dismissAnimated(dialogId: string): Promise<void> {\n        return Modal.dismissAnimated(dialogId);\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/SimpleMenu.tsx",
    "content": "/**\n* SimpleMenu.ts\n* Copyright: Microsoft 2018\n*\n* A simple menu with text items. This component is typically\n* rendered within an RX.Popup.\n*/\n\nimport * as _  from 'lodash';\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport KeyCodes from '../utilities/KeyCodes';\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\n\nexport interface MenuItem {\n    text: string;\n    command: string;\n    disabled?: boolean;\n    checked?: boolean;\n}\n\nexport interface MenuProps extends RX.CommonProps {\n    menuItems: MenuItem[];\n    menuButtonStyles?: RX.Types.StyleRuleSet<RX.Types.ButtonStyle>;\n    menuTextStyles?: RX.Types.StyleRuleSet<RX.Types.TextStyle>;\n\n    onSelectItem: (command: string) => void;\n\n    focusFirst?: boolean;\n}\n\ninterface MenuState {\n    hoverCommand?: string;\n    focusedIndex: number;\n}\n\nconst _styles = {\n    menuContainer: RX.Styles.createViewStyle({\n        backgroundColor: Colors.menuBackground,\n        borderWidth: 1,\n        borderStyle: 'solid',\n        borderColor: Colors.menuBorder,\n    }),\n    menuItemContainer: RX.Styles.createButtonStyle({\n        minHeight: 30,\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        flexDirection: 'row',\n    }),\n    menuItemHover: RX.Styles.createButtonStyle({\n        backgroundColor: Colors.menuItemHover,\n    }),\n    menuItemText: RX.Styles.createTextStyle({\n        flex: 1,\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.menuText,\n        marginLeft: 16,\n        marginRight: 32,\n        marginVertical: 4,\n    }),\n    checkMarkText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        marginRight: 16,\n        color: Colors.menuText,\n    }),\n    disabledText: RX.Styles.createTextStyle({\n        color: Colors.menuTextDisabled,\n    }),\n    divider: RX.Styles.createViewStyle({\n        height: 1,\n        marginVertical: 4,\n        backgroundColor: Colors.grayEE,\n    }),\n};\n\nconst _menuItemPrefix = 'menuitem';\n\nexport default class SimpleMenu extends ComponentBase<MenuProps, MenuState> {\n    private _mountedRefsMap: { [key: string]: any } = {};\n\n    protected _buildState(props: MenuProps, initialBuild: boolean): Partial<MenuState> {\n        if (initialBuild) {\n            return {\n                hoverCommand: undefined,\n                focusedIndex: -1,\n            };\n        }\n        return {};\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n\n        if (this.props.focusFirst) {\n            this.focusFirt();\n        }\n    }\n\n    componentDidUpdate(prevProps: MenuProps, prevState: MenuState, prevContext: any) {\n        super.componentDidUpdate(prevProps, prevState, prevContext);\n\n        if (this.state.focusedIndex !== prevState.focusedIndex) {\n            this.focusItem(this.state.focusedIndex);\n        }\n    }\n\n    focusFirt() {\n        this.focusItem(0);\n    }\n\n    focusLast() {\n        this.focusItem(this.props.menuItems.length - 1);\n    }\n\n    focusItem(index = 0) {\n        if (index < 0 || index > this.props.menuItems.length - 1) {\n            return;\n        }\n\n        if (this.state.focusedIndex === index) {\n            const ref = this._mountedRefsMap.ref(_menuItemPrefix + index);\n            if (ref) {\n                ref.requestFocus();\n            }\n        } else {\n            this.setState({ focusedIndex: index });\n        }\n    }\n\n    render() {\n        const menuItems = _.map(this.props.menuItems, (item, index) => {\n            const buttonContainerStyles = [_styles.menuItemContainer];\n            if (item.text === '-') {\n                return (\n                    <RX.View key={ 'div-' + index } style={ _styles.divider }/>\n                );\n            }\n\n            if (this.props.menuButtonStyles) {\n                buttonContainerStyles.push(this.props.menuButtonStyles);\n            }\n            const textStyles = [_styles.menuItemText];\n            if (this.props.menuTextStyles) {\n                textStyles.push(this.props.menuTextStyles);\n            }\n\n            if (item.command === this.state.hoverCommand && !item.disabled) {\n                buttonContainerStyles.push(_styles.menuItemHover);\n            }\n\n            const accessibilityLabel = item.text;\n            let selectedCheckMark: JSX.Element | undefined;\n            if (item.checked) {\n                selectedCheckMark = (\n                    <RX.Text style={ _styles.checkMarkText }>\n                        { '' }\n                    </RX.Text>\n                );\n            } else if (item.disabled) {\n                textStyles.push(_styles.disabledText);\n            }\n\n            return (\n                <RX.Button\n                    ref={ (elem: any) => this._mountedRefsMap[_menuItemPrefix + index] = elem }\n                    key={ item.command }\n                    style={ buttonContainerStyles }\n                    onPress={ e => this._onClickItem(e, item) }\n                    onHoverStart={ () => this._onMouseEnter(item) }\n                    onHoverEnd={ () => this._onMouseLeave(item) }\n                    disabled={ item.disabled }\n                    tabIndex={ index === this.state.focusedIndex ? 0 : -1 }\n                    accessibilityTraits={ RX.Types.AccessibilityTrait.MenuItem }\n                    accessibilityLabel={ accessibilityLabel }\n                >\n                    <RX.Text style={ textStyles }>\n                        { item.text }\n                    </RX.Text>\n                    { selectedCheckMark }\n                </RX.Button>\n            );\n        });\n\n        return (\n            <RX.View style={ _styles.menuContainer } onKeyPress={ this._onKeyPress }>\n                { menuItems }\n            </RX.View>\n        );\n    }\n\n    private _onKeyPress = (event: RX.Types.KeyboardEvent) => {\n        let currentFocusedIndex = this.state.focusedIndex;\n\n        if (event.keyCode === KeyCodes.UpArrow || event.keyCode === KeyCodes.LeftArrow) {\n            currentFocusedIndex = currentFocusedIndex - 1;\n        }\n        if (event.keyCode === KeyCodes.DownArrow || event.keyCode === KeyCodes.RightArrow) {\n            currentFocusedIndex = currentFocusedIndex + 1;\n        }\n        if (currentFocusedIndex < 0 || currentFocusedIndex >= this.props.menuItems.length) {\n            return;\n        }\n\n        this.setState({ focusedIndex: currentFocusedIndex });\n    };\n\n    private _onClickItem(e: RX.Types.SyntheticEvent, item: MenuItem) {\n        e.stopPropagation();\n\n        if (!item.disabled && this.props.onSelectItem) {\n            this.props.onSelectItem(item.command);\n        }\n    }\n\n    private _onMouseEnter(item: MenuItem) {\n        if (!item.disabled && item.command !== this.state.hoverCommand) {\n            this.setState({\n                hoverCommand: item.command,\n            });\n        }\n    }\n\n    private _onMouseLeave(item: MenuItem) {\n        if (!item.disabled && item.command === this.state.hoverCommand) {\n            this.setState({\n                hoverCommand: undefined,\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/controls/VerticalSeparator.tsx",
    "content": "/*\n* VerticalSeparator.tsx\n* Copyright: Microsoft 2018\n*\n* A simple vertical line that separates items.\n*/\n\nimport * as RX from 'reactxp';\n\nimport { Colors } from '../app/Styles';\n\nexport interface VerticalSeparatorProps {\n    style?: RX.Types.StyleRuleSetRecursive<RX.Types.ViewStyle>;\n}\n\nconst _styles = {\n    separator: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        marginVertical: 12,\n        marginHorizontal: 8,\n        width: 1,\n        backgroundColor: Colors.separator,\n    }),\n};\n\nexport default class VerticalSeparator extends RX.Component<VerticalSeparatorProps, RX.Stateless> {\n    render(): JSX.Element | null {\n        return (\n            <RX.View style={ [_styles.separator, this.props.style] } />\n        );\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/index.web.tsx",
    "content": "/**\n* index.web.tsx\n* Copyright: Microsoft 2018\n*\n* Javascript main entry point for web app.\n*/\n\nimport AppBootstrapperWeb from './app/AppBootstrapperWeb';\n\n// This prevents bundlers/optimizers from stripping out the import above.\nif (AppBootstrapperWeb) {\n    console.log('App started');\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/models/IdentityModels.ts",
    "content": "/**\n* IdentityModels.tsx\n* Copyright: Microsoft 2018\n*\n* Type definitions for user identities.\n*/\n\nexport type UserId = string;\n\nexport interface User {\n    id: string;\n    fullName: string;\n    email?: string;\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/models/NavModels.ts",
    "content": "/**\n* NavModels.ts\n* Copyright: Microsoft 2018\n*\n* Interface and enumeration definitions used for app navigation.\n* A \"navigation context\" describes a location within the app and\n* any associated state that may be expressed within a deep link.\n*\n* A \"view nav context\" describes the state of a view.\n*\n* A \"root nav context\" describes the nav context for the app's\n* root view - the top of the visual hierarchy. Depending on the\n* screen size, the root nav context may be stack-based (consisting\n* of a stack of individual panels) or composite (in which multiple\n* views are displayed side by side).\n*/\n\nimport * as _ from 'lodash';\n\nexport enum NavViewId {\n    TodoComposite = 1,\n    TodoList,\n    NewTodo,\n    ViewTodo\n}\n\n// ----------------------------------------\n// Root nav contexts\n// ----------------------------------------\nexport abstract class RootNavContext {\n    constructor(public isStackNav: boolean) {\n    }\n\n    abstract clone(): RootNavContext;\n}\n\nexport abstract class CompositeRootNavContext extends RootNavContext {\n    constructor(public viewId: NavViewId) {\n        super(false);\n    }\n}\n\nexport class StackRootNavContext extends RootNavContext {\n    stack: ViewNavContext[];\n\n    constructor() {\n        super(true);\n        this.stack = [];\n    }\n\n    clone(): StackRootNavContext {\n        const clone = new StackRootNavContext();\n        _.each(this.stack, navContext => {\n            clone.stack.push(navContext.clone());\n        });\n        return clone;\n    }\n}\n\nexport class TodoRootNavContext extends CompositeRootNavContext {\n    todoList: TodoListViewNavContext;\n\n    constructor(selectedTodoId?: string, public showNewTodoPanel = false) {\n        super(NavViewId.TodoComposite);\n        this.todoList = new TodoListViewNavContext(selectedTodoId);\n    }\n\n    clone(): TodoRootNavContext {\n        return new TodoRootNavContext(this.todoList.selectedTodoId, this.showNewTodoPanel);\n    }\n}\n\n// ----------------------------------------\n// View nav contexts\n// ----------------------------------------\n\nexport abstract class ViewNavContext {\n    constructor(public viewId: NavViewId) {\n    }\n\n    abstract clone(): ViewNavContext;\n}\n\nexport class TodoListViewNavContext extends ViewNavContext {\n    constructor(public selectedTodoId?: string) {\n        super(NavViewId.TodoList);\n    }\n\n    clone(): TodoListViewNavContext {\n        return new TodoListViewNavContext(this.selectedTodoId);\n    }\n}\n\nexport class NewTodoViewNavContext extends ViewNavContext {\n    constructor() {\n        super(NavViewId.NewTodo);\n    }\n\n    clone(): NewTodoViewNavContext {\n        return new NewTodoViewNavContext();\n    }\n}\n\nexport class ViewTodoViewNavContext extends ViewNavContext {\n    constructor(public todoId: string) {\n        super(NavViewId.ViewTodo);\n    }\n\n    clone(): ViewTodoViewNavContext {\n        return new ViewTodoViewNavContext(this.todoId);\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/models/README.md",
    "content": "# \"models\" directory\n\nThis directory contains data structures that are common to other modules. In general, they should be at the bottom of the import tree and should therefore not import any other modules.\n"
  },
  {
    "path": "samples/TodoList/src/ts/models/ResponsiveWidthModels.ts",
    "content": "/**\n* ResponsiveWidthModels.ts\n* Copyright: Microsoft 2018\n*\n* Constants and enumerations used for establishing responsive break points.\n*/\n\nexport enum ResponsiveWidth {\n    // <= 450\n    Tiny,\n    // 451 - 799\n    Small,\n    // 800 - 1279\n    Medium,\n    // >= 1280\n    Large\n}\n\nexport const WidthBreakPoints = {\n    tiny: 451,\n    small: 800,\n    medium: 1280,\n};\n"
  },
  {
    "path": "samples/TodoList/src/ts/models/TodoModels.ts",
    "content": "/**\n* TodoModels.tsx\n* Copyright: Microsoft 2018\n*\n* Data models used with Todo sample app.\n*/\n\nexport interface Todo {\n    id: string;\n    creationTime: number;\n    text: string;\n    _searchTerms: string;\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/README.md",
    "content": "# \"modules\" directory\n\nThis directory contains platform-specific modules. A module should present the same interface for all supported platforms.\n\nTo import a module, use an absolute path with the module name after 'modules/'. For example, if your modules folder is named 'foo', you can import that module like this:\n``` import Foo from 'modules/foo'; ```\n\nThe packager will resolve this at build time to the appropriate platform-specific implementation. It searches in the following order:\n* index.<platform>.ts[x]\n* index.<web|native>.ts[x]\n* index.ts[x]\n\nThis allows for common implementations with platform-specific overrides.\n\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/fonts/Fonts.ts",
    "content": "/**\n* Fonts.ts\n* Copyright: Microsoft 2018\n*\n* Common interface for \"fonts\" module, which handles the fetching\n* of all static images.\n*/\n\nexport interface FontBase {\n    monospace: string;\n\n    displayLight: string;\n    displayRegular: string;\n    displaySemibold: string;\n    displayBold: string;\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/fonts/index.native.ts",
    "content": "/**\n* index.native.ts\n* Copyright: Microsoft 2018\n*\n* Native implementation of \"fonts\" module.\n*/\n\nimport { FontBase } from './Fonts';\n\nclass Fonts implements FontBase {\n    monospace = 'System';\n\n    displayLight = 'System';\n    displayRegular = 'System';\n    displaySemibold = 'System';\n    displayBold = 'System';\n}\n\nexport default new Fonts();\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/fonts/index.web.ts",
    "content": "/**\n* index.web.ts\n* Copyright: Microsoft 2018\n*\n* Web implementation of \"fonts\" module.\n*/\n\nimport { FontBase } from './Fonts';\n\nclass Fonts implements FontBase {\n    monospace = 'monospace';\n\n    displayLight = '\"SF Semilight\", \"Segoe System UI Semilight\", \"Segoe UI Semilight\", sans-serif';\n    displayRegular = '\"SF Regular\", \"Segoe System UI Regular\", \"Segoe UI Regular\", sans-serif';\n    displaySemibold = '\"SF Semibold\", \"Segoe System UI Semibold\", \"Segoe UI Semibold\", sans-serif';\n    displayBold = '\"SF Bold\", \"Segoe System UI Bold\", \"Segoe UI Bold\", sans-serif';\n}\n\nexport default new Fonts();\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/fonts/index.windows.ts",
    "content": "/**\n* index.windows.ts\n* Copyright: Microsoft 2018\n*\n* Windows implementation of \"fonts\" module.\n*/\n\nimport { FontBase } from './Fonts';\n\nclass Fonts implements FontBase {\n    monospace = 'Courier New';\n\n    displayLight = 'Segoe UI';\n    displayRegular = 'Segoe UI';\n    displaySemibold = 'Segoe UI';\n    displayBold = 'Segoe UI';\n}\n\nexport default new Fonts();\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/images/Images.ts",
    "content": "/**\n* Images.ts\n* Copyright: Microsoft 2018\n*\n* Common interface for \"images\" module, which handles the fetching\n* of all static images.\n*/\n\nexport interface ImageSourceBase {\n    todoLogo: string;\n    todoSmall: string;\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/images/index.native.ts",
    "content": "/**\n* index.native.ts\n* Copyright: Microsoft 2018\n*\n* Native implementation of \"images\" module.\n*/\n\nimport { ImageSourceBase } from './Images';\n\n// The React Native bundler handles resource paths at build time, so they need\n// to be specified as full string literals (as opposed to being constructed\n// programmatically in a helper method).\n\n// We use accessors and \"require\" calls to defer loading of these images into\n// memory until they are actually used. If we were to require them upfront,\n// app launch times would increase substantially.\nclass ImageSource implements ImageSourceBase {\n    get todoLogo() { return require('../../../images/todo-logo.png'); }\n    get todoSmall() { return require('../../../images/todo-small.png'); }\n}\n\nexport default new ImageSource();\n"
  },
  {
    "path": "samples/TodoList/src/ts/modules/images/index.web.ts",
    "content": "/**\n* index.web.ts\n* Copyright: Microsoft 2018\n*\n* Web implementation of \"images\" module.\n*/\n\nimport AppConfig from '../../app/AppConfig';\n\nimport { ImageSourceBase } from './Images';\n\nclass ImageSource implements ImageSourceBase {\n    todoLogo = AppConfig.getImagePath('todo-logo.png');\n    todoSmall = AppConfig.getImagePath('todo-small.png');\n}\n\nexport default new ImageSource();\n"
  },
  {
    "path": "samples/TodoList/src/ts/services/PageUrlService.ts",
    "content": "/**\n* PageUrlService.tsx\n* Copyright: Microsoft 2018\n*\n* Monitors the NavigationStore and updates the current URL to reflect\n* the current deep link location.\n*/\n\nimport * as SyncTasks from 'synctasks';\n\nimport DeepLinkConverter from '../app/DeepLinkConverter';\nimport NavContextStore from '../stores/NavContextStore';\n\nclass PageUrlService {\n    private _handlingPopState = false;\n    private _navigatingToNewPlace = false;\n\n    startup() {\n        NavContextStore.subscribe(() => this._onNavigationChange());\n\n        // Handle back and forward button actions.\n        window.addEventListener('popstate', e => this._onUrlChange(e));\n\n        return SyncTasks.Resolved<void>();\n    }\n\n    private _onNavigationChange() {\n        // Prevent reentrancy.\n        if (!this._handlingPopState) {\n            const navContext = NavContextStore.getNavContext();\n            const newUrl = DeepLinkConverter.getUrlFromContext(navContext);\n\n            this._navigatingToNewPlace = true;\n            window.history.pushState(null, '', newUrl);\n            this._navigatingToNewPlace = false;\n        }\n    }\n\n    private _onUrlChange(e: any) {\n        // If the URL is changing because we're programatically changing it, ignore.\n        if (this._navigatingToNewPlace) {\n            return;\n        }\n\n        // Remember that we're popping state. When we navigate, there's no need to push a new state because we're just\n        // returning to an existing one on the stack.\n        this._handlingPopState = true;\n\n        // Check if we're going back to a previous nav context.\n        const navContext = DeepLinkConverter.getContextFromUrl(window.location.href, NavContextStore.isUsingStackNav());\n        if (navContext) {\n            NavContextStore.setNavContext(navContext);\n        }\n\n        // We're done with the navigation change.\n        this._handlingPopState = false;\n    }\n}\n\nexport default new PageUrlService();\n"
  },
  {
    "path": "samples/TodoList/src/ts/services/README.md",
    "content": "# \"services\" directory\n\nThis directory contains modules that implement singleton \"services\". These are intended to be started once, often at app launch time.\n\nThe ServiceManager is responsible for starting services in a well-defined order. It will start dependent services in dependency order.\n"
  },
  {
    "path": "samples/TodoList/src/ts/services/ServiceManager.ts",
    "content": "/**\n* ServiceManager.tsx\n* Copyright: Microsoft 2018\n*\n* Coordinates startup of all services. A service is any long-running\n* singleton object. Services may depend on other services. The service\n* manager will guarantee that all dependent services are started before\n* the startup method is called for a service.\n*/\n\nimport * as assert from 'assert';\n\nimport * as _ from 'lodash';\nimport * as SyncTasks from 'synctasks';\n\nexport interface Service {\n    startup(): SyncTasks.Thenable<void>;\n}\n\ninterface ServiceInfo {\n    service: Service;\n    name: string;\n    dependencies: Service[];\n    startupPromise: SyncTasks.Promise<void>|undefined;\n    hasBegunStartingUp: boolean;\n    isComplete: boolean;\n}\n\nexport default class ServiceManager {\n    private static _serviceInfos: ServiceInfo[] = [];\n\n    static registerService(service: Service, name: string, dependencies: Service[] = []) {\n        if (_.find(ServiceManager._serviceInfos, info => info.service === service)) {\n            assert.ok(false, 'Duplicate startup registration for object: ' + ServiceManager._getName(service));\n            return;\n        }\n\n        const serviceInfo: ServiceInfo = {\n            service,\n            name,\n            dependencies,\n            startupPromise: undefined,\n            hasBegunStartingUp: false,\n            isComplete: false,\n        };\n        ServiceManager._serviceInfos.push(serviceInfo);\n    }\n\n    static hasStarted(startupable: Service): boolean {\n        const startupInfo = _.find(ServiceManager._serviceInfos, info => info.service === startupable);\n        assert.ok(startupInfo, 'Service not found in hasStarted: ' + ServiceManager._getName(startupable));\n        return startupInfo.isComplete;\n    }\n\n    static ensureStarted(services: Service[]): SyncTasks.Promise<void> {\n        return SyncTasks.all(_.map(services, service =>\n            ServiceManager.ensureStartedSingle(service))).then(_.noop);\n    }\n\n    static ensureStartedSingle(service: Service): SyncTasks.Promise<void> {\n        const foundInfo = _.find(ServiceManager._serviceInfos, info => info.service === service);\n        if (!foundInfo) {\n            assert.ok(false, 'Service not registered for startup: ' + ServiceManager._getName(service));\n            return SyncTasks.Rejected<void>('Service not registered for startup: ' +\n                ServiceManager._getName(service));\n        }\n        const startupInfo = foundInfo;\n        startupInfo.hasBegunStartingUp = true;\n\n        if (startupInfo.startupPromise) {\n            // Startup has begun and/or completed.\n            return startupInfo.startupPromise;\n        }\n\n        // Pre-wrap this in a promise, since when you async wrap around to cascade\n        // dependencies, you need startupPromise to already be set!\n        const deferred = SyncTasks.Defer<void>();\n        startupInfo.startupPromise = deferred.promise();\n\n        // Make sure all dependencies have launched.\n        ServiceManager.ensureStarted(startupInfo.dependencies).then(() => {\n            const startupPromise = _.attempt(() => service.startup());\n\n            if (_.isError(startupPromise)) {\n                return SyncTasks.Rejected<void>(startupPromise);\n            } else {\n                return startupPromise;\n            }\n        }).then(() => {\n            startupInfo.isComplete = true;\n\n            deferred.resolve(void 0);\n        }, err => {\n            deferred.reject(err);\n        });\n\n        return startupInfo.startupPromise;\n    }\n\n    private static _getName(service: Service): string {\n        const startupInfo = _.find(ServiceManager._serviceInfos, info => info.service === service);\n        if (startupInfo) {\n            return startupInfo.name;\n        }\n\n        return 'unknown';\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/services/ServiceRegistrar.ts",
    "content": "/**\n* ServiceRegistrar.tsx\n* Copyright: Microsoft 2018\n*\n* Registers all services (long-running singleton objects) with the\n* ServiceManager. Should be called at app launch time.\n*/\n\nimport AppConfig from '../app/AppConfig';\n\nimport TodosStore from '../stores/TodosStore';\n\nimport PageUrlService from './PageUrlService';\nimport ServiceManager from './ServiceManager';\n\nexport default class ServiceRegistrar {\n    static init() {\n        ServiceManager.registerService(TodosStore, 'TodosStore');\n\n        // Web-specific services\n        if (AppConfig.getPlatformType() === 'web') {\n            ServiceManager.registerService(PageUrlService, 'PageUrlService');\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/stores/CurrentUserStore.ts",
    "content": "/**\n* CurrentUserStore.tsx\n* Copyright: Microsoft 2018\n*\n* Singleton store that maintains information about the currently-signed-in user.\n*/\n\nimport { autoSubscribe, AutoSubscribeStore, StoreBase } from 'resub';\n\nimport { User } from '../models/IdentityModels';\n\n@AutoSubscribeStore\nexport class CurrentUserStore extends StoreBase {\n    // TODO - properly initialize\n    private _user: User = {\n        id: '1',\n        fullName: 'Adam Smith',\n        email: 'adam.smith@sample.com',\n    };\n\n    @autoSubscribe\n    getUser(): User | undefined {\n        return this._user;\n    }\n\n    @autoSubscribe\n    getFullName(): string {\n        return this._user ? this._user.fullName : '';\n    }\n}\n\nexport default new CurrentUserStore();\n"
  },
  {
    "path": "samples/TodoList/src/ts/stores/NavContextStore.ts",
    "content": "/**\n* NavContextStore.ts\n* Copyright: Microsoft 2018\n*\n* In-memory singleton store that tracks the current navigation context.\n*/\n\nimport * as assert from 'assert';\n\nimport * as RX from 'reactxp';\nimport { autoSubscribe, AutoSubscribeStore, disableWarnings, StoreBase } from 'resub';\n\nimport NavActions from '../app/NavActions';\nimport * as NavModels from '../models/NavModels';\nimport { ResponsiveWidth, WidthBreakPoints } from '../models/ResponsiveWidthModels';\nimport ResponsiveWidthStore from '../stores/ResponsiveWidthStore';\n\n@AutoSubscribeStore\nexport class NavContextStore extends StoreBase {\n    private _navContext: NavModels.RootNavContext;\n    private _isUsingStackNav = false;\n\n    constructor() {\n        super();\n\n        // Subscribe for changes to the responsive width.\n        this._isUsingStackNav = this._shouldUseStackNavigation();\n        ResponsiveWidthStore.subscribe(() => {\n            const useStackNav = this._shouldUseStackNavigation();\n            if (useStackNav !== this._isUsingStackNav) {\n                this._isUsingStackNav = useStackNav;\n\n                // Force navigation to the top level. This will also trigger\n                // a subscription change event.\n                this.navigateToTodoList();\n            }\n        });\n\n        if (this._isUsingStackNav) {\n            const stackNavContext = new NavModels.StackRootNavContext();\n            stackNavContext.stack.push(new NavModels.TodoListViewNavContext());\n            this._navContext = stackNavContext;\n        } else {\n            this._navContext = new NavModels.TodoRootNavContext();\n        }\n    }\n\n    @disableWarnings\n    private _shouldUseStackNavigation(): boolean {\n        // Never use stack navigation on desktop platforms.\n        const platformType = RX.Platform.getType();\n        if (platformType === 'macos' || platformType === 'windows') {\n            return false;\n        }\n\n        if (ResponsiveWidthStore.isHeightSmallerThanThresholdNoSubscription(WidthBreakPoints.small) &&\n            ResponsiveWidthStore.isWidthSmallerThanThresholdNoSubscription(WidthBreakPoints.small)) {\n            return true;\n        }\n\n        if (ResponsiveWidthStore.getResponsiveWidth() <= ResponsiveWidth.Small) {\n            return true;\n        }\n\n        return false;\n    }\n\n    @autoSubscribe\n    getNavContext(): NavModels.RootNavContext {\n        return this._navContext;\n    }\n\n    setNavContext(newContext: NavModels.RootNavContext) {\n        this._navContext = newContext;\n\n        // Notify all subscribers that the nav context changed.\n        this.trigger();\n    }\n\n    // Indicates whether the app is currently using stack-based navigation\n    // mode or \"composite\" navigation.\n    @autoSubscribe\n    isUsingStackNav(): boolean {\n        return this._isUsingStackNav;\n    }\n\n    navigateToTodoList(selectedTodoId?: string, showNewTodoPanel = false) {\n        this.setNavContext(NavActions.createTodoListContext(this._isUsingStackNav, selectedTodoId, showNewTodoPanel));\n    }\n\n    popNavigationStack() {\n        assert.ok(this._navContext.isStackNav);\n        const stackContext = this._navContext.clone() as NavModels.StackRootNavContext;\n        assert.ok(stackContext.stack.length >= 2);\n        stackContext.stack.pop();\n        this.setNavContext(stackContext);\n    }\n}\n\nexport default new NavContextStore();\n"
  },
  {
    "path": "samples/TodoList/src/ts/stores/README.md",
    "content": "# \"stores\" directory\n\nThis directory contains modules that implement data stores. Modules can subscribe to stores and be notified when the data within a store changes."
  },
  {
    "path": "samples/TodoList/src/ts/stores/ResponsiveWidthStore.ts",
    "content": "/**\n* ResponsiveWidthStore.ts\n* Copyright: Microsoft 2018\n*\n* Singleton store to hold the responsive width property for the app.\n*/\n\nimport * as RX from 'reactxp';\nimport { AutoSubscribeStore, autoSubscribeWithKey, disableWarnings, StoreBase } from 'resub';\n\nimport { ResponsiveWidth, WidthBreakPoints } from '../models/ResponsiveWidthModels';\n\nexport enum TriggerKeys {\n    ResponsiveWidth,\n    Width,\n    Height\n}\n\nconst MainWindowId = 'MainWindowId';\n\n@AutoSubscribeStore\nclass ResponsiveWidthStore extends StoreBase {\n    private _rawWidth: { [index: string]: number } = { [MainWindowId]: 0 };\n    private _rawHeight: { [index: string]: number } = { [MainWindowId]: 0 };\n    private _responsiveWidth: { [index: string]: ResponsiveWidth } = { [MainWindowId]: ResponsiveWidth.Medium };\n\n    constructor() {\n        super();\n\n        // Conditionally seed the window size when it isn't already set.\n        if (!this._rawWidth[MainWindowId] || !this._rawHeight[MainWindowId]) {\n            const { width, height } = RX.UserInterface.measureWindow();\n            this.putWindowSize(width, height);\n        }\n    }\n\n    static responsiveWidthForWidth(width: number): ResponsiveWidth {\n        if (width < WidthBreakPoints.tiny) {\n            return ResponsiveWidth.Tiny;\n        } else if (width >= WidthBreakPoints.tiny && width < WidthBreakPoints.small) {\n            return ResponsiveWidth.Small;\n        } else if (width >= WidthBreakPoints.small && width < WidthBreakPoints.medium) {\n            return ResponsiveWidth.Medium;\n        } else {\n            return ResponsiveWidth.Large;\n        }\n    }\n\n    @disableWarnings\n    putWindowSize(width: number, height: number, rootViewId: string = MainWindowId) {\n        const triggers: TriggerKeys[] = [];\n\n        // No need to re-calc when the width is unchanged\n        const widthUpdated = this._rawWidth[rootViewId] !== width;\n        if (widthUpdated) {\n            this._rawWidth[rootViewId] = width;\n            triggers.push(TriggerKeys.Width);\n\n            const responsiveWidth = ResponsiveWidthStore.responsiveWidthForWidth(width);\n            if (this._responsiveWidth[rootViewId] !== responsiveWidth) {\n                this._responsiveWidth[rootViewId] = responsiveWidth;\n                triggers.push(TriggerKeys.ResponsiveWidth);\n            }\n        }\n\n        // No need to re-calc when the height is unchanged\n        if (this._rawHeight[rootViewId] !== height) {\n            this._rawHeight[rootViewId] = height;\n            triggers.push(TriggerKeys.Height);\n        }\n\n        // Trigger all changes at once.\n        this.trigger(triggers);\n    }\n\n    @autoSubscribeWithKey(TriggerKeys.Width)\n    getWidth(rootViewId: string = MainWindowId): number {\n        return this._rawWidth[rootViewId];\n    }\n\n    @disableWarnings\n    getWidthNoSubscription(rootViewId: string = MainWindowId): number  {\n        return this._rawWidth[rootViewId];\n    }\n\n    @autoSubscribeWithKey(TriggerKeys.Height)\n    getHeight(rootViewId: string = MainWindowId): number  {\n        return this._rawHeight[rootViewId];\n    }\n\n    @disableWarnings\n    getHeightNoSubscription(rootViewId: string = MainWindowId): number {\n        return this._rawHeight[rootViewId];\n    }\n\n    @autoSubscribeWithKey(TriggerKeys.ResponsiveWidth)\n    getResponsiveWidth(rootViewId: string = MainWindowId): number {\n        return this._responsiveWidth[rootViewId];\n    }\n\n    @autoSubscribeWithKey(TriggerKeys.ResponsiveWidth)\n    isSmallOrTinyScreenSize(rootViewId: string = MainWindowId): boolean {\n        return this._responsiveWidth[rootViewId] <= ResponsiveWidth.Small;\n    }\n\n    @autoSubscribeWithKey(TriggerKeys.ResponsiveWidth)\n    isTinyWidth(rootViewId: string = MainWindowId): boolean {\n        return this._responsiveWidth[rootViewId] <= ResponsiveWidth.Tiny;\n    }\n\n    @disableWarnings\n    isHeightSmallerThanThresholdNoSubscription(threshold: number, rootViewId: string = MainWindowId): boolean {\n        const size = this.getWindowDimensionsNoSubscription(rootViewId);\n        return size.height <= threshold;\n    }\n\n    @disableWarnings\n    isWidthSmallerThanThresholdNoSubscription(threshold: number, rootViewId: string = MainWindowId): boolean {\n        const size = this.getWindowDimensionsNoSubscription(rootViewId);\n        return size.width <= threshold;\n    }\n\n    @disableWarnings\n    getWindowDimensionsNoSubscription(rootViewId: string = MainWindowId): RX.Types.Dimensions {\n        return RX.UserInterface.measureWindow(rootViewId === MainWindowId ? undefined : rootViewId);\n    }\n}\n\nexport default new ResponsiveWidthStore();\n"
  },
  {
    "path": "samples/TodoList/src/ts/stores/TodosStore.tsx",
    "content": "/**\n* TodosStore.tsx\n* Copyright: Microsoft 2017\n*\n* Resub Basic Example https://github.com/Microsoft/ReSub\n*/\n\nimport * as _ from 'lodash';\nimport { autoSubscribe, AutoSubscribeStore, StoreBase } from 'resub';\n\nimport LocalDb from '../app/LocalDb';\nimport { Todo } from '../models/TodoModels';\n\n@AutoSubscribeStore\nclass TodosStore extends StoreBase {\n    private _todos: Todo[] = [];\n\n    startup() {\n        return LocalDb.getAllTodos().then(todos => {\n            this._todos = todos;\n        });\n    }\n\n    addTodo(todoText: string) {\n        const now = Date.now().valueOf();\n        const newTodo: Todo = {\n            id: now.toString(),\n            creationTime: now,\n            text: todoText,\n            _searchTerms: todoText,\n        };\n\n        this._todos = this._todos.concat(newTodo);\n\n        // Asynchronously write the new todo item to the DB.\n        LocalDb.putTodo(newTodo);\n\n        this.trigger();\n\n        return newTodo;\n    }\n\n    @autoSubscribe\n    getTodos() {\n        return this._todos;\n    }\n\n    @autoSubscribe\n    getTodoById(todoId: string) {\n        return _.find(this._todos, todo => todo.id === todoId);\n    }\n\n    deleteTodo(todoId: string) {\n        this._todos = _.filter(this._todos, todo => todo.id !== todoId);\n\n        // Asynchronously delete the todo item from the DB.\n        LocalDb.deleteTodo(todoId);\n        this.trigger();\n    }\n}\n\nexport default new TodosStore();\n"
  },
  {
    "path": "samples/TodoList/src/ts/typings/defines.d.ts",
    "content": "/**\n* defines.d.ts\n* Copyright: Microsoft 2018\n*\n* Global symbols that are filled in at compile time. We define them\n* here to make TypeScript happy while editing.\n*/\n\n// Indicates that this is a local dev build\ndeclare let __DEV__: boolean;\n\n// Indicates that this is a unit test build\ndeclare let __TEST__: boolean;\n\n// Flags for specific platforms\ndeclare let __WEB__: boolean;\ndeclare let __IOS__: boolean;\ndeclare let __ANDROID__: boolean;\ndeclare let __WINDOWS__: boolean;\ndeclare let __MACOS__: boolean;\n"
  },
  {
    "path": "samples/TodoList/src/ts/utilities/ExceptionReporter.ts",
    "content": "/**\n * ExceptionReporter.ts\n * Copyright: Microsoft 2018\n *\n * Class that hooks the uncaught exception handler and reports exceptions to the\n * user via message boxes. This should be used only in debug mode.\n */\n\nimport * as assert from 'assert';\n\n// Returns a boolean indicating whether to stop error propagation.\n// When false, application proceeds to crash).\nexport type ExceptionReporterDelegate = (message: string, source: string | undefined, fileNo: number | undefined,\n    columnNo: number | undefined, errName: string | undefined, stackTrace: string | undefined) => boolean;\n\nexport default class ExceptionReporter {\n    private _handlers: ExceptionReporterDelegate[] = [];\n\n    constructor() {\n        window.onerror = (event: Event | string, source?: string, fileNum?: number, columnNum?: number, ...extData: any[]) => {\n            // Modern Browsers will support this\n            let stack = '';\n            let name = '';\n            if (extData && extData[0]) {\n                stack = extData[0].stack || stack;\n                name = extData[0].name || name;\n            }\n\n            let swallowError = false;\n\n            this._handlers.forEach(handler => {\n                try {\n                    if (handler !== null) {\n                        swallowError = swallowError || handler(event.toString(), source, fileNum, columnNum, name, stack);\n                    }\n                } catch (err) {\n                    assert.fail('Error handling Exception: ' + JSON.stringify(err));\n                }\n            });\n\n            return swallowError;\n        };\n    }\n\n    register(handler: ExceptionReporterDelegate) {\n        if (handler !== null) {\n            this._handlers.push(handler);\n        }\n    }\n\n    registerAlertView() {\n        this._handlers.push((event, source, fileno, columnNumber) => {\n            window.alert('DEBUG ALERT: Uncaught Exception\\n' + event + '\\n' + source + ' (' + fileno + ',' + columnNumber + ')');\n            return false;\n        });\n    }\n\n    registerConsoleView() {\n        this._handlers.push((event, source, fileno, columnNumber, errName, stack) => {\n            console.error('DEBUG ALERT: Uncaught Exception\\n' + event + '\\n' + source +\n                ' (' + fileno + ',' + columnNumber + ')\\nStack:\\n' + stack);\n            return false;\n        });\n    }\n\n    unregister() {\n        this._handlers = [];\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/utilities/KeyCodes.ts",
    "content": "/**\n* KeysCodes.ts\n* Copyright: Microsoft 2018\n*\n* Key codes for key press events.\n*/\n\nimport * as RX from 'reactxp';\n\nconst _isInitialized = false;\nlet _isReactNative = false;\n\nfunction isReactNative(): boolean {\n    if (!_isInitialized) {\n        const platform = RX.Platform.getType();\n        _isReactNative = platform !== 'web';\n    }\n\n    return _isReactNative;\n}\n\nenum Keys {\n    // ROMAN ALPHA\n    A = 65, B = 66, C = 67, D = 68,\n    E = 69, F = 70, G = 71, H = 72,\n    I = 73, J = 74, K = 75, L = 76,\n    M = 77, N = 78, O = 79, P = 80,\n    Q = 81, R = 82, S = 83, T = 84,\n    U = 85, V = 86, W = 87, X = 88,\n    Y = 89, Z = 90,\n\n    // ARROW KEYS\n    LeftArrow = isReactNative() ? 21 : 37,\n    UpArrow = isReactNative() ? 19 : 38,\n    RightArrow = isReactNative() ? 22 : 39,\n    DownArrow = isReactNative() ? 20 : 40,\n\n    // NUMERALS\n    Zero = 48, One = 49, Two = 50,\n    Three = 51, Four = 52, Five = 53,\n    Six = 54, Seven = 55, Eight = 56,\n    Nine = 57,\n\n    // OTHER\n    Tab = 9, Shift = 16, Escape = 27,\n    Return = 13, Enter = 13,\n    Alt = 18, Option = 18,\n    Command = 224, Control = 17,\n    Delete = 8, Space = 32,\n    PageUp = isReactNative() ? 92 : 33,\n    PageDown = isReactNative() ? 93 : 34,\n    Insert = 45,\n    Comma = 188\n}\n\nexport default Keys;\n"
  },
  {
    "path": "samples/TodoList/src/ts/utilities/README.md",
    "content": "# \"utilities\" directory\n\nThis directory contains various utility modules. These are generally leaf nodes in the import dependency tree and should try not to depend on other modules.\n"
  },
  {
    "path": "samples/TodoList/src/ts/utilities/ShimHelpers.ts",
    "content": "/**\n* ShimHelpers.ts\n* Copyright: Microsoft 2018\n*\n* Helpers to shim various aspects of the app for React Native.\n*/\n\nimport { Options as ReSubOptions } from 'resub';\n\nimport ExceptionReporter from './ExceptionReporter';\n\ndeclare let global: any;\n\nexport function shimEnvironment(isDev: boolean, isNative: boolean) {\n    // Set resub development options early, before autosubscriptions set themselves up.\n    ReSubOptions.development = isDev;\n    ReSubOptions.preventTryCatchInRender = true;\n\n    // Install our exception-reporting alert on local builds.\n    const exceptionReporter = new ExceptionReporter();\n    if (isDev) {\n        exceptionReporter.registerAlertView();\n        exceptionReporter.registerConsoleView();\n    }\n\n    if (isNative) {\n        shimReactNative();\n    }\n}\n\n// Shim React Native to include various globals found in the browser\n// environment like window, document, navigator, etc.\nfunction shimReactNative() {\n    if (typeof (document) === 'undefined') {\n        global.document = {\n            documentElement: {\n                style: {},\n            },\n        };\n\n        global.window.addEventListener = function(eventName: string) {\n            // No-op\n        };\n\n        global.window.removeEventListener = function(eventName: string) {\n            // No-op\n        };\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/AccountMenuButton.tsx",
    "content": "/*\n* AccountMenuButton.tsx\n* Copyright: Microsoft 2018\n*\n* Button that displays the currently-signed-in user and provides\n* a popup menu that allows the user to sign out, adjust account\n* settings, etc.\n*/\n\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport CurrentUserStore from '../stores/CurrentUserStore';\nimport SimpleMenu, { MenuItem } from '../controls/SimpleMenu';\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\n\ninterface AccountMenuButtonState {\n    currentUserName: string;\n    isHovering: boolean;\n}\n\nconst _menuPopupId = 'accountMenu';\n\nconst _styles = {\n    buttonContainer: RX.Styles.createButtonStyle({\n        paddingHorizontal: 4,\n        paddingVertical: 8,\n        flexDirection: 'row',\n        alignItems: 'center',\n    }),\n    nameText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.menuItem,\n        marginHorizontal: 8,\n        color: Colors.menuText,\n    }),\n    nameTextHover: RX.Styles.createTextStyle({\n        color: Colors.menuTextHover,\n    }),\n    circleGlyph: RX.Styles.createViewStyle({\n        width: 12,\n        height: 12,\n        borderRadius: 6,\n        borderWidth: 1,\n        borderColor: Colors.menuText,\n        backgroundColor: Colors.logoColor,\n    }),\n    circleGlyphHover: RX.Styles.createViewStyle({\n        borderColor: Colors.menuTextHover,\n    }),\n};\n\nexport default class AccountMenuButton extends ComponentBase<RX.CommonProps, AccountMenuButtonState> {\n    private _mountedButton: any;\n\n    protected _buildState(props: RX.CommonProps, initState: boolean): Partial<AccountMenuButtonState> | undefined {\n        const partialState: Partial<AccountMenuButtonState> = {\n            currentUserName: CurrentUserStore.getFullName(),\n        };\n\n        return partialState;\n    }\n\n    render(): JSX.Element | null {\n        return (\n            <RX.Button\n                ref={ this._onMountButton }\n                style={ _styles.buttonContainer }\n                onPress={ this._onPress }\n                onHoverStart={ () => this.setState({ isHovering: true }) }\n                onHoverEnd={ () => this.setState({ isHovering: false }) }\n            >\n                <RX.View style={ [_styles.circleGlyph, this.state.isHovering ? _styles.circleGlyphHover : undefined] }/>\n                <RX.Text\n                    style={ [_styles.nameText, this.state.isHovering ? _styles.nameTextHover : undefined] }\n                >\n                    { this.state.currentUserName }\n                </RX.Text>\n            </RX.Button>\n        );\n    }\n\n    private _onMountButton = (elem: any) => {\n        this._mountedButton = elem;\n    };\n\n    private _onPress = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        RX.Popup.show({\n            getAnchor: () => this._mountedButton,\n            getElementTriggeringPopup: () => this._mountedButton,\n            renderPopup: (anchorPosition: RX.Types.PopupPosition, anchorOffset: number, popupWidth: number, popupHeight: number) => {\n                const items: MenuItem[] = [{\n                    command: 'settings',\n                    text: 'Account Settings',\n                }, {\n                    command: '',\n                    text: '-',\n                }, {\n                    command: 'signout',\n                    text: 'Sign Out',\n                }];\n\n                return (\n                    <SimpleMenu\n                        menuItems={ items }\n                        onSelectItem={ this._onSelectMenuItem }\n                    />\n                );\n            },\n            dismissIfShown: true,\n        }, _menuPopupId);\n    };\n\n    private _onSelectMenuItem = (command: string) => {\n        RX.Popup.dismiss(_menuPopupId);\n\n        // TODO - need to implement\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/CreateTodoPanel.tsx",
    "content": "/**\n* CreateTodoPanel.tsx\n* Copyright: Microsoft 2017\n*\n* The Todo item edit view.\n*/\n\nimport * as RX from 'reactxp';\n\nimport NavContextStore from '../stores/NavContextStore';\nimport SimpleButton from '../controls/SimpleButton';\nimport { FontSizes, Styles } from '../app/Styles';\nimport TodosStore from '../stores/TodosStore';\n\ninterface CreateTodoPanelProps extends RX.CommonProps {\n}\n\ninterface CreateTodoPanelState {\n    todoText?: string;\n}\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        padding: 16,\n    }),\n    editTodoItem: RX.Styles.createTextInputStyle({\n        margin: 8,\n        height: 32,\n        paddingHorizontal: 4,\n        fontSize: FontSizes.size16,\n        alignSelf: 'stretch',\n    }),\n    buttonContainer: RX.Styles.createViewStyle({\n        margin: 8,\n        alignSelf: 'stretch',\n        flexDirection: 'row',\n        justifyContent: 'flex-end',\n        alignItems: 'center',\n    }),\n};\n\nexport default class CreateTodoPanel extends RX.Component<CreateTodoPanelProps, CreateTodoPanelState> {\n    render() {\n        return (\n            <RX.View useSafeInsets={ true } style={ [_styles.container, Styles.statusBarTopMargin] }>\n                <RX.TextInput\n                    style={ _styles.editTodoItem }\n                    value={ this.state ? this.state.todoText : '' }\n                    placeholder={ 'Enter todo' }\n                    onChangeText={ this._onChangeText }\n                    onSubmitEditing={ this._onSubmitText }\n                    accessibilityId={ 'EditTodoPanelTextInput' }\n                />\n\n                <RX.View style={ _styles.buttonContainer }>\n                    <SimpleButton text={ 'Save' } onPress={ this._onPressSave } disabled={ !!this.state && !this.state.todoText }/>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onChangeText = (newText: string) => {\n        this.setState({ todoText: newText });\n    };\n\n    private _onSubmitText = () => {\n        this._saveTodo();\n    };\n\n    private _onPressSave = () => {\n        this._saveTodo();\n    };\n\n    private _saveTodo() {\n        if (!!this.state && this.state.todoText) {\n            const newTodo = TodosStore.addTodo(this.state.todoText);\n\n            this.setState({ todoText: '' });\n\n            NavContextStore.navigateToTodoList(NavContextStore.isUsingStackNav() ? undefined : newTodo.id);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/README.md",
    "content": "# \"views\" directory\n\nThis directory contains modules that implement app-specific UI views.\n\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/RootView.tsx",
    "content": "/*\n* RootView.tsx\n* Copyright: Microsoft 2018\n*\n* Top-level UI for the TodoList sample app.\n*/\n\nimport * as assert from 'assert';\n\nimport * as _ from 'lodash';\nimport * as RX from 'reactxp';\nimport Navigator, { Types as NavTypes } from 'reactxp-navigation';\nimport { ComponentBase } from 'resub';\n\nimport NavContextStore from '../stores/NavContextStore';\nimport * as NavModels from '../models/NavModels';\nimport { Colors } from '../app/Styles';\n\nimport CreateTodoPanel from './CreateTodoPanel';\nimport TodoCompositeView from './TodoCompositeView';\nimport TodoListPanel from './TodoListPanel';\nimport TopBarComposite from './TopBarComposite';\nimport TopBarStack from './TopBarStack';\nimport ViewTodoPanel from './ViewTodoPanel';\n\ninterface RootViewProps extends RX.CommonProps {\n    onLayout?: (e: RX.Types.ViewOnLayoutEvent) => void;\n}\n\ninterface RootViewState {\n    viewTitle: string;\n    navContext: NavModels.RootNavContext;\n}\n\nconst _styles = {\n    root: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n    }),\n    stackViewBackground: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        backgroundColor: Colors.white,\n    }),\n};\n\nexport default class RootView extends ComponentBase<RootViewProps, RootViewState> {\n    private _navigator: Navigator | null = null;\n\n    protected _buildState(props: RootViewProps, initState: boolean): Partial<RootViewState> | undefined {\n        const newNavContext = NavContextStore.getNavContext();\n\n        const partialState: Partial<RootViewState> = {\n            viewTitle: this._getViewTitle(newNavContext),\n            navContext: newNavContext,\n        };\n\n        if (newNavContext.isStackNav) {\n            if (this._navigator) {\n                const newNavStack = newNavContext as NavModels.StackRootNavContext;\n                let mustResetRouteStack = true;\n\n                if (this.state.navContext && this.state.navContext.isStackNav) {\n                    const prevNavStack = this.state.navContext as NavModels.StackRootNavContext;\n\n                    if (newNavStack.stack.length === prevNavStack.stack.length + 1) {\n                        if (this._compareNavStack(newNavStack.stack, prevNavStack.stack, prevNavStack.stack.length)) {\n                            this._navigator.push(this._createNavigatorRoute(newNavStack.stack[newNavStack.stack.length - 1].viewId));\n                            mustResetRouteStack = false;\n                        }\n                    } else if (newNavStack.stack.length === prevNavStack.stack.length - 1) {\n                        if (this._compareNavStack(newNavStack.stack, prevNavStack.stack, newNavStack.stack.length)) {\n                            this._navigator.pop();\n                            mustResetRouteStack = false;\n                        }\n                    }\n                }\n\n                if (mustResetRouteStack) {\n                    this._navigator.immediatelyResetRouteStack(this._createNavigatorRouteStack(newNavStack));\n                }\n            }\n        }\n\n        return partialState;\n    }\n\n    render(): JSX.Element | null {\n        if (this.state.navContext.isStackNav) {\n            return (\n                <RX.View style={ _styles.root } onLayout={ this.props.onLayout }>\n                    <Navigator\n                        ref={ this._onMountNavigator }\n                        renderScene={ this._onRenderScene }\n                    />\n                </RX.View>\n            );\n        } else {\n            const compositeContext = this.state.navContext as NavModels.CompositeRootNavContext;\n            const showBackButton = this._showBackButton(compositeContext.viewId);\n            return (\n                <RX.View style={ _styles.root } onLayout={ this.props.onLayout }>\n                    <TopBarComposite showBackButton={ showBackButton } onBack={ this._onBack }/>\n                    { this._renderMainView() }\n                </RX.View>\n            );\n        }\n    }\n\n    private _showBackButton(viewId: NavModels.NavViewId): boolean {\n        return viewId !== NavModels.NavViewId.TodoComposite &&\n            viewId !== NavModels.NavViewId.TodoList;\n    }\n\n    private _getViewTitle(navContext: NavModels.RootNavContext): string {\n        if (navContext.isStackNav) {\n            const stackContext = navContext as NavModels.StackRootNavContext;\n            const topViewId = stackContext.stack[stackContext.stack.length - 1].viewId;\n\n            switch (topViewId) {\n                case NavModels.NavViewId.TodoList:\n                    return 'Todo List';\n\n                case NavModels.NavViewId.NewTodo:\n                    return 'New Todo';\n\n                case NavModels.NavViewId.ViewTodo:\n                    return 'Todo Details';\n\n                default:\n                    assert.fail('Unknown view');\n                    return '';\n            }\n        } else {\n            return '';\n        }\n    }\n\n    private _onMountNavigator = (elem: any) => {\n        this._navigator = elem;\n\n        if (this._navigator) {\n            this._navigator.immediatelyResetRouteStack(this._createNavigatorRouteStack(\n                this.state.navContext as NavModels.StackRootNavContext));\n        }\n    };\n\n    private _onRenderScene = (navigatorRoute: NavTypes.NavigatorRoute): JSX.Element | null => {\n        const viewId = navigatorRoute.routeId as NavModels.NavViewId;\n        const showBackButton = this._showBackButton(viewId);\n\n        return (\n            <RX.View style={ _styles.stackViewBackground }>\n                <TopBarStack\n                    title={ this.state.viewTitle }\n                    showBackButton={ showBackButton }\n                    onBack={ this._onBack }\n                />\n                { this._renderSceneContents(viewId) }\n            </RX.View>\n        );\n    };\n\n    private _renderSceneContents(viewId: NavModels.NavViewId) {\n        switch (viewId) {\n            case NavModels.NavViewId.TodoList:\n                return (\n                    <TodoListPanel\n                        onSelect={ this._onSelectTodoFromList }\n                        onCreateNew={ this._onCreateNewTodo }\n                    />\n                );\n\n            case NavModels.NavViewId.NewTodo:\n                return <CreateTodoPanel />;\n\n            case NavModels.NavViewId.ViewTodo:\n                const viewContext = this._findNavContextForRoute(viewId) as NavModels.ViewTodoViewNavContext;\n                if (!viewContext) {\n                    return null;\n                }\n                return <ViewTodoPanel todoId={ viewContext.todoId }/>;\n\n            default:\n                return undefined;\n        }\n    }\n\n    private _onSelectTodoFromList = (selectedId: string) => {\n        NavContextStore.navigateToTodoList(selectedId, false);\n    };\n\n    private _onCreateNewTodo = () => {\n        NavContextStore.navigateToTodoList(undefined, true);\n    };\n\n    private _onBack = () => {\n        if (this.state.navContext.isStackNav) {\n            NavContextStore.popNavigationStack();\n        }\n    };\n\n    private _renderMainView(): JSX.Element | null {\n        if (this.state.navContext instanceof NavModels.TodoRootNavContext) {\n            return <TodoCompositeView navContext={ this.state.navContext }/>;\n        } else {\n            assert.fail('Unexpected main view type');\n            return null;\n        }\n    }\n\n    private _createNavigatorRouteStack(stackContext: NavModels.StackRootNavContext): NavTypes.NavigatorRoute[] {\n        return _.map(stackContext.stack, (viewContext, index) => this._createNavigatorRoute(viewContext.viewId));\n    }\n\n    private _createNavigatorRoute(viewId: NavModels.NavViewId): NavTypes.NavigatorRoute {\n        return {\n            routeId: viewId,\n            sceneConfigType: NavTypes.NavigatorSceneConfigType.FloatFromRight,\n        };\n    }\n\n    private _findNavContextForRoute(routeId: number) {\n        assert.ok(this.state.navContext.isStackNav);\n\n        const stackContext = this.state.navContext as NavModels.StackRootNavContext;\n        return _.find(stackContext.stack, (viewContext: NavModels.ViewNavContext) => viewContext.viewId === routeId);\n    }\n\n    private _compareNavStack(stackA: NavModels.ViewNavContext[], stackB: NavModels.ViewNavContext[], count: number): boolean {\n        for (let i = 0; i < count; i++) {\n            if (stackA[i].viewId !== stackB[i].viewId) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/TodoCompositeView.tsx",
    "content": "/*\n* TodoCompositeView.tsx\n* Copyright: Microsoft 2018\n*\n* Main view that provides a composite view of todos on the left and\n* details of the selected todo on the right.\n*/\n\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport NavContextStore from '../stores/NavContextStore';\nimport * as NavModels from '../models/NavModels';\nimport { Colors } from '../app/Styles';\n\nimport CreateTodoPanel from './CreateTodoPanel';\nimport TodoListPanel from './TodoListPanel';\nimport ViewTodoPanel from './ViewTodoPanel';\n\nexport interface TodoCompositeViewProps extends RX.CommonProps {\n    navContext: NavModels.TodoRootNavContext;\n}\n\ninterface TodoCompositeViewState {\n}\n\nconst _styles = {\n    viewContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        flexDirection: 'row',\n    }),\n    leftPanelContainer: RX.Styles.createViewStyle({\n        width: 400,\n        flexDirection: 'column',\n    }),\n    rightPanelContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        flexDirection: 'column',\n        backgroundColor: Colors.grayF8,\n    }),\n};\n\nexport default class TodoCompositeView extends ComponentBase<TodoCompositeViewProps, TodoCompositeViewState> {\n    protected _buildState(props: TodoCompositeViewProps, initState: boolean): Partial<TodoCompositeViewState> | undefined {\n        return undefined;\n    }\n\n    render(): JSX.Element | null {\n        return (\n            <RX.View style={ _styles.viewContainer }>\n                <RX.View style={ _styles.leftPanelContainer }>\n                    <TodoListPanel\n                        selectedTodoId={ this.props.navContext.todoList.selectedTodoId || '' }\n                        onSelect={ this._onSelectTodo }\n                        onCreateNew={ this._onCreateNewTodo }\n                    />\n                </RX.View>\n                <RX.View style={ _styles.rightPanelContainer }>\n                    { this._renderRightPanel() }\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _renderRightPanel() {\n        if (this.props.navContext.showNewTodoPanel) {\n            return (\n                <CreateTodoPanel />\n            );\n        } else if (this.props.navContext.todoList.selectedTodoId) {\n            return (\n                <ViewTodoPanel todoId={ this.props.navContext.todoList.selectedTodoId } />\n            );\n        } else {\n            return null;\n        }\n    }\n\n    private _onSelectTodo = (todoId: string) => {\n        NavContextStore.navigateToTodoList(todoId, false);\n    };\n\n    private _onCreateNewTodo = () => {\n        NavContextStore.navigateToTodoList('', true);\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/TodoListItem.tsx",
    "content": "/*\n* TodoListItem.tsx\n* Copyright: Microsoft 2018\n*\n* Renders a list item that represents a todo item.\n*/\n\nimport ImageSource from 'modules/images';\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport HoverButton from '../controls/HoverButton';\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\nimport { Todo } from '../models/TodoModels';\n\ninterface TodoListItemProps extends RX.CommonProps {\n    height: number;\n    todo: Todo;\n    isSelected: boolean;\n    searchString?: string;\n    onPress: (todoId: string) => void;\n}\n\ninterface TodoListItemState {\n    heightStyle: RX.Types.ViewStyleRuleSet;\n}\n\nconst _itemBorderWidth = 1;\n\nconst _styles = {\n    container: RX.Styles.createButtonStyle({\n        alignSelf: 'stretch',\n        borderBottomWidth: _itemBorderWidth,\n        borderColor: Colors.borderSeparatorLight,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        backgroundColor: Colors.white,\n    }),\n    todoNameText: RX.Styles.createTextStyle({\n        flex: -1,\n        fontSize: FontSizes.size16,\n        font: Fonts.displayRegular,\n        color: Colors.menuText,\n        margin: 8,\n    }),\n    todoNameTextSelected: RX.Styles.createTextStyle({\n        font: Fonts.displaySemibold,\n        color: Colors.menuTextSelected,\n    }),\n    todoImage: RX.Styles.createImageStyle({\n        marginLeft: 16,\n        marginRight: 4,\n        height: 20,\n        width: 24,\n    }),\n    hovering: RX.Styles.createButtonStyle({\n        backgroundColor: Colors.listItemHover,\n    }),\n    selected: RX.Styles.createButtonStyle({\n        backgroundColor: Colors.listItemSelected,\n    }),\n};\n\nexport default class TodoListItem extends ComponentBase<TodoListItemProps, TodoListItemState> {\n    protected _buildState(props: TodoListItemProps, initState: boolean): Partial<TodoListItemState> | undefined {\n        const partialState: Partial<TodoListItemState> = {\n            heightStyle: RX.Styles.createViewStyle({\n                height: props.height,\n            }, false),\n        };\n        return partialState;\n    }\n\n    render(): JSX.Element | null {\n        return (\n            <HoverButton\n                onRenderChild={ this._onRenderItem }\n                onPress={ this._onPress }/>\n        );\n    }\n\n    private _onPress = (e: RX.Types.SyntheticEvent) => {\n        // Prevent VirtualListView.onItemSelected from\n        // being triggering in the web app.\n        e.stopPropagation();\n        this.props.onPress(this.props.todo.id);\n    };\n\n    private _onRenderItem = (isHovering: boolean) => {\n        const buttonStyles = [_styles.container, this.state.heightStyle];\n        if (this.props.isSelected) {\n            buttonStyles.push(_styles.selected);\n        } else if (isHovering) {\n            buttonStyles.push(_styles.hovering);\n        }\n\n        let nameText: JSX.Element;\n        const searchString = this.props.searchString ? this.props.searchString.trim().toLowerCase() : '';\n        let searchSubstrIndex = -1;\n        if (searchString) {\n            searchSubstrIndex = this.props.todo.text.toLowerCase().indexOf(searchString);\n        }\n\n        if (searchSubstrIndex >= 0) {\n            nameText = (\n                <RX.Text style={ _styles.todoNameText } numberOfLines={ 1 }>\n                    <RX.Text numberOfLines={ 1 }>\n                        { this.props.todo.text.substr(0, searchSubstrIndex) }\n                    </RX.Text>\n                    <RX.Text style={ _styles.todoNameTextSelected } numberOfLines={ 1 }>\n                        { this.props.todo.text.substr(searchSubstrIndex, searchString.length) }\n                    </RX.Text>\n                    <RX.Text numberOfLines={ 1 }>\n                        { this.props.todo.text.substr(searchSubstrIndex + searchString.length) }\n                    </RX.Text>\n                </RX.Text>\n            );\n        } else {\n            nameText = (\n                <RX.Text style={ _styles.todoNameText } numberOfLines={ 1 }>\n                    { this.props.todo.text }\n                </RX.Text>\n            );\n        }\n\n        return (\n            <RX.View style={ buttonStyles }>\n                <RX.Image\n                    style={ _styles.todoImage }\n                    source={ ImageSource.todoSmall }\n                />\n                { nameText }\n            </RX.View>\n        );\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/TodoListPanel.tsx",
    "content": "/**\n* TodoListPanel.tsx\n* Copyright: Microsoft 2018\n*\n* Display first screen of the Todo application.\n*/\n\nimport * as _ from 'lodash';\nimport * as RX from 'reactxp';\nimport { VirtualListView, VirtualListViewItemInfo } from 'reactxp-virtuallistview';\nimport { VirtualListCellRenderDetails } from 'reactxp-virtuallistview/dist/VirtualListCell';\nimport { ComponentBase } from 'resub';\n\nimport AppConfig from '../app/AppConfig';\nimport HoverButton from '../controls/HoverButton';\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\n\nimport { Todo } from '../models/TodoModels';\nimport TodosStore from '../stores/TodosStore';\n\nimport TodoListItem from './TodoListItem';\n\ninterface TodoListItemInfo extends VirtualListViewItemInfo {\n    todo: Todo;\n}\n\nexport interface TodoListPanelProps extends RX.CommonProps {\n    selectedTodoId?: string;\n    onSelect: (selectedId: string) => void;\n    onCreateNew: () => void;\n}\n\ninterface TodoListPanelState {\n    todos: TodoListItemInfo[];\n    filteredTodoList: TodoListItemInfo[];\n    searchString: string;\n}\n\nconst _listItemHeight = 48;\n\nconst _styles = {\n    listScroll: RX.Styles.createViewStyle({\n        flexDirection: 'column',\n        alignSelf: 'stretch',\n        backgroundColor: Colors.contentBackground,\n    }),\n    todoListHeader: RX.Styles.createViewStyle({\n        height: 60,\n        borderBottomWidth: 1,\n        borderColor: Colors.borderSeparator,\n        flexDirection: 'row',\n        alignItems: 'center',\n    }),\n    searchBox: RX.Styles.createTextInputStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size14,\n        borderWidth: 1,\n        borderColor: Colors.borderSeparator,\n        flex: 1,\n        padding: 4,\n        marginLeft: 12,\n    }),\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        backgroundColor: Colors.contentBackground,\n    }),\n    addTodoButton: RX.Styles.createViewStyle({\n        margin: 8,\n        paddingHorizontal: 8,\n        paddingVertical: 4,\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size32,\n        lineHeight: 32,\n        color: Colors.buttonTextColor,\n    }),\n    buttonTextHover: RX.Styles.createTextStyle({\n        color: Colors.buttonTextHover,\n    }),\n};\n\nexport default class TodoListPanel extends ComponentBase<TodoListPanelProps, TodoListPanelState> {\n    protected _buildState(props: TodoListPanelProps, initState: boolean): Partial<TodoListPanelState> | undefined {\n        const partialState: Partial<TodoListPanelState> = {\n        };\n\n        partialState.todos = TodosStore.getTodos().map((todo, i) => ({\n            key: i.toString(),\n            height: _listItemHeight,\n            template: 'todo',\n            todo,\n        }));\n\n        if (initState) {\n            partialState.searchString = '';\n            partialState.filteredTodoList = partialState.todos;\n        } else {\n            const filter = _.trim(partialState.searchString);\n            if (filter) {\n                partialState.filteredTodoList = this._filterTodoList(partialState.todos, filter);\n            } else {\n                partialState.filteredTodoList = partialState.todos;\n            }\n        }\n\n        return partialState;\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true } style={ _styles.container }>\n                <RX.View style={ _styles.todoListHeader }>\n                    <RX.TextInput\n                        style={ _styles.searchBox }\n                        value={ this.state.searchString }\n                        autoFocus={ !AppConfig.isTouchInterface() }\n                        placeholder={ 'Search' }\n                        onChangeText={ this._onChangeTextSearch }\n                        autoCapitalize={ 'none' }\n                    />\n                    <HoverButton\n                        onPress={ this._onPressCreateNewTodo }\n                        onRenderChild={ this._onRenderAddTodoButton }\n                    />\n                </RX.View>\n\n                <VirtualListView\n                    itemList={ this.state.filteredTodoList }\n                    renderItem={ this._renderItem }\n                    style={ _styles.listScroll }\n                />\n            </RX.View>\n        );\n    }\n\n    private _onRenderAddTodoButton = (isHovering: boolean) => (\n        <RX.View style={ _styles.addTodoButton }>\n            <RX.Text style={ [_styles.buttonText, isHovering ? _styles.buttonTextHover : undefined] }>\n                { '+' }\n            </RX.Text>\n        </RX.View>\n    );\n\n    private _onChangeTextSearch = (newValue: string) => {\n        const filteredTodoList = this._filterTodoList(this.state.todos, newValue.trim());\n        this.setState({\n            filteredTodoList,\n            searchString: newValue,\n        });\n    };\n\n    private _filterTodoList(sortedTodos: TodoListItemInfo[], searchString: string): TodoListItemInfo[] {\n        const lowerSearchString = searchString.toLowerCase();\n\n        return _.filter(sortedTodos, item => {\n            const todoLower = item.todo.text.toLowerCase();\n            return todoLower.search(lowerSearchString) >= 0;\n        });\n    }\n\n    private _renderItem = (details: VirtualListCellRenderDetails<TodoListItemInfo>) => {\n        const item = details.item;\n        return (\n            <TodoListItem\n                todo={ item.todo }\n                height={ _listItemHeight }\n                isSelected={ item.todo.id === this.props.selectedTodoId }\n                searchString={ this.state.searchString }\n                onPress={ this._onPressTodo }\n            />\n        );\n    };\n\n    private _onPressTodo = (todoId: string) => {\n        this.props.onSelect(todoId);\n        this.setState({\n            searchString: '',\n            filteredTodoList: this.state.todos,\n        });\n    };\n\n    private _onPressCreateNewTodo = () => {\n        this.props.onCreateNew();\n        this.setState({\n            searchString: '',\n            filteredTodoList: this.state.todos,\n        });\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/TopBarComposite.tsx",
    "content": "/*\n* TopBarComposite.tsx\n* Copyright: Microsoft 2018\n*\n* Horizontal bar that appears on the top of every view within the app\n* when it's using composite layout (as opposed to stack-based layout).\n*/\n\nimport ImageSource from 'modules/images';\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport HoverButton from '../controls/HoverButton';\nimport NavContextStore from '../stores/NavContextStore';\nimport { Colors, Fonts, FontSizes } from '../app/Styles';\nimport VerticalSeparator from '../controls/VerticalSeparator';\n\nimport AccountMenuButton from './AccountMenuButton';\n\nconst _styles = {\n    background: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        height: 50,\n        borderBottomWidth: 1,\n        borderColor: Colors.gray66,\n        flexDirection: 'row',\n        paddingHorizontal: 16,\n    }),\n    logoContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        alignItems: 'center',\n    }),\n    barControlsContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        alignItems: 'center',\n        justifyContent: 'flex-end',\n        flexDirection: 'row',\n    }),\n    logoImage: RX.Styles.createImageStyle({\n        height: 24,\n        width: 26,\n    }),\n    logoText: RX.Styles.createTextStyle({\n        font: Fonts.displaySemibold,\n        fontSize: FontSizes.size20,\n        marginHorizontal: 4,\n        color: Colors.logoColor,\n    }),\n    linkText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.menuItem,\n        marginHorizontal: 8,\n        color: Colors.menuText,\n    }),\n    linkTextHover: RX.Styles.createTextStyle({\n        color: Colors.menuTextHover,\n    }),\n    backButtonContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        alignItems: 'center',\n    }),\n    backText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.menuText,\n    }),\n};\n\nexport interface TopBarCompositeProps extends RX.CommonProps {\n    showBackButton: boolean;\n    onBack?: () => void;\n}\n\nexport default class TopBarComposite extends ComponentBase<TopBarCompositeProps, RX.Stateless> {\n    render(): JSX.Element | null {\n        let leftContents: JSX.Element | undefined;\n\n        if (this.props.showBackButton) {\n            leftContents = (\n                <HoverButton onPress={ this._onPressBack } onRenderChild={ this._renderBackButton }/>\n            );\n        } else {\n            leftContents = (\n                <RX.Button onPress={ this._onPressLogo }>\n                    <RX.View style={ _styles.logoContainer }>\n                        <RX.Image source={ ImageSource.todoLogo } style={ _styles.logoImage }/>\n                        <RX.Text style={ _styles.logoText }>\n                            { 'Todo List' }\n                        </RX.Text>\n                    </RX.View>\n                </RX.Button>\n            );\n        }\n        return (\n            <RX.View style={ _styles.background }>\n                { leftContents }\n                <RX.View style={ _styles.barControlsContainer }>\n                    <VerticalSeparator />\n                    <HoverButton onPress={ this._onPressHelp } onRenderChild={ this._onRenderHelpButton } />\n                    <VerticalSeparator />\n                    <AccountMenuButton />\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onPressBack = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        if (this.props.onBack) {\n            this.props.onBack();\n        }\n    };\n\n    private _renderBackButton = (isHovering: boolean) => (\n        <RX.View style={ _styles.backButtonContainer }>\n            <RX.Text style={ [_styles.backText, isHovering ? _styles.linkTextHover : undefined] }>\n                { 'Back' }\n            </RX.Text>\n        </RX.View>\n    );\n\n    private _onPressLogo = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        NavContextStore.navigateToTodoList('', false);\n    };\n\n    private _onPressHelp = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        RX.Linking.openUrl('https://www.bing.com/search?q=help');\n    };\n\n    private _onRenderHelpButton = (isHovering: boolean) => {\n        const textStyles = [_styles.linkText];\n        if (isHovering) {\n            textStyles.push(_styles.linkTextHover);\n        }\n\n        return (\n            <RX.Text style={ textStyles }>\n                { 'Help' }\n            </RX.Text>\n        );\n    };\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/TopBarStack.tsx",
    "content": "/*\n* TopBarStack.tsx\n* Copyright: Microsoft 2018\n*\n* Horizontal bar that appears on the top of every view within the app\n* when it's using stack-based layout.\n*/\n\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport HoverButton from '../controls/HoverButton';\nimport { Colors, Fonts, FontSizes, Styles } from '../app/Styles';\n\nconst _styles = {\n    background: RX.Styles.createViewStyle({\n        alignSelf: 'stretch',\n        height: 36,\n        borderBottomWidth: 1,\n        borderColor: Colors.gray66,\n        flexDirection: 'row',\n        justifyContent: 'center',\n    }),\n    leftRightContainer: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        alignItems: 'center',\n        width: 60,\n    }),\n    titleContainer: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        justifyContent: 'center',\n    }),\n    titleText: RX.Styles.createTextStyle({\n        flex: -1,\n        font: Fonts.displaySemibold,\n        fontSize: FontSizes.size16,\n        color: Colors.menuText,\n        textAlign: 'center',\n    }),\n    backText: RX.Styles.createTextStyle({\n        font: Fonts.displayRegular,\n        fontSize: FontSizes.size16,\n        color: Colors.menuText,\n        margin: 8,\n    }),\n    backTextHover: RX.Styles.createTextStyle({\n        color: Colors.menuTextHover,\n    }),\n};\n\nexport interface TopBarStackProps extends RX.CommonProps {\n    title: string;\n    showBackButton: boolean;\n    onBack?: () => void;\n}\n\nexport default class TopBarStack extends ComponentBase<TopBarStackProps, RX.Stateless> {\n    render(): JSX.Element | null {\n        let leftContents: JSX.Element | undefined;\n        let rightContents: JSX.Element | undefined;\n\n        if (this.props.showBackButton) {\n            leftContents = (\n                <HoverButton onPress={ this._onPressBack } onRenderChild={ this._renderBackButton }/>\n            );\n        }\n\n        return (\n            <RX.View style={ [_styles.background, Styles.statusBarTopMargin] }>\n                <RX.View style={ _styles.leftRightContainer }>\n                    { leftContents }\n                </RX.View>\n                <RX.View style={ _styles.titleContainer }>\n                    <RX.Text style={ _styles.titleText } numberOfLines={ 1 }>\n                        { this.props.title }\n                    </RX.Text>\n                </RX.View>\n                <RX.View style={ _styles.leftRightContainer }>\n                    { rightContents }\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onPressBack = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        if (this.props.onBack) {\n            this.props.onBack();\n        }\n    };\n\n    private _renderBackButton = (isHovering: boolean) => (\n        <RX.Text style={ [_styles.backText, isHovering ? _styles.backTextHover : undefined] }>\n            { 'Back' }\n        </RX.Text>\n    );\n}\n"
  },
  {
    "path": "samples/TodoList/src/ts/views/ViewTodoPanel.tsx",
    "content": "/**\n* ViewTodoPanel.tsx\n* Copyright: Microsoft 2017\n*\n* The Todo item edit view.\n*/\n\nimport * as RX from 'reactxp';\nimport { ComponentBase } from 'resub';\n\nimport NavContextStore from '../stores/NavContextStore';\nimport SimpleButton from '../controls/SimpleButton';\nimport SimpleDialog from '../controls/SimpleDialog';\nimport { FontSizes } from '../app/Styles';\nimport { Todo } from '../models/TodoModels';\nimport TodosStore from '../stores/TodosStore';\n\nexport interface ViewTodoPanelProps extends RX.CommonProps {\n    todoId: string;\n}\n\ninterface ViewTodoPanelState {\n    todo: Todo;\n}\n\nconst _styles = {\n    container: RX.Styles.createViewStyle({\n        flex: 1,\n        alignSelf: 'stretch',\n        margin: 16,\n    }),\n    todoText: RX.Styles.createTextStyle({\n        margin: 8,\n        fontSize: FontSizes.size16,\n        alignSelf: 'stretch',\n        backgroundColor: 'transparent',\n    }),\n    buttonContainer: RX.Styles.createViewStyle({\n        margin: 8,\n        alignSelf: 'stretch',\n        flexDirection: 'row',\n        justifyContent: 'flex-end',\n        alignItems: 'center',\n    }),\n};\n\nconst _confirmDeleteDialogId = 'delete';\n\nexport default class ViewTodoPanel extends ComponentBase<ViewTodoPanelProps, ViewTodoPanelState> {\n    protected _buildState(props: ViewTodoPanelProps, initState: boolean): Partial<ViewTodoPanelState> {\n        const newState: Partial<ViewTodoPanelState> = {\n            todo: TodosStore.getTodoById(props.todoId),\n        };\n\n        return newState;\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true } style={ _styles.container }>\n                <RX.Text style={ _styles.todoText }>\n                    { this.state.todo ? this.state.todo.text : '' }\n                </RX.Text>\n\n                <RX.View style={ _styles.buttonContainer }>\n                    <SimpleButton text={ 'Delete' } onPress={ this._onPressDelete } disabled={ !this.state.todo }/>\n                </RX.View>\n            </RX.View>\n        );\n    }\n\n    private _onPressDelete = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        const dialog = (\n            <SimpleDialog\n                dialogId={ _confirmDeleteDialogId }\n                text={ 'Are you sure you want to delete this todo?' }\n                buttons={ [{\n                    text: 'Delete',\n                    onPress: () => {\n                        SimpleDialog.dismissAnimated(_confirmDeleteDialogId);\n                        this._completeDelete();\n                    },\n                }, {\n                    text: 'Cancel',\n                    isCancel: true,\n                    onPress: () => {\n                        SimpleDialog.dismissAnimated(_confirmDeleteDialogId);\n                    },\n                }] }\n            />\n        );\n\n        RX.Modal.show(dialog, _confirmDeleteDialogId);\n    };\n\n    private _completeDelete() {\n        TodosStore.deleteTodo(this.state.todo.id);\n        NavContextStore.navigateToTodoList();\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"noEmitHelpers\": true,\n        \"importHelpers\": true,\n        \"declaration\": false,\n        \"noResolve\": false,\n        \"jsx\": \"react\",\n        \"reactNamespace\": \"RX\",\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"experimentalDecorators\": true,\n        \"sourceMap\": true,\n        \"noImplicitReturns\": true,\n        \"noUnusedLocals\": true,\n        \"skipLibCheck\": true,\n        \"strict\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"outDir\": \"./web/js/\",\n        \"baseUrl\": \".\",\n        \"paths\": {\n            \"modules/*\": [\n                \"./src/ts/modules/*/index.web\",\n                \"./src/ts/modules/*/index\"\n            ]\n        },\n        \"typeRoots\": [\n            \"./node_modules/@types\"\n        ]\n    },\n    \"exclude\": [\n        \"node_modules\",\n        \"temp\",\n        \".vscode\"\n    ],\n    \"include\": [\n        \"./src/ts/**/*\"\n    ]\n}\n"
  },
  {
    "path": "samples/TodoList/web/css/app.css",
    "content": "/*!\n* Base Web Styles for app\n*/\n\n/**\n * 1. Change the default font family in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in IE and iOS.\n */\n\nhtml {\n  font-family: sans-serif; /* 1 */\n  -ms-text-size-adjust: 100%; /* 2 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n  margin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Add the correct display in IE 9-.\n * 1. Add the correct display in Edge, IE, and Firefox.\n * 2. Add the correct display in IE.\n */\n\narticle,\naside,\ndetails, /* 1 */\nfigcaption,\nfigure,\nfooter,\nheader,\nmain, /* 2 */\nmenu,\nnav,\nsection,\nsummary { /* 1 */\n  display: block;\n}\n\n/**\n * Add the correct display in IE 9-.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n}\n\n/**\n * Add the correct display in iOS 4-7.\n */\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\n * Add the correct display in IE 10-.\n * 1. Add the correct display in IE.\n */\n\ntemplate, /* 1 */\n[hidden] {\n  display: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n  background-color: transparent;\n}\n\n/**\n * Remove the outline on focused links when they are also active or hovered\n * in all browsers (opinionated).\n */\n\na:active,\na:hover {\n  outline-width: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * 1. Remove the bottom border in Firefox 39-.\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n  border-bottom: none; /* 1 */\n  text-decoration: underline; /* 2 */\n  text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Prevent the duplicate application of `bolder` by the next rule in Safari 6.\n */\n\nb,\nstrong {\n  font-weight: inherit;\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n * Add the correct font style in Android 4.3-.\n */\n\ndfn {\n  font-style: italic;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n/**\n * Add the correct background and color in IE 9-.\n */\n\nmark {\n  background-color: #ff0;\n  color: #000;\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n  font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10-.\n */\n\nimg {\n  border-style: none;\n}\n\n/**\n * Hide the overflow in IE.\n */\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct margin in IE 8.\n */\n\nfigure {\n  margin: 1em 40px;\n}\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n  box-sizing: content-box; /* 1 */\n  height: 0; /* 1 */\n  overflow: visible; /* 2 */\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Change font properties to `inherit` in all browsers (opinionated).\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n  font: inherit;\n}\n\n/**\n * Restore the font weight unset by the previous rule.\n */\n\noptgroup {\n  font-weight: bold;\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n * 2. Show the overflow in Edge, Firefox, and IE.\n */\n\nbutton,\ninput, /* 1 */\nselect { /* 2 */\n  overflow: visible;\n}\n\n/**\n * Remove the margin in Safari.\n * 1. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\nselect,\ntextarea { /* 1 */\n  margin: 0;\n}\n\n/**\n * Remove the inheritence of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritence of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\n * Change the cursor in all browsers (opinionated).\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  cursor: pointer;\n}\n\n/**\n * Restore the default cursor to disabled elements unset by the previous rule.\n */\n\n[disabled] {\n  cursor: default;\n}\n\n/**\n * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n *    controls in Android 4.\n * 2. Correct the inability to style clickable types in iOS.\n */\n\nbutton,\nhtml [type=\"button\"], /* 1 */\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button; /* 2 */\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\ninput:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\n * Change the border, margin, and padding in all browsers (opinionated).\n */\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n *    `fieldset` elements in all browsers.\n */\n\nlegend {\n  box-sizing: border-box; /* 1 */\n  color: inherit; /* 2 */\n  display: table; /* 1 */\n  max-width: 100%; /* 1 */\n  padding: 0; /* 3 */\n  white-space: normal; /* 1 */\n}\n\n/**\n * Remove the default vertical scrollbar in IE.\n */\n\ntextarea {\n  overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10-.\n * 2. Remove the padding in IE 10-.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n  box-sizing: border-box; /* 1 */\n  padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n * Correct the odd appearance of search inputs in Chrome and Safari.\n */\n\n[type=\"search\"] {\n  -webkit-appearance: textfield;\n}\n\n/**\n * Remove the inner padding and cancel buttons in Chrome on OS X and\n * Safari on OS X.\n */\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nhtml {\n  -webkit-font-smoothing: antialiased;\n}\n@media only screen and (-webkit-min-device-pixel-ratio: 1.25), only screen and (min-device-pixel-ratio: 1.25), only screen and (-webkit-min-device-pixel-ratio: 2.0833333333333335), only screen and (min-resolution: 200dpi), only screen and (min-resolution: 1.25dppx) {\n  html {\n    -webkit-font-smoothing: subpixel-antialiased;\n  }\n}\n@font-face {\n  font-family: \"Segoe UI Light\";\n  src: url('../fonts/SegoeUI-Light.eot?#iefix') format('embedded-opentype'), url('../fonts/SegoeUI-Light.woff') format('woff'), url('../fonts/SegoeUI-Light.ttf') format('truetype'), url('../fonts/SegoeUI-Light.svg#SegoeUI-Light') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Segoe UI Semilight\";\n  src: url('../fonts/SegoeUI-Semilight.eot?#iefix') format('embedded-opentype'), url('../fonts/SegoeUI-Semilight.woff') format('woff'), url('../fonts/SegoeUI-Semilight.ttf') format('truetype'), url('../fonts/SegoeUI-Semilight.svg#SegoeUI-Semilight') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Segoe UI Regular\";\n  src: url('../fonts/SegoeUI-Regular.eot?#iefix') format('embedded-opentype'), url('../fonts/SegoeUI-Regular.woff') format('woff'), url('../fonts/SegoeUI-Regular.ttf') format('truetype'), url('../fonts/SegoeUI-Regular.svg#SegoeUI-Regular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Segoe UI Semibold\";\n  src: url('../fonts/SegoeUI-Semibold.eot?#iefix') format('embedded-opentype'), url('../fonts/SegoeUI-Semibold.woff') format('woff'), url('../fonts/SegoeUI-Semibold.ttf') format('truetype'), url('../fonts/SegoeUI-Semibold.svg#SegoeUI-Semibold') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"Segoe UI Bold\";\n  src: url('../fonts/SegoeUI-Bold.eot?#iefix') format('embedded-opentype'), url('../fonts/SegoeUI-Bold.woff') format('woff'), url('../fonts/SegoeUI-Bold.ttf') format('truetype'), url('../fonts/SegoeUI-Bold.svg#SegoeUI-Bold') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: 'Segoe System UI Light';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\"Segoe UI Light\");\n}\n@font-face {\n  font-family: \"Segoe System UI Semilight\";\n  font-weight: normal;\n  font-style: normal;\n  src: local(\"Segoe UI Semilight\");\n}\n@font-face {\n  font-family: 'Segoe System UI Regular';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\"Segoe UI\");\n}\n@font-face {\n  font-family: 'Segoe System UI Semibold';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\"Segoe UI Semibold\");\n}\n@font-face {\n  font-family: 'Segoe System UI Bold';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\"Segoe UI Bold\");\n}\n@font-face {\n  font-family: 'SF Light';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\".SFNSDisplay-Ultralight\"), local(\".HelveticaNeueDeskInterface-Thin\");\n}\n@font-face {\n  font-family: \"SF Semilight\";\n  font-weight: normal;\n  font-style: normal;\n  src: local(\".SFNSDisplay-Light\"), local(\".HelveticaNeueDeskInterface-Light\");\n}\n@font-face {\n  font-family: 'SF Regular';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\".SFNSDisplay-Regular\"), local(\".HelveticaNeueDeskInterface-Regular\");\n}\n@font-face {\n  font-family: 'SF Semibold';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\".SFNSDisplay-Bold\"), local(\".HelveticaNeueDeskInterface-Bold\");\n}\n@font-face {\n  font-family: 'SF Bold';\n  font-style: normal;\n  font-weight: normal;\n  src: local(\".SFNSDisplay-Heavy\"), local(\".HelveticaNeueDeskInterface-Heavy\");\n}\nhtml {\n  height: 100%;\n  font-size: 16px;\n  font-family: 'SF Regular', 'Segoe UI Regular', sans-serif;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  -webkit-tap-highlight-color: transparent;\n  /* For some Androids */\n}\nbody,\n.app-container {\n  height: 100%;\n  width: 100%;\n  overflow-y: hidden;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  -webkit-overflow-scrolling: touch;\n}\nbody.page--electron {\n  background-image: url(../images/firstrun/startup_background.png);\n  background-position: center center;\n  background-size: cover;\n  background-repeat: no-repeat;\n}\ntextarea {\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\ntextarea::-webkit-input-placeholder {\n  color: #bbb;\n}\ntextarea:-moz-placeholder {\n  color: #bbb;\n}\ntextarea::-moz-placeholder {\n  color: #bbb;\n}\ntextarea:-ms-input-placeholder {\n  color: #bbb;\n}\ninput::-webkit-input-placeholder {\n  color: #bbb;\n}\ninput:-moz-placeholder {\n  color: #bbb;\n}\ninput::-moz-placeholder {\n  color: #bbb;\n}\ninput:-ms-input-placeholder {\n  color: #bbb;\n}\n.inputGradient *::-webkit-input-placeholder {\n  color: rgba(255, 255, 255, 0.3);\n}\n.inputGradient *:-moz-placeholder {\n  color: rgba(255, 255, 255, 0.3);\n}\n.inputGradient *::-moz-placeholder {\n  color: rgba(255, 255, 255, 0.3);\n}\n.inputGradient *:-ms-input-placeholder {\n  color: rgba(255, 255, 255, 0.3);\n}\nsvg {\n  display: block;\n}\n*,\n*:before,\n*:after {\n  box-sizing: border-box;\n}\n*:focus {\n  outline: 0;\n}\ninput::-ms-clear {\n  display: none;\n}\na {\n  text-decoration: none;\n}\nvideo {\n  width: 100%;\n}\nbutton {\n  padding: 0;\n}\n"
  },
  {
    "path": "samples/TodoList/web/index.html",
    "content": "<html lang=\"en\">\n    <head>\n        <meta charset=\"utf-8\">\n        <title></title>\n\n        <!-- Mobile Specific Metas\n        ================================================== -->\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n\n        <!-- Enable fake \"app\" mode for bookmarks of the website on iOS home screens\n        ================================================== -->\n        <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n\n        <!-- Force IE into Edge mode if available\n        ================================================== -->\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n\n        <!-- CSS\n        ================================================== -->\n        <link rel=\"stylesheet\" href=\"/css/app.css\">\n\n        <!-- Favicons\n        ================================================== -->\n        <link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/images/favicons/apple-touch-icon-57x57.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"/images/favicons/apple-touch-icon-60x60.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/images/favicons/apple-touch-icon-72x72.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"/images/favicons/apple-touch-icon-76x76.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"/images/favicons/apple-touch-icon-114x114.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/images/favicons/apple-touch-icon-120x120.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"/images/favicons/apple-touch-icon-144x144.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/images/favicons/apple-touch-icon-152x152.png\">\n        <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/images/favicons/apple-touch-icon-180x180.png\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/images/favicons/favicon-32x32.png?ver=2.0\" sizes=\"32x32\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/images/favicons/android-chrome-192x192.png?ver=2.0\" sizes=\"192x192\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/images/favicons/favicon-96x96.png?ver=2.0\" sizes=\"96x96\">\n        <link rel=\"icon\" type=\"image/png\" href=\"/images/favicons/favicon-16x16.png?ver=2.0\" sizes=\"16x16\">\n        <link rel=\"manifest\" href=\"/images/favicons/manifest.json\">\n        <meta name=\"theme-color\" content=\"#ffffff\">\n    </head>\n\n    <body class=\"page page--basic\">\n        <input type=\"hidden\" name=\"appVersion\" id=\"appVersion\" value=\"{{ version }}\">\n\n        <!-- Primary Page Layout\n        ================================================== -->\n        <div class=\"app-container\"></div>\n\n        <!-- End Document\n        ================================================== -->\n        <script src=\"/js/app.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "samples/TodoList/webpack.config.ts",
    "content": "/**\n* webpack.config.ts\n* Copyright: Microsoft 2018\n*\n* Configuration for webpack, the bundling tool used for the web.\n*/\n\nimport path = require('path');\nimport * as webpack from 'webpack';\n\nconst platform = process.env.PLATFORM || 'web';\nconst isDev = (process.env.NODE_ENV === 'development');\nconst isTest = (platform === 'tests');\n\nconst getConfig = require('./buildconfig.js');\nconst config = getConfig(platform, isDev);\n\nconst webpackConfig: webpack.Configuration = {\n    entry: './src/ts/index.web.tsx',\n    mode: isDev ? 'development' : 'production',\n    output: {\n        filename: 'app.js',\n        path: __dirname + '/web/js'\n    },\n\n    // Enable sourcemaps for debugging webpack's output.\n    devtool: 'source-map',\n\n    resolve: {\n        modules: [\n            path.resolve('.'),\n            path.resolve('./node_modules')\n        ],\n        // Add '.ts' and '.tsx' as resolvable extensions.\n        extensions: ['.webpack.js', '.web.js', '.ts', '.tsx', '.js'],\n        alias: config.bundling.aliases\n    },\n\n    module: {\n        rules: [\n            {\n                test: /\\.(t|j)sx?$/,\n                exclude: /node_modules[\\/\\\\].*lodash/,\n                loader: 'babel-loader'\n            },\n            {\n                test: /\\.tsx?$/,\n                loader: 'ts-loader',\n                options: {\n                    configFile: 'tsconfig.json'\n                }\n            }\n        ]\n    },\n\n    plugins: [\n        // Replace flags in the code based on the build variables. This is similar to\n        // the replaceFlags method in gulpfile.js. If you make a change here, reflect\n        // the same change in the other location.\n        new webpack.DefinePlugin({\n            '__DEV__': isDev,\n            '__TEST__': isTest,\n            '__WEB__': true,\n            '__ANDROID__': false,\n            '__IOS__': false,\n            '__WINDOWS__': false,\n            '__MACOS__': false\n        })\n    ]\n};\n\nexport default webpackConfig;\n"
  },
  {
    "path": "samples/TodoList/windows/.gitignore",
    "content": "*AppPackages*\n*BundleArtifacts*\n\n#OS junk files\n[Tt]humbs.db\n*.DS_Store\n\n#Visual Studio files\n*.[Oo]bj\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vssscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.[Cc]ache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.sdf\n*.opensdf\n*.opendb\n*.unsuccessfulbuild\nipch/\n[Oo]bj/\n[Bb]in\n[Dd]ebug*/\n[Rr]elease*/\nAnkh.NoLoad\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n#MonoDevelop\n*.pidb\n*.userprefs\n\n#Tooling\n_ReSharper*/\n*.resharper\n[Tt]est[Rr]esult*\n*.sass-cache\n\n#Project files\n[Bb]uild/\n\n#Subversion files\n.svn\n\n# Office Temp Files\n~$*\n\n# vim Temp Files\n*~\n\n#NuGet\npackages/\n*.nupkg\n\n#ncrunch\n*ncrunch*\n*crunch*.local.xml\n\n# visual studio database projects\n*.dbmdl\n\n#Test files\n*.testsettings\n\n#Other files\n*.DotSettings\n.vs/\n*project.lock.json\n"
  },
  {
    "path": "samples/TodoList/windows/TodoList/App.xaml",
    "content": "<Application\n    x:Class=\"TodoList.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:TodoList\"\n    RequestedTheme=\"Light\">\n\n</Application>\n"
  },
  {
    "path": "samples/TodoList/windows/TodoList/App.xaml.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Launch;\nusing System;\nusing Windows.ApplicationModel;\nusing Windows.ApplicationModel.Activation;\nusing Windows.UI.Core;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Navigation;\n\nnamespace TodoList\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : Application\n    {\n        private readonly ReactPage _reactPage;\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n            this.Suspending += OnSuspending;\n            this.Resuming += OnResuming;\n\n            _reactPage = new MainPage();\n        }\n\n        /// <summary>\n        /// Invoked when the application is launched normally by the end user.  Other entry points\n        /// will be used such as when the application is launched to open a specific file.\n        /// </summary>\n        /// <param name=\"e\">Details about the launch request and process.</param>\n        protected override void OnLaunched(LaunchActivatedEventArgs e)\n        {\n            base.OnLaunched(e);\n            OnCreate(e.Arguments);\n        }\n\n        /// <summary>\n        /// Invoked when the application is activated.\n        /// </summary>\n        /// <param name=\"args\">The activated event arguments.</param>\n        protected override void OnActivated(IActivatedEventArgs args)\n        {\n            base.OnActivated(args);\n\n            switch (args.Kind)\n            {\n                case ActivationKind.Protocol:\n                case ActivationKind.ProtocolForResults:\n                    var protocolArgs = (IProtocolActivatedEventArgs)args;\n                    LauncherModule.SetActivatedUrl(protocolArgs.Uri.AbsoluteUri);\n                    break;\n            }\n\n            if (args.PreviousExecutionState != ApplicationExecutionState.Running &&\n                args.PreviousExecutionState != ApplicationExecutionState.Suspended)\n            {\n                OnCreate(null);\n            }\n        }\n\n        /// <summary>\n        /// Called whenever the app is opened to initia\n        /// </summary>\n        /// <param name=\"arguments\"></param>\n        private void OnCreate(string arguments)\n        {\n            _reactPage.OnResume(Exit);\n\n#if FALSE\n            if (System.Diagnostics.Debugger.IsAttached)\n            {\n                this.DebugSettings.EnableFrameRateCounter = true;\n            }\n\n            SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =\n                AppViewBackButtonVisibility.Visible;\n#endif\n\n            Frame rootFrame = Window.Current.Content as Frame;\n\n            // Do not repeat app initialization when the Window already has content,\n            // just ensure that the window is active\n            if (rootFrame == null)\n            {\n                _reactPage.OnCreate(arguments);\n\n                // Create a Frame to act as the navigation context and navigate to the first page\n                rootFrame = new Frame();\n\n                rootFrame.NavigationFailed += OnNavigationFailed;\n\n                // Place the frame in the current Window\n                Window.Current.Content = rootFrame;\n            }\n\n            if (rootFrame.Content == null)\n            {\n                // When the navigation stack isn't restored navigate to the first page,\n                // configuring the new page by passing required information as a navigation\n                // parameter\n                rootFrame.Content = _reactPage;\n            }\n\n            // Ensure the current window is active\n            Window.Current.Activate();\n        }\n\n        /// <summary>\n        /// Invoked when Navigation to a certain page fails\n        /// </summary>\n        /// <param name=\"sender\">The Frame which failed navigation</param>\n        /// <param name=\"e\">Details about the navigation failure</param>\n        private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)\n        {\n            throw new Exception(\"Failed to load Page \" + e.SourcePageType.FullName);\n        }\n\n        /// <summary>\n        /// Invoked when application execution is being suspended.  Application state is saved\n        /// without knowing whether the application will be terminated or resumed with the contents\n        /// of memory still intact.\n        /// </summary>\n        /// <param name=\"sender\">The source of the suspend request.</param>\n        /// <param name=\"e\">Details about the suspend request.</param>\n        private void OnSuspending(object sender, SuspendingEventArgs e)\n        {\n            _reactPage.OnSuspend();\n        }\n\n        /// <summary>\n        /// Invoked when application execution is being resumed.\n        /// </summary>\n        /// <param name=\"sender\">The source of the resume request.</param>\n        /// <param name=\"e\">Details about the resume request.</param>\n        private void OnResuming(object sender, object e)\n        {\n            _reactPage.OnResume(Exit);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/TodoList/windows/TodoList/MainPage.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Core;\nusing ReactNative.Shell;\nusing System.Collections.Generic;\nusing Org.PGSQLite.SQLitePlugin;\n\nnamespace TodoList\n{\n    class MainPage : ReactPage\n    {\n        public override string MainComponentName\n        {\n            get\n            {\n                return \"RXApp\";\n            }\n        }\n\n#if BUNDLE\n        public override string JavaScriptBundleFile\n        {\n            get\n            {\n                return \"ms-appx:///ReactAssets/index.windows.bundle\";\n            }\n        }\n#endif\n\n        public override List<IReactPackage> Packages\n        {\n            get\n            {\n                return new List<IReactPackage>\n                {\n                    new MainReactPackage(),\n                    new SQLitePluginPackage(),\n                };\n            }\n        }\n\n        public override bool UseDeveloperSupport\n        {\n            get\n            {\n#if !BUNDLE || DEBUG\n                return true;\n#else\n                return false;\n#endif\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "samples/TodoList/windows/TodoList/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\" xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\" IgnorableNamespaces=\"uap mp\">\n  <Identity Name=\"7A9048FC-A5DC-4290-B1D1-E5058B99B967\" Publisher=\"CN=yuzholob\" Version=\"1.0.0.0\" />\n  <mp:PhoneIdentity PhoneProductId=\"37ff8a1b-4d66-4281-9896-ba00ac6aba85\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\" />\n  <Properties>\n    <DisplayName>TodoList</DisplayName>\n    <PublisherDisplayName>Microsoft Corp.</PublisherDisplayName>\n    <Logo>Assets\\Images\\store-logo.png</Logo>\n  </Properties>\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n  <Resources>\n    <Resource Language=\"x-generate\" />\n  </Resources>\n  <Applications>\n    <Application Id=\"App\" Executable=\"$targetnametoken$.exe\" EntryPoint=\"TodoList.App\">\n      <uap:VisualElements DisplayName=\"TodoList\" Square150x150Logo=\"Assets\\Images\\medium-tile.png\" Square44x44Logo=\"Assets\\Images\\app-icon.png\" Description=\"Client for machine teaching\" BackgroundColor=\"transparent\">\n        <uap:DefaultTile>\n          <uap:ShowNameOnTiles>\n            <uap:ShowOn Tile=\"square150x150Logo\" />\n          </uap:ShowNameOnTiles>\n        </uap:DefaultTile>\n        <uap:SplashScreen Image=\"Assets\\Images\\splash-screen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n    <Capability Name=\"privateNetworkClientServer\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "samples/TodoList/windows/TodoList/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TodoList\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TodoList\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "samples/TodoList/windows/TodoList/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for todolist.MyClass and all of its public/private members\n    <Type Name=\"todolist.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"todolist.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n\n\n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "samples/TodoList/windows/TodoList/TodoList.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{B1DF5A70-CE68-416F-94DE-B16C6F796B27}</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TodoList</RootNamespace>\n    <AssemblyName>TodoList</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>TodoList_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <PackageCertificateThumbprint>8843B41307C6B74BC7DCE3B6AD86B21A66ABF742</PackageCertificateThumbprint>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'\">\n    <OutputPath>bin\\x86\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'\">\n    <OutputPath>bin\\ARM\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'\">\n    <OutputPath>bin\\x64\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainPage.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NETCore.UniversalWindowsPlatform\">\n      <Version>6.0.4</Version>\n    </PackageReference>\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Assets\\Fonts\\*.ttf\" />\n    <Content Include=\"Assets\\Images\\*.png\" />\n    <Content Include=\"Properties\\Default.rd.xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-sqlite-storage\\src\\windows\\SQLitePlugin\\SQLitePlugin.csproj\">\n      <Project>{6a1f04d0-8750-11e6-aade-eb9eac8d95cf}</Project>\n      <Name>SQLitePlugin</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\">\n      <Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>\n      <Name>ReactNative</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\bin\\Universal\\$(Platform)\\$(Configuration)\\yoga.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Visible>False</Visible>\n    </Content>\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'\">\n    <Content Include=\"ReactAssets\\**\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"TodoList_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "samples/TodoList/windows/TodoList.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2020\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TodoList\", \"TodoList\\TodoList.csproj\", \"{B1DF5A70-CE68-416F-94DE-B16C6F796B27}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNative\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\", \"{C7673AD5-E3AA-468C-A5FD-FA38154E205C}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C} = {2EACF721-73B5-46AE-9775-4A8674D05A9C}\n\tEndProjectSection\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ReactNative.Shared\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj\", \"{EEA8B852-4D07-48E1-8294-A21AB5909FE5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ChakraBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj\", \"{4B72C796-16D5-4E3A-81C0-3E36F531E578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNativeWebViewBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNativeWebViewBridge\\ReactNativeWebViewBridge.csproj\", \"{7596216B-669C-41F8-86DA-F3637F6545C0}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"Facebook.Yoga.Shared\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.shproj\", \"{91C42D32-291D-4B72-90B4-551663D60B8B}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"yoga.uwp\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\Yoga.Universal.vcxproj\", \"{2EACF721-73B5-46AE-9775-4A8674D05A9C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SQLitePlugin\", \"..\\node_modules\\react-native-sqlite-storage\\src\\windows\\SQLitePlugin\\SQLitePlugin.csproj\", \"{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\t..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13\n\t\t..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tDebugBundle|Any CPU = DebugBundle|Any CPU\n\t\tDebugBundle|ARM = DebugBundle|ARM\n\t\tDebugBundle|x64 = DebugBundle|x64\n\t\tDebugBundle|x86 = DebugBundle|x86\n\t\tDevelopment|Any CPU = Development|Any CPU\n\t\tDevelopment|ARM = Development|ARM\n\t\tDevelopment|x64 = Development|x64\n\t\tDevelopment|x86 = Development|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\t\tReleaseBundle|Any CPU = ReleaseBundle|Any CPU\n\t\tReleaseBundle|ARM = ReleaseBundle|ARM\n\t\tReleaseBundle|x64 = ReleaseBundle|x64\n\t\tReleaseBundle|x86 = ReleaseBundle|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x64.Build.0 = Debug|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x86.Build.0 = Debug|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|Any CPU.ActiveCfg = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|ARM.Build.0 = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x64.ActiveCfg = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x64.Build.0 = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x64.Deploy.0 = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x86.ActiveCfg = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x86.Build.0 = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.DebugBundle|x86.Deploy.0 = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|Any CPU.ActiveCfg = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|Any CPU.Build.0 = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|Any CPU.Deploy.0 = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|ARM.Build.0 = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x64.ActiveCfg = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x64.Build.0 = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x64.Deploy.0 = DebugBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x86.ActiveCfg = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x86.Build.0 = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Development|x86.Deploy.0 = DebugBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|ARM.Build.0 = Release|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x64.ActiveCfg = Release|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x64.Build.0 = Release|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x64.Deploy.0 = Release|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x86.ActiveCfg = Release|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x86.Build.0 = Release|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.Release|x86.Deploy.0 = Release|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|Any CPU.ActiveCfg = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86\n\t\t{B1DF5A70-CE68-416F-94DE-B16C6F796B27}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|Any CPU.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|Any CPU.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|Any CPU.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|Any CPU.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Development|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|Any CPU.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|Any CPU.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|Any CPU.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|Any CPU.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|Any CPU.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|Any CPU.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Development|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|Any CPU.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|Any CPU.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|Any CPU.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|Any CPU.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|Any CPU.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|Any CPU.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Development|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|Any CPU.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|Any CPU.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|Any CPU.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|Any CPU.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|Any CPU.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|Any CPU.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Development|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|Any CPU.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|Any CPU.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|x64.Build.0 = Debug|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Debug|x86.Build.0 = Debug|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|Any CPU.ActiveCfg = Development|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|Any CPU.Build.0 = Development|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|ARM.ActiveCfg = Development|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|ARM.Build.0 = Development|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|x64.ActiveCfg = Development|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|x64.Build.0 = Development|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|x86.ActiveCfg = Development|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Development|x86.Build.0 = Development|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|ARM.Build.0 = Release|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|x64.ActiveCfg = Release|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|x64.Build.0 = Release|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|x86.ActiveCfg = Release|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.Release|x86.Build.0 = Release|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|Any CPU.Build.0 = Release|Any CPU\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{6A1F04D0-8750-11E6-AADE-EB9EAC8D95CF}.ReleaseBundle|x86.Build.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {B1CC92D8-054F-4AB6-B982-0CAB8B9AAC57}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/hello-world/.eslintrc",
    "content": "{\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"warnOnUnsupportedTypeScriptVersion\": false,\n    \"ecmaFeatures\": { \"jsx\": true },\n    \"ecmaVersion\": 2018,\n    \"sourceType\": \"module\",\n    \"project\": \"./tsconfig.json\"\n  },\n  \"plugins\": [\"@typescript-eslint\", \"reactxp\", \"react\", \"jest\"],\n  \"extends\": [\n    \"eslint:recommended\",\n    \"plugin:@typescript-eslint/eslint-recommended\",\n    \"plugin:@typescript-eslint/recommended\",\n    \"plugin:@typescript-eslint/recommended-requiring-type-checking\",\n    \"plugin:reactxp/recommended\",\n    \"plugin:react/recommended\",\n    \"plugin:jest/recommended\"\n  ],\n  \"env\": {\n    \"browser\": true,\n    \"node\": true,\n    \"es6\": true\n  },\n  \"rules\": {\n    \"@typescript-eslint/explicit-function-return-type\": \"off\",\n    \"indent\": \"off\",\n    \"@typescript-eslint/indent\": [\"error\", 4],\n    \"react/jsx-curly-brace-presence\": [2, { \"props\": \"always\" }],\n    \"max-len\": [\"error\", 140]\n  },\n  \"globals\": {\n    \"__DEV__\": true\n  },\n  \"settings\": {\n    \"react\": { \"version\": \"latest\" }\n  }\n}\n"
  },
  {
    "path": "samples/hello-world/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\n#\nbuck-out/\n\\.buckd/\n*.keystore\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/\n\n*/fastlane/report.xml\n*/fastlane/Preview.html\n*/fastlane/screenshots\n\n# Bundle artifact\n#\n*.jsbundle\n\n# Web dist\n#\ndist-*\n"
  },
  {
    "path": "samples/hello-world/README.md",
    "content": "# RXPHelloWorld\n\nThis app works on React Native (iOS, Android, Windows) and web.\nThe commands in the instructions below assume you are in the root of this repo.\n\n### Building\n\n- From the hello-world directory, run `npm install`. This fetches the dependencies.\n\n### To run your app on Web:\n  ```shell\n  npm run start:web\n  ```\n\n### To build Web production version of your app:\n  ```shell\n  npm run build:web\n  ```\n\n### To run your app on iOS:\n  ```shell\n  npm run start:ios\n  ```\n##### - or -\n  open `ios/RXPHelloWorld.xcodeproj` project in Xcode\n  press the Run button\n\n### To run your app on Android:\nHave an Android emulator running (quickest way to get started), or a device connected\n\n  ```shell\n  npm run start:android\n  ```\n#####  - or -\n  open `android/` project in Android Studio\n  press the Run button\n\n### To run your app on Windows:\n  ```shell\n  npm run start:windows\n  ```\n##### - or -\n  open `windows/RXPHelloWorld.sln` project in Visual Studio\n  press the Run button\n"
  },
  {
    "path": "samples/hello-world/android/app/BUCK",
    "content": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm start` - to start the packager\n# - `cd android`\n# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\"`\n# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck\n# - `buck install -r android/app` - compile, install and run application\n#\n\nload(\":build_defs.bzl\", \"create_aar_targets\", \"create_jar_targets\")\n\nlib_deps = []\n\ncreate_aar_targets(glob([\"libs/*.aar\"]))\n\ncreate_jar_targets(glob([\"libs/*.jar\"]))\n\nandroid_library(\n    name = \"all-libs\",\n    exported_deps = lib_deps,\n)\n\nandroid_library(\n    name = \"app-code\",\n    srcs = glob([\n        \"src/main/java/**/*.java\",\n    ]),\n    deps = [\n        \":all-libs\",\n        \":build_config\",\n        \":res\",\n    ],\n)\n\nandroid_build_config(\n    name = \"build_config\",\n    package = \"com.rxphelloworld\",\n)\n\nandroid_resource(\n    name = \"res\",\n    package = \"com.rxphelloworld\",\n    res = \"src/main/res\",\n)\n\nandroid_binary(\n    name = \"app\",\n    keystore = \"//android/keystores:debug\",\n    manifest = \"src/main/AndroidManifest.xml\",\n    package_type = \"debug\",\n    deps = [\n        \":app-code\",\n    ],\n)\n"
  },
  {
    "path": "samples/hello-world/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation\n *   entryFile: \"index.android.js\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    entryFile: \"index.js\"\n]\n\napply from: \"../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.rxphelloworld\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n        ndk {\n            abiFilters \"armeabi-v7a\", \"x86\"\n        }\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits\n            def versionCodes = [\"armeabi-v7a\":1, \"x86\":2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    implementation \"com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}\"\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n    implementation project(':react-native-svg')\n    implementation project(':react-native-video')\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n"
  },
  {
    "path": "samples/hello-world/android/app/build_defs.bzl",
    "content": "\"\"\"Helper definitions to glob .aar and .jar targets\"\"\"\n\ndef create_aar_targets(aarfiles):\n    for aarfile in aarfiles:\n        name = \"aars__\" + aarfile[aarfile.rindex(\"/\") + 1:aarfile.rindex(\".aar\")]\n        lib_deps.append(\":\" + name)\n        android_prebuilt_aar(\n            name = name,\n            aar = aarfile,\n        )\n\ndef create_jar_targets(jarfiles):\n    for jarfile in jarfiles:\n        name = \"jars__\" + jarfile[jarfile.rindex(\"/\") + 1:jarfile.rindex(\".jar\")]\n        lib_deps.append(\":\" + name)\n        prebuilt_jar(\n            name = name,\n            binary_jar = jarfile,\n        )\n"
  },
  {
    "path": "samples/hello-world/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "samples/hello-world/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "samples/hello-world/android/app/src/debug/res/xml/react_native_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n  <domain-config cleartextTrafficPermitted=\"true\">\n    <domain includeSubdomains=\"false\">localhost</domain>\n    <domain includeSubdomains=\"false\">10.0.2.2</domain>\n    <domain includeSubdomains=\"false\">10.0.3.2</domain>\n  </domain-config>\n</network-security-config>\n"
  },
  {
    "path": "samples/hello-world/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.rxphelloworld\"\n>\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "samples/hello-world/android/app/src/main/java/com/rxphelloworld/MainActivity.java",
    "content": "package com.rxphelloworld;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n    /**\n     * Returns the name of the main component registered from JavaScript.\n     * This is used to schedule rendering of the component.\n     */\n    @Override\n    protected String getMainComponentName() {\n        return \"RXApp\";\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/android/app/src/main/java/com/rxphelloworld/MainApplication.java",
    "content": "package com.rxphelloworld;\n\nimport com.brentvatne.react.ReactVideoPackage;\nimport com.horcrux.svg.SvgPackage;\n\nimport android.app.Application;\n\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.shell.MainReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage(),\n          new ReactVideoPackage(),\n          new SvgPackage()\n      );\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return \"index\";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n  }\n}\n"
  },
  {
    "path": "samples/hello-world/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RXPHelloWorld</string>\n</resources>\n"
  },
  {
    "path": "samples/hello-world/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "samples/hello-world/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n        supportLibVersion = \"28.0.0\"\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:3.4.0\")\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url \"$rootDir/../node_modules/react-native/android\"\n        }\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "samples/hello-world/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "samples/hello-world/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "samples/hello-world/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      http://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/hello-world/android/keystores/BUCK",
    "content": "keystore(\n    name = \"debug\",\n    properties = \"debug.keystore.properties\",\n    store = \"debug.keystore\",\n    visibility = [\n        \"PUBLIC\",\n    ],\n)\n"
  },
  {
    "path": "samples/hello-world/android/keystores/debug.keystore.properties",
    "content": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "samples/hello-world/android/settings.gradle",
    "content": "rootProject.name = 'RXPHelloWorld'\n\ninclude ':react-native-video'\nproject(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android-exoplayer')\n\ninclude ':react-native-svg'\nproject(':react-native-svg').projectDir = new File(rootProject.projectDir, \t'../node_modules/react-native-svg/android')\n\ninclude ':app'\n"
  },
  {
    "path": "samples/hello-world/babel.config.js",
    "content": "module.exports = function(api) {\n  api.cache.forever();\n\n  const presets = [\n    ['module:metro-react-native-babel-preset'],\n  ];\n\n  const plugins = [\n    ['@babel/proposal-decorators', { legacy: true }],\n  ];\n\n  if (process.env.platform === 'web') {\n    return {\n      presets: ['@babel/env', ...presets],\n      plugins,\n    }\n  }\n\n  return { presets, plugins };\n};\n"
  },
  {
    "path": "samples/hello-world/index.js",
    "content": "import './src/index';\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/AppDelegate.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/AppDelegate.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge\n                                                   moduleName:@\"RXApp\"\n                                            initialProperties:nil];\n\n  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n#if DEBUG\n  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index\" fallbackResource:nil];\n#else\n  return [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n#endif\n}\n\n@end\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RXPHelloWorld\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>RXPHelloWorld</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n    <key>NSAllowsArbitraryLoads</key>\n    <true/>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld/main.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld-tvOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld-tvOSTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };\n\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };\n\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };\n\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };\n\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };\n\t\t00E356F31AD99517003FC87E /* RXPHelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */; };\n\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };\n\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };\n\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t232262BF234E4DC00097D10E /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 232262BC234E4DB50097D10E /* libRNSVG.a */; };\n\t\t23243787234E4B300041D225 /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 23243766234E4AD10041D225 /* libRCTVideo.a */; };\n\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; };\n\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; };\n\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; };\n\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };\n\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };\n\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };\n\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };\n\t\t2DCD954D1E0B4F2C00145EB5 /* RXPHelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */; };\n\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };\n\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };\n\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };\n\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };\n\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTActionSheet;\n\t\t};\n\t\t00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTGeolocation;\n\t\t};\n\t\t00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5115D1A9E6B3D00147676;\n\t\t\tremoteInfo = RCTImage;\n\t\t};\n\t\t00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B511DB1A9E6C8500147676;\n\t\t\tremoteInfo = RCTNetwork;\n\t\t};\n\t\t00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 832C81801AAF6DEF007FA2F7;\n\t\t\tremoteInfo = RCTVibration;\n\t\t};\n\t\t00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13B07F861A680F5B00A75B9A;\n\t\t\tremoteInfo = RXPHelloWorld;\n\t\t};\n\t\t139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTSettings;\n\t\t};\n\t\t139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3C86DF461ADF2C930047B81A;\n\t\t\tremoteInfo = RCTWebSocket;\n\t\t};\n\t\t146834031AC3E56700842450 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;\n\t\t\tremoteInfo = React;\n\t\t};\n\t\t232262BB234E4DB50097D10E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C;\n\t\t\tremoteInfo = RNSVG;\n\t\t};\n\t\t232262BD234E4DB50097D10E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 94DDAC5C1F3D024300EED511;\n\t\t\tremoteInfo = \"RNSVG-tvOS\";\n\t\t};\n\t\t23243765234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTVideo;\n\t\t};\n\t\t23243767234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 641E28441F0EEC8500443AF6;\n\t\t\tremoteInfo = \"RCTVideo-tvOS\";\n\t\t};\n\t\t2324377D234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;\n\t\t\tremoteInfo = jsi;\n\t\t};\n\t\t2324377F234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC73B214B45A300DD5AC8;\n\t\t\tremoteInfo = jsiexecutor;\n\t\t};\n\t\t23243781234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FB6214C9A0900B7C4FE;\n\t\t\tremoteInfo = \"jsi-tvOS\";\n\t\t};\n\t\t23243783234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FEE214C9CF800B7C4FE;\n\t\t\tremoteInfo = \"jsiexecutor-tvOS\";\n\t\t};\n\t\t2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;\n\t\t\tremoteInfo = \"RXPHelloWorld-tvOS\";\n\t\t};\n\t\t2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ADD01A681E09402E00F6D226;\n\t\t\tremoteInfo = \"RCTBlob-tvOS\";\n\t\t};\n\t\t2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D001F3B181A0099AA32;\n\t\t\tremoteInfo = fishhook;\n\t\t};\n\t\t2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32;\n\t\t\tremoteInfo = \"fishhook-tvOS\";\n\t\t};\n\t\t2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BDC1FC498900052F4D5;\n\t\t\tremoteInfo = jsinspector;\n\t\t};\n\t\t2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;\n\t\t\tremoteInfo = \"jsinspector-tvOS\";\n\t\t};\n\t\t2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7ECE1E25DB7D00323FB7;\n\t\t\tremoteInfo = \"third-party\";\n\t\t};\n\t\t2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D3C1EBD27B6005632C8;\n\t\t\tremoteInfo = \"third-party-tvOS\";\n\t\t};\n\t\t2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7E881E25C6D100323FB7;\n\t\t\tremoteInfo = \"double-conversion\";\n\t\t};\n\t\t2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D621EBD27B9005632C8;\n\t\t\tremoteInfo = \"double-conversion-tvOS\";\n\t\t};\n\t\t3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A283A1D9B042B00D4039D;\n\t\t\tremoteInfo = \"RCTImage-tvOS\";\n\t\t};\n\t\t3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28471D9B043800D4039D;\n\t\t\tremoteInfo = \"RCTLinking-tvOS\";\n\t\t};\n\t\t3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28541D9B044C00D4039D;\n\t\t\tremoteInfo = \"RCTNetwork-tvOS\";\n\t\t};\n\t\t3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28611D9B046600D4039D;\n\t\t\tremoteInfo = \"RCTSettings-tvOS\";\n\t\t};\n\t\t3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A287B1D9B048500D4039D;\n\t\t\tremoteInfo = \"RCTText-tvOS\";\n\t\t};\n\t\t3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28881D9B049200D4039D;\n\t\t\tremoteInfo = \"RCTWebSocket-tvOS\";\n\t\t};\n\t\t3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28131D9B038B00D4039D;\n\t\t\tremoteInfo = \"React-tvOS\";\n\t\t};\n\t\t3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C059A1DE3340900C268FA;\n\t\t\tremoteInfo = yoga;\n\t\t};\n\t\t3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C06751DE3340C00C268FA;\n\t\t\tremoteInfo = \"yoga-tvOS\";\n\t\t};\n\t\t3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;\n\t\t\tremoteInfo = cxxreact;\n\t\t};\n\t\t3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;\n\t\t\tremoteInfo = \"cxxreact-tvOS\";\n\t\t};\n\t\t5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTAnimation;\n\t\t};\n\t\t5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28201D9B03D100D4039D;\n\t\t\tremoteInfo = \"RCTAnimation-tvOS\";\n\t\t};\n\t\t78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTLinking;\n\t\t};\n\t\t832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5119B1A9E6C1200147676;\n\t\t\tremoteInfo = RCTText;\n\t\t};\n\t\tADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 358F4ED71D1E81A9004DF814;\n\t\t\tremoteInfo = RCTBlob;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTActionSheet.xcodeproj; path = \"../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTGeolocation.xcodeproj; path = \"../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTImage.xcodeproj; path = \"../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTNetwork.xcodeproj; path = \"../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVibration.xcodeproj; path = \"../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RXPHelloWorldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RXPHelloWorldTests.m; sourceTree = \"<group>\"; };\n\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTSettings.xcodeproj; path = \"../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTWebSocket.xcodeproj; path = \"../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RXPHelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RXPHelloWorld/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RXPHelloWorld/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RXPHelloWorld/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RXPHelloWorld/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RXPHelloWorld/main.m; sourceTree = \"<group>\"; };\n\t\t146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = React.xcodeproj; path = \"../node_modules/react-native/React/React.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t232262B6234E4DB40097D10E /* RNSVG.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RNSVG.xcodeproj; path = \"../node_modules/react-native-svg/ios/RNSVG.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVideo.xcodeproj; path = \"../node_modules/react-native-video/ios/RCTVideo.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"RXPHelloWorld-tvOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"RXPHelloWorld-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTAnimation.xcodeproj; path = \"../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTLinking.xcodeproj; path = \"../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTText.xcodeproj; path = \"../node_modules/react-native/Libraries/Text/RCTText.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTBlob.xcodeproj; path = \"../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t00E356EB1AD99517003FC87E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t232262BF234E4DC00097D10E /* libRNSVG.a in Frameworks */,\n\t\t\t\t23243787234E4B300041D225 /* libRCTVideo.a in Frameworks */,\n\t\t\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,\n\t\t\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */,\n\t\t\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,\n\t\t\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,\n\t\t\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,\n\t\t\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,\n\t\t\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,\n\t\t\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,\n\t\t\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,\n\t\t\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,\n\t\t\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */,\n\t\t\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00C302A81ABCB8CE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302B61ABCB90400DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302BC1ABCB91800DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,\n\t\t\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302D41ABCB9D200DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,\n\t\t\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302E01ABCB9EE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356EF1AD99517003FC87E /* RXPHelloWorldTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */,\n\t\t\t\t00E356F01AD99517003FC87E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = RXPHelloWorldTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356F01AD99517003FC87E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F11AD99517003FC87E /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139105B71AF99BAD00B5F7CC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,\n\t\t\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139FDEE71B06529A00C62182 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,\n\t\t\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,\n\t\t\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */,\n\t\t\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* RXPHelloWorld */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = RXPHelloWorld;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t146834001AC3E56700842450 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t146834041AC3E56700842450 /* libReact.a */,\n\t\t\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */,\n\t\t\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */,\n\t\t\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,\n\t\t\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2324377E234E4AD10041D225 /* libjsi.a */,\n\t\t\t\t23243780234E4AD10041D225 /* libjsiexecutor.a */,\n\t\t\t\t23243782234E4AD10041D225 /* libjsi-tvOS.a */,\n\t\t\t\t23243784234E4AD10041D225 /* libjsiexecutor-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t232262B7234E4DB40097D10E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t232262BC234E4DB50097D10E /* libRNSVG.a */,\n\t\t\t\t232262BE234E4DB50097D10E /* libRNSVG-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23243750234E4AD00041D225 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23243766234E4AD10041D225 /* libRCTVideo.a */,\n\t\t\t\t23243768234E4AD10041D225 /* libRCTVideo.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E91572E1DD0AC6500FF2AA8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78C398B11ACF4ADC00677621 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */,\n\t\t\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t232262B6234E4DB40097D10E /* RNSVG.xcodeproj */,\n\t\t\t\t2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */,\n\t\t\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,\n\t\t\t\t146833FF1AC3E56700842450 /* React.xcodeproj */,\n\t\t\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,\n\t\t\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */,\n\t\t\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,\n\t\t\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,\n\t\t\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,\n\t\t\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,\n\t\t\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,\n\t\t\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,\n\t\t\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,\n\t\t\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341B11AAA6A8300B99B32 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */,\n\t\t\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* RXPHelloWorld */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t00E356EF1AD99517003FC87E /* RXPHelloWorldTests */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */,\n\t\t\t\t00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */,\n\t\t\t\t2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */,\n\t\t\t\t2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tADBDB9201DFEBF0600ED6528 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */,\n\t\t\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t00E356ED1AD99517003FC87E /* RXPHelloWorldTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPHelloWorldTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t00E356EA1AD99517003FC87E /* Sources */,\n\t\t\t\t00E356EB1AD99517003FC87E /* Frameworks */,\n\t\t\t\t00E356EC1AD99517003FC87E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RXPHelloWorldTests;\n\t\t\tproductName = RXPHelloWorldTests;\n\t\t\tproductReference = 00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t13B07F861A680F5B00A75B9A /* RXPHelloWorld */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPHelloWorld\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RXPHelloWorld;\n\t\t\tproductName = \"Hello World\";\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E4771E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E4791E0B4A5D006451C7 /* Resources */,\n\t\t\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"RXPHelloWorld-tvOS\";\n\t\t\tproductName = \"RXPHelloWorld-tvOS\";\n\t\t\tproductReference = 2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E48F1E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E48C1E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E48E1E0B4A5D006451C7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"RXPHelloWorld-tvOSTests\";\n\t\t\tproductName = \"RXPHelloWorld-tvOSTests\";\n\t\t\tproductReference = 2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t00E356ED1AD99517003FC87E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tTestTargetID = 13B07F861A680F5B00A75B9A;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E47A1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E48F1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 2D02E47A1E0B4A5D006451C7;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPHelloWorld\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;\n\t\t\t\t\tProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */;\n\t\t\t\t\tProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 78C398B11ACF4ADC00677621 /* Products */;\n\t\t\t\t\tProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;\n\t\t\t\t\tProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 832341B11AAA6A8300B99B32 /* Products */;\n\t\t\t\t\tProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 23243750234E4AD00041D225 /* Products */;\n\t\t\t\t\tProjectRef = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139FDEE71B06529A00C62182 /* Products */;\n\t\t\t\t\tProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 146834001AC3E56700842450 /* Products */;\n\t\t\t\t\tProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 232262B7234E4DB40097D10E /* Products */;\n\t\t\t\t\tProjectRef = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* RXPHelloWorld */,\n\t\t\t\t00E356ED1AD99517003FC87E /* RXPHelloWorldTests */,\n\t\t\t\t2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */,\n\t\t\t\t2D02E48F1E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTActionSheet.a;\n\t\t\tremoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTGeolocation.a;\n\t\t\tremoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTImage.a;\n\t\t\tremoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTNetwork.a;\n\t\t\tremoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVibration.a;\n\t\t\tremoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTSettings.a;\n\t\t\tremoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTWebSocket.a;\n\t\t\tremoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t146834041AC3E56700842450 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t232262BC234E4DB50097D10E /* libRNSVG.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRNSVG.a;\n\t\t\tremoteRef = 232262BB234E4DB50097D10E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t232262BE234E4DB50097D10E /* libRNSVG-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRNSVG-tvOS.a\";\n\t\t\tremoteRef = 232262BD234E4DB50097D10E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243766234E4AD10041D225 /* libRCTVideo.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVideo.a;\n\t\t\tremoteRef = 23243765234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243768234E4AD10041D225 /* libRCTVideo.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVideo.a;\n\t\t\tremoteRef = 23243767234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2324377E234E4AD10041D225 /* libjsi.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsi.a;\n\t\t\tremoteRef = 2324377D234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243780234E4AD10041D225 /* libjsiexecutor.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsiexecutor.a;\n\t\t\tremoteRef = 2324377F234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243782234E4AD10041D225 /* libjsi-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsi-tvOS.a\";\n\t\t\tremoteRef = 23243781234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243784234E4AD10041D225 /* libjsiexecutor-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsiexecutor-tvOS.a\";\n\t\t\tremoteRef = 23243783234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTBlob-tvOS.a\";\n\t\t\tremoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libfishhook.a;\n\t\t\tremoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libfishhook-tvOS.a\";\n\t\t\tremoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsinspector.a;\n\t\t\tremoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsinspector-tvOS.a\";\n\t\t\tremoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTImage-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTLinking-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTNetwork-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTSettings-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTText-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTWebSocket-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTLinking.a;\n\t\t\tremoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTText.a;\n\t\t\tremoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTBlob.a;\n\t\t\tremoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t00E356EC1AD99517003FC87E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4791E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48E1E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native Code And Images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t00E356EA1AD99517003FC87E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t00E356F31AD99517003FC87E /* RXPHelloWorldTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4771E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,\n\t\t\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48C1E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DCD954D1E0B4F2C00145EB5 /* RXPHelloWorldTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13B07F861A680F5B00A75B9A /* RXPHelloWorld */;\n\t\t\ttargetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;\n\t\t};\n\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */;\n\t\t\ttargetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = RXPHelloWorld;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t00E356F61AD99517003FC87E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorldTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld.app/RXPHelloWorld\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t00E356F71AD99517003FC87E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorldTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld.app/RXPHelloWorld\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorld/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = RXPHelloWorld;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorld/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = RXPHelloWorld;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4971E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E4981E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4991E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld-tvOS.app/RXPHelloWorld-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E49A1E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld-tvOS.app/RXPHelloWorld-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPHelloWorldTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t00E356F61AD99517003FC87E /* Debug */,\n\t\t\t\t00E356F71AD99517003FC87E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPHelloWorld\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4971E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E4981E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4991E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E49A1E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPHelloWorld\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld.xcodeproj/xcshareddata/xcschemes/RXPHelloWorld-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D2A28121D9B038B00D4039D\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React-tvOS\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOS.app\"\n               BlueprintName = \"RXPHelloWorld-tvOS\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOSTests.xctest\"\n               BlueprintName = \"RXPHelloWorld-tvOSTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOSTests.xctest\"\n               BlueprintName = \"RXPHelloWorld-tvOSTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorld.xcodeproj/xcshareddata/xcschemes/RXPHelloWorld.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"83CBBA2D1A601D0E00E9B192\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"RXPHelloWorld.app\"\n               BlueprintName = \"RXPHelloWorld\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPHelloWorldTests.xctest\"\n               BlueprintName = \"RXPHelloWorldTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPHelloWorldTests.xctest\"\n               BlueprintName = \"RXPHelloWorldTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorldTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world/ios/RXPHelloWorldTests/RXPHelloWorldTests.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n#import <XCTest/XCTest.h>\n\n#import <React/RCTLog.h>\n#import <React/RCTRootView.h>\n\n#define TIMEOUT_SECONDS 600\n#define TEXT_TO_LOOK_FOR @\"Welcome to React Native!\"\n\n@interface RXPHelloWorldTests : XCTestCase\n\n@end\n\n@implementation RXPHelloWorldTests\n\n- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test\n{\n  if (test(view)) {\n    return YES;\n  }\n  for (UIView *subview in [view subviews]) {\n    if ([self findSubviewInView:subview matching:test]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n- (void)testRendersWelcomeScreen\n{\n  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];\n  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];\n  BOOL foundElement = NO;\n\n  __block NSString *redboxError = nil;\n  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {\n    if (level >= RCTLogLevelError) {\n      redboxError = message;\n    }\n  });\n\n  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {\n    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n\n    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {\n      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {\n        return YES;\n      }\n      return NO;\n    }];\n  }\n\n  RCTSetLogFunction(RCTDefaultLogFunction);\n\n  XCTAssertNil(redboxError, @\"RedBox error: %@\", redboxError);\n  XCTAssertTrue(foundElement, @\"Couldn't find element with text '%@' in %d seconds\", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);\n}\n\n\n@end\n"
  },
  {
    "path": "samples/hello-world/jest/enzyme.config.js",
    "content": "import Enzyme from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nEnzyme.configure({ adapter: new Adapter() });\n"
  },
  {
    "path": "samples/hello-world/jest/jest.config.js",
    "content": "module.exports = {\n  rootDir: '../',\n  roots: ['<rootDir>/src'],\n\n  moduleFileExtensions: [\n    'ts', 'tsx', 'js', 'json', 'node',\n  ],\n\n  moduleDirectories: ['node_modules'],\n\n  snapshotSerializers: [\n    'enzyme-to-json/serializer',\n  ],\n\n  setupFiles: [\n    '<rootDir>/jest/enzyme.config.js',\n  ],\n\n  testRegex: '(/__tests__/.*|(\\\\.|/)(test|spec))\\\\.((t|j)sx?)$',\n};\n"
  },
  {
    "path": "samples/hello-world/metro.config.js",
    "content": "module.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: { experimentalImportSupport: false, inlineRequires: false },\n    }),\n  },\n};\n"
  },
  {
    "path": "samples/hello-world/package.json",
    "content": "{\n  \"name\": \"rxphelloworld\",\n  \"private\": true,\n  \"main\": \"index.js\",\n  \"version\": \"2.0.0\",\n  \"scripts\": {\n    \"rn-cli\": \"node scripts/react-native.js\",\n    \"start:android\": \"npm run rn-cli run-android\",\n    \"start:windows\": \"npm run rn-cli run-windows\",\n    \"start:ios\": \"npm run rn-cli run-ios\",\n    \"start:web\": \"cross-env platform=web webpack-dev-server --config=web/webpack/dev.js --progress --colors --mode=development\",\n    \"start:rn-dev-server\": \"npm run rn-cli start --reset-cache\",\n    \"build:web\": \"cross-env platform=web webpack --config=web/webpack/prod.js --progress --colors --mode=production\",\n    \"test\": \"jest -c jest/jest.config.js\",\n    \"test:watch\": \"npm run test --watch\",\n    \"test:debug\": \"node --inspect-brk node_modules/.bin/jest -c jest/jest.config.js --runInBand\",\n    \"build:types\": \"tsc --emitDeclarationOnly\",\n    \"type-check\": \"tsc --noEmit\",\n    \"type-check:watch\": \"npm run type-check -w\",\n    \"lint\": \"eslint --config .eslintrc --ext .ts,.tsx src\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"7.7.4\",\n    \"@babel/plugin-proposal-decorators\": \"7.7.4\",\n    \"@babel/preset-env\": \"7.7.4\",\n    \"@react-native-community/cli\": \"9.1.3\",\n    \"@types/enzyme\": \"3.10.3\",\n    \"@types/jest\": \"24.0.23\",\n    \"@typescript-eslint/eslint-plugin\": \"2.9.0\",\n    \"@typescript-eslint/parser\": \"2.9.0\",\n    \"babel-loader\": \"8.3.0\",\n    \"compression-webpack-plugin\": \"3.0.0\",\n    \"cross-env\": \"6.0.3\",\n    \"enzyme\": \"3.10.0\",\n    \"enzyme-adapter-react-16\": \"1.15.1\",\n    \"enzyme-to-json\": \"3.4.3\",\n    \"eslint\": \"6.7.1\",\n    \"eslint-loader\": \"4.0.2\",\n    \"eslint-plugin-jest\": \"23.1.0\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"eslint-plugin-reactxp\": \"0.1.7\",\n    \"fork-ts-checker-webpack-plugin\": \"3.1.1\",\n    \"html-webpack-plugin\": \"5.5.0\",\n    \"jest\": \"29.1.2\",\n    \"metro-react-native-babel-preset\": \"0.57.0\",\n    \"rnpm-plugin-windows\": \"0.3.8\",\n    \"typescript\": \"3.7.2\",\n    \"webpack\": \"5.75.0\",\n    \"webpack-cli\": \"5.0.1\",\n    \"webpack-dev-server\": \"3.9.0\",\n    \"webpack-merge\": \"4.2.2\"\n  },\n  \"dependencies\": {\n    \"react\": \"16.12.0\",\n    \"react-dom\": \"16.12.0\",\n    \"react-native\": \"0.70.2\",\n    \"react-native-windows\": \"1.0.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"reactxp-imagesvg\": \"^2.0.0\",\n    \"reactxp-navigation\": \"^2.0.0\",\n    \"reactxp-video\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "samples/hello-world/scripts/react-native.js",
    "content": "require('@react-native-community/cli').run();"
  },
  {
    "path": "samples/hello-world/src/App.tsx",
    "content": "import * as React from 'react';\nimport * as RX from 'reactxp';\nimport { DEBUG, DEV\t} from './config';\nimport { RootView } from './views/RootView';\n\nclass App {\n    init() {\n        RX.App.initialize(DEBUG, DEV);\n        RX.UserInterface.setMainView(this._renderRootView());\n    }\n\n    private _renderRootView() {\n        return (\n            <RootView />\n        );\n    }\n}\n\nexport default new App();\n"
  },
  {
    "path": "samples/hello-world/src/config.ts",
    "content": "declare const __DEV__: boolean;\n\nexport const DEBUG = __DEV__;\nexport const DEV = __DEV__;\n"
  },
  {
    "path": "samples/hello-world/src/controls/ProgressIndicator.tsx",
    "content": "/**\n * ProgressIndicator.tsx\n * Copyright: Microsoft 2017\n *\n * Circular progress indicator that shows off the use of ImageSVG ReactXP extension.\n */\n\nimport * as React from 'react';\nimport * as RX from 'reactxp';\nimport RXImageSvg, { SvgPath as RXSvgPath, Types as SvgTypes } from 'reactxp-imagesvg';\n\nexport interface ProgressIndicatorProps extends RX.CommonStyledProps<SvgTypes.ImageSvgStyleRuleSet, ProgressIndicator>  {\n    fillColor: string;\n    progress: number;\n    size: number;\n}\n\nexport class ProgressIndicator extends RX.Component<ProgressIndicatorProps, RX.Stateless> {\n    render() {\n        const size = this.props.size;\n        const path = this._buildPath();\n\n        return (\n            <RXImageSvg\n                viewBox={ '0 0 ' + size + ' ' + size }\n                height={ size }\n                width={ size }\n                style={ this.props.style }\n            >\n                <RXSvgPath fillColor={ this.props.fillColor } d={ path } />\n            </RXImageSvg>\n        );\n    }\n\n    private _buildPath(): string {\n        const { progress, size } = this.props;\n        const radius = size / 2;\n        const deg = progress  * 360;\n        const radians = Math.PI * (deg - 90) / 180;\n        const endX = radius + radius * Math.cos(radians);\n        const endY = radius + radius * Math.sin(radians);\n\n        return `M${ radius }, ${ radius }, L${ radius }, 0 A${ radius }, ${ radius } 0 ${ (deg > 180 ? 1 : 0) }, 1 ${ endX }, ${ endY }z`;\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/src/controls/ToggleSwitch.tsx",
    "content": "﻿/**\n * ToggleSwitch.tsx\n * Copyright: Microsoft 2017\n *\n * A simple toggle control built in ReactXP that allows users to\n * pick between two values.\n */\nimport * as React from 'react';\nimport * as RX from 'reactxp';\n\nexport interface ToggleSwitchProps extends RX.CommonProps {\n    value?: boolean;\n    onChange?: (newValue: boolean) => void;\n}\n\nconst ANIMATION_DURATION = 250; // In milliseconds\nconst KNOB_LEFT_OFF = 2;        // In pixels\nconst KNOB_LEFT_ON = 22;        // In pixels\n\nconst _styles = {\n    container: RX.Styles.createButtonStyle({\n        flexDirection: 'row',\n        alignItems: 'center'\n    }),\n    toggleSwitch: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        borderRadius: 15,\n        marginVertical: 8,\n        height: 30,\n        width: 50,\n        backgroundColor: '#ddd'\n    }),\n    toggleSwitchBackground: RX.Styles.createViewStyle({\n        position: 'absolute',\n        top: 0,\n        bottom: 0,\n        left: 0,\n        right: 0,\n        borderRadius: 15\n    }),\n    toggleKnob: RX.Styles.createViewStyle({\n        top: 2,\n        height: 26,\n        width: 26,\n        borderRadius: 13,\n        backgroundColor: 'white'\n    })\n};\n\nexport class ToggleSwitch extends RX.Component<ToggleSwitchProps, RX.Stateless> {\n    private _knobLeftAnimationValue: RX.Animated.Value;\n    private _knobLeftAnimationStyle: RX.Types.AnimatedViewStyleRuleSet;\n\n    private _toggleColorAnimationValue: RX.Animated.Value;\n    private _toggleColorAnimationStyle: RX.Types.AnimatedViewStyleRuleSet;\n\n    constructor(props: ToggleSwitchProps) {\n        super(props);\n\n        // This value controls the left offset of the knob, which we will\n        // animate when the user toggles the control.\n        this._knobLeftAnimationValue = RX.Animated.createValue(props.value ? KNOB_LEFT_ON : KNOB_LEFT_OFF);\n        this._knobLeftAnimationStyle = RX.Styles.createAnimatedViewStyle({\n            left: this._knobLeftAnimationValue\n        });\n\n        // This value controls the background color of the control. Here we make\n        // use of the interpolate method to smoothly transition between two colors.\n        this._toggleColorAnimationValue = RX.Animated.createValue(props.value ? 1 : 0);\n        this._toggleColorAnimationStyle = RX.Styles.createAnimatedTextInputStyle({\n            backgroundColor: RX.Animated.interpolate(this._toggleColorAnimationValue, [0, 1], ['#66f', '#ddd'])\n        });\n    }\n\n    componentDidUpdate(prevProps: ToggleSwitchProps) {\n        // If the value of the toggle changes, animate the toggle sliding\n        // from one side to the other. In parallel, animate the opacity change.\n        if (prevProps.value !== this.props.value) {\n            RX.Animated.parallel([\n                RX.Animated.timing(this._knobLeftAnimationValue, {\n                    duration: ANIMATION_DURATION,\n                    toValue: this.props.value ? KNOB_LEFT_ON : KNOB_LEFT_OFF,\n                    easing: RX.Animated.Easing.InOut()\n                }),\n\n                RX.Animated.timing(this._toggleColorAnimationValue, {\n                    duration: ANIMATION_DURATION,\n                    toValue: this.props.value ? 1 : 0,\n                    easing: RX.Animated.Easing.InOut()\n                })\n            ])\n                .start();\n        }\n    }\n\n    render() {\n        const backgroundStyle = [_styles.toggleSwitchBackground, this._toggleColorAnimationStyle];\n        const knobStyles = [_styles.toggleKnob, this._knobLeftAnimationStyle];\n\n        return (\n            <RX.Button style={ _styles.container } onPress={ this._handleClick }>\n                <RX.View style={ _styles.toggleSwitch }>\n                    <RX.Animated.View style={ backgroundStyle }/>\n                    <RX.Animated.View style={ knobStyles }/>\n                </RX.View>\n            </RX.Button>\n        );\n    }\n\n    private _handleClick = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n\n        if (this.props.onChange) {\n            this.props.onChange(!this.props.value);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/src/index.tsx",
    "content": "import App from './App';\n\nApp.init();\n"
  },
  {
    "path": "samples/hello-world/src/views/MainPanel.tsx",
    "content": "import * as React from 'react';\nimport * as RX from 'reactxp';\n\ninterface MainPanelProps {\n    onPressNavigate: () => void;\n}\n\nconst _styles = {\n    scroll: RX.Styles.createScrollViewStyle({\n        alignSelf: 'stretch',\n        backgroundColor: '#f5fcff'\n    }),\n    container: RX.Styles.createViewStyle({\n        padding: 16,\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    helloWorld: RX.Styles.createTextStyle({\n        fontSize: 48,\n        fontWeight: 'bold',\n        marginBottom: 28\n    }),\n    welcome: RX.Styles.createTextStyle({\n        fontSize: 32,\n        marginBottom: 12\n    }),\n    instructions: RX.Styles.createTextStyle({\n        fontSize: 16,\n        color: '#aaa',\n        marginBottom: 16\n    }),\n    docLink: RX.Styles.createLinkStyle({\n        fontSize: 16,\n        color: 'blue',\n        marginBottom: 16\n    }),\n    roundButton: RX.Styles.createViewStyle({\n        margin: 16,\n        borderRadius: 16,\n        backgroundColor: '#7d88a9'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        marginVertical: 6,\n        marginHorizontal: 12,\n        color: 'white'\n    })\n};\n\nexport class MainPanel extends RX.Component<MainPanelProps, RX.Stateless> {\n    private _translationValue: RX.Animated.Value;\n    private _animatedStyle: RX.Types.AnimatedTextStyleRuleSet;\n\n    constructor(props: MainPanelProps) {\n        super(props);\n\n        this._translationValue = RX.Animated.createValue(-100);\n        this._animatedStyle = RX.Styles.createAnimatedTextStyle({\n            transform: [{ translateY: this._translationValue }]\n        });\n    }\n\n    componentDidMount() {\n        RX.Animated.timing(this._translationValue, {\n            duration: 500,\n            toValue: 0,\n            easing: RX.Animated.Easing.OutBack()\n        }).start();\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true }>\n                <RX.ScrollView style={ _styles.scroll }>\n                    <RX.View style={ _styles.container }>\n                        <RX.Animated.Text style={ [_styles.helloWorld, this._animatedStyle] }>\n                            Hello World\n                        </RX.Animated.Text>\n                        <RX.Text style={ _styles.welcome }>\n                            Welcome to ReactXP\n                        </RX.Text>\n                        <RX.Text style={ _styles.instructions }>\n                            Edit App.tsx to get started\n                        </RX.Text>\n                        <RX.Link style={ _styles.docLink } url={ 'https://microsoft.github.io/reactxp/docs' }>\n                            View ReactXP documentation\n                        </RX.Link>\n\n                        <RX.Button style={ _styles.roundButton } onPress={ this._onPressNavigate }>\n                            <RX.Text style={ _styles.buttonText }>\n                                See More Examples\n                            </RX.Text>\n                        </RX.Button>\n                    </RX.View>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    private _onPressNavigate = () => {\n        this.props.onPressNavigate();\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/src/views/RootView.tsx",
    "content": "import * as React from 'react';\nimport * as RX from 'reactxp';\nimport Navigator, { NavigatorDelegateSelector as DelegateSelector, Types } from 'reactxp-navigation';\n\nimport { MainPanel } from './MainPanel';\nimport { SecondPanel } from './SecondPanel';\n\nenum NavigationRouteId {\n    MainPanel,\n    SecondPanel\n}\n\nconst _styles = {\n    // Standard navigator style should be an object. So we have to disable caching here.\n    navCardStyle: RX.Styles.createViewStyle({\n        backgroundColor: '#f5fcff'\n    }, false)\n};\n\nexport class RootView extends RX.Component<RX.CommonProps, RX.Stateless> {\n    private _navigator: Navigator | undefined;\n\n    componentDidMount() {\n        if (this._navigator) {\n            this._navigator.immediatelyResetRouteStack([{\n                routeId: NavigationRouteId.MainPanel,\n                sceneConfigType: Types.NavigatorSceneConfigType.Fade\n            }]);\n        }\n    }\n\n    render() {\n        return (\n            <Navigator\n                delegateSelector={ DelegateSelector }\n                cardStyle={ _styles.navCardStyle }\n                renderScene={ this._renderScene }\n                ref={ this._onNavigatorRef }\n            />\n        );\n    }\n\n    private _onNavigatorRef = (navigator: Navigator) => {\n        this._navigator = navigator;\n    }\n\n    private _renderScene = (navigatorRoute: Types.NavigatorRoute) => {\n        switch (navigatorRoute.routeId) {\n            case NavigationRouteId.MainPanel:\n                return (\n                    <MainPanel onPressNavigate={ this._onPressNavigate } />\n                );\n\n            case NavigationRouteId.SecondPanel:\n                return (\n                    <SecondPanel onNavigateBack={ this._onPressBack } />\n                );\n        }\n\n        return null;\n    }\n\n    private _onPressNavigate = () => {\n        if (this._navigator) {\n            this._navigator.push({\n                sceneConfigType: Types.NavigatorSceneConfigType.FloatFromRight,\n                routeId: NavigationRouteId.SecondPanel\n            });\n        }\n    }\n\n    private _onPressBack = () => {\n        if (this._navigator) {\n            this._navigator.pop();\n        }\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/src/views/SecondPanel.tsx",
    "content": "import * as React from 'react';\nimport * as RX from 'reactxp';\nimport RXVideo from 'reactxp-video';\n\nimport { ProgressIndicator } from '../controls/ProgressIndicator';\nimport { ToggleSwitch } from '../controls/ToggleSwitch';\n\ninterface SecondPanelProps extends RX.CommonProps {\n    onNavigateBack: () => void;\n}\n\ninterface SecondPanelState {\n    progressValue: number;\n    toggleValue: boolean;\n}\n\nconst _styles = {\n    scroll: RX.Styles.createScrollViewStyle({\n        alignSelf: 'stretch',\n        backgroundColor: '#f5fcff'\n    }),\n    container: RX.Styles.createViewStyle({\n        padding: 16,\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    titleText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        textAlign: 'center',\n        marginTop: 12,\n        color: 'black'\n    }),\n    videoTitleText: RX.Styles.createTextStyle({\n        marginBottom: 8\n    }),\n    progressMargin: RX.Styles.createViewStyle({\n        margin: 8\n    }),\n    video: RX.Styles.createViewStyle({\n        height: 176,\n        width: 320\n    }),\n    roundButton: RX.Styles.createViewStyle({\n        margin: 16,\n        borderRadius: 16,\n        backgroundColor: '#7d88a9'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        marginVertical: 6,\n        marginHorizontal: 12,\n        color: 'white'\n    })\n};\n\nexport class SecondPanel extends RX.Component<SecondPanelProps, SecondPanelState> {\n    readonly state: SecondPanelState = {\n        progressValue: 0,\n        toggleValue: true\n    };\n\n    private _progressTimerToken: number | undefined;\n    private _mountedVideo: RXVideo | undefined;\n\n    componentDidMount() {\n        this._startProgressIndicator();\n    }\n\n    componentWillUnmount() {\n        this._stopProgressIndicator();\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true }>\n                <RX.ScrollView style={ _styles.scroll }>\n                    <RX.View style={ _styles.container }>\n                        <RX.Button style={ _styles.roundButton } onPress={ this._onPressBack }>\n                            <RX.Text style={ _styles.buttonText }>\n                                Go Back\n                            </RX.Text>\n                        </RX.Button>\n\n                        <RX.Text style={ _styles.titleText }>\n                            Here is a simple control built using ReactXP\n                        </RX.Text>\n                        <ToggleSwitch\n                            value={ this.state.toggleValue }\n                            onChange={ this._onChangeToggle }\n                        />\n\n                        <RX.Text style={ _styles.titleText }>\n                            Here is an SVG image using the ImageSvg extension\n                        </RX.Text>\n                        <ProgressIndicator\n                            fillColor={ '#ddd' }\n                            style={ _styles.progressMargin }\n                            size={ 32 }\n                            progress={ this.state.progressValue }\n                        />\n\n                        <RX.Text style={ [_styles.titleText, _styles.videoTitleText] }>\n                            Here is a video using the Video extension\n                        </RX.Text>\n                        <RXVideo\n                            source={ 'https://www.w3schools.com/html/mov_bbb.mp4' }\n                            style={ _styles.video }\n                            loop={ true }\n                            ref={ this._onMountVideo }\n                            onCanPlay={ this._playVideo }\n                        />\n                    </RX.View>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    private _onMountVideo = (component: RXVideo) => {\n        this._mountedVideo = component;\n    }\n\n    private _onPressBack = () => {\n        this.props.onNavigateBack();\n    }\n\n    private _playVideo = () => {\n        if (this._mountedVideo) {\n            this._mountedVideo.mute(true);\n            this._mountedVideo.play();\n        }\n    }\n\n    private _startProgressIndicator() {\n        this._progressTimerToken = window.setInterval(() => {\n            const newProgressValue = (this.state.progressValue + 0.02) % 1;\n            this.setState({ progressValue: newProgressValue });\n        }, 1000 / 15);\n    }\n\n    private _stopProgressIndicator() {\n        if (this._progressTimerToken) {\n            window.clearInterval(this._progressTimerToken);\n            this._progressTimerToken = undefined;\n        }\n    }\n\n    // Note that we define this as a variable rather than a normal method. Using this\n    // method, we prebind the method to this component instance. This prebinding ensures\n    // that each time we pass the variable as a prop in the render function, it will\n    // not change. We want to avoid unnecessary prop changes because this will trigger\n    // extra work within React's virtual DOM diffing mechanism.\n    private _onChangeToggle = (toggleValue: boolean) => {\n        this.setState({ toggleValue });\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"forceConsistentCasingInFileNames\": true,\n    \"strictPropertyInitialization\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"experimentalDecorators\": true,\n    \"noUnusedParameters\": true,\n    \"noImplicitReturns\": true,\n    \"moduleResolution\": \"node\",\n    \"strictNullChecks\": true,\n    \"esModuleInterop\": true,\n    \"noUnusedLocals\": true,\n    \"noImplicitThis\": true,\n    \"declarationDir\": \"dist-types\",\n    \"importHelpers\": true,\n    \"noImplicitAny\": true,\n    \"skipLibCheck\": true,\n    \"declaration\": true,\n    \"jsxFactory\": \"React\",\n    \"noResolve\": false,\n    \"module\": \"es2015\",\n    \"target\": \"es2015\",\n    \"jsx\": \"react\",\n    \"lib\": [\"es5\", \"es2015\", \"dom\"]\n  },\n\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\"]\n}"
  },
  {
    "path": "samples/hello-world/web/index.hmr.js",
    "content": "import '../index';\nmodule.hot.accept();\n"
  },
  {
    "path": "samples/hello-world/web/template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>RXPHelloWorld</title>\n  <style>\n    html,\n    body,\n    .app-container {\n      font-family: proxima-nova, \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif;\n      padding: 0;\n      margin: 0;\n      border: none;\n      height: 100%;\n      width: 100%;\n    }\n    *:focus {\n        outline: 0;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"app-container\"></div>\n</body>\n</html>"
  },
  {
    "path": "samples/hello-world/web/webpack/common.js",
    "content": "const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');\nconst HtmlWebpackPlugin = require('html-webpack-plugin');\nconst webpack = require('webpack');\nconst path = require('path');\n\nconst ROOT_PATH = path.join(__dirname, '..', '..');\nconst DIST_PATH = path.join(ROOT_PATH, 'dist-web');\nconst APP_PATH = path.join(ROOT_PATH, 'src');\nconst WEB_PATH = path.join(ROOT_PATH, 'web');\nconst TS_CONFIG_PATH = path.join(ROOT_PATH, 'tsconfig.json');\n\nconst buildConfig = (env, argv) => ({\n  entry: ROOT_PATH,\n\n  resolve: {\n    extensions: ['.ts', '.tsx', '.js'],\n  },\n\n  module: {\n    rules: [\n      { test: /\\.jsx?$/, loader: 'eslint-loader', include: APP_PATH, enforce: 'pre' },\n      { test: /\\.tsx?$/, loader: 'babel-loader', include: APP_PATH }\n    ],\n  },\n\n  plugins: [\n    new webpack.DefinePlugin({ __DEV__: argv.mode === 'development' }),\n    new HtmlWebpackPlugin({ inject: true, template: path.join(WEB_PATH, 'template.html') }),\n    new ForkTsCheckerWebpackPlugin({ tsconfig: TS_CONFIG_PATH, async: true }),\n  ],\n});\n\nmodule.exports = {\n  buildConfig,\n  APP_PATH,\n  DIST_PATH,\n  WEB_PATH,\n};\n"
  },
  {
    "path": "samples/hello-world/web/webpack/dev.js",
    "content": "const webpack = require('webpack');\nconst merge = require('webpack-merge');\nconst path = require('path');\nconst { buildConfig, APP_PATH, WEB_PATH } = require('./common');\n\nmodule.exports = (env, argv) => (\n  merge(buildConfig(env, argv), {\n    entry: path.join(WEB_PATH, 'index.hmr.js'),\n    devtool: 'inline-source-map',\n\n    plugins: [\n      new webpack.HotModuleReplacementPlugin(),\n    ],\n\n    devServer: {\n      contentBase: APP_PATH,\n      openPage: '',\n      inline: true,\n      stats: 'minimal',\n      open: true,\n      port: 9999,\n      hot: true,\n    },\n  })\n);\n"
  },
  {
    "path": "samples/hello-world/web/webpack/prod.js",
    "content": "const CompressionPlugin = require('compression-webpack-plugin');\nconst merge = require('webpack-merge');\nconst { buildConfig, DIST_PATH } = require('./common');\n\nmodule.exports = (env, argv) => merge(buildConfig(env, argv), {\n  devtool: false,\n\n  output: {\n    filename: 'bundle-[hash].js',\n    path: DIST_PATH,\n  },\n\n  plugins: [\n    new CompressionPlugin({ algorithm: 'gzip', filename: '[path].gz' }),\n  ],\n});\n"
  },
  {
    "path": "samples/hello-world/windows/.gitignore",
    "content": "*AppPackages*\n*BundleArtifacts*\n\n#OS junk files\n[Tt]humbs.db\n*.DS_Store\n\n#Visual Studio files\n*.[Oo]bj\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vssscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.[Cc]ache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.sdf\n*.opensdf\n*.opendb\n*.unsuccessfulbuild\nipch/\n[Oo]bj/\n[Bb]in\n[Dd]ebug*/\n[Rr]elease*/\nAnkh.NoLoad\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n#MonoDevelop\n*.pidb\n*.userprefs\n\n#Tooling\n_ReSharper*/\n*.resharper\n[Tt]est[Rr]esult*\n*.sass-cache\n\n#Project files\n[Bb]uild/\n\n#Subversion files\n.svn\n\n# Office Temp Files\n~$*\n\n# vim Temp Files\n*~\n\n#NuGet\npackages/\n*.nupkg\n\n#ncrunch\n*ncrunch*\n*crunch*.local.xml\n\n# visual studio database projects\n*.dbmdl\n\n#Test files\n*.testsettings\n\n#Other files\n*.DotSettings\n.vs/\n*project.lock.json\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/App.xaml",
    "content": "<rn:ReactApplication\n    x:Class=\"RXPHelloWorld.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rn=\"using:ReactNative\"\n    RequestedTheme=\"Light\">\n\n</rn:ReactApplication>\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/App.xaml.cs",
    "content": "using ReactNative;\n\nnamespace RXPHelloWorld\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : ReactApplication\n    {\n        private readonly ReactNativeHost _host = new MainReactNativeHost();\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// The React Native host.\n        /// </summary>\n        public override ReactNativeHost Host => _host;\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/MainReactNativeHost.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Core;\nusing ReactNative.Shell;\nusing System.Collections.Generic;\n\nnamespace RXPHelloWorld\n{\n    class MainReactNativeHost : ReactNativeHost\n    {\n        public override string MainComponentName => \"RXApp\";\n\n#if !BUNDLE || DEBUG\n        public override bool UseDeveloperSupport => true;\n#else\n        public override bool UseDeveloperSupport => false;\n#endif\n\n        protected override string JavaScriptMainModuleName => \"index\";\n\n#if BUNDLE\n        protected override string JavaScriptBundleFile => \"ms-appx:///ReactAssets/index.windows.bundle\";\n#endif\n\n        protected override List<IReactPackage> Packages => new List<IReactPackage>\n        {\n            new MainReactPackage(),\n        };\n    }\n}\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/Package.appxmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"327675e7-b7e7-41d1-b616-c7f068a0ea8e\"\n    Publisher=\"CN=user\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"327675e7-b7e7-41d1-b616-c7f068a0ea8e\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>RXPHelloWorld</DisplayName>\n    <PublisherDisplayName>React Native for UWP</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"RXPHelloWorld.App\">\n      <uap:VisualElements\n        DisplayName=\"RXPHelloWorld\"\n        Square150x150Logo=\"Assets\\Square150x150Logo.png\"\n        Square44x44Logo=\"Assets\\Square44x44Logo.png\"\n        Description=\"RXPHelloWorld\"\n        BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"Assets\\Wide310x150Logo.png\"/>\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"RXPHelloWorld\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RXPHelloWorld\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for RXPHelloWorld.MyClass and all of its public/private members\n    <Type Name=\"RXPHelloWorld.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"RXPHelloWorld.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/RXPHelloWorld.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>d1dc24da-295c-4d81-b9f2-70e98e6ea95e</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RXPHelloWorld</RootNamespace>\n    <AssemblyName>RXPHelloWorld</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>RXPHelloWorld_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <PackageCertificateThumbprint>158E5E3397D7BDDC6F5BE049E1F6AC9B45E82753</PackageCertificateThumbprint>\n    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug' or '$(Configuration)' == 'DebugBundle'\">\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release' or '$(Configuration)' == 'ReleaseBundle'\">\n    <DependencyConfiguration>Release</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'\">\n    <OutputPath>bin\\x86\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'\">\n    <OutputPath>bin\\ARM\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'\">\n    <OutputPath>bin\\x64\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainReactNativeHost.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"RXPHelloWorld_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Assets\\StoreLogo.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-200.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\">\n      <Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>\n      <Name>ReactNative</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'\">\n    <Content Include=\"ReactAssets\\**\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NETCore.UniversalWindowsPlatform\">\n      <Version>6.0.6</Version>\n    </PackageReference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\bin\\Universal\\$(Platform)\\$(DependencyConfiguration)\\yoga.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Visible>False</Visible>\n    </Content>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld/ReactAssets/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "samples/hello-world/windows/RXPHelloWorld.sln",
    "content": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.271\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RXPHelloWorld\", \"RXPHelloWorld\\RXPHelloWorld.csproj\", \"d1dc24da-295c-4d81-b9f2-70e98e6ea95e\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C} = {2EACF721-73B5-46AE-9775-4A8674D05A9C}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNative\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\", \"{C7673AD5-E3AA-468C-A5FD-FA38154E205C}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ReactNative.Shared\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj\", \"{EEA8B852-4D07-48E1-8294-A21AB5909FE5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ChakraBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj\", \"{4B72C796-16D5-4E3A-81C0-3E36F531E578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNativeWebViewBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNativeWebViewBridge\\ReactNativeWebViewBridge.csproj\", \"{7596216B-669C-41F8-86DA-F3637F6545C0}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"Facebook.Yoga.Shared\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.shproj\", \"{91C42D32-291D-4B72-90B4-551663D60B8B}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"yoga.uwp\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\Yoga.Universal.vcxproj\", \"{2EACF721-73B5-46AE-9775-4A8674D05A9C}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tDebugBundle|ARM = DebugBundle|ARM\n\t\tDebugBundle|x64 = DebugBundle|x64\n\t\tDebugBundle|x86 = DebugBundle|x86\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\t\tReleaseBundle|ARM = ReleaseBundle|ARM\n\t\tReleaseBundle|x64 = ReleaseBundle|x64\n\t\tReleaseBundle|x86 = ReleaseBundle|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x64.Build.0 = Debug|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x86.Build.0 = Debug|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|ARM.Build.0 = DebugBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x64.ActiveCfg = DebugBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x64.Build.0 = DebugBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x64.Deploy.0 = DebugBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x86.ActiveCfg = DebugBundle|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x86.Build.0 = DebugBundle|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.DebugBundle|x86.Deploy.0 = DebugBundle|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|ARM.Build.0 = Release|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x64.ActiveCfg = Release|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x64.Build.0 = Release|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x64.Deploy.0 = Release|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x86.ActiveCfg = Release|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x86.Build.0 = Release|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.Release|x86.Deploy.0 = Release|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86\n\t\t{d1dc24da-295c-4d81-b9f2-70e98e6ea95e}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/hello-world-js/.eslintrc",
    "content": "{\n    \"parser\": \"babel-eslint\",\n    \"plugins\": [\"react\", \"jest\"],\n    \"extends\": [\"eslint:recommended\", \"plugin:react/recommended\", \"plugin:jest/recommended\"],\n    \"env\": {\n        \"browser\": true,\n        \"node\": true,\n        \"es6\": true\n    },\n    \"parserOptions\": {\n        \"sourceType\": \"module\",\n        \"ecmaFeatures\": {\n            \"jsx\": true\n        }\n    },\n    \"rules\": {\n        \"react/jsx-curly-brace-presence\": [2, { \"props\": \"always\" }],\n        \"react/display-name\": 0,\n        \"comma-dangle\": [\"error\", \"never\"],\n        \"max-len\": [\"error\", 140],\n        \"indent\": \"error\"\n    },\n    \"globals\": {\n        \"__DEV__\": true\n    },\n    \"settings\": {\n        \"react\": { \"version\": \"latest\" }\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/.gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\n#\nbuck-out/\n\\.buckd/\n*.keystore\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/\n\n*/fastlane/report.xml\n*/fastlane/Preview.html\n*/fastlane/screenshots\n\n# Bundle artifact\n#\n*.jsbundle\n\n# Web dist\n#\ndist-*\n"
  },
  {
    "path": "samples/hello-world-js/README.md",
    "content": "# RXPHelloWorld\n\nThis app works on React Native (iOS, Android, Windows) and web.\nThe commands in the instructions below assume you are in the root of this repo.\n\n### Building\n\n- From the hello-world-js directory, run `npm install`. This fetches the dependencies.\n\n### To run your app on Web:\n  ```shell\n  npm run start:web\n  ```\n\n### To build Web production version of your app:\n  ```shell\n  npm run build:web\n  ```\n\n### To run your app on iOS:\n  ```shell\n  npm run start:ios\n  ```\n##### - or -\n  open ios/RXPHelloWorld.xcodeproj project in Xcode\n  press the Run button\n\n### To run your app on Android:\nHave an Android emulator running (quickest way to get started), or a device connected\n\n  ```shell\n  npm run start:android\n  ```\n#####  - or -\n  open android/ project in Android Studio\n  press the Run button\n\n### To run your app on Windows:\n  ```shell\n  npm run start:windows\n  ```\n##### - or -\n  open windows/RXPHelloWorld.sln project in Visual Studio\n  press the Run button\n"
  },
  {
    "path": "samples/hello-world-js/android/app/BUCK",
    "content": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm start` - to start the packager\n# - `cd android`\n# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\"`\n# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck\n# - `buck install -r android/app` - compile, install and run application\n#\n\nload(\":build_defs.bzl\", \"create_aar_targets\", \"create_jar_targets\")\n\nlib_deps = []\n\ncreate_aar_targets(glob([\"libs/*.aar\"]))\n\ncreate_jar_targets(glob([\"libs/*.jar\"]))\n\nandroid_library(\n    name = \"all-libs\",\n    exported_deps = lib_deps,\n)\n\nandroid_library(\n    name = \"app-code\",\n    srcs = glob([\n        \"src/main/java/**/*.java\",\n    ]),\n    deps = [\n        \":all-libs\",\n        \":build_config\",\n        \":res\",\n    ],\n)\n\nandroid_build_config(\n    name = \"build_config\",\n    package = \"com.rxphelloworld\",\n)\n\nandroid_resource(\n    name = \"res\",\n    package = \"com.rxphelloworld\",\n    res = \"src/main/res\",\n)\n\nandroid_binary(\n    name = \"app\",\n    keystore = \"//android/keystores:debug\",\n    manifest = \"src/main/AndroidManifest.xml\",\n    package_type = \"debug\",\n    deps = [\n        \":app-code\",\n    ],\n)\n"
  },
  {
    "path": "samples/hello-world-js/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\n\nimport com.android.build.OutputFile\n\n/**\n * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets\n * and bundleReleaseJsAndAssets).\n * These basically call `react-native bundle` with the correct arguments during the Android build\n * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the\n * bundle directly from the development server. Below you can see all the possible configurations\n * and their defaults. If you decide to add a configuration block, make sure to add it before the\n * `apply from: \"../../node_modules/react-native/react.gradle\"` line.\n *\n * project.ext.react = [\n *   // the name of the generated asset file containing your JS bundle\n *   bundleAssetName: \"index.android.bundle\",\n *\n *   // the entry file for bundle generation\n *   entryFile: \"index.android.js\",\n *\n *   // whether to bundle JS and assets in debug mode\n *   bundleInDebug: false,\n *\n *   // whether to bundle JS and assets in release mode\n *   bundleInRelease: true,\n *\n *   // whether to bundle JS and assets in another build variant (if configured).\n *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants\n *   // The configuration property can be in the following formats\n *   //         'bundleIn${productFlavor}${buildType}'\n *   //         'bundleIn${buildType}'\n *   // bundleInFreeDebug: true,\n *   // bundleInPaidRelease: true,\n *   // bundleInBeta: true,\n *\n *   // whether to disable dev mode in custom build variants (by default only disabled in release)\n *   // for example: to disable dev mode in the staging build type (if configured)\n *   devDisabledInStaging: true,\n *   // The configuration property can be in the following formats\n *   //         'devDisabledIn${productFlavor}${buildType}'\n *   //         'devDisabledIn${buildType}'\n *\n *   // the root of your project, i.e. where \"package.json\" lives\n *   root: \"../../\",\n *\n *   // where to put the JS bundle asset in debug mode\n *   jsBundleDirDebug: \"$buildDir/intermediates/assets/debug\",\n *\n *   // where to put the JS bundle asset in release mode\n *   jsBundleDirRelease: \"$buildDir/intermediates/assets/release\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in debug mode\n *   resourcesDirDebug: \"$buildDir/intermediates/res/merged/debug\",\n *\n *   // where to put drawable resources / React Native assets, e.g. the ones you use via\n *   // require('./image.png')), in release mode\n *   resourcesDirRelease: \"$buildDir/intermediates/res/merged/release\",\n *\n *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means\n *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to\n *   // date; if you have any other folders that you want to ignore for performance reasons (gradle\n *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/\n *   // for example, you might want to remove it from here.\n *   inputExcludes: [\"android/**\", \"ios/**\"],\n *\n *   // override which node gets called and with what additional arguments\n *   nodeExecutableAndArgs: [\"node\"],\n *\n *   // supply additional arguments to the packager\n *   extraPackagerArgs: []\n * ]\n */\n\nproject.ext.react = [\n    entryFile: \"index.js\"\n]\n\napply from: \"../../node_modules/react-native/react.gradle\"\n\n/**\n * Set this to true to create two separate APKs instead of one:\n *   - An APK that only works on ARM devices\n *   - An APK that only works on x86 devices\n * The advantage is the size of the APK is reduced by about 4MB.\n * Upload all the APKs to the Play Store and people will download\n * the correct one based on the CPU architecture of their device.\n */\ndef enableSeparateBuildPerCPUArchitecture = false\n\n/**\n * Run Proguard to shrink the Java bytecode in release builds.\n */\ndef enableProguardInReleaseBuilds = false\n\nandroid {\n    compileSdkVersion rootProject.ext.compileSdkVersion\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    defaultConfig {\n        applicationId \"com.rxphelloworld\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n        ndk {\n            abiFilters \"armeabi-v7a\", \"x86\"\n        }\n    }\n    splits {\n        abi {\n            reset()\n            enable enableSeparateBuildPerCPUArchitecture\n            universalApk false  // If true, also generate a universal APK\n            include \"armeabi-v7a\", \"x86\", \"arm64-v8a\", \"x86_64\"\n        }\n    }\n    buildTypes {\n        release {\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n    // applicationVariants are e.g. debug, release\n    applicationVariants.all { variant ->\n        variant.outputs.each { output ->\n            // For each separate APK per architecture, set a unique version code as described here:\n            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits\n            def versionCodes = [\"armeabi-v7a\":1, \"x86\":2, \"arm64-v8a\": 3, \"x86_64\": 4]\n            def abi = output.getFilter(OutputFile.ABI)\n            if (abi != null) {  // null for the universal-debug, universal-release variants\n                output.versionCodeOverride =\n                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode\n            }\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\n    implementation \"com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}\"\n    implementation \"com.facebook.react:react-native:+\"  // From node_modules\n    implementation project(':react-native-svg')\n    implementation project(':react-native-video')\n}\n\n// Run this once to be able to run the application with BUCK\n// puts all compile dependencies into folder libs for BUCK to use\ntask copyDownloadableDepsToLibs(type: Copy) {\n    from configurations.compile\n    into 'libs'\n}\n"
  },
  {
    "path": "samples/hello-world-js/android/app/build_defs.bzl",
    "content": "\"\"\"Helper definitions to glob .aar and .jar targets\"\"\"\n\ndef create_aar_targets(aarfiles):\n    for aarfile in aarfiles:\n        name = \"aars__\" + aarfile[aarfile.rindex(\"/\") + 1:aarfile.rindex(\".aar\")]\n        lib_deps.append(\":\" + name)\n        android_prebuilt_aar(\n            name = name,\n            aar = aarfile,\n        )\n\ndef create_jar_targets(jarfiles):\n    for jarfile in jarfiles:\n        name = \"jars__\" + jarfile[jarfile.rindex(\"/\") + 1:jarfile.rindex(\".jar\")]\n        lib_deps.append(\":\" + name)\n        prebuilt_jar(\n            name = name,\n            binary_jar = jarfile,\n        )\n"
  },
  {
    "path": "samples/hello-world-js/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>\n\n    <application android:usesCleartextTraffic=\"true\" tools:targetApi=\"28\" tools:ignore=\"GoogleAppIndexingWarning\" />\n</manifest>\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/debug/res/xml/react_native_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n  <domain-config cleartextTrafficPermitted=\"true\">\n    <domain includeSubdomains=\"false\">localhost</domain>\n    <domain includeSubdomains=\"false\">10.0.2.2</domain>\n    <domain includeSubdomains=\"false\">10.0.3.2</domain>\n  </domain-config>\n</network-security-config>\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest\n  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  package=\"com.rxphelloworld\"\n>\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\">\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenSize\"\n        android:windowSoftInputMode=\"adjustResize\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n      <activity android:name=\"com.facebook.react.devsupport.DevSettingsActivity\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/main/java/com/rxphelloworld/MainActivity.java",
    "content": "package com.rxphelloworld;\n\nimport com.facebook.react.ReactActivity;\n\npublic class MainActivity extends ReactActivity {\n\n    /**\n     * Returns the name of the main component registered from JavaScript.\n     * This is used to schedule rendering of the component.\n     */\n    @Override\n    protected String getMainComponentName() {\n        return \"RXApp\";\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/main/java/com/rxphelloworld/MainApplication.java",
    "content": "package com.rxphelloworld;\n\nimport com.brentvatne.react.ReactVideoPackage;\nimport com.horcrux.svg.SvgPackage;\n\nimport android.app.Application;\n\nimport com.facebook.react.ReactApplication;\nimport com.facebook.react.ReactNativeHost;\nimport com.facebook.react.ReactPackage;\nimport com.facebook.react.shell.MainReactPackage;\nimport com.facebook.soloader.SoLoader;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {\n    @Override\n    public boolean getUseDeveloperSupport() {\n      return BuildConfig.DEBUG;\n    }\n\n    @Override\n    protected List<ReactPackage> getPackages() {\n      return Arrays.<ReactPackage>asList(\n          new MainReactPackage(),\n          new ReactVideoPackage(),\n          new SvgPackage()\n      );\n    }\n\n    @Override\n    protected String getJSMainModuleName() {\n      return \"index\";\n    }\n  };\n\n  @Override\n  public ReactNativeHost getReactNativeHost() {\n    return mReactNativeHost;\n  }\n\n  @Override\n  public void onCreate() {\n    super.onCreate();\n    SoLoader.init(this, /* native exopackage */ false);\n  }\n}\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">RXPHelloWorld</string>\n</resources>\n"
  },
  {
    "path": "samples/hello-world-js/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "samples/hello-world-js/android/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        buildToolsVersion = \"28.0.3\"\n        minSdkVersion = 16\n        compileSdkVersion = 28\n        targetSdkVersion = 28\n        supportLibVersion = \"28.0.0\"\n    }\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:3.4.0\")\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenLocal()\n        google()\n        jcenter()\n        maven {\n            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm\n            url \"$rootDir/../node_modules/react-native/android\"\n        }\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "samples/hello-world-js/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "samples/hello-world-js/android/gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "samples/hello-world-js/android/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      http://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windows variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/hello-world-js/android/keystores/BUCK",
    "content": "keystore(\n    name = \"debug\",\n    properties = \"debug.keystore.properties\",\n    store = \"debug.keystore\",\n    visibility = [\n        \"PUBLIC\",\n    ],\n)\n"
  },
  {
    "path": "samples/hello-world-js/android/keystores/debug.keystore.properties",
    "content": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "samples/hello-world-js/android/settings.gradle",
    "content": "rootProject.name = 'RXPHelloWorld'\n\ninclude ':react-native-video'\nproject(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android-exoplayer')\n\ninclude ':react-native-svg'\nproject(':react-native-svg').projectDir = new File(rootProject.projectDir, \t'../node_modules/react-native-svg/android')\n\ninclude ':app'\n"
  },
  {
    "path": "samples/hello-world-js/babel.config.js",
    "content": "module.exports = function(api) {\n  api.cache.forever();\n\n  const presets = [\n    ['module:metro-react-native-babel-preset'],\n  ];\n\n  const plugins = [\n    ['@babel/proposal-decorators', { legacy: true }],\n  ];\n\n  if (process.env.platform === 'web') {\n    return {\n      presets: ['@babel/env', ...presets],\n      plugins,\n    }\n  }\n\n  return { presets, plugins };\n};\n"
  },
  {
    "path": "samples/hello-world-js/index.js",
    "content": "import './src/index';\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/AppDelegate.h",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <React/RCTBridgeDelegate.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>\n\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/AppDelegate.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"AppDelegate.h\"\n\n#import <React/RCTBridge.h>\n#import <React/RCTBundleURLProvider.h>\n#import <React/RCTRootView.h>\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];\n  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge\n                                                   moduleName:@\"RXApp\"\n                                            initialProperties:nil];\n\n  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];\n\n  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];\n  UIViewController *rootViewController = [UIViewController new];\n  rootViewController.view = rootView;\n  self.window.rootViewController = rootViewController;\n  [self.window makeKeyAndVisible];\n  return YES;\n}\n\n- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge\n{\n#if DEBUG\n  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@\"index\" fallbackResource:nil];\n#else\n  return [[NSBundle mainBundle] URLForResource:@\"main\" withExtension:@\"jsbundle\"];\n#endif\n}\n\n@end\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/Base.lproj/LaunchScreen.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"7702\" systemVersion=\"14D136\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"7701\"/>\n        <capability name=\"Constraints with non-1.0 multipliers\" minToolsVersion=\"5.1\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8ie-xW-0ye\">\n                    <rect key=\"frame\" x=\"20\" y=\"439\" width=\"441\" height=\"21\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RXPHelloWorld\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kId-c2-rCX\">\n                    <rect key=\"frame\" x=\"20\" y=\"140\" width=\"441\" height=\"43\"/>\n                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                    <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"5cJ-9S-tgC\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"kId-c2-rCX\" secondAttribute=\"centerX\" id=\"Koa-jz-hwk\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"bottom\" constant=\"20\" id=\"Kzo-t9-V3l\"/>\n                <constraint firstItem=\"8ie-xW-0ye\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n                <constraint firstAttribute=\"centerX\" secondItem=\"8ie-xW-0ye\" secondAttribute=\"centerX\" id=\"ZEH-qu-HZ9\"/>\n                <constraint firstItem=\"kId-c2-rCX\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"fvb-Df-36g\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"548\" y=\"455\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>RXPHelloWorld</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n    <key>NSAllowsArbitraryLoads</key>\n    <true/>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld/main.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld-tvOS/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSAppTransportSecurity</key>\n\t<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>localhost</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld-tvOSTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };\n\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };\n\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };\n\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };\n\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };\n\t\t00E356F31AD99517003FC87E /* RXPHelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */; };\n\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };\n\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };\n\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };\n\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };\n\t\t232262BF234E4DC00097D10E /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 232262BC234E4DB50097D10E /* libRNSVG.a */; };\n\t\t23243787234E4B300041D225 /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 23243766234E4AD10041D225 /* libRCTVideo.a */; };\n\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };\n\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };\n\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; };\n\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; };\n\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; };\n\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; };\n\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };\n\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };\n\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };\n\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; };\n\t\t2DCD954D1E0B4F2C00145EB5 /* RXPHelloWorldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */; };\n\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; };\n\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };\n\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };\n\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; };\n\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTActionSheet;\n\t\t};\n\t\t00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTGeolocation;\n\t\t};\n\t\t00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5115D1A9E6B3D00147676;\n\t\t\tremoteInfo = RCTImage;\n\t\t};\n\t\t00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B511DB1A9E6C8500147676;\n\t\t\tremoteInfo = RCTNetwork;\n\t\t};\n\t\t00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 832C81801AAF6DEF007FA2F7;\n\t\t\tremoteInfo = RCTVibration;\n\t\t};\n\t\t00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13B07F861A680F5B00A75B9A;\n\t\t\tremoteInfo = RXPHelloWorld;\n\t\t};\n\t\t139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTSettings;\n\t\t};\n\t\t139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3C86DF461ADF2C930047B81A;\n\t\t\tremoteInfo = RCTWebSocket;\n\t\t};\n\t\t146834031AC3E56700842450 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;\n\t\t\tremoteInfo = React;\n\t\t};\n\t\t232262BB234E4DB50097D10E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 0CF68AC11AF0540F00FF9E5C;\n\t\t\tremoteInfo = RNSVG;\n\t\t};\n\t\t232262BD234E4DB50097D10E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 94DDAC5C1F3D024300EED511;\n\t\t\tremoteInfo = \"RNSVG-tvOS\";\n\t\t};\n\t\t23243765234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTVideo;\n\t\t};\n\t\t23243767234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 641E28441F0EEC8500443AF6;\n\t\t\tremoteInfo = \"RCTVideo-tvOS\";\n\t\t};\n\t\t2324377D234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8;\n\t\t\tremoteInfo = jsi;\n\t\t};\n\t\t2324377F234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EDEBC73B214B45A300DD5AC8;\n\t\t\tremoteInfo = jsiexecutor;\n\t\t};\n\t\t23243781234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FB6214C9A0900B7C4FE;\n\t\t\tremoteInfo = \"jsi-tvOS\";\n\t\t};\n\t\t23243783234E4AD10041D225 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ED296FEE214C9CF800B7C4FE;\n\t\t\tremoteInfo = \"jsiexecutor-tvOS\";\n\t\t};\n\t\t2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;\n\t\t\tremoteInfo = \"RXPHelloWorld-tvOS\";\n\t\t};\n\t\t2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = ADD01A681E09402E00F6D226;\n\t\t\tremoteInfo = \"RCTBlob-tvOS\";\n\t\t};\n\t\t2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D001F3B181A0099AA32;\n\t\t\tremoteInfo = fishhook;\n\t\t};\n\t\t2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32;\n\t\t\tremoteInfo = \"fishhook-tvOS\";\n\t\t};\n\t\t2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BDC1FC498900052F4D5;\n\t\t\tremoteInfo = jsinspector;\n\t\t};\n\t\t2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = EBF21BFA1FC4989A0052F4D5;\n\t\t\tremoteInfo = \"jsinspector-tvOS\";\n\t\t};\n\t\t2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7ECE1E25DB7D00323FB7;\n\t\t\tremoteInfo = \"third-party\";\n\t\t};\n\t\t2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D3C1EBD27B6005632C8;\n\t\t\tremoteInfo = \"third-party-tvOS\";\n\t\t};\n\t\t2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 139D7E881E25C6D100323FB7;\n\t\t\tremoteInfo = \"double-conversion\";\n\t\t};\n\t\t2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D383D621EBD27B9005632C8;\n\t\t\tremoteInfo = \"double-conversion-tvOS\";\n\t\t};\n\t\t3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A283A1D9B042B00D4039D;\n\t\t\tremoteInfo = \"RCTImage-tvOS\";\n\t\t};\n\t\t3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28471D9B043800D4039D;\n\t\t\tremoteInfo = \"RCTLinking-tvOS\";\n\t\t};\n\t\t3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28541D9B044C00D4039D;\n\t\t\tremoteInfo = \"RCTNetwork-tvOS\";\n\t\t};\n\t\t3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28611D9B046600D4039D;\n\t\t\tremoteInfo = \"RCTSettings-tvOS\";\n\t\t};\n\t\t3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A287B1D9B048500D4039D;\n\t\t\tremoteInfo = \"RCTText-tvOS\";\n\t\t};\n\t\t3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28881D9B049200D4039D;\n\t\t\tremoteInfo = \"RCTWebSocket-tvOS\";\n\t\t};\n\t\t3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28131D9B038B00D4039D;\n\t\t\tremoteInfo = \"React-tvOS\";\n\t\t};\n\t\t3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C059A1DE3340900C268FA;\n\t\t\tremoteInfo = yoga;\n\t\t};\n\t\t3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3C06751DE3340C00C268FA;\n\t\t\tremoteInfo = \"yoga-tvOS\";\n\t\t};\n\t\t3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4;\n\t\t\tremoteInfo = cxxreact;\n\t\t};\n\t\t3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4;\n\t\t\tremoteInfo = \"cxxreact-tvOS\";\n\t\t};\n\t\t5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTAnimation;\n\t\t};\n\t\t5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 2D2A28201D9B03D100D4039D;\n\t\t\tremoteInfo = \"RCTAnimation-tvOS\";\n\t\t};\n\t\t78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 134814201AA4EA6300B7C361;\n\t\t\tremoteInfo = RCTLinking;\n\t\t};\n\t\t832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 58B5119B1A9E6C1200147676;\n\t\t\tremoteInfo = RCTText;\n\t\t};\n\t\tADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 358F4ED71D1E81A9004DF814;\n\t\t\tremoteInfo = RCTBlob;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = \"<group>\"; };\n\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTActionSheet.xcodeproj; path = \"../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTGeolocation.xcodeproj; path = \"../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTImage.xcodeproj; path = \"../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTNetwork.xcodeproj; path = \"../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVibration.xcodeproj; path = \"../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RXPHelloWorldTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RXPHelloWorldTests.m; sourceTree = \"<group>\"; };\n\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTSettings.xcodeproj; path = \"../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTWebSocket.xcodeproj; path = \"../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RXPHelloWorld.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RXPHelloWorld/AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RXPHelloWorld/AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = \"<group>\"; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RXPHelloWorld/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RXPHelloWorld/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RXPHelloWorld/main.m; sourceTree = \"<group>\"; };\n\t\t146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = React.xcodeproj; path = \"../node_modules/react-native/React/React.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t232262B6234E4DB40097D10E /* RNSVG.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RNSVG.xcodeproj; path = \"../node_modules/react-native-svg/ios/RNSVG.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTVideo.xcodeproj; path = \"../node_modules/react-native-video/ios/RCTVideo.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"RXPHelloWorld-tvOS.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"RXPHelloWorld-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTAnimation.xcodeproj; path = \"../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTLinking.xcodeproj; path = \"../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTText.xcodeproj; path = \"../node_modules/react-native/Libraries/Text/RCTText.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = RCTBlob.xcodeproj; path = \"../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj\"; sourceTree = \"<group>\"; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t00E356EB1AD99517003FC87E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t232262BF234E4DC00097D10E /* libRNSVG.a in Frameworks */,\n\t\t\t\t23243787234E4B300041D225 /* libRCTVideo.a in Frameworks */,\n\t\t\t\tADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */,\n\t\t\t\t11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t146834051AC3E58100842450 /* libReact.a in Frameworks */,\n\t\t\t\t00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,\n\t\t\t\t00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,\n\t\t\t\t00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,\n\t\t\t\t133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,\n\t\t\t\t00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,\n\t\t\t\t139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,\n\t\t\t\t832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,\n\t\t\t\t00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,\n\t\t\t\t139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */,\n\t\t\t\t2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */,\n\t\t\t\t2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,\n\t\t\t\t2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t00C302A81ABCB8CE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302B61ABCB90400DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302BC1ABCB91800DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,\n\t\t\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302D41ABCB9D200DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,\n\t\t\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00C302E01ABCB9EE00DB3ED1 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356EF1AD99517003FC87E /* RXPHelloWorldTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F21AD99517003FC87E /* RXPHelloWorldTests.m */,\n\t\t\t\t00E356F01AD99517003FC87E /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = RXPHelloWorldTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00E356F01AD99517003FC87E /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t00E356F11AD99517003FC87E /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139105B71AF99BAD00B5F7CC /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,\n\t\t\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t139FDEE71B06529A00C62182 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,\n\t\t\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */,\n\t\t\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */,\n\t\t\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t13B07FAE1A68108700A75B9A /* RXPHelloWorld */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t008F07F21AC5B25A0029DE68 /* main.jsbundle */,\n\t\t\t\t13B07FAF1A68108700A75B9A /* AppDelegate.h */,\n\t\t\t\t13B07FB01A68108700A75B9A /* AppDelegate.m */,\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */,\n\t\t\t\t13B07FB71A68108700A75B9A /* main.m */,\n\t\t\t);\n\t\t\tname = RXPHelloWorld;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t146834001AC3E56700842450 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t146834041AC3E56700842450 /* libReact.a */,\n\t\t\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */,\n\t\t\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */,\n\t\t\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */,\n\t\t\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */,\n\t\t\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */,\n\t\t\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */,\n\t\t\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */,\n\t\t\t\t2324377E234E4AD10041D225 /* libjsi.a */,\n\t\t\t\t23243780234E4AD10041D225 /* libjsiexecutor.a */,\n\t\t\t\t23243782234E4AD10041D225 /* libjsi-tvOS.a */,\n\t\t\t\t23243784234E4AD10041D225 /* libjsiexecutor-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t232262B7234E4DB40097D10E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t232262BC234E4DB50097D10E /* libRNSVG.a */,\n\t\t\t\t232262BE234E4DB50097D10E /* libRNSVG-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t23243750234E4AD00041D225 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t23243766234E4AD10041D225 /* libRCTVideo.a */,\n\t\t\t\t23243768234E4AD10041D225 /* libRCTVideo.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tED2971642150620600B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\t2D16E6891FA4F8E400B85C8A /* libReact.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E91572E1DD0AC6500FF2AA8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t78C398B11ACF4ADC00677621 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */,\n\t\t\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t232262B6234E4DB40097D10E /* RNSVG.xcodeproj */,\n\t\t\t\t2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */,\n\t\t\t\t5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */,\n\t\t\t\t146833FF1AC3E56700842450 /* React.xcodeproj */,\n\t\t\t\t00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,\n\t\t\t\tADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */,\n\t\t\t\t00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,\n\t\t\t\t00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,\n\t\t\t\t78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,\n\t\t\t\t00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,\n\t\t\t\t139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,\n\t\t\t\t832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,\n\t\t\t\t00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,\n\t\t\t\t139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341B11AAA6A8300B99B32 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */,\n\t\t\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* RXPHelloWorld */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t00E356EF1AD99517003FC87E /* RXPHelloWorldTests */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */,\n\t\t\t\t00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */,\n\t\t\t\t2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */,\n\t\t\t\t2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tADBDB9201DFEBF0600ED6528 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */,\n\t\t\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t00E356ED1AD99517003FC87E /* RXPHelloWorldTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPHelloWorldTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t00E356EA1AD99517003FC87E /* Sources */,\n\t\t\t\t00E356EB1AD99517003FC87E /* Frameworks */,\n\t\t\t\t00E356EC1AD99517003FC87E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RXPHelloWorldTests;\n\t\t\tproductName = RXPHelloWorldTests;\n\t\t\tproductReference = 00E356EE1AD99517003FC87E /* RXPHelloWorldTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t13B07F861A680F5B00A75B9A /* RXPHelloWorld */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPHelloWorld\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RXPHelloWorld;\n\t\t\tproductName = \"Hello World\";\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* RXPHelloWorld.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E4771E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E4781E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E4791E0B4A5D006451C7 /* Resources */,\n\t\t\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"RXPHelloWorld-tvOS\";\n\t\t\tproductName = \"RXPHelloWorld-tvOS\";\n\t\t\tproductReference = 2D02E47B1E0B4A5D006451C7 /* RXPHelloWorld-tvOS.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t2D02E48F1E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2D02E48C1E0B4A5D006451C7 /* Sources */,\n\t\t\t\t2D02E48D1E0B4A5D006451C7 /* Frameworks */,\n\t\t\t\t2D02E48E1E0B4A5D006451C7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"RXPHelloWorld-tvOSTests\";\n\t\t\tproductName = \"RXPHelloWorld-tvOSTests\";\n\t\t\tproductReference = 2D02E4901E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tORGANIZATIONNAME = Facebook;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t00E356ED1AD99517003FC87E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.2;\n\t\t\t\t\t\tTestTargetID = 13B07F861A680F5B00A75B9A;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E47A1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t2D02E48F1E0B4A5D006451C7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 2D02E47A1E0B4A5D006451C7;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPHelloWorld\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */;\n\t\t\t\t\tProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */;\n\t\t\t\t\tProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 78C398B11ACF4ADC00677621 /* Products */;\n\t\t\t\t\tProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;\n\t\t\t\t\tProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 832341B11AAA6A8300B99B32 /* Products */;\n\t\t\t\t\tProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;\n\t\t\t\t\tProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 23243750234E4AD00041D225 /* Products */;\n\t\t\t\t\tProjectRef = 2324374F234E4AD00041D225 /* RCTVideo.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 139FDEE71B06529A00C62182 /* Products */;\n\t\t\t\t\tProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 146834001AC3E56700842450 /* Products */;\n\t\t\t\t\tProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 232262B7234E4DB40097D10E /* Products */;\n\t\t\t\t\tProjectRef = 232262B6234E4DB40097D10E /* RNSVG.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* RXPHelloWorld */,\n\t\t\t\t00E356ED1AD99517003FC87E /* RXPHelloWorldTests */,\n\t\t\t\t2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */,\n\t\t\t\t2D02E48F1E0B4A5D006451C7 /* RXPHelloWorld-tvOSTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTActionSheet.a;\n\t\t\tremoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTGeolocation.a;\n\t\t\tremoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTImage.a;\n\t\t\tremoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTNetwork.a;\n\t\t\tremoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVibration.a;\n\t\t\tremoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTSettings.a;\n\t\t\tremoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTWebSocket.a;\n\t\t\tremoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t146834041AC3E56700842450 /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t232262BC234E4DB50097D10E /* libRNSVG.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRNSVG.a;\n\t\t\tremoteRef = 232262BB234E4DB50097D10E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t232262BE234E4DB50097D10E /* libRNSVG-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRNSVG-tvOS.a\";\n\t\t\tremoteRef = 232262BD234E4DB50097D10E /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243766234E4AD10041D225 /* libRCTVideo.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVideo.a;\n\t\t\tremoteRef = 23243765234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243768234E4AD10041D225 /* libRCTVideo.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTVideo.a;\n\t\t\tremoteRef = 23243767234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2324377E234E4AD10041D225 /* libjsi.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsi.a;\n\t\t\tremoteRef = 2324377D234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243780234E4AD10041D225 /* libjsiexecutor.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsiexecutor.a;\n\t\t\tremoteRef = 2324377F234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243782234E4AD10041D225 /* libjsi-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsi-tvOS.a\";\n\t\t\tremoteRef = 23243781234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t23243784234E4AD10041D225 /* libjsiexecutor-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsiexecutor-tvOS.a\";\n\t\t\tremoteRef = 23243783234E4AD10041D225 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTBlob-tvOS.a\";\n\t\t\tremoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libfishhook.a;\n\t\t\tremoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libfishhook-tvOS.a\";\n\t\t\tremoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libjsinspector.a;\n\t\t\tremoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libjsinspector-tvOS.a\";\n\t\t\tremoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE32056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE52056DD460020B375 /* libthird-party.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libthird-party.a\";\n\t\t\tremoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libdouble-conversion.a\";\n\t\t\tremoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTImage-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTLinking-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTNetwork-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTSettings-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTText-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = \"libRCTWebSocket-tvOS.a\";\n\t\t\tremoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA31DF850E9000B6D8A /* libReact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libReact.a;\n\t\t\tremoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libyoga.a;\n\t\t\tremoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libcxxreact.a;\n\t\t\tremoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTAnimation.a;\n\t\t\tremoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTLinking.a;\n\t\t\tremoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t832341B51AAA6A8300B99B32 /* libRCTText.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTText.a;\n\t\t\tremoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libRCTBlob.a;\n\t\t\tremoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t00E356EC1AD99517003FC87E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4791E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48E1E0B4A5D006451C7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n\t\t2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Bundle React Native Code And Images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"export NODE_BINARY=node\\n../node_modules/react-native/scripts/react-native-xcode.sh\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t00E356EA1AD99517003FC87E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t00E356F31AD99517003FC87E /* RXPHelloWorldTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,\n\t\t\t\t13B07FC11A68108700A75B9A /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E4771E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,\n\t\t\t\t2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2D02E48C1E0B4A5D006451C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2DCD954D1E0B4F2C00145EB5 /* RXPHelloWorldTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t00E356F51AD99517003FC87E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13B07F861A680F5B00A75B9A /* RXPHelloWorld */;\n\t\t\ttargetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;\n\t\t};\n\t\t2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 2D02E47A1E0B4A5D006451C7 /* RXPHelloWorld-tvOS */;\n\t\t\ttargetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB21A68108700A75B9A /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.xib;\n\t\t\tpath = RXPHelloWorld;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t00E356F61AD99517003FC87E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorldTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld.app/RXPHelloWorld\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t00E356F71AD99517003FC87E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorldTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld.app/RXPHelloWorld\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = NO;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorld/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = RXPHelloWorld;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tINFOPLIST_FILE = RXPHelloWorld/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.create.RX.app.RXPHelloWorld;\n\t\t\t\tPRODUCT_NAME = RXPHelloWorld;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4971E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E4981E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOS/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2D02E4991E0B4A5E006451C7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld-tvOS.app/RXPHelloWorld-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2D02E49A1E0B4A5E006451C7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"RXPHelloWorld-tvOSTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.create.RX.app.RXPHelloWorld-tvOSTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RXPHelloWorld-tvOS.app/RXPHelloWorld-tvOS\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget \"RXPHelloWorldTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t00E356F61AD99517003FC87E /* Debug */,\n\t\t\t\t00E356F71AD99517003FC87E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"RXPHelloWorld\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4971E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E4981E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget \"RXPHelloWorld-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2D02E4991E0B4A5E006451C7 /* Debug */,\n\t\t\t\t2D02E49A1E0B4A5E006451C7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"RXPHelloWorld\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld.xcodeproj/xcshareddata/xcschemes/RXPHelloWorld-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D2A28121D9B038B00D4039D\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React-tvOS\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOS.app\"\n               BlueprintName = \"RXPHelloWorld-tvOS\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOSTests.xctest\"\n               BlueprintName = \"RXPHelloWorld-tvOSTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D02E48F1E0B4A5D006451C7\"\n               BuildableName = \"RXPHelloWorld-tvOSTests.xctest\"\n               BlueprintName = \"RXPHelloWorld-tvOSTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D02E47A1E0B4A5D006451C7\"\n            BuildableName = \"RXPHelloWorld-tvOS.app\"\n            BlueprintName = \"RXPHelloWorld-tvOS\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorld.xcodeproj/xcshareddata/xcschemes/RXPHelloWorld.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0940\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"NO\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"83CBBA2D1A601D0E00E9B192\"\n               BuildableName = \"libReact.a\"\n               BlueprintName = \"React\"\n               ReferencedContainer = \"container:../node_modules/react-native/React/React.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"RXPHelloWorld.app\"\n               BlueprintName = \"RXPHelloWorld\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPHelloWorldTests.xctest\"\n               BlueprintName = \"RXPHelloWorldTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"RXPHelloWorldTests.xctest\"\n               BlueprintName = \"RXPHelloWorldTests\"\n               ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"RXPHelloWorld.app\"\n            BlueprintName = \"RXPHelloWorld\"\n            ReferencedContainer = \"container:RXPHelloWorld.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorldTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "samples/hello-world-js/ios/RXPHelloWorldTests/RXPHelloWorldTests.m",
    "content": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n#import <XCTest/XCTest.h>\n\n#import <React/RCTLog.h>\n#import <React/RCTRootView.h>\n\n#define TIMEOUT_SECONDS 600\n#define TEXT_TO_LOOK_FOR @\"Welcome to React Native!\"\n\n@interface RXPHelloWorldTests : XCTestCase\n\n@end\n\n@implementation RXPHelloWorldTests\n\n- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test\n{\n  if (test(view)) {\n    return YES;\n  }\n  for (UIView *subview in [view subviews]) {\n    if ([self findSubviewInView:subview matching:test]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n- (void)testRendersWelcomeScreen\n{\n  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];\n  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];\n  BOOL foundElement = NO;\n\n  __block NSString *redboxError = nil;\n  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {\n    if (level >= RCTLogLevelError) {\n      redboxError = message;\n    }\n  });\n\n  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {\n    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];\n\n    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {\n      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {\n        return YES;\n      }\n      return NO;\n    }];\n  }\n\n  RCTSetLogFunction(RCTDefaultLogFunction);\n\n  XCTAssertNil(redboxError, @\"RedBox error: %@\", redboxError);\n  XCTAssertTrue(foundElement, @\"Couldn't find element with text '%@' in %d seconds\", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);\n}\n\n\n@end\n"
  },
  {
    "path": "samples/hello-world-js/jest/enzyme.config.js",
    "content": "import Enzyme from 'enzyme';\nimport Adapter from 'enzyme-adapter-react-16';\n\nEnzyme.configure({ adapter: new Adapter() });\n"
  },
  {
    "path": "samples/hello-world-js/jest/jest.config.js",
    "content": "module.exports = {\n  rootDir: '../',\n  roots: ['<rootDir>/src'],\n\n  moduleFileExtensions: [\n    'ts', 'tsx', 'js', 'json', 'node',\n  ],\n\n  moduleDirectories: ['node_modules'],\n\n  snapshotSerializers: [\n    'enzyme-to-json/serializer',\n  ],\n\n  setupFiles: [\n    '<rootDir>/jest/enzyme.config.js',\n  ],\n\n  testRegex: '(/__tests__/.*|(\\\\.|/)(test|spec))\\\\.((t|j)sx?)$',\n};\n"
  },
  {
    "path": "samples/hello-world-js/metro.config.js",
    "content": "module.exports = {\n  transformer: {\n    getTransformOptions: async () => ({\n      transform: { experimentalImportSupport: false, inlineRequires: false },\n    }),\n  },\n};\n"
  },
  {
    "path": "samples/hello-world-js/package.json",
    "content": "{\n  \"name\": \"rxphelloworld\",\n  \"private\": true,\n  \"main\": \"index.js\",\n  \"version\": \"2.0.0\",\n  \"scripts\": {\n    \"rn-cli\": \"node scripts/react-native.js\",\n    \"start:android\": \"npm run rn-cli run-android\",\n    \"start:windows\": \"npm run rn-cli run-windows\",\n    \"start:ios\": \"npm run rn-cli run-ios\",\n    \"start:web\": \"cross-env platform=web webpack-dev-server --config=web/webpack/dev.js --progress --colors --mode=development\",\n    \"start:rn-dev-server\": \"npm run rn-cli start --reset-cache\",\n    \"build:web\": \"cross-env platform=web webpack --config=web/webpack/prod.js --progress --colors --mode=production\",\n    \"test\": \"jest -c jest/jest.config.js\",\n    \"test:watch\": \"npm run test --watch\",\n    \"test:debug\": \"node --inspect-brk node_modules/.bin/jest -c jest/jest.config.js --runInBand\",\n    \"lint\": \"eslint --config .eslintrc --ext .js src\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"7.7.4\",\n    \"@babel/plugin-proposal-decorators\": \"7.7.4\",\n    \"@babel/preset-env\": \"7.7.4\",\n    \"@react-native-community/cli\": \"9.1.3\",\n    \"babel-eslint\": \"10.0.3\",\n    \"babel-loader\": \"8.3.0\",\n    \"compression-webpack-plugin\": \"3.0.0\",\n    \"cross-env\": \"6.0.3\",\n    \"enzyme\": \"3.10.0\",\n    \"enzyme-adapter-react-16\": \"1.15.1\",\n    \"enzyme-to-json\": \"3.4.3\",\n    \"eslint\": \"6.7.1\",\n    \"eslint-loader\": \"4.0.2\",\n    \"eslint-plugin-jest\": \"23.1.0\",\n    \"eslint-plugin-react\": \"7.17.0\",\n    \"html-webpack-plugin\": \"5.5.0\",\n    \"jest\": \"29.1.2\",\n    \"metro-react-native-babel-preset\": \"0.57.0\",\n    \"rnpm-plugin-windows\": \"0.3.8\",\n    \"webpack\": \"5.75.0\",\n    \"webpack-cli\": \"5.0.1\",\n    \"webpack-dev-server\": \"3.11.3\",\n    \"webpack-merge\": \"4.2.2\"\n  },\n  \"dependencies\": {\n    \"react\": \"16.12.0\",\n    \"react-dom\": \"16.12.0\",\n    \"react-native\": \"0.70.2\",\n    \"react-native-windows\": \"1.0.0\",\n    \"reactxp\": \"^2.0.0\",\n    \"reactxp-imagesvg\": \"^2.0.0\",\n    \"reactxp-navigation\": \"^2.0.0\",\n    \"reactxp-video\": \"^2.0.0\"\n  }\n}\n"
  },
  {
    "path": "samples/hello-world-js/scripts/react-native.js",
    "content": "require('@react-native-community/cli').run();"
  },
  {
    "path": "samples/hello-world-js/src/App.js",
    "content": "import * as RX from 'reactxp';\nimport React from 'react';\n\nimport { DEBUG, DEV\t} from './config';\nimport { RootView } from './views/RootView';\n\nclass App {\n    init() {\n        RX.App.initialize(DEBUG, DEV);\n        RX.UserInterface.setMainView(this._renderRootView());\n    }\n\n    _renderRootView() {\n        return (\n            <RootView />\n        );\n    }\n}\n\nexport default new App();"
  },
  {
    "path": "samples/hello-world-js/src/config.js",
    "content": "export const DEBUG = __DEV__;\nexport const DEV = __DEV__;\n"
  },
  {
    "path": "samples/hello-world-js/src/controls/ProgressIndicator.js",
    "content": "/**\n * ProgressIndicator.js\n * Copyright: Microsoft 2017\n *\n * Circular progress indicator that shows off the use of ImageSVG\n * ReactXP extension.\n */\n\nimport * as RX from 'reactxp';\nimport React from 'react';\nimport RXImageSvg, { SvgPath as RXSvgPath } from 'reactxp-imagesvg';\n\nexport class ProgressIndicator extends RX.Component {\n    render() {\n        const size = this.props.size;\n        const path = this._buildPath();\n\n        return (\n            <RXImageSvg\n                viewBox={ '0 0 ' + size + ' ' + size }\n                height={ size }\n                width={ size }\n                style={ this.props.style }\n            >\n                <RXSvgPath fillColor={ this.props.fillColor } d={ path } />\n            </RXImageSvg>\n        );\n    }\n\n    _buildPath(){\n        const { progress, size } = this.props;\n        const radius = size / 2;\n        const deg = progress  * 360;\n        const radians = Math.PI * (deg - 90) / 180;\n        const endX = radius + radius * Math.cos(radians);\n        const endY = radius + radius * Math.sin(radians);\n\n        return `M${ radius }, ${ radius }, L${ radius }, 0 A${ radius }, ${ radius } 0 ${ (deg > 180 ? 1 : 0) }, 1 ${ endX }, ${ endY }z`;\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/src/controls/ToggleSwitch.js",
    "content": "/**\n * ToggleSwitch.js\n * Copyright: Microsoft 2017\n *\n * A simple toggle control built in ReactXP that allows users to\n * pick between two values.\n */\n\nimport * as RX from 'reactxp';\nimport React from 'react';\n\nconst ANIMATION_DURATION = 250; // In milliseconds\nconst KNOB_LEFT_OFF = 2; // In pixels\nconst KNOB_LEFT_ON = 22; // In pixels\n\nconst _styles = {\n    container: RX.Styles.createButtonStyle({\n        flexDirection: 'row',\n        alignItems: 'center'\n    }),\n    toggleSwitch: RX.Styles.createViewStyle({\n        flexDirection: 'row',\n        borderRadius: 15,\n        marginVertical: 8,\n        height: 30,\n        width: 50,\n        backgroundColor: '#ddd'\n    }),\n    toggleSwitchBackground: RX.Styles.createViewStyle({\n        position: 'absolute',\n        top: 0,\n        bottom: 0,\n        left: 0,\n        right: 0,\n        borderRadius: 15\n    }),\n    toggleKnob: RX.Styles.createViewStyle({\n        top: 2,\n        height: 26,\n        width: 26,\n        borderRadius: 13,\n        backgroundColor: 'white'\n    })\n};\n\nexport class ToggleSwitch extends RX.Component {\n    _knobLeftAnimationValue;\n    _knobLeftAnimationStyle;\n\n    _toggleColorAnimationValue;\n    _toggleColorAnimationStyle;\n\n    constructor(props){\n        super(props);\n\n        // This value controls the left offset of the knob, which we will\n        // animate when the user toggles the control.\n        this._knobLeftAnimationValue = RX.Animated.createValue(props.value ? KNOB_LEFT_ON : KNOB_LEFT_OFF);\n        this._knobLeftAnimationStyle = RX.Styles.createAnimatedViewStyle({\n            left: this._knobLeftAnimationValue\n        });\n\n        // This value controls the background color of the control. Here we make\n        // use of the interpolate method to smoothly transition between two colors.\n        this._toggleColorAnimationValue = RX.Animated.createValue(this.props.value ? 1 : 0);\n        this._toggleColorAnimationStyle = RX.Styles.createAnimatedTextInputStyle({\n            backgroundColor: RX.Animated.interpolate(this._toggleColorAnimationValue, [0, 1], ['#66f', '#ddd'])\n        });\n    }\n\n    componentDidUpdate(prevProps) {\n        // If the value of the toggle changes, animate the toggle sliding\n        // from one side to the other. In parallel, animate the opacity change.\n        if (prevProps.value !== this.props.value) {\n            RX.Animated.parallel([\n                RX.Animated.timing(this._knobLeftAnimationValue, {\n                    duration: ANIMATION_DURATION,\n                    toValue: this.props.value ? KNOB_LEFT_ON : KNOB_LEFT_OFF,\n                    easing: RX.Animated.Easing.InOut()\n                }),\n\n                RX.Animated.timing(this._toggleColorAnimationValue, {\n                    duration: ANIMATION_DURATION,\n                    toValue: this.props.value ? 1 : 0,\n                    easing: RX.Animated.Easing.InOut()\n                })\n            ]) .start();\n        }\n    }\n\n    render() {\n        const backgroundStyle = [_styles.toggleSwitchBackground, this._toggleColorAnimationStyle];\n        const knobStyles = [_styles.toggleKnob, this._knobLeftAnimationStyle];\n\n        return (\n            <RX.Button style={ _styles.container } onPress={ this._handleClick }>\n                <RX.View style={ _styles.toggleSwitch }>\n                    <RX.Animated.View style={ backgroundStyle }/>\n                    <RX.Animated.View style={ knobStyles }/>\n                </RX.View>\n            </RX.Button>\n        );\n    }\n\n    _handleClick = (e) => {\n        e.stopPropagation();\n\n        if (this.props.onChange) {\n            this.props.onChange(!this.props.value);\n        }\n    }\n}"
  },
  {
    "path": "samples/hello-world-js/src/index.js",
    "content": "import App from './App';\n\nApp.init();\n"
  },
  {
    "path": "samples/hello-world-js/src/views/MainPanel.js",
    "content": "import * as RX from 'reactxp';\nimport React from 'react';\n\nconst styles = {\n    scroll: RX.Styles.createScrollViewStyle({\n        alignSelf: 'stretch',\n        backgroundColor: '#f5fcff'\n    }),\n    container: RX.Styles.createViewStyle({\n        padding: 16,\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    helloWorld: RX.Styles.createTextStyle({\n        fontSize: 48,\n        fontWeight: 'bold',\n        marginBottom: 28\n    }),\n    welcome: RX.Styles.createTextStyle({\n        fontSize: 32,\n        marginBottom: 12\n    }),\n    instructions: RX.Styles.createTextStyle({\n        fontSize: 16,\n        color: '#aaa',\n        marginBottom: 16\n    }),\n    docLink: RX.Styles.createLinkStyle({\n        fontSize: 16,\n        color: 'blue',\n        marginBottom: 16\n    }),\n    roundButton: RX.Styles.createViewStyle({\n        margin: 16,\n        borderRadius: 16,\n        backgroundColor: '#7d88a9'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        marginVertical: 6,\n        marginHorizontal: 12,\n        color: 'white'\n    })\n};\n\nexport class MainPanel extends RX.Component{\n    constructor(props) {\n        super(props);\n        this._translationValue = RX.Animated.createValue(-100);\n        this._animatedStyle = RX.Styles.createAnimatedTextStyle({\n            transform: [{ translateY: this._translationValue }]\n        });\n    }\n\n    componentDidMount() {\n        RX.Animated.timing(this._translationValue, {\n            duration: 500,\n            toValue: 0,\n            easing: RX.Animated.Easing.OutBack()\n        }).start();\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true }>\n                <RX.ScrollView style={ styles.scroll }>\n                    <RX.View style={ styles.container }>\n                        <RX.Animated.Text style={ [styles.helloWorld, this._animatedStyle] }>\n                            Hello World\n                        </RX.Animated.Text>\n                        <RX.Text style={ styles.welcome }>\n                            Welcome to ReactXP\n                        </RX.Text>\n                        <RX.Text style={ styles.instructions }>\n                            Edit App.js to get started\n                        </RX.Text>\n                        <RX.Link style={ styles.docLink } url={ 'https://microsoft.github.io/reactxp/docs' }>\n                            View ReactXP documentation\n                        </RX.Link>\n\n                        <RX.Button style={ styles.roundButton } onPress={ this.props.onPressNavigate }>\n                            <RX.Text style={ styles.buttonText }>\n                                See More Examples\n                            </RX.Text>\n                        </RX.Button>\n                    </RX.View>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/src/views/RootView.js",
    "content": "import * as RX from 'reactxp';\nimport React from 'react';\nimport { Navigator } from 'reactxp-navigation';\n\nimport { MainPanel } from './MainPanel';\nimport { SecondPanel } from './SecondPanel';\n\nconst NavigationRouteId = {\n    MainPanel: 'MainPanel',\n    SecondPanel: 'SecondPanel'\n};\n\nconst styles = {\n    // Standard navigator style should be an object. So we have to disable caching here.\n    navCardStyle: RX.Styles.createViewStyle({\n        backgroundColor: '#f5fcff'\n    }, false)\n};\n\nexport class RootView extends RX.Component {\n    _navigator;\n\n    componentDidMount() {\n        this._navigator.immediatelyResetRouteStack([{\n            routeId: NavigationRouteId.MainPanel,\n            sceneConfigType: 'Fade'\n        }]);\n    }\n\n    render() {\n        return (\n            <Navigator\n                cardStyle={ styles.navCardStyle }\n                renderScene={ this._renderScene }\n                ref={ this._onNavigatorRef }\n            />\n        );\n    }\n\n    _onNavigatorRef = (navigator) => {\n        this._navigator = navigator;\n    }\n\n    _renderScene = (navigatorRoute) => {\n        switch (navigatorRoute.routeId) {\n        case NavigationRouteId.MainPanel:\n            return (\n                <MainPanel onPressNavigate={ this._onPressNavigate }/>\n            );\n\n        case NavigationRouteId.SecondPanel:\n            return (\n                <SecondPanel onNavigateBack={ this._onPressBack }/>\n            );\n        }\n\n        return null;\n    }\n\n    _onPressNavigate = () => {\n        this._navigator.push({\n            routeId: NavigationRouteId.SecondPanel,\n            sceneConfigType: 'FloatFromRight'\n        });\n    }\n\n    _onPressBack = () => {\n        this._navigator.pop();\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/src/views/SecondPanel.js",
    "content": "import * as RX from 'reactxp';\nimport React from 'react';\nimport RXVideo from 'reactxp-video';\n\nimport { ProgressIndicator } from '../controls/ProgressIndicator';\nimport { ToggleSwitch } from '../controls/ToggleSwitch';\n\nconst styles = {\n    scroll: RX.Styles.createScrollViewStyle({\n        alignSelf: 'stretch',\n        backgroundColor: '#f5fcff'\n    }),\n    container: RX.Styles.createViewStyle({\n        padding: 16,\n        justifyContent: 'center',\n        alignItems: 'center'\n    }),\n    titleText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        textAlign: 'center',\n        marginTop: 12,\n        color: 'black'\n    }),\n    videoTitleText: RX.Styles.createTextStyle({\n        marginBottom: 8\n    }),\n    progressMargin: RX.Styles.createViewStyle({\n        margin: 8\n    }),\n    video: RX.Styles.createViewStyle({\n        height: 176,\n        width: 320\n    }),\n    roundButton: RX.Styles.createViewStyle({\n        margin: 16,\n        borderRadius: 16,\n        backgroundColor: '#7d88a9'\n    }),\n    buttonText: RX.Styles.createTextStyle({\n        fontSize: 16,\n        marginVertical: 6,\n        marginHorizontal: 12,\n        color: 'white'\n    })\n};\n\nexport class SecondPanel extends RX.Component {\n    _progressTimerToken;\n\n    constructor(props) {\n        super(props);\n        this.state = {\n            toggleValue: true,\n            progressValue: 0\n        };\n    }\n\n    componentDidMount() {\n        this._startProgressIndicator();\n    }\n\n    componentWillUnmount() {\n        this._stopProgressIndicator();\n    }\n\n    render() {\n        return (\n            <RX.View useSafeInsets={ true }>\n                <RX.ScrollView style={ styles.scroll }>\n                    <RX.View style={ styles.container }>\n                        <RX.Button style={ styles.roundButton } onPress={ this.props.onNavigateBack }>\n                            <RX.Text style={ styles.buttonText }>\n                                Go Back\n                            </RX.Text>\n                        </RX.Button>\n\n                        <RX.Text style={ styles.titleText }>\n                            Here is a simple control built using ReactXP\n                        </RX.Text>\n                        <ToggleSwitch\n                            value={ this.state.toggleValue }\n                            onChange={ this._onChangeToggle }\n                        />\n\n                        <RX.Text style={ styles.titleText }>\n                            Here is an SVG image using the ImageSvg extension\n                        </RX.Text>\n                        <ProgressIndicator\n                            style={ styles.progressMargin }\n                            progress={ this.state.progressValue }\n                            fillColor={ '#ddd' }\n                            size={ 32 }\n                        />\n\n                        <RX.Text style={ [styles.titleText, styles.videoTitleText] }>\n                            Here is a video using the Video extension\n                        </RX.Text>\n                        <RXVideo\n                            ref={ this._onMountVideo }\n                            style={ styles.video }\n                            source={ 'https://www.w3schools.com/html/mov_bbb.mp4' }\n                            loop={ true }\n                            onCanPlay={ this._playVideo }\n                        />\n                    </RX.View>\n                </RX.ScrollView>\n            </RX.View>\n        );\n    }\n\n    _playVideo = () => {\n        if (this._mountedVideo) {\n            this._mountedVideo.mute(true);\n            this._mountedVideo.play();\n        }\n    }\n\n    _onMountVideo = (component) => {\n        this._mountedVideo = component;\n    }\n\n    _startProgressIndicator() {\n        this._progressTimerToken = window.setInterval(() =>{\n            const newProgressValue = (this.state.progressValue + 0.02) % 1;\n            this.setState({ progressValue: newProgressValue });\n        }, 1000 / 15);\n    }\n\n    _stopProgressIndicator() {\n        if (this._progressTimerToken) {\n            window.clearInterval(this._progressTimerToken);\n            this._progressTimerToken = undefined;\n        }\n    }\n\n    // Note that we define this as a variable rather than a normal method. Using this\n    // method, we prebind the method to this component instance. This prebinding ensures\n    // that each time we pass the variable as a prop in the render function, it will\n    // not change. We want to avoid unnecessary prop changes because this will trigger\n    // extra work within React's virtual DOM diffing mechanism.\n    _onChangeToggle = (toggleValue) => {\n        this.setState({ toggleValue });\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/web/index.hmr.js",
    "content": "import '../index';\nmodule.hot.accept();\n"
  },
  {
    "path": "samples/hello-world-js/web/template.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>RXPHelloWorld</title>\n  <style>\n    html,\n    body,\n    .app-container {\n      font-family: proxima-nova, \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif;\n      padding: 0;\n      margin: 0;\n      border: none;\n      height: 100%;\n      width: 100%;\n    }\n    *:focus {\n        outline: 0;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"app-container\"></div>\n</body>\n</html>"
  },
  {
    "path": "samples/hello-world-js/web/webpack/common.js",
    "content": "const HtmlWebpackPlugin = require('html-webpack-plugin');\nconst webpack = require('webpack');\nconst path = require('path');\n\nconst ROOT_PATH = path.join(__dirname, '..', '..');\nconst DIST_PATH = path.join(ROOT_PATH, 'dist-web');\nconst APP_PATH = path.join(ROOT_PATH, 'src');\nconst WEB_PATH = path.join(ROOT_PATH, 'web');\n\nconst buildConfig = (env, argv) => ({\n  entry: ROOT_PATH,\n\n  module: {\n    rules: [\n      { test: /\\.jsx?$/, loader: 'eslint-loader', include: APP_PATH, enforce: 'pre' },\n      { test: /\\.jsx?$/, loader: 'babel-loader', include: APP_PATH },\n    ]\n  },\n\n  plugins: [\n    new webpack.DefinePlugin({ __DEV__: argv.mode === 'development' }),\n    new HtmlWebpackPlugin({ inject: true, template: path.join(WEB_PATH, 'template.html') }),\n  ],\n});\n\nmodule.exports = {\n  buildConfig,\n  APP_PATH,\n  DIST_PATH,\n  WEB_PATH,\n};\n"
  },
  {
    "path": "samples/hello-world-js/web/webpack/dev.js",
    "content": "const webpack = require('webpack');\nconst merge = require('webpack-merge');\nconst path = require('path');\nconst { buildConfig, APP_PATH, WEB_PATH } = require('./common');\n\nmodule.exports = (env, argv) => (\n  merge(buildConfig(env, argv), {\n    entry: path.join(WEB_PATH, 'index.hmr.js'),\n    devtool: 'inline-source-map',\n\n    plugins: [\n      new webpack.HotModuleReplacementPlugin(),\n    ],\n\n    devServer: {\n      contentBase: APP_PATH,\n      openPage: '',\n      inline: true,\n      stats: 'minimal',\n      open: true,\n      port: 9999,\n      hot: true,\n    },\n  })\n);\n"
  },
  {
    "path": "samples/hello-world-js/web/webpack/prod.js",
    "content": "const CompressionPlugin = require('compression-webpack-plugin');\nconst merge = require('webpack-merge');\nconst { buildConfig, DIST_PATH } = require('./common');\n\nmodule.exports = (env, argv) => merge(buildConfig(env, argv), {\n  devtool: false,\n\n  output: {\n    filename: 'bundle-[hash].js',\n    path: DIST_PATH,\n  },\n\n  plugins: [\n    new CompressionPlugin({ algorithm: 'gzip', filename: '[path].gz' }),\n  ],\n});\n"
  },
  {
    "path": "samples/hello-world-js/windows/.gitignore",
    "content": "*AppPackages*\n*BundleArtifacts*\n\n#OS junk files\n[Tt]humbs.db\n*.DS_Store\n\n#Visual Studio files\n*.[Oo]bj\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vssscc\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.[Cc]ache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.sdf\n*.opensdf\n*.opendb\n*.unsuccessfulbuild\nipch/\n[Oo]bj/\n[Bb]in\n[Dd]ebug*/\n[Rr]elease*/\nAnkh.NoLoad\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n#MonoDevelop\n*.pidb\n*.userprefs\n\n#Tooling\n_ReSharper*/\n*.resharper\n[Tt]est[Rr]esult*\n*.sass-cache\n\n#Project files\n[Bb]uild/\n\n#Subversion files\n.svn\n\n# Office Temp Files\n~$*\n\n# vim Temp Files\n*~\n\n#NuGet\npackages/\n*.nupkg\n\n#ncrunch\n*ncrunch*\n*crunch*.local.xml\n\n# visual studio database projects\n*.dbmdl\n\n#Test files\n*.testsettings\n\n#Other files\n*.DotSettings\n.vs/\n*project.lock.json\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/App.xaml",
    "content": "<rn:ReactApplication\n    x:Class=\"RXPHelloWorld.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:rn=\"using:ReactNative\"\n    RequestedTheme=\"Light\">\n\n</rn:ReactApplication>\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/App.xaml.cs",
    "content": "using ReactNative;\n\nnamespace RXPHelloWorld\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : ReactApplication\n    {\n        private readonly ReactNativeHost _host = new MainReactNativeHost();\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// The React Native host.\n        /// </summary>\n        public override ReactNativeHost Host => _host;\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/MainReactNativeHost.cs",
    "content": "using ReactNative;\nusing ReactNative.Modules.Core;\nusing ReactNative.Shell;\nusing System.Collections.Generic;\n\nnamespace RXPHelloWorld\n{\n    class MainReactNativeHost : ReactNativeHost\n    {\n        public override string MainComponentName => \"RXApp\";\n\n#if !BUNDLE || DEBUG\n        public override bool UseDeveloperSupport => true;\n#else\n        public override bool UseDeveloperSupport => false;\n#endif\n\n        protected override string JavaScriptMainModuleName => \"index\";\n\n#if BUNDLE\n        protected override string JavaScriptBundleFile => \"ms-appx:///ReactAssets/index.windows.bundle\";\n#endif\n\n        protected override List<IReactPackage> Packages => new List<IReactPackage>\n        {\n            new MainReactPackage(),\n        };\n    }\n}\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/Package.appxmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"09f9a49f-461c-41eb-b71d-e290b08ac437\"\n    Publisher=\"CN=user\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"09f9a49f-461c-41eb-b71d-e290b08ac437\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>RXPHelloWorld</DisplayName>\n    <PublisherDisplayName>React Native for UWP</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"RXPHelloWorld.App\">\n      <uap:VisualElements\n        DisplayName=\"RXPHelloWorld\"\n        Square150x150Logo=\"Assets\\Square150x150Logo.png\"\n        Square44x44Logo=\"Assets\\Square44x44Logo.png\"\n        Description=\"RXPHelloWorld\"\n        BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"Assets\\Wide310x150Logo.png\"/>\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/Properties/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"RXPHelloWorld\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RXPHelloWorld\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for RXPHelloWorld.MyClass and all of its public/private members\n    <Type Name=\"RXPHelloWorld.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"RXPHelloWorld.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/RXPHelloWorld.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>b150de0a-75d0-4f8d-96a6-38a07c8ebda5</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RXPHelloWorld</RootNamespace>\n    <AssemblyName>RXPHelloWorld</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.14393.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>RXPHelloWorld_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <PackageCertificateThumbprint>158E5E3397D7BDDC6F5BE049E1F6AC9B45E82753</PackageCertificateThumbprint>\n    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug' or '$(Configuration)' == 'DebugBundle'\">\n    <DependencyConfiguration>Debug</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release' or '$(Configuration)' == 'ReleaseBundle'\">\n    <DependencyConfiguration>Release</DependencyConfiguration>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x86'\">\n    <OutputPath>bin\\x86\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|ARM'\">\n    <OutputPath>bin\\ARM\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'DebugBundle|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\DebugBundle\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'ReleaseBundle|x64'\">\n    <OutputPath>bin\\x64\\ReleaseBundle\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS;BUNDLE</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <NoStdLib>true</NoStdLib>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainReactNativeHost.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"RXPHelloWorld_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Assets\\StoreLogo.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-200.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\">\n      <Project>{c7673ad5-e3aa-468c-a5fd-fa38154e205c}</Project>\n      <Name>ReactNative</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(Configuration)' == 'ReleaseBundle' or '$(Configuration)' == 'DebugBundle'\">\n    <Content Include=\"ReactAssets\\**\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NETCore.UniversalWindowsPlatform\">\n      <Version>6.0.6</Version>\n    </PackageReference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\bin\\Universal\\$(Platform)\\$(DependencyConfiguration)\\yoga.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Visible>False</Visible>\n    </Content>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld/ReactAssets/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "samples/hello-world-js/windows/RXPHelloWorld.sln",
    "content": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.271\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RXPHelloWorld\", \"RXPHelloWorld\\RXPHelloWorld.csproj\", \"b150de0a-75d0-4f8d-96a6-38a07c8ebda5\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C} = {2EACF721-73B5-46AE-9775-4A8674D05A9C}\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNative\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative\\ReactNative.csproj\", \"{C7673AD5-E3AA-468C-A5FD-FA38154E205C}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"ReactNative.Shared\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNative.Shared\\ReactNative.Shared.shproj\", \"{EEA8B852-4D07-48E1-8294-A21AB5909FE5}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ChakraBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ChakraBridge\\ChakraBridge.vcxproj\", \"{4B72C796-16D5-4E3A-81C0-3E36F531E578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReactNativeWebViewBridge\", \"..\\node_modules\\react-native-windows\\ReactWindows\\ReactNativeWebViewBridge\\ReactNativeWebViewBridge.csproj\", \"{7596216B-669C-41F8-86DA-F3637F6545C0}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"Facebook.Yoga.Shared\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.shproj\", \"{91C42D32-291D-4B72-90B4-551663D60B8B}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"yoga.uwp\", \"..\\node_modules\\react-native-windows\\Yoga\\csharp\\Yoga\\Yoga.Universal.vcxproj\", \"{2EACF721-73B5-46AE-9775-4A8674D05A9C}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\tReactNative.Shared\\ReactNative.Shared.projitems*{eea8b852-4d07-48e1-8294-a21ab5909fe5}*SharedItemsImports = 13\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{c7673ad5-e3aa-468c-a5fd-fa38154e205c}*SharedItemsImports = 4\n\t\t..\\Yoga\\csharp\\Facebook.Yoga\\Facebook.Yoga.Shared.projitems*{91c42d32-291d-4b72-90b4-551663d60b8b}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tDebugBundle|ARM = DebugBundle|ARM\n\t\tDebugBundle|x64 = DebugBundle|x64\n\t\tDebugBundle|x86 = DebugBundle|x86\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\t\tReleaseBundle|ARM = ReleaseBundle|ARM\n\t\tReleaseBundle|x64 = ReleaseBundle|x64\n\t\tReleaseBundle|x86 = ReleaseBundle|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x64.Build.0 = Debug|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x86.Build.0 = Debug|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|ARM.ActiveCfg = DebugBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|ARM.Build.0 = DebugBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|ARM.Deploy.0 = DebugBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x64.ActiveCfg = DebugBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x64.Build.0 = DebugBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x64.Deploy.0 = DebugBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x86.ActiveCfg = DebugBundle|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x86.Build.0 = DebugBundle|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.DebugBundle|x86.Deploy.0 = DebugBundle|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|ARM.Build.0 = Release|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x64.ActiveCfg = Release|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x64.Build.0 = Release|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x64.Deploy.0 = Release|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x86.ActiveCfg = Release|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x86.Build.0 = Release|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.Release|x86.Deploy.0 = Release|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|ARM.ActiveCfg = ReleaseBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|ARM.Build.0 = ReleaseBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|ARM.Deploy.0 = ReleaseBundle|ARM\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x64.ActiveCfg = ReleaseBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x64.Build.0 = ReleaseBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x64.Deploy.0 = ReleaseBundle|x64\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x86.ActiveCfg = ReleaseBundle|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x86.Build.0 = ReleaseBundle|x86\n\t\t{b150de0a-75d0-4f8d-96a6-38a07c8ebda5}.ReleaseBundle|x86.Deploy.0 = ReleaseBundle|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Debug|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.Release|x86.Build.0 = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{C7673AD5-E3AA-468C-A5FD-FA38154E205C}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.Release|x86.Build.0 = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{4B72C796-16D5-4E3A-81C0-3E36F531E578}.ReleaseBundle|x86.Build.0 = Release|Win32\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Debug|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.ActiveCfg = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.DebugBundle|x86.Build.0 = Debug|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.Release|x86.Build.0 = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.ActiveCfg = Release|x86\n\t\t{7596216B-669C-41F8-86DA-F3637F6545C0}.ReleaseBundle|x86.Build.0 = Release|x86\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.ActiveCfg = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|ARM.Build.0 = Debug|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.ActiveCfg = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x64.Build.0 = Debug|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.ActiveCfg = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.DebugBundle|x86.Build.0 = Debug|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.Release|x86.Build.0 = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.ActiveCfg = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|ARM.Build.0 = Release|ARM\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.ActiveCfg = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x64.Build.0 = Release|x64\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.ActiveCfg = Release|Win32\n\t\t{2EACF721-73B5-46AE-9775-4A8674D05A9C}.ReleaseBundle|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Simple wrapper file on the web implementation of ReactXP to get an appropriate type list\n* to export as a common d.ts for the package.\n*/\n\nimport * as ReactXP from './web/ReactXP';\n\nexport = ReactXP;\n"
  },
  {
    "path": "src/android/Accessibility.ts",
    "content": "/**\n * Accessibility.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common wrapper for accessibility helper exposed from ReactXP.\n */\n\nimport { Accessibility as NativeAccessibility, default as parentInstance } from '../native-common/Accessibility';\n\nexport class Accessibility extends NativeAccessibility {\n    private _lastAnnouncement: string | undefined;\n\n    // On Android, talkback fails to announce, if the new announcement is the same as the last one.\n    // The reason is probably that in RootView, the announcement text is held in state and passed as a prop to RN.View.\n    // If the announcement is the same, the props don't change and RN doesn't see a reason to re-render\n    // the view - retrigger the announcement. This behaviour is actually expected. We work around this by checking\n    // the new announcement text and comparing it with the last one. If they are the same, append a space at the end.\n    announceForAccessibility(announcement: string): void {\n        if (announcement === this._lastAnnouncement) {\n            announcement += ' ';\n        }\n        this._lastAnnouncement = announcement;\n\n        // We cannot just call super.announceForAccessibility here, because RootView subscribes on this\n        // parent class singleton instance. Calling Accessibility.announceForAccessibility from the consumer app\n        // will then create a different event and the announcements won't work. Instead, we just call the\n        // instance method directly.\n        parentInstance.announceForAccessibility(announcement);\n    }\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/android/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Android-specific accessibility utils.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport Accessibility from '../native-common/Accessibility';\nimport { AccessibilityPlatformUtil as CommonAccessibilityNativeUtil } from '../common/AccessibilityUtil';\n\nexport class AccessibilityUtil extends CommonAccessibilityNativeUtil {\n    private _sendAccessibilityEvent(component: React.Component<any, any>, eventId: number): void {\n        // See list of events here:\n        // https://developer.android.com/reference/android/view/accessibility/AccessibilityEvent.html\n\n        // For some reason, a small delay is required for the event to be properly processed.\n        setTimeout(() => {\n            let nodeHandle;\n\n            // Component could be unmountend at the moment this function is executed and in\n            // that case RN.findNodeHandle() will throw an exception.\n            // We can't use just simple component.isMounted() checks as it's deprecated and\n            // will throw red-screen in dev mode and I don't want to access _isMounted as\n            // it's private prop.\n            try {\n                nodeHandle = RN.findNodeHandle(component);\n            } catch (e) {\n                // Intended noop, it's valid situation\n            }\n\n            if (nodeHandle) {\n                RN.NativeModules.UIManager.sendAccessibilityEvent(nodeHandle, eventId);\n            }\n        }, 100);\n    }\n\n    setAccessibilityFocus(component: React.Component<any, any>): void {\n        const TYPE_VIEW_FOCUSED = 8;\n\n        if (Accessibility.isScreenReaderEnabled()) {\n            this._sendAccessibilityEvent(component, TYPE_VIEW_FOCUSED);\n        }\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/android/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Android-specific implementation of GestureView component.\n */\n\nimport { GestureView as BaseGestureView } from '../native-common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nconst _preferredPanRatio = 2;\n\nexport class GestureView extends BaseGestureView {\n\n    constructor(props: Types.GestureViewProps) {\n        super(props);\n    }\n\n    protected _getPreferredPanRatio(): number {\n        return _preferredPanRatio;\n    }\n\n    protected _getEventTimestamp(e: Types.TouchEvent | Types.MouseEvent): number {\n        let timestamp = e.timeStamp;\n\n        // Work around a bug in some versions of RN where \"timestamp\" is\n        // capitalized differently for some events.\n        if (!timestamp) {\n            timestamp = (e as any).timestamp;\n        }\n\n        if (!timestamp) {\n            return 0;\n        }\n\n        return timestamp.valueOf();\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/android/Image.tsx",
    "content": "/**\n * Image.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Android-specific implementation of Image component.\n */\nimport * as RN from 'react-native';\n\nimport { Image as CommonImage } from '../native-common/Image';\n\nexport class Image extends CommonImage {\n    // Overwrite the style for android since native Image has a fade in animation when an image loads\n    // Setting the fadeDuration to 0, removes that animation\n    protected _getAdditionalProps(): RN.ImagePropertiesAndroid {\n        return { fadeDuration: 0 };\n    }\n}\n\nexport default Image;\n"
  },
  {
    "path": "src/android/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Wrapper for all ReactXP functionality. Users of ReactXP should import just this\n* file instead of internals.\n*/\n\nimport React = require('react');\nimport RN = require('react-native');\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport ActivityIndicatorImpl from '../native-common/ActivityIndicator';\nimport AlertImpl from '../native-common/Alert';\nimport { CommonAnimatedClasses, makeAnimated } from '../native-common/Animated';\nimport AppImpl from '../native-common/App';\nimport ButtonImpl from '../native-common/Button';\nimport ClipboardImpl from '../native-common/Clipboard';\nimport InputImpl from '../native-common/Input';\nimport RXInterfaces = require('../common/Interfaces');\nimport InternationalImpl from '../native-common/International';\nimport LinkImpl from '../native-common/Link';\nimport LinkingImpl from '../native-common/Linking';\nimport LocationImpl from '../common/Location';\nimport ModalImpl from '../native-common/Modal';\nimport RXModuleInterface = require('../common/ModuleInterface');\nimport PickerImpl from '../native-common/Picker';\nimport PlatformImpl from '../native-common/Platform';\nimport PopupImpl from '../native-common/Popup';\nimport ScrollViewImpl from '../native-common/ScrollView';\nimport StorageImpl from '../native-common/Storage';\nimport StylesImpl from '../native-common/Styles';\nimport TextInputImpl from '../native-common/TextInput';\nimport RXTypes = require('../common/Types');\nimport UserInterfaceImpl from '../native-common/UserInterface';\nimport UserPresenceImpl from '../native-common/UserPresence';\nimport ViewImpl from '../native-common/View';\n\nimport AccessibilityImpl from './Accessibility';\nimport AccessibilityPlatformUtil from './AccessibilityUtil';\nimport GestureViewImpl from './GestureView';\nimport ImageImpl from './Image';\nimport StatusBarImpl from './StatusBar';\nimport TextImpl from './Text';\n\nAccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nmodule ReactXP {\n    export type Accessibility = RXInterfaces.Accessibility;\n    export let Accessibility: RXInterfaces.Accessibility = AccessibilityImpl;\n    export type ActivityIndicator = RXInterfaces.ActivityIndicator;\n    export let ActivityIndicator: typeof RXInterfaces.ActivityIndicator = ActivityIndicatorImpl;\n    export type Alert = RXInterfaces.Alert;\n    export let Alert: RXInterfaces.Alert = AlertImpl;\n    export type App = RXInterfaces.App;\n    export let App: RXInterfaces.App = AppImpl;\n    export type Button = RXInterfaces.Button;\n    export let Button: typeof RXInterfaces.Button = ButtonImpl;\n    export type Picker = RXInterfaces.Picker;\n    export let Picker: typeof RXInterfaces.Picker = PickerImpl;\n    export type Clipboard = RXInterfaces.Clipboard;\n    export let Clipboard: RXInterfaces.Clipboard = ClipboardImpl;\n    export type GestureView = RXInterfaces.GestureView;\n    export let GestureView: typeof RXInterfaces.GestureView = GestureViewImpl;\n    export type Image = RXInterfaces.Image;\n    export let Image: RXInterfaces.ImageConstructor = ImageImpl;\n    export type Input = RXInterfaces.Input;\n    export let Input: RXInterfaces.Input = InputImpl;\n    export type International = RXInterfaces.International;\n    export let International: RXInterfaces.International = InternationalImpl;\n    export type Link = RXInterfaces.Link;\n    export let Link: typeof RXInterfaces.Link = LinkImpl;\n    export type Linking = RXInterfaces.Linking;\n    export let Linking: RXInterfaces.Linking = LinkingImpl;\n    export type Location = RXInterfaces.Location;\n    export let Location: RXInterfaces.Location = LocationImpl;\n    export type Modal = RXInterfaces.Modal;\n    export let Modal: RXInterfaces.Modal = ModalImpl;\n    export type Platform = RXInterfaces.Platform;\n    export let Platform: RXInterfaces.Platform = PlatformImpl;\n    export type Popup = RXInterfaces.Popup;\n    export let Popup: RXInterfaces.Popup = PopupImpl;\n    export type ScrollView = RXInterfaces.ScrollView;\n    export let ScrollView: RXInterfaces.ScrollViewConstructor = ScrollViewImpl;\n    export type StatusBar = RXInterfaces.StatusBar;\n    export let StatusBar: RXInterfaces.StatusBar = StatusBarImpl;\n    export type Storage = RXInterfaces.Storage;\n    export let Storage: RXInterfaces.Storage = StorageImpl;\n    export type Styles = RXInterfaces.Styles;\n    export let Styles: RXInterfaces.Styles = StylesImpl;\n    export type Text = RXInterfaces.Text;\n    export let Text: typeof RXInterfaces.Text = TextImpl;\n    export type TextInput = RXInterfaces.TextInput;\n    export let TextInput: typeof RXInterfaces.TextInput = TextInputImpl;\n    export type UserInterface = RXInterfaces.UserInterface;\n    export let UserInterface: RXInterfaces.UserInterface = UserInterfaceImpl;\n    export type UserPresence = RXInterfaces.UserPresence;\n    export let UserPresence: RXInterfaces.UserPresence = UserPresenceImpl;\n    export type View = RXInterfaces.View;\n    export let View: typeof RXInterfaces.View = ViewImpl;\n\n    const androidAnimatedClasses =  {\n        ...CommonAnimatedClasses,\n        Text: RN.Animated.createAnimatedComponent(TextImpl),\n    };\n\n    export const Animated = makeAnimated(androidAnimatedClasses);\n    export import CommonProps = RXTypes.CommonProps;\n    export import CommonStyledProps = RXTypes.CommonStyledProps;\n    export import Stateless = RXTypes.Stateless;\n    export import Types = RXTypes;\n\n    export import Component = React.Component;\n    export import ComponentBase = RXTypes.ComponentBase;\n    export import createElement = React.createElement;\n    export import Children = React.Children;\n    export let __spread = (React as any).__spread;\n    export import Fragment = React.Fragment;\n}\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.ts for more details.\nlet _rxImplementsRxInterface: typeof RXModuleInterface.ReactXP = ReactXP;\n_rxImplementsRxInterface = _rxImplementsRxInterface;\nexport = ReactXP;\n\n/*\nvar rx = module.exports;\nObject.keys(rx)\n    .filter(key => rx[key] && rx[key].prototype instanceof React.Component && !rx[key].displayName)\n    .forEach(key => rx[key].displayName = 'RX.' + key + '');\n*/\n"
  },
  {
    "path": "src/android/StatusBar.ts",
    "content": "/**\n * StatusBar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Android-specific implementation of StatusBar APIs.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class StatusBar extends RX.StatusBar {\n    isOverlay(): boolean {\n        // Android draws the status bar as a view that takes up space\n        // of its own, as opposed to an overlay like on iOS.\n        return false;\n    }\n\n    setHidden(hidden: boolean, showHideTransition: 'slide' | 'fade'): void {\n        RN.StatusBar.setHidden(hidden, showHideTransition);\n    }\n\n    setBackgroundColor(color: string, animated: boolean): void {\n        RN.StatusBar.setBackgroundColor(color, animated);\n    }\n\n    setTranslucent(translucent: boolean): void {\n        RN.StatusBar.setTranslucent(translucent);\n    }\n\n    setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void {\n        // Nothing to do on android\n    }\n\n    setNetworkActivityIndicatorVisible(value: boolean): void {\n        // Nothing to do on android\n    }\n}\n\nexport default new StatusBar();\n"
  },
  {
    "path": "src/android/Text.tsx",
    "content": "/**\n * Text.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Android-specific implementation of Text component.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport { Types } from '../common/Interfaces';\nimport Styles from '../native-common/Styles';\nimport { Text as CommonText } from '../native-common/Text';\n\nconst _styles = {\n    defaultText: Styles.createTextStyle({\n        includeFontPadding: false,\n        textAlignVertical: 'center',\n    }),\n};\n\nexport class Text extends CommonText {\n    protected _getStyles(): Types.StyleRuleSetRecursiveArray<Types.TextStyleRuleSet> {\n        return [_styles.defaultText, this.props.style];\n    }\n\n    // We override the render method to work around a couple of Android-specific\n    // bugs in RN. First, numberOfLines needs to be set to null rather than 0 to\n    // indicate an unbounded number of lines. Second, ellipsizeMode needs to be set\n    // to null to indicate the default behavior.\n    render() {\n        const importantForAccessibility = AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility);\n        return (\n            <RN.Text\n                style={ this._getStyles() as RN.StyleProp<RN.TextStyle> }\n                ref={ this._onMount }\n                importantForAccessibility={ importantForAccessibility }\n                numberOfLines={ this.props.numberOfLines === 0 ? undefined : this.props.numberOfLines }\n                allowFontScaling={ this.props.allowFontScaling }\n                ellipsizeMode={ this.props.ellipsizeMode }\n                onPress={ this.props.onPress }\n                textBreakStrategy={ this.props.textBreakStrategy }\n                testID={ this.props.testId }\n            >\n                { this.props.children }\n            </RN.Text>\n        );\n    }\n}\n\nexport default Text;\n"
  },
  {
    "path": "src/common/Accessibility.ts",
    "content": "/**\n * Accessibility.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common wrapper for accessibility helper exposed from ReactXP.\n */\n\nimport SubscribableEvent from 'subscribableevent';\n\nimport * as RX from '../common/Interfaces';\n\nexport abstract class Accessibility extends RX.Accessibility {\n    abstract isScreenReaderEnabled(): boolean;\n\n    screenReaderChangedEvent = new SubscribableEvent<(isEnabled: boolean) => void>();\n\n    isHighContrastEnabled(): boolean {\n        return false;\n    }\n\n    newAnnouncementReadyEvent = new SubscribableEvent<(announcement: string) => void>();\n    announceForAccessibility(announcement: string): void {\n        this.newAnnouncementReadyEvent.fire(announcement);\n    }\n}\n\nexport default Accessibility;\n"
  },
  {
    "path": "src/common/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common accessibility interface for platform-specific accessibility utilities.\n */\n\nimport * as React from 'react';\n\nimport { Types } from '../common/Interfaces';\n\nexport type ImportantForAccessibilityValue = 'auto' | 'yes' | 'no' | 'no-hide-descendants';\nexport const ImportantForAccessibilityMap = {\n    [Types.ImportantForAccessibility.Auto]: 'auto' as ImportantForAccessibilityValue,\n    [Types.ImportantForAccessibility.Yes]: 'yes' as ImportantForAccessibilityValue,\n    [Types.ImportantForAccessibility.No]: 'no' as ImportantForAccessibilityValue,\n    [Types.ImportantForAccessibility.NoHideDescendants]: 'no-hide-descendants' as ImportantForAccessibilityValue,\n};\n\n// Platform specific helpers exposed through Native-Common AccessibilityUtil.\nexport abstract class AccessibilityPlatformUtil {\n    abstract setAccessibilityFocus(component: React.Component<any, any>): void;\n}\n\nexport abstract class AccessibilityUtil {\n    isHidden(importantForAccessibility: Types.ImportantForAccessibility | undefined): true | undefined {\n        // aria-hidden is false by default, returning true or undefined, so that it doesn't pollute the DOM.\n        if (importantForAccessibility) {\n            const importantForAccessibilityString = this.importantForAccessibilityToString(importantForAccessibility);\n            if (importantForAccessibilityString === ImportantForAccessibilityMap[Types.ImportantForAccessibility.NoHideDescendants]) {\n                return true;\n            }\n        }\n        return undefined;\n    }\n\n    importantForAccessibilityToString(importantForAccessibility: Types.ImportantForAccessibility | undefined,\n            defaultImportantForAccessibility?: Types.ImportantForAccessibility): ImportantForAccessibilityValue | undefined {\n        importantForAccessibility = importantForAccessibility || defaultImportantForAccessibility;\n\n        if (importantForAccessibility && ImportantForAccessibilityMap[importantForAccessibility]) {\n            return ImportantForAccessibilityMap[importantForAccessibility];\n        }\n        return undefined;\n    }\n\n    protected abstract accessibilityLiveRegionToString(liveRegion: Types.AccessibilityLiveRegion): string | undefined;\n    protected abstract accessibilityTraitToString(trait: Types.AccessibilityTrait | Types.AccessibilityTrait[],\n        defaultTrait?: Types.AccessibilityTrait): string | string[] | undefined;\n}\n"
  },
  {
    "path": "src/common/AppConfig.ts",
    "content": "/**\n * AppConfig.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A simple class to store application config.\n */\n\nexport class AppConfig {\n    private _isDebug = false;\n    private _isDevelopment = false;\n\n    setAppConfig(isDebug: boolean, isDevelopment: boolean): void {\n        this._isDebug = isDebug;\n        this._isDevelopment = isDevelopment;\n    }\n\n    isDebugMode(): boolean {\n        return this._isDebug;\n    }\n\n    isDevelopmentMode(): boolean {\n        return this._isDevelopment;\n    }\n}\n\nexport default new AppConfig();\n"
  },
  {
    "path": "src/common/Bezier.ts",
    "content": "/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nconst float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A(aA1: number, aA2: number): number {\n    return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n}\n\nfunction B(aA1: number, aA2: number): number {\n    return 3.0 * aA2 - 6.0 * aA1;\n}\n\nfunction C(aA1: number): number {\n    return 3.0 * aA1;\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number): number {\n    return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number): number {\n    return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number): number {\n    let currentX = 0;\n    let currentT = 0;\n    let i = 0;\n    do {\n        currentT = aA + (aB - aA) / 2.0;\n        currentX = calcBezier(currentT, mX1, mX2) - aX;\n        if (currentX > 0.0) {\n            aB = currentT;\n        } else {\n            aA = currentT;\n        }\n    } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n    return currentT;\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number): number {\n    for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n        const currentSlope = getSlope(aGuessT, mX1, mX2);\n        if (currentSlope === 0.0) {\n            return aGuessT;\n        }\n        const currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n        aGuessT -= currentX / currentSlope;\n    }\n    return aGuessT;\n}\n\nexport function bezier(mX1: number, mY1: number, mX2: number, mY2: number): (x: number) => number {\n    if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n        throw new Error('bezier x values must be in [0, 1] range');\n    }\n\n    // Precompute samples table\n    const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n    if (mX1 !== mY1 || mX2 !== mY2) {\n        for (let i = 0; i < kSplineTableSize; ++i) {\n            sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n        }\n    }\n\n    function getTForX(aX: number): number {\n        let intervalStart = 0.0;\n        let currentSample = 1;\n        const lastSample = kSplineTableSize - 1;\n\n        for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n            intervalStart += kSampleStepSize;\n        }\n        --currentSample;\n\n        // Interpolate to provide an initial guess for t\n        const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n        const guessForT = intervalStart + dist * kSampleStepSize;\n\n        const initialSlope = getSlope(guessForT, mX1, mX2);\n        if (initialSlope >= NEWTON_MIN_SLOPE) {\n            return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n        } else if (initialSlope === 0.0) {\n            return guessForT;\n        } else {\n            return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n        }\n    }\n\n    return function BezierEasing(x: number) {\n        if (mX1 === mY1 && mX2 === mY2) {\n            return x; // linear\n        }\n        // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n        if (x === 0) {\n            return 0;\n        }\n        if (x === 1) {\n            return 1;\n        }\n        return calcBezier(getTForX(x), mY1, mY2);\n    };\n}\n"
  },
  {
    "path": "src/common/Easing.ts",
    "content": "/**\n * Easing.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Easing functions for animations.\n */\n\nimport * as Bezier from './Bezier';\nimport { Types } from './Interfaces';\n\nexport class Easing implements Types.Animated.Easing {\n    CubicBezier(x1: number, y1: number, x2: number, y2: number): Types.Animated.EasingFunction {\n        return {\n            cssName: 'cubic-bezier(' + x1.toString() + ', ' + y1.toString() + ', ' + x2.toString() + ', ' + y2.toString() + ')',\n            function: Bezier.bezier(x1, y1, x2, y2),\n        };\n    }\n\n    Default(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.42, 0, 1, 1);\n        return {\n            cssName: 'ease',\n            function: bezier.function,\n        };\n    }\n\n    Linear(): Types.Animated.EasingFunction {\n        return {\n            cssName: 'linear',\n            function: (input: number) => input,\n        };\n    }\n\n    Out(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0, 0, 0.58, 1);\n        return {\n            cssName: 'ease-out',\n            function: bezier.function,\n        };\n    }\n\n    In(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.42, 0, 1, 1);\n        return {\n            cssName: 'ease-in',\n            function: bezier.function,\n        };\n    }\n\n    InOut(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.42, 0, 0.58, 1);\n        return {\n            cssName: 'ease-in-out',\n            function: bezier.function,\n        };\n    }\n\n    OutBack(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.175, 0.885, 0.320, 1.275);\n        return {\n            cssName: bezier.cssName,\n            function: bezier.function,\n        };\n    }\n\n    InBack(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.600, -0.280, 0.735, 0.045);\n        return {\n            cssName: bezier.cssName,\n            function: bezier.function,\n        };\n    }\n\n    InOutBack(): Types.Animated.EasingFunction {\n        const bezier = this.CubicBezier(0.680, -0.550, 0.265, 1.550);\n        return {\n            cssName: bezier.cssName,\n            function: bezier.function,\n        };\n    }\n\n    Steps(intervals: number, end = true): Types.Animated.EasingFunction {\n        return {\n            cssName: 'steps(' + intervals.toString() + ', ' + (end ? 'end' : 'start') + ')',\n            function: (input: number) => {\n                let interval = intervals * input;\n                if (end) {\n                    interval = Math.floor(interval);\n                } else {\n                    interval = Math.ceil(interval);\n                }\n                return interval / intervals;\n            },\n        };\n    }\n\n    StepStart(): Types.Animated.EasingFunction {\n        const steps = this.Steps(1, false);\n        return {\n            cssName: 'steps(1, start)',\n            function: steps.function,\n        };\n    }\n\n    StepEnd(): Types.Animated.EasingFunction {\n        const steps = this.Steps(1, true);\n        return {\n            cssName: 'steps(1, end)',\n            function: steps.function,\n        };\n    }\n}\n\nexport default new Easing();\n"
  },
  {
    "path": "src/common/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Cross-platform parts of the implementation of the GestureView component.\n * It provides much of the standard work necessary to support combinations of\n * pinch-and-zoom, panning, single tap and double tap gestures.\n */\n\nimport * as React from 'react';\n\nimport assert from '../common/assert';\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nexport enum GestureType {\n    None,\n    MultiTouch,\n    Pan,\n    PanVertical,\n    PanHorizontal\n}\n\n// These threshold values were chosen empirically.\nconst _pinchZoomPixelThreshold = 3;\nconst _panPixelThreshold = 10;\nconst _tapDurationThreshold = 500;\nconst _longPressDurationThreshold = 750;\nconst _tapPixelThreshold = 4;\nconst _doubleTapDurationThreshold = 250;\nconst _doubleTapPixelThreshold = 20;\n\nexport interface GestureStatePoint {\n    /**\n     * accumulated distance of the gesture since the touch started\n     */\n    dx: number;\n\n    /**\n     * accumulated distance of the gesture since the touch started\n     */\n    dy: number;\n}\n\nexport interface GestureStatePointVelocity extends GestureStatePoint {\n    /**\n     * current velocity of the gesture\n     */\n    vx: number;\n\n    /**\n     * current velocity of the gesture\n     */\n    vy: number;\n}\n\n// We need a method-less really-basic touch event basic type for allowing cross-platform adapting of\n// web(React)-based touch events into RX touch events, since they're based on the RN type to allow\n// for zero-work casting and manipulating.\nexport interface TouchListBasic {\n    [index: number]: Types.Touch;\n    length: number;\n}\n\nexport interface TouchEventBasic extends Types.SyntheticEvent {\n    // We override this definition because the public\n    // type excludes location and page fields.\n    altKey: boolean;\n    changedTouches: TouchListBasic;\n    ctrlKey: boolean;\n    metaKey: boolean;\n    shiftKey: boolean;\n    targetTouches: TouchListBasic;\n    locationX?: number;\n    locationY?: number;\n    pageX?: number;\n    pageY?: number;\n    touches: TouchListBasic;\n}\n\nexport abstract class GestureView extends React.Component<Types.GestureViewProps, Types.Stateless> {\n    private _doubleTapTimer: number | undefined;\n\n    private _pendingLongPressEvent: Types.TapGestureState | undefined;\n    private _longPressTimer: number | undefined;\n\n    // State for tracking move gestures (pinch/zoom or pan)\n    private _pendingGestureType: GestureType = GestureType.None;\n    private _pendingGestureState: Types.MultiTouchGestureState | Types.PanGestureState | Types.TapGestureState | undefined;\n\n    // State for tracking double taps\n    private _lastTapEvent: Types.TapGestureState | undefined;\n\n    // Skip ability for next tap to work around some event issues\n    private _shouldSkipNextTap = false;\n\n    // State for tracking single taps\n    private _lastGestureStartEvent: TouchEventBasic | undefined;\n\n    componentWillUnmount() {\n        // Dispose of timer before the component goes away.\n        this._cancelDoubleTapTimer();\n    }\n\n    // Returns true if we care about trapping/tracking the event\n    protected _onTouchSeriesStart(event: TouchEventBasic): boolean {\n        this._lastGestureStartEvent = event;\n\n        // If we're trying to detect a tap, set this as the responder immediately.\n        if (this.props.onTap || this.props.onDoubleTap || this.props.onLongPress || this.props.onContextMenu) {\n            if (this.props.onLongPress) {\n                const gsState = this._touchEventToTapGestureState(event);\n                this._startLongPressTimer(gsState);\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    // Returns true if we care about trapping/tracking the event\n    protected _onTouchChange(event: TouchEventBasic, gestureState: GestureStatePointVelocity): boolean {\n        if (!this._lastGestureStartEvent) {\n            this._lastGestureStartEvent = event;\n        }\n\n        // If this is the first movement we've seen, try to match it against\n        // the various move gestures that we're looking for.\n        let initializeFromEvent = false;\n        if (this._pendingGestureType === GestureType.None) {\n            this._pendingGestureType = this._detectMoveGesture(event, gestureState);\n            initializeFromEvent = true;\n        }\n\n        if (this._pendingGestureType === GestureType.MultiTouch) {\n            this._setPendingGestureState(this._sendMultiTouchEvents(event, gestureState,\n                initializeFromEvent, false));\n            return true;\n        } else if (this._pendingGestureType === GestureType.Pan ||\n                this._pendingGestureType === GestureType.PanVertical ||\n                this._pendingGestureType === GestureType.PanHorizontal) {\n            const spEvent = this._touchEventToTapGestureState(event);\n            this._setPendingGestureState(this._sendPanEvent(spEvent, gestureState,\n                this._pendingGestureType, initializeFromEvent, false));\n            return true;\n        }\n\n        return false;\n    }\n\n    protected _onTouchSeriesFinished(touchEvent: TouchEventBasic, gestureState: GestureStatePointVelocity) {\n        // Can't possibly be a long press if the touch ended.\n        this._cancelLongPressTimer();\n\n        // Close out any of the pending move gestures.\n        if (this._pendingGestureType === GestureType.MultiTouch) {\n            this._sendMultiTouchEvents(touchEvent, gestureState, false, true);\n            this._pendingGestureState = undefined;\n            this._pendingGestureType = GestureType.None;\n        } else if (this._pendingGestureType === GestureType.Pan ||\n            this._pendingGestureType === GestureType.PanVertical ||\n            this._pendingGestureType === GestureType.PanHorizontal) {\n            const spEvent = this._touchEventToTapGestureState(touchEvent);\n            this._sendPanEvent(spEvent, gestureState, this._pendingGestureType, false, true);\n            this._pendingGestureState = undefined;\n            this._pendingGestureType = GestureType.None;\n        } else if (this._isTap(touchEvent)) {\n            const tapGestureState = this._touchEventToTapGestureState(touchEvent);\n            if (!this.props.onDoubleTap) {\n                // If there is no double-tap handler, we can invoke the tap handler immediately.\n                this._sendTapEvent(tapGestureState);\n            } else if (this._isDoubleTap(tapGestureState)) {\n                // This is a double-tap, so swallow the previous single tap.\n                this._cancelDoubleTapTimer();\n                this._sendDoubleTapEvent(tapGestureState);\n            } else {\n                // This wasn't a double-tap. Report any previous single tap and start the double-tap\n                // timer so we can determine whether the current tap is a single or double.\n                this._reportDelayedTap();\n                this._startDoubleTapTimer(tapGestureState);\n            }\n        } else {\n            this._reportDelayedTap();\n            this._cancelDoubleTapTimer();\n        }\n    }\n\n    // Get preferred pan ratio for platform.\n    protected abstract _getPreferredPanRatio(): number;\n\n    // Returns the timestamp for the touch event in milliseconds.\n    protected abstract _getEventTimestamp(e: TouchEventBasic | Types.MouseEvent): number;\n\n    protected _skipNextTap() {\n        this._shouldSkipNextTap = true;\n    }\n\n    private _setPendingGestureState(gestureState: Types.MultiTouchGestureState | Types.PanGestureState | Types.TapGestureState) {\n        this._reportDelayedTap();\n        this._cancelDoubleTapTimer();\n        this._cancelLongPressTimer();\n        this._pendingGestureState = gestureState;\n    }\n\n    private _detectMoveGesture(e: TouchEventBasic, gestureState: GestureStatePoint): GestureType {\n        if (this._shouldRespondToPinchZoom(e) || this._shouldRespondToRotate(e)) {\n            return GestureType.MultiTouch;\n        } else if (this._shouldRespondToPan(gestureState)) {\n            return GestureType.Pan;\n        } else if (this._shouldRespondToPanVertical(gestureState)) {\n            return GestureType.PanVertical;\n        } else if (this._shouldRespondToPanHorizontal(gestureState)) {\n            return GestureType.PanHorizontal;\n        }\n\n        return GestureType.None;\n    }\n\n    // Determines whether a touch event constitutes a tap. The \"finger up\"\n    // event must be within a certain distance and within a certain time\n    // from where the \"finger down\" event occurred.\n    private _isTap(e: TouchEventBasic): boolean {\n        if (!this._lastGestureStartEvent) {\n            return false;\n        }\n\n        const initialTimeStamp = this._getEventTimestamp(this._lastGestureStartEvent);\n        const initialPageX = this._lastGestureStartEvent.pageX!;\n        const initialPageY = this._lastGestureStartEvent.pageY!;\n\n        const timeStamp = this._getEventTimestamp(e);\n\n        return (timeStamp - initialTimeStamp <= _tapDurationThreshold &&\n            this._calcDistance(initialPageX - e.pageX!, initialPageY - e.pageY!) <= _tapPixelThreshold);\n    }\n\n    // This method assumes that the caller has already determined that two\n    // taps have been detected in a row with no intervening gestures. It\n    // is responsible for determining if they occurred within close proximity\n    // and within a certain threshold of time.\n    protected _isDoubleTap(e: Types.TapGestureState) {\n        if (!this._lastTapEvent) {\n            return false;\n        }\n\n        return (e.timeStamp - this._lastTapEvent.timeStamp <= _doubleTapDurationThreshold &&\n            this._calcDistance(this._lastTapEvent.pageX - e.pageX, this._lastTapEvent.pageY - e.pageY) <= _doubleTapPixelThreshold);\n    }\n\n    // Starts a timer that reports a previous tap if it's not canceled by a subsequent gesture.\n    protected _startDoubleTapTimer(e: Types.TapGestureState) {\n        this._lastTapEvent = e;\n\n        this._doubleTapTimer = Timers.setTimeout(() => {\n            this._reportDelayedTap();\n            this._doubleTapTimer = undefined;\n        }, _doubleTapDurationThreshold);\n    }\n\n    // Cancels any pending double-tap timer.\n    protected _cancelDoubleTapTimer() {\n        if (this._doubleTapTimer) {\n            Timers.clearTimeout(this._doubleTapTimer);\n            this._doubleTapTimer = undefined;\n        }\n    }\n\n    protected _startLongPressTimer(gsState: Types.TapGestureState, isDefinitelyMouse = false) {\n        if (this._pendingLongPressEvent) {\n            return;\n        }\n\n        this._pendingLongPressEvent = gsState;\n\n        this._longPressTimer = Timers.setTimeout(() => {\n            this._reportLongPress();\n            this._longPressTimer = undefined;\n        }, _longPressDurationThreshold);\n    }\n\n    private _reportLongPress() {\n        if (!this._pendingLongPressEvent) {\n            return;\n        }\n\n        if (this.props.onLongPress) {\n            this.props.onLongPress(this._pendingLongPressEvent);\n        }\n\n        this._pendingLongPressEvent = undefined;\n    }\n\n    protected _cancelLongPressTimer() {\n        if (this._longPressTimer) {\n            Timers.clearTimeout(this._longPressTimer);\n            this._longPressTimer = undefined;\n        }\n\n        this._pendingLongPressEvent = undefined;\n    }\n\n    // If there was a previous tap recorded but we haven't yet reported it because we were\n    // waiting for a potential second tap, report it now.\n    protected _reportDelayedTap() {\n        if (this._lastTapEvent && this.props.onTap) {\n            this._sendTapEvent(this._lastTapEvent);\n            this._lastTapEvent = undefined;\n        }\n    }\n\n    protected _clearLastTap() {\n        this._lastTapEvent = undefined;\n    }\n\n    private static _isActuallyMouseEvent(e: TouchEventBasic | undefined): boolean {\n        if (!e) {\n            return false;\n        }\n\n        const nativeEvent = e as any;\n        if (nativeEvent.button !== undefined) {\n            return true;\n        } else if (nativeEvent.isRightButton || nativeEvent.IsRightButton) {\n            return true;\n        } else if (nativeEvent.isMiddleButton || nativeEvent.IsMiddleButton) {\n            return true;\n        }\n\n        return false;\n    }\n\n    private _shouldRespondToPinchZoom(e: TouchEventBasic) {\n        if (!this.props.onPinchZoom) {\n            return false;\n        }\n\n        // Do we see two touches?\n        if (!e.touches || e.touches.length !== 2) {\n            return false;\n        }\n\n        // Has the user started to pinch or zoom?\n        const distance = this._calcDistance(e.touches[0].pageX - e.touches[1].pageX, e.touches[0].pageY - e.touches[1].pageY);\n        if (distance >= _pinchZoomPixelThreshold) {\n            return true;\n        }\n\n        return false;\n    }\n\n    private _shouldRespondToRotate(e: TouchEventBasic) {\n        if (!this.props.onRotate) {\n            return false;\n        }\n\n        // Do we see two touches?\n        if (!e.touches || e.touches.length !== 2) {\n            return false;\n        }\n\n        return true;\n    }\n\n    protected _shouldRespondToPan(gestureState: GestureStatePoint) {\n        if (!this.props.onPan) {\n            return false;\n        }\n\n        // Has the user started to pan?\n        const panThreshold = (this.props.panPixelThreshold !== undefined && this.props.panPixelThreshold > 0) ?\n            this.props.panPixelThreshold : _panPixelThreshold;\n        return (this._calcDistance(gestureState.dx, gestureState.dy) >= panThreshold);\n    }\n\n    protected _shouldRespondToPanVertical(gestureState: GestureStatePoint) {\n        if (!this.props.onPanVertical) {\n            return false;\n        }\n\n        // Has the user started to pan?\n        const panThreshold = (this.props.panPixelThreshold !== undefined && this.props.panPixelThreshold > 0) ?\n            this.props.panPixelThreshold : _panPixelThreshold;\n        const isPan = Math.abs(gestureState.dy) >= panThreshold;\n\n        if (isPan && this.props.preferredPan === Types.PreferredPanGesture.Horizontal) {\n            return Math.abs(gestureState.dy) > Math.abs(gestureState.dx * this._getPreferredPanRatio());\n        }\n        return isPan;\n    }\n\n    protected _shouldRespondToPanHorizontal(gestureState: GestureStatePoint) {\n        if (!this.props.onPanHorizontal) {\n            return false;\n        }\n\n        // Has the user started to pan?\n        const panThreshold = (this.props.panPixelThreshold !== undefined && this.props.panPixelThreshold > 0) ?\n            this.props.panPixelThreshold : _panPixelThreshold;\n        const isPan = Math.abs(gestureState.dx) >= panThreshold;\n\n        if (isPan && this.props.preferredPan === Types.PreferredPanGesture.Vertical) {\n            return Math.abs(gestureState.dx) > Math.abs(gestureState.dy * this._getPreferredPanRatio());\n        }\n        return isPan;\n    }\n\n    private _calcDistance(dx: number, dy: number) {\n        return Math.sqrt(dx * dx + dy * dy);\n    }\n\n    private _calcAngle(touches: TouchListBasic): number {\n        const a = touches[0];\n        const b = touches[1];\n\n        let degrees = this._radiansToDegrees(Math.atan2(b.pageY - a.pageY, b.pageX - a.pageX));\n        if (degrees < 0) {\n            degrees += 360;\n        }\n\n        return degrees;\n    }\n\n    private _radiansToDegrees(rad: number): number {\n        return rad * 180 / Math.PI;\n    }\n\n    private _sendMultiTouchEvents(e: TouchEventBasic, gestureState: GestureStatePointVelocity,\n            initializeFromEvent: boolean, isComplete: boolean) {\n        const p = this._pendingGestureState as Types.MultiTouchGestureState;\n        let multiTouchEvent: Types.MultiTouchGestureState;\n\n        // If the user lifted up one or both fingers, the multitouch gesture\n        // is halted. Just return the existing gesture state.\n        if (!e.touches || e.touches.length !== 2) {\n            multiTouchEvent = p;\n            p.isComplete = isComplete;\n        } else {\n            const centerPageX = (e.touches[0].pageX + e.touches[1].pageX) / 2;\n            const centerPageY = (e.touches[0].pageY + e.touches[1].pageY) / 2;\n            const centerClientX = (e.touches[0].locationX + e.touches[1].locationX) / 2;\n            const centerClientY = (e.touches[0].locationY + e.touches[1].locationY) / 2;\n            const width = Math.abs(e.touches[0].pageX - e.touches[1].pageX);\n            const height = Math.abs(e.touches[0].pageY - e.touches[1].pageY);\n            const distance = this._calcDistance(width, height);\n            const angle = this._calcAngle(e.touches);\n\n            const initialCenterPageX = initializeFromEvent ? centerPageX : p.initialCenterPageX;\n            const initialCenterPageY = initializeFromEvent ? centerPageY : p.initialCenterPageY;\n            const initialCenterClientX = initializeFromEvent ? centerClientX : p.initialCenterClientX;\n            const initialCenterClientY = initializeFromEvent ? centerClientY : p.initialCenterClientY;\n            const initialWidth = initializeFromEvent ? width : p.initialWidth;\n            const initialHeight = initializeFromEvent ? height : p.initialHeight;\n            const initialDistance = initializeFromEvent ? distance : p.initialDistance;\n            const initialAngle = initializeFromEvent ? angle : p.initialAngle;\n\n            const velocityX = initializeFromEvent ? 0 : gestureState.vx;\n            const velocityY = initializeFromEvent ? 0 : gestureState.vy;\n\n            multiTouchEvent = {\n                initialCenterPageX: initialCenterPageX,\n                initialCenterPageY: initialCenterPageY,\n                initialCenterClientX: initialCenterClientX,\n                initialCenterClientY: initialCenterClientY,\n                initialWidth: initialWidth,\n                initialHeight: initialHeight,\n                initialDistance: initialDistance,\n                initialAngle: initialAngle,\n\n                centerPageX: centerPageX,\n                centerPageY: centerPageY,\n                centerClientX: centerClientX,\n                centerClientY: centerClientY,\n                velocityX: velocityX,\n                velocityY: velocityY,\n                width: width,\n                height: height,\n                distance: distance,\n                angle: angle,\n\n                isComplete: isComplete,\n                timeStamp: e.timeStamp,\n                isTouch: !GestureView._isActuallyMouseEvent(e),\n            };\n        }\n\n        if (this.props.onPinchZoom) {\n            this.props.onPinchZoom(multiTouchEvent);\n        }\n\n        if (this.props.onRotate) {\n            this.props.onRotate(multiTouchEvent);\n        }\n\n        return multiTouchEvent;\n    }\n\n    protected _touchEventToTapGestureState(e: TouchEventBasic): Types.TapGestureState {\n        let pageX = e.pageX!;\n        let pageY = e.pageY!;\n        let clientX = e.locationX!;\n        let clientY = e.locationY!;\n\n        // Grab the first touch. If the user adds additional touch events,\n        // we will ignore them. If we use e.pageX/Y, we will be using the average\n        // of the touches, so we'll see a discontinuity.\n        if (e.touches && e.touches.length > 0) {\n            pageX = e.touches[0].pageX;\n            pageY = e.touches[0].pageY;\n            clientX = e.touches[0].locationX;\n            clientY = e.touches[0].locationY;\n        }\n\n        return {\n            timeStamp: this._getEventTimestamp(e),\n            clientX,\n            clientY,\n            pageX,\n            pageY,\n            isTouch: !GestureView._isActuallyMouseEvent(e),\n        };\n    }\n\n    protected _mouseEventToTapGestureState(e: Types.MouseEvent): Types.TapGestureState {\n        const xyOffset = this._getClientXYOffset();\n        return {\n            timeStamp: this._getEventTimestamp(e),\n            clientX: e.clientX - xyOffset.x,\n            clientY: e.clientY - xyOffset.y,\n            pageX: e.pageX || 0,\n            pageY: e.pageY || 0,\n            isTouch: false,\n        };\n    }\n\n    protected _getClientXYOffset(): { x: number; y: number } {\n        return { x: 0, y: 0 };\n    }\n\n    private _sendPanEvent(e: Types.TapGestureState, gestureState: GestureStatePointVelocity,\n            gestureType: GestureType, initializeFromEvent: boolean, isComplete: boolean) {\n        const state = this._pendingGestureState as Types.PanGestureState;\n\n        assert(this._lastGestureStartEvent, 'Gesture start event must not be null.');\n\n        const initialPageX = this._lastGestureStartEvent\n            ? this._lastGestureStartEvent.pageX!\n            : initializeFromEvent ? e.pageX : state.initialPageX;\n        const initialPageY = this._lastGestureStartEvent\n            ? this._lastGestureStartEvent.pageY!\n            : initializeFromEvent ? e.pageY : state.initialPageY;\n        const initialClientX = this._lastGestureStartEvent\n            ? this._lastGestureStartEvent.locationX!\n            : initializeFromEvent ? e.clientX : state.initialClientX;\n        const initialClientY = this._lastGestureStartEvent\n            ? this._lastGestureStartEvent.locationY!\n            : initializeFromEvent ? e.clientY : state.initialClientY;\n\n        const velocityX = initializeFromEvent ? 0 : gestureState.vx;\n        const velocityY = initializeFromEvent ? 0 : gestureState.vy;\n\n        const panEvent: Types.PanGestureState = {\n            initialPageX: initialPageX,\n            initialPageY: initialPageY,\n            initialClientX: initialClientX,\n            initialClientY: initialClientY,\n\n            pageX: e.pageX,\n            pageY: e.pageY,\n            clientX: e.clientX,\n            clientY: e.clientY,\n            velocityX: velocityX,\n            velocityY: velocityY,\n\n            isComplete: isComplete,\n            timeStamp: e.timeStamp,\n            isTouch: !GestureView._isActuallyMouseEvent(this._lastGestureStartEvent),\n        };\n\n        switch (gestureType) {\n            case GestureType.Pan:\n                if (this.props.onPan) {\n                    this.props.onPan(panEvent);\n                }\n                break;\n            case GestureType.PanVertical:\n                if (this.props.onPanVertical) {\n                    this.props.onPanVertical(panEvent);\n                }\n                break;\n            case GestureType.PanHorizontal:\n                if (this.props.onPanHorizontal) {\n                    this.props.onPanHorizontal(panEvent);\n                }\n                break;\n\n            default:\n                // do nothing;\n        }\n\n        return panEvent;\n    }\n\n    private static _toMouseButton(nativeEvent: any): number {\n        if (nativeEvent.button !== undefined) {\n            return nativeEvent.button;\n        } else if (nativeEvent.isRightButton || nativeEvent.IsRightButton) {\n            return 2;\n        } else if (nativeEvent.isMiddleButton || nativeEvent.IsMiddleButton) {\n            return 1;\n        }\n\n        return 0;\n    }\n\n    // Protected only as a hack for supporting keyboard nav clicking from native-common/GestureView\n    protected _sendTapEvent = (tapEvent: Types.TapGestureState) => {\n        // we need to skip tap after succesfull pan event\n        // mouse up would otherwise trigger both pan & tap\n        if (this._shouldSkipNextTap) {\n            this._shouldSkipNextTap = false;\n            return;\n        }\n\n        const button = GestureView._toMouseButton(tapEvent);\n        if (button === 2) {\n            // Always handle secondary button, even if context menu is not set - it shouldn't trigger onTap.\n            if (this.props.onContextMenu) {\n                this.props.onContextMenu(tapEvent);\n            }\n        } else if (this.props.onTap) {\n            this.props.onTap(tapEvent);\n        }\n    };\n\n    protected _sendDoubleTapEvent(e: Types.TapGestureState) {\n        // If user did a double click with different mouse buttons, eg. left (50ms) right\n        // both clicks need to be registered as separate events.\n        const lastButton = GestureView._toMouseButton(this._lastTapEvent!);\n        const button = GestureView._toMouseButton(e);\n        if (lastButton !== button || button === 2) {\n            this._sendTapEvent(this._lastTapEvent!);\n            return;\n        }\n\n        if (this.props.onDoubleTap) {\n            this.props.onDoubleTap(e);\n        }\n\n        this._lastTapEvent = undefined;\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/common/Image.ts",
    "content": "/**\n * Image.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Constants for images.\n */\n\nimport { ImageResizeMode } from './Types';\n\nexport const DEFAULT_RESIZE_MODE: ImageResizeMode = 'contain';\n"
  },
  {
    "path": "src/common/Interfaces.ts",
    "content": "/**\n * Interfaces.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Defines the template for the ReactXP interface that needs to be\n * implemented for each platform.\n */\n\nimport * as React from 'react';\nimport SubscribableEvent from 'subscribableevent';\n\nimport AppConfig from './AppConfig';\nimport * as Types from './Types';\n\nexport { Types };\n\nexport abstract class ActivityIndicator extends React.Component<Types.ActivityIndicatorProps> {}\n\nexport abstract class Alert {\n    abstract show(title: string, message?: string, buttons?: Types.AlertButtonSpec[],\n        options?: Types.AlertOptions): void;\n}\n\nexport abstract class AnimatedComponent<P extends Types.CommonProps<C>, T, C> extends React.Component<P, T> {\n    abstract setNativeProps(props: P): void;\n}\n\nexport abstract class AnimatedImage extends AnimatedComponent<Types.AnimatedImageProps, Types.Stateless, AnimatedImage> {\n}\n\nexport abstract class AnimatedText extends AnimatedComponent<Types.AnimatedTextProps, Types.Stateless, AnimatedText> {\n}\n\nexport abstract class AnimatedTextInput extends AnimatedComponent<Types.AnimatedTextInputProps, Types.Stateless, AnimatedTextInput> {\n}\n\nexport abstract class AnimatedView extends AnimatedComponent<Types.AnimatedViewProps, Types.Stateless, AnimatedView>\n    implements FocusableComponent {\n\n    abstract setFocusRestricted(restricted: boolean): void;\n    abstract setFocusLimited(limited: boolean): void;\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n}\n\nexport abstract class App {\n    supportsExperimentalKeyboardNavigation = false;\n\n    // Initialization\n    initialize(debug: boolean, development: boolean): void {\n        AppConfig.setAppConfig(debug, development);\n    }\n\n    // Activation State\n    abstract getActivationState(): Types.AppActivationState;\n    activationStateChangedEvent = new SubscribableEvent<(state: Types.AppActivationState) => void>();\n\n    // Memory Warnings\n    memoryWarningEvent = new SubscribableEvent<() => void>();\n}\n\nexport abstract class UserInterface {\n    abstract setMainView(element: React.ReactElement<any>): void;\n    abstract registerRootView(viewKey: string, getComponentFunc: Function): void;\n\n    abstract useCustomScrollbars(enable?: boolean): void;\n\n    // Screen Information\n    abstract isHighPixelDensityScreen(): boolean;\n    abstract getPixelRatio(): number;\n\n    // Measurements\n    abstract measureLayoutRelativeToWindow(component: React.Component<any>): Promise<Types.LayoutInfo>;\n    abstract measureLayoutRelativeToAncestor(component: React.Component<any>,\n        ancestor: React.Component<any>): Promise<Types.LayoutInfo>;\n    abstract measureWindow(rootViewId?: string): Types.Dimensions;\n\n    // Content Size Multiplier\n    abstract getContentSizeMultiplier(): Promise<number>;\n    contentSizeMultiplierChangedEvent = new SubscribableEvent<(multiplier: number) => void>();\n\n    // On-screen Keyboard\n    abstract dismissKeyboard(): void;\n\n    // Latency Warnings\n    abstract enableTouchLatencyEvents(latencyThresholdMs: number): void;\n    touchLatencyEvent = new SubscribableEvent<(observedLatencyMs: number) => void>();\n\n    // Keyboard navigation\n    abstract isNavigatingWithKeyboard(): boolean;\n    keyboardNavigationEvent = new SubscribableEvent<(isNavigatingWithKeyboard: boolean) => void>();\n}\n\nexport abstract class Modal {\n    abstract isDisplayed(modalId?: string): boolean;\n    abstract show(modal: React.ReactElement<Types.ViewProps>, modalId: string, options?: Types.ModalOptions): void;\n    abstract dismiss(modalId: string): void;\n    abstract dismissAll(): void;\n}\n\nexport abstract class Popup {\n    abstract show(options: Types.PopupOptions, popupId: string, delay?: number): boolean;\n    abstract autoDismiss(popupId: string, delay?: number): void;\n    abstract dismiss(popupId: string): void;\n    abstract dismissAll(): void;\n    abstract isDisplayed(popupId?: string): boolean;\n}\n\nexport abstract class Linking {\n    // Incoming deep links\n    abstract getInitialUrl(): Promise<string | undefined>;\n    deepLinkRequestEvent = new SubscribableEvent<(url: string) => void>();\n\n    // Outgoing deep links\n    abstract openUrl(url: string): Promise<void>;\n    abstract launchSms(smsData: Types.SmsInfo): Promise<void>;\n    abstract launchEmail(emailData: Types.EmailInfo): Promise<void>;\n\n    protected abstract _createEmailUrl(emailInfo: Types.EmailInfo): string;\n}\n\nexport abstract class Accessibility {\n    abstract isScreenReaderEnabled(): boolean;\n    abstract isHighContrastEnabled(): boolean;\n    abstract announceForAccessibility(announcement: string): void;\n    screenReaderChangedEvent = new SubscribableEvent<(isEnabled: boolean) => void>();\n    highContrastChangedEvent = new SubscribableEvent<(isEnabled: boolean) => void>();\n}\n\nexport interface FocusableComponent {\n    focus(): void;\n    requestFocus(): void;\n    blur(): void;\n}\n\nexport abstract class Button extends React.Component<Types.ButtonProps> implements FocusableComponent {\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n}\n\nexport abstract class Picker extends React.Component<Types.PickerProps, Types.Stateless> {}\n\nexport class Component<P, T> extends React.Component<P, T> {}\n\nexport interface ImageConstructor {\n    new (props: Types.ImageProps): Image;\n\n    prefetch(url: string): Promise<boolean>;\n    getMetadata(url: string): Promise<Types.ImageMetadata>;\n}\n\nexport abstract class Image extends React.Component<Types.ImageProps> {\n    abstract getNativeWidth(): number | undefined;\n    abstract getNativeHeight(): number | undefined;\n}\n\nexport abstract class Clipboard {\n    abstract setText(text: string): void;\n    abstract getText(): Promise<string>;\n}\n\nexport abstract class Link extends React.Component<Types.LinkProps> implements FocusableComponent {\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n}\n\nexport abstract class Storage {\n    abstract getItem(key: string): Promise<string | undefined>;\n    abstract setItem(key: string, value: string): Promise<void>;\n    abstract removeItem(key: string): Promise<void>;\n    abstract clear(): Promise<void>;\n}\n\nexport abstract class Location {\n    abstract isAvailable(): boolean;\n    abstract setConfiguration(config: LocationConfiguration): void;\n    abstract getCurrentPosition(options?: PositionOptions): Promise<Position>;\n    abstract watchPosition(successCallback: Types.LocationSuccessCallback, errorCallback?: Types.LocationFailureCallback,\n        options?: PositionOptions): Promise<Types.LocationWatchId>;\n    abstract clearWatch(watchID: Types.LocationWatchId): void;\n}\n\nexport interface LocationConfiguration {\n    // if true, assumes permission is already granted\n    skipPermissionRequests: boolean;\n}\n\nexport abstract class Platform {\n    abstract getType(): Types.PlatformType;\n    abstract select<T>(specifics: { [ platform in Types.PlatformType | 'default' ]?: T }): T | undefined;\n}\n\nexport abstract class Input {\n    backButtonEvent = new SubscribableEvent<() => boolean>(true);\n    keyDownEvent = new SubscribableEvent<(e: Types.KeyboardEvent) => boolean>(true);\n    keyUpEvent = new SubscribableEvent<(e: Types.KeyboardEvent) => boolean>(true);\n}\n\nexport interface ScrollViewConstructor {\n    new(props: Types.ScrollViewProps): ScrollView;\n}\n\nexport interface ScrollView extends React.Component<Types.ScrollViewProps> {\n    setScrollTop(scrollTop: number, animate?: boolean): void;\n    setScrollLeft(scrollLeft: number, animate?: boolean): void;\n}\n\nexport abstract class StatusBar {\n    abstract isOverlay(): boolean;\n    abstract setHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void;\n    abstract setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void;\n    abstract setNetworkActivityIndicatorVisible(value: boolean): void;\n    abstract setBackgroundColor(color: string, animated: boolean): void;\n    abstract setTranslucent(translucent: boolean): void;\n}\n\nexport abstract class Styles {\n    abstract combine<T>(ruleSet1: Types.StyleRuleSetRecursive<T> | undefined,\n        ruleSet2?: Types.StyleRuleSetRecursive<T>): Types.StyleRuleSetOrArray<T> | undefined;\n    abstract createViewStyle(ruleSet: Types.ViewStyle, cacheStyle?: boolean): Types.ViewStyleRuleSet;\n    abstract createAnimatedViewStyle(ruleSet: Types.AnimatedViewStyle): Types.AnimatedViewStyleRuleSet;\n    abstract createScrollViewStyle(ruleSet: Types.ScrollViewStyle, cacheStyle?: boolean): Types.ScrollViewStyleRuleSet;\n    abstract createButtonStyle(ruleSet: Types.ButtonStyle, cacheStyle?: boolean): Types.ButtonStyleRuleSet;\n    abstract createTextStyle(ruleSet: Types.TextStyle, cacheStyle?: boolean): Types.TextStyleRuleSet;\n    abstract createAnimatedTextStyle(ruleSet: Types.AnimatedTextStyle): Types.AnimatedTextStyleRuleSet;\n    abstract createTextInputStyle(ruleSet: Types.TextInputStyle, cacheStyle?: boolean): Types.TextInputStyleRuleSet;\n    abstract createAnimatedTextInputStyle(ruleSet: Types.AnimatedTextInputStyle): Types.AnimatedTextInputStyleRuleSet;\n    abstract createImageStyle(ruleSet: Types.ImageStyle, cacheStyle?: boolean): Types.ImageStyleRuleSet;\n    abstract createAnimatedImageStyle(ruleSet: Types.AnimatedImageStyle): Types.AnimatedImageStyleRuleSet;\n    abstract createLinkStyle(ruleSet: Types.LinkStyleRuleSet, cacheStyle?: boolean): Types.LinkStyleRuleSet;\n    abstract createPickerStyle(ruleSet: Types.PickerStyle, cacheStyle?: boolean): Types.PickerStyleRuleSet;\n\n    // This method isn't part of the documented ReactXP interface and shouldn't be used by\n    // app-level code, but it is needed for some ReactXP extensions (e.g. reactxp-imagesvg),\n    // so we export it here.\n    abstract getCssPropertyAliasesCssStyle(): { [key: string]: string };\n}\n\nexport abstract class Text extends React.Component<Types.TextProps> implements FocusableComponent {\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n    abstract getSelectedText(): string;\n}\n\nexport abstract class TextInput extends React.Component<Types.TextInputProps> implements FocusableComponent {\n    abstract setAccessibilityFocus(): void;\n    abstract isFocused(): boolean;\n    abstract selectAll(): void;\n    abstract selectRange(start: number, end: number): void;\n    abstract getSelectionRange(): {\n        start: number;\n        end: number;\n    };\n    abstract setValue(value: string): void;\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n}\n\nexport abstract class UserPresence {\n    abstract isUserPresent(): boolean;\n    userPresenceChangedEvent = new SubscribableEvent<(isPresent: boolean) => void>();\n}\n\nexport abstract class ViewBase<P, S = {}> extends React.Component<P, S> {}\n\nexport abstract class View extends ViewBase<Types.ViewProps> implements FocusableComponent {\n    abstract setFocusRestricted(restricted: boolean): void;\n    abstract setFocusLimited(limited: boolean): void;\n    abstract focus(): void;\n    abstract requestFocus(): void;\n    abstract blur(): void;\n}\n\nexport abstract class GestureView extends ViewBase<Types.GestureViewProps> {}\n\nexport interface Animated {\n    Image: typeof AnimatedImage;\n    Text: typeof AnimatedText;\n    TextInput: typeof AnimatedTextInput;\n    View: typeof AnimatedView;\n    Easing: Types.Animated.Easing;\n    timing: Types.Animated.TimingFunction;\n    parallel: Types.Animated.ParallelFunction;\n    sequence: Types.Animated.SequenceFunction;\n\n    Value: typeof Types.AnimatedValue;\n    createValue: (initialValue: number) => Types.AnimatedValue;\n    interpolate: (value: Types.AnimatedValue, inputRange: number[], outputRange: string[]) => Types.InterpolatedValue;\n}\n\nexport interface International {\n    allowRTL(allow: boolean): void;\n    forceRTL(force: boolean): void;\n    isRTL(): boolean;\n}\n"
  },
  {
    "path": "src/common/Linking.ts",
    "content": "/**\n * Linking.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common implementation for deep linking.\n */\n\nimport * as RX from './Interfaces';\nimport { filter } from './lodashMini';\n\n// Collection of Regex that help validate an email.\n// The name can be any of these characters.\nconst emailNameRegex = /^[a-z0-9!#$%&'*+/=?^_`{|}~.@-]+$/i;\n// However, the name cannot contain '..', or start/end with '.'.\nconst emailNameConstraintViolationRegex = /\\.\\.|^\\.|\\.$/i;\n// The host is limited to these characters.\nconst emailHostRegex = /^[a-z0-9.-]+$/i;\n// However, the host cannot contain '..', start/end with '.', or have any (sub)domain start/end with '-'.\nconst emailHostConstraintViolationRegex = /\\.\\.|^[.-]|[.-]$|\\.-|-\\./i;\n\nexport abstract class Linking extends RX.Linking {\n    protected abstract _openUrl(url: string): Promise<void>;\n\n    // Launches SMS app\n    launchSms(phoneInfo: RX.Types.SmsInfo): Promise<void> {\n        // Format phone info\n        const phoneUrl = this._createSmsUrl(phoneInfo);\n        return this._openUrl(phoneUrl);\n    }\n\n    // Opens url\n    openUrl(url: string): Promise<void> {\n        return this._openUrl(url);\n    }\n\n    // Escaped Email uri - mailto:[emailAddress]?subject=<emailSubject>&body=<emailBody>\n    protected _createEmailUrl(emailInfo: RX.Types.EmailInfo): string {\n        let emailUrl = 'mailto:';\n        let validEmails: string[];\n\n        if (emailInfo.to && emailInfo.to.length > 0) {\n            validEmails = this._filterValidEmails(emailInfo.to);\n            emailUrl += validEmails.join(',');\n        }\n\n        emailUrl += '?';\n\n        if (emailInfo.cc && emailInfo.cc.length > 0) {\n            validEmails = this._filterValidEmails(emailInfo.cc);\n            emailUrl += 'cc=' + validEmails.join(',') + '&';\n        }\n\n        if (emailInfo.bcc && emailInfo.bcc.length > 0) {\n            validEmails = this._filterValidEmails(emailInfo.bcc);\n            emailUrl += 'bcc=' + validEmails.join(',') + '&';\n        }\n\n        if (emailInfo.subject) {\n            emailUrl += 'subject=' + encodeURIComponent(emailInfo.subject) + '&';\n        }\n\n        if (emailInfo.body) {\n            emailUrl += 'body=' + encodeURIComponent(emailInfo.body);\n        }\n        return emailUrl;\n    }\n\n    // Escaped SMS uri - sms:<phoneNumber>?body=<messageString>\n    protected _createSmsUrl(smsInfo: RX.Types.SmsInfo): string {\n        let smsUrl = 'sms:';\n        if (smsInfo.phoneNumber) {\n            smsUrl += encodeURI(smsInfo.phoneNumber);\n        }\n\n        if (smsInfo.body) {\n            smsUrl += '?body=' + encodeURIComponent(smsInfo.body);\n        }\n        return smsUrl;\n    }\n\n    private _isEmailValid(email: string): boolean {\n        // Emails have a max length of 254, and the smallest email looks like 'a@io' (with length 4).\n        if (!email || email.length > 254 || email.length < 4) {\n            return false;\n        }\n        // Note: using 'last' since '@' is valid in the name (but not the host, otherwise it would be impossible to parse).\n        const lastAtIndex = email.lastIndexOf('@');\n        // Email must have an '@', and there must be characters on each side of the '@'.\n        // Note: the host must have at least two characters.\n        if (lastAtIndex === -1 || lastAtIndex === 0 || lastAtIndex >= email.length - 2) {\n            return false;\n        }\n\n        const name = email.substring(0, lastAtIndex);\n        const host = email.substring(lastAtIndex + 1);\n\n        return !emailNameConstraintViolationRegex.test(name)\n            && !emailHostConstraintViolationRegex.test(host)\n            && emailNameRegex.test(name)\n            && emailHostRegex.test(host);\n    }\n\n    private _filterValidEmails(emails: string[]): string[] {\n        return filter(emails, e => this._isEmailValid(e));\n    }\n}\n"
  },
  {
    "path": "src/common/Location.ts",
    "content": "/**\n * Location.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Methods to fetch the user's location.\n */\n\nimport * as RX from './Interfaces';\nimport { Defer } from './utils/PromiseDefer';\n\nexport class Location extends RX.Location {\n    setConfiguration(config: RX.LocationConfiguration): void {\n        if (this.isAvailable()) {\n            // Work around the fact \"geolocation\" type definition in ES6 lib\n            // doesn't declare the RN-specific setRNConfiguration setter.\n            const configSetter: (config: RX.LocationConfiguration) => void =\n                (navigator.geolocation as any).setRNConfiguration;\n            if (configSetter) {\n                configSetter(config);\n            }\n        }\n    }\n\n    // Check if a geolocation service is available.\n    isAvailable(): boolean {\n        return !!('geolocation' in navigator);\n    }\n\n    // Get the current location of the user. This method returns a promise that either\n    // resolves to the position or rejects with an error code.\n    getCurrentPosition(options?: PositionOptions): Promise<Position> {\n        if (!this.isAvailable()) {\n            const error: PositionError = {\n                code: RX.Types.LocationErrorType.PositionUnavailable,\n                message: 'Position unavailable because device does not support it.',\n                PERMISSION_DENIED: 0,\n                POSITION_UNAVAILABLE: 1,\n                TIMEOUT: 0,\n            };\n            return Promise.reject(error);\n        }\n\n        const deferred = new Defer<Position>();\n        let reportedError = false;\n\n        navigator.geolocation.getCurrentPosition((position: Position) => {\n            deferred.resolve(position);\n        }, (error: PositionError) => {\n            // We need to protect against a known bug on some platforms where\n            // a timeout error is reported after other types of errors (e.g.\n            // the user hasn't granted access).\n            if (!reportedError) {\n                deferred.reject(error);\n                reportedError = true;\n            }\n        }, options);\n\n        return deferred.promise();\n    }\n\n    // Get the current location of the user on a repeating basis. This method returns\n    // a promise that resolves to a watcher id or rejects with an error code. If resolved,\n    // future locations and errors will be piped through the provided callbacks.\n    watchPosition(successCallback: RX.Types.LocationSuccessCallback, errorCallback?: RX.Types.LocationFailureCallback,\n            options?: PositionOptions): Promise<RX.Types.LocationWatchId> {\n        if (!this.isAvailable()) {\n            return Promise.reject<RX.Types.LocationWatchId>(RX.Types.LocationErrorType.PositionUnavailable);\n        }\n\n        const watchId = navigator.geolocation.watchPosition((position: Position) => {\n            successCallback(position);\n        }, (error: PositionError) => {\n            if (errorCallback) {\n                errorCallback(error.code as RX.Types.LocationErrorType);\n            }\n        }, options);\n\n        return Promise.resolve<RX.Types.LocationWatchId>(watchId);\n    }\n\n    // Clears a location watcher from watchPosition.\n    clearWatch(watchID: RX.Types.LocationWatchId): void {\n        navigator.geolocation.clearWatch(watchID);\n    }\n}\n\nexport default new Location();\n"
  },
  {
    "path": "src/common/ModuleInterface.ts",
    "content": "/**\n * ModuleInterface.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Defines a common base module type information set for all platforms to implement.\n */\n\nimport * as React from 'react';\n\nimport * as RX from './Interfaces';\n\nexport declare module ReactXP {\n    export type Accessibility = RX.Accessibility;\n    export let Accessibility: RX.Accessibility;\n    export type ActivityIndicator = RX.ActivityIndicator;\n    export let ActivityIndicator: typeof RX.ActivityIndicator;\n    export type Alert = RX.Alert;\n    export let Alert: RX.Alert;\n    export type App = RX.App;\n    export let App: RX.App;\n    export type Button = RX.Button;\n    export let Button: typeof RX.Button;\n    export type Picker = RX.Picker;\n    export let Picker: typeof RX.Picker;\n    export type Clipboard = RX.Clipboard;\n    export let Clipboard: RX.Clipboard;\n    export type GestureView = RX.GestureView;\n    export let GestureView: typeof RX.GestureView;\n    export type Image = RX.Image;\n    export let Image: RX.ImageConstructor;\n    export type Input = RX.Input;\n    export let Input: RX.Input;\n    export type International = RX.International;\n    export let International: RX.International;\n    export type Link = RX.Link;\n    export let Link: typeof RX.Link;\n    export type Linking = RX.Linking;\n    export let Linking: RX.Linking;\n    export type Location = RX.Location;\n    export let Location: RX.Location;\n    export type Modal = RX.Modal;\n    export let Modal: RX.Modal;\n    export type Platform = RX.Platform;\n    export let Platform: RX.Platform;\n    export type Popup = RX.Popup;\n    export let Popup: RX.Popup;\n    export type ScrollView = RX.ScrollView;\n    export let ScrollView: RX.ScrollViewConstructor;\n    export type StatusBar = RX.StatusBar;\n    export let StatusBar: RX.StatusBar;\n    export type Storage = RX.Storage;\n    export let Storage: RX.Storage;\n    export type Styles = RX.Styles;\n    export let Styles: RX.Styles;\n    export type Text = RX.Text;\n    export let Text: typeof RX.Text;\n    export type TextInput = RX.TextInput;\n    export let TextInput: typeof RX.TextInput;\n    export type UserInterface = RX.UserInterface;\n    export let UserInterface: RX.UserInterface;\n    export type UserPresence = RX.UserPresence;\n    export let UserPresence: RX.UserPresence;\n    export type View = RX.View;\n    export let View: typeof RX.View;\n\n    export type Animated = RX.Animated;\n    export let Animated: RX.Animated;\n\n    export import CommonProps = RX.Types.CommonProps;\n    export import CommonStyledProps = RX.Types.CommonStyledProps;\n    export import Types = RX.Types;\n\n    export import Component = React.Component;\n    export let createElement: typeof React.createElement;\n    export let Children: typeof React.Children;\n    export let __spread: any;\n}\n"
  },
  {
    "path": "src/common/PopupContainerViewBase.tsx",
    "content": "/**\n * PopupContainerViewBase.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common parent of all components rendered into a popup. Calls onShow and onHide\n * callbacks when the popup is hidden (i.e. \"closed\" but still rendered as hidden)\n * and re-shown. Abstract class to be overriden per platform.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport FocusManagerBase from './utils/FocusManager';\nimport { Types } from './Interfaces';\nimport { Dimensions, PopupPosition } from './Types';\n\nexport interface PopupContainerViewBaseProps<C> extends Types.CommonProps<C> {\n    hidden?: boolean;\n}\n\nexport interface PopupContainerViewContext {\n    focusManager?: FocusManagerBase;\n}\n\nexport interface PopupComponent {\n    onShow: () => void;\n    onHide: () => void;\n}\n\nexport interface RecalcResult {\n    // Absolute window location of the popup\n    popupY: number;\n    popupX: number;\n\n    // Top or left offset of the popup relative to the center of the anchor\n    anchorOffset: number;\n\n    // Position of popup relative to its anchor (top, bottom, left, right)\n    anchorPosition: PopupPosition;\n\n    // Constrained dimensions of the popup once it is placed\n    constrainedPopupWidth: number;\n    constrainedPopupHeight: number;\n}\n\n// Width of the \"alley\" around popups so they don't get too close to the boundary of the screen boundary.\nconst ALLEY_WIDTH = 2;\n\n// How close to the edge of the popup should we allow the anchor offset to get before\n// attempting a different position?\nconst MIN_ANCHOR_OFFSET = 16;\n\n// Undefined response means to dismiss the popup\nexport function recalcPositionFromLayoutData(windowDims: Dimensions, anchorRect: ClientRect, popupRect: Dimensions,\n        positionPriorities?: PopupPosition[], useInnerPositioning?: boolean): RecalcResult | undefined {\n    // If the anchor has disappeared, dismiss the popup.\n    if (!(anchorRect.width > 0 && anchorRect.height > 0)) {\n        return undefined;\n    }\n\n    // If the anchor is no longer in the window's bounds, cancel the popup.\n    if (anchorRect.left >= windowDims.width || anchorRect.right <= 0 ||\n            anchorRect.bottom <= 0 || anchorRect.top >= windowDims.height) {\n        return undefined;\n    }\n\n    let positionsToTry = positionPriorities;\n    if (!positionsToTry || positionsToTry.length === 0) {\n        positionsToTry = ['bottom', 'right', 'top', 'left'];\n    }\n    if (positionsToTry.length === 1 && positionsToTry[0] === 'context') {\n        // Context only works with exact matches, so fall back to walking around the compass if it doesn't fit exactly.\n        positionsToTry.push('bottom', 'right', 'top', 'left');\n    }\n\n    if (useInnerPositioning) {\n        // If the popup is meant to be shown inside the anchor we need to recalculate\n        // the position differently.\n        return recalcInnerPosition(anchorRect, positionsToTry[0], popupRect.width, popupRect.height);\n    }\n\n    // Start by assuming that we'll be unconstrained.\n    const result: RecalcResult = {\n        popupX: 0,\n        popupY: 0,\n        anchorOffset: 0,\n        anchorPosition: 'top',\n        constrainedPopupWidth: popupRect.width,\n        constrainedPopupHeight: popupRect.height,\n    };\n\n    let foundPerfectFit = false;\n    let foundPartialFit = false;\n\n    positionsToTry.forEach(pos => {\n        if (!foundPerfectFit) {\n            let absX = 0;\n            let absY = 0;\n            let anchorOffset = 0;\n            let constrainedWidth = 0;\n            let constrainedHeight = 0;\n\n            switch (pos) {\n                case 'bottom':\n                    absY = anchorRect.bottom;\n                    absX = anchorRect.left + (anchorRect.width - popupRect.width) / 2;\n                    anchorOffset = popupRect.width / 2;\n\n                    if (popupRect.height <= windowDims.height - ALLEY_WIDTH - anchorRect.bottom) {\n                        foundPerfectFit = true;\n                    } else if (!foundPartialFit) {\n                        constrainedHeight = windowDims.height - ALLEY_WIDTH - anchorRect.bottom;\n                    }\n                    break;\n\n                case 'top':\n                    absY = anchorRect.top - popupRect.height;\n                    absX = anchorRect.left + (anchorRect.width - popupRect.width) / 2;\n                    anchorOffset = popupRect.width / 2;\n\n                    if (popupRect.height <= anchorRect.top - ALLEY_WIDTH) {\n                        foundPerfectFit = true;\n                    } else if (!foundPartialFit) {\n                        constrainedHeight = anchorRect.top - ALLEY_WIDTH;\n                    }\n                    break;\n\n                case 'right':\n                    absX = anchorRect.right;\n                    absY = anchorRect.top + (anchorRect.height - popupRect.height) / 2;\n                    anchorOffset = popupRect.height / 2;\n\n                    if (popupRect.width <= windowDims.width - ALLEY_WIDTH - anchorRect.right) {\n                        foundPerfectFit = true;\n                    } else if (!foundPartialFit) {\n                        constrainedWidth = windowDims.width - ALLEY_WIDTH - anchorRect.right;\n                    }\n                    break;\n\n                case 'left':\n                    absX = anchorRect.left - popupRect.width;\n                    absY = anchorRect.top + (anchorRect.height - popupRect.height) / 2;\n                    anchorOffset = popupRect.height / 2;\n\n                    if (popupRect.width <= anchorRect.left - ALLEY_WIDTH) {\n                        foundPerfectFit = true;\n                    } else if (!foundPartialFit) {\n                        constrainedWidth = anchorRect.left - ALLEY_WIDTH;\n                    }\n                    break;\n\n                case 'context': {\n                    // Search for perfect fits on the LR, LL, TR, and TL corners.\n                    const fitsAbove = anchorRect.top - popupRect.height >= ALLEY_WIDTH;\n                    const fitsBelow = anchorRect.top + anchorRect.height + popupRect.height <= windowDims.height - ALLEY_WIDTH;\n                    const fitsLeft = anchorRect.left - popupRect.width >= ALLEY_WIDTH;\n                    const fitsRight = anchorRect.left + anchorRect.width + popupRect.width <= windowDims.width - ALLEY_WIDTH;\n                    if (fitsBelow && fitsRight) {\n                        foundPerfectFit = true;\n                        absX = anchorRect.left + anchorRect.width;\n                        absY = anchorRect.top + anchorRect.height;\n                    } else if (fitsBelow && fitsLeft) {\n                        foundPerfectFit = true;\n                        absX = anchorRect.left - popupRect.width;\n                        absY = anchorRect.top + anchorRect.height;\n                    } else if (fitsAbove && fitsRight) {\n                        foundPerfectFit = true;\n                        absX = anchorRect.left + anchorRect.width;\n                        absY = anchorRect.top - popupRect.height;\n                    } else if (fitsAbove && fitsLeft) {\n                        foundPerfectFit = true;\n                        absX = anchorRect.left - popupRect.width;\n                        absY = anchorRect.top - popupRect.height;\n                    }\n                    break;\n                }\n            }\n\n            const effectiveWidth = constrainedWidth || popupRect.width;\n            const effectiveHeight = constrainedHeight || popupRect.height;\n\n            // Make sure we're not hanging off the bounds of the window.\n            if (absX < ALLEY_WIDTH) {\n                if (pos === 'top' || pos === 'bottom') {\n                    anchorOffset -= ALLEY_WIDTH - absX;\n                    if (anchorOffset < MIN_ANCHOR_OFFSET || anchorOffset > effectiveWidth - MIN_ANCHOR_OFFSET) {\n                        foundPerfectFit = false;\n                    }\n                }\n                absX = ALLEY_WIDTH;\n            } else if (absX > windowDims.width - ALLEY_WIDTH - effectiveWidth) {\n                if (pos === 'top' || pos === 'bottom') {\n                    anchorOffset -= (windowDims.width - ALLEY_WIDTH - effectiveWidth - absX);\n                    if (anchorOffset < MIN_ANCHOR_OFFSET || anchorOffset > effectiveWidth - MIN_ANCHOR_OFFSET) {\n                        foundPerfectFit = false;\n                    }\n                }\n                absX = windowDims.width - ALLEY_WIDTH - effectiveWidth;\n            }\n\n            if (absY < ALLEY_WIDTH) {\n                if (pos === 'right' || pos === 'left') {\n                    anchorOffset += absY - ALLEY_WIDTH;\n                    if (anchorOffset < MIN_ANCHOR_OFFSET || anchorOffset > effectiveHeight - MIN_ANCHOR_OFFSET) {\n                        foundPerfectFit = false;\n                    }\n                }\n                absY = ALLEY_WIDTH;\n            } else if (absY > windowDims.height - ALLEY_WIDTH - effectiveHeight) {\n                if (pos === 'right' || pos === 'left') {\n                    anchorOffset -= (windowDims.height - ALLEY_WIDTH - effectiveHeight - absY);\n                    if (anchorOffset < MIN_ANCHOR_OFFSET || anchorOffset > effectiveHeight - MIN_ANCHOR_OFFSET) {\n                        foundPerfectFit = false;\n                    }\n                }\n                absY = windowDims.height - ALLEY_WIDTH - effectiveHeight;\n            }\n\n            if (foundPerfectFit || effectiveHeight > 0 || effectiveWidth > 0) {\n                result.popupY = absY;\n                result.popupX = absX;\n                result.anchorOffset = anchorOffset;\n                result.anchorPosition = pos;\n                result.constrainedPopupWidth = effectiveWidth;\n                result.constrainedPopupHeight = effectiveHeight;\n\n                foundPartialFit = true;\n            }\n        }\n    });\n\n    return result;\n}\n\nfunction recalcInnerPosition(anchorRect: ClientRect, positionToUse: PopupPosition, popupWidth: number, popupHeight: number) {\n    // For inner popups we only accept the first position of the priorities since there\n    // should always be room for the bubble.\n    let popupX = 0;\n    let popupY = 0;\n    let anchorOffset = 0;\n    switch (positionToUse) {\n        case 'top':\n            popupY = anchorRect.top + anchorRect.height - popupHeight;\n            popupX = anchorRect.left + anchorRect.height / 2 - popupWidth / 2;\n            anchorOffset = popupWidth / 2;\n            break;\n\n        case 'bottom':\n            popupY = anchorRect.top + popupHeight;\n            popupX = anchorRect.left + anchorRect.height / 2 - popupWidth / 2;\n            anchorOffset = popupWidth / 2;\n            break;\n\n        case 'left':\n            popupY = anchorRect.top + anchorRect.height / 2 - popupHeight / 2;\n            popupX = anchorRect.left + anchorRect.width - popupWidth;\n            anchorOffset = popupHeight / 2;\n            break;\n\n        case 'right':\n            popupY = anchorRect.top + anchorRect.height / 2 - popupHeight / 2;\n            popupX = anchorRect.left;\n            anchorOffset = popupHeight / 2;\n            break;\n\n        case 'context':\n            throw new Error('Context popup mode not allowed with inner positioning');\n    }\n\n    const result: RecalcResult = {\n        popupX,\n        popupY,\n        anchorOffset,\n        anchorPosition: positionToUse,\n        constrainedPopupWidth: popupWidth,\n        constrainedPopupHeight: popupHeight,\n    };\n    return result;\n}\n\nexport abstract class PopupContainerViewBase<P extends PopupContainerViewBaseProps<C>, S, C> extends React.Component<P, S> {\n    static contextTypes: React.ValidationMap<any> = {\n        focusManager: PropTypes.object,\n    };\n    static childContextTypes: React.ValidationMap<any> = {\n        focusManager: PropTypes.object,\n        popupContainer: PropTypes.object,\n    };\n\n    private _popupComponentStack: PopupComponent[] = [];\n\n    constructor(props: P, context?: PopupContainerViewContext) {\n        super(props, context);\n    }\n\n    getChildContext() {\n        return {\n            focusManager: this.context.focusManager,\n            popupContainer: this as PopupContainerViewBase<P, S, C>,\n        };\n    }\n\n    registerPopupComponent(onShow: () => void, onHide: () => void): PopupComponent {\n        const component = {\n            onShow,\n            onHide,\n        };\n        this._popupComponentStack.push(component);\n        return component;\n    }\n\n    unregisterPopupComponent(component: PopupComponent) {\n        this._popupComponentStack = this._popupComponentStack.filter(c => c !== component);\n    }\n\n    isHidden(): boolean {\n        return !!this.props.hidden;\n    }\n\n    componentDidUpdate(prevProps: P, prevState: S) {\n        if (prevProps.hidden && !this.props.hidden) {\n            // call onShow on all registered components (iterate front to back)\n            for (let i = 0; i < this._popupComponentStack.length; i++) {\n                this._popupComponentStack[i].onShow();\n            }\n        }\n        if (!prevProps.hidden && this.props.hidden) {\n            // call onHide on all registered components (iterate back to front)\n            for (let i = this._popupComponentStack.length - 1; i >= 0; i--) {\n                this._popupComponentStack[i].onHide();\n            }\n        }\n    }\n\n    abstract render(): JSX.Element;\n}\n\nexport default PopupContainerViewBase;\n"
  },
  {
    "path": "src/common/StyleLeakDetector.ts",
    "content": "/**\n * StyleLeakDetector.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Detects style memory-leaks in react-native.\n * To fix warning you could:\n *  - use not cached styles by providing cacheStyle == false to Style.create... method\n *  - for colors you could use StylesRegestry component\n *  - for rx component you could temporary disable validation by calling pause method and restore by calling resume,\n *    but please make sure that it doesn't leaks first please\n */\n\nimport AppConfig from './AppConfig';\nimport { Types } from './Interfaces';\nimport { Dictionary, sortBy } from './lodashMini';\n\nexport class StyleLeakDetector {\n    private _fingerprintRegistry: {[key: string]: string} = {};\n\n    private _getFingerprint<T extends Types.ViewAndImageCommonStyle>(object: T): string {\n        return JSON.stringify(this._sortAny(object));\n    }\n\n    /**\n     * We need to sort objects before using JSON.stringify as otherwise objects\n     * {a: 1, b: 2} and {b: 2, a: 1} would have a different fingerprints\n     */\n    private _sortAny(object: any): any {\n        if (object instanceof Array) {\n            return this._sortArray(object);\n        } else if (object instanceof Object) {\n            return this._sortObject(object);\n        } else {\n            return object;\n        }\n    }\n\n    private _sortObject(object: Dictionary<any>): Dictionary<any> {\n        const result: Dictionary<any> = {};\n        let keys: string [] = [];\n        for (const key in object) {\n            if (object.hasOwnProperty(key)) {\n                keys.push(key);\n            }\n        }\n\n        keys = sortBy(keys);\n        const keysLength = keys.length;\n        for (let i = 0; i < keysLength; i++) {\n            const key: any = keys[i];\n            const value: any = object[key];\n            result[key] = this._sortAny(value);\n        }\n\n        return result;\n    }\n\n    private _sortArray(object: any[]): any[] {\n        const length = object.length;\n        for (let i = 0; i < length; i++) {\n            object[i] = this._sortAny(object[i]);\n        }\n\n        return object;\n    }\n\n    protected isDisabled(): boolean {\n        return false;\n    }\n\n    detectLeaks<T extends Types.ViewAndImageCommonStyle>(style: T): void {\n        if (AppConfig.isDevelopmentMode() && !this.isDisabled()) {\n            const error: any = new Error();\n            // we detect leaks on chrome and firefox only, other browser have now this member\n            const stack = error.stack;\n            if (stack) {\n                const styleAllocationId = stack.toString() + this._getFingerprint(style);\n                const firstAllocation = this._fingerprintRegistry[styleAllocationId];\n                if (firstAllocation) {\n                    console.warn('Possible style leak of: ', style, 'first allocation: ', firstAllocation);\n                } else {\n                    this._fingerprintRegistry[styleAllocationId] = stack;\n                }\n            }\n        }\n    }\n}\n\nexport default new StyleLeakDetector();\n"
  },
  {
    "path": "src/common/Types.ts",
    "content": "/**\n* Types.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Type definitions for ReactXP framework.\n*/\n\nimport * as React from 'react';\n\n// Use only for type data\nimport * as RX from './Interfaces';\n\nexport { default as SubscribableEvent, SubscriptionToken } from 'subscribableevent';\n\nexport type ReactNode = React.ReactNode;\n\n// Some RX components contain render logic in the abstract classes located in rx/common. That render logic\n// depends on using a platform specific React library (web vs native). Thus, we need an interface to abstract\n// this detail away from the components' common implementation.\nexport interface ReactInterface {\n    createElement<P>(type: string, props?: P, ...children: ReactNode[]): React.ReactElement<P>;\n}\n\n// ------------------------------------------------------------\n// React Native Flexbox styles 0.14.2\n// ------------------------------------------------------------\n\nexport interface FlexboxParentStyle {\n    flexDirection?: 'column' | 'row' | 'column-reverse' | 'row-reverse';\n\n    alignSelf?: 'auto' | 'flex-start' | 'flex-end' | 'center' | 'stretch';\n\n    borderWidth?: number;\n    borderTopWidth?: number;\n    borderRightWidth?: number;\n    borderBottomWidth?: number;\n    borderLeftWidth?: number;\n\n    height?: number;\n    width?: number;\n\n    top?: number;\n    right?: number;\n    bottom?: number;\n    left?: number;\n\n    flexGrow?: number;\n    flexShrink?: number;\n    flexBasis?: number;\n    flex?: number;\n\n    maxHeight?: number;\n    maxWidth?: number;\n    minHeight?: number;\n    minWidth?: number;\n\n    margin?: number;\n    marginHorizontal?: number;\n    marginVertical?: number;\n    marginTop?: number;\n    marginRight?: number;\n    marginBottom?: number;\n    marginLeft?: number;\n\n    padding?: number;\n    paddingHorizontal?: number;\n    paddingVertical?: number;\n    paddingTop?: number;\n    paddingRight?: number;\n    paddingBottom?: number;\n    paddingLeft?: number;\n\n    position?: 'absolute' | 'relative';\n}\n\n// These are supported by most views but not by ScrollView\nexport interface FlexboxChildrenStyle {\n    alignItems?: 'flex-start' | 'flex-end' | 'center' | 'stretch';\n    alignContent?: 'auto' | 'flex-start' | 'flex-end' | 'center' | 'stretch';\n\n    flexWrap?: 'wrap' | 'nowrap';\n    justifyContent?: 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around';\n}\n\nexport interface FlexboxStyle extends FlexboxParentStyle, FlexboxChildrenStyle {\n}\n\nexport interface InterpolationConfig {\n    inputRange: number[];\n    outputRange: number[] | string[];\n}\n\nexport abstract class AnimatedValue {\n    constructor(val: number) {\n        // No-op\n    }\n    abstract setValue(value: number): void;\n    abstract interpolate(config: InterpolationConfig): InterpolatedValue;\n}\n\nexport declare abstract class InterpolatedValue {\n    private constructor();\n    abstract interpolate(config: InterpolationConfig): InterpolatedValue;\n}\n\nexport interface AnimatedFlexboxStyle {\n    height?: AnimatedValue | InterpolatedValue;\n    width?: AnimatedValue | InterpolatedValue;\n\n    top?: AnimatedValue | InterpolatedValue;\n    right?: AnimatedValue | InterpolatedValue;\n    bottom?: AnimatedValue | InterpolatedValue;\n    left?: AnimatedValue | InterpolatedValue;\n}\n\n// ------------------------------------------------------------\n// Transform Style Rules\n// ------------------------------------------------------------\n\nexport interface TransformStyle {\n    transform?: {\n        perspective?: number;\n        rotate?: string;\n        rotateX?: string;\n        rotateY?: string;\n        rotateZ?: string;\n        scale?: number;\n        scaleX?: number;\n        scaleY?: number;\n        translateX?: number;\n        translateY?: number;\n    }[];\n}\n\nexport interface AnimatedTransformStyle {\n    transform?: {\n        perspective?: AnimatedValue | InterpolatedValue;\n        rotate?: AnimatedValue | InterpolatedValue;\n        rotateX?: AnimatedValue | InterpolatedValue;\n        rotateY?: AnimatedValue | InterpolatedValue;\n        rotateZ?: AnimatedValue | InterpolatedValue;\n        scale?: AnimatedValue | InterpolatedValue;\n        scaleX?: AnimatedValue | InterpolatedValue;\n        scaleY?: AnimatedValue | InterpolatedValue;\n        translateX?: AnimatedValue | InterpolatedValue;\n        translateY?: AnimatedValue | InterpolatedValue;\n    }[];\n}\n\nexport type StyleRuleSet<T> = T | number | undefined;\nexport type StyleRuleSetOrArray<T> = StyleRuleSet<T> | StyleRuleSet<T>[];\nexport interface StyleRuleSetRecursiveArray<T> extends Array<StyleRuleSetOrArray<T> | StyleRuleSetRecursiveArray<T>> {}\nexport type StyleRuleSetRecursive<T> = StyleRuleSet<T> | StyleRuleSetRecursiveArray<T>;\n\n// ------------------------------------------------------------\n// Image and View common Style Rules\n// ------------------------------------------------------------\nexport interface ViewAndImageCommonStyle extends FlexboxStyle, TransformStyle {\n    borderWidth?: number;\n    borderColor?: string;\n    borderRadius?: number;\n    borderTopRightRadius?: number;\n    borderBottomRightRadius?: number;\n    borderBottomLeftRadius?: number;\n    borderTopLeftRadius?: number;\n    overflow?: 'visible' | 'hidden';\n\n    backgroundColor?: string;\n    opacity?: number;\n}\n\nexport interface AnimatedViewAndImageCommonStyle extends AnimatedFlexboxStyle, AnimatedTransformStyle {\n    borderRadius?: AnimatedValue | InterpolatedValue;\n    backgroundColor?: InterpolatedValue;\n    opacity?: AnimatedValue | InterpolatedValue;\n}\n\n// ------------------------------------------------------------\n// View Style Rules\n// ------------------------------------------------------------\n\nexport interface ShadowOffset {\n    width: number;\n    height: number;\n}\n\nexport interface ViewStyle extends ViewAndImageCommonStyle {\n    borderStyle?: 'solid' | 'dotted' | 'dashed' | 'none';\n    wordBreak?: 'break-all' | 'break-word'; // Web only\n    appRegion?: 'drag' | 'no-drag'; // Web only\n    cursor?: 'pointer' | 'default'; // Web only\n    shadowOffset?: ShadowOffset;\n    shadowOpacity?: number;\n    shadowRadius?: number;\n    shadowColor?: string;\n    // Android does not support shadow, elevation achieves something similar.\n    // http://facebook.github.io/react-native/releases/0.30/docs/shadow-props.html (iOS only)\n    // http://facebook.github.io/react-native/releases/0.30/docs/view.html#style (see elevation property)\n    elevation?: number; // Android only\n    // Windows 10 RS3 supports acrylic brushes. In earlier versions these properties are ignored.\n    // The tint opacity can be set either with acrylicOpacity or with acrylicTintColor, e.g. #f002.\n    acrylicOpacityUWP?: number; // UWP only; default = 1\n    acrylicSourceUWP?: 'host' | 'app'; // UWP only; default = \"host\"\n    acrylicTintColorUWP?: string; // UWP only; default = backgroundColor\n}\n\nexport type ViewStyleRuleSet = StyleRuleSet<ViewStyle>;\n\nexport interface AnimatedViewStyle extends AnimatedViewAndImageCommonStyle {\n}\n\nexport type AnimatedViewStyleRuleSet = StyleRuleSet<AnimatedViewStyle>;\n\n// ------------------------------------------------------------\n// ScrollView Style Rules\n// ------------------------------------------------------------\n\nexport interface ScrollViewStyle extends FlexboxParentStyle, TransformStyle {\n    overflow?: 'visible' | 'hidden';\n    backgroundColor?: string;\n    opacity?: number;\n}\n\nexport type ScrollViewStyleRuleSet = StyleRuleSet<ScrollViewStyle>;\n\n// ------------------------------------------------------------\n// Button Style Rules\n// ------------------------------------------------------------\n\nexport interface ButtonStyle extends ViewStyle {\n}\n\nexport type ButtonStyleRuleSet = StyleRuleSet<ButtonStyle>;\n\n// ------------------------------------------------------------\n// ActivityIndicator Style Rules\n// ------------------------------------------------------------\n\nexport interface ActivityIndicatorStyle extends ViewStyle {\n}\n\nexport type ActivityIndicatorStyleRuleSet = StyleRuleSet<ActivityIndicatorStyle>;\n\n// ------------------------------------------------------------\n// Text Style Rules\n// ------------------------------------------------------------\n\nexport interface FontInfo {\n    fontFamily?: string;\n    fontStyle?: 'normal' | 'italic';\n    fontWeight?: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\n}\n\nexport interface TextStyle extends ViewStyle {\n    color?: string;\n    fontFamily?: string;\n    fontSize?: number;\n    fontStyle?: 'normal' | 'italic';\n    fontWeight?: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\n    font?: FontInfo;\n    letterSpacing?: number;\n    lineHeight?: number;\n    textAlign?: 'auto' | 'left' | 'right' | 'center' | 'justify';\n    textDecorationLine?: 'none' | 'underline' | 'line-through' | 'underline line-through';\n    textDecorationStyle?: 'solid' | 'double' | 'dotted' | 'dashed';\n    textDecorationColor?: string;\n    writingDirection?: 'auto' | 'ltr' | 'rtl';\n    // Properties specific to android platform\n    // For android, these properties are set to textAlignVertical: 'center' & includeFontPadding: false\n    // to match the same rendering as of ios and web\n    textAlignVertical?: 'auto' | 'top' | 'bottom' | 'center';\n    includeFontPadding?: boolean; // default is true\n}\n\nexport type TextStyleRuleSet = StyleRuleSet<TextStyle>;\n\nexport interface AnimatedTextStyle extends AnimatedViewAndImageCommonStyle {\n    color?: InterpolatedValue;\n    fontSize?: AnimatedValue | InterpolatedValue;\n}\n\nexport type AnimatedTextStyleRuleSet = StyleRuleSet<AnimatedTextStyle>;\n\n// ------------------------------------------------------------\n// TextInput Style Rules\n// ------------------------------------------------------------\n\nexport interface TextInputStyle extends TextStyle {\n}\n\nexport type TextInputStyleRuleSet = StyleRuleSet<TextInputStyle>;\n\nexport interface AnimatedTextInputStyle extends AnimatedViewAndImageCommonStyle {\n    color?: InterpolatedValue;\n    fontSize?: AnimatedValue | InterpolatedValue;\n}\n\nexport type AnimatedTextInputStyleRuleSet = StyleRuleSet<AnimatedTextInputStyle>;\n\n// ------------------------------------------------------------\n// Link Style Rules\n// ------------------------------------------------------------\n\nexport interface LinkStyle extends TextStyle {\n}\n\nexport type LinkStyleRuleSet = StyleRuleSet<LinkStyle>;\n\n// ------------------------------------------------------------\n// Image Style Rules\n// ------------------------------------------------------------\n\nexport interface ImageStyle extends ViewAndImageCommonStyle, FlexboxStyle {\n    // This is an Android only style attribute that is used to fill the gap in the case of rounded corners\n    // in gif images.\n    overlayColor?: string;\n}\n\nexport type ImageStyleRuleSet = StyleRuleSet<ImageStyle>;\n\nexport interface AnimatedImageStyle extends AnimatedViewAndImageCommonStyle, AnimatedFlexboxStyle {\n}\n\nexport type AnimatedImageStyleRuleSet = StyleRuleSet<AnimatedImageStyle>;\n\n// ------------------------------------------------------------\n// Picker Style Rules\n// ------------------------------------------------------------\n\nexport interface PickerStyle extends ViewStyle {\n    color?: string;\n}\n\nexport type PickerStyleRuleSet = StyleRuleSet<PickerStyle>;\n\nexport type ComponentBase = React.Component<any, any>;\n\n/**\n * Components\n */\n\n// Use a private version of RefAttributes rather than the one defined\n// in React because older versions of @types/React don't include it.\ninterface RefObject<T> {\n    readonly current: T | null;\n}\ntype Ref<T> = { bivarianceHack(instance: T | null): void }['bivarianceHack'] | RefObject<T> | null;\ninterface RefAttributes<T> {\n    ref?: Ref<T>;\n    key?: string | number;\n}\n\nexport interface CommonProps<C = React.Component> extends RefAttributes<C> {\n    // ref and key are typed by react itself\n    children?: ReactNode | ReactNode[];\n    testId?: string;\n}\n\nexport interface Stateless {}\n\n//\n// Accessibility\n//\nexport interface CommonAccessibilityProps {\n    // iOS, Android, and Desktop\n    importantForAccessibility?: ImportantForAccessibility;\n    accessibilityId?: string;\n    accessibilityLabel?: string;\n    accessibilityTraits?: AccessibilityTrait | AccessibilityTrait[];\n\n    // Desktop only.\n    tabIndex?: number;\n    ariaValueNow?: number;\n\n    // iOS only.\n    accessibilityActions?: string[];\n    onAccessibilityAction?: (e: SyntheticEvent) => void;\n}\n\n// Auto, Yes, No - iOS & Android.\n// NoHideDescendants - iOS, Android, & Desktop.\nexport enum ImportantForAccessibility {\n    Auto = 1,\n    Yes,\n    No,\n    NoHideDescendants\n}\n\nexport type AriaLive = 'off' | 'assertive' | 'polite';\n\n// Android & Desktop supported prop, which allows screen-reader to inform its users when a\n// component has dynamically changed. For example, the content of an inApp toast.\nexport enum AccessibilityLiveRegion {\n    None,\n    Polite,\n    Assertive\n}\n\n// NOTE: This enum is organized based on priority of these traits (0 is the lowest),\n// which can be assigned to an accessible object. On native, all traits are combined as\n// a list. On desktop, trait with the maximum value is picked. Whenever you are adding\n// a new trait add it in the right priority order in the list.\nexport enum AccessibilityTrait {\n    // Desktop and iOS.\n    Summary,\n    Adjustable,\n\n    // Desktop, iOS, and Android.\n    Button,\n    Tab,\n    Selected,\n\n    // Android only.\n    Radio_button_checked,\n    Radio_button_unchecked,\n\n    // iOS only.\n    Link,\n    Header,\n    Search,\n    Image,\n    Plays,\n    Key,\n    Text,\n    Disabled,\n    FrequentUpdates,\n    StartsMedia,\n    AllowsDirectInteraction,\n    PageTurn,\n\n    // Desktop only.\n    Menu,\n    MenuItem,\n    MenuBar,\n    TabList,\n    List,\n    ListItem,\n    ListBox,\n    Group,\n    CheckBox,\n    Checked,\n    ComboBox,\n    Log,\n    Status,\n    Dialog,\n    HasPopup,\n    Option,\n    Switch,\n\n    // Desktop & mobile. This is at the end because this\n    // is the highest priority trait.\n    None\n}\n\n// When multiple components with autoFocus=true are mounting at the same time,\n// and/or multiple requestFocus() calls are happening during the same render cycle,\n// it is possible to specify a callback which will choose one from those multiple.\n// To set this callback use View's arbitrateFocus property.\nexport type FocusArbitrator = (candidates: FocusCandidate[]) => FocusCandidate | undefined;\n\n// FocusArbitrator callback will be called with an array of FocusCandidate.\n// See View's arbitrateFocus property.\nexport interface FocusCandidate {\n    // An instance of the component which wants to be focused.\n    component: RX.FocusableComponent;\n\n    // Value of component.props.accessibilityId (if specified).\n    accessibilityId?: string;\n}\n\nexport interface CommonStyledProps<T, C = React.Component> extends CommonProps<C> {\n    style?: StyleRuleSetRecursive<T>;\n}\n\n// Button\nexport interface ButtonProps extends CommonStyledProps<ButtonStyleRuleSet, RX.Button>, CommonAccessibilityProps {\n    title?: string;\n    disabled?: boolean;\n    disabledOpacity?: number;\n    delayLongPress?: number;\n\n    autoFocus?: boolean; // The component is a candidate for being autofocused.\n    onAccessibilityTapIOS?: (e: SyntheticEvent) => void; // iOS-only prop, call when a button is double tapped in accessibility mode\n    onContextMenu?: (e: MouseEvent) => void;\n    onPress?: (e: SyntheticEvent) => void;\n    onPressIn?: (e: SyntheticEvent) => void;\n    onPressOut?: (e: SyntheticEvent) => void;\n    onLongPress?: (e: SyntheticEvent) => void;\n    onHoverStart?: (e: SyntheticEvent) => void;\n    onHoverEnd?: (e: SyntheticEvent) => void;\n    onKeyPress?: (e: KeyboardEvent) => void;\n    onFocus?: (e: FocusEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n\n    shouldRasterizeIOS?: boolean; // iOS-only prop, if view should be rendered as a bitmap before compositing\n\n    // iOS and Android only. Visual touchfeedback properties\n    disableTouchOpacityAnimation?: boolean;\n    activeOpacity?: number;\n    underlayColor?: string;\n\n    // Web only.\n    id?: string; // Needed for accessibility to be able to use labelledBy attribute.\n    ariaControls?: string; // Needed for accessibility.\n}\n\n// Picker\nexport interface PickerPropsItem {\n    label: string;\n    value: string;\n}\nexport interface PickerProps extends CommonProps<RX.Picker> {\n    items: PickerPropsItem[];\n    selectedValue: string;\n    onValueChange: (itemValue: string, itemPosition: number) => void;\n    style?: StyleRuleSetRecursive<PickerStyleRuleSet>;\n    mode?: 'dialog' | 'dropdown';\n}\n\n/**\n * WebView, Image headers\n */\nexport interface Headers {\n    [header: string]: string;\n}\n\n// Image\nexport type ImageResizeMode = 'stretch' | 'contain' | 'cover' | 'auto' | 'repeat';\n\nexport interface ImagePropsShared<C = React.Component> extends CommonProps<C> {\n    source: string;\n    headers?: Headers;\n    accessibilityLabel?: string;\n    resizeMode?: ImageResizeMode;\n\n    resizeMethod?: 'auto' | 'resize' | 'scale'; // Android only\n    title?: string;\n\n    onLoad?: (size: Dimensions) => void;\n    onError?: (err?: Error) => void;\n}\n\nexport interface ImageProps extends ImagePropsShared<RX.Image> {\n    style?: StyleRuleSetRecursive<ImageStyleRuleSet>;\n}\n\nexport interface ImageMetadata {\n    width: number;\n    height: number;\n}\n\nexport interface AnimatedImageProps extends ImagePropsShared<RX.AnimatedImage> {\n    style?: StyleRuleSetRecursive<AnimatedImageStyleRuleSet | ImageStyleRuleSet>;\n}\n\n// Text\n// Nested text elements follow a text layout instead of Flexbox.\n//\n// <Text>I am a <Text style={{fontWeight: 'bold'}}>very</Text> important example</Text>\n//\n// Will render as\n// | I am a very |\n// | important   |\n// | example     |\nexport interface TextPropsShared<C = React.Component> extends CommonProps<C> {\n    selectable?: boolean;\n    numberOfLines?: number;\n\n    // Should fonts be scaled according to system setting? Defaults\n    // to true. iOS and Android only.\n    allowFontScaling?: boolean;\n\n    // iOS and Android only\n    ellipsizeMode?:  'head' | 'middle' | 'tail';\n\n    // Exposing this property as temporary workaround to fix a bug.\n    // TODO : http://skype.vso.io/865016 : remove this exposed property\n    // Used only for Android.\n    textBreakStrategy?: 'highQuality' | 'simple' | 'balanced';\n\n    importantForAccessibility?: ImportantForAccessibility;\n    accessibilityId?: string;\n\n    autoFocus?: boolean; // The component is a candidate for being autofocused.\n\n    onPress?: (e: SyntheticEvent) => void;\n\n    id?: string; // Web only. Needed for accessibility.\n    onContextMenu?: (e: MouseEvent) => void;\n}\n\nexport interface TextProps extends TextPropsShared<RX.Text> {\n    style?: StyleRuleSetRecursive<TextStyleRuleSet>;\n}\n\nexport interface AnimatedTextProps extends TextPropsShared<RX.AnimatedText> {\n    style?: StyleRuleSetRecursive<AnimatedTextStyleRuleSet | TextStyleRuleSet>;\n}\n\nexport type ViewLayerType = 'none' | 'software' | 'hardware';\n\nexport enum LimitFocusType {\n    Unlimited = 0,\n    // When limitFocusWithin=Limited, the View and the focusable components inside\n    // the View get both tabIndex=-1 and aria-hidden=true.\n    Limited = 1,\n    // When limitFocusWithin=Accessible, the View and the focusable components inside\n    // the View get only tabIndex=-1.\n    Accessible = 2\n}\n\n// View\nexport interface ViewPropsShared<C = React.Component> extends CommonProps<C>, CommonAccessibilityProps {\n    title?: string;\n    ignorePointerEvents?: boolean; // Prop for disabling touches on self\n    blockPointerEvents?: boolean; // Prop for disabling touches on self and all child views\n    shouldRasterizeIOS?: boolean; // iOS-only prop, if view should be rendered as a bitmap before compositing\n    viewLayerTypeAndroid?: ViewLayerType; // Android only property\n\n    restrictFocusWithin?: boolean; // Web-only, during the keyboard navigation, the focus will not go outside this view\n    limitFocusWithin?: LimitFocusType; // Web-only, make the view and all focusable subelements not focusable\n\n    autoFocus?: boolean; // The component is a candidate for being autofocused.\n\n    // When multiple components with autoFocus=true inside this View are mounting at the same time,\n    // and/or multiple components inside this view have received requestFocus() call during the same\n    // render cycle, this callback will be called so that it's possible for the application to\n    // decide which one should actually be focused.\n    arbitrateFocus?: FocusArbitrator;\n\n    importantForLayout?: boolean; // Web-only, additional invisible DOM elements will be added to track the size changes faster\n    id?: string; // Web-only. Needed for accessibility.\n    ariaLabelledBy?: string; // Web-only. Needed for accessibility.\n    ariaRoleDescription?: string; // Web-only. Needed for accessibility.\n    accessibilityLiveRegion?: AccessibilityLiveRegion; // Android and web only\n\n    // There are a couple of constraints when child animations are enabled:\n    //   - Every child must have a `key`.\n    //   - String refs aren't supported on children. Only callback refs are.\n    animateChildEnter?: boolean;\n    animateChildLeave?: boolean;\n    animateChildMove?: boolean;\n\n    onAccessibilityTapIOS?: (e: SyntheticEvent) => void;\n    onLayout?: (e: ViewOnLayoutEvent) => void;\n    onMouseEnter?: (e: MouseEvent) => void;\n    onMouseLeave?: (e: MouseEvent) => void;\n    onDragStart?: (e: DragEvent) => void;\n    onDrag?: (e: DragEvent) => void;\n    onDragEnd?: (e: DragEvent) => void;\n    onDragEnter?: (e: DragEvent) => void;\n    onDragOver?: (e: DragEvent) => void;\n    onDragLeave?: (e: DragEvent) => void;\n    onDrop?: (e: DragEvent) => void;\n    onMouseOver?: (e: MouseEvent) => void;\n    onMouseMove?: (e: MouseEvent) => void;\n\n    onPress?: (e: SyntheticEvent) => void;\n    onLongPress?: (e: SyntheticEvent) => void;\n    onKeyPress?: (e: KeyboardEvent) => void;\n    onFocus?: (e: FocusEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n\n    // iOS and Android only. Visual touchfeedback properties\n    disableTouchOpacityAnimation?: boolean;\n    activeOpacity?: number;\n    underlayColor?: string;\n\n    onContextMenu?: (e: MouseEvent) => void;\n    onStartShouldSetResponder?: (e: SyntheticEvent) => boolean;\n    onMoveShouldSetResponder?: (e: SyntheticEvent) => boolean;\n    onStartShouldSetResponderCapture?: (e: SyntheticEvent) => boolean;\n    onMoveShouldSetResponderCapture?: (e: SyntheticEvent) => boolean;\n    onResponderGrant?: (e: SyntheticEvent) => void;\n    onResponderReject?: (e: SyntheticEvent) => void;\n    onResponderRelease?: (e: SyntheticEvent) => void;\n    onResponderStart?: (e: TouchEvent) => void;\n    onResponderMove?: (e: TouchEvent) => void;\n    onTouchStartCapture?: (e: TouchEvent) => void;\n    onTouchMoveCapture?: (e: TouchEvent) => void;\n    onResponderEnd?: (e: TouchEvent) => void;\n    onResponderTerminate?: (e: SyntheticEvent) => void;\n    onResponderTerminationRequest?: (e: SyntheticEvent) => boolean;\n}\n\nexport interface ViewProps extends ViewPropsShared<RX.View> {\n    style?: StyleRuleSetRecursive<ViewStyleRuleSet>;\n    useSafeInsets?: boolean;\n}\n\nexport interface AnimatedViewProps extends ViewPropsShared<RX.AnimatedView> {\n    style?: StyleRuleSetRecursive<AnimatedViewStyleRuleSet | ViewStyleRuleSet>;\n}\n\n// GestureView\nexport interface GestureState {\n    isTouch: boolean;\n    timeStamp: number;\n}\n\nexport interface TapGestureState extends GestureState {\n    clientX: number;\n    clientY: number;\n    pageX: number;\n    pageY: number;\n}\n\nexport interface MultiTouchGestureState extends GestureState {\n    initialCenterClientX: number;\n    initialCenterClientY: number;\n    initialCenterPageX: number;\n    initialCenterPageY: number;\n    initialWidth: number;\n    initialHeight: number;\n    initialDistance: number;\n    initialAngle: number;\n\n    centerClientX: number;\n    centerClientY: number;\n    centerPageX: number;\n    centerPageY: number;\n    velocityX: number;\n    velocityY: number;\n    width: number;\n    height: number;\n    distance: number;\n    angle: number;\n\n    isComplete: boolean;\n}\n\nexport interface ScrollWheelGestureState extends TapGestureState {\n    scrollAmount: number;\n}\n\nexport interface PanGestureState extends TapGestureState {\n    initialClientX: number;\n    initialClientY: number;\n    initialPageX: number;\n    initialPageY: number;\n    velocityX: number;\n    velocityY: number;\n\n    isComplete: boolean;\n}\n\nexport enum GestureMouseCursor {\n    Default,\n    Pointer,\n    Grab,\n    Move,\n    EWResize,\n    NSResize,\n    NESWResize,\n    NWSEResize,\n    NotAllowed,\n    ZoomIn,\n    ZoomOut\n}\n\nexport enum PreferredPanGesture {\n    Horizontal,\n    Vertical\n}\n\nexport interface GestureViewProps extends CommonStyledProps<ViewStyleRuleSet, RX.GestureView>, CommonAccessibilityProps {\n    // Gestures and attributes that apply only to touch inputs\n    onPinchZoom?: (gestureState: MultiTouchGestureState) => void;\n    onRotate?: (gestureState: MultiTouchGestureState) => void;\n\n    // Gestures and attributes that apply only to mouse inputs\n    onScrollWheel?: (gestureState: ScrollWheelGestureState) => void;\n    mouseOverCursor?: GestureMouseCursor;\n\n    // Gestures and attributes that apply to either touch or mouse inputs\n    onPan?: (gestureState: PanGestureState) => void;\n    onPanVertical?: (gestureState: PanGestureState) => void;\n    onPanHorizontal?: (gestureState: PanGestureState) => void;\n    onTap?: (gestureState: TapGestureState) => void;\n    onDoubleTap?: (gestureState: TapGestureState) => void;\n    onLongPress?: (gestureState: TapGestureState) => void;\n    onContextMenu?: (gestureState: TapGestureState) => void;\n\n    onFocus?: (e: FocusEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n    onKeyPress?: (e: KeyboardEvent) => void;\n\n    // We can set vertical or horizontal as preferred\n    preferredPan?: PreferredPanGesture;\n\n    // How many pixels (in either horizontal or vertical direction) until\n    // pan is recognized? Default is 10. Can be any value > 0.\n    panPixelThreshold?: number;\n\n    // Something else wants to become responder. Should this view release the responder?\n    // Setting true allows release\n    releaseOnRequest?: boolean;\n}\n\nexport interface ScrollIndicatorInsets {\n    top: number;\n    left: number;\n    bottom: number;\n    right: number;\n}\n\n// ScrollView\nexport interface ScrollViewProps extends CommonStyledProps<ScrollViewStyleRuleSet, RX.ScrollView>, CommonAccessibilityProps {\n    children?: ReactNode;\n\n    horizontal?: boolean; // By default false\n\n    onLayout?: (e: ViewOnLayoutEvent) => void;\n    onContentSizeChange?: (width: number, height: number) => void;\n    onScroll?: (newScrollTop: number, newScrollLeft: number) => void;\n    onScrollBeginDrag?: () => void;\n    onScrollEndDrag?: () => void;\n    onKeyPress?: (e: KeyboardEvent) => void;\n    onFocus?: (e: FocusEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n\n    showsHorizontalScrollIndicator?: boolean;\n    showsVerticalScrollIndicator?: boolean;\n    scrollEnabled?: boolean;\n\n    // The following props are valid only on native platforms and\n    // have no meaning on the web implementation.\n    keyboardDismissMode?: 'none' | 'interactive' | 'on-drag';\n    keyboardShouldPersistTaps?: boolean | 'always' | 'never' | 'handled';\n\n    // This controls how often the scroll event will be fired while scrolling\n    // (in milliseconds between events). A lower number yields better accuracy for code\n    // that is tracking the scroll position, but can lead to scroll performance\n    // problems due to the volume of information being send over the bridge.\n    // The default value is 16, which means the scroll event will be sent\n    // at most once very frame.\n    // @platform ios\n    scrollEventThrottle?: number;\n\n    // iOS only properties for controlling bounce effect when scrolling.\n    // When true, the scroll view bounces when it reaches the end of the content\n    // if the content is larger then the scroll view along the axis of the scroll direction.\n    // When false, it disables all bouncing even if the alwaysBounce* props are true.\n    // The default value is true.\n    bounces?: boolean;\n\n    // iOS only properties to allow snapping the items within a scroll view one by one or in pages.\n    pagingEnabled?: boolean;\n    snapToInterval?: number;\n\n    // Mobile only property (currently only iOS). If set to true, this scroll view will be\n    // scrolled to the top if the status bar is tapped. The default value is true.\n    // This maps to the actual behavior of the same property of ScrollView component in React Native.\n    // Documentation: http://facebook.github.io/react-native/docs/scrollview.html#scrollstotop\n    scrollsToTop?: boolean;\n\n    // Android only property to control overScroll mode\n    overScrollMode?: 'auto' | 'always' | 'never';\n\n    // iOS-only property to control scroll indicator insets\n    scrollIndicatorInsets?: ScrollIndicatorInsets;\n\n    // Windows-only property to control tab navigation inside the view\n    tabNavigation?: 'local' | 'cycle' | 'once';\n\n    // Animation helpers to allow usage of the RN.Animated.Event system through ReactXP.\n    // Animated.Values hooked up to either (or both) of these properties will be automatically\n    // hooked into the onScroll handler of the scrollview and .setValue() will be called on them\n    // with the updated values.  On supported platforms, it will use RN.Animated.event() to do\n    // a native-side/-backed coupled animation.\n    scrollXAnimatedValue?: RX.Types.AnimatedValue;\n    scrollYAnimatedValue?: RX.Types.AnimatedValue;\n}\n\n// Link\nexport interface LinkProps extends CommonStyledProps<LinkStyleRuleSet, RX.Link> {\n    title?: string;\n    url: string;\n    children?: ReactNode;\n    selectable?: boolean;\n    numberOfLines?: number;\n    allowFontScaling?: boolean;\n    tabIndex?: number;\n    accessibilityId?: string;\n    autoFocus?: boolean; // The component is a candidate for being autofocused.\n\n    onPress?: (e: RX.Types.SyntheticEvent, url: string) => void;\n    onLongPress?: (e: RX.Types.SyntheticEvent, url: string) => void;\n    onHoverStart?: (e: SyntheticEvent) => void;\n    onHoverEnd?: (e: SyntheticEvent) => void;\n    onContextMenu?: (e: MouseEvent) => void;\n}\n\n// TextInput\nexport interface TextInputPropsShared<C = React.Component> extends CommonProps<C>, CommonAccessibilityProps {\n    autoCapitalize?: 'none' | 'sentences' | 'words' | 'characters';\n    autoCorrect?: boolean;\n    autoFocus?: boolean; // The component is a candidate for being autofocused.\n    blurOnSubmit?: boolean;\n    defaultValue?: string;\n    editable?: boolean;\n    keyboardType?: 'default' | 'numeric' | 'email-address' | 'number-pad';\n    maxLength?: number;\n    multiline?: boolean;\n    placeholder?: string;\n    placeholderTextColor?: string;\n    secureTextEntry?: boolean;\n    value?: string;\n    title?: string;\n\n    // Should fonts be scaled according to system setting? Defaults\n    // to true. iOS and Android only.\n    allowFontScaling?: boolean;\n\n    // iOS-only prop for controlling the keyboard appearance\n    keyboardAppearance?: 'default' | 'light' | 'dark';\n\n    // iOS and Android prop for controlling return key type\n    returnKeyType?: 'done' | 'go' | 'next' | 'search' | 'send';\n\n    // Android-only prop for disabling full screen editor mode\n    disableFullscreenUI?: boolean;\n\n    // iOS and web prop for enabling spellcheck. Defaults to the value set for 'autoCorrect'.\n    spellCheck?: boolean;\n\n    // iOS and Android only property for controlling the text input selection color\n    selectionColor?: string;\n\n    // iOS and Windows only property for controlling when the clear button should appear on the right side of the text view.\n    clearButtonMode?: 'never' | 'while-editing' | 'unless-editing' | 'always';\n\n    onKeyPress?: (e: KeyboardEvent) => void;\n    onFocus?: (e: FocusEvent) => void;\n    onBlur?: (e: FocusEvent) => void;\n    onPaste?: (e: ClipboardEvent) => void;\n    onChangeText?: (newValue: string) => void;\n    onSelectionChange?: (start: number, end: number) => void;\n    onSubmitEditing?: () => void;\n    onScroll?: (newScrollLeft: number, newScrollTop: number) => void;\n}\n\nexport interface TextInputProps extends TextInputPropsShared<RX.TextInput> {\n    style?: StyleRuleSetRecursive<TextInputStyleRuleSet>;\n}\n\nexport interface AnimatedTextInputProps extends TextInputPropsShared<RX.AnimatedTextInput> {\n    style?: StyleRuleSetRecursive<AnimatedTextInputStyleRuleSet | TextInputStyleRuleSet>;\n}\n\n// ActivityIndicator\nexport interface ActivityIndicatorProps extends CommonStyledProps<ActivityIndicatorStyleRuleSet, RX.ActivityIndicator> {\n    color: string;\n    size?: 'large' | 'medium' | 'small' | 'tiny';\n    deferTime?: number; // Number of ms to wait before displaying\n}\n\n// 'context' mode makes it attempt to behave like a context menu -- defaulting\n// to the lower right of the anchor element and working its way around.  It is not supported\n// with inner positioning and will throw an exception if used there.\nexport type PopupPosition  = 'top' | 'right' | 'bottom' | 'left' | 'context';\n\n// Popup\nexport interface PopupOptions {\n    // Returns a mounted component instance that serves as the\n    // \"anchor\" for the popup. Often a button.\n    getAnchor: () => React.Component<any, any>;\n\n    // Renders the contents of the popup.\n    renderPopup: (anchorPosition: PopupPosition, anchorOffset: number,\n        popupWidth: number, popupHeight: number) => ReactNode;\n\n    // Returns a mounted component instance that controls the triggering of the popup.\n    // In majority of cases, \"anchor\" of popup has handlers to control when the popup will be seen and this function is not required.\n    // In a few cases, where anchor is not the same as the whole component that triggers when the popup wil be seen, this can be used.\n    // For instance, a button combined with a chevron icon, which on click triggers a popup below the chevron icon.\n    // In this example, getElementTriggeringPopup() can return the container with button and chevron icon.\n    getElementTriggeringPopup?: () => React.Component<any, any>;\n\n    // Called when the popup is dismissed.\n    onDismiss?: () => void;\n\n    // Prioritized order of positions. Popup is positioned\n    // relative to the anchor such that it remains on screen.\n    // Default is ['bottom', 'right', 'top', 'left'].\n    positionPriorities?: PopupPosition[];\n\n    // Position the popup inside its anchor.\n    // In this mode only the first position priority will be used.\n    useInnerPositioning?: boolean;\n\n    // On pressed handler to notify whoever wanted to create the popup that its\n    // anchor has been pressed.\n    // IMPORTANT NOTE: This handler may be called when the component is\n    // already unmounted as it uses a time delay to accommodate a fade-out animation.\n    onAnchorPressed?: (e?: RX.Types.SyntheticEvent) => void;\n\n    // Determines if the anchor invoking the popup should behave like a toggle.\n    // Value = true  => Calling Popup.show will show the popup. A subsequent call, will hide the popup, and so on.\n    // Value = false or undefined (default)  => Calling Popup.show will always show the popup.\n    dismissIfShown?: boolean;\n\n    // Prevents the front-most popup from closing if the user clicks or taps\n    // outside of it. It will still close if the anchor is unmounted or if\n    // dismiss is explicitly called.\n    preventDismissOnPress?: boolean;\n\n    // The popup may be left in the DOM after it's dismissed. This is a performance optimization to\n    // make the popup appear faster when it's shown again, intended for popups that tend to be shown\n    // repeatedly. Note that this is only a hint, popups cannot be force-cached.\n    cacheable?: boolean;\n\n    // Android, iOS, and Windows only.\n    // The id of the root view this popup is associated with.\n    // Defaults to the view set by UserInterface.setMainView();\n    rootViewId?: string;\n}\n\n// Modal\nexport interface ModalOptions {\n    // Android, iOS, and Windows only.\n    // The id of the root view this modal is associated with.\n    // Defaults to the view set by UserInterface.setMainView();\n    rootViewId?: string;\n}\n\n//\n// Alert\n//\n// Alerts are not React components but OS dialog boxes which, depending\n// on OS support, can show while React window is minimized or while\n// the app is in background.\n// ----------------------------------------------------------------------\nexport interface AlertButtonSpec {\n    text?: string;\n    onPress?: () => void;\n    style?: 'default' | 'cancel' | 'destructive';\n}\n\n// Web specific\nexport interface AlertModalTheme {\n    bodyStyle?: StyleRuleSet<ViewStyle>;\n    titleTextStyle?: StyleRuleSet<TextStyle>;\n    messageTextStyle?: StyleRuleSet<TextStyle>;\n\n    buttonStyle?: StyleRuleSet<ButtonStyle>;\n    buttonHoverStyle?: StyleRuleSet<ButtonStyle>;\n    buttonTextStyle?: StyleRuleSet<TextStyle>;\n\n    cancelButtonStyle?: StyleRuleSet<ButtonStyle>;\n    cancelButtonHoverStyle?: StyleRuleSet<ButtonStyle>;\n    cancelButtonTextStyle?: StyleRuleSet<TextStyle>;\n}\n\nexport interface AlertOptions {\n    icon?: string;\n    theme?: AlertModalTheme;\n    rootViewId?: string;\n    preventDismissOnPress?: boolean;\n}\n\n//\n// Location\n// ----------------------------------------------------------------------\nexport enum LocationErrorType {\n    PermissionDenied = 1,\n    PositionUnavailable,\n    Timeout\n}\n\nexport type LocationWatchId = number;\nexport type LocationSuccessCallback = (position: Position) => void;\nexport type LocationFailureCallback = (error: LocationErrorType) => void;\n\n//\n// Animated\n// ----------------------------------------------------------------------\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace Animated {\n    export interface EndResult { finished: boolean }\n    export type EndCallback = (result: EndResult) => void;\n    export interface CompositeAnimation {\n        start: (callback?: EndCallback) => void;\n        stop: () => void;\n    }\n\n    export interface LoopConfig {\n        restartFrom: number;\n    }\n\n    export interface AnimationConfig {\n        useNativeDriver?: boolean;\n        isInteraction?: boolean;\n    }\n\n    export interface TimingAnimationConfig extends AnimationConfig {\n        toValue: number;\n        easing?: EasingFunction;\n        duration?: number;\n        delay?: number;\n        loop?: LoopConfig;\n    }\n\n    export interface InterpolationConfigType {\n        inputRange: number[];\n        outputRange: (number | string)[];\n    }\n\n    export type TimingFunction = (value: RX.Types.AnimatedValue | RX.Types.InterpolatedValue,\n        config: TimingAnimationConfig) => CompositeAnimation;\n    export let timing: TimingFunction;\n\n    export type SequenceFunction = (animations: CompositeAnimation[]) => CompositeAnimation;\n    export let sequence: SequenceFunction;\n\n    export type ParallelFunction = (animations: CompositeAnimation[]) => CompositeAnimation;\n    export let parallel: ParallelFunction;\n\n    export interface EasingFunction {\n        cssName: string;\n        function: (input: number) => number;\n    }\n\n    export interface Easing {\n        Default(): EasingFunction;\n        Linear(): EasingFunction;\n        Out(): EasingFunction;\n        In(): EasingFunction;\n        InOut(): EasingFunction;\n        InBack(): EasingFunction;\n        OutBack(): EasingFunction;\n        InOutBack(): EasingFunction;\n        StepStart(): EasingFunction;\n        StepEnd(): EasingFunction;\n        Steps(intervals: number, end?: boolean): EasingFunction;\n        CubicBezier(x1: number, y1: number, x2: number, y2: number): EasingFunction;\n    }\n}\n\n//\n// Events\n// ----------------------------------------------------------------------\nexport interface SyntheticEvent {\n    readonly bubbles: boolean;\n    readonly cancelable: boolean;\n    readonly defaultPrevented: boolean;\n    readonly timeStamp: number;\n    readonly nativeEvent: any; // Platform-specific\n    preventDefault(): void;\n    stopPropagation(): void;\n}\n\nexport interface ClipboardEvent extends SyntheticEvent {\n    clipboardData: DataTransfer;\n}\n\nexport type FocusEvent = SyntheticEvent;\n\nexport interface MouseEvent extends SyntheticEvent {\n    altKey: boolean;\n    button: number;\n    clientX: number;\n    clientY: number;\n    ctrlKey: boolean;\n    metaKey: boolean;\n    shiftKey: boolean;\n    pageX?: number;\n    pageY?: number;\n}\n\nexport interface DragEvent extends MouseEvent {\n    dataTransfer: DataTransfer;\n}\n\nexport interface Touch {\n    identifier: number;\n    locationX: number;\n    locationY: number;\n    screenX: number;\n    screenY: number;\n    clientX: number;\n    clientY: number;\n    pageX: number;\n    pageY: number;\n}\n\nexport interface TouchList {\n    [index: number]: Touch;\n    length: number;\n    item(index: number): Touch;\n    identifiedTouch(identifier: number): Touch;\n}\n\nexport interface TouchEvent extends SyntheticEvent {\n    // We override this definition because the public\n    // type excludes location and page fields.\n    altKey: boolean;\n    changedTouches: TouchList;\n    ctrlKey: boolean;\n    metaKey: boolean;\n    shiftKey: boolean;\n    targetTouches: TouchList;\n    locationX?: number;\n    locationY?: number;\n    pageX?: number;\n    pageY?: number;\n    touches: TouchList;\n}\n\nexport interface WheelEvent extends SyntheticEvent {\n    deltaMode: number;\n    deltaX: number;\n    deltaY: number;\n    deltaZ: number;\n}\n\nexport interface ViewOnLayoutEvent {\n    x: number;\n    y: number;\n    height: number;\n    width: number;\n}\n\nexport interface KeyboardEvent extends SyntheticEvent {\n    ctrlKey: boolean;\n    altKey: boolean;\n    shiftKey: boolean;\n    keyCode: number;\n    metaKey: boolean;\n    key: string;\n}\n\n//\n// Component\n// ----------------------------------------------------------------------\nexport let Children: React.ReactChildren;\n\n//\n// Dimensions\n// ----------------------------------------------------------------------\nexport interface Dimensions {\n    width: number;\n    height: number;\n}\n\n//\n// Linking\n// ----------------------------------------------------------------------\nexport interface EmailInfo {\n    to?: string[];\n    cc?: string[];\n    bcc?: string[];\n    subject?: string;\n    body?: string;\n}\n\nexport interface SmsInfo {\n    phoneNumber?: string;\n    body?: string;\n}\n\nexport enum LinkingErrorCode {\n    NoAppFound = 0,\n    UnexpectedFailure = 1,\n    Blocked = 2,\n    InitialUrlNotFound = 3\n}\n\nexport interface LinkingErrorInfo {\n    code: LinkingErrorCode;\n    url?: string;\n    description?: string;\n}\n\n//\n// App\n// ----------------------------------------------------------------------\nexport enum AppActivationState {\n    Active = 1,\n    Background = 2,\n    Inactive = 3,\n    Extension = 4\n}\n\n// UserInterface\n// ----------------------------------------------------------------------\nexport interface LayoutInfo {\n    x: number;\n    y: number;\n    width: number;\n    height: number;\n}\n\n//\n// Platform\n// ----------------------------------------------------------------------\nexport type PlatformType = 'web' | 'ios' | 'android' | 'windows' | 'macos';\n"
  },
  {
    "path": "src/common/assert.ts",
    "content": "/**\n * assert\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n */\nconst assert = (cond: any, message?: string | undefined): void => {\n    if (!cond) {\n        throw new Error(message || 'Assertion Failed');\n    }\n};\n\nexport default assert;\n"
  },
  {
    "path": "src/common/lodashMini.ts",
    "content": "/**\n * lodashMini.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Imports a subset of lodash library needed for ReactXP's implementation.\n */\n\nimport clone = require('lodash/clone');\nimport compact = require('lodash/compact');\nimport filter = require('lodash/filter');\nimport isEqual = require('lodash/isEqual');\nimport pull = require('lodash/pull');\nimport sortBy = require('lodash/sortBy');\n\nexport interface Dictionary<T> {\n    [index: string]: T;\n}\n\nexport {\n    clone,\n    compact,\n    filter,\n    isEqual,\n    pull,\n    sortBy,\n};\n"
  },
  {
    "path": "src/common/utils/AutoFocusHelper.ts",
    "content": "/**\n * AutoFocusHelper.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Provides the functions which allow to handle the selection of a proper component\n * to focus from the multiple candidates with autoFocus=true.\n */\n\nimport * as React from 'react';\n\nimport * as RX from '../Interfaces';\n\nimport Timers from './Timers';\n\nlet _sortAndFilter: SortAndFilterFunc | undefined;\nlet _autoFocusTimer: number | undefined;\nlet _lastFocusArbitratorProviderId = 0;\nlet rootFocusArbitratorProvider: FocusArbitratorProvider; // eslint-disable-line prefer-const\n\nexport enum FocusCandidateType {\n    Focus = 1,\n    FocusFirst = 2\n}\n\nexport interface FocusCandidateInternal {\n    component: React.Component<any, any>;\n    focus: () => void;\n    isAvailable: () => boolean;\n    type: FocusCandidateType;\n    accessibilityId?: string;\n}\n\nexport type SortAndFilterFunc = (candidates: FocusCandidateInternal[]) => FocusCandidateInternal[];\n\nexport function setSortAndFilterFunc(sortAndFilter: SortAndFilterFunc): void {\n    _sortAndFilter = sortAndFilter;\n}\n\nexport class FocusArbitratorProvider {\n    private _id: number;\n    private _parentArbitratorProvider: FocusArbitratorProvider | undefined;\n\n    private _arbitratorCallback: RX.Types.FocusArbitrator | undefined;\n    private _candidates: FocusCandidateInternal[] = [];\n    private _pendingChildren: { [key: string]: FocusArbitratorProvider } = {};\n\n    constructor(view?: RX.View, arbitrator?: RX.Types.FocusArbitrator) {\n        this._id = ++_lastFocusArbitratorProviderId;\n        this._parentArbitratorProvider = view\n            ? ((view.context && view.context.focusArbitrator) || rootFocusArbitratorProvider)\n            : undefined;\n        this._arbitratorCallback = arbitrator;\n    }\n\n    private _notifyParent(): void {\n        if (this._parentArbitratorProvider) {\n            this._parentArbitratorProvider._pendingChildren['fa-' + this._id.toString()] = this;\n            this._parentArbitratorProvider._notifyParent();\n        }\n    }\n\n    private _arbitrate(): FocusCandidateInternal | undefined {\n        const candidates = this._candidates;\n\n        Object.keys(this._pendingChildren).forEach(key => {\n            const candidate = this._pendingChildren[key]._arbitrate();\n            if (candidate) {\n                candidates.push(candidate);\n            }\n        });\n\n        this._candidates = [];\n        this._pendingChildren = {};\n\n        return FocusArbitratorProvider._arbitrate(candidates, this._arbitratorCallback);\n    }\n\n    private _requestFocus(component: React.Component<any, any>, focus: () => void, isAvailable: () => boolean,\n            type: FocusCandidateType): void {\n\n        const accessibilityId = component.props && component.props.accessibilityId;\n\n        this._candidates.push({\n            component,\n            focus,\n            isAvailable,\n            type,\n            accessibilityId,\n        });\n\n        this._notifyParent();\n    }\n\n    private static _arbitrate(candidates: FocusCandidateInternal[],\n            arbitrator?: RX.Types.FocusArbitrator): FocusCandidateInternal | undefined {\n        // Filtering out everything which is already unmounted.\n        candidates = candidates.filter(item => item.isAvailable());\n\n        if (_sortAndFilter) {\n            candidates = _sortAndFilter(candidates);\n        }\n\n        for (let i = 0; i < candidates.length; i++) {\n            if (candidates[i].type === FocusCandidateType.FocusFirst) {\n                return candidates[i];\n            }\n        }\n\n        if (arbitrator) {\n            // There is an application specified focus arbitrator.\n            const toArbitrate: RX.Types.FocusCandidate[] = [];\n\n            candidates.forEach(candidate => {\n                const component = candidate.component as any;\n\n                // Make sure to pass FocusableComponents only.\n                if (component.focus && component.blur && component.requestFocus) {\n                    component.__focusCandidateInternal = candidate;\n\n                    toArbitrate.push({\n                        component,\n                        accessibilityId: candidate.accessibilityId,\n                    });\n                }\n            });\n\n            if (toArbitrate.length) {\n                const candidate = arbitrator(toArbitrate);\n                let ret: FocusCandidateInternal | undefined;\n\n                if (candidate && candidate.component && (candidate.component as any).__focusCandidateInternal) {\n                    ret = (candidate.component as any).__focusCandidateInternal as FocusCandidateInternal;\n                }\n\n                toArbitrate.forEach(candidate => {\n                    delete (candidate.component as any).__focusCandidateInternal;\n                });\n\n                return ret;\n            }\n        }\n\n        return candidates[candidates.length - 1];\n    }\n\n    setCallback(arbitrator?: RX.Types.FocusArbitrator): void {\n        this._arbitratorCallback = arbitrator;\n    }\n\n    static requestFocus(component: React.Component<any, any>, focus: () => void, isAvailable: () => boolean,\n            type?: FocusCandidateType): void {\n\n        if (_autoFocusTimer) {\n            Timers.clearTimeout(_autoFocusTimer);\n        }\n\n        const focusArbitratorProvider: FocusArbitratorProvider =\n            (((component as any)._focusArbitratorProvider instanceof FocusArbitratorProvider) &&\n             (component as any)._focusArbitratorProvider) ||\n            (component.context && component.context.focusArbitrator) ||\n            rootFocusArbitratorProvider;\n\n        focusArbitratorProvider._requestFocus(component, focus, isAvailable, type || FocusCandidateType.Focus);\n\n        _autoFocusTimer = Timers.setTimeout(() => {\n            _autoFocusTimer = undefined;\n\n            const candidate = rootFocusArbitratorProvider._arbitrate();\n\n            if (candidate) {\n                candidate.focus();\n            }\n        }, 0);\n    }\n}\n\nrootFocusArbitratorProvider = new FocusArbitratorProvider();\n"
  },
  {
    "path": "src/common/utils/EventHelpers.ts",
    "content": "/**\n * EventHelpers.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\nexport function toMouseButton(nativeEvent: any): number {\n    if (nativeEvent.button !== undefined) {\n        return nativeEvent.button;\n    } else if (nativeEvent.isRightButton || nativeEvent.IsRightButton) {\n        return 2;\n    } else if (nativeEvent.isMiddleButton || nativeEvent.IsMiddleButton) {\n        return 1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/common/utils/FocusManager.ts",
    "content": "/**\n * FocusManager.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Manages focusable elements for better keyboard navigation.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport AppConfig from '../../common/AppConfig';\nimport { Types } from '../../common/Interfaces';\n\nimport Timers from './Timers';\n\nlet _lastComponentId = 0;\n\nexport enum RestrictFocusType {\n    Unrestricted = 0,\n    // When restrictFocusWithin=Restricted, the focus will not go outside of this View\n    // when you're using Tab navigation.\n    Restricted = 1,\n    // The same as Restricted, but will also focus first focusable component inside\n    // this View when UserInterface.isNavigatingWithKeyboard() is true, to save a Tab\n    // press for the cases the user is tabbing already.\n    RestrictedFocusFirst = 2\n}\n\nexport interface FocusableInternal {\n    focusableComponentId?: string;\n}\n\nexport type FocusableComponentInternal = React.Component<any, any> & FocusableInternal;\n\nexport interface StoredFocusableComponent {\n    id: string;\n    numericId: number;\n    component: FocusableComponentInternal;\n    onFocus: () => void;\n    accessibleOnly: boolean;\n    restricted: boolean;\n    limitedCount: number;\n    limitedCountAccessible: number;\n    removed?: boolean;\n    callbacks?: FocusableComponentStateCallback[];\n}\n\nexport type FocusableComponentStateCallback = (restrictedOrLimited: boolean) => void;\n\nexport type FocusManagerRestrictionStateCallback = (restricted: RestrictFocusType) => void;\n\nexport abstract class FocusManager {\n    private static _restrictionStack: FocusManager[] = [];\n    protected static _currentRestrictionOwner: FocusManager | undefined;\n    private static _restoreRestrictionTimer: number | undefined;\n    private static _pendingPrevFocusedComponent: StoredFocusableComponent | undefined;\n    protected static _currentFocusedComponent: StoredFocusableComponent | undefined;\n    protected static _allFocusableComponents: { [id: string]: StoredFocusableComponent } = {};\n    protected static _skipFocusCheck = false;\n    protected static _resetFocusTimer: number | undefined;\n\n    private _parent: FocusManager | undefined;\n    private _isFocusLimited: Types.LimitFocusType = Types.LimitFocusType.Unlimited;\n    private _currentRestrictType: RestrictFocusType = RestrictFocusType.Unrestricted;\n    private _prevFocusedComponent: StoredFocusableComponent | undefined;\n    protected _myFocusableComponentIds: { [id: string]: boolean } = {};\n    private _restrictionStateCallback: FocusManagerRestrictionStateCallback | undefined;\n\n    constructor(parent: FocusManager | undefined) {\n        this._parent = parent;\n    }\n\n    protected abstract /* static */ addFocusListenerOnComponent(component: FocusableComponentInternal, onFocus: () => void): void;\n    protected abstract /* static */ removeFocusListenerFromComponent(component: FocusableComponentInternal, onFocus: () => void): void;\n    protected abstract /* static */ focusComponent(component: FocusableComponentInternal): boolean;\n\n    protected abstract /* static */ resetFocus(focusFirstWhenNavigatingWithKeyboard: boolean): void;\n    protected abstract /* static */ _updateComponentFocusRestriction(storedComponent: StoredFocusableComponent): void;\n\n    // Whenever the focusable element is mounted, we let the application\n    // know so that FocusManager could account for this element during the\n    // focus restriction.\n    addFocusableComponent(component: FocusableComponentInternal, accessibleOnly = false): void {\n        if (component.focusableComponentId) {\n            return;\n        }\n\n        const numericComponentId = ++_lastComponentId;\n        const componentId: string = 'fc-' + numericComponentId;\n\n        const storedComponent: StoredFocusableComponent = {\n            id: componentId,\n            numericId: numericComponentId,\n            component: component,\n            accessibleOnly: accessibleOnly,\n            restricted: false,\n            limitedCount: 0,\n            limitedCountAccessible: 0,\n            onFocus: () => {\n                FocusManager._currentFocusedComponent = storedComponent;\n            },\n        };\n\n        component.focusableComponentId = componentId;\n        FocusManager._allFocusableComponents[componentId] = storedComponent;\n\n        let withinRestrictionOwner = false;\n\n        for (let parent: FocusManager | undefined = this; parent; parent = parent._parent) {\n            parent._myFocusableComponentIds[componentId] = true;\n\n            if (FocusManager._currentRestrictionOwner === parent) {\n                withinRestrictionOwner = true;\n            }\n\n            if (parent._isFocusLimited === Types.LimitFocusType.Accessible) {\n                storedComponent.limitedCountAccessible++;\n            } else if (parent._isFocusLimited === Types.LimitFocusType.Limited) {\n                storedComponent.limitedCount++;\n            }\n        }\n\n        if (!withinRestrictionOwner && FocusManager._currentRestrictionOwner) {\n            storedComponent.restricted = true;\n        }\n\n        this._updateComponentFocusRestriction(storedComponent);\n\n        this.addFocusListenerOnComponent(component, storedComponent.onFocus);\n    }\n\n    removeFocusableComponent(component: FocusableComponentInternal): void {\n        if (!component.focusableComponentId) {\n            return;\n        }\n        const componentId: string = component.focusableComponentId;\n\n        if (componentId) {\n            const storedComponent: StoredFocusableComponent = FocusManager._allFocusableComponents[componentId];\n\n            this.removeFocusListenerFromComponent(component, storedComponent.onFocus);\n\n            storedComponent.removed = true;\n            storedComponent.restricted = false;\n            storedComponent.limitedCount = 0;\n            storedComponent.limitedCountAccessible = 0;\n\n            this._updateComponentFocusRestriction(storedComponent);\n\n            delete storedComponent.callbacks;\n\n            for (let parent: FocusManager | undefined = this; parent; parent = parent._parent) {\n                delete parent._myFocusableComponentIds[componentId];\n            }\n\n            delete FocusManager._allFocusableComponents[componentId];\n            delete component.focusableComponentId;\n        }\n    }\n\n    restrictFocusWithin(restrictType: RestrictFocusType, noFocusReset?: boolean): void {\n        // Limit the focus received by the keyboard navigation to all\n        // the descendant focusable elements by setting tabIndex of all\n        // other elements to -1.\n        if ((FocusManager._currentRestrictionOwner === this) || (restrictType === RestrictFocusType.Unrestricted)) {\n            return;\n        }\n\n        this._currentRestrictType = restrictType;\n\n        if (FocusManager._currentRestrictionOwner) {\n            this._removeFocusRestriction();\n        }\n\n        if (!this._prevFocusedComponent) {\n            this._prevFocusedComponent = FocusManager._pendingPrevFocusedComponent || FocusManager._currentFocusedComponent;\n        }\n\n        FocusManager._clearRestoreRestrictionTimeout();\n\n        FocusManager._restrictionStack.push(this);\n        FocusManager._currentRestrictionOwner = this;\n\n        if (!noFocusReset) {\n            this.resetFocus(restrictType === RestrictFocusType.RestrictedFocusFirst);\n        }\n\n        Object.keys(FocusManager._allFocusableComponents).forEach(componentId => {\n            if (!(componentId in this._myFocusableComponentIds)) {\n                const storedComponent = FocusManager._allFocusableComponents[componentId];\n                storedComponent.restricted = true;\n                this._updateComponentFocusRestriction(storedComponent);\n            }\n        });\n\n        if (this._restrictionStateCallback) {\n            this._restrictionStateCallback(restrictType);\n        }\n    }\n\n    removeFocusRestriction(): void {\n        // Restore the focus to the previous view with restrictFocusWithin or\n        // remove the restriction if there is no such view.\n        FocusManager._restrictionStack = FocusManager._restrictionStack.filter(focusManager => focusManager !== this);\n\n        if (FocusManager._currentRestrictionOwner === this) {\n            // We'll take care of setting the proper focus below,\n            // no need to do a regular check for focusout.\n            FocusManager._skipFocusCheck = true;\n\n            let prevFocusedComponent = this._prevFocusedComponent;\n            this._prevFocusedComponent = undefined;\n\n            this._removeFocusRestriction();\n            FocusManager._currentRestrictionOwner = undefined;\n\n            if (this._restrictionStateCallback) {\n                this._restrictionStateCallback(RestrictFocusType.Unrestricted);\n            }\n\n            // Defer the previous restriction restoration to wait for the current view\n            // to be unmounted, or for the next restricted view to be mounted (like\n            // showing a modal after a popup).\n            FocusManager._clearRestoreRestrictionTimeout();\n            FocusManager._pendingPrevFocusedComponent = prevFocusedComponent;\n\n            FocusManager._restoreRestrictionTimer = Timers.setTimeout(() => {\n                FocusManager._restoreRestrictionTimer = undefined;\n                FocusManager._pendingPrevFocusedComponent = undefined;\n\n                const prevRestrictionOwner = FocusManager._restrictionStack.pop();\n\n                let needsFocusReset = true;\n\n                const currentFocusedComponent = FocusManager._currentFocusedComponent;\n                if (currentFocusedComponent && !currentFocusedComponent.removed &&\n                        !(currentFocusedComponent.id in this._myFocusableComponentIds)) {\n                    // The focus has been manually moved to something outside of the current\n                    // restriction scope, we should skip focusing the component which was\n                    // focused before the restriction and keep the focus as it is.\n                    prevFocusedComponent = undefined;\n                    needsFocusReset = false;\n                }\n\n                if (prevFocusedComponent &&\n                    !prevFocusedComponent.accessibleOnly &&\n                    !prevFocusedComponent.removed &&\n                    !prevFocusedComponent.restricted &&\n                    prevFocusedComponent.limitedCount === 0 &&\n                    prevFocusedComponent.limitedCountAccessible === 0) {\n                    // If possible, focus the previously focused component.\n                    needsFocusReset = !this.focusComponent(prevFocusedComponent.component);\n                }\n\n                if (prevRestrictionOwner) {\n                    prevRestrictionOwner.restrictFocusWithin(prevRestrictionOwner._currentRestrictType, !needsFocusReset);\n                } else if (needsFocusReset) {\n                    this.resetFocus(this._currentRestrictType === RestrictFocusType.RestrictedFocusFirst);\n                }\n            }, 100);\n        }\n    }\n\n    limitFocusWithin(limitType: Types.LimitFocusType): void {\n        if (this._isFocusLimited !== Types.LimitFocusType.Unlimited ||\n            (limitType !== Types.LimitFocusType.Limited &&\n             limitType !== Types.LimitFocusType.Accessible)) {\n            return;\n        }\n\n        this._isFocusLimited = limitType;\n\n        Object.keys(this._myFocusableComponentIds).forEach(componentId => {\n            const storedComponent = FocusManager._allFocusableComponents[componentId];\n\n            if (limitType === Types.LimitFocusType.Accessible) {\n                storedComponent.limitedCountAccessible++;\n            } else if (limitType === Types.LimitFocusType.Limited) {\n                storedComponent.limitedCount++;\n            }\n\n            this._updateComponentFocusRestriction(storedComponent);\n        });\n    }\n\n    removeFocusLimitation(): void {\n        if (this._isFocusLimited === Types.LimitFocusType.Unlimited) {\n            return;\n        }\n\n        Object.keys(this._myFocusableComponentIds).forEach(componentId => {\n            const storedComponent = FocusManager._allFocusableComponents[componentId];\n\n            if (this._isFocusLimited === Types.LimitFocusType.Accessible) {\n                storedComponent.limitedCountAccessible--;\n            } else if (this._isFocusLimited === Types.LimitFocusType.Limited) {\n                storedComponent.limitedCount--;\n            }\n\n            this._updateComponentFocusRestriction(storedComponent);\n        });\n\n        this._isFocusLimited = Types.LimitFocusType.Unlimited;\n    }\n\n    release(): void {\n        this.removeFocusRestriction();\n        this.removeFocusLimitation();\n    }\n\n    static subscribe(component: FocusableComponentInternal, callback: FocusableComponentStateCallback): void {\n        const storedComponent = FocusManager._getStoredComponent(component);\n\n        if (storedComponent) {\n            if (!storedComponent.callbacks) {\n                storedComponent.callbacks = [];\n            }\n\n            storedComponent.callbacks.push(callback);\n        }\n    }\n\n    static unsubscribe(component: FocusableComponentInternal, callback: FocusableComponentStateCallback): void {\n        const storedComponent = FocusManager._getStoredComponent(component);\n\n        if (storedComponent && storedComponent.callbacks) {\n            storedComponent.callbacks = storedComponent.callbacks.filter(cb => cb !== callback);\n        }\n    }\n\n    setRestrictionStateCallback(callback: FocusManagerRestrictionStateCallback | undefined): void {\n        this._restrictionStateCallback = callback;\n    }\n\n    static isComponentFocusRestrictedOrLimited(component: FocusableComponentInternal): boolean {\n        const storedComponent = FocusManager._getStoredComponent(component);\n        return !!storedComponent &&\n            (storedComponent.restricted || storedComponent.limitedCount > 0 || storedComponent.limitedCountAccessible > 0);\n    }\n\n    static getCurrentFocusedComponent(): string | undefined {\n        return FocusManager._currentFocusedComponent ? FocusManager._currentFocusedComponent.id : undefined;\n    }\n\n    private static _getStoredComponent(component: FocusableComponentInternal): StoredFocusableComponent | undefined {\n        const componentId: string | undefined = component.focusableComponentId;\n\n        if (componentId) {\n            return FocusManager._allFocusableComponents[componentId];\n        }\n\n        return undefined;\n    }\n\n    protected static _callFocusableComponentStateChangeCallbacks(storedComponent: StoredFocusableComponent,\n            restrictedOrLimited: boolean): void {\n        if (!storedComponent.callbacks) {\n            return;\n        }\n\n        storedComponent.callbacks.forEach(callback => {\n            callback.call(storedComponent.component, restrictedOrLimited);\n        });\n    }\n\n    private /* static */ _removeFocusRestriction(): void {\n        Object.keys(FocusManager._allFocusableComponents).forEach(componentId => {\n            const storedComponent = FocusManager._allFocusableComponents[componentId];\n            storedComponent.restricted = false;\n            this._updateComponentFocusRestriction(storedComponent);\n        });\n    }\n\n    private static _clearRestoreRestrictionTimeout(): void {\n        if (FocusManager._restoreRestrictionTimer) {\n            Timers.clearTimeout(FocusManager._restoreRestrictionTimer);\n            FocusManager._restoreRestrictionTimer = undefined;\n            FocusManager._pendingPrevFocusedComponent = undefined;\n        }\n    }\n}\n\n// A mixin for the focusable elements, to tell the views that\n// they exist and should be accounted during the focus restriction.\n//\n// isConditionallyFocusable is an optional callback which will be\n// called for componentDidMount() or for UNSAFE_componentWillUpdate() to\n// determine if the component is actually focusable.\n//\n// accessibleOnly is true for components that support just being focused\n// by screen readers.\n// By default components support both screen reader and keyboard focusing.\nexport function applyFocusableComponentMixin(Component: any, isConditionallyFocusable?: Function, accessibleOnly = false): void {\n    const contextTypes = Component.contextTypes || {};\n    contextTypes.focusManager = PropTypes.object;\n    Component.contextTypes = contextTypes;\n\n    inheritMethod('componentDidMount', function(this: FocusableComponentInternal, focusManager: FocusManager) {\n        if (!isConditionallyFocusable || isConditionallyFocusable.call(this)) {\n            focusManager.addFocusableComponent(this, accessibleOnly);\n        }\n    });\n\n    inheritMethod('componentWillUnmount', function(this: FocusableComponentInternal, focusManager: FocusManager) {\n        focusManager.removeFocusableComponent(this);\n    });\n\n    inheritMethod('UNSAFE_componentWillUpdate', function(this: FocusableComponentInternal, focusManager: FocusManager,\n            origArgs: IArguments) {\n        if (isConditionallyFocusable) {\n            const isFocusable = isConditionallyFocusable.apply(this, origArgs);\n\n            if (isFocusable && !this.focusableComponentId) {\n                focusManager.addFocusableComponent(this, accessibleOnly);\n            } else if (!isFocusable && this.focusableComponentId) {\n                focusManager.removeFocusableComponent(this);\n            }\n        }\n    });\n\n    function inheritMethod(methodName: string, action: Function): void {\n        const origCallback = Component.prototype[methodName];\n\n        Component.prototype[methodName] = function() {\n            if (!isConditionallyFocusable || isConditionallyFocusable.call(this)) {\n\n                const focusManager: FocusManager = this._focusManager || (this.context && this.context.focusManager);\n\n                if (focusManager) {\n                    action.call(this, focusManager, arguments);\n                } else {\n                    if (AppConfig.isDevelopmentMode()) {\n                        console.error('FocusableComponentMixin: context error!');\n                    }\n                }\n            }\n\n            if (origCallback) {\n                origCallback.apply(this, arguments);\n            }\n        };\n    }\n}\n\nexport default FocusManager;\n"
  },
  {
    "path": "src/common/utils/PromiseDefer.ts",
    "content": "\n/**\n * PromiseDefer.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Creates a deferral object that wraps promises with easier to use type-safety\n */\n\nimport Timers from './Timers';\n\nexport class Defer<T> {\n    private _promise: Promise<T>;\n    private _resolver: ((value: T) => void) | undefined;\n    private _rejector: ((value: any) => void) | undefined;\n    constructor() {\n        this._promise = new Promise<T>((res, rej) => {\n            this._resolver = res;\n            this._rejector = rej;\n        });\n    }\n\n    resolve(value: T): void {\n        // Resolver shouldn't be undefined, but it's technically possible\n        if (!this._resolver) {\n            Timers.setTimeout(() => {\n                this.resolve(value);\n            }, 10);\n            return;\n        }\n        this._resolver(value);\n    }\n\n    reject(value: any): void {\n        // Rejector shouldn't be undefined, but it's technically possible\n        if (!this._rejector) {\n            Timers.setTimeout(() => {\n                this.reject(value);\n            }, 10);\n            return;\n        }\n        this._rejector(value);\n    }\n\n    promise(): Promise<T> {\n        return this._promise;\n    }\n}\n"
  },
  {
    "path": "src/common/utils/Timers.ts",
    "content": "/**\n * Timers.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Utility functions for creating timers. We wrap the normal\n * global timer methods because they are defined in both\n * the node and lib type definition files, and the definitions\n * don't match. Depending on which one TypeScript picks up,\n * we can get compiler errors.\n */\n\n// global typing doesn't exist without node.d.ts, but we don't want it since this isn't a nodeJS app by default\ndeclare let global: any;\n\nconst timerProvider = typeof window !== 'undefined' ? window : global;\n\nexport default class Timers {\n    static clearInterval(handle: number): void {\n        timerProvider.clearInterval(handle);\n    }\n\n    static clearTimeout(handle: number): void {\n        timerProvider.clearTimeout(handle);\n    }\n\n    static setInterval(handler: () => void, timeout: number): number {\n        return timerProvider.setInterval(handler, timeout);\n    }\n\n    static setTimeout(handler: () => void, timeout: number): number {\n        return timerProvider.setTimeout(handler, timeout);\n    }\n}\n"
  },
  {
    "path": "src/ios/Accessibility.ts",
    "content": "/**\n * Accessibility.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * An iOS variant of Accessibility that performs announcements by calling\n * React Native announcement API for iOS.\n */\n\nimport * as RN from 'react-native';\n\nimport { Accessibility as NativeAccessibility } from '../native-common/Accessibility';\n\ninterface AnnouncementFinishedPayload {\n    announcement: string;\n    success: boolean;\n}\n\nconst RetryTimeout = 3000; // 3 seconds\n\nexport class Accessibility extends NativeAccessibility {\n    // Queue of pending announcements.\n    private _announcementQueue: string[] = [];\n    private _retryTimestamp = NaN;\n\n    constructor() {\n        super();\n\n        // Some versions of RN don't support this interface.\n        if (RN.AccessibilityInfo) {\n            // Subscribe to an event to get notified when an announcement will finish.\n            RN.AccessibilityInfo.addEventListener('announcementFinished', this._recalcAnnouncement);\n            // Subscribe to clear queue depending on app state\n            RN.AppState.addEventListener('change', this._trackQueueStatus);\n        }\n    }\n\n    protected _updateScreenReaderStatus(isEnabled: boolean): void {\n        super._updateScreenReaderStatus(isEnabled);\n        // Empty announcement queue when screen reader is disabled.\n        if (!isEnabled && this._announcementQueue.length > 0) {\n            this._announcementQueue = [];\n        }\n    }\n\n    announceForAccessibility(announcement: string): void {\n        super.announceForAccessibility(announcement);\n\n        // Update the queue only if screen reader is enabled. Else we won't receive a callback of\n        // announcement did finish and queued items will never be removed.\n        if (this._isScreenReaderEnabled) {\n            this._announcementQueue.push(announcement);\n            // Post announcement if it's the only announcement in queue.\n            if (this._announcementQueue.length === 1) {\n                this._postAnnouncement(announcement);\n            }\n        }\n    }\n\n    private _trackQueueStatus = (newState: string): void => {\n        if (this._isScreenReaderEnabled && ['background', 'inactive'].indexOf(newState) >= 0) {\n            this._announcementQueue = [];\n            this._retryTimestamp = NaN;\n        }\n    };\n\n    private _postAnnouncement(announcement: string, resetTimestamp = true): void {\n        if (resetTimestamp) {\n            this._retryTimestamp = Date.now();\n        }\n\n        // Some versions of RN don't support this interface.\n        if (RN.AccessibilityInfo && RN.AccessibilityInfo.announceForAccessibility) {\n            RN.AccessibilityInfo.announceForAccessibility(announcement);\n        }\n    }\n\n    private _recalcAnnouncement = (payload: AnnouncementFinishedPayload): void => {\n        if (this._announcementQueue.length === 0) {\n            return;\n        }\n\n        const postedAnnouncement = this._announcementQueue[0];\n        // Handle retries if it's the announcement we posted. Drop other announcements.\n        if (this._compareRawAnnouncements(postedAnnouncement, payload.announcement)) {\n            const timeElapsed = Date.now() - this._retryTimestamp;\n\n            if (!payload.success && timeElapsed < RetryTimeout) {\n                this._postAnnouncement(payload.announcement, false);\n            } else {\n                // Successfully announced or timed out. Schedule next announcement.\n                this._announcementQueue.shift();\n                if (this._announcementQueue.length > 0) {\n                    const nextAnnouncement = this._announcementQueue[0];\n                    this._postAnnouncement(nextAnnouncement);\n                }\n            }\n        }\n    };\n\n    private _compareRawAnnouncements(postedAnnouncement: string, payloadAnnouncement: string): boolean {\n        const spacesCommasRegExp = /[\\s,]/g; // special regex for iOS 12\n        return payloadAnnouncement.replace(spacesCommasRegExp, '') === postedAnnouncement.replace(spacesCommasRegExp, '');\n    }\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/ios/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * iOS-specific accessibility utils.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport Accessibility from '../native-common/Accessibility';\nimport { AccessibilityPlatformUtil } from '../common/AccessibilityUtil';\n\nexport class AccessibilityUtil extends AccessibilityPlatformUtil {\n    setAccessibilityFocus(component: React.Component<any, any>): void {\n        if (Accessibility.isScreenReaderEnabled() && RN.AccessibilityInfo && RN.AccessibilityInfo.setAccessibilityFocus) {\n            const nodeHandle = RN.findNodeHandle(component);\n\n            if (nodeHandle) {\n                RN.AccessibilityInfo.setAccessibilityFocus(nodeHandle);\n            } else {\n                console.warn('Could not find node handle to set accessibility focus.');\n            }\n        }\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/ios/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * iOS-specific implementation of GestureView component.\n */\n\nimport { GestureView as BaseGestureView } from '../native-common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nconst _preferredPanRatio = 3;\n\nexport class GestureView extends BaseGestureView {\n\n    constructor(props: Types.GestureViewProps) {\n        super(props);\n    }\n\n    protected _getPreferredPanRatio(): number {\n        return _preferredPanRatio;\n    }\n\n    protected _getEventTimestamp(e: Types.TouchEvent | Types.MouseEvent): number {\n        let timestamp = e.timeStamp;\n\n        // Work around a bug in some versions of RN where \"timestamp\" is\n        // capitalized differently for some events.\n        if (!timestamp) {\n            timestamp = (e as any).timestamp;\n        }\n\n        if (!timestamp) {\n            return 0;\n        }\n\n        return timestamp.valueOf();\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/ios/Linking.ts",
    "content": "/**\n * Linking.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * iOS-specific implementation for deep linking.\n */\n\nimport { Types } from '../common/Interfaces';\nimport { Linking as CommonLinking } from '../native-common/Linking';\n\nexport class Linking extends CommonLinking {\n    // Escaped SMS uri - sms:<phoneNumber>&body=<messageString>\n    protected _createSmsUrl(smsInfo: Types.SmsInfo): string {\n        let smsUrl = 'sms:';\n        if (smsInfo.phoneNumber) {\n            smsUrl += encodeURI(smsInfo.phoneNumber);\n        }\n\n        if (smsInfo.body) {\n            // iOS uses the & delimiter instead of the regular ?.\n            smsUrl += '&body=' + encodeURIComponent(smsInfo.body);\n        }\n        return smsUrl;\n    }\n}\n\nexport default new Linking();\n"
  },
  {
    "path": "src/ios/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Wrapper for all ReactXP functionality. Users of ReactXP should import just this\n* file instead of internals.\n*/\n\nimport React = require('react');\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport ActivityIndicatorImpl from '../native-common/ActivityIndicator';\nimport AlertImpl from '../native-common/Alert';\nimport AnimatedImpl = require('../native-common/Animated');\nimport AppImpl from '../native-common/App';\nimport ButtonImpl from '../native-common/Button';\nimport ClipboardImpl from '../native-common/Clipboard';\nimport ImageImpl from '../native-common/Image';\nimport InputImpl from '../native-common/Input';\nimport RXInterfaces = require('../common/Interfaces');\nimport InternationalImpl from '../native-common/International';\nimport LinkImpl from '../native-common/Link';\nimport LocationImpl from '../common/Location';\nimport ModalImpl from '../native-common/Modal';\nimport RXModuleInterface = require('../common/ModuleInterface');\nimport PickerImpl from '../native-common/Picker';\nimport PlatformImpl from '../native-common/Platform';\nimport PopupImpl from '../native-common/Popup';\nimport ScrollViewImpl from '../native-common/ScrollView';\nimport StorageImpl from '../native-common/Storage';\nimport StylesImpl from '../native-common/Styles';\nimport TextImpl from '../native-common/Text';\nimport TextInputImpl from '../native-common/TextInput';\nimport RXTypes = require('../common/Types');\nimport UserInterfaceImpl from '../native-common/UserInterface';\nimport UserPresenceImpl from '../native-common/UserPresence';\nimport ViewImpl from '../native-common/View';\n\nimport AccessibilityImpl from './Accessibility';\nimport AccessibilityPlatformUtil from './AccessibilityUtil';\nimport GestureViewImpl from './GestureView';\nimport LinkingImpl from './Linking';\nimport StatusBarImpl from './StatusBar';\n\nAccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nmodule ReactXP {\n    export type Accessibility = RXInterfaces.Accessibility;\n    export let Accessibility: RXInterfaces.Accessibility = AccessibilityImpl;\n    export type ActivityIndicator = RXInterfaces.ActivityIndicator;\n    export let ActivityIndicator: typeof RXInterfaces.ActivityIndicator = ActivityIndicatorImpl;\n    export type Alert = RXInterfaces.Alert;\n    export let Alert: RXInterfaces.Alert = AlertImpl;\n    export type App = RXInterfaces.App;\n    export let App: RXInterfaces.App = AppImpl;\n    export type Button = RXInterfaces.Button;\n    export let Button: typeof RXInterfaces.Button = ButtonImpl;\n    export type Picker = RXInterfaces.Picker;\n    export let Picker: typeof RXInterfaces.Picker = PickerImpl;\n    export type Clipboard = RXInterfaces.Clipboard;\n    export let Clipboard: RXInterfaces.Clipboard = ClipboardImpl;\n    export type GestureView = RXInterfaces.GestureView;\n    export let GestureView: typeof RXInterfaces.GestureView = GestureViewImpl;\n    export type Image = RXInterfaces.Image;\n    export let Image: RXInterfaces.ImageConstructor = ImageImpl;\n    export type Input = RXInterfaces.Input;\n    export let Input: RXInterfaces.Input = InputImpl;\n    export type International = RXInterfaces.International;\n    export let International: RXInterfaces.International = InternationalImpl;\n    export type Link = RXInterfaces.Link;\n    export let Link: typeof RXInterfaces.Link = LinkImpl;\n    export type Linking = RXInterfaces.Linking;\n    export let Linking: RXInterfaces.Linking = LinkingImpl;\n    export type Location = RXInterfaces.Location;\n    export let Location: RXInterfaces.Location = LocationImpl;\n    export type Modal = RXInterfaces.Modal;\n    export let Modal: RXInterfaces.Modal = ModalImpl;\n    export type Platform = RXInterfaces.Platform;\n    export let Platform: RXInterfaces.Platform = PlatformImpl;\n    export type Popup = RXInterfaces.Popup;\n    export let Popup: RXInterfaces.Popup = PopupImpl;\n    export type ScrollView = RXInterfaces.ScrollView;\n    export let ScrollView: RXInterfaces.ScrollViewConstructor = ScrollViewImpl;\n    export type StatusBar = RXInterfaces.StatusBar;\n    export let StatusBar: RXInterfaces.StatusBar = StatusBarImpl;\n    export type Storage = RXInterfaces.Storage;\n    export let Storage: RXInterfaces.Storage = StorageImpl;\n    export type Styles = RXInterfaces.Styles;\n    export let Styles: RXInterfaces.Styles = StylesImpl;\n    export type Text = RXInterfaces.Text;\n    export let Text: typeof RXInterfaces.Text = TextImpl;\n    export type TextInput = RXInterfaces.TextInput;\n    export let TextInput: typeof RXInterfaces.TextInput = TextInputImpl;\n    export type UserInterface = RXInterfaces.UserInterface;\n    export let UserInterface: RXInterfaces.UserInterface = UserInterfaceImpl;\n    export type UserPresence = RXInterfaces.UserPresence;\n    export let UserPresence: RXInterfaces.UserPresence = UserPresenceImpl;\n    export type View = RXInterfaces.View;\n    export let View: typeof RXInterfaces.View = ViewImpl;\n    export const Animated = AnimatedImpl.makeAnimated(AnimatedImpl.CommonAnimatedClasses);\n    export import CommonProps = RXTypes.CommonProps;\n    export import CommonStyledProps = RXTypes.CommonStyledProps;\n    export import Stateless = RXTypes.Stateless;\n    export import Types = RXTypes;\n\n    export import Component = React.Component;\n    export import ComponentBase = RXTypes.ComponentBase;\n    export import createElement = React.createElement;\n    export import Children = React.Children;\n    export let __spread = (React as any).__spread;\n    export import Fragment = React.Fragment;\n}\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nlet _rxImplementsRxInterface: typeof RXModuleInterface.ReactXP = ReactXP;\n_rxImplementsRxInterface = _rxImplementsRxInterface;\n\nexport = ReactXP;\n\n/*\nvar rx = module.exports;\nObject.keys(rx)\n    .filter(key => rx[key] && rx[key].prototype instanceof React.Component && !rx[key].displayName)\n    .forEach(key => rx[key].displayName = 'RX.' + key + '');\n*/\n"
  },
  {
    "path": "src/ios/StatusBar.ts",
    "content": "/**\n * StatusBar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * iOS-specific implementation of StatusBar APIs.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class StatusBar extends RX.StatusBar {\n    isOverlay(): boolean {\n        // iOS always draws the status bar as an overlay, as opposed\n        // to a view that takes up space of its own.\n        return true;\n    }\n\n    setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void {\n        RN.StatusBar.setBarStyle(style, animated);\n    }\n\n    setHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void {\n        RN.StatusBar.setHidden(hidden, showHideTransition);\n    }\n\n    setNetworkActivityIndicatorVisible(value: boolean): void {\n        RN.StatusBar.setNetworkActivityIndicatorVisible(value);\n    }\n\n    setBackgroundColor(color: string, animated: boolean): void {\n        // Nothing to do on iOS\n    }\n\n    setTranslucent(translucent: boolean): void {\n        // Nothing to do on iOS\n    }\n}\n\nexport default new StatusBar();\n"
  },
  {
    "path": "src/macos/Accessibility.ts",
    "content": "/**\n * Accessibility.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS variant of Accessibility that performs announcements by calling\n * React Native announcement API.\n */\n\nimport * as RN from 'react-native';\n\nimport { Accessibility as NativeAccessibility } from '../native-common/Accessibility';\n\ninterface AnnouncementFinishedPayload {\n    announcement: string;\n    success: boolean;\n}\n\nconst RetryTimeout = 3000; // 3 seconds\n\nexport class Accessibility extends NativeAccessibility {\n    // Queue of pending announcements.\n    private _announcementQueue: string[] = [];\n    private _retryTimestamp = NaN;\n\n    constructor() {\n        super();\n\n        // Some versions of RN don't support this interface.\n        if (RN.AccessibilityInfo) {\n            // Subscribe to an event to get notified when an announcement will finish.\n            RN.AccessibilityInfo.addEventListener('announcementFinished', this._recalcAnnouncement);\n            // Subscribe to clear queue depending on app state\n            RN.AppState.addEventListener('change', this._trackQueueStatus);\n        }\n    }\n\n    protected _updateScreenReaderStatus(isEnabled: boolean): void {\n        super._updateScreenReaderStatus(isEnabled);\n        // Empty announcement queue when screen reader is disabled.\n        if (!isEnabled && this._announcementQueue.length > 0) {\n            this._announcementQueue = [];\n        }\n    }\n\n    announceForAccessibility(announcement: string): void {\n        super.announceForAccessibility(announcement);\n\n        // Update the queue only if screen reader is enabled. Else we won't receive a callback of\n        // announcement did finish and queued items will never be removed.\n        if (this._isScreenReaderEnabled) {\n            this._announcementQueue.push(announcement);\n            // Post announcement if it's the only announcement in queue.\n            if (this._announcementQueue.length === 1) {\n                this._postAnnouncement(announcement);\n            }\n        }\n    }\n\n    private _trackQueueStatus = (newState: string): void => {\n        if (this._isScreenReaderEnabled && ['background', 'inactive'].indexOf(newState) >= 0) {\n            this._announcementQueue = [];\n            this._retryTimestamp = NaN;\n        }\n    };\n\n    private _postAnnouncement(announcement: string, resetTimestamp = true): void {\n        if (resetTimestamp) {\n            this._retryTimestamp = Date.now();\n        }\n\n        // Some versions of RN don't support this interface.\n        if (RN.AccessibilityInfo && RN.AccessibilityInfo.announceForAccessibility) {\n            RN.AccessibilityInfo.announceForAccessibility(announcement);\n        }\n    }\n\n    private _recalcAnnouncement = (payload: AnnouncementFinishedPayload): void => {\n        if (this._announcementQueue.length === 0) {\n            return;\n        }\n\n        const postedAnnouncement = this._announcementQueue[0];\n        // Handle retries if it's the announcement we posted. Drop other announcements.\n        if (payload.announcement === postedAnnouncement) {\n            const timeElapsed = Date.now() - this._retryTimestamp;\n\n            if (!payload.success && timeElapsed < RetryTimeout) {\n                this._postAnnouncement(payload.announcement, false);\n            } else {\n                // Successfully announced or timed out. Schedule next announcement.\n                this._announcementQueue.shift();\n                if (this._announcementQueue.length > 0) {\n                    const nextAnnouncement = this._announcementQueue[0];\n                    this._postAnnouncement(nextAnnouncement);\n                }\n            }\n        }\n    };\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/macos/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS-specific accessibility utils.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport Accessibility from '../native-common/Accessibility';\nimport { AccessibilityPlatformUtil } from '../common/AccessibilityUtil';\n\nexport class AccessibilityUtil extends AccessibilityPlatformUtil {\n    setAccessibilityFocus(component: React.Component<any, any>): void {\n        if (Accessibility.isScreenReaderEnabled() && RN.AccessibilityInfo && RN.AccessibilityInfo.setAccessibilityFocus) {\n            const nodeHandle = RN.findNodeHandle(component);\n\n            if (nodeHandle) {\n                RN.AccessibilityInfo.setAccessibilityFocus(nodeHandle);\n            } else {\n                console.warn('Could not find node handle to set accessibility focus.');\n            }\n        }\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/macos/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS-specific implementation of GestureView component.\n */\n\nimport { GestureView as BaseGestureView } from '../native-common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nconst _preferredPanRatio = 3;\n\nexport class GestureView extends BaseGestureView {\n\n    constructor(props: Types.GestureViewProps) {\n        super(props);\n    }\n\n    protected _getPreferredPanRatio(): number {\n        return _preferredPanRatio;\n    }\n\n    protected _getEventTimestamp(e: Types.TouchEvent | Types.MouseEvent): number {\n        let timestamp = e.timeStamp;\n\n        // Work around a bug in some versions of RN where \"timestamp\" is\n        // capitalized differently for some events.\n        if (!timestamp) {\n            timestamp = (e as any).timestamp;\n        }\n\n        if (!timestamp) {\n            return 0;\n        }\n\n        return timestamp.valueOf();\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/macos/Input.ts",
    "content": "/**\n * Input.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS implementation of Input interface.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class Input extends RX.Input {\n    constructor() {\n        super();\n    }\n}\n\nexport default new Input();\n"
  },
  {
    "path": "src/macos/Linking.ts",
    "content": "/**\n * Linking.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS-specific implementation for deep linking.\n */\n\nimport { Types } from '../common/Interfaces';\nimport { Linking as CommonLinking } from '../native-common/Linking';\n\nexport class Linking extends CommonLinking {\n    // Escaped SMS uri - sms:<phoneNumber>&body=<messageString>\n    protected _createSmsUrl(smsInfo: Types.SmsInfo): string {\n        let smsUrl = 'sms:';\n        if (smsInfo.phoneNumber) {\n            smsUrl += encodeURI(smsInfo.phoneNumber);\n        }\n\n        if (smsInfo.body) {\n            // (keep ios version for now)iOS uses the & delimiter instead of the regular ?.\n            smsUrl += '&body=' + encodeURIComponent(smsInfo.body);\n        }\n        return smsUrl;\n    }\n}\n\nexport default new Linking();\n"
  },
  {
    "path": "src/macos/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Wrapper for all ReactXP functionality. Users of ReactXP should import just this\n* file instead of internals.\n*/\n\nimport React = require('react');\nimport RN = require('react-native');\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport ActivityIndicatorImpl from '../native-common/ActivityIndicator';\nimport AlertImpl from '../native-common/Alert';\nimport { CommonAnimatedClasses, makeAnimated } from '../native-common/Animated';\nimport AppImpl from '../native-common/App';\nimport ButtonImpl from '../native-common/Button';\nimport ClipboardImpl from '../native-common/Clipboard';\nimport ImageImpl from '../native-common/Image';\nimport RXInterfaces = require('../common/Interfaces');\nimport InternationalImpl from '../native-common/International';\nimport LinkImpl from '../native-common/Link';\nimport LocationImpl from '../common/Location';\nimport ModalImpl from '../native-common/Modal';\nimport RXModuleInterface = require('../common/ModuleInterface');\nimport PickerImpl from '../native-common/Picker';\nimport PlatformImpl from '../native-common/Platform';\nimport PopupImpl from '../native-common/Popup';\nimport ScrollViewImpl from '../native-desktop/ScrollView';\nimport StorageImpl from '../native-common/Storage';\nimport StylesImpl from '../native-common/Styles';\nimport TextImpl from '../native-common/Text';\nimport TextInputImpl from '../native-common/TextInput';\nimport RXTypes = require('../common/Types');\nimport UserInterfaceImpl from '../native-common/UserInterface';\nimport UserPresenceImpl from '../native-common/UserPresence';\n\nimport AccessibilityImpl from './Accessibility';\nimport AccessibilityPlatformUtil from './AccessibilityUtil';\nimport GestureViewImpl from './GestureView';\nimport InputImpl from './Input';\nimport LinkingImpl from './Linking';\nimport StatusBarImpl from './StatusBar';\nimport ViewImpl from './View';\n\nAccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nmodule ReactXP {\n    export type Accessibility = RXInterfaces.Accessibility;\n    export let Accessibility: RXInterfaces.Accessibility = AccessibilityImpl;\n    export type ActivityIndicator = RXInterfaces.ActivityIndicator;\n    export let ActivityIndicator: typeof RXInterfaces.ActivityIndicator = ActivityIndicatorImpl;\n    export type Alert = RXInterfaces.Alert;\n    export let Alert: RXInterfaces.Alert = AlertImpl;\n    export type App = RXInterfaces.App;\n    export let App: RXInterfaces.App = AppImpl;\n    export type Button = RXInterfaces.Button;\n    export let Button: typeof RXInterfaces.Button = ButtonImpl;\n    export type Picker = RXInterfaces.Picker;\n    export let Picker: typeof RXInterfaces.Picker = PickerImpl;\n    export type Clipboard = RXInterfaces.Clipboard;\n    export let Clipboard: RXInterfaces.Clipboard = ClipboardImpl;\n    export type GestureView = RXInterfaces.GestureView;\n    export let GestureView: typeof RXInterfaces.GestureView = GestureViewImpl;\n    export type Image = RXInterfaces.Image;\n    export let Image: RXInterfaces.ImageConstructor = ImageImpl;\n    export type Input = RXInterfaces.Input;\n    export let Input: RXInterfaces.Input = InputImpl;\n    export type International = RXInterfaces.International;\n    export let International: RXInterfaces.International = InternationalImpl;\n    export type Link = RXInterfaces.Link;\n    export let Link: typeof RXInterfaces.Link = LinkImpl;\n    export type Linking = RXInterfaces.Linking;\n    export let Linking: RXInterfaces.Linking = LinkingImpl;\n    export type Location = RXInterfaces.Location;\n    export let Location: RXInterfaces.Location = LocationImpl;\n    export type Modal = RXInterfaces.Modal;\n    export let Modal: RXInterfaces.Modal = ModalImpl;\n    export type Platform = RXInterfaces.Platform;\n    export let Platform: RXInterfaces.Platform = PlatformImpl;\n    export type Popup = RXInterfaces.Popup;\n    export let Popup: RXInterfaces.Popup = PopupImpl;\n    export type ScrollView = RXInterfaces.ScrollView;\n    export let ScrollView: RXInterfaces.ScrollViewConstructor = ScrollViewImpl;\n    export type StatusBar = RXInterfaces.StatusBar;\n    export let StatusBar: RXInterfaces.StatusBar = StatusBarImpl;\n    export type Storage = RXInterfaces.Storage;\n    export let Storage: RXInterfaces.Storage = StorageImpl;\n    export type Styles = RXInterfaces.Styles;\n    export let Styles: RXInterfaces.Styles = StylesImpl;\n    export type Text = RXInterfaces.Text;\n    export let Text: typeof RXInterfaces.Text = TextImpl;\n    export type TextInput = RXInterfaces.TextInput;\n    export let TextInput: typeof RXInterfaces.TextInput = TextInputImpl;\n    export type UserInterface = RXInterfaces.UserInterface;\n    export let UserInterface: RXInterfaces.UserInterface = UserInterfaceImpl;\n    export type UserPresence = RXInterfaces.UserPresence;\n    export let UserPresence: RXInterfaces.UserPresence = UserPresenceImpl;\n    export type View = RXInterfaces.View;\n    export let View: typeof RXInterfaces.View = ViewImpl;\n\n    const macAnimatedClasses =  {\n        ...CommonAnimatedClasses,\n        TextInput: RN.Animated.createAnimatedComponent(TextInputImpl),\n        View: RN.Animated.createAnimatedComponent(ViewImpl),\n    };\n\n    export const Animated = makeAnimated(macAnimatedClasses);\n    export import CommonProps = RXTypes.CommonProps;\n    export import CommonStyledProps = RXTypes.CommonStyledProps;\n    export import Stateless = RXTypes.Stateless;\n    export import Types = RXTypes;\n\n    export import Component = React.Component;\n    export import ComponentBase = RXTypes.ComponentBase;\n    export import createElement = React.createElement;\n    export import Children = React.Children;\n    export let __spread = (React as any).__spread;\n    export import Fragment = React.Fragment;\n}\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nlet _rxImplementsRxInterface: typeof RXModuleInterface.ReactXP = ReactXP;\n_rxImplementsRxInterface = _rxImplementsRxInterface;\nexport = ReactXP;\n\n/*\nvar rx = module.exports;\nObject.keys(rx)\n    .filter(key => rx[key] && rx[key].prototype instanceof React.Component && !rx[key].displayName)\n    .forEach(key => rx[key].displayName = 'RX.' + key + '');\n*/\n"
  },
  {
    "path": "src/macos/StatusBar.ts",
    "content": "/**\n * StatusBar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * MacOS-specific implementation of StatusBar APIs.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class StatusBar extends RX.StatusBar {\n    isOverlay(): boolean {\n        // No status bar support on MacOS\n        return false;\n    }\n\n    setHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void {\n        // Nothing to do on MacOS\n    }\n\n    setBackgroundColor(color: string, animated: boolean): void {\n        // Nothing to do on MacOS\n    }\n\n    setTranslucent(translucent: boolean): void {\n        // Nothing to do on MacOS\n    }\n\n    setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void {\n        // Nothing to do on MacOS\n    }\n\n    setNetworkActivityIndicatorVisible(value: boolean): void {\n        // Nothing to do on MacOS\n    }\n}\n\nexport default new StatusBar();\n"
  },
  {
    "path": "src/macos/View.tsx",
    "content": "/**\n * View.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Mac-specific implementation of View.\n */\nimport * as React from 'react';\n\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport { Types } from '../common/Interfaces';\nimport { View as ViewCommon } from '../native-common/View';\n\nexport class View extends ViewCommon {\n\n    protected _buildInternalProps(props: Types.ViewProps) {\n        // Base class does the bulk of _internalprops creation\n        super._buildInternalProps(props);\n\n        // Drag and drop related properties\n        for (const name of ['onDragEnter', 'onDragOver', 'onDrop', 'onDragLeave']) {\n            const handler = this._internalProps[name];\n\n            if (handler) {\n                this._internalProps.allowDrop = true;\n\n                this._internalProps[name] = (e: React.SyntheticEvent<View>) => {\n                    const dndEvent = EventHelpers.toDragEvent(e);\n                    handler(dndEvent);\n                };\n            }\n        }\n\n        for (const name of ['onDragStart', 'onDrag', 'onDragEnd']) {\n            const handler = this._internalProps[name];\n\n            if (handler) {\n                if (name === 'onDragStart') {\n                    this._internalProps.allowDrag = true;\n                }\n\n                this._internalProps[name] = (e: React.SyntheticEvent<View>) => {\n                    const dndEvent = EventHelpers.toDragEvent(e);\n                    handler(dndEvent);\n                };\n            }\n        }\n    }\n\n}\n\nexport default View;\n"
  },
  {
    "path": "src/native-common/Accessibility.ts",
    "content": "/**\n * Accessibility.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native wrapper for accessibility helper.\n */\n\nimport * as RN from 'react-native';\n\nimport { Accessibility as CommonAccessibility } from '../common/Accessibility';\nimport AppConfig from '../common/AppConfig';\nimport { Types } from '../common/Interfaces';\n\nexport interface MacComponentAccessibilityProps {\n    onClick?: (e: Types.SyntheticEvent) => void;\n    acceptsKeyboardFocus?: true;\n    enableFocusRing?: true;\n}\n\nexport class Accessibility extends CommonAccessibility {\n    protected _isScreenReaderEnabled = false;\n\n    constructor() {\n        super();\n\n        let initialStateChanged = false;\n\n        // Some versions of RN don't support this interface.\n        if (RN.AccessibilityInfo) {\n            // Subscribe to an event to get notified when screen reader is enabled or disabled.\n            RN.AccessibilityInfo.addEventListener('change', (isEnabled: boolean) => {\n                initialStateChanged = true;\n                this._updateScreenReaderStatus(isEnabled);\n            });\n\n            // Fetch initial state.\n            RN.AccessibilityInfo.fetch().then(isEnabled => {\n                if (!initialStateChanged) {\n                    this._updateScreenReaderStatus(isEnabled);\n                }\n            }).catch(err => {\n                if (AppConfig.isDevelopmentMode()) {\n                    console.error('Accessibility: RN.AccessibilityInfo.fetch failed');\n                }\n            });\n        }\n    }\n\n    protected _updateScreenReaderStatus(isEnabled: boolean): void {\n        if (this._isScreenReaderEnabled !== isEnabled) {\n            this._isScreenReaderEnabled = isEnabled;\n            this.screenReaderChangedEvent.fire(isEnabled);\n        }\n    }\n\n    isScreenReaderEnabled(): boolean {\n        return this._isScreenReaderEnabled;\n    }\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/native-common/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of accessiblity functions for cross-platform\n * ReactXP framework.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport {\n    AccessibilityPlatformUtil,\n    AccessibilityUtil as CommonAccessibilityUtil,\n} from '../common/AccessibilityUtil';\nimport { Types } from '../common/Interfaces';\n\nimport * as _ from './utils/lodashMini';\n\nexport { ImportantForAccessibilityValue } from '../common/AccessibilityUtil';\n\ntype AccessibilityLiveRegionValue = 'none' | 'polite' | 'assertive';\n\nconst liveRegionMap: { [key: string]: AccessibilityLiveRegionValue } = {\n    [Types.AccessibilityLiveRegion.None]: 'none',\n    [Types.AccessibilityLiveRegion.Assertive]: 'assertive',\n    [Types.AccessibilityLiveRegion.Polite]: 'polite',\n};\n\n// iOS supported map.\nconst traitsMap: { [key: string]: string } = {\n    [Types.AccessibilityTrait.None]: 'none',\n\n    // NOTE: Tab trait isn't supported on iOS. Setting it to none, allows us to give it a custom\n    // label. This needs to be done for any custom role, which needs to be supported on iOS.\n    [Types.AccessibilityTrait.Tab]: 'none',\n\n    [Types.AccessibilityTrait.Button]: 'button',\n    [Types.AccessibilityTrait.Link]: 'link',\n    [Types.AccessibilityTrait.Header]: 'header',\n    [Types.AccessibilityTrait.Search]: 'search',\n    [Types.AccessibilityTrait.Image]: 'image',\n    [Types.AccessibilityTrait.Summary]: 'summary',\n    [Types.AccessibilityTrait.Adjustable]: 'adjustable',\n    [Types.AccessibilityTrait.Selected]: 'selected',\n    [Types.AccessibilityTrait.Plays]: 'plays',\n    [Types.AccessibilityTrait.Key]: 'key',\n    [Types.AccessibilityTrait.Text]: 'text',\n    [Types.AccessibilityTrait.Disabled]: 'disabled',\n    [Types.AccessibilityTrait.FrequentUpdates]: 'frequentUpdates',\n    [Types.AccessibilityTrait.StartsMedia]: 'startsMedia',\n    [Types.AccessibilityTrait.AllowsDirectInteraction]: 'allowsDirectionInteraction',\n    [Types.AccessibilityTrait.PageTurn]: 'pageTurn',\n    [Types.AccessibilityTrait.ListItem]: 'listItem',\n};\n\ntype AccessibilityComponentTypeValue = 'none' | 'button' | 'radiobutton_checked' | 'radiobutton_unchecked';\n\n// Android supported map.\nconst componentTypeMap: { [key: string]: AccessibilityComponentTypeValue } = {\n    [Types.AccessibilityTrait.None]: 'none',\n\n    // NOTE: Tab component type isn't supported on Android. Setting it to none, allows us to give\n    // it a custom label. This needs to be done for any custom role, which needs to be supported\n    // on Android.\n    [Types.AccessibilityTrait.Tab]: 'none',\n\n    [Types.AccessibilityTrait.Button]: 'button',\n    [Types.AccessibilityTrait.Radio_button_checked]: 'radiobutton_checked',\n    [Types.AccessibilityTrait.Radio_button_unchecked]: 'radiobutton_unchecked',\n};\n\nexport class AccessibilityUtil extends CommonAccessibilityUtil {\n    // Handle to accessibility platform helper instance that gets initialized during ReactXP initialization using the setter.\n    private _instance!: AccessibilityPlatformUtil;\n\n    setAccessibilityPlatformUtil(instance: AccessibilityPlatformUtil): void {\n        this._instance = instance;\n    }\n\n    // Converts an AccessibilityTrait to a string, but the returned value is only needed for iOS and UWP. Other platforms ignore it.\n    // Presence of an AccessibilityTrait.None can make an element non-accessible on Android.\n    // We use the override traits if they are present, else use the default trait.\n    // If ensureDefaultTrait is true, ensure the return result contains the defaultTrait.\n    accessibilityTraitToString(overrideTraits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined,\n            defaultTrait?: Types.AccessibilityTrait, ensureDefaultTrait?: boolean): RN.AccessibilityTrait[] | undefined {\n        // Check if there are valid override traits. Use them or else fallback to default traits.\n        if (!overrideTraits && !defaultTrait) {\n            return undefined;\n        }\n\n        let traits: (Types.AccessibilityTrait | undefined)[];\n        if (defaultTrait && ensureDefaultTrait) {\n            if (Array.isArray(overrideTraits)) {\n                traits = overrideTraits.indexOf(defaultTrait) === -1 ? overrideTraits.concat([defaultTrait]) : overrideTraits;\n            } else {\n                traits = overrideTraits === defaultTrait ? [overrideTraits] : [overrideTraits, defaultTrait];\n            }\n        } else {\n            traits = Array.isArray(overrideTraits) ? overrideTraits : [overrideTraits || defaultTrait];\n        }\n        return _.compact(_.map(traits, t  => t ? traitsMap[t] : undefined)) as RN.AccessibilityTrait[];\n    }\n\n    // Converts an AccessibilityTrait to an accessibilityComponentType string, but the returned value is only needed for Android. Other\n    // platforms ignore it.\n    accessibilityComponentTypeToString(overrideTraits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined,\n            defaultTrait?: Types.AccessibilityTrait): AccessibilityComponentTypeValue | undefined {\n        // Check if there are valid override traits. Use them or else fallback to default traits.\n        // Max enum value in this array is the componentType for android.\n        if (!overrideTraits && !defaultTrait) {\n            return undefined;\n        }\n\n        const combinedTraits = Array.isArray(overrideTraits) ? overrideTraits : [overrideTraits || defaultTrait];\n        const maxTrait = _.max(_.filter(combinedTraits, t => componentTypeMap.hasOwnProperty(t as any)));\n        return maxTrait ? componentTypeMap[maxTrait] : undefined;\n    }\n\n    // Converts an AccessibilityLiveRegion to a string, but the return value is only needed for Android. Other platforms ignore it.\n    accessibilityLiveRegionToString(liveRegion: Types.AccessibilityLiveRegion | undefined): AccessibilityLiveRegionValue | undefined {\n        if (liveRegion && liveRegionMap[liveRegion]) {\n            return liveRegionMap[liveRegion];\n        }\n        return undefined;\n    }\n\n    // Platform specific accessibility APIs.\n    setAccessibilityFocus(component: React.Component<any, any>): void {\n        this._instance.setAccessibilityFocus(component);\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/native-common/ActivityIndicator.tsx",
    "content": "﻿/**\n * ActivityIndicator.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Control to display an animated activity indicator.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nexport interface ActivityIndicatorState {\n    isVisible?: boolean;\n}\n\nexport class ActivityIndicator extends React.Component<Types.ActivityIndicatorProps, ActivityIndicatorState> {\n    private _isMounted = false;\n\n    constructor(props: Types.ActivityIndicatorProps) {\n        super(props);\n\n        this.state = { isVisible: false };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        if (this.props.deferTime && this.props.deferTime > 0) {\n            Timers.setTimeout(() => {\n                if (this._isMounted) {\n                    this.setState({ isVisible: true });\n                }\n            }, this.props.deferTime);\n        } else {\n            this.setState({ isVisible: true });\n        }\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        let size: 'small' | 'large';\n        switch (this.props.size) {\n            case 'tiny':\n            case 'small':\n            case 'medium':\n                size = 'small';\n                break; // React Native ActivityIndicator does not support 'tiny' or medium' size\n\n            case 'large':\n            default:\n                size = 'large';\n                break;\n        }\n\n        return (\n            <RN.ActivityIndicator\n                animating={ true }\n                color={ this.state.isVisible ? this.props.color : 'transparent' }\n                size={ size }\n                testID={ this.props.testId }\n            />\n        );\n    }\n}\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "src/native-common/Alert.ts",
    "content": "/**\n * Alert.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native Alert dialog boxes for ReactXP.\n */\n\nimport * as RN from 'react-native';\n\nimport AppConfig from '../common/AppConfig';\nimport * as RX from '../common/Interfaces';\nimport UserInterface from '../native-common/UserInterface';\n\n// Native implementation for alert dialog boxes\nexport class Alert implements RX.Alert {\n    show(title: string, message?: string, buttons?: RX.Types.AlertButtonSpec[],\n            options?: RX.Types.AlertOptions): void {\n\n        const alertOptions: RN.ExtendedAlertOptions = {};\n\n        if (!!options && options.preventDismissOnPress) {\n            alertOptions.cancelable = false;\n        }\n\n        if (options && options.rootViewId) {\n            const nodeHandle = UserInterface.findNodeHandleByRootViewId(options.rootViewId);\n            if (nodeHandle) {\n                alertOptions.rootViewHint = nodeHandle;\n            } else if (AppConfig.isDevelopmentMode()) {\n                console.warn('rootViewId does not exist: ', options.rootViewId);\n            }\n        }\n\n        RN.Alert.alert(title, message, buttons, alertOptions);\n    }\n}\n\nexport default new Alert();\n"
  },
  {
    "path": "src/native-common/Animated.tsx",
    "content": "/**\n * Animated.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Animation abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport Easing from '../common/Easing';\nimport * as RX from '../common/Interfaces';\n\nimport RXImage from './Image';\nimport RXText from './Text';\nimport RXTextInput from './TextInput';\nimport RXView from './View';\n\nexport interface AnimatedClasses {\n    Image: typeof RN.ReactNativeBaseComponent;\n    Text: typeof RN.ReactNativeBaseComponent;\n    TextInput: typeof RN.ReactNativeBaseComponent;\n    View: typeof RN.ReactNativeBaseComponent;\n}\n\nexport const CommonAnimatedClasses: AnimatedClasses = {\n    Image: RN.Animated.createAnimatedComponent(RXImage) as typeof RN.ReactNativeBaseComponent,\n    Text: RN.Animated.createAnimatedComponent(RXText) as typeof RN.ReactNativeBaseComponent,\n    TextInput: RN.Animated.createAnimatedComponent(RXTextInput) as typeof RN.ReactNativeBaseComponent,\n    View: RN.Animated.createAnimatedComponent(RXView)  as typeof RN.ReactNativeBaseComponent,\n};\n\nlet animatedClasses: AnimatedClasses = CommonAnimatedClasses;\n\nclass AnimatedWrapper<P, T, C> extends RX.AnimatedComponent<P, T, C> {\n    protected _mountedComponent: RN.ReactNativeBaseComponent<any, any> | undefined;\n\n    setNativeProps(props: P) {\n        if (this._mountedComponent && this._mountedComponent.setNativeProps) {\n            this._mountedComponent.setNativeProps(props);\n        }\n    }\n\n    focus() {\n        const innerComponent = this._mountedComponent ? (this._mountedComponent as any)._component : undefined;\n        if (innerComponent && innerComponent.focus) {\n            innerComponent.focus();\n        }\n    }\n\n    requestFocus() {\n        const innerComponent = this._mountedComponent ? (this._mountedComponent as any)._component : undefined;\n        if (innerComponent && innerComponent.requestFocus) {\n            innerComponent.requestFocus();\n        }\n    }\n\n    blur() {\n        const innerComponent = this._mountedComponent ? (this._mountedComponent as any)._component : undefined;\n        if (innerComponent && innerComponent.blur) {\n            innerComponent.blur();\n        }\n    }\n\n    protected _onMount = (component: RN.ReactNativeBaseComponent<any, any> | null) => {\n        this._mountedComponent = component || undefined;\n    };\n}\n\nclass AnimatedImage extends AnimatedWrapper<RX.Types.AnimatedImageProps, RX.Types.Stateless, RX.AnimatedImage> {\n    render() {\n        const additionalProps = { ref: this._onMount, style: this.props.style };\n        return (\n            <animatedClasses.Image\n                { ...this.props }\n                { ... additionalProps }\n            >\n                { this.props.children }\n            </animatedClasses.Image>\n        );\n    }\n}\n\nclass AnimatedText extends AnimatedWrapper<RX.Types.AnimatedTextProps, RX.Types.Stateless, RX.AnimatedText>  {\n    render() {\n        const additionalProps = { ref: this._onMount, style: this.props.style };\n        return (\n            <animatedClasses.Text\n                { ...this.props }\n                { ... additionalProps }\n            >\n                { this.props.children }\n            </animatedClasses.Text>\n        );\n    }\n}\n\nclass AnimatedTextInput extends AnimatedWrapper<RX.Types.AnimatedTextInputProps, RX.Types.Stateless, RX.AnimatedTextInput>   {\n    render() {\n        const additionalProps = {ref: this._onMount, style: this.props.style };\n        return (\n            <animatedClasses.TextInput\n                { ...this.props }\n                { ... additionalProps }\n            >\n                { this.props.children }\n            </animatedClasses.TextInput>\n        );\n    }\n}\n\nclass AnimatedView extends AnimatedWrapper<RX.Types.AnimatedViewProps, RX.Types.Stateless, RX.AnimatedView> {\n    setFocusRestricted(restricted: boolean) {\n        // Nothing to do.\n    }\n\n    setFocusLimited(limited: boolean) {\n        // Nothing to do.\n    }\n\n    render() {\n        const additionalProps = {ref: this._onMount, style: this.props.style };\n        return (\n            <animatedClasses.View\n                { ...this.props }\n                { ... additionalProps }\n            >\n                { this.props.children }\n            </animatedClasses.View>\n        );\n    }\n}\n\nclass FocusRestrictedAnimatedView extends AnimatedView {\n    setFocusRestricted(restricted: boolean) {\n        const innerComponent = this._mountedComponent ? (this._mountedComponent as any)._component : undefined;\n        if (innerComponent && innerComponent.setFocusRestricted) {\n            innerComponent.setFocusRestricted(restricted);\n        }\n    }\n\n    setFocusLimited(limited: boolean) {\n        const innerComponent = this._mountedComponent ? (this._mountedComponent as any)._component : undefined;\n        if (innerComponent && innerComponent.setFocusLimited) {\n            innerComponent.setFocusLimited(limited);\n        }\n    }\n}\n\nconst timing = function(\n        value: RX.Types.AnimatedValue,\n        config: RX.Types.Animated.TimingAnimationConfig): RX.Types.Animated.CompositeAnimation {\n\n    let isLooping = config.loop !== undefined && config.loop !== null;\n    return {\n        start: function(onEnd?: RX.Types.Animated.EndCallback): void {\n            function animate(): void {\n                const timingConfig: RN.Animated.TimingAnimationConfig = {\n                    toValue: config.toValue,\n                    easing: config.easing ? config.easing.function : undefined,\n                    duration: config.duration,\n                    delay: config.delay,\n                    isInteraction: config.isInteraction,\n                    useNativeDriver: config.useNativeDriver,\n                };\n\n                RN.Animated.timing(value as RN.Animated.Value, timingConfig).start(result => {\n                    if (onEnd) {\n                        onEnd(result);\n                    }\n\n                    if (isLooping) {\n                        value.setValue(config.loop!.restartFrom);\n                        // Hack to get into the loop\n                        animate();\n                    }\n                });\n            }\n\n            // Trigger animation loop (hack for now)\n            animate();\n        },\n\n        stop: function(): void {\n            isLooping = false;\n            (value as any).stopAnimation();\n        },\n    };\n};\n\nexport const AnimatedCommon = {\n    Easing: Easing as RX.Types.Animated.Easing,\n\n    timing: timing,\n    parallel: RN.Animated.parallel,\n    sequence: RN.Animated.sequence,\n\n    Value: RN.Animated.Value,\n    createValue: (initialValue: number) => new RN.Animated.Value(initialValue),\n    interpolate: (animatedValue: RX.Types.AnimatedValue, inputRange: number[], outputRange: string[]) => animatedValue.interpolate({\n        inputRange: inputRange,\n        outputRange: outputRange,\n    }),\n};\n\nexport function makeAnimated(nativeAnimatedClasses: AnimatedClasses, useFocusRestrictedView?: boolean): RX.Animated {\n    if (nativeAnimatedClasses) {\n        animatedClasses = nativeAnimatedClasses;\n    }\n\n    const animated: RX.Animated = {\n        // platform specific animated components\n        Image: AnimatedImage,\n        Text: AnimatedText,\n        TextInput: AnimatedTextInput,\n        View: useFocusRestrictedView ? FocusRestrictedAnimatedView :  AnimatedView,\n        // common stuff\n        ...AnimatedCommon,\n    };\n\n    return animated;\n}\n\nexport default AnimatedCommon;\n"
  },
  {
    "path": "src/native-common/App.ts",
    "content": "/**\n * App.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of App API namespace.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nimport { RootView, RootViewUsingProps } from './RootView';\nimport UserInterface from './UserInterface';\n\nconst _rnStateToRxState: {[key: string]: RX.Types.AppActivationState} = {\n    'unknown': RX.Types.AppActivationState.Active,\n    'active': RX.Types.AppActivationState.Active,\n    'background': RX.Types.AppActivationState.Background,\n    'inactive': RX.Types.AppActivationState.Inactive,\n    'extension': RX.Types.AppActivationState.Extension,\n    // uninitialized means in Background on android since last change I did\n    'uninitialized': RX.Types.AppActivationState.Background,\n};\n\nexport class App extends RX.App {\n    constructor() {\n        super();\n\n        RN.AppState.addEventListener('change', (newState: string) => {\n            // Fall back to active if a new state spits out that we don't know about\n            this.activationStateChangedEvent.fire(_rnStateToRxState[newState] || RX.Types.AppActivationState.Active);\n        });\n\n        RN.AppState.addEventListener('memoryWarning', () => {\n            this.memoryWarningEvent.fire();\n        });\n    }\n\n    initialize(debug: boolean, development: boolean): void {\n        super.initialize(debug, development);\n        window.rxdebug = debug;\n        RN.AppRegistry.registerComponent('RXApp', this.getRootViewFactory());\n        UserInterface.registerRootViewUsingPropsFactory(this.getRootViewUsingPropsFactory());\n    }\n\n    getActivationState(): RX.Types.AppActivationState {\n        return _rnStateToRxState[RN.AppState.currentState] || RX.Types.AppActivationState.Active;\n    }\n\n    protected getRootViewFactory(): RN.ComponentProvider {\n        return () => RootView;\n    }\n\n    protected getRootViewUsingPropsFactory(): RN.ComponentProvider {\n        return () => RootViewUsingProps;\n    }\n}\n\nexport default new App();\n"
  },
  {
    "path": "src/native-common/Button.tsx",
    "content": "/**\n * Button.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Button abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport App from '../native-common/App';\nimport AppConfig from '../common/AppConfig';\nimport assert from '../common/assert';\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Button as ButtonBase, Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\nimport { ButtonStyleRuleSet, StyleRuleSetRecursive } from '../common/Types';\n\nimport { MacComponentAccessibilityProps } from './Accessibility';\nimport AccessibilityUtil from './AccessibilityUtil';\nimport Animated from './Animated';\nimport EventHelpers from './utils/EventHelpers';\nimport Platform from './Platform';\nimport Styles from './Styles';\nimport UserInterface from './UserInterface';\n\nconst _styles = {\n    defaultButton: Styles.createButtonStyle({\n        alignItems: 'stretch',\n        justifyContent: 'center',\n        overflow: 'hidden',\n        backgroundColor: 'rgba(0, 0, 0, 0)',\n    }),\n    disabled: Styles.createButtonStyle({\n        opacity: 0.5,\n    }),\n};\n\nconst _isNativeMacOs = Platform.getType() === 'macos';\n\nconst _defaultAccessibilityTrait = Types.AccessibilityTrait.Button;\nconst _defaultImportantForAccessibility = Types.ImportantForAccessibility.Yes;\n\nconst _defaultActiveOpacity = 0.2;\nconst _inactiveOpacityAnimationDuration = 250;\nconst _activeOpacityAnimationDuration = 0;\nconst _hideUnderlayTimeout = 100;\nconst _underlayInactive = 'transparent';\n\nfunction noop() { /* noop */ }\n\nfunction applyMixin(thisObj: any, mixin: {[propertyName: string]: any}, propertiesToSkip: string[]) {\n    Object.getOwnPropertyNames(mixin).forEach(name => {\n        if (name !== 'constructor' && propertiesToSkip.indexOf(name) === -1 && typeof mixin[name].bind === 'function') {\n            assert(\n                !(name in thisObj),\n                `An object cannot have a method with the same name as one of its mixins: \"${name}\"`,\n            );\n            thisObj[name] = mixin[name].bind(thisObj);\n        }\n    });\n}\n\nexport interface ButtonContext {\n    hasRxButtonAscendant?: boolean;\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class Button extends ButtonBase {\n    static contextTypes = {\n        hasRxButtonAscendant: PropTypes.bool,\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: ButtonContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        hasRxButtonAscendant: PropTypes.bool,\n    };\n\n    private _mixin_componentDidMount = RN.Touchable.Mixin.componentDidMount || noop;\n    private _mixin_componentWillUnmount = RN.Touchable.Mixin.componentWillUnmount || noop;\n\n    // These are provided by mixin applied in the constructor\n    touchableGetInitialState!: () => RN.Touchable.State;\n    touchableHandleStartShouldSetResponder!: () => boolean;\n    touchableHandleResponderTerminationRequest!: () => boolean;\n    touchableHandleResponderGrant!: (e: RN.GestureResponderEvent) => void;\n    touchableHandleResponderMove!: (e: RN.GestureResponderEvent) => void;\n    touchableHandleResponderRelease!: (e: RN.GestureResponderEvent) => void;\n    touchableHandleResponderTerminate!: (e: RN.GestureResponderEvent) => void;\n\n    protected _isMounted = false;\n    protected _isMouseOver = false;\n    protected _isHoverStarted = false;\n    protected _buttonElement: RN.View | undefined;\n\n    private _hideTimeout: number | undefined;\n    private _defaultOpacityValue: number | undefined;\n    private _opacityAnimatedValue: RN.Animated.Value | undefined;\n    private _opacityAnimatedStyle: Types.AnimatedViewStyleRuleSet | undefined;\n\n    constructor(props: Types.ButtonProps, context?: ButtonContext) {\n        super(props, context);\n        applyMixin(this, RN.Touchable.Mixin, [\n            // Properties that Button and RN.Touchable.Mixin have in common. Button needs\n            // to dispatch these methods to RN.Touchable.Mixin manually.\n            'componentDidMount',\n            'componentWillUnmount',\n        ]);\n        this.state = this.touchableGetInitialState();\n        this._setOpacityStyles(props);\n\n        if (context && context.hasRxButtonAscendant) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.warn('Button components should not be embedded. Some APIs, e.g. Accessibility, will not work.');\n            }\n        }\n    }\n\n    protected _render(internalProps: RN.ViewProps, onMount: (btn: RN.View | null) => void): JSX.Element {\n        return (\n            <RN.Animated.View { ...internalProps } ref={ onMount }>\n                { this.props.children }\n            </RN.Animated.View>\n        );\n    }\n\n    render() {\n        // Accessibility props.\n        const importantForAccessibility = AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility,\n            _defaultImportantForAccessibility);\n        const accessibilityTrait = AccessibilityUtil.accessibilityTraitToString(this.props.accessibilityTraits,\n            _defaultAccessibilityTrait, true);\n        const accessibilityComponentType = AccessibilityUtil.accessibilityComponentTypeToString(this.props.accessibilityTraits,\n            _defaultAccessibilityTrait);\n\n        const opacityStyle = this.props.disableTouchOpacityAnimation ? undefined : this._opacityAnimatedStyle;\n        let disabledStyle = this.props.disabled ? _styles.disabled : undefined;\n\n        if (this.props.disabled && this.props.disabledOpacity !== undefined) {\n            disabledStyle = Styles.createButtonStyle({\n                opacity: this.props.disabledOpacity,\n            }, false);\n        }\n\n        const extendedProps: RN.ExtendedViewProps = {\n            onAccessibilityTapIOS: this.props.onAccessibilityTapIOS,\n            onMouseEnter: this._onMouseEnter,\n            onMouseLeave: this._onMouseLeave,\n            tooltip: this.props.title,\n            style: Styles.combine([_styles.defaultButton as any, this.props.style, opacityStyle,\n                disabledStyle]) as RN.StyleProp<RN.ViewStyle>,\n            accessibilityLabel: this.props.accessibilityLabel || this.props.title,\n            accessibilityTraits: accessibilityTrait,\n            accessibilityComponentType: accessibilityComponentType,\n            importantForAccessibility: importantForAccessibility,\n            onStartShouldSetResponder: this.touchableHandleStartShouldSetResponder,\n            onResponderTerminationRequest: this.touchableHandleResponderTerminationRequest,\n            onResponderGrant: this.touchableHandleResponderGrant,\n            onResponderMove: this.touchableHandleResponderMove,\n            onResponderRelease: this.touchableHandleResponderRelease,\n            onResponderTerminate: this.touchableHandleResponderTerminate,\n            shouldRasterizeIOS: this.props.shouldRasterizeIOS,\n            testID: this.props.testId,\n        };\n\n        // Mac RN requires some addition props for button accessibility\n        if (_isNativeMacOs && App.supportsExperimentalKeyboardNavigation && this.props.onPress) {\n            // Cast to the object that mac expects to indirectly mutate extendedProps\n            const macExtendedProps: MacComponentAccessibilityProps = extendedProps as any;\n            macExtendedProps.onClick = this.touchableHandlePress;\n            // Negative tabIndex prevents keyboard focus\n            if (this.props.tabIndex === undefined || this.props.tabIndex >= 0) {\n                macExtendedProps.acceptsKeyboardFocus = true;\n                macExtendedProps.enableFocusRing = true;\n            }\n        }\n\n        return this._render(extendedProps, this._onMount);\n    }\n\n    componentDidMount() {\n        this._mixin_componentDidMount();\n        this._isMounted = true;\n\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    componentWillUnmount() {\n        this._mixin_componentWillUnmount();\n        this._isMounted = false;\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.ButtonProps) {\n        // If opacity styles were updated as a part of props update, we need to reflect that in the opacity animation value\n        this._setOpacityStyles(nextProps, this.props);\n    }\n\n    getChildContext(): ButtonContext {\n        return { hasRxButtonAscendant: true };\n    }\n\n    setNativeProps(nativeProps: RN.ViewProps) {\n        if (this._buttonElement) {\n            this._buttonElement.setNativeProps(nativeProps);\n        }\n    }\n\n    touchableHandleActivePressIn = (e: Types.SyntheticEvent) => {\n        if (this._isTouchFeedbackApplicable()) {\n            if (this.props.underlayColor) {\n                if (this._hideTimeout) {\n                    Timers.clearTimeout(this._hideTimeout);\n                    this._hideTimeout = undefined;\n                }\n                this._showUnderlay();\n            }\n\n            // We do not want to animate opacity if underlayColour is provided. Unless an explicit activeOpacity is provided\n            if (!this.props.disableTouchOpacityAnimation && (this.props.activeOpacity || !this.props.underlayColor)) {\n                this._opacityActive(_activeOpacityAnimationDuration);\n            }\n        }\n\n        if (!this.props.disabled && this.props.onPressIn) {\n            this.props.onPressIn(e);\n        }\n    };\n\n    touchableHandleActivePressOut = (e: Types.SyntheticEvent) => {\n        if (this._isTouchFeedbackApplicable()) {\n            if (this.props.underlayColor) {\n                if (this._hideTimeout) {\n                    Timers.clearTimeout(this._hideTimeout);\n                }\n                this._hideTimeout = Timers.setTimeout(this._hideUnderlay, _hideUnderlayTimeout);\n            }\n\n            if (!this.props.disableTouchOpacityAnimation && (this.props.activeOpacity || !this.props.underlayColor)) {\n                this._opacityInactive(_inactiveOpacityAnimationDuration);\n            }\n        }\n\n        if (!this.props.disabled && this.props.onPressOut) {\n            this.props.onPressOut(e);\n        }\n    };\n\n    touchableHandlePress = (e: Types.SyntheticEvent) => {\n        UserInterface.evaluateTouchLatency(e);\n        if (!this.props.disabled) {\n            if (EventHelpers.isRightMouseButton(e)) {\n                if (this.props.onContextMenu) {\n                    this.props.onContextMenu(EventHelpers.toMouseEvent(e));\n                }\n            } else {\n                if (this.props.onPress) {\n                    this.props.onPress(EventHelpers.toMouseEvent(e));\n                }\n            }\n        }\n    };\n\n    touchableHandleLongPress = (e: Types.SyntheticEvent) => {\n        if (!this.props.disabled && !EventHelpers.isRightMouseButton(e) && this.props.onLongPress) {\n            this.props.onLongPress(EventHelpers.toMouseEvent(e));\n        }\n    };\n\n    touchableGetHighlightDelayMS = () => 20;\n\n    touchableGetPressRectOffset = () => ({top: 20, left: 20, right: 20, bottom: 100});\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._isMounted,\n        );\n    }\n\n    blur() {\n        if (this._buttonElement && this._buttonElement.blur) {\n            this._buttonElement.blur();\n        }\n    }\n\n    focus() {\n        if (this._isMounted) {\n            AccessibilityUtil.setAccessibilityFocus(this);\n        }\n        if (this._buttonElement && this._buttonElement.focus) {\n            this._buttonElement.focus();\n        }\n    }\n\n    private _setOpacityStyles(props: Types.ButtonProps, prevProps?: Types.ButtonProps) {\n        const opacityValueFromProps = this._getDefaultOpacityValue(props.style);\n        if (this._defaultOpacityValue !== opacityValueFromProps || (prevProps && props.disabled !== prevProps.disabled)) {\n            this._defaultOpacityValue = opacityValueFromProps;\n            this._opacityAnimatedValue = new Animated.Value(this._defaultOpacityValue);\n            this._opacityAnimatedStyle = Styles.createAnimatedViewStyle({\n                opacity: this._opacityAnimatedValue,\n            });\n        }\n    }\n\n    private _onMount = (btn: RN.View | null): void => {\n        this._buttonElement = btn || undefined;\n    };\n\n    private _isTouchFeedbackApplicable() {\n        return this._isMounted && this._hasPressHandler() && this._buttonElement;\n    }\n\n    private _opacityActive(duration: number) {\n        this.setOpacityTo(this.props.activeOpacity || _defaultActiveOpacity, duration);\n    }\n\n    private _opacityInactive(duration: number) {\n        this.setOpacityTo(this._defaultOpacityValue!, duration);\n    }\n\n    private _getDefaultOpacityValue(style?: StyleRuleSetRecursive<ButtonStyleRuleSet>): number {\n        let flattenedStyles: { [key: string]: any } | undefined;\n        if (style) {\n            flattenedStyles = RN.StyleSheet.flatten(style as RN.StyleProp<RN.ViewProps>);\n        }\n\n        return flattenedStyles && (flattenedStyles as Types.ButtonStyle).opacity || 1;\n    }\n\n    protected _onMouseEnter = (e: Types.SyntheticEvent) => {\n        this._isMouseOver = true;\n        this._onHoverStart(e);\n    };\n\n    protected _onMouseLeave = (e: Types.SyntheticEvent) => {\n        this._isMouseOver = false;\n        this._onHoverEnd(e);\n    };\n\n    protected _onHoverStart = (e: Types.SyntheticEvent) => {\n        if (!this._isHoverStarted && this._isMouseOver) {\n            this._isHoverStarted = true;\n\n            if (this.props.onHoverStart) {\n                this.props.onHoverStart(e);\n            }\n        }\n    };\n\n    protected _onHoverEnd = (e: Types.SyntheticEvent) => {\n        if (this._isHoverStarted && !this._isMouseOver) {\n            this._isHoverStarted = false;\n\n            if (this.props.onHoverEnd) {\n                this.props.onHoverEnd(e);\n            }\n        }\n    };\n\n    /**\n    * Animate the touchable to a new opacity.\n    */\n    setOpacityTo(value: number, duration: number) {\n        Animated.timing(\n            this._opacityAnimatedValue!,\n            {\n                toValue: value,\n                duration: duration,\n                easing: Animated.Easing.InOut(),\n            },\n        ).start();\n    }\n\n    private _hasPressHandler() {\n        return !!(\n            this.props.onPress ||\n            this.props.onPressIn ||\n            this.props.onPressOut ||\n            this.props.onLongPress\n        );\n    }\n\n    private _showUnderlay() {\n        if (!this._buttonElement) {\n            return;\n        }\n\n        this._buttonElement.setNativeProps({\n            style: {\n                backgroundColor: this.props.underlayColor,\n            },\n        });\n    }\n\n    private _hideUnderlay = () => {\n        if (!this._isMounted || !this._buttonElement) {\n            return;\n        }\n\n        this._buttonElement.setNativeProps({\n            style: [{\n                backgroundColor: _underlayInactive,\n            }, this.props.style],\n        });\n    };\n}\n\nexport default Button;\n"
  },
  {
    "path": "src/native-common/Clipboard.ts",
    "content": "/**\n * Clipboard.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Clipboard abstraction.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class Clipboard extends RX.Clipboard  {\n    setText(text: string): void {\n        RN.Clipboard.setString(text);\n    }\n\n    getText(): Promise<string> {\n        return RN.Clipboard.getString();\n    }\n}\n\nexport default new Clipboard();\n"
  },
  {
    "path": "src/native-common/FrontLayerViewManager.tsx",
    "content": "/**\n * FrontLayerViewManager.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Manages stackable modals and popup views that are posted and dismissed\n * by the Types showModal/dismissModal/showPopup/dismissPopup methods.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport SubscribableEvent from 'subscribableevent';\n\nimport { Types } from '../common/Interfaces';\nimport { ModalContainer } from '../native-common/ModalContainer';\nimport Timers from '../common/utils/Timers';\n\nimport * as _ from './utils/lodashMini';\nimport PopupContainerView from './PopupContainerView';\n\nclass ModalStackContext {\n    constructor(public modalId: string, public modal: React.ReactElement<Types.ViewProps>, public modalOptions?: Types.ModalOptions) {}\n}\n\nclass PopupStackContext {\n    constructor(public popupId: string, public popupOptions: Types.PopupOptions, public anchorHandle: number) {}\n}\n\nconst _styles = {\n    fullScreenView: {\n        flex: 1,\n        alignSelf: 'stretch',\n        overflow: 'visible',\n        backgroundColor: 'transparent', // otherwise in UWP it will be removed from the tree and won't receive mouse events\n    },\n};\n\nconst MAX_CACHED_POPUPS = 4;\n\nexport class FrontLayerViewManager {\n    private _overlayStack: (ModalStackContext | PopupStackContext)[] = [];\n    private _cachedPopups: PopupStackContext[] = [];\n\n    event_changed = new SubscribableEvent<() => void>();\n\n    showModal(modal: React.ReactElement<Types.ViewProps>, modalId: string, options?: Types.ModalOptions): void {\n        const index = this._findIndexOfModal(modalId);\n\n        if (index === -1) {\n            this._overlayStack.push(new ModalStackContext(modalId, modal, options));\n            this.event_changed.fire();\n        }\n    }\n\n    isModalDisplayed(modalId?: string): boolean {\n        if (modalId) {\n            return this._findIndexOfModal(modalId) !== -1;\n        }\n\n        return this._overlayStack.some(iter => iter instanceof ModalStackContext);\n    }\n\n    dismissModal(modalId: string): void {\n        const index = this._findIndexOfModal(modalId);\n\n        if (index >= 0) {\n            this._overlayStack.splice(index, 1);\n            this.event_changed.fire();\n        }\n    }\n\n    dismissAllmodals(): void {\n        if (this._overlayStack.length > 0) {\n            this._overlayStack = _.filter(this._overlayStack, iter => !(iter instanceof ModalStackContext));\n            this.event_changed.fire();\n        }\n    }\n\n    showPopup(popupOptions: Types.PopupOptions, popupId: string, delay?: number): boolean {\n        const index = this._findIndexOfPopup(popupId);\n        if (index === -1) {\n            const nodeHandle = RN.findNodeHandle(popupOptions.getAnchor());\n            if (nodeHandle) {\n                if (popupOptions.cacheable) {\n                    // The popup is transitioning from cached to active.\n                    this._cachedPopups = this._cachedPopups.filter(popup => popup.popupId !== popupId);\n                }\n\n                this._overlayStack.push(new PopupStackContext(popupId, popupOptions, nodeHandle));\n                this.event_changed.fire();\n                return true;\n            }\n        }\n        return false;\n    }\n\n    dismissPopup(popupId: string): void {\n        const index = this._findIndexOfPopup(popupId);\n        if (index >= 0) {\n            const popupContext = this._overlayStack[index] as PopupStackContext;\n            if (popupContext.popupOptions.cacheable) {\n                // The popup is transitioning from active to cached.\n                this._cachedPopups.push(popupContext);\n                this._cachedPopups = this._cachedPopups.slice(-MAX_CACHED_POPUPS);\n            }\n\n            this._overlayStack.splice(index, 1);\n\n            if (popupContext.popupOptions.onDismiss) {\n                popupContext.popupOptions.onDismiss();\n            }\n\n            this.event_changed.fire();\n        }\n    }\n\n    dismissAllPopups(): void {\n        if (this._overlayStack.length > 0) {\n            this._overlayStack = _.filter(this._overlayStack, iter => !(iter instanceof PopupStackContext));\n            this.event_changed.fire();\n        }\n    }\n\n    getModalLayerView(rootViewId?: string | null): React.ReactElement<any> | null {\n        if (rootViewId === null) {\n            // The Modal layer is only supported on root views that have set an id, or\n            // the default root view (which has an undefined id)\n            return null;\n        }\n\n        const overlayContext =\n            _.findLast(\n                this._overlayStack,\n                context => context instanceof ModalStackContext && this._modalOptionsMatchesRootViewId(context.modalOptions, rootViewId),\n            ) as ModalStackContext;\n\n        if (overlayContext) {\n            return (\n                <ModalContainer>\n                    { overlayContext.modal }\n                </ModalContainer>\n            );\n        }\n\n        return null;\n    }\n\n    getActivePopupId(): string | null {\n        const activeOverlay = this._getActiveOverlay();\n        if (activeOverlay && (activeOverlay instanceof PopupStackContext)) {\n            return activeOverlay.popupId;\n        }\n        return null;\n    }\n\n    releaseCachedPopups(): void {\n        this._cachedPopups = [];\n    }\n\n    // Returns true if both are undefined, or if there are options and the rootViewIds are equal.\n    private _modalOptionsMatchesRootViewId(options?: Types.ModalOptions, rootViewId?: string): boolean {\n        return !!(options === rootViewId || options && options.rootViewId === rootViewId);\n    }\n\n    private _renderPopup(context: PopupStackContext, hidden: boolean): JSX.Element {\n        const key = (context.popupOptions.cacheable ? 'CP:' : 'P:') + context.popupId;\n        return (\n            <PopupContainerView\n                key={ key }\n                popupOptions={ context.popupOptions }\n                anchorHandle={ hidden ? undefined : context.anchorHandle }\n                onDismissPopup={ hidden ? undefined : () => this.dismissPopup(context.popupId) }\n                hidden={ hidden }\n            />\n        );\n    }\n\n    private _getOverlayContext(rootViewId?: string | null): PopupStackContext | undefined {\n        return _.findLast(\n            this._overlayStack,\n            context => context instanceof PopupStackContext && context.popupOptions.rootViewId === rootViewId,\n        ) as PopupStackContext | undefined;\n    }\n\n    isPopupActiveFor(rootViewId?: string | null): boolean {\n        return this._getOverlayContext(rootViewId) !== undefined;\n    }\n\n    getPopupLayerView(rootViewId?: string | null): JSX.Element | null {\n        if (rootViewId === null) {\n            // The Popup layer is supported only on root views that have set an id and\n            // the default root view (which has an undefined id).\n            return null;\n        }\n\n        const popupContainerViews: JSX.Element[] = [];\n\n        const overlayContext = this._getOverlayContext(rootViewId);\n        if (overlayContext) {\n            popupContainerViews.push(this._renderPopup(overlayContext, false));\n        }\n        this._cachedPopups.forEach(context => popupContainerViews.push(this._renderPopup(context, true)));\n\n        if (popupContainerViews.length > 0) {\n            return (\n                <ModalContainer hidden={ !overlayContext }>\n                    <RN.TouchableWithoutFeedback\n                        onPressOut={ this._onBackgroundPressed }\n                        importantForAccessibility={ 'no' }\n                    >\n                        <RN.View style={ _styles.fullScreenView as RN.StyleProp<RN.ViewStyle> }>\n                            { popupContainerViews }\n                        </RN.View>\n                    </RN.TouchableWithoutFeedback>\n                </ModalContainer>\n            );\n        }\n        return null;\n    }\n\n    private _onBackgroundPressed = (e: RN.GestureResponderEvent) => {\n        e.persist();\n\n        const activePopupContext = this._getActiveOverlay();\n        if (!(activePopupContext instanceof PopupStackContext)) {\n            return;\n        }\n\n        if (activePopupContext.popupOptions) {\n            if (activePopupContext.popupOptions.onAnchorPressed) {\n                RN.NativeModules.UIManager.measureInWindow(\n                    activePopupContext.anchorHandle,\n                    (x: number, y: number, width: number, height: number) => {\n                        const touchEvent = e.nativeEvent;\n                        const anchorRect: ClientRect = { left: x, top: y, right: x + width,\n                            bottom: y + height, width: width, height: height };\n\n                        // Find out if the press event was on the anchor so we can notify the caller about it.\n                        if (!_.isUndefined(touchEvent.pageX) && !_.isUndefined(touchEvent.pageY) &&\n                                touchEvent.pageX >= anchorRect.left && touchEvent.pageX < anchorRect.right\n                                && touchEvent.pageY >= anchorRect.top && touchEvent.pageY < anchorRect.bottom) {\n                            // Showing another animation while dimissing the popup creates a conflict in the\n                            // UI making it not doing one of the two animations (i.e.: Opening an actionsheet\n                            // while dismissing a popup). We introduce this delay to make sure the popup\n                            // dimissing animation has finished before we call the event handler.\n                            Timers.setTimeout(() => { activePopupContext.popupOptions.onAnchorPressed!(e); }, 500);\n                        }\n                    },\n                );\n            }\n\n            // Avoid dismissing if the caller has explicitly asked to prevent\n            // dismissal on clicks.\n            if (activePopupContext.popupOptions.preventDismissOnPress) {\n                return;\n            }\n        }\n\n        this._dismissActivePopup();\n    };\n\n    private _dismissActivePopup(): void {\n        // Dismiss any currently visible popup:\n        const activePopupContext = this._getActiveOverlay();\n        if (activePopupContext instanceof PopupStackContext) {\n            this.dismissPopup(activePopupContext.popupId);\n        }\n    }\n\n    private _findIndexOfModal(modalId: string): number {\n        return _.findIndex(this._overlayStack, iter => iter instanceof ModalStackContext && iter.modalId === modalId);\n    }\n\n    private _findIndexOfPopup(popupId: string): number {\n        return _.findIndex(this._overlayStack, iter => iter instanceof PopupStackContext && iter.popupId === popupId);\n    }\n\n    private _getActiveOverlay() {\n        // Check for any Popup in queue\n        return this._overlayStack.length === 0 ? null : _.last(this._overlayStack);\n    }\n\n    isPopupDisplayed(popupId?: string): boolean {\n        if (popupId) {\n            return this._findIndexOfPopup(popupId) !== -1;\n        }\n\n        return this._overlayStack.some(iter => iter instanceof PopupStackContext);\n    }\n}\n\nexport default new FrontLayerViewManager();\n"
  },
  {
    "path": "src/native-common/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform GestureView component.\n * It provides much of the standard work necessary to support combinations of\n * pinch-and-zoom, panning, single tap and double tap gestures.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport App from '../native-common/App';\nimport GestureViewCommon from '../common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nimport { MacComponentAccessibilityProps } from './Accessibility';\nimport AccessibilityUtil from './AccessibilityUtil';\nimport EventHelpers from './utils/EventHelpers';\nimport Platform from './Platform';\nimport UserInterface from './UserInterface';\nimport ViewBase from './ViewBase';\n\nconst _defaultImportantForAccessibility = Types.ImportantForAccessibility.Yes;\nconst _isNativeMacOs = Platform.getType() === 'macos';\n\nexport abstract class GestureView extends GestureViewCommon {\n    private _panResponder: RN.PanResponderInstance;\n\n    private _view: RN.View | undefined;\n\n    constructor(props: Types.GestureViewProps) {\n        super(props);\n\n        // Setup Pan Responder\n        this._panResponder = RN.PanResponder.create({\n            onStartShouldSetPanResponder: (e: RN.GestureResponderEvent, gestureState: RN.PanResponderGestureState) => {\n                const event = (e as any).nativeEvent as Types.TouchEvent;\n                UserInterface.evaluateTouchLatency(e as any);\n                return this._onTouchSeriesStart(event);\n            },\n\n            onMoveShouldSetPanResponder: (e: RN.GestureResponderEvent, gestureState: RN.PanResponderGestureState) => {\n                const event = (e as any).nativeEvent as Types.TouchEvent;\n                UserInterface.evaluateTouchLatency(e as any);\n                return this._onTouchChange(event, gestureState);\n            },\n\n            onPanResponderRelease: (e: RN.GestureResponderEvent, gestureState: RN.PanResponderGestureState) => {\n                const event = (e as any).nativeEvent as Types.TouchEvent;\n                this._onTouchSeriesFinished(event, gestureState);\n            },\n\n            onPanResponderTerminate: (e: RN.GestureResponderEvent, gestureState: RN.PanResponderGestureState) => {\n                const event = (e as any).nativeEvent as Types.TouchEvent;\n                this._onTouchSeriesFinished(event, gestureState);\n            },\n\n            onPanResponderMove: (e: RN.GestureResponderEvent, gestureState: RN.PanResponderGestureState) => {\n                const event = (e as any).nativeEvent as Types.TouchEvent;\n                UserInterface.evaluateTouchLatency(e as any);\n                this._onTouchChange(event, gestureState);\n            },\n\n            // Something else wants to become responder. Should this view release the responder?\n            // Returning true allows release\n            onPanResponderTerminationRequest: (e: RN.GestureResponderEvent,\n                    gestureState: RN.PanResponderGestureState) => !!this.props.releaseOnRequest,\n        });\n    }\n\n    render() {\n        const importantForAccessibility = AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility,\n            _defaultImportantForAccessibility);\n        const accessibilityTrait = AccessibilityUtil.accessibilityTraitToString(this.props.accessibilityTraits);\n        const accessibilityComponentType = AccessibilityUtil.accessibilityComponentTypeToString(this.props.accessibilityTraits);\n\n        const extendedProps: RN.ExtendedViewProps & MacComponentAccessibilityProps = {\n            onFocus: this.props.onFocus,\n            onBlur: this.props.onBlur,\n            onKeyPress: this.props.onKeyPress ? this._onKeyPress : undefined,\n        };\n\n        if (_isNativeMacOs && App.supportsExperimentalKeyboardNavigation && this.props.onTap) {\n            extendedProps.onClick = this._macos_sendTapEvent;\n            if (this.props.tabIndex === undefined || this.props.tabIndex >= 0) {\n                extendedProps.acceptsKeyboardFocus = true;\n                extendedProps.enableFocusRing = true;\n            }\n        }\n\n        return (\n            <RN.View\n                ref={ this._onRef }\n                style={ [ViewBase.getDefaultViewStyle(), this.props.style] as RN.StyleProp<RN.ViewStyle> }\n                importantForAccessibility={ importantForAccessibility }\n                accessibilityTraits={ accessibilityTrait }\n                accessibilityComponentType={ accessibilityComponentType }\n                accessibilityLabel={ this.props.accessibilityLabel }\n                testID={ this.props.testId }\n                { ...this._panResponder.panHandlers }\n                { ...extendedProps }\n            >\n                { this.props.children }\n            </RN.View>\n        );\n    }\n\n    protected _macos_sendTapEvent = (e: Types.MouseEvent) => {\n        const gsState = this._mouseEventToTapGestureState(e);\n        this._sendTapEvent(gsState);\n    };\n\n    private _onRef = (ref: RN.View | null) => {\n        this._view = ref || undefined;\n    };\n\n    private _onKeyPress = (e: RN.NativeSyntheticEvent<RN.TextInputKeyPressEventData>) => {\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(EventHelpers.toKeyboardEvent(e));\n        }\n    };\n\n    focus() {\n        if (this._view && this._view.focus) {\n            this._view.focus();\n        }\n    }\n\n    blur() {\n        if (this._view && this._view.blur) {\n            this._view.blur();\n        }\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/native-common/Image.tsx",
    "content": "/**\n * Image.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Image abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { DEFAULT_RESIZE_MODE } from '../common/Image';\nimport { Types } from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\n\nimport * as _ from './utils/lodashMini';\nimport Platform from './Platform';\nimport Styles from './Styles';\n\nconst _styles = {\n    defaultImage: Styles.createImageStyle({\n        flex: 0,\n        overflow: 'hidden',\n        width: undefined,\n        height: undefined,\n    }),\n};\n\nexport interface ImageContext {\n    isRxParentAText?: boolean;\n}\n\nexport interface ImageState {\n    forceCache?: boolean;\n    lastNativeError?: any;\n    headers?: Types.Headers;\n}\n\nexport class Image extends React.Component<Types.ImageProps, ImageState> implements React.ChildContextProvider<ImageContext> {\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n    };\n\n    static prefetch(url: string): Promise<boolean> {\n        return RN.Image.prefetch(url);\n    }\n\n    static getMetadata(url: string): Promise<Types.ImageMetadata> {\n        return Image.prefetch(url).then(success => {\n            if (!success) {\n                return Promise.reject(`Prefetching url ${ url } did not succeed.`);\n            } else {\n                const defer = new Defer<Types.ImageMetadata>();\n                RN.Image.getSize(url, (width, height) => {\n                    defer.resolve({ width, height });\n                }, error => {\n                    defer.reject(error);\n                });\n                return defer.promise();\n            }\n        });\n    }\n\n    protected _mountedComponent: RN.Image | undefined;\n    private _nativeImageWidth: number | undefined;\n    private _nativeImageHeight: number | undefined;\n    readonly state: ImageState = { forceCache: false, lastNativeError: undefined, headers: Image._maybeOverrideHeaders(this.props) };\n\n    protected _getAdditionalProps(): RN.ImageProperties | {} {\n        return {};\n    }\n\n    render() {\n        const styles = this.getStyles();\n        const extendedProps: RN.ExtendedImageProps = {\n            source: this._buildSource(),\n            tooltip: this.props.title,\n        };\n\n        const props = {\n            accessibilityLabel: this.props.accessibilityLabel,\n            resizeMethod: this.props.resizeMethod,\n            resizeMode: this._buildResizeMode(),\n            testID: this.props.testId,\n            onError: this._onError,\n            onLoad: this.props.onLoad ? this._onLoad : undefined,\n            ref: this._onMount,\n            ...this._getAdditionalProps(),\n            ...extendedProps,\n        };\n\n        /**\n         * The <RN.Image> component cannot contain \"children\" elements.\n         * This functionality was removed in the version 0.50.0 - @see https://github.com/facebook/react-native/releases/tag/v0.50.0,\n         * The following changes add similar functionality as <RN.ImageBackground>, to continue support previous and new versions of RN\n         */\n        if (this.props.children) {\n            return (\n                <RN.View\n                    style={ styles as RN.StyleProp<RN.ViewStyle> }\n                >\n                    <RN.Image\n                        style={ RN.StyleSheet.absoluteFill }\n                        { ...props }\n                    />\n\n                    { this.props.children }\n                </RN.View>\n            );\n        }\n\n        return (\n            <RN.Image\n                style={ styles as RN.StyleProp<RN.ImageStyle> }\n                { ...props }\n            />\n        );\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.ImageProps) {\n        const sourceOrHeaderChanged = (nextProps.source !== this.props.source ||\n            !_.isEqual(nextProps.headers || {}, this.props.headers || {}));\n        if (sourceOrHeaderChanged) {\n            this.setState({ forceCache: false, lastNativeError: undefined, headers: Image._maybeOverrideHeaders(nextProps) });\n        }\n    }\n\n    protected _onMount = (component: RN.Image | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    setNativeProps(nativeProps: RN.ImageProps) {\n        if (this._mountedComponent) {\n            this._mountedComponent.setNativeProps(nativeProps);\n        }\n    }\n\n    getChildContext() {\n        // Let descendant RX components know that their nearest RX ancestor is not an RX.Text.\n        // Because they're in an RX.View/etc, they should use their normal styling rather than their\n        // special styling for appearing inline with text.\n        return { isRxParentAText: false };\n    }\n\n    protected getStyles() {\n        return [_styles.defaultImage, this.props.style];\n    }\n\n    private _buildResizeMode(): RN.ImageResizeMode {\n        const { resizeMode = DEFAULT_RESIZE_MODE } = this.props;\n\n        if (resizeMode === 'auto') {\n            return 'center' as RN.ImageResizeMode;\n        }\n\n        // Prevents unknown resizeMode values\n        const isValidResizeModeValue = ['contain', 'cover', 'stretch', 'repeat'].indexOf(resizeMode) >= 0;\n        if (isValidResizeModeValue) {\n            return resizeMode as RN.ImageResizeMode;\n        }\n\n        return DEFAULT_RESIZE_MODE as RN.ImageResizeMode;\n    }\n\n    private _onLoad = (e: RN.NativeSyntheticEvent<RN.ImageLoadEventData>) => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        this._nativeImageWidth = e.nativeEvent.source.width;\n        this._nativeImageHeight = e.nativeEvent.source.height;\n\n        if (this.props.onLoad) {\n            this.props.onLoad({ width: this._nativeImageWidth, height: this._nativeImageHeight });\n        }\n    };\n\n    private _onError = (e: RN.NativeSyntheticEvent<RN.ImageErrorEventData>) => {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        if (!this.state.forceCache && !!Image._getMaxStaleHeader(this.props.headers)) {\n            // Some platforms will not use expired cache data unless explicitly told so.\n            // Let's try again with cache: 'only-if-cached'.\n            this.setState({ forceCache: true, lastNativeError: e.nativeEvent.error });\n        } else if (this.props.onError) {\n            if (this.state.forceCache) {\n                // Fire the callback with the error we got when we failed without forceCache.\n                this.props.onError(new Error(this.state.lastNativeError));\n            } else {\n                this.props.onError(new Error(e.nativeEvent.error));\n            }\n        }\n    };\n\n    private static _maybeOverrideHeaders(props: Types.ImageProps): Types.Headers | undefined {\n        if (props.headers) {\n            const cacheControlHeader = Image._getMaxStaleHeader(props.headers);\n            if (cacheControlHeader) {\n                // Filter out Cache-Control: max-stale. It has the opposite effect on iOS: instead of having\n                // the cache return stale data it disables the cache altogether. We emulate the header by\n                // retrying with cache: 'only-if-cached'.\n                return _.omit(props.headers, [cacheControlHeader]);\n            }\n        }\n        return undefined;\n    }\n\n    private _buildSource(): RN.ImageSourcePropType {\n        // Check if require'd image resource\n        if (typeof this.props.source === 'number') {\n            return this.props.source;\n        }\n\n        const source: RN.ImageSourcePropType = { uri: this.props.source, headers: this.state.headers || this.props.headers };\n        if (this.state.forceCache) {\n            source.cache = 'only-if-cached';\n        }\n\n        return source;\n    }\n\n    private static _getMaxStaleHeader(headers?: Types.Headers): string | undefined {\n        if (Platform.getType() === 'ios' && headers) {\n            for (const key in headers) {\n                // We don't know how stale the cached data is so we're matching only the simple 'max-stale' attribute\n                // without a value.\n                if (key.toLowerCase() === 'cache-control' && headers[key].toLowerCase() === 'max-stale') {\n                    return key;\n                }\n            }\n        }\n        return undefined;\n    }\n\n    // Note: This works only if you have an onLoaded handler and wait for the image to load.\n    getNativeWidth(): number | undefined {\n        return this._nativeImageWidth;\n    }\n\n    getNativeHeight(): number | undefined {\n        return this._nativeImageHeight;\n    }\n}\n\nexport default Image;\n"
  },
  {
    "path": "src/native-common/Input.ts",
    "content": "/**\n * Input.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of Input interface.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class Input extends RX.Input {\n    constructor() {\n        super();\n\n        RN.BackHandler.addEventListener('hardwareBackPress', () => this.backButtonEvent.fire());\n    }\n}\n\nexport default new Input();\n"
  },
  {
    "path": "src/native-common/International.ts",
    "content": "/**\n * International.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation for i18n.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class International implements RX.International {\n    private _isRTL: boolean;\n\n    constructor() {\n        // RN.I18nManager.isRTL is a constant, a good start.\n        this._isRTL = RN.I18nManager.isRTL;\n\n        // Register for changes (some platforms may never raise this event)\n        RN.DeviceEventEmitter.addListener('isRTLChanged', (payload: RN.RtlEventNativePayload) => {this._isRTL = payload.isRTL; });\n    }\n\n    allowRTL(allow: boolean): void {\n        RN.I18nManager.allowRTL(allow);\n    }\n\n    forceRTL(force: boolean): void {\n        RN.I18nManager.forceRTL(force);\n    }\n\n    isRTL(): boolean {\n        return this._isRTL;\n    }\n}\n\nexport default new International();\n"
  },
  {
    "path": "src/native-common/Link.tsx",
    "content": "/**\n * Link.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Link abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport * as RX from '../common/Interfaces';\nimport Linking from '../native-common/Linking';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport EventHelpers from './utils/EventHelpers';\n\nexport interface LinkContext {\n    focusArbitrator?: FocusArbitratorProvider;\n    isRxParentAText?: boolean;\n}\n\nexport class LinkBase<S> extends React.Component<RX.Types.LinkProps, S> {\n    static contextTypes = {\n        focusArbitrator: PropTypes.object,\n        isRxParentAText: PropTypes.bool,\n    };\n\n    context!: LinkContext;\n\n    protected _mountedComponent: RN.Text | undefined;\n    protected _isMounted = false;\n\n    // To be able to use Link inside TouchableHighlight/TouchableOpacity\n    setNativeProps(nativeProps: RN.TextProps) {\n        if (this._mountedComponent) {\n            this._mountedComponent.setNativeProps(nativeProps);\n        }\n    }\n\n    render() {\n        const internalProps: RN.ExtendedTextProps = {\n            style: this.props.style as any,\n            numberOfLines: this.props.numberOfLines === 0 ? undefined : this.props.numberOfLines,\n            onPress: this._onPress,\n            onLongPress: this._onLongPress,\n            allowFontScaling: this.props.allowFontScaling,\n            children: this.props.children,\n            tooltip: this.props.title,\n            testID: this.props.testId,\n        };\n\n        return this._render(internalProps, this._onMount);\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    protected _render(internalProps: RN.TextProps, onMount: (text: RN.Text | null) => void) {\n        return (\n            <RN.Text { ...internalProps } ref={ onMount }/>\n        );\n    }\n\n    protected _onMount = (component: RN.Text | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    protected _onPress = (e: RX.Types.SyntheticEvent) => {\n        if (EventHelpers.isRightMouseButton(e)) {\n            if (this.props.onContextMenu) {\n                this.props.onContextMenu(EventHelpers.toMouseEvent(e));\n            }\n            return;\n        }\n\n        if (this.props.onPress) {\n            this.props.onPress(EventHelpers.toMouseEvent(e), this.props.url);\n            return;\n        }\n\n        // The default action is to launch a browser.\n        if (this.props.url) {\n            Linking.openUrl(this.props.url).catch(err => {\n                // Catch the exception so it doesn't propagate.\n            });\n        }\n    };\n\n    protected _onLongPress = (e: RX.Types.SyntheticEvent) => {\n        // Right mouse button doesn't change behavior based on press length.\n        if (EventHelpers.isRightMouseButton(e)) {\n            if (this.props.onContextMenu) {\n                this.props.onContextMenu(EventHelpers.toMouseEvent(e));\n            }\n            return;\n        }\n\n        if (!EventHelpers.isRightMouseButton(e) && this.props.onLongPress) {\n            this.props.onLongPress(EventHelpers.toMouseEvent(e), this.props.url);\n        }\n    };\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => !!this._mountedComponent,\n        );\n    }\n\n    focus() {\n        if (this._mountedComponent) {\n            AccessibilityUtil.setAccessibilityFocus(this);\n        }\n        if (this._mountedComponent && this._mountedComponent.focus) {\n            this._mountedComponent.focus();\n        }\n    }\n\n    blur() {\n        if (this._mountedComponent && this._mountedComponent.blur) {\n            this._mountedComponent.blur();\n        }\n    }\n}\n\nexport class Link extends LinkBase<{}> {\n\n}\n\nexport default Link;\n"
  },
  {
    "path": "src/native-common/Linking.ts",
    "content": "/**\n * Linking.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation for deep linking.\n */\n\nimport * as RN from 'react-native';\n\nimport { Types } from '../common/Interfaces';\nimport { Linking as CommonLinking } from '../common/Linking';\n\nexport class Linking extends CommonLinking {\n    constructor() {\n        super();\n\n        RN.Linking.addEventListener('url', (event: { url: string }) => {\n            this.deepLinkRequestEvent.fire(event.url);\n        });\n    }\n\n    protected _openUrl(url: string): Promise<void> {\n        return RN.Linking.canOpenURL(url)\n            .then(value => {\n                if (!value) {\n                    const linkingError: Types.LinkingErrorInfo = {\n                        code: Types.LinkingErrorCode.NoAppFound,\n                        url: url,\n                        description: 'No app found to handle url: ' + url,\n                    };\n                    return Promise.reject(linkingError);\n                } else {\n                    return RN.Linking.openURL(url);\n                }\n            }).catch(error => {\n                const linkingError: Types.LinkingErrorInfo = {\n                    code: Types.LinkingErrorCode.UnexpectedFailure,\n                    url: url,\n                    description: error,\n                };\n                return Promise.reject(linkingError);\n            });\n    }\n\n    getInitialUrl(): Promise<string | undefined> {\n        return RN.Linking.getInitialURL()\n            .then(url => url ? url : undefined)\n            .catch(error => {\n                const linkingError: Types.LinkingErrorInfo = {\n                    code: Types.LinkingErrorCode.InitialUrlNotFound,\n                    description: error,\n                };\n                return Promise.reject(linkingError);\n            });\n    }\n\n    // Launches Email app\n    launchEmail(emailInfo: Types.EmailInfo): Promise<void> {\n        // Format email info\n        const emailUrl = this._createEmailUrl(emailInfo);\n        return this._openUrl(emailUrl);\n    }\n}\n\nexport default new Linking();\n"
  },
  {
    "path": "src/native-common/MainViewStore.ts",
    "content": "/**\n * MainViewStore.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A simple store that publishes changes to the main element\n * provided by the app.\n */\n\nimport * as React from 'react';\nimport SubscribableEvent from 'subscribableevent';\n\nexport class MainViewStore extends SubscribableEvent<() => void> {\n    private _mainView: React.ReactElement<any> | undefined;\n\n    getMainView(): React.ReactElement<any> | undefined {\n        return this._mainView;\n    }\n\n    setMainView(view: React.ReactElement<any>): void {\n        this._mainView = view;\n        this.fire();\n    }\n}\n\nexport default new MainViewStore();\n"
  },
  {
    "path": "src/native-common/Modal.ts",
    "content": "/**\n * Modal.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Modal abstraction.\n */\n\nimport * as React from 'react';\n\nimport assert from '../common/assert';\nimport * as RX from '../common/Interfaces';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\n\nexport class Modal extends RX.Modal {\n    isDisplayed(modalId?: string): boolean {\n        return FrontLayerViewManager.isModalDisplayed(modalId);\n    }\n\n    show(modal: React.ReactElement<RX.Types.ViewProps>, modalId: string, options?: RX.Types.ModalOptions): void {\n        assert(modal, `modal must be valid. Actual: ${ modal }`);\n        assert(modalId, `modalId must be a non-empty string. Actual: ${ modalId }`);\n\n        FrontLayerViewManager.showModal(modal, modalId, options);\n    }\n\n    dismiss(modalId: string): void {\n        assert(modalId, `modalId must be a non-empty string. Actual: ${ modalId }`);\n\n        FrontLayerViewManager.dismissModal(modalId);\n    }\n\n    dismissAll(): void {\n        FrontLayerViewManager.dismissAllmodals();\n    }\n}\n\nexport default new Modal();\n"
  },
  {
    "path": "src/native-common/ModalContainer.tsx",
    "content": "/**\n * ModalContainer.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Modal abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { Types } from '../common/Interfaces';\n\nconst _styles = {\n    defaultContainer: {\n        position: 'absolute',\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n        flexDirection: 'column',\n        justifyContent: 'center',\n        alignItems: 'center',\n        overflow: 'hidden',\n        // On Android, we need to provide some color to prevent\n        // removal of the view.\n        backgroundColor: 'transparent',\n    },\n    hiddenContainer: {\n        width: 0,\n        height: 0,\n    },\n};\n\nexport interface ModalContainerProps extends Types.CommonProps<ModalContainer> {\n    hidden?: boolean;\n}\n\nexport class ModalContainer extends React.Component<ModalContainerProps, Types.Stateless> {\n    constructor(props: ModalContainerProps) {\n        super(props);\n    }\n\n    render() {\n        const style = this.props.hidden ? _styles.hiddenContainer : _styles.defaultContainer;\n\n        return (\n            <RN.View style={ style as RN.StyleProp<RN.ViewStyle> }>\n                { this.props.children }\n            </RN.View>\n        );\n    }\n}\n\nexport default ModalContainer;\n"
  },
  {
    "path": "src/native-common/Picker.tsx",
    "content": "/**\n * Picker.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Picker abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nimport { map } from './utils/lodashMini';\n\nexport class Picker extends RX.Picker {\n    render() {\n        return (\n            <RN.Picker\n                selectedValue={ this.props.selectedValue }\n                onValueChange={ this.onValueChange }\n                style={ this.props.style as RN.StyleProp<RN.ViewStyle> }\n                mode={ this.props.mode }\n                testID={ this.props.testId }\n            >\n                { map(this.props.items, (i, idx) => <RN.Picker.Item { ...i } key={ idx } /> ) }\n            </RN.Picker>\n        );\n    }\n\n    onValueChange = (itemValue: any, itemPosition: number) => {\n        this.props.onValueChange(itemValue, itemPosition);\n    };\n}\n\nexport default Picker;\n"
  },
  {
    "path": "src/native-common/Platform.ts",
    "content": "/**\n * Platform.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of Platform interface.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nexport class Platform extends RX.Platform {\n    getType(): RX.Types.PlatformType {\n        return RN.Platform.OS;\n    }\n\n    select<T>(specifics: { [ platform in RX.Types.PlatformType | 'default' ]?: T }): T | undefined {\n        const platformType = this.getType();\n        return platformType in specifics ? specifics[platformType] : specifics.default;\n    }\n}\n\nexport default new Platform();\n"
  },
  {
    "path": "src/native-common/Popup.ts",
    "content": "/**\n * Popup.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * React Native implementation of the cross-platform Popup abstraction.\n */\n\nimport assert from '../common/assert';\nimport * as RX from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\n\nexport class Popup extends RX.Popup {\n    show(options: RX.Types.PopupOptions, popupId: string, delay?: number): boolean {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n        assert(this._isValidAnchor(options), `options must have a valid 'getAnchor()'`);\n\n        return FrontLayerViewManager.showPopup(options, popupId, delay);\n    }\n\n    autoDismiss(popupId: string, delay?: number): void {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n\n        Timers.setTimeout(() => FrontLayerViewManager.dismissPopup(popupId), delay || 0);\n    }\n\n    dismiss(popupId: string): void {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n\n        FrontLayerViewManager.dismissPopup(popupId);\n    }\n\n    dismissAll(): void {\n        FrontLayerViewManager.dismissAllPopups();\n    }\n\n    isDisplayed(popupId?: string): boolean {\n        return FrontLayerViewManager.isPopupDisplayed(popupId);\n    }\n\n    private _isValidAnchor(options: RX.Types.PopupOptions): boolean {\n        return options && typeof options.getAnchor === 'function' && !!options.getAnchor();\n    }\n}\n\nexport default new Popup();\n"
  },
  {
    "path": "src/native-common/PopupContainerView.tsx",
    "content": "/**\n * PopupContainerView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * The view containing the Popup to show. This view does its own position\n * calculation on rendering as directed by position instructions received\n * through properties.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport assert from '../common/assert';\nimport { Types } from '../common/Interfaces';\nimport { PopupContainerViewBase, PopupContainerViewBaseProps, PopupContainerViewContext,\n    recalcPositionFromLayoutData, RecalcResult } from '../common/PopupContainerViewBase';\nimport Timers from '../common/utils/Timers';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport International from './International';\nimport { extend, isEqual } from './utils/lodashMini';\nimport UserInterface from './UserInterface';\n\nexport interface PopupContainerViewProps extends PopupContainerViewBaseProps<PopupContainerView> {\n    popupOptions: Types.PopupOptions;\n    anchorHandle?: number;\n    onDismissPopup?: () => void;\n}\n\nexport interface PopupContainerViewState extends RecalcResult {\n    // We need to measure the popup before it can be positioned. This indicates that we're in the \"measuring\" phase.\n    isMeasuringPopup: boolean;\n\n    // Measured (unconstrained) dimensions of the popup; not valid if isMeasuringPopup is false.\n    popupWidth: number;\n    popupHeight: number;\n}\n\nexport class PopupContainerView extends PopupContainerViewBase<PopupContainerViewProps, PopupContainerViewState, PopupContainerView> {\n    private _mountedComponent: RN.View | undefined;\n    private _viewHandle: number | null = null;\n    private _respositionPopupTimer: number | undefined;\n\n    constructor(props: PopupContainerViewProps, context?: PopupContainerViewContext) {\n        super(props, context);\n        this.state = this._getInitialState();\n    }\n\n    private _getInitialState(): PopupContainerViewState {\n        return {\n            isMeasuringPopup: true,\n            anchorPosition: 'left',\n            anchorOffset: 0,\n            popupY: 0,\n            popupX: 0,\n            popupWidth: 0,\n            popupHeight: 0,\n            constrainedPopupWidth: 0,\n            constrainedPopupHeight: 0,\n        };\n    }\n\n    UNSAFE_componentWillReceiveProps(prevProps: PopupContainerViewProps) {\n        if (this.props.popupOptions !== prevProps.popupOptions) {\n            // If the popup changes, reset our state.\n            this.setState(this._getInitialState());\n        }\n    }\n\n    componentDidUpdate(prevProps: PopupContainerViewProps, prevState: PopupContainerViewState) {\n        super.componentDidUpdate(prevProps, prevState);\n\n        if (this.props.popupOptions && !this.props.hidden) {\n            this._recalcPosition();\n\n            if (!this._respositionPopupTimer) {\n                this._startRepositionPopupTimer();\n            }\n        } else {\n            this._stopRepositionPopupTimer();\n        }\n    }\n\n    componentDidMount() {\n        if (this._mountedComponent) {\n            this._viewHandle = RN.findNodeHandle(this._mountedComponent);\n        }\n\n        if (this.props.popupOptions && !this.props.hidden) {\n            this._recalcPosition();\n            this._startRepositionPopupTimer();\n        }\n    }\n\n    componentWillUnmount() {\n        this._stopRepositionPopupTimer();\n    }\n\n    render() {\n        const popupView = (this.props.hidden ?\n            this.props.popupOptions.renderPopup('top', 0, 0, 0) :\n            this.props.popupOptions.renderPopup(\n                this.state.anchorPosition, this.state.anchorOffset,\n                this.state.constrainedPopupWidth,\n                this.state.constrainedPopupHeight)\n        );\n        const isRTL = International.isRTL();\n        const style = {\n            position: 'absolute',\n            top: this.state.popupY,\n            right: isRTL ? this.state.popupX : undefined,\n            left: !isRTL ? this.state.popupX : undefined,\n            alignItems: 'flex-start',\n            alignSelf: 'flex-start',\n            opacity: this.state.isMeasuringPopup ? 0 : 1,\n            overflow: this.props.hidden ? 'hidden' : 'visible',\n            width: this.props.hidden ? 0 : undefined,\n            height: this.props.hidden ? 0 : undefined,\n        };\n\n        const importantForAccessibility = this.props.hidden\n            ? AccessibilityUtil.importantForAccessibilityToString(Types.ImportantForAccessibility.NoHideDescendants)\n            : undefined;\n\n        return (\n            <RN.View\n                style={ style as RN.StyleProp<RN.ViewStyle> }\n                ref={ this._onMount }\n                importantForAccessibility={ importantForAccessibility }\n            >\n                { popupView }\n            </RN.View>\n        );\n    }\n\n    protected _onMount = (component: RN.View | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    private _recalcPosition() {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        assert(!!this.props.anchorHandle);\n\n        RN.NativeModules.UIManager.measureInWindow(\n            this.props.anchorHandle,\n            (x: number, y: number, width: number, height: number) => {\n                if (!this._mountedComponent) {\n                    return;\n                }\n\n                assert(!!this._viewHandle);\n\n                const anchorRect: ClientRect = {\n                    left: x, top: y, right: x + width, bottom: y + height,\n                    width: width, height: height};\n\n                RN.NativeModules.UIManager.measureInWindow(\n                    this._viewHandle,\n                    (x: number, y: number, width: number, height: number) => {\n                        const popupRect: ClientRect = {\n                            left: x, top: y, right: x + width, bottom: y + height,\n                            width: width, height: height,\n                        };\n\n                        this._recalcPositionFromLayoutData(anchorRect, popupRect);\n                    },\n                );\n            },\n        );\n    }\n\n    private _recalcPositionFromLayoutData(anchorRect: ClientRect, popupRect: ClientRect): void {\n        if (!this._mountedComponent) {\n            return;\n        }\n\n        // If the popup hasn't been rendered yet, skip.\n        if (popupRect.width <= 0 || popupRect.height <= 0) {\n            return;\n        }\n\n        // Make a copy of the old state.\n        const newState: PopupContainerViewState = extend({}, this.state);\n\n        if (this.state.isMeasuringPopup) {\n            newState.isMeasuringPopup = false;\n            newState.popupWidth = popupRect.width;\n            newState.popupHeight = popupRect.height;\n        }\n\n        // Get the width/height of root view window.\n        const window = UserInterface.measureWindow(this.props.popupOptions.rootViewId);\n        const windowDims = { width: window.width, height: window.height };\n\n        // Run the common recalc function and see what magic it spits out.\n        const result = recalcPositionFromLayoutData(windowDims, anchorRect, popupRect, this.props.popupOptions.positionPriorities,\n            this.props.popupOptions.useInnerPositioning);\n        if (!result) {\n            this._dismissPopup();\n            return;\n        }\n\n        extend(newState, result);\n\n        if (!isEqual(newState, this.state)) {\n            this.setState(newState);\n        }\n    }\n\n    private _dismissPopup() {\n        if (this.props.onDismissPopup) {\n            this.props.onDismissPopup();\n        }\n    }\n\n    private _startRepositionPopupTimer() {\n        this._respositionPopupTimer = Timers.setInterval(() => {\n            this._recalcPosition();\n        }, 1000);\n    }\n\n    private _stopRepositionPopupTimer() {\n        if (this._respositionPopupTimer) {\n            Timers.clearInterval(this._respositionPopupTimer);\n            this._respositionPopupTimer = undefined;\n        }\n    }\n}\n\nexport default PopupContainerView;\n"
  },
  {
    "path": "src/native-common/RootView.tsx",
    "content": "/**\n * RootView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * The top-most view that's used for proper layering or modals and popups.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport { SubscriptionToken } from 'subscribableevent';\n\nimport AppConfig from '../common/AppConfig';\nimport { Types } from '../common/Interfaces';\nimport UserInterface from '../native-common/UserInterface';\n\nimport Accessibility from './Accessibility';\nimport AccessibilityUtil from './AccessibilityUtil';\nimport App from './App';\nimport FrontLayerViewManager from './FrontLayerViewManager';\nimport { isEqual } from './utils/lodashMini';\nimport MainViewStore from './MainViewStore';\nimport Styles from './Styles';\n\n// Fields should be prefixed with 'reactxp' to help avoid naming collisions.\n// All fields should be removed from this.props before passing downwards.\ninterface BaseRootViewProps {\n    reactxp_rootViewId?: string;\n}\n\ninterface RootViewPropsWithMainViewType extends BaseRootViewProps {\n    reactxp_mainViewType: string;\n}\n\ninterface RootViewState {\n    mainView?: any;\n    announcementText?: string;\n}\n\nconst _styles = {\n    rootViewStyle: Styles.createViewStyle ({\n        flex: 1,\n        alignItems: 'stretch',\n        overflow: 'visible',\n    }),\n    liveRegionContainer: Styles.createViewStyle({\n        position: 'absolute',\n        opacity: 0,\n        top: -30,\n        bottom: 0,\n        left: 0,\n        right: 0,\n        height: 30,\n    }),\n};\n\n// Abstract RootView class which handles rendering, front layer view changes and announcement\n// changes. Subclasses must set the mainView state value.\nabstract class BaseRootView<P extends BaseRootViewProps> extends React.Component<P, RootViewState> {\n    private _frontLayerViewChangedSubscription: SubscriptionToken | undefined;\n    private _newAnnouncementEventChangedSubscription: SubscriptionToken | undefined;\n    private _memoryWarningEventSubscription: SubscriptionToken | undefined;\n    protected _mainViewProps: {};\n    protected _rootViewId?: string | null;\n\n    protected abstract _getPropsForMainView(): {};\n\n    constructor(props: P) {\n        super(props);\n        this._mainViewProps = this._getPropsForMainView();\n    }\n\n    UNSAFE_componentWillMount(): void {\n        this._frontLayerViewChangedSubscription = FrontLayerViewManager.event_changed.subscribe(() => {\n            // Setting empty state will trigger a render.\n            this.setState({});\n        });\n\n        // Update announcement text.\n        this._newAnnouncementEventChangedSubscription =\n            Accessibility.newAnnouncementReadyEvent.subscribe(announcement => {\n                this.setState({\n                    announcementText: announcement,\n                });\n            });\n\n        this._memoryWarningEventSubscription = App.memoryWarningEvent.subscribe(() => {\n            FrontLayerViewManager.releaseCachedPopups();\n            this.forceUpdate();\n        });\n    }\n\n    componentDidMount(): void {\n        if (this._rootViewId) {\n            UserInterface.notifyRootViewInstanceCreated(this._rootViewId, RN.findNodeHandle(this)!);\n        }\n    }\n\n    componentWillUnmount(): void {\n        if (this._rootViewId) {\n            UserInterface.notifyRootViewInstanceDestroyed(this._rootViewId);\n        }\n\n        if (this._frontLayerViewChangedSubscription) {\n            this._frontLayerViewChangedSubscription.unsubscribe();\n            this._frontLayerViewChangedSubscription = undefined;\n        }\n\n        if (this._newAnnouncementEventChangedSubscription) {\n            this._newAnnouncementEventChangedSubscription.unsubscribe();\n            this._newAnnouncementEventChangedSubscription = undefined;\n        }\n\n        if (this._memoryWarningEventSubscription) {\n            this._memoryWarningEventSubscription.unsubscribe();\n            this._memoryWarningEventSubscription = undefined;\n        }\n    }\n\n    render() {\n        const modalLayerView = FrontLayerViewManager.getModalLayerView(this._rootViewId);\n        const popupLayerView = FrontLayerViewManager.getPopupLayerView(this._rootViewId);\n        const isActivePopup = FrontLayerViewManager.isPopupActiveFor(this._rootViewId);\n        const announcerView = this._renderAnnouncerView();\n\n        // When showing a modal/popup we want to hide the mainView shown behind from an accessibility\n        // standpoint to ensure that it won't get the focus and the screen reader's attention.\n        const importantForAccessibility = (modalLayerView || isActivePopup) ?\n            AccessibilityUtil.importantForAccessibilityToString(Types.ImportantForAccessibility.NoHideDescendants) :\n            undefined; // default\n\n        const content = (\n            <RN.Animated.View style={ _styles.rootViewStyle }>\n                <RN.View\n                    style={ _styles.rootViewStyle as RN.StyleProp<RN.ViewStyle> }\n                    importantForAccessibility={ importantForAccessibility }\n                >\n                    { this.state.mainView }\n                </RN.View>\n                { modalLayerView }\n                { popupLayerView }\n                { announcerView }\n            </RN.Animated.View>\n        );\n\n        return this.renderTopView(content);\n    }\n\n    protected _renderAnnouncerView(): JSX.Element {\n        return (\n            <RN.View\n                style={ _styles.liveRegionContainer as RN.StyleProp<RN.ViewStyle> }\n                accessibilityLabel={ this.state.announcementText }\n                accessibilityLiveRegion={ AccessibilityUtil.accessibilityLiveRegionToString(Types.AccessibilityLiveRegion.Assertive) }\n            />\n        );\n    }\n\n    renderTopView(content: JSX.Element): JSX.Element {\n        return  content;\n    }\n}\n\n// BaseRootView implementation that uses MainStore to set the main view.\nclass RootViewUsingStore extends BaseRootView<BaseRootViewProps> {\n    private _changeListener = this._onChange.bind(this);\n\n    constructor(props: BaseRootViewProps) {\n        super(props);\n\n        this.state = {\n            mainView: undefined,\n            announcementText: '',\n        };\n    }\n\n    UNSAFE_componentWillMount(): void {\n        super.UNSAFE_componentWillMount();\n\n        MainViewStore.subscribe(this._changeListener);\n        this.setState(this._getStateFromStore());\n    }\n\n    componentWillUnmount(): void {\n        super.componentWillUnmount();\n        MainViewStore.unsubscribe(this._changeListener);\n    }\n\n    private _onChange() {\n        this.setState(this._getStateFromStore());\n    }\n\n    private _getStateFromStore(): RootViewState {\n        let mainView = MainViewStore.getMainView();\n\n        if (mainView && !isEqual(mainView.props, this._mainViewProps)) {\n            mainView = React.cloneElement(mainView, this._mainViewProps);\n        }\n\n        return {\n            mainView: mainView,\n        };\n    }\n\n    protected _getPropsForMainView(): {} {\n        const { reactxp_rootViewId, ...mainViewProps } = this.props;\n        return mainViewProps;\n    }\n}\n\n// BaseRootView implementation that uses the value in props to set main view.\nclass RootViewUsingProps extends BaseRootView<RootViewPropsWithMainViewType> {\n    constructor(props: RootViewPropsWithMainViewType) {\n        super(props);\n\n        if (!props.reactxp_rootViewId) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.warn('Some APIs require a value for reactxp_rootViewId');\n            }\n            this._rootViewId = null;\n        } else {\n            this._rootViewId = props.reactxp_rootViewId;\n        }\n\n        this.state = {\n            mainView: React.createElement(props.reactxp_mainViewType, this._mainViewProps),\n            announcementText: '',\n        };\n    }\n\n    protected _getPropsForMainView(): {} {\n        const { reactxp_mainViewType, reactxp_rootViewId, ...mainViewProps } = this.props;\n        return mainViewProps;\n    }\n}\n\nexport {\n    BaseRootViewProps,\n    RootViewPropsWithMainViewType,\n    RootViewState,\n    BaseRootView,\n    RootViewUsingStore as RootView,\n    RootViewUsingProps,\n};\n\nexport default RootViewUsingStore;\n"
  },
  {
    "path": "src/native-common/ScrollView.tsx",
    "content": "/**\n * ScrollView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform ScrollView abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\nimport { ScrollViewProps } from '../common/Types';\n\nimport ViewBase from './ViewBase';\n\n// TODO: #737970 Remove special case for UWP/MacOS when this bug is fixed. The bug\n//   causes you to have to click twice instead of once on some pieces of UI in\n//   order for the UI to acknowledge your interaction.\nconst overrideKeyboardShouldPersistTaps = RN.Platform.OS === 'macos' || RN.Platform.OS === 'windows';\nexport class ScrollView extends ViewBase<RX.Types.ScrollViewProps, RX.Types.Stateless, RN.ScrollView, RX.ScrollView>\n    implements RX.ScrollView {\n\n    private _scrollTop = 0;\n    private _scrollLeft = 0;\n\n    protected _render(nativeProps: RN.ScrollViewProps & React.Props<RN.ScrollView>): JSX.Element {\n        if (this.props.scrollXAnimatedValue || this.props.scrollYAnimatedValue) {\n            // Have to jump over to an Animated ScrollView to use an RN.Animated.event...\n            return (\n                <RN.Animated.ScrollView { ...nativeProps }>\n                    { nativeProps.children }\n                </RN.Animated.ScrollView>\n            );\n        } else {\n            return (\n                <RN.ScrollView { ...nativeProps }>\n                    { nativeProps.children }\n                </RN.ScrollView>\n            );\n        }\n    }\n\n    render() {\n        let scrollThrottle = this.props.scrollEventThrottle || 16;\n\n        if (scrollThrottle === 0) {\n            // Fire at 60fps\n            scrollThrottle = 16;\n        }\n\n        const layoutCallback = this.props.onLayout ?\n            // We have a callback function, call the wrapper\n            this._onLayout :\n            undefined;\n\n        let scrollHandler;\n        if (this.props.scrollXAnimatedValue || this.props.scrollYAnimatedValue) {\n            // For more details on this craziness, reference:\n            // https://facebook.github.io/react-native/docs/animated#handling-gestures-and-other-events\n            const handlerWrapper: RN.EventMapping = {\n                nativeEvent: {\n                    contentOffset: { },\n                },\n            };\n            if (this.props.scrollXAnimatedValue) {\n                handlerWrapper.nativeEvent.contentOffset.x = this.props.scrollXAnimatedValue;\n            }\n            if (this.props.scrollYAnimatedValue) {\n                handlerWrapper.nativeEvent.contentOffset.y = this.props.scrollYAnimatedValue;\n            }\n            const eventConfig: RN.AnimatedEventConfig<RN.NativeScrollEvent> = {\n                useNativeDriver: true,\n            };\n            if (this.props.onScroll) {\n                eventConfig.listener = this._onScroll;\n            }\n            // react-native.d.ts is wrong for the eventconfig typing, so casting to any for now.\n            scrollHandler = RN.Animated.event([handlerWrapper], eventConfig as any);\n        } else if (this.props.onScroll) {\n            scrollHandler = this._onScroll;\n        } else {\n            scrollHandler = undefined;\n        }\n\n        // 1) keyboardShouldPersistTaps may be overridden, superceding all other settings\n        // 2) in the absence of any other setting, 'never' is the default\n        // 3) if a boolean is seen, translate to 'always' or 'never' as the boolean is deprecated\n        // 4) it is also possible to see a string value of 'handled'\n        let keyboardShouldPersistTaps: ScrollViewProps['keyboardShouldPersistTaps'] = 'never';\n        if (overrideKeyboardShouldPersistTaps || this.props.keyboardShouldPersistTaps === true) {\n            // If there is an override or a boolean true, translate it to 'always'\n            keyboardShouldPersistTaps = 'always';\n        } else if (typeof this.props.keyboardShouldPersistTaps === 'string') {\n            // If there is no override, and a string && non-boolean was provided, use it without translation\n            keyboardShouldPersistTaps = this.props.keyboardShouldPersistTaps;\n        }\n\n        // NOTE: We are setting `automaticallyAdjustContentInsets` to false\n        // (http://facebook.github.io/react-native/docs/scrollview.html#automaticallyadjustcontentinsets). The\n        // 'automaticallyAdjustContentInsets' property is designed to offset the ScrollView's content to account for the\n        // navigation and tab bars in iOS.\n        // (navigationBarHidden={true}). We believe that React Native may not be calculating the content insets for the\n        // ScrollView correctly in this situation. Disabling this calculation seems to fix the ScrollView inset issues.\n        // Currently RX does not expose any components that would require `automaticallyAdjustContentInsets` to be\n        // set to true.\n        // We also set removeClippedSubviews to false, overriding the default value. Most of the scroll views\n        // we use are virtualized anyway.\n\n        const internalProps: RN.ScrollViewProps & React.Props<RN.ScrollView> = {\n            ref: this._setNativeComponent,\n            // Bug in react-native.d.ts.  style should be \"style?: StyleProp<ScrollViewStyle>;\" but instead is ViewStyle.\n            style: this.props.style as any,\n            onScroll: scrollHandler,\n            automaticallyAdjustContentInsets: false,\n            showsHorizontalScrollIndicator: this.props.showsHorizontalScrollIndicator,\n            showsVerticalScrollIndicator: this.props.showsVerticalScrollIndicator,\n            keyboardDismissMode:  this.props.keyboardDismissMode,\n            keyboardShouldPersistTaps: keyboardShouldPersistTaps,\n            scrollEnabled: this.props.scrollEnabled,\n            onContentSizeChange: this.props.onContentSizeChange,\n            onLayout: layoutCallback,\n            scrollEventThrottle: scrollThrottle,\n            horizontal: this.props.horizontal,\n            bounces: this.props.bounces,\n            pagingEnabled: this.props.pagingEnabled,\n            snapToInterval: this.props.snapToInterval,\n            decelerationRate: typeof this.props.snapToInterval === 'number' ? 'fast' : undefined,\n            scrollsToTop: this.props.scrollsToTop,\n            removeClippedSubviews: false,\n            overScrollMode: this.props.overScrollMode,\n            scrollIndicatorInsets: this.props.scrollIndicatorInsets,\n            onScrollBeginDrag: this.props.onScrollBeginDrag,\n            onScrollEndDrag: this.props.onScrollEndDrag,\n            children: this.props.children,\n            testID: this.props.testId,\n        };\n\n        return this._render(internalProps);\n    }\n\n    private _onScroll = (event: RN.NativeSyntheticEvent<RN.NativeScrollEvent>) => {\n        const contentOffset = event.nativeEvent.contentOffset;\n\n        this._scrollTop = contentOffset.y;\n        this._scrollLeft = contentOffset.x;\n\n        if (this.props.onScroll) {\n            this.props.onScroll(this._scrollTop, this._scrollLeft);\n        }\n    };\n\n    setScrollTop(scrollTop: number, animate?: boolean): void {\n        if (this._nativeComponent) {\n            const scrollParams = { x: this._scrollLeft, y: scrollTop, animated: animate };\n            if (this._nativeComponent.scrollTo) {\n                this._nativeComponent.scrollTo(scrollParams);\n            } else if ((this._nativeComponent as any)._component) {\n                // Components can be wrapped by RN.Animated implementation, peek at the inner workings here\n                const innerComponent = (this._nativeComponent as any)._component;\n                if (innerComponent && innerComponent.scrollTo) {\n                    innerComponent.scrollTo(scrollParams);\n                }\n            }\n        }\n    }\n\n    setScrollLeft(scrollLeft: number, animate?: boolean): void {\n        if (this._nativeComponent) {\n            const scrollParams = { x: scrollLeft, y: this._scrollTop, animated: animate };\n            if (this._nativeComponent.scrollTo) {\n                this._nativeComponent.scrollTo(scrollParams);\n            } else if ((this._nativeComponent as any)._component) {\n                // Components can be wrapped by RN.Animated implementation, peek at the inner workings here\n                const innerComponent = (this._nativeComponent as any)._component;\n                if (innerComponent && innerComponent.scrollTo) {\n                    innerComponent.scrollTo(scrollParams);\n                }\n            }\n        }\n    }\n\n    static useCustomScrollbars() {\n        // not needed\n    }\n}\n\nexport default ScrollView;\n"
  },
  {
    "path": "src/native-common/Storage.ts",
    "content": "/**\n * Storage.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of the cross-platform database storage abstraction.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\n\nexport class Storage extends RX.Storage {\n    getItem(key: string): Promise<string | undefined> {\n        const deferred = new Defer<string | undefined>();\n\n        RN.AsyncStorage.getItem(key, (error: any, result: string | undefined) => {\n            if (!error) {\n                deferred.resolve(result || undefined);\n            } else {\n                deferred.reject(error);\n            }\n        }).catch(err => {\n            deferred.reject(err);\n        });\n\n        return deferred.promise();\n    }\n\n    setItem(key: string, value: string): Promise<void> {\n        const deferred = new Defer<void>();\n\n        RN.AsyncStorage.setItem(key, value, (error: any) => {\n            if (!error) {\n                deferred.resolve(void 0);\n            } else {\n                deferred.reject(error);\n            }\n        }).catch(err => {\n            deferred.reject(err);\n        });\n\n        return deferred.promise();\n    }\n\n    removeItem(key: string): Promise<void> {\n        const deferred = new Defer<void>();\n\n        RN.AsyncStorage.removeItem(key, (error: any) => {\n            if (!error) {\n                deferred.resolve(void 0);\n            } else {\n                deferred.reject(error);\n            }\n        }).catch(err => {\n            deferred.reject(err);\n        });\n\n        return deferred.promise();\n    }\n\n    clear(): Promise<void> {\n        const deferred = new Defer<void>();\n\n        RN.AsyncStorage.clear((error: any) => {\n            if (!error) {\n                deferred.resolve(void 0);\n            } else {\n                deferred.reject(error);\n            }\n        }).catch(err => {\n            deferred.reject(err);\n        });\n\n        return deferred.promise();\n    }\n}\n\nexport default new Storage();\n"
  },
  {
    "path": "src/native-common/StyleLeakDetector.ts",
    "content": "/**\n * StyleLeakDetector.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of debugging logic that detects style leaks.\n */\n\nimport * as RN from 'react-native';\n\nimport { StyleLeakDetector as CommonStyleLeakDetector } from '../common/StyleLeakDetector';\n\nexport class StyleLeakDetector extends CommonStyleLeakDetector {\n    protected isDisabled(): boolean {\n        // Disable StyleLeakDetector in UWP apps because the way Chakra reports\n        // line numbers breaks the leak detector. Specifically, function calls\n        // in an object literal are all reported to be on the same line. For\n        // example, suppose we have this code:\n        //\n        //   1:  const _styles = {\n        //   2:      fillScreen: RX.Styles.createViewStyle({\n        //   3:          flex: 1,\n        //   4:          flexDirection: 'column',\n        //   5:          alignSelf: 'stretch'\n        //   6:      }),\n        //   7:      content: RX.Styles.createViewStyle({\n        //   8:          flex: 1,\n        //   9:          flexDirection: 'column',\n        //   10:         alignSelf: 'stretch'\n        //   11:     })\n        //   12: };\n        //\n        // The StyleLeakDetector expects the JS engine to report to it that\n        // the style for `fillScreen` occurs on line 2 and the style for `content`\n        // occurs on line 7. However, Chakra reports that both `fillScreen` and\n        // `content` occur on the same line (1) causing the StyleLeakDetector to\n        // falsely report a style leak.\n\n        return RN.Platform.OS === 'windows';\n    }\n}\n\nexport default new StyleLeakDetector();\n"
  },
  {
    "path": "src/native-common/Styles.ts",
    "content": "/**\n * Styles.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of style functions.\n */\n\nimport * as RN from 'react-native';\n\nimport AppConfig from '../common/AppConfig';\nimport * as RX from '../common/Interfaces';\n\nimport { omit } from './utils/lodashMini';\nimport Platform from './Platform';\nimport StyleLeakDetector from './StyleLeakDetector';\n\nconst forbiddenProps: string[] = [\n    'wordBreak',\n    'appRegion',\n    'cursor',\n];\n\n// RN would crash if it gets an undeclared property.\n// The properties below are declared only in RN UWP.\nif (Platform.getType() !== 'windows') {\n    forbiddenProps.push(\n        'acrylicOpacityUWP',\n        'acrylicSourceUWP',\n        'acrylicTintColorUWP');\n}\n\n// React Native styles that ReactXP doesn't expose.\ntype ReactNativeViewAndImageCommonStyle<Style extends RX.Types.ViewAndImageCommonStyle> = Style & {\n    flexGrow?: number;\n    flexShrink?: number;\n    flexBasis?: number;\n    textShadowColor?: string;\n    textShadowOffset?: RX.Types.ShadowOffset;\n    textShadowRadius?: number;\n};\n\nexport class Styles extends RX.Styles {\n    combine<S>(ruleSet1: RX.Types.StyleRuleSetRecursive<S> | undefined,\n            ruleSet2?: RX.Types.StyleRuleSetRecursive<S>): RX.Types.StyleRuleSetOrArray<S> | undefined {\n        if (!ruleSet1 && !ruleSet2) {\n            return undefined;\n        }\n\n        const ruleSet = ruleSet1 ? (ruleSet2 ? [ruleSet1, ruleSet2] : ruleSet1) : ruleSet2;\n\n        if (ruleSet instanceof Array) {\n            let resultArray: RX.Types.StyleRuleSet<S>[] = [];\n            for (let i = 0; i < ruleSet.length; i++) {\n                const subRuleSet = this.combine(ruleSet[i]);\n\n                if (subRuleSet) {\n                    if (subRuleSet instanceof Array) {\n                        resultArray = resultArray.concat(subRuleSet);\n                    } else {\n                        resultArray.push(subRuleSet);\n                    }\n                }\n            }\n\n            if (resultArray.length === 0) {\n                return undefined;\n            }\n\n            // Elimiante the array if there's a single style.\n            if (resultArray.length === 1) {\n                return resultArray[0];\n            }\n\n            return resultArray;\n        }\n\n        // Handle the case where the input was either undefined\n        // or not an array (a single style).\n        return ruleSet;\n    }\n\n    // Creates opaque styles that can be used for View\n    createViewStyle(ruleSet: RX.Types.ViewStyle, cacheStyle = true): RX.Types.ViewStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates animated styles that can be used for View\n    createAnimatedViewStyle(ruleSet: RX.Types.AnimatedViewStyle): RX.Types.AnimatedViewStyleRuleSet {\n        return this._adaptAnimatedStyles(ruleSet);\n    }\n\n    // Creates opaque styles that can be used for ScrollView\n    createScrollViewStyle(ruleSet: RX.Types.ScrollViewStyle, cacheStyle = true): RX.Types.ScrollViewStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Button\n    createButtonStyle(ruleSet: RX.Types.ButtonStyle, cacheStyle = true): RX.Types.ButtonStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Text\n    createTextStyle(ruleSet: RX.Types.TextStyle, cacheStyle = true): RX.Types.TextStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle, true);\n    }\n\n    // Creates opaque styles that can be used for Text\n    createAnimatedTextStyle(ruleSet: RX.Types.AnimatedTextStyle): RX.Types.AnimatedTextStyleRuleSet {\n        return this._adaptAnimatedStyles(ruleSet);\n    }\n\n    // Creates opaque styles that can be used for TextInput\n    createTextInputStyle(ruleSet: RX.Types.TextInputStyle, cacheStyle = true): RX.Types.TextInputStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle, true);\n    }\n\n    // Creates opaque styles that can be used for TextInput\n    createAnimatedTextInputStyle(ruleSet: RX.Types.AnimatedTextInputStyle): RX.Types.AnimatedTextInputStyleRuleSet {\n        return this._adaptAnimatedStyles(ruleSet);\n    }\n\n    // Creates opaque styles that can be used for Image\n    createImageStyle(ruleSet: RX.Types.ImageStyle, cacheStyle = true): RX.Types.ImageStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates animated opaque styles that can be used for Image\n    createAnimatedImageStyle(ruleSet: RX.Types.AnimatedImageStyle): RX.Types.AnimatedImageStyleRuleSet {\n        return this._adaptAnimatedStyles(ruleSet);\n    }\n\n    // Creates opaque styles that can be used for Link\n    createLinkStyle(ruleSet: RX.Types.LinkStyle, cacheStyle = true): RX.Types.LinkStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Picker\n    createPickerStyle(ruleSet: RX.Types.PickerStyle, cacheStyle = true): RX.Types.PickerStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    getCssPropertyAliasesCssStyle(): {[key: string]: string} {\n        // Nothing to do in native; this is for web only\n        return {};\n    }\n\n    private _adaptStyles<S extends RX.Types.ViewAndImageCommonStyle>(def: S,\n            cacheStyle: boolean, isTextStyle = false): Readonly<RX.Types.StyleRuleSet<S>> {\n        let adaptedRuleSet = def as ReactNativeViewAndImageCommonStyle<S>;\n        if (cacheStyle) {\n            StyleLeakDetector.detectLeaks(def);\n\n            // Forbidden props are not allowed in uncached styles. Perform the\n            // omit only in the cached path.\n            adaptedRuleSet = omit<S>(adaptedRuleSet, forbiddenProps) as ReactNativeViewAndImageCommonStyle<S>;\n        }\n\n        // Convert text styling\n        const textStyle = adaptedRuleSet as RX.Types.TextStyle;\n        if (textStyle.font) {\n            if (textStyle.font.fontFamily !== undefined) {\n                textStyle.fontFamily = textStyle.font.fontFamily;\n            }\n            if (textStyle.font.fontWeight !== undefined) {\n                textStyle.fontWeight = textStyle.font.fontWeight;\n            }\n            if (textStyle.font.fontStyle !== undefined) {\n                textStyle.fontStyle = textStyle.font.fontStyle;\n            }\n            delete textStyle.font;\n        }\n\n        if (isTextStyle) {\n            if (textStyle.shadowColor !== undefined) {\n                adaptedRuleSet.textShadowColor = textStyle.shadowColor;\n                delete textStyle.shadowColor;\n            }\n            if (textStyle.shadowOffset !== undefined) {\n                adaptedRuleSet.textShadowOffset = textStyle.shadowOffset;\n                delete textStyle.shadowOffset;\n            }\n            if (textStyle.shadowRadius !== undefined) {\n                adaptedRuleSet.textShadowRadius = textStyle.shadowRadius;\n                delete textStyle.shadowRadius;\n            }\n        }\n\n        if (def.flex !== undefined) {\n            // In development mode, see if we're going to overwrite explicit flexGrow\n            // or flexShrink attributes. It's a programming error to specify these in\n            // combination with flex.\n            if (AppConfig.isDevelopmentMode()) {\n                if (adaptedRuleSet.flexGrow !== undefined || adaptedRuleSet.flexShrink !== undefined) {\n                    console.error('Conflicting rules for flex specified.');\n                }\n            }\n\n            const flexValue = def.flex;\n            delete adaptedRuleSet.flex;\n            if (flexValue > 0) {\n                // p 1 auto\n                adaptedRuleSet.flexGrow = flexValue;\n                adaptedRuleSet.flexShrink = 1;\n            } else if (flexValue < 0) {\n                // 0 -n auto\n                adaptedRuleSet.flexGrow = 0;\n                adaptedRuleSet.flexShrink = -flexValue;\n            } else {\n                // 0 0 auto\n                adaptedRuleSet.flexGrow = 0;\n                adaptedRuleSet.flexShrink = 0;\n            }\n        }\n\n        if (cacheStyle) {\n            return RN.StyleSheet.create({ _style: adaptedRuleSet })._style;\n        }\n\n        return AppConfig.isDevelopmentMode() ? Object.freeze(adaptedRuleSet) : adaptedRuleSet;\n    }\n\n    private _adaptAnimatedStyles<T extends RX.Types.AnimatedViewAndImageCommonStyle>(def: T): Readonly<T> {\n        const adaptedRuleSet = omit<T>(def, forbiddenProps) as T;\n        return AppConfig.isDevelopmentMode() ? Object.freeze(adaptedRuleSet) : adaptedRuleSet;\n    }\n}\n\nexport default new Styles();\n"
  },
  {
    "path": "src/native-common/Text.tsx",
    "content": "/**\n * Text.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform Text abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Types } from '../common/Interfaces';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport EventHelpers from './utils/EventHelpers';\nimport { compact } from './utils/lodashMini';\nimport Styles from './Styles';\n\nconst _styles = {\n    defaultText: Styles.createTextStyle({\n        overflow: 'hidden',\n    }),\n};\n\nexport interface TextContext {\n    isRxParentAText: boolean;\n    focusArbitrator?: FocusArbitratorProvider;\n    isRxParentAContextMenuResponder?: boolean;\n}\n\nexport class Text extends React.Component<Types.TextProps, Types.Stateless> implements React.ChildContextProvider<TextContext> {\n    static contextTypes: React.ValidationMap<any> = {\n        focusArbitrator: PropTypes.object,\n        isRxParentAContextMenuResponder: PropTypes.bool,\n    };\n\n    context!: TextContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n    };\n\n    protected _mountedComponent: RN.Text | undefined;\n\n    // To be able to use Text inside TouchableHighlight/TouchableOpacity\n    setNativeProps(nativeProps: RN.TextProps) {\n        if (this._mountedComponent) {\n            this._mountedComponent.setNativeProps(nativeProps);\n        }\n    }\n\n    render() {\n        // The presence of any of the onPress or onContextMenu makes the RN.Text a potential touch responder\n        const onPress = (this.props.onPress || this.props.onContextMenu) ? this._onPress : undefined;\n        const importantForAccessibility = AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility);\n        const extendedProps: RN.ExtendedTextProps = this._getExtendedProperties();\n\n        return (\n            <RN.Text\n                style={ this._getStyles() as RN.StyleProp<RN.TextStyle> }\n                ref={ this._onMount }\n                importantForAccessibility={ importantForAccessibility }\n                numberOfLines={ this.props.numberOfLines }\n                allowFontScaling={ this.props.allowFontScaling }\n                onPress={ onPress }\n                selectable={ this.props.selectable }\n                textBreakStrategy={ 'simple' }\n                ellipsizeMode={ this.props.ellipsizeMode }\n                testID={ this.props.testId }\n                { ...extendedProps }\n            >\n                { this.props.children }\n            </RN.Text>\n        );\n    }\n\n    componentDidMount() {\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    protected _onMount = (component: RN.Text | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    protected _getExtendedProperties(): RN.ExtendedTextProps {\n        const { onContextMenu } = this.props;\n\n        // The presence of an onContextMenu on this instance or on the first responder parent up the tree\n        // should disable any system provided context menu\n        const disableContextMenu = !!onContextMenu || !!this.context.isRxParentAContextMenuResponder;\n\n        return { disableContextMenu };\n    }\n\n    private _onPress = (e: RN.GestureResponderEvent) => {\n        if (EventHelpers.isRightMouseButton(e)) {\n            if (this.props.onContextMenu) {\n                this.props.onContextMenu(EventHelpers.toMouseEvent(e));\n            }\n        } else {\n            if (this.props.onPress) {\n                this.props.onPress(EventHelpers.toMouseEvent(e));\n            }\n        }\n    };\n\n    getChildContext() {\n        // Let descendant RX components know that their nearest RX ancestor is an RX.Text.\n        // Because they're in an RX.Text, they should style themselves specially for appearing\n        // inline with text.\n        return { isRxParentAText: true };\n    }\n\n    protected _getStyles(): Types.StyleRuleSetRecursiveArray<Types.TextStyleRuleSet> {\n        return compact([_styles.defaultText, this.props.style]);\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => !!this._mountedComponent,\n        );\n    }\n\n    focus() {\n        if (this._mountedComponent) {\n            AccessibilityUtil.setAccessibilityFocus(this);\n        }\n\n        if (this._mountedComponent && this._mountedComponent.focus) {\n            this._mountedComponent.focus();\n        }\n    }\n\n    blur() {\n        if (this._mountedComponent && this._mountedComponent.blur) {\n            this._mountedComponent.blur();\n        }\n    }\n\n    getSelectedText(): string {\n        return ''; // Implemented for 'windows' only (requires support from RN).\n    }\n}\n\nexport default Text;\n"
  },
  {
    "path": "src/native-common/TextInput.tsx",
    "content": "/**\n * TextInput.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN-specific implementation of the cross-platform TextInput abstraction.\n */\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Types } from '../common/Interfaces';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport EventHelpers from './utils/EventHelpers';\nimport Styles from './Styles';\n\nconst _styles = {\n    defaultTextInput: Styles.createTextInputStyle({\n        borderWidth: 0, // Needed for Windows UWP\n        padding: 0,\n    }),\n};\n\nexport interface TextInputState {\n    inputValue: string;\n    isFocused: boolean;\n}\n\nexport interface TextInputContext {\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\ninterface Selection {\n    start: number;\n    end: number;\n}\n\nexport class TextInput extends React.Component<Types.TextInputProps, TextInputState> {\n    static contextTypes: React.ValidationMap<any> = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: TextInputContext;\n\n    private _selectionToSet: Selection | undefined;\n    private _selection: Selection = { start: 0, end: 0 };\n    protected _mountedComponent: RN.TextInput | undefined;\n\n    constructor(props: Types.TextInputProps, context?: TextInputContext) {\n        super(props, context);\n\n        this.state = {\n            inputValue: props.value !== undefined ? props.value : (props.defaultValue || ''),\n            isFocused: false,\n        };\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.TextInputProps) {\n        if (nextProps.value !== undefined && nextProps.value !== this.state.inputValue) {\n            this.setState({\n                inputValue: nextProps.value || '',\n            });\n        }\n    }\n\n    componentDidMount() {\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    protected _render(props: RN.TextInputProps, onMount: (textInput: RN.TextInput | null) => void): JSX.Element {\n        return (\n            <RN.TextInput { ...props } ref={ onMount } />\n        );\n    }\n\n    render() {\n        const editable = this.props.editable !== false;\n        // If blurOnSubmit value is explicitly specified, use it, otherwise auto-blur single line inputs\n        const blurOnSubmit = this.props.blurOnSubmit !== undefined ? this.props.blurOnSubmit : !this.props.multiline;\n\n        const internalProps: RN.ExtendedTextInputProps = {\n            multiline: this.props.multiline,\n            style: Styles.combine([_styles.defaultTextInput, this.props.style]) as RN.StyleProp<RN.TextStyle>,\n            value: this.state.inputValue,\n\n            autoCorrect: this.props.autoCorrect,\n            spellCheck: this.props.spellCheck,\n            autoCapitalize: this.props.autoCapitalize,\n            keyboardType: this.props.keyboardType,\n            editable: editable,\n            selectionColor: this.props.selectionColor,\n            maxLength: this.props.maxLength,\n            placeholder: this.props.placeholder,\n            defaultValue: this.props.value,\n            placeholderTextColor: this.props.placeholderTextColor,\n            onSubmitEditing: this.props.onSubmitEditing,\n            onKeyPress: this._onKeyPress,\n            onPaste: this._onPaste,\n            onChangeText: this._onChangeText,\n            onSelectionChange: this._onSelectionChange,\n            onFocus: this._onFocus,\n            onBlur: this._onBlur,\n            onScroll: this._onScroll,\n            selection: this._selectionToSet,\n            secureTextEntry: this.props.secureTextEntry,\n\n            keyboardAppearance: this.props.keyboardAppearance,\n            returnKeyType: this.props.returnKeyType,\n            disableFullscreenUI: this.props.disableFullscreenUI,\n            blurOnSubmit: blurOnSubmit,\n            textBreakStrategy: 'simple',\n            accessibilityLabel: this.props.accessibilityLabel,\n            allowFontScaling: this.props.allowFontScaling,\n            underlineColorAndroid: 'transparent',\n            clearButtonMode: this.props.clearButtonMode,\n            testID: this.props.testId,\n        };\n\n        this._selectionToSet = undefined;\n\n        return this._render(internalProps, this._onMount);\n    }\n\n    protected _onMount = (component: RN.TextInput | null) => {\n        this._mountedComponent = component || undefined;\n    };\n\n    private _onFocus = (e: Types.FocusEvent) => {\n        this.setState({ isFocused: true });\n\n        if (this.props.onFocus) {\n            this.props.onFocus(e);\n        }\n    };\n\n    private _onBlur = (e: Types.FocusEvent) => {\n        this.setState({ isFocused: false });\n\n        if (this.props.onBlur) {\n            this.props.onBlur(e);\n        }\n    };\n\n    private _onChangeText = (newText: string) => {\n        this.setState({ inputValue: newText });\n\n        if (this.props.onChangeText) {\n            this.props.onChangeText(newText);\n        }\n    };\n\n    private _onSelectionChange = (e: RN.NativeSyntheticEvent<RN.TextInputSelectionChangeEventData>) => {\n        const selection = e.nativeEvent.selection;\n\n        /**\n         * On Android, clamp the selection start and end indices to be within the bounds of the TextInput's value.\n         * If we didn't do this, on Android some Java code would throw an index out of bounds exception when attempting\n         * to set the selection. An important detail for this to work is that React Native Android fires `onChangeText`\n         * before `onSelectionChange` which means we have the up-to-date TextInput value's length when this handler\n         * runs. Whereas in React Native iOS and UWP, those events fire in the reverse order so this handler can't\n         * clamp on those platforms.\n         */\n        const selectionStart = (RN.Platform.OS === 'android')\n            ? Math.min(selection.start, this.state.inputValue.length)\n            : selection.start;\n\n        const selectionEnd = (RN.Platform.OS === 'android')\n            ? Math.min(selection.end, this.state.inputValue.length)\n            : selection.end;\n\n        this._selection = { start: selectionStart, end: selectionEnd };\n        if (this.props.onSelectionChange) {\n            this.props.onSelectionChange(selectionStart, selectionEnd);\n        }\n    };\n\n    private _onKeyPress = (e: RN.NativeSyntheticEvent<RN.TextInputKeyPressEventData>) => {\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(EventHelpers.toKeyboardEvent(e));\n        }\n    };\n\n    private _onPaste = (e: React.ClipboardEvent<any>) => {\n        if (this.props.onPaste) {\n            this.props.onPaste(e);\n        }\n    };\n\n    private _onScroll = (e: RN.NativeSyntheticEvent<RN.TextInputScrollEventData>) => {\n        if (this.props.onScroll) {\n            const { contentOffset } = e.nativeEvent;\n            this.props.onScroll(contentOffset.x, contentOffset.y);\n        }\n    };\n\n    blur() {\n        if (this._mountedComponent) {\n            this._mountedComponent.blur();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => !!this._mountedComponent,\n        );\n    }\n\n    focus() {\n        if (this._mountedComponent) {\n            this._mountedComponent.focus();\n        }\n    }\n\n    setAccessibilityFocus() {\n        if (this._mountedComponent) {\n            AccessibilityUtil.setAccessibilityFocus(this);\n        }\n    }\n\n    isFocused() {\n        return this.state.isFocused;\n    }\n\n    selectAll() {\n        this._selectionToSet = { start: 0, end: this.state.inputValue.length };\n        this._selection = this._selectionToSet;\n        this.forceUpdate();\n    }\n\n    selectRange(start: number, end: number) {\n        const constrainedStart = Math.min(start, this.state.inputValue.length);\n        const constrainedEnd = Math.min(end, this.state.inputValue.length);\n\n        this._selectionToSet = { start: constrainedStart, end: constrainedEnd };\n        this._selection = this._selectionToSet;\n        this.forceUpdate();\n    }\n\n    getSelectionRange(): { start: number; end: number } {\n        return this._selection;\n    }\n\n    setValue(value: string): void {\n        this._onChangeText(value);\n    }\n}\n\nexport default TextInput;\n"
  },
  {
    "path": "src/native-common/UserInterface.tsx",
    "content": "/**\n * UserInterface.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN implementation of the ReactXP interfaces related to\n * UI (layout measurements, etc.).\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport AppConfig from '../common/AppConfig';\nimport assert from '../common/assert';\nimport * as RX from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\n\nimport MainViewStore from './MainViewStore';\n\nexport class UserInterface extends RX.UserInterface {\n    private _touchLatencyThresholhdMs: number | undefined;\n    private _isNavigatingWithKeyboard = false;\n    private _rootViewUsingPropsFactory: RN.ComponentProvider | undefined;\n    private _rootViewRegistry: {[id: string]: number};\n\n    constructor() {\n        super();\n        RN.Dimensions.addEventListener('change', event => {\n            this.contentSizeMultiplierChangedEvent.fire(event.window.fontScale);\n        });\n        this.keyboardNavigationEvent.subscribe(this._keyboardNavigationStateChanged);\n        this._rootViewRegistry = {};\n    }\n\n    measureLayoutRelativeToWindow(component: React.Component<any, any>): Promise<RX.Types.LayoutInfo> {\n        const deferred = new Defer<RX.Types.LayoutInfo>();\n        const nodeHandle = RN.findNodeHandle(component);\n\n        assert(!!nodeHandle);\n\n        RN.NativeModules.UIManager.measureInWindow(\n            nodeHandle, (x: number, y: number, width: number, height: number) => {\n                deferred.resolve({\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height,\n                });\n            },\n        );\n\n        return deferred.promise();\n    }\n\n    measureLayoutRelativeToAncestor(component: React.Component<any, any>,\n            ancestor: React.Component<any, any>): Promise<RX.Types.LayoutInfo> {\n\n        const deferred = new Defer<RX.Types.LayoutInfo>();\n        const nodeHandle = RN.findNodeHandle(component);\n        const ancestorNodeHander = RN.findNodeHandle(ancestor);\n\n        RN.NativeModules.UIManager.measureLayout(\n            nodeHandle, ancestorNodeHander, () => {\n                deferred.reject('UIManager.measureLayout() failed');\n            },\n            (x: number, y: number, width: number, height: number, pageX: number, pageY: number) => {\n                deferred.resolve({\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height,\n                });\n            },\n        );\n\n        return deferred.promise();\n    }\n\n    measureWindow(rootViewId?: string): RX.Types.LayoutInfo {\n        let dimensions = RN.Dimensions.get('window');\n\n        if (rootViewId && RN.Platform.OS === 'windows') {\n            try {\n                dimensions = RN.Dimensions.get(rootViewId as any);\n            } catch (e) {\n                // Can happen if RNW doesn't support multi view dimensions tracking yet\n                console.warn('Couldn\\'t get dimensions for rootViewId ' + rootViewId +\n                 ' check if RNW already supports multi view dimensions tracking');\n            }\n        }\n\n        return {\n            x: 0,\n            y: 0,\n            width: dimensions.width,\n            height: dimensions.height,\n        };\n    }\n\n    getContentSizeMultiplier(): Promise<number> {\n        const deferred = new Defer<number>();\n\n        // TODO: #727532 Remove conditional after implementing UIManager.getContentSizeMultiplier for UWP\n        // TODO:(alregner) Remove conditional after implementing UIManager.getContentSizeMultiplier for macos\n        if (RN.Platform.OS === 'windows' || RN.Platform.OS === 'macos') {\n            deferred.resolve(1);\n        } else {\n            deferred.resolve(RN.PixelRatio.getFontScale());\n        }\n\n        return deferred.promise();\n    }\n\n    useCustomScrollbars(enable = true) {\n        // Nothing to do\n    }\n\n    dismissKeyboard() {\n        // Work around the fact that the react-native type definition file\n        // doesn't properly specify RN.TextInput.State as static.\n        const staticState = (RN.TextInput as any).State as RN.TextInputState;\n        staticState.blurTextInput(staticState.currentlyFocusedField());\n    }\n\n    isHighPixelDensityScreen() {\n        const ratio = RN.PixelRatio.get();\n        const isHighDef = ratio > 1;\n        return isHighDef;\n    }\n\n    getPixelRatio(): number {\n        return RN.PixelRatio.get();\n    }\n\n    setMainView(element: React.ReactElement<any>) {\n        MainViewStore.setMainView(element);\n    }\n\n    registerRootViewUsingPropsFactory(factory: RN.ComponentProvider) {\n        this._rootViewUsingPropsFactory = factory;\n    }\n\n    registerRootView(viewKey: string, getComponentFunc: Function) {\n        if (this._rootViewUsingPropsFactory) {\n            const RootViewUsingProps = this._rootViewUsingPropsFactory();\n            RN.AppRegistry.registerComponent(viewKey, () => {\n                class RootViewWrapper extends React.Component<any, any> {\n                    render() {\n                        return (\n                            <RootViewUsingProps\n                                reactxp_mainViewType={ getComponentFunc() }\n                                { ...this.props }\n                            />\n                        );\n                    }\n                }\n\n                return RootViewWrapper;\n            });\n        }\n    }\n\n    renderMainView() {\n        // Nothing to do\n    }\n\n    enableTouchLatencyEvents(latencyThresholdMs: number): void {\n        this._touchLatencyThresholhdMs = latencyThresholdMs;\n    }\n\n    evaluateTouchLatency(e: RX.Types.SyntheticEvent) {\n        if (this._touchLatencyThresholhdMs) {\n            const latency = Date.now() - e.timeStamp.valueOf();\n            if (latency > this._touchLatencyThresholhdMs) {\n                this.touchLatencyEvent.fire(latency);\n            }\n        }\n    }\n\n    isNavigatingWithKeyboard(): boolean {\n        return this._isNavigatingWithKeyboard;\n    }\n\n    private _keyboardNavigationStateChanged = (isNavigatingWithKeyboard: boolean) => {\n        this._isNavigatingWithKeyboard = isNavigatingWithKeyboard;\n    };\n\n    notifyRootViewInstanceCreated(rootViewId: string, nodeHandle: number): void {\n        if (AppConfig.isDevelopmentMode()) {\n            const existing = this.findNodeHandleByRootViewId(rootViewId);\n            if (existing && existing !== nodeHandle) {\n                console.warn('Duplicate reactxp_rootViewId!');\n            }\n        }\n\n        this._rootViewRegistry[rootViewId] = nodeHandle;\n    }\n\n    notifyRootViewInstanceDestroyed(rootViewId: string): void {\n        delete this._rootViewRegistry[rootViewId];\n    }\n\n    findNodeHandleByRootViewId(rootViewId: string): number | undefined {\n        return this._rootViewRegistry[rootViewId];\n    }\n}\n\nexport default new UserInterface();\n"
  },
  {
    "path": "src/native-common/UserPresence.ts",
    "content": "﻿/**\n * UserPresence.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native implementation of the RX interfaces related to\n * user presence.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class UserPresence extends RX.UserPresence {\n    // On native platforms, assume that the user is present\n    // whenever the app is running.\n    isUserPresent(): boolean {\n        return true;\n    }\n}\n\nexport default new UserPresence();\n"
  },
  {
    "path": "src/native-common/View.tsx",
    "content": "/**\n* View.tsx\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* RN-specific implementation of the cross-platform View abstraction.\n*/\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport assert from '../common/assert';\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport * as RX from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport { MacComponentAccessibilityProps } from './Accessibility';\nimport AccessibilityUtil from './AccessibilityUtil';\nimport Animated from './Animated';\nimport App from './App';\nimport EventHelpers from './utils/EventHelpers';\nimport { clone, extend } from './utils/lodashMini';\nimport Platform from './Platform';\nimport Styles from './Styles';\nimport UserInterface from './UserInterface';\nimport ViewBase from './ViewBase';\n\nconst _isNativeMacOs = Platform.getType() === 'macos';\n\nconst LayoutAnimation = RN.LayoutAnimation;\n\n// Note: a lot of code is duplicated with Button due to View currently supporting a lot of features Button does.\nconst _defaultActiveOpacity = 0.2;\nconst _inactiveOpacityAnimationDuration = 250;\nconst _activeOpacityAnimationDuration = 0;\nconst _hideUnderlayTimeout = 100;\nconst _underlayInactive = 'transparent';\n\nconst safeInsetsStyle = Styles.createViewStyle({ flex: 1, alignSelf: 'stretch' });\n\nfunction noop() { /* noop */ }\n\nfunction applyMixin(thisObj: any, mixin: {[propertyName: string]: any}, propertiesToSkip: string[]) {\n    Object.getOwnPropertyNames(mixin).forEach(name => {\n        if (name !== 'constructor' && propertiesToSkip.indexOf(name) === -1 && typeof mixin[name].bind === 'function') {\n            assert(\n                !(name in thisObj),\n                `An object cannot have a method with the same name as one of its mixins: \"${name}\"`,\n            );\n            thisObj[name] = mixin[name].bind(thisObj);\n        }\n    });\n}\n\nfunction removeMixin(thisObj: any, mixin: {[propertyName: string]: any}, propertiesToSkip: string[]) {\n    Object.getOwnPropertyNames(mixin).forEach(name => {\n        if (name !== 'constructor' && propertiesToSkip.indexOf(name) === -1) {\n            assert(\n                (name in thisObj),\n                `An object is missing a mixin method: \"${name}\"`,\n            );\n            delete thisObj[name];\n        }\n    });\n}\n\ntype ChildKey = string | number;\nfunction extractChildrenKeys(children: React.ReactNode): ChildKey[] {\n    const keys: ChildKey[] = [];\n    React.Children.forEach(children, function(child, index) {\n        if (child) {\n            const childReactElement = child as React.ReactElement<any>;\n            assert(\n                childReactElement.key !== undefined && childReactElement.key !== null,\n                'Children passed to a `View` with child animations enabled must have a `key`',\n            );\n            if (childReactElement.key !== null) {\n                keys.push(childReactElement.key);\n            }\n        }\n    });\n    return keys;\n}\n\nfunction findInvalidRefs(children: React.ReactNode) {\n    const invalidRefs: string[] = [];\n    React.Children.forEach(children, function(child) {\n        if (child) {\n            const childElement = child as any;\n            if (typeof childElement.ref !== 'function' && childElement.ref !== undefined && childElement.ref !== null) {\n                invalidRefs.push(childElement.ref as string);\n            }\n        }\n    });\n    return invalidRefs;\n}\n\n// Returns true if an item was added or moved. We use this information to determine\n// whether or not we'll need to play any list edit animations.\nfunction _childrenEdited(prevChildrenKeys: ChildKey[], nextChildrenKeys: ChildKey[]): boolean {\n    const prevLength = prevChildrenKeys ? prevChildrenKeys.length : 0;\n    const nextLength = nextChildrenKeys ? nextChildrenKeys.length : 0;\n\n    // Were new items added?\n    if (nextLength > prevLength) {\n        return true;\n    }\n\n    // See if changes were limited to removals. Any additions or moves should return true.\n    let prevIndex = 0;\n    for (let nextIndex = 0; nextIndex < nextLength; nextIndex++) {\n        if (prevChildrenKeys[prevIndex] === nextChildrenKeys[nextIndex]) {\n            prevIndex++;\n        } else {\n            // If there are more \"next\" items left than there are \"prev\" items left,\n            // then we know that something has been added or moved.\n            if (nextLength - nextIndex > prevLength - prevIndex) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n}\n\nexport interface ViewContext {\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class View extends ViewBase<RX.Types.ViewProps, RX.Types.Stateless, RN.View, RX.View> {\n    static contextTypes: React.ValidationMap<any> = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: ViewContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    protected _internalProps: any = {};\n\n    // Assigned when mixin is applied\n    touchableGetInitialState!: () => RN.Touchable.State;\n    touchableHandleStartShouldSetResponder!: () => boolean;\n    touchableHandleResponderTerminationRequest!: () => boolean;\n    touchableHandleResponderGrant!: (e: React.SyntheticEvent<any>) => void;\n    touchableHandleResponderMove!: (e: React.SyntheticEvent<any>) => void;\n    touchableHandleResponderRelease!: (e: React.SyntheticEvent<any>) => void;\n    touchableHandleResponderTerminate!: (e: React.SyntheticEvent<any>) => void;\n\n    private _mixinIsApplied = false;\n    private _childrenKeys: ChildKey[] | undefined;\n\n    private _mixin_componentDidMount?: () => void;\n    private _mixin_componentWillUnmount?: () => void;\n\n    protected _isMounted = false;\n    private _hideTimeout: number | undefined;\n    private _defaultOpacityValue: number | undefined;\n    private _opacityAnimatedValue: RN.Animated.Value | undefined;\n    private _opacityAnimatedStyle: RX.Types.AnimatedViewStyleRuleSet | undefined;\n\n    private _focusArbitratorProvider: FocusArbitratorProvider | undefined;\n\n    constructor(props: RX.Types.ViewProps, context?: ViewContext) {\n        super(props, context);\n        this._updateMixin(props, true);\n        this._buildInternalProps(props);\n\n        if (props.arbitrateFocus) {\n            this._updateFocusArbitratorProvider(props);\n        }\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: RX.Types.ViewProps) {\n        this._updateMixin(nextProps, false);\n        this._buildInternalProps(nextProps);\n\n        if (('arbitrateFocus' in nextProps) && (this.props.arbitrateFocus !== nextProps.arbitrateFocus)) {\n            this._updateFocusArbitratorProvider(nextProps);\n        }\n    }\n\n    UNSAFE_componentWillUpdate(nextProps: RX.Types.ViewProps, nextState: {}) {\n        //\n        // Exit fast if not an \"animated children\" case\n        if (!(nextProps.animateChildEnter || nextProps.animateChildMove || nextProps.animateChildLeave)) {\n            return;\n        }\n\n        // Each time the component receives new children, animates insertions, removals,\n        // and moves that occurred since the previous render. Uses React Native's\n        // LayoutAnimation API to achieve this.\n        //\n        // Caveats:\n        //   - The animations are not scoped. All layout changes in the app that occur during the\n        //     next bridge transaction will be animated. This is due to a limitation in React Native's\n        //     LayoutAnimation API.\n        //   - Removals are not animated. The removed item disappears instantly. Items whose positions\n        //     were affected by the removal are animated into their new positions. This is due to a\n        //     limitation in React Native's LayoutAnimation API.\n        //\n\n        // The web implementation doesn't support string refs. For consistency, do the same assert\n        // in the native implementation.\n        assert(\n            findInvalidRefs(nextProps.children).length === 0,\n            'Invalid ref(s): ' + JSON.stringify(findInvalidRefs(nextProps.children)) +\n            ' Only callback refs are supported when using child animations on a `View`',\n        );\n\n        const prevChildrenKeys = this._childrenKeys || [];\n        const nextChildrenKeys = extractChildrenKeys(nextProps.children);\n        this._childrenKeys = nextChildrenKeys;\n        if (_childrenEdited(prevChildrenKeys, nextChildrenKeys)) {\n            const updateConfig: RN.LayoutAnimationAnim = {\n                delay: 0,\n                duration: 300,\n                type: LayoutAnimation.Types.easeOut,\n            };\n            const createConfig: RN.LayoutAnimationAnim = {\n                delay: 75,\n                duration: 150,\n                type: LayoutAnimation.Types.linear,\n                property: LayoutAnimation.Properties.opacity,\n            };\n            const configDictionary: RN.LayoutAnimationConfig = {\n                duration: 300,\n            };\n\n            if (nextProps.animateChildMove) {\n                configDictionary.update = updateConfig;\n            }\n\n            if (nextProps.animateChildEnter) {\n                configDictionary.create = createConfig;\n            }\n\n            LayoutAnimation.configureNext(configDictionary);\n        }\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n        if (this._mixin_componentDidMount) {\n            this._mixin_componentDidMount();\n        }\n\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n        if (this._mixin_componentWillUnmount) {\n            this._mixin_componentWillUnmount();\n        }\n    }\n\n    private _updateMixin(props: RX.Types.ViewProps, initial: boolean) {\n        const isButton = this._isButton(props);\n        if (isButton && !this._mixinIsApplied) {\n            // Create local handlers\n            this.touchableHandlePress = this.touchableHandlePress.bind(this);\n            this.touchableHandleLongPress = this.touchableHandleLongPress.bind(this);\n            this.touchableGetPressRectOffset = this.touchableGetPressRectOffset.bind(this);\n            this.touchableHandleActivePressIn = this.touchableHandleActivePressIn.bind(this);\n            this.touchableHandleActivePressOut = this.touchableHandleActivePressOut.bind(this);\n            this.touchableGetHighlightDelayMS = this.touchableGetHighlightDelayMS.bind(this);\n\n            applyMixin(this, RN.Touchable.Mixin, [\n                // Properties that View and RN.Touchable.Mixin have in common. View needs\n                // to dispatch these methods to RN.Touchable.Mixin manually.\n                'componentDidMount',\n                'componentWillUnmount',\n            ]);\n\n            this._mixin_componentDidMount = RN.Touchable.Mixin.componentDidMount || noop;\n            this._mixin_componentWillUnmount = RN.Touchable.Mixin.componentWillUnmount || noop;\n\n            if (initial) {\n                this.state = this.touchableGetInitialState();\n            } else {\n                this.setState(this.touchableGetInitialState());\n            }\n\n            this._mixinIsApplied = true;\n        } else if (!isButton && this._mixinIsApplied) {\n            removeMixin(this, RN.Touchable.Mixin, [\n                'componentDidMount',\n                'componentWillUnmount',\n            ]);\n\n            delete this._mixin_componentDidMount;\n            delete this._mixin_componentWillUnmount;\n\n            delete this.touchableHandlePress;\n            delete this.touchableHandleLongPress;\n            delete this.touchableGetPressRectOffset;\n            delete this.touchableHandleActivePressIn;\n            delete this.touchableHandleActivePressOut;\n            delete this.touchableGetHighlightDelayMS;\n\n            this._mixinIsApplied = false;\n        }\n    }\n\n    getChildContext() {\n        const childContext: ViewContext = {};\n\n        if (this._focusArbitratorProvider) {\n            childContext.focusArbitrator = this._focusArbitratorProvider;\n        }\n\n        return childContext;\n    }\n\n    /**\n     * Attention:\n     * be careful with setting any non layout properties unconditionally in this method to any value\n     * as on android that would lead to extra layers of Views.\n     */\n    protected _buildInternalProps(props: RX.Types.ViewProps) {\n        this._internalProps = clone(props) as any;\n        this._internalProps.ref = this._setNativeComponent;\n\n        if (props.testId) {\n            // Convert from testId to testID.\n            this._internalProps.testID = this._internalProps.testId;\n            delete this._internalProps.testId;\n        }\n\n        // Translate accessibilityProps from RX to RN, there are type diferrences for example:\n        // accessibilityLiveRegion prop is number (RX.Types.AccessibilityLiveRegion) in RX, but\n        // string is expected by RN.View\n        const accessibilityProps = {\n            importantForAccessibility: AccessibilityUtil.importantForAccessibilityToString(props.importantForAccessibility),\n            accessibilityLabel: props.accessibilityLabel || props.title,\n            accessibilityTraits: AccessibilityUtil.accessibilityTraitToString(props.accessibilityTraits),\n            accessibilityComponentType: AccessibilityUtil.accessibilityComponentTypeToString(props.accessibilityTraits),\n            accessibilityLiveRegion: AccessibilityUtil.accessibilityLiveRegionToString(props.accessibilityLiveRegion),\n        };\n        if (_isNativeMacOs && App.supportsExperimentalKeyboardNavigation && (props.onPress ||\n                (props.tabIndex !== undefined && props.tabIndex >= 0))) {\n            const macAccessibilityProps: MacComponentAccessibilityProps = accessibilityProps as any;\n            if (props.tabIndex !== -1) {\n                macAccessibilityProps.acceptsKeyboardFocus = true;\n                macAccessibilityProps.enableFocusRing = true;\n            }\n            if (props.onPress) {\n                macAccessibilityProps.onClick = props.onPress;\n            }\n        }\n        this._internalProps = extend(this._internalProps, accessibilityProps);\n\n        if (props.onLayout) {\n            this._internalProps.onLayout = this._onLayout;\n        }\n\n        if (props.blockPointerEvents) {\n            this._internalProps.pointerEvents = 'none';\n        } else {\n            if (props.ignorePointerEvents) {\n                this._internalProps.pointerEvents = 'box-none';\n            }\n        }\n\n        if (props.onKeyPress) {\n            this._internalProps.onKeyPress = this._onKeyPress;\n        }\n\n        const baseStyle = this._getStyles(props);\n        this._internalProps.style = baseStyle;\n        if (this._mixinIsApplied) {\n            const responderProps = {\n                onStartShouldSetResponder: this.props.onStartShouldSetResponder || this.touchableHandleStartShouldSetResponder,\n                onResponderTerminationRequest: this.props.onResponderTerminationRequest || this.touchableHandleResponderTerminationRequest,\n                onResponderGrant: this.props.onResponderGrant || this.touchableHandleResponderGrant,\n                onResponderMove: this.props.onResponderMove || this.touchableHandleResponderMove,\n                onResponderRelease: this.props.onResponderRelease || this.touchableHandleResponderRelease,\n                onResponderTerminate: this.props.onResponderTerminate || this.touchableHandleResponderTerminate,\n            };\n            this._internalProps = extend(this._internalProps, responderProps);\n\n            if (!this.props.disableTouchOpacityAnimation) {\n                const opacityValueFromProps = this._getDefaultOpacityValue(props);\n                if (this._defaultOpacityValue !== opacityValueFromProps) {\n                    this._defaultOpacityValue = opacityValueFromProps;\n                    this._opacityAnimatedValue = new Animated.Value(this._defaultOpacityValue);\n                    this._opacityAnimatedStyle = Styles.createAnimatedViewStyle({\n                        opacity: this._opacityAnimatedValue,\n                    });\n                }\n                this._internalProps.style = Styles.combine([baseStyle as any, this._opacityAnimatedStyle]);\n            }\n\n            this._internalProps.tooltip = this.props.title;\n        }\n\n        if (this.props.useSafeInsets) {\n            this._internalProps.style = Styles.combine([this._internalProps.style, safeInsetsStyle]);\n        }\n    }\n\n    private _onKeyPress = (e: RN.NativeSyntheticEvent<RN.TextInputKeyPressEventData>) => {\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(EventHelpers.toKeyboardEvent(e));\n        }\n    };\n\n    private _isTouchFeedbackApplicable() {\n        return this._isMounted && this._mixinIsApplied && !!this._nativeComponent;\n    }\n\n    private _opacityActive(duration: number) {\n        this._setOpacityTo(this.props.activeOpacity || _defaultActiveOpacity, duration);\n    }\n\n    private _opacityInactive(duration: number) {\n        this._setOpacityTo(this._defaultOpacityValue!, duration);\n    }\n\n    private _getDefaultOpacityValue(props: RX.Types.ViewProps): number {\n        let flattenedStyles: { [key: string]: any } | undefined;\n        if (props && props.style) {\n            flattenedStyles = RN.StyleSheet.flatten(props.style as RN.StyleProp<RN.ViewStyle>);\n        }\n\n        return flattenedStyles && flattenedStyles.opacity || 1;\n    }\n\n    private _setOpacityTo(value: number, duration: number) {\n        Animated.timing(\n            this._opacityAnimatedValue!,\n            {\n                toValue: value,\n                duration: duration,\n                easing: Animated.Easing.InOut(),\n            },\n        ).start();\n    }\n\n    private _showUnderlay() {\n        if (!this._nativeComponent) {\n            return;\n        }\n\n        this._nativeComponent.setNativeProps({\n            style: {\n                backgroundColor: this.props.underlayColor,\n            },\n        });\n    }\n\n    private _hideUnderlay = () => {\n        if (!this._isMounted || !this._nativeComponent) {\n            return;\n        }\n\n        this._nativeComponent.setNativeProps({\n            style: [{\n                backgroundColor: _underlayInactive,\n            }, this.props.style],\n        });\n    };\n\n    protected _isButton(viewProps: RX.Types.ViewProps): boolean {\n        return !!(viewProps.onPress || viewProps.onLongPress);\n    }\n\n    private _updateFocusArbitratorProvider(props: RX.Types.ViewProps) {\n        if (props.arbitrateFocus) {\n            if (this._focusArbitratorProvider) {\n                this._focusArbitratorProvider.setCallback(props.arbitrateFocus);\n            } else {\n                this._focusArbitratorProvider = new FocusArbitratorProvider(this, props.arbitrateFocus);\n            }\n        } else if (this._focusArbitratorProvider) {\n            delete this._focusArbitratorProvider;\n        }\n    }\n\n    render() {\n        let ViewToRender: typeof RN.Animated.View | typeof RN.SafeAreaView = RN.View;\n\n        if (this._isButton(this.props)) {\n            ViewToRender = RN.Animated.View;\n        } else if (this.props.useSafeInsets) {\n            ViewToRender = RN.SafeAreaView;\n        }\n\n        return (\n            <ViewToRender { ...this._internalProps }>\n                { this.props.children }\n            </ViewToRender>\n        );\n    }\n\n    touchableHandlePress(e: RX.Types.SyntheticEvent): void {\n        UserInterface.evaluateTouchLatency(e);\n        if (EventHelpers.isRightMouseButton(e)) {\n            if (this.props.onContextMenu) {\n                this.props.onContextMenu(EventHelpers.toMouseEvent(e));\n            }\n        } else {\n            if (this.props.onPress) {\n                this.props.onPress(EventHelpers.toMouseEvent(e));\n            }\n        }\n    }\n\n    touchableHandleLongPress(e: RX.Types.SyntheticEvent): void {\n        if (!EventHelpers.isRightMouseButton(e)) {\n            if (this.props.onLongPress) {\n                this.props.onLongPress(EventHelpers.toMouseEvent(e));\n            }\n        }\n    }\n\n    touchableHandleActivePressIn(e: RX.Types.SyntheticEvent): void {\n        if (this._isTouchFeedbackApplicable()) {\n            if (this.props.underlayColor) {\n                if (this._hideTimeout) {\n                    Timers.clearTimeout(this._hideTimeout);\n                    this._hideTimeout = undefined;\n                }\n                this._showUnderlay();\n            }\n\n            // We do not want to animate opacity if underlayColour is provided. Unless an explicit activeOpacity is provided\n            if (!this.props.disableTouchOpacityAnimation && (this.props.activeOpacity || !this.props.underlayColor)) {\n                this._opacityActive(_activeOpacityAnimationDuration);\n            }\n        }\n    }\n\n    touchableHandleActivePressOut(e: RX.Types.SyntheticEvent): void {\n        if (this._isTouchFeedbackApplicable()) {\n            if (this.props.underlayColor) {\n                if (this._hideTimeout) {\n                    Timers.clearTimeout(this._hideTimeout);\n                }\n                this._hideTimeout = Timers.setTimeout(this._hideUnderlay, _hideUnderlayTimeout);\n            }\n\n            if (!this.props.disableTouchOpacityAnimation && (this.props.activeOpacity || !this.props.underlayColor)) {\n                this._opacityInactive(_inactiveOpacityAnimationDuration);\n            }\n        }\n    }\n\n    touchableGetHighlightDelayMS(): number {\n        return 20;\n    }\n\n    touchableGetPressRectOffset() {\n        return {top: 20, left: 20, right: 20, bottom: 100};\n    }\n\n    setFocusRestricted(restricted: boolean) {\n        // Nothing to do.\n    }\n\n    setFocusLimited(limited: boolean) {\n        // Nothing to do.\n    }\n\n    blur() {\n        if (ViewBase._supportsNativeFocusBlur && this._nativeComponent && this._nativeComponent.blur) {\n            this._nativeComponent.blur();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._isMounted,\n        );\n    }\n\n    focus() {\n        if (this._isMounted) {\n            AccessibilityUtil.setAccessibilityFocus(this);\n        }\n        if (ViewBase._supportsNativeFocusBlur && this._nativeComponent) {\n            if (this._nativeComponent.focus) {\n                this._nativeComponent.focus();\n            } else if ((this._nativeComponent as any)._component) {\n                // Components can be wrapped by RN.Animated implementation, peek at the inner workings here\n                const innerComponent = (this._nativeComponent as any)._component;\n                if (innerComponent && innerComponent.focus) {\n                    innerComponent.focus();\n                }\n            }\n        }\n    }\n}\n\nexport default View;\n"
  },
  {
    "path": "src/native-common/ViewBase.tsx",
    "content": "/**\n * ViewBase.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Base class that is used for several RX views.\n */\n\nimport * as RN from 'react-native';\n\nimport * as RX from '../common/Interfaces';\n\nimport { isEqual } from './utils/lodashMini';\n\nexport abstract class ViewBase<\n    P extends RX.Types.ViewPropsShared<C>,\n    S,\n    T extends RN.View | RN.ScrollView,\n    C extends RX.View | RX.ScrollView\n> extends RX.ViewBase<P, S> {\n\n    protected static readonly _supportsNativeFocusBlur = RN.Platform.OS !== 'android';\n    private static _defaultViewStyle: RX.Types.ViewStyleRuleSet | undefined;\n    private _layoutEventValues: RX.Types.ViewOnLayoutEvent | undefined;\n\n    abstract render(): JSX.Element;\n    protected _nativeComponent: T | undefined;\n\n    static setDefaultViewStyle(defaultViewStyle: RX.Types.ViewStyleRuleSet) {\n        ViewBase._defaultViewStyle = defaultViewStyle;\n    }\n\n    static getDefaultViewStyle() {\n        return ViewBase._defaultViewStyle;\n    }\n\n    // To be able to use View inside TouchableHighlight/TouchableOpacity\n    setNativeProps(nativeProps: RN.ViewProps) {\n        // We know that View and ScrollView both has setNative props even if the typings don't exist\n        const nativeComponent = this._nativeComponent as any as RN.ReactNativeBaseComponent<any, any> | null;\n        if (nativeComponent && nativeComponent.setNativeProps) {\n            nativeComponent.setNativeProps(nativeProps);\n        }\n    }\n\n    protected _setNativeComponent = (view: T | null) => {\n        this._nativeComponent = view || undefined;\n    };\n\n    protected _getStyles(props: RX.Types.ViewProps) {\n        // If this platform uses an explicit default view style, push it on to\n        // the front of the list of provided styles.\n        if (ViewBase._defaultViewStyle) {\n            return [ViewBase._defaultViewStyle, props.style];\n        }\n\n        return props.style;\n    }\n\n    protected _onLayout = (event: RN.LayoutChangeEvent) => {\n        if (this.props.onLayout) {\n            const layoutEventValues = {\n                x: event.nativeEvent.layout.x,\n                y: event.nativeEvent.layout.y,\n                width: event.nativeEvent.layout.width,\n                height: event.nativeEvent.layout.height,\n            };\n\n            // Only fire the onLayout callback if the layout values change\n            if (!isEqual(this._layoutEventValues, layoutEventValues)) {\n                this.props.onLayout(layoutEventValues);\n                this._layoutEventValues = layoutEventValues;\n            }\n        }\n    };\n}\n\nexport default ViewBase;\n"
  },
  {
    "path": "src/native-common/utils/EventHelpers.ts",
    "content": "/**\n * EventHelpers.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\nimport { Platform } from 'react-native';\n\nimport * as EventHelpersCommon from '../../common/utils/EventHelpers';\nimport { Types } from '../../common/Interfaces';\n\nimport { clone } from './lodashMini';\n\nconst _isNativeMacOs = Platform.OS === 'macos';\n// These helpers promote a SyntheticEvent to their higher level counterparts\nexport class EventHelpers {\n    toKeyboardEvent(e: Types.SyntheticEvent): Types.KeyboardEvent {\n        // Conversion to a KeyboardEvent-like event if needed\n        let keyEvent = e as Types.KeyboardEvent;\n        if (keyEvent.keyCode === undefined) {\n\n            // Currently some key codes are dependent on platform. React Native proper (the iOS and Android platforms) have different\n            // keycodes for arrow keys when comparing with React (JS).\n            // We align the keycodes for native desktop platforms to the other native ones, as a workaround.\n            // Ideally all key codes should be consistent OR a set of constants should be exposed by ReactXP.\n            const keyName: string = e.nativeEvent.key;\n            let keyCode = 0;\n\n            if (keyName.length === 1) {\n                keyCode = keyName.charCodeAt(0);\n            } else {\n                switch (keyName) {\n                    // Comma in UWP is not in VirtualKey enum and so comes as stringified int value.\n                    case '188':\n                        keyCode = 188;\n                        break;\n\n                    case 'Backspace':\n                    case 'Back':\n                        keyCode = 8;\n                        break;\n\n                    case 'Tab':\n                        keyCode = 9;\n                        break;\n\n                    case 'Enter':\n                    case 'ENTER':\n                        keyCode = 13;\n                        break;\n\n                    case 'Shift':\n                        keyCode = 16;\n                        break;\n\n                    case 'Control':\n                        keyCode = 17;\n                        break;\n\n                    case 'Alt':\n                    case 'Menu':\n                        keyCode = 18;\n                        break;\n\n                    // keyCode in windows is 93 for context menu button. Since that is already used\n                    // for PgDn, picking a keyCode that is not currently assigned in this list.\n                    case 'Application':\n                        keyCode = 500;\n                        break;\n\n                    case 'F1':\n                        keyCode = 112;\n                        break;\n\n                    case 'F2':\n                        keyCode = 113;\n                        break;\n\n                    case 'F3':\n                        keyCode = 114;\n                        break;\n\n                    case 'F4':\n                        keyCode = 115;\n                        break;\n\n                    case 'F5':\n                        keyCode = 116;\n                        break;\n\n                    case 'F6':\n                        keyCode = 117;\n                        break;\n\n                    case 'F7':\n                        keyCode = 118;\n                        break;\n\n                    case 'F8':\n                        keyCode = 119;\n                        break;\n\n                    case 'F9':\n                        keyCode = 120;\n                        break;\n\n                    case 'F10':\n                        keyCode = 121;\n                        break;\n\n                    case 'F11':\n                        keyCode = 122;\n                        break;\n\n                    case 'F12':\n                        keyCode = 123;\n                        break;\n\n                    case 'Escape':\n                        keyCode = 27;\n                        break;\n\n                    case 'Space':\n                        keyCode = 32;\n                        break;\n\n                    case 'Delete':\n                        keyCode = 46;\n                        break;\n\n                    case 'PageUp':\n                    case 'PAGE_UP':\n                        keyCode = 92;\n                        break;\n\n                    case 'PageDown':\n                    case 'PAGE_DOWN':\n                        keyCode = 93;\n                        break;\n\n                    case 'Left':\n                    case 'ArrowLeft':\n                    case 'LEFT_ARROW':\n                        keyCode = 21;\n                        break;\n\n                    case 'Up':\n                    case 'ArrowUp':\n                    case 'UP_ARROW':\n                        keyCode = 19;\n                        break;\n\n                    case 'Right':\n                    case 'ArrowRight':\n                    case 'RIGHT_ARROW':\n                        keyCode = 22;\n                        break;\n\n                    case 'Down':\n                    case 'ArrowDown':\n                    case 'DOWN_ARROW':\n                        keyCode = 20;\n                        break;\n\n                    case 'Number0':\n                        keyCode = 48;\n                        break;\n\n                    case 'Number1':\n                        keyCode = 49;\n                        break;\n\n                    case 'Number2':\n                        keyCode = 50;\n                        break;\n\n                    case 'Number3':\n                        keyCode = 51;\n                        break;\n\n                    case 'Number4':\n                        keyCode = 52;\n                        break;\n\n                    case 'Number5':\n                        keyCode = 53;\n                        break;\n\n                    case 'Number6':\n                        keyCode = 54;\n                        break;\n\n                    case 'Number7':\n                        keyCode = 55;\n                        break;\n\n                    case 'Number8':\n                        keyCode = 56;\n                        break;\n\n                    case 'Number9':\n                        keyCode = 57;\n                        break;\n\n                    case 'Add':\n                    case '187':\n                        keyCode = 187;\n                        break;\n\n                    case 'Subtract':\n                    case '189':\n                        keyCode = 189;\n                        break;\n                }\n            }\n\n            // Remap some characters on macos\n            if (_isNativeMacOs) {\n                // Handle F-Keys\n                if (keyCode >= 63236 && keyCode <= 63247) {\n                    // Re-map to proper F-keys\n                    keyCode = keyCode - 632124;\n                } else if (keyCode === 63272) {\n                    // Delete\n                    keyCode = 46;\n                } else if (keyCode === 127) {\n                    // Backspace\n                    keyCode = 8;\n                } else if (keyCode >= 632376 && keyCode <= 632377) {\n                    // Page Up / Down\n                    keyCode = keyCode - 63184;\n                } else if (keyCode >= 63232 && keyCode <= 63235) {\n                    // Arrow Keys\n                    keyCode = keyCode - 63213;\n                }\n            }\n\n            // We need to add keyCode and other properties to the original event, but React Native\n            // reuses events, so we're not allowed to modify the original.\n            // Instead, we'll clone it.\n            keyEvent = clone(keyEvent);\n            keyEvent.keyCode = keyCode;\n\n            const nativeEvent = e.nativeEvent;\n\n            if (nativeEvent.shiftKey) {\n                keyEvent.shiftKey = nativeEvent.shiftKey;\n            }\n            if (nativeEvent.ctrlKey) {\n                keyEvent.ctrlKey = nativeEvent.ctrlKey;\n            }\n            if (nativeEvent.altKey) {\n                keyEvent.altKey = nativeEvent.altKey;\n            }\n            if (nativeEvent.metaKey) {\n                keyEvent.metaKey = nativeEvent.metaKey;\n            }\n\n            keyEvent.stopPropagation = () => {\n                if (e.stopPropagation) {\n                    e.stopPropagation();\n                }\n            };\n\n            keyEvent.preventDefault = () => {\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n            };\n        }\n        return keyEvent;\n    }\n\n    toFocusEvent(e: Types.SyntheticEvent): Types.FocusEvent {\n\n        // Ideally we'd like to add a null set \"relatedTarget\", but the new typing doesn't allow that.\n        // So keeping it a noop for now\n        return e;\n    }\n\n    toMouseEvent(e: Types.SyntheticEvent): Types.MouseEvent {\n\n        // We need to add various properties to the original event, but React Native\n        // reuses events, so we're not allowed to modify the original.\n        // Instead, we'll clone it.\n        const mouseEvent = clone(e as Types.MouseEvent);\n\n        const nativeEvent = e.nativeEvent;\n\n        // We keep pageX/Y and clientX/Y coordinates in sync, similar to the React web behavior\n        // RN (UWP flavor for this type of event) also pass coordinates in the target view (locationX/Y) that we don't use here.\n        if (nativeEvent.pageX !== undefined) {\n            mouseEvent.clientX = mouseEvent.pageX = nativeEvent.pageX;\n        }\n\n        if (nativeEvent.pageY !== undefined) {\n            mouseEvent.clientY = mouseEvent.pageY = nativeEvent.pageY;\n        }\n\n        mouseEvent.button = EventHelpersCommon.toMouseButton(e.nativeEvent);\n\n        if (nativeEvent.shiftKey) {\n            mouseEvent.shiftKey = nativeEvent.shiftKey;\n        }\n        if (nativeEvent.ctrlKey) {\n            mouseEvent.ctrlKey = nativeEvent.ctrlKey;\n        }\n        if (nativeEvent.altKey) {\n            mouseEvent.altKey = nativeEvent.altKey;\n        }\n        if (nativeEvent.metaKey) {\n            mouseEvent.metaKey = nativeEvent.metaKey;\n        }\n\n        mouseEvent.stopPropagation = () => {\n            if (e.stopPropagation) {\n                e.stopPropagation();\n            }\n        };\n\n        mouseEvent.preventDefault = () => {\n            if (e.preventDefault) {\n                e.preventDefault();\n            }\n        };\n\n        return mouseEvent;\n    }\n\n    toDragEvent(e: Types.SyntheticEvent): Types.DragEvent {\n        const dndEvent: any = this.toMouseEvent(e);\n        dndEvent.dataTransfer = e.nativeEvent.dataTransfer;\n        return dndEvent;\n    }\n\n    isRightMouseButton(e: Types.SyntheticEvent): boolean {\n        return (EventHelpersCommon.toMouseButton(e.nativeEvent) === 2);\n    }\n\n    // Keyboard events do not inherently hold a position that can be used to show flyouts on keyboard input.\n    // We simulate a mouse event so that we can show things like context Menus in the correct position.\n    // Ensure offset is passed in {x = number, y= number} format. Using Top Left as anchor position.\n    keyboardToMouseEvent(e: Types.KeyboardEvent, layoutInfo: Types.LayoutInfo,\n            contextMenuOffset: { x: number; y: number }): Types.MouseEvent {\n        const mouseEvent = this.toMouseEvent(e);\n\n        if ((layoutInfo.x !== undefined) && (contextMenuOffset.x !== undefined)) {\n            mouseEvent.clientX = mouseEvent.pageX = layoutInfo.x + contextMenuOffset.x;\n        }\n\n        if ((layoutInfo.y !== undefined) && (contextMenuOffset.y !== undefined)) {\n            mouseEvent.clientY = mouseEvent.pageY = layoutInfo.y + contextMenuOffset.y;\n        }\n\n        return mouseEvent;\n    }\n}\n\nexport default new EventHelpers();\n"
  },
  {
    "path": "src/native-common/utils/lodashMini.ts",
    "content": "/**\n * lodashMini.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Import and re-export of part of the lodash module. This helps reduce bundle size.\n */\n\nimport clone = require('lodash/clone');\nimport compact = require('lodash/compact');\nimport extend = require('lodash/extend');\nimport filter = require('lodash/filter');\nimport findIndex = require('lodash/findIndex');\nimport findLast = require('lodash/findLast');\nimport isEqual = require('lodash/isEqual');\nimport isUndefined = require('lodash/isUndefined');\nimport last = require('lodash/last');\nimport map = require('lodash/map');\nimport max = require('lodash/max');\nimport omit = require('lodash/omit');\nimport union = require('lodash/union');\n\nexport {\n    clone,\n    compact,\n    extend,\n    filter,\n    findIndex,\n    findLast,\n    isEqual,\n    isUndefined,\n    last,\n    map,\n    max,\n    omit,\n    union,\n};\n"
  },
  {
    "path": "src/native-desktop/App.ts",
    "content": "/**\n * App.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Native desktop implementation of App API namespace.\n */\n\nimport { ComponentProvider } from 'react-native';\n\nimport { App as AppCommon } from '../native-common/App';\n\nimport { RootView, RootViewUsingProps } from './RootView';\n\nexport class App extends AppCommon {\n\n    protected getRootViewFactory(): ComponentProvider {\n        return () => RootView;\n    }\n\n    protected getRootViewUsingPropsFactory(): ComponentProvider {\n        return () => RootViewUsingProps;\n    }\n}\n\nexport default new App();\n"
  },
  {
    "path": "src/native-desktop/Input.ts",
    "content": "/**\n * Input.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Desktop implementation of Input interface.\n */\n\nimport { Input as InputCommon } from '../native-common/Input';\nimport { Types } from '../common/Interfaces';\n\nexport class Input extends InputCommon {\n    constructor() {\n        super();\n    }\n\n    dispatchKeyDown(e: Types.KeyboardEvent): void {\n        this.keyDownEvent.fire(e);\n    }\n\n    dispatchKeyUp(e: Types.KeyboardEvent): void {\n        if (this.keyUpEvent.fire(e)) {\n            e.stopPropagation();\n        }\n    }\n}\n\nexport default new Input();\n"
  },
  {
    "path": "src/native-desktop/RootView.tsx",
    "content": "/**\n * RootView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * The top-most view that's used for proper layering or modals and popups.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport FrontLayerViewManager from '../native-common/FrontLayerViewManager';\nimport {\n    BaseRootView,\n    BaseRootViewProps,\n    RootView as RootViewBase,\n    RootViewPropsWithMainViewType,\n    RootViewState,\n    RootViewUsingProps as RootViewUsingPropsBase,\n} from '../native-common/RootView';\nimport Timers from '../common/utils/Timers';\nimport UserInterface from '../native-common/UserInterface';\n\nimport FocusManager from './utils/FocusManager';\nimport Input from './Input';\n\nconst KEY_CODE_TAB = 9;\nconst KEY_CODE_ESC = 27;\n\nconst _styles = RN.StyleSheet.create({\n    appWrapperStyle: {\n        flex: 1,\n    },\n});\n\n//\n// Mixin with keyboard management behaviors. It enhances the two RootView flavors by adding:\n// 1. Support for maintaining UserInterface.keyboardNavigationEvent\n//   React Native doesn't offer a convenient mechanism to peek into keyboard/mouse events globally (the way\n// addEventListener achieves in the Web counterpart), so we rely on a spying view we render and/or more custom mechanisms.\n// 2. Redirection to Input.ts\n// 3. A place for the root FocusManager\ntype Constructor<T extends React.Component> = new (...args: any[]) => T;\n\nfunction applyDesktopBehaviorMixin<TRootViewBase extends Constructor<React.Component>>(RootViewBase: TRootViewBase) {\n    return class RootView extends RootViewBase implements React.ChildContextProvider<any> {\n        static childContextTypes: React.ValidationMap<any> = {\n            focusManager: PropTypes.object,\n        };\n\n        _focusManager: FocusManager;\n        _keyboardHandlerInstalled = false;\n        _isNavigatingWithKeyboardUpateTimer: number | undefined;\n\n        constructor(...args: any[]) {\n            super(...args);\n            // Initialize the root FocusManager which is aware of all\n            // focusable elements.\n            this._focusManager = new FocusManager(undefined);\n        }\n\n        _onTouchStartCapture = (e: RN.NativeSyntheticEvent<any>) => {\n            this._updateKeyboardNavigationState(false);\n        };\n\n        _onKeyDownCapture = (e: RN.NativeSyntheticEvent<any>) => {\n            const kbdEvent = EventHelpers.toKeyboardEvent(e);\n            if (kbdEvent.keyCode === KEY_CODE_TAB) {\n                this._updateKeyboardNavigationState(true);\n            }\n\n            if (kbdEvent.keyCode === KEY_CODE_ESC) {\n                // If Esc is pressed and the focused element stays the same after some time,\n                // switch the keyboard navigation off to dismiss the outline.\n                const activeComponent = FocusManager.getCurrentFocusedComponent();\n\n                if (this._isNavigatingWithKeyboardUpateTimer) {\n                    Timers.clearTimeout(this._isNavigatingWithKeyboardUpateTimer);\n                }\n\n                this._isNavigatingWithKeyboardUpateTimer = Timers.setTimeout(() => {\n                    this._isNavigatingWithKeyboardUpateTimer = undefined;\n\n                    if (activeComponent === FocusManager.getCurrentFocusedComponent()) {\n                        this._updateKeyboardNavigationState(false);\n                    }\n                }, 500);\n            }\n        };\n\n        _updateKeyboardNavigationState(isNavigatingWithKeyboard: boolean) {\n            if (this._isNavigatingWithKeyboardUpateTimer) {\n                Timers.clearTimeout(this._isNavigatingWithKeyboardUpateTimer);\n                this._isNavigatingWithKeyboardUpateTimer = undefined;\n            }\n\n            if (UserInterface.isNavigatingWithKeyboard() !== isNavigatingWithKeyboard) {\n                UserInterface.keyboardNavigationEvent.fire(isNavigatingWithKeyboard);\n            }\n        }\n\n        _onKeyDown = (e: RN.NativeSyntheticEvent<any>) => {\n            const kbdEvent = EventHelpers.toKeyboardEvent(e);\n            Input.dispatchKeyDown(kbdEvent);\n        };\n\n        _onKeyPress = (e: RN.NativeSyntheticEvent<any>) => {\n            const kbdEvent = EventHelpers.toKeyboardEvent(e);\n            // This is temporary fix while we still have both keyPress and keyDown\n            // events bubbling up for the same situation of user pressing down a key.\n            // TODO: consolidate key events #602\n            Input.dispatchKeyDown(kbdEvent);\n        };\n\n        _onKeyUp = (e: RN.NativeSyntheticEvent<any>) => {\n            const kbdEvent = EventHelpers.toKeyboardEvent(e);\n\n            const activePopupId = FrontLayerViewManager.getActivePopupId();\n            if (activePopupId && (kbdEvent.keyCode === KEY_CODE_ESC)) {\n                if (e.stopPropagation) {\n                    e.stopPropagation();\n                }\n                FrontLayerViewManager.dismissPopup(activePopupId);\n                return;\n            }\n\n            Input.dispatchKeyUp(kbdEvent);\n        };\n\n        getChildContext() {\n            // Provide the context with root FocusManager to all descendants.\n            return {\n                focusManager: this._focusManager,\n            };\n        }\n\n        renderTopView(content: JSX.Element): JSX.Element {\n            //\n            // As a default implementation we use a regular RN.View to intercept keyboard/touches.\n            // this is not perfect since the keyboard events are not standardized in RN.\n            // Per platform specializations may provide a better way\n            //\n\n            // Using \"any\" since onKeyDown/onKeyUp/etc. are not defined at RN.View property level\n            // Yet the handlers are called as part of capturing/bubbling events for/from children.\n            const internalProps: any = {\n                onKeyDown: this._onKeyDown,\n                onKeyPress: this._onKeyPress,\n                onKeyDownCapture: this._onKeyDownCapture,\n                onKeyUp: this._onKeyUp,\n                onTouchStartCapture: this._onTouchStartCapture,\n                collapsable: false,\n            };\n\n            return  (\n                <RN.View\n                    { ...internalProps }\n                    style={ _styles.appWrapperStyle }\n                >\n                    { content }\n                </RN.View>\n            );\n        }\n    };\n}\n\nconst RootViewUsingStore = applyDesktopBehaviorMixin(RootViewBase);\nconst RootViewUsingProps = applyDesktopBehaviorMixin(RootViewUsingPropsBase);\n\nexport {\n    BaseRootViewProps,\n    RootViewPropsWithMainViewType,\n    RootViewState,\n    BaseRootView,\n    RootViewUsingStore as RootView,\n    RootViewUsingProps,\n};\n\nexport default RootViewUsingStore;\n"
  },
  {
    "path": "src/native-desktop/ScrollView.tsx",
    "content": "/**\n * ScrollView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Windows/OSX-specific implementation of the cross-platform ScrollView abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport { ScrollView as ScrollViewBase } from '../native-common/ScrollView';\n\ntype ScrollViewProps = RN.ScrollViewProps & React.Props<RN.ScrollView>;\n\nconst isNativeWindows = RN.Platform.OS === 'windows';\n\nexport class ScrollView extends ScrollViewBase {\n    protected _render(nativeProps: ScrollViewProps): JSX.Element {\n        // Have to hack the windows/osx-specific onKeyDown into the props here.\n        const updatedNativeProps: RN.ExtendedDesktopScrollViewProps = nativeProps;\n        if (this.props.onKeyPress) {\n            updatedNativeProps.onKeyDown = this._onKeyDown;\n        }\n\n        if (isNativeWindows) {\n            updatedNativeProps.tabNavigation = this.props.tabNavigation;\n            updatedNativeProps.disableKeyboardBasedScrolling = true;\n        }\n\n        return super._render(updatedNativeProps);\n    }\n\n    private _onKeyDown = (e: React.SyntheticEvent<any>) => {\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(EventHelpers.toKeyboardEvent(e));\n        }\n    };\n}\n\nexport default ScrollView;\n"
  },
  {
    "path": "src/native-desktop/utils/FocusManager.ts",
    "content": "/**\n * FocusManager.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Manages focusable elements for better keyboard navigation (RN desktop version)\n */\n\nimport { ImportantForAccessibilityValue } from '../../native-common/AccessibilityUtil';\nimport AppConfig from '../../common/AppConfig';\nimport {\n    applyFocusableComponentMixin as applyFocusableComponentMixinBase,\n    FocusableComponentInternal as FocusableComponentInternalBase,\n    FocusableComponentStateCallback,\n    FocusManager as FocusManagerBase,\n    StoredFocusableComponent as StoredFocusableComponentBase,\n} from '../../common/utils/FocusManager';\nimport Platform from '../../native-common/Platform';\nimport Timers from '../../common/utils/Timers';\nimport UserInterface from '../../native-common/UserInterface';\n\nconst isNativeWindows: boolean = Platform.getType() === 'windows';\n\nexport { FocusableComponentStateCallback };\n\nexport enum OverrideType {\n    // No overriding is active (the falsy value)\n    None = 0,\n    // tabIndex overriding is active\n    Accessible = 1,\n    // Both tabIndex and importantForAccessibility are overriden\n    Limited = 2\n}\n\nexport interface StoredFocusableComponent extends StoredFocusableComponentBase {\n    curOverrideType?:  OverrideType;\n}\n\nexport interface FocusManagerFocusableComponent {\n    getTabIndex(): number | undefined;\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined;\n    onFocus(): void;\n    focus(): void;\n    updateNativeAccessibilityProps(): void;\n}\n\nexport interface FocusableComponentInternal extends FocusManagerFocusableComponent, FocusableComponentInternalBase {\n    tabIndexOverride?: number;\n    tabIndexLocalOverride?: number;\n    tabIndexLocalOverrideTimer?: number;\n    importantForAccessibilityOverride? : string;\n    onFocusSink?: () => void;\n}\n\nexport class FocusManager extends FocusManagerBase {\n\n    constructor(parent: FocusManager | undefined) {\n        super(parent);\n    }\n\n    protected /* static */ addFocusListenerOnComponent(component: FocusableComponentInternal, onFocus: () => void): void {\n        // We intercept the \"onFocus\" all the focusable elements have to have\n        component.onFocusSink = onFocus;\n    }\n\n    protected /* static */ removeFocusListenerFromComponent(component: FocusableComponentInternal, onFocus: () => void): void {\n        delete  component.onFocusSink;\n    }\n\n    protected /* static */ focusComponent(component: FocusableComponentInternal): boolean {\n        if (component && component.focus) {\n            component.focus();\n            return true;\n        }\n        return false;\n    }\n\n    private static _focusFirst(): void {\n        const focusable = Object.keys(FocusManager._allFocusableComponents)\n            .map(componentId => FocusManager._allFocusableComponents[componentId])\n            .filter(storedComponent =>\n                !storedComponent.accessibleOnly &&\n                !storedComponent.removed &&\n                !storedComponent.restricted &&\n                !storedComponent.limitedCount &&\n                !storedComponent.limitedCountAccessible &&\n                ((storedComponent.component.props.tabIndex || 0) >= 0));\n\n        if (focusable.length) {\n            focusable.sort((a, b) => {\n                // This function does its best, but contrary to DOM-land we have no idea on where the native components\n                // ended up on screen, unless some expensive measuring is done on them.\n                // So we defer to less than optimal \"add focusable component\" order. A lot of factors (absolute positioning,\n                // instance replacements, etc.) can alter the correctness of this method, but I see no other way.\n                if (a === b) {\n                    return 0;\n                }\n\n                if (a.numericId < b.numericId) {\n                    return -1;\n                } else {\n                    return 1;\n                }\n            });\n\n            const fc = focusable[0].component as FocusableComponentInternal;\n\n            if (fc && fc.focus) {\n                fc.focus();\n            }\n        }\n    }\n\n    protected /* static */ resetFocus(focusFirstWhenNavigatingWithKeyboard: boolean): void {\n        if (FocusManager._resetFocusTimer) {\n            Timers.clearTimeout(FocusManager._resetFocusTimer);\n            FocusManager._resetFocusTimer = undefined;\n        }\n\n        if (UserInterface.isNavigatingWithKeyboard() && focusFirstWhenNavigatingWithKeyboard) {\n            // When we're in the keyboard navigation mode, we want to have the\n            // first focusable component to be focused straight away, without the\n            // necessity to press Tab.\n            // Defer the focusing to let the view finish its initialization and to allow for manual focus setting (if any)\n            // to be processed (the asynchronous nature of focus->onFocus path requires a delay)\n            FocusManager._resetFocusTimer = Timers.setTimeout(() => {\n                FocusManager._resetFocusTimer = undefined;\n\n                // Check if the currently focused component is without limit/restriction.\n                // We skip setting focus on \"first\" component in that case because:\n                // - focusFirst has its limits, to say it gently\n                // - We ended up in resetFocus for a reason that is not true anymore (mostly because focus was set manually)\n                const storedComponent = FocusManager._currentFocusedComponent;\n                if (!storedComponent ||\n                    storedComponent.accessibleOnly ||\n                    storedComponent.removed ||\n                    storedComponent.restricted ||\n                    (storedComponent.limitedCount > 0) ||\n                    (storedComponent.limitedCountAccessible > 0)) {\n                    FocusManager._focusFirst();\n                }\n            }, 500);\n        }\n    }\n\n    protected /* static */ _updateComponentFocusRestriction(storedComponent: StoredFocusableComponent): void {\n\n        let newOverrideType: OverrideType = OverrideType.None;\n        if (storedComponent.restricted || (storedComponent.limitedCount > 0)) {\n            newOverrideType = OverrideType.Limited;\n        } else if (storedComponent.limitedCountAccessible > 0) {\n            newOverrideType = OverrideType.Accessible;\n        }\n\n        const curOverrideType: OverrideType = storedComponent.curOverrideType || OverrideType.None;\n\n        if (newOverrideType !== curOverrideType) {\n            FocusManager._updateComponentTabIndexAndIFAOverrides(storedComponent.component as FocusableComponentInternal,\n                newOverrideType !== OverrideType.None,\n                newOverrideType ===  OverrideType.Limited);\n\n            if (newOverrideType !== OverrideType.None) {\n                storedComponent.curOverrideType = newOverrideType;\n                FocusManager._callFocusableComponentStateChangeCallbacks(storedComponent, true);\n            } else {\n                delete storedComponent.curOverrideType;\n                FocusManager._callFocusableComponentStateChangeCallbacks(storedComponent, false);\n            }\n        }\n    }\n\n    private static _updateComponentTabIndexAndIFAOverrides(component: FocusableComponentInternal,\n            tabIndexOverride: boolean, accessibleOverride: boolean): void {\n\n        if (tabIndexOverride) {\n            component.tabIndexOverride = -1;\n        } else {\n            delete component.tabIndexOverride;\n        }\n\n        if (accessibleOverride) {\n            component.importantForAccessibilityOverride = 'no-hide-descendants';\n        } else {\n            delete component.importantForAccessibilityOverride;\n        }\n\n        // Refresh the native view\n        updateNativeAccessibilityProps(component);\n    }\n}\n\nfunction updateNativeAccessibilityProps(component: FocusableComponentInternal): void {\n    // Call special method on component avoiding state changes/re-renderings\n    if (component.updateNativeAccessibilityProps) {\n        component.updateNativeAccessibilityProps();\n    } else {\n        if (AppConfig.isDevelopmentMode()) {\n            console.error('FocusableComponentMixin: updateNativeAccessibilityProps doesn\\'t exist!');\n        }\n    }\n}\n\nexport function applyFocusableComponentMixin(Component: any, isConditionallyFocusable?: Function, accessibleOnly = false): void {\n    // Call base\n    // This adds the basic \"monitor focusable components\" functionality.\n    applyFocusableComponentMixinBase(Component, isConditionallyFocusable, accessibleOnly);\n\n    // Hook 'getImportantForAccessibility'\n    inheritMethod('getImportantForAccessibility', function(this: FocusableComponentInternal, origCallback: any) {\n        // Check local override first, then focus manager one\n        if (this.importantForAccessibilityOverride !== undefined) {\n            // Local override available, use this one\n            return this.importantForAccessibilityOverride;\n        } else {\n            // Override not available, defer to original handler to return the prop\n            return origCallback.call(this);\n        }\n    });\n\n    if (!accessibleOnly) {\n        // Hook 'onFocus'\n        inheritMethod('onFocus', function(this: FocusableComponentInternal, origCallback: Function) {\n            if (this.onFocusSink) {\n                this.onFocusSink();\n            } else {\n                if (AppConfig.isDevelopmentMode()) {\n                    console.error('FocusableComponentMixin: onFocusSink doesn\\'t exist!');\n                }\n            }\n\n            origCallback.call(this);\n        });\n\n        // Hook 'getTabIndex'\n        inheritMethod('getTabIndex', function(this: FocusableComponentInternal, origCallback: any) {\n            // Check local override first, then focus manager one\n            if (this.tabIndexLocalOverride !== undefined) {\n                // Local override available, use this one\n                return this.tabIndexLocalOverride;\n            } else if (this.tabIndexOverride !== undefined) {\n                // Override available, use this one\n                return this.tabIndexOverride;\n            } else {\n                // Override not available, defer to original handler to return the prop\n                return origCallback.call(this);\n            }\n        });\n\n        if (isNativeWindows) {\n            // UWP platform (at least) is slightly stricter with regard to tabIndex combinations.\n            // The \"component focusable but not in tab order\" case (usually encoded with tabIndex<0 for browsers) is not supported.\n            // A negative tabIndex disables focusing/keyboard input completely instead (though a component already having keyboard focus\n            // doesn't lose it right away).\n            // We try to simulate the right behavior through a trick.\n            inheritMethod('focus', function(this: FocusableComponentInternal, origCallback: any) {\n                const tabIndex: number | undefined = this.getTabIndex();\n                // Check effective tabIndex\n                if (tabIndex !== undefined && tabIndex < 0) {\n                    // A negative tabIndex maps to non focusable in UWP.\n                    // We temporary apply a local override of \"tabIndex=0\", and then forward the focus command.\n                    // A timer makes sure the tabIndex returns back to \"non-overriden\" state.\n                    // - If the component is not under FocusManager control (a View with tabIndex===-1, for ex.), the only action\n                    // available for user is to tab out.\n                    // - If the component is under FocusManager control, the \"tabIndex===-1\" is usually due to a limit imposed on\n                    // the component, and that limit is usually removed when component acquires focus. If not, the user has again\n                    // one only choice left: to tab out.\n                    // A more accurate solution would require tracking onBlur and other state.\n                    this.tabIndexLocalOverride = 0;\n\n                    // Refresh the native view\n                    updateNativeAccessibilityProps(this);\n\n                    this.tabIndexLocalOverrideTimer = Timers.setTimeout(() => {\n                        if (this.tabIndexLocalOverrideTimer !== undefined) {\n                            this.tabIndexLocalOverrideTimer = undefined;\n                            // Remove override\n                            delete this.tabIndexLocalOverride;\n\n                            // Refresh the native view\n                            updateNativeAccessibilityProps(this);\n                        }\n                    }, 500);\n                }\n\n                // To original\n                return origCallback.call(this);\n            });\n\n            inheritMethod('componentWillUnmount', function(this: FocusableComponentInternal, origCallback: any) {\n                // Reset any pending local override timer\n                delete this.tabIndexLocalOverrideTimer;\n                // To original (base mixin already has an implementation)\n                return origCallback.call(this);\n            });\n        }\n    }\n\n    function inheritMethod(methodName: string, action: Function): void {\n        const origCallback = Component.prototype[methodName];\n\n        if (origCallback) {\n            Component.prototype[methodName] = function() {\n                return action.call(this, origCallback, arguments);\n            };\n        } else {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('FocusableComponentMixin: ' + methodName + ' is expected to exist and it doesn\\'t!');\n            }\n        }\n    }\n}\n\nexport default FocusManager;\n"
  },
  {
    "path": "src/tslint/groupedImportRule.ts",
    "content": "/**\n* groupedImportRule.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Custom tslint rule used to ensure we don't group ambient (non-relative)\n* module imports with relative module imports.\n*\n* To enable, include the following line in tslint.json:\n*   \"grouped-import\": true\n*/\n\nimport { RuleFailure, Rules, RuleWalker } from 'tslint';\nimport * as tsutils from 'tsutils';\nimport * as ts from 'typescript';\n\nconst FAILURE_STRING_PART = 'Ambient and relative imports must be separated';\n\nexport class Rule extends Rules.AbstractRule {\n    apply(sourceFile: ts.SourceFile): RuleFailure[] {\n        const options = this.getOptions();\n        const banModuleWalker = new GroupedImportModuleWalker(sourceFile, options);\n        return this.applyWithWalker(banModuleWalker);\n    }\n}\n\nenum ImportType {\n    None,\n    Relative,\n    Ambient\n}\n\nclass GroupedImportModuleWalker extends RuleWalker {\n    private _inImportGroup = false;\n    private _lastImportType = ImportType.None;\n\n    visitNode(node: ts.Node): void {\n        if (tsutils.isImportDeclaration(node) || tsutils.isImportEqualsDeclaration(node)) {\n            // If last line was linebreak, we're in a new block.\n            const prevStatement = tsutils.getPreviousStatement(node);\n            const prevLineNum = prevStatement ? ts.getLineAndCharacterOfPosition(this.getSourceFile(), prevStatement.end).line : -1;\n            const currentLineNum = ts.getLineAndCharacterOfPosition(this.getSourceFile(), node.end).line;\n            if (prevLineNum !== -1 && prevLineNum < currentLineNum - 1) {\n                this._lastImportType = ImportType.None;\n                this._inImportGroup = false;\n            }\n\n            const wasInImportGroup = this._inImportGroup;\n            this._inImportGroup = true;\n            const importType = this._checkImportType(node);\n            if (wasInImportGroup && importType !== this._lastImportType) {\n                this.addFailure(this.createFailure(node.getStart(), node.getWidth(), FAILURE_STRING_PART));\n            }\n            this._lastImportType = importType;\n        } else {\n            this._inImportGroup = false;\n            this._lastImportType = ImportType.None;\n            super.visitNode(node);\n        }\n    }\n\n    private _checkImportType(node: ts.ImportEqualsDeclaration | ts.ImportDeclaration): ImportType {\n        let modulePath: string | undefined;\n        if (tsutils.isImportEqualsDeclaration(node)) {\n            if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {\n                const matches = node.moduleReference.getFullText().match(/require\\s*\\(\\s*'([^']+)'\\s*\\)/);\n                if (matches && matches.length === 2) {\n                    modulePath = matches[1];\n                } else {\n                    console.log('Unknown Missed Regex: ' + node.moduleReference.kind + '/' + node.moduleReference.getFullText());\n                }\n            }\n        }\n\n        if (tsutils.isImportDeclaration(node)) {\n            modulePath = node.moduleSpecifier.getText().replace(/'/g, '');\n        }\n\n        if (modulePath) {\n            // Assume that \"@\" is a shortcut for a relative path.\n            if (modulePath[0] === '.' || modulePath[0] === '@') {\n                return ImportType.Relative;\n            } else {\n                return ImportType.Ambient;\n            }\n        }\n\n        return ImportType.None;\n    }\n}\n"
  },
  {
    "path": "src/tslint/incorrectThisPropsRule.ts",
    "content": "﻿/**\n* incorrectThisPropsRule.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Custom tslint rule used to find cases where the code references\n* this.props rather than props in the _buildState method and other\n* methods that take an input parameter called \"props\".\n*\n* To enable, add the following line to your tslint.json file:\n*       \"incorrect-this-props\": true\n*/\n\nimport * as _ from 'lodash';\nimport { RuleFailure, Rules, RuleWalker } from 'tslint';\nimport * as ts from 'typescript';\n\nconst THIS_PROPS_REFERENCED = '\"this.props\" referenced within method that takes \"props\" input parameter.' +\n    ' In most cases this is a mistake and you want to use \"props\",' +\n    ' if you are sure you need this.props - use \"const oldProps = this.props;\"';\nconst THIS_PROPS = 'this.props';\nconst ALLOWED_OLD_PROPS = 'oldProps = ' + THIS_PROPS;\n\nexport class Rule extends Rules.AbstractRule {\n    apply(sourceFile: ts.SourceFile): RuleFailure[] {\n        const options = this.getOptions();\n        const thisPropsWalker = new ThisPropsWalker(sourceFile, options);\n        return this.applyWithWalker(thisPropsWalker);\n    }\n}\n\nclass ThisPropsWalker extends RuleWalker {\n    walk(node: ts.Node): void {\n        super.walk(node);\n    }\n\n    visitMethodDeclaration(node: ts.MethodDeclaration): void {\n        const hasPropsParam = _.find(node.parameters, param => {\n            const paramNameIdentifier = param.name as ts.Identifier;\n            return (paramNameIdentifier && paramNameIdentifier.text === 'props');\n        });\n\n        if (hasPropsParam) {\n            const methodText = node.getText();\n            let searchOffset = 0;\n\n            while (true) {\n                const foundOffset = methodText.indexOf(THIS_PROPS, searchOffset);\n                if (foundOffset < 0 || foundOffset >= methodText.length) {\n                    break;\n                }\n\n                // See if this is an allowed case ('oldProps = this.props').\n                const allowedOffset = foundOffset + THIS_PROPS.length - ALLOWED_OLD_PROPS.length;\n                if (allowedOffset >= 0 && methodText.indexOf(ALLOWED_OLD_PROPS, allowedOffset) === allowedOffset) {\n                    searchOffset = foundOffset + THIS_PROPS.length;\n                    continue;\n                }\n\n                // We found a disallowed instance of 'this.props' within a method that has\n                // a 'props' input parameter. Flag it as an error.\n                this.addFailure(this.createFailure(node.name.getStart() + foundOffset,\n                    THIS_PROPS.length, THIS_PROPS_REFERENCED));\n                searchOffset = foundOffset + THIS_PROPS.length;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/tslint/noUnreferencedStylesRule.ts",
    "content": "/**\n* noUnreferencedStylesRule.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Custom tslint rule used to enforce that there are no unfreferenced\n* entries in a static array named \"_styles\".\n*\n* To enable this rule, add the following line to your tslint.json:\n*   \"no-unreferenced-styles\": true\n*/\n\nimport * as _ from 'lodash';\nimport { RuleFailure, Rules, RuleWalker } from 'tslint';\nimport * as ts from 'typescript';\n\nconst STYLES_NOT_CONST = 'Styles array is not marked const';\nconst STYLE_NOT_REFERENCED = 'Unreferenced style ';\n\nexport class Rule extends Rules.AbstractRule {\n    apply(sourceFile: ts.SourceFile): RuleFailure[] {\n        const options = this.getOptions();\n        const stylesWalker = new StylesWalker(sourceFile, options);\n        return this.applyWithWalker(stylesWalker);\n    }\n}\n\ninterface StyleInfo {\n    isReferenced: boolean;\n    start: number;\n    width: number;\n}\n\nclass StylesWalker extends RuleWalker {\n    private _definedStyles: { [name: string]: StyleInfo } = {};\n\n    walk(node: ts.Node): void {\n        super.walk(node);\n\n        this._reportUnreferencedStyles();\n    }\n\n    visitVariableDeclaration(node: ts.VariableDeclaration): void {\n        // Is this a _styles node?\n        if (node.name.getText() === '_styles' && node.initializer) {\n            const nodeFlags = ts.getCombinedNodeFlags(node);\n\n            // All styles should be const.\n            if ((nodeFlags & ts.NodeFlags.Const) === 0) {\n                this.addFailure(this.createFailure(node.getStart(), node.getWidth(), STYLES_NOT_CONST));\n            }\n\n            // Add known styles recursively.\n            this._addKnownStyles(node.initializer, '_styles.');\n        }\n    }\n\n    private _addKnownStyles(node: ts.Node, prefix: string): boolean {\n        let hasChildren = false;\n\n        if (node.kind === ts.SyntaxKind.ObjectLiteralExpression) {\n            const objLiteral = node as ts.ObjectLiteralExpression;\n\n            if (objLiteral.properties) {\n                _.each(objLiteral.properties, property => {\n                    const nodeName = prefix + property.name!.getText();\n\n                    // Recurse to pick up any nested style types.\n                    const children = property.getChildren();\n                    let childHasChildren = false;\n                    _.each(children, child => {\n                        if (this._addKnownStyles(child, nodeName + '.')) {\n                            childHasChildren = true;\n                        }\n                    });\n\n                    // Don't add the node if it's just a container for\n                    // other styles.\n                    if (!childHasChildren) {\n                        this._definedStyles[nodeName] = {\n                            isReferenced: false,\n                            start: property.getStart(),\n                            width: property.getWidth(),\n                        };\n                    }\n\n                    hasChildren = true;\n                });\n            }\n        }\n\n        return hasChildren;\n    }\n\n    visitFunctionDeclaration(node: ts.FunctionDeclaration): void {\n        this._markReferencedStyles(node.getText());\n    }\n\n    visitConstructorDeclaration(node: ts.ConstructorDeclaration): void {\n        this._markReferencedStyles(node.getText());\n    }\n\n    visitMethodDeclaration(node: ts.MethodDeclaration): void {\n        this._markReferencedStyles(node.getText());\n    }\n\n    visitArrowFunction(node: ts.FunctionLikeDeclaration): void {\n        this._markReferencedStyles(node.getText());\n    }\n\n    visitPropertyDeclaration(node: ts.PropertyDeclaration): void {\n        this._markReferencedStyles(node.getText());\n    }\n\n    private _markReferencedStyles(functionText: string): void {\n        const stylesRegEx = /_styles\\.[_.a-zA-Z0-9]+/g;\n        const matches = functionText.match(stylesRegEx);\n\n        if (matches) {\n            _.each(matches, match => {\n                // Note that this style has been referenced.\n                if (this._definedStyles[match] !== undefined) {\n                    this._definedStyles[match].isReferenced = true;\n                }\n            });\n        }\n    }\n\n    private _reportUnreferencedStyles(): void {\n        _.each(this._definedStyles, (styleInfo, styleName) => {\n            if (!styleInfo.isReferenced) {\n                this.addFailure(this.createFailure(styleInfo.start, styleInfo.width,\n                    STYLE_NOT_REFERENCED + styleName));\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/typings/prop-types.d.ts",
    "content": "declare module 'prop-types' {\n    // Type definitions for prop-types 15.5\n    // Project: https://github.com/reactjs/prop-types\n    // Definitions by: DovydasNavickas <https://github.com/DovydasNavickas>\n    // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped\n    // TypeScript Version: 2.2\n\n    export type Validator<T> = (object: T, key: string, componentName: string, ...rest: any[]) => Error | null;\n\n    // psegalen: modified original declaration because of\n    // \"error TS2312: An interface may only extend a class or another interface.\"\n    export interface Requireable<T> {\n        isRequired: Validator<T>;\n    }\n\n    export type ValidationMap<T> = {[K in keyof T]?: Validator<T> };\n\n    export const any: Requireable<any> & Validator<any>;\n    export const array: Requireable<any> & Validator<any>;\n    export const bool: Requireable<any> & Validator<any>;\n    export const func: Requireable<any> & Validator<any>;\n    export const number: Requireable<any> & Validator<any>;\n    export const object: Requireable<any> & Validator<any>;\n    export const string: Requireable<any> & Validator<any>;\n    export const node: Requireable<any> & Validator<any>;\n    export const element: Requireable<any> & Validator<any>;\n    export function instanceOf(expectedClass: {}): Requireable<any> & Validator<any>;\n    export function oneOf(types: any[]): Requireable<any> & Validator<any>;\n    export function oneOfType(types: Validator<any>[]): Requireable<any> & Validator<any>;\n    export function arrayOf(type: Validator<any>): Requireable<any> & Validator<any>;\n    export function objectOf(type: Validator<any>): Requireable<any> & Validator<any>;\n    export function shape(type: ValidationMap<any>): Requireable<any> & Validator<any>;\n}\n"
  },
  {
    "path": "src/typings/react-native-extensions.d.ts",
    "content": "/**\n * react-native-extensions.d.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definition file that extends the public React Native type definition file.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RNW from 'react-native-windows';\n\ndeclare module 'react-native' {\n    interface ExtendedViewProps extends RN.ViewProps {\n        onMouseEnter?: (e: RN.NativeSyntheticEvent) => void;\n        onMouseLeave?: (e: RN.NativeSyntheticEvent) => void;\n        onAccessibilityTapIOS?: (e: RN.NativeSyntheticEvent) => void;\n        tooltip?: string;\n        onFocus?: (e: RN.NativeSyntheticEvent) => void;\n        onBlur?: (e: RN.NativeSyntheticEvent) => void;\n        onKeyPress?: (e: RN.NativeSyntheticEvent) => void;\n    }\n\n    interface ExtendedTextProps extends RN.TextProps, RNW.TextWindowsProps {\n        disableContextMenu?: boolean;\n        tooltip?: string;\n    }\n\n    interface ExtendedTextInputProps extends RN.TextInputProps {\n        onPaste?: (e: RN.NativeSyntheticEvent) => void;\n        tabIndex?: number;\n    }\n\n    interface ExtendedDesktopScrollViewProps extends RN.ScrollViewProps, React.Props<RN.ScrollView> {\n        onKeyDown?: (e: React.SyntheticEvent) => void;\n        // Windows-only props\n        tabNavigation?: 'local' | 'cycle' | 'once';\n        disableKeyboardBasedScrolling?: true;\n    }\n\n    interface ExtendedImageProps extends RN.ImageProps {\n        tooltip?: string;\n    }\n\n    interface RtlEventNativePayload {\n        isRTL:  boolean;\n    }\n\n    abstract class ReactNativeBaseComponent<P, S> extends React.Component<P, S> {\n        setNativeProps(nativeProps: P): void;\n        focus(): void;\n        blur(): void;\n        measure(callback: ((x: number, y: number, width: number, height: number, pageX: number, pageY: number) => void)): void;\n        measureLayout(\n            relativeToNativeNode: number,\n            onSuccess: ((x: number, y: number, width: number, height: number, pageX: number, pageY: number) => void),\n            onFail: () => void\n        ): void;\n        refs: {\n            [key: string]: ReactNativeBaseComponent<any, any>;\n        };\n    }\n\n    module Touchable {\n        interface RectOffset {\n            top: number;\n            left: number;\n            right: number;\n            bottom: number;\n        }\n\n        interface State {\n            touchable: any;\n        }\n\n        interface TouchableMixin extends React.Mixin<any, any> {\n            touchableGetInitialState: () => State;\n            touchableHandleStartShouldSetResponder: () => {};\n            touchableHandleResponderTerminationRequest: () => {};\n            touchableHandleResponderGrant: (e: React.SyntheticEvent<any>, dispatchID: string) => {};\n            touchableHandleResponderMove: (e: React.SyntheticEvent<any>) => {};\n            touchableHandleResponderRelease: (e: React.SyntheticEvent<any>) => {};\n            touchableHandleResponderTerminate: (e: React.SyntheticEvent<any>) => {};\n            touchableHandleActivePressIn?: (e: React.SyntheticEvent<any>) => {};\n            touchableHandleActivePressOut?: (e: React.SyntheticEvent<any>) => {};\n            touchableHandlePress?: (e: React.SyntheticEvent<any>) => {};\n            touchableHandleLongPress?: (e: React.SyntheticEvent<any>) => {};\n            touchableGetHighlightDelayMS?: () => number;\n            touchableGetPressRectOffset?: () => RectOffset;\n        }\n\n        let Mixin: TouchableMixin;\n    }\n\n    interface ExtendedAccessibilityInfoStatic extends RN.AccessibilityInfoStatic {\n        static initialHighContrast: boolean|undefined;\n    }\n\n    interface ExtendedAlertOptions extends RN.AlertOptions {\n        rootViewHint?: number;\n    }\n\n    // Private interfaces adapted from react-native.d.ts related to Animated.event\n    type EventMapping = { [key: string]: Mapping } | AnimatedValue;\n    type ValueListenerCallback = (state: { value: number }) => void;\n    interface AnimatedEventConfig<T> {\n        listener?: (event: RN.NativeSyntheticEvent<T>) => void;\n        useNativeDriver?: boolean;\n    }\n}\n"
  },
  {
    "path": "src/typings/react-native-windows.d.ts",
    "content": "/**\n * react-native-windows.d.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Type definition file for React Native Windows only components and modules\n * Definitions for extensions pertaining to existing React Native components are merged into the reaxt-native.d.ts file.\n */\n\ndeclare module 'react-native-windows' {\n    import * as React from 'react';\n    import * as RN from 'react-native';\n\n    interface TextWindowsSelectionChangeEventData {\n        selectedText: string;\n    }\n\n    interface TextWindowsProps {\n        children?: React.ReactNode;\n        onSelectionChange?: (e: RN.NativeSyntheticEvent<TextWindowsSelectionChangeEventData>) => void;\n    }\n\n    interface AccessibilityEvents {\n        onAccessibilityTap?: (e: RN.NativeSyntheticEvent<any>) => void;\n    }\n\n    interface ViewProps {\n        tabNavigation?: 'cycle' | 'local';\n    }\n\n    //\n    // Focusable view related declarations\n    // ----------------------------------------------------------------------\n    type FocusableWindowsProps<P = {}> = P & {\n        ref?: (current: any) => void;\n        isTabStop?: boolean;\n        tabIndex?: number;\n        tabNavigation?: 'local' | 'cycle' | 'once';\n        disableSystemFocusVisuals?: boolean;\n        onFocus?: Function;\n        onBlur?: Function;\n        handledKeyDownKeys?: number[];\n        handledKeyUpKeys?: number[];\n        onKeyDown?: Function;\n        onKeyUp?: Function;\n        componentRef?: Function;\n    };\n\n    interface FocusableWindows<P> extends RN.ReactNativeBaseComponent<FocusableWindowsProps<P>, {}>{\n        focus(): void;\n        blur(): void;\n    }\n\n    type FocusableComponentConstructor<P> = new() => FocusableWindows<P>;\n\n    function createFocusableComponent<P>(Component: any): FocusableComponentConstructor<P>;\n\n    type HyperlinkWindowsProps = RN.TextProps & {\n        onFocus?: Function;\n        onBlur?: Function;\n    };\n\n    class HyperlinkWindows extends RN.ReactNativeBaseComponent<HyperlinkWindowsProps, {}> {\n        focus(): void;\n        blur(): void;\n    }\n\n    type RootInputViewWindowsProps = RN.ViewProps & {\n        onAccelKeyDown?: Function;\n        onAccelKeyUp?: Function;\n        onTouchStartCapture?: Function;\n    };\n\n    class RootInputViewWindows extends RN.ReactNativeBaseComponent<RootInputViewWindowsProps, {}> {}\n}\n"
  },
  {
    "path": "src/typings/rebound.d.ts",
    "content": "﻿declare module 'rebound' {\n    class SpringSystem {\n        createSpring(): any;\n    }\n}\n"
  },
  {
    "path": "src/typings/window.d.ts",
    "content": "\ninterface Window {\n    // Allow us to put arbitrary objects in window\n    [key: string]: any;\n}\n"
  },
  {
    "path": "src/web/Accessibility.ts",
    "content": "/**\n * Accessibility.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web wrapper for subscribing or querying the current state of the\n * screen reader.\n */\n\nimport { Accessibility as CommonAccessibility } from '../common/Accessibility';\n\nexport class Accessibility extends CommonAccessibility {\n    // Calling this API on web has no effect.\n    isScreenReaderEnabled(): boolean {\n        return false;\n    }\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/web/AccessibilityAnnouncer.tsx",
    "content": "/**\n * AccessibilityAnnouncer.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Implements the behavior for announcing text to screen readers, using aria-live regions.\n */\n\nimport * as React from 'react';\nimport { SubscriptionToken } from 'subscribableevent';\n\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport Accessibility from './Accessibility';\nimport AccessibilityUtil from './AccessibilityUtil';\nimport Styles from './Styles';\n\nexport interface AccessibilityAnnouncerState {\n    // Screen Reader text to be announced.\n    announcementText: string;\n\n    // Render announcementText in a nested div to work around browser quirks for windows.\n    // Nested divs break mac.\n    announcementTextInNestedDiv: boolean;\n}\n\nconst _isMac = (typeof navigator !== 'undefined') && (typeof navigator.platform === 'string') && (navigator.platform.indexOf('Mac') >= 0);\n\nconst _styles = {\n    liveRegionContainer: Styles.combine({\n        position: 'absolute',\n        overflow: 'hidden',\n        opacity: 0,\n        top: -30,\n        bottom: 0,\n        left: 0,\n        right: 0,\n        height: 30,\n        whiteSpace: 'pre',\n    }),\n};\n\nexport class AccessibilityAnnouncer extends React.Component<{}, AccessibilityAnnouncerState> {\n    private _clearAnnouncementTimer: number | undefined;\n    private _newAnnouncementEventChangedSubscription: SubscriptionToken | undefined;\n\n    constructor(props: {}) {\n        super(props);\n\n        // Update announcement text.\n        this._newAnnouncementEventChangedSubscription =\n            Accessibility.newAnnouncementReadyEvent.subscribe(announcement => {\n                if (this.state.announcementText === announcement) {\n                    // If the previous announcement is the same as the current announcement\n                    // we will append a ' ' to it. This ensures that the text in DOM of aria-live region changes\n                    // and  will be read by screen Reader\n\n                    announcement += ' ';\n                }\n\n                if (_isMac) {\n                    // annnouncementText should never be in nested div for mac.\n                    // Voice over ignores reading nested divs in aria-live container.\n                    this.setState({\n                        announcementText: announcement,\n                    });\n                } else {\n\n                    // Additionally, alternate between announcement text directly under the aria-live element and\n                    // nested in a div to work around issues with some readers. NVDA on Windows is known to\n                    // not announce aria-live reliably without this, for example.\n                    this.setState({\n                        announcementText: announcement,\n                        announcementTextInNestedDiv: !this.state.announcementTextInNestedDiv,\n                    });\n                }\n            });\n\n        this.state = this._getInitialState();\n    }\n\n    private _getInitialState(): AccessibilityAnnouncerState {\n        return {\n            announcementText: '',\n            announcementTextInNestedDiv: false,\n        };\n    }\n\n    componentDidUpdate(prevProps: {}, prevState: AccessibilityAnnouncerState) {\n        // When a new announcement text is set in the live region, start a timer to clear the text from the div so that it can't be focused\n        // using a screen reader.\n        if (prevState.announcementText !== this.state.announcementText && this.state.announcementText) {\n            this._startClearAnnouncementTimer();\n        }\n    }\n\n    componentWillUnmount() {\n        if (this._newAnnouncementEventChangedSubscription) {\n            this._newAnnouncementEventChangedSubscription.unsubscribe();\n            this._newAnnouncementEventChangedSubscription = undefined;\n        }\n    }\n\n    render() {\n        const announcement: any = this.state.announcementTextInNestedDiv ?\n            ( <div> { this.state.announcementText } </div> ) :\n            this.state.announcementText;\n\n        return (\n            <div\n                style={ _styles.liveRegionContainer as any }\n                aria-live={ AccessibilityUtil.accessibilityLiveRegionToString(Types.AccessibilityLiveRegion.Assertive) }\n                aria-atomic={ 'true' }\n                aria-relevant={ 'additions text' }\n            >\n                { announcement }\n            </div>\n        );\n    }\n\n    private _cancelClearAnnouncementTimer() {\n        if (this._clearAnnouncementTimer) {\n            Timers.clearTimeout(this._clearAnnouncementTimer);\n            this._clearAnnouncementTimer = undefined;\n        }\n    }\n\n    private _startClearAnnouncementTimer() {\n        this._cancelClearAnnouncementTimer();\n\n        this._clearAnnouncementTimer = Timers.setTimeout(() => {\n            this.setState({\n                announcementText: '',\n            });\n        }, 2000);\n    }\n}\n\nexport default AccessibilityAnnouncer;\n"
  },
  {
    "path": "src/web/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of accessiblity functions for cross-platform\n * ReactXP framework.\n */\n\nimport { AccessibilityUtil as CommonAccessibiltiyUtil } from '../common/AccessibilityUtil';\nimport { Types } from '../common/Interfaces';\n\nimport * as _ from './utils/lodashMini';\n\n// Map of accessibility trait to an aria role attribute.\n// What's a role attribute? https://www.w3.org/wiki/PF/XTech/HTML5/RoleAttribute\nconst roleMap: { [key: string]: string } = {\n    [Types.AccessibilityTrait.None]: 'presentation',\n    [Types.AccessibilityTrait.Button]: 'button',\n    [Types.AccessibilityTrait.Link]: 'link',\n    [Types.AccessibilityTrait.Header]: 'heading',\n    [Types.AccessibilityTrait.Search]: 'search',\n    [Types.AccessibilityTrait.Image]: 'img',\n    [Types.AccessibilityTrait.Summary]: 'region',\n    [Types.AccessibilityTrait.Adjustable]: 'slider',\n    [Types.AccessibilityTrait.Menu]: 'menu',\n    [Types.AccessibilityTrait.MenuItem]: 'menuitem',\n    [Types.AccessibilityTrait.MenuBar]: 'menubar',\n    [Types.AccessibilityTrait.Tab]: 'tab',\n    [Types.AccessibilityTrait.TabList]: 'tablist',\n    [Types.AccessibilityTrait.List]: 'list',\n    [Types.AccessibilityTrait.ListItem]: 'listitem',\n    [Types.AccessibilityTrait.ListBox]: 'listbox',\n    [Types.AccessibilityTrait.Group]: 'group',\n    [Types.AccessibilityTrait.CheckBox]: 'checkbox',\n    [Types.AccessibilityTrait.ComboBox]: 'combobox',\n    [Types.AccessibilityTrait.Log]: 'log',\n    [Types.AccessibilityTrait.Status]: 'status',\n    [Types.AccessibilityTrait.Dialog]: 'dialog',\n    [Types.AccessibilityTrait.Switch]: 'switch',\n};\n\n// Map of accesssibility live region to an aria-live property.\nconst liveRegionMap: { [key: string]: Types.AriaLive } = {\n    [Types.AccessibilityLiveRegion.None]: 'off',\n    [Types.AccessibilityLiveRegion.Assertive]: 'assertive',\n    [Types.AccessibilityLiveRegion.Polite]: 'polite',\n};\n\nexport class AccessibilityUtil extends CommonAccessibiltiyUtil {\n    // Web equivalent value for aria-live property.\n    accessibilityLiveRegionToString(liveRegion: Types.AccessibilityLiveRegion): Types.AriaLive | undefined {\n        if (liveRegion) {\n            return liveRegionMap[liveRegion];\n        }\n        return undefined;\n    }\n\n    // Web equivalent value for role property.\n    // NOTE: Web only supports a single aria-role on a component.\n    accessibilityTraitToString(traits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined,\n            defaultTrait?: Types.AccessibilityTrait): string | undefined {\n        // Combine & remove duplicate traits.\n        let combinedTraits: Types.AccessibilityTrait[] = defaultTrait ? [defaultTrait] : [];\n\n        if (traits) {\n            combinedTraits = _.union(combinedTraits, Array.isArray(traits) ? traits : [traits]);\n        }\n\n        // Max enum value in this array of traits is role for web. Return corresponding\n        // role string from roleMap.\n        return combinedTraits.length > 0 ?\n            roleMap[_.max(_.filter(combinedTraits, t => roleMap.hasOwnProperty(t as any)))!]\n            : undefined;\n    }\n\n    accessibilityTraitToAriaSelected(traits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined): boolean | undefined {\n        // Walk through each trait and check if there's a selected trait. Return if one is found.\n        if (traits && Array.isArray(traits) && traits.indexOf(Types.AccessibilityTrait.Tab) !== -1) {\n            return traits.indexOf(Types.AccessibilityTrait.Selected) !== -1;\n        }\n\n        // Here we are returning undefined if the above condition is not met\n        // as we dont want to pollute the dom with \"aria-selected = false\" for every falsy condition\n        return undefined;\n    }\n\n    accessibilityTraitToAriaChecked(traits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined): boolean | undefined {\n        // Walk through each trait and check if there's a checked trait. Return if one is found.\n        if (traits && Array.isArray(traits) && traits.indexOf(Types.AccessibilityTrait.CheckBox) !== -1) {\n            return traits.indexOf(Types.AccessibilityTrait.Checked) !== -1;\n        }\n\n        // Here we are returning undefined if the above condition is not met\n        // as we dont want to pollute the dom with \"aria-checked = false\" for every falsy condition\n        return undefined;\n    }\n\n    accessibilityTraitToAriaHasPopup(traits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined): boolean | undefined {\n        // Walk through each trait and check if there's a hasPopup trait. Return if one is found.\n        if (traits && Array.isArray(traits) && traits.indexOf(Types.AccessibilityTrait.HasPopup) !== -1) {\n            return traits.indexOf(Types.AccessibilityTrait.HasPopup) !== -1;\n        }\n\n        // Here we are returning undefined if the above condition is not met\n        // as we dont want to pollute the dom with \"aria-checked = false\" for every falsy condition\n        return undefined;\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/web/ActivityIndicator.tsx",
    "content": "/**\n * ActivityIndicator.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Control to display an animated activity indicator.\n */\n\nimport * as React from 'react';\n\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nconst _activityIndicatorCss = `\n.rx-activity {\n  position: relative;\n  width: 100px;\n  height: 100px;\n}\n.rx-activity .layer-1-translate,\n.rx-activity .layer-3-translate,\n.rx-activity .layer-5-translate,\n.rx-activity .layer-7-translate {\n  -webkit-transform: translate(50px, 50px);\n          transform: translate(50px, 50px);\n}\n.rx-activity .layer-2-translate,\n.rx-activity .layer-4-translate,\n.rx-activity .layer-6-translate,\n.rx-activity .layer-8-translate {\n  -webkit-transform: translate(0px, -40px);\n          transform: translate(0px, -40px);\n}\n.rx-activity .layer-2-content,\n.rx-activity .layer-4-content,\n.rx-activity .layer-6-content,\n.rx-activity .layer-8-content {\n  width: 100px;\n  height: 100px;\n}\n.rx-activity .layer-2-content .shape-0,\n.rx-activity .layer-4-content .shape-0,\n.rx-activity .layer-6-content .shape-0,\n.rx-activity .layer-8-content .shape-0 {\n  position: absolute;\n  left: -7.5px;\n  top: -7.5px;\n  width: 15px;\n  height: 15px;\n  border-radius: 50%;\n}\n.rx-activity div {\n  position: absolute;\n  width: 0;\n  height: 0;\n}\n.rx-activity .animation {\n  -webkit-animation-duration: 1.4s;\n          animation-duration: 1.4s;\n  -webkit-animation-timing-function: linear;\n          animation-timing-function: linear;\n  -webkit-animation-direction: normal;\n          animation-direction: normal;\n  -webkit-animation-iteration-count: infinite;\n          animation-iteration-count: infinite;\n  -webkit-animation-delay: 0s;\n          animation-delay: 0s;\n}\n.rx-activity .layer-1-rotate {\n  -webkit-animation-name: rx-activity-layer-1-rotate;\n          animation-name: rx-activity-layer-1-rotate;\n}\n.rx-activity .layer-2-scale {\n  -webkit-animation-name: rx-activity-layer-2-scale;\n          animation-name: rx-activity-layer-2-scale;\n}\n.rx-activity .layer-3-rotate {\n  -webkit-animation-name: rx-activity-layer-3-rotate;\n          animation-name: rx-activity-layer-3-rotate;\n}\n.rx-activity .layer-4-scale {\n  -webkit-animation-name: rx-activity-layer-4-scale;\n          animation-name: rx-activity-layer-4-scale;\n}\n.rx-activity .layer-5-rotate {\n  -webkit-animation-name: rx-activity-layer-5-rotate;\n          animation-name: rx-activity-layer-5-rotate;\n}\n.rx-activity .layer-6-scale {\n  -webkit-animation-name: rx-activity-layer-6-scale;\n          animation-name: rx-activity-layer-6-scale;\n}\n.rx-activity .layer-7-rotate {\n  -webkit-animation-name: rx-activity-layer-7-rotate;\n          animation-name: rx-activity-layer-7-rotate;\n}\n.rx-activity .layer-8-scale {\n  -webkit-animation-name: rx-activity-layer-8-scale;\n          animation-name: rx-activity-layer-8-scale;\n}\n.rx-activity .shape-0 {\n  background-color: white;\n}\n.rx-activity.hidden {\n  visibility: hidden;\n}\n.rx-activity-extra-small {\n  width: 16px;\n  height: 16px;\n}\n.rx-activity-extra-small .layer-1-translate,\n.rx-activity-extra-small .layer-3-translate,\n.rx-activity-extra-small .layer-5-translate,\n.rx-activity-extra-small .layer-7-translate {\n  -webkit-transform: translate(8px, 8px);\n          transform: translate(8px, 8px);\n}\n.rx-activity-extra-small .layer-2-translate,\n.rx-activity-extra-small .layer-4-translate,\n.rx-activity-extra-small .layer-6-translate,\n.rx-activity-extra-small .layer-8-translate {\n  -webkit-transform: translate(0px, -6.4px);\n          transform: translate(0px, -6.4px);\n}\n.rx-activity-extra-small .layer-2-content,\n.rx-activity-extra-small .layer-4-content,\n.rx-activity-extra-small .layer-6-content,\n.rx-activity-extra-small .layer-8-content {\n  width: 16px;\n  height: 16px;\n}\n.rx-activity-extra-small .layer-2-content .shape-0,\n.rx-activity-extra-small .layer-4-content .shape-0,\n.rx-activity-extra-small .layer-6-content .shape-0,\n.rx-activity-extra-small .layer-8-content .shape-0 {\n  position: absolute;\n  left: -2px;\n  top: -2px;\n  width: 4px;\n  height: 4px;\n  border-radius: 50%;\n}\n.rx-activity-small {\n  width: 20px;\n  height: 20px;\n}\n.rx-activity-small .layer-1-translate,\n.rx-activity-small .layer-3-translate,\n.rx-activity-small .layer-5-translate,\n.rx-activity-small .layer-7-translate {\n  -webkit-transform: translate(10px, 10px);\n          transform: translate(10px, 10px);\n}\n.rx-activity-small .layer-2-translate,\n.rx-activity-small .layer-4-translate,\n.rx-activity-small .layer-6-translate,\n.rx-activity-small .layer-8-translate {\n  -webkit-transform: translate(0px, -8px);\n          transform: translate(0px, -8px);\n}\n.rx-activity-small .layer-2-content,\n.rx-activity-small .layer-4-content,\n.rx-activity-small .layer-6-content,\n.rx-activity-small .layer-8-content {\n  width: 20px;\n  height: 20px;\n}\n.rx-activity-small .layer-2-content .shape-0,\n.rx-activity-small .layer-4-content .shape-0,\n.rx-activity-small .layer-6-content .shape-0,\n.rx-activity-small .layer-8-content .shape-0 {\n  position: absolute;\n  left: -3px;\n  top: -3px;\n  width: 6px;\n  height: 6px;\n  border-radius: 50%;\n}\n.rx-activity-medium {\n  width: 36px;\n  height: 36px;\n}\n.rx-activity-medium .layer-1-translate,\n.rx-activity-medium .layer-3-translate,\n.rx-activity-medium .layer-5-translate,\n.rx-activity-medium .layer-7-translate {\n  -webkit-transform: translate(18px, 18px);\n          transform: translate(18px, 18px);\n}\n.rx-activity-medium .layer-2-translate,\n.rx-activity-medium .layer-4-translate,\n.rx-activity-medium .layer-6-translate,\n.rx-activity-medium .layer-8-translate {\n  -webkit-transform: translate(0px, -14.4px);\n          transform: translate(0px, -14.4px);\n}\n.rx-activity-medium .layer-2-content,\n.rx-activity-medium .layer-4-content,\n.rx-activity-medium .layer-6-content,\n.rx-activity-medium .layer-8-content {\n  width: 36px;\n  height: 36px;\n}\n.rx-activity-medium .layer-2-content .shape-0,\n.rx-activity-medium .layer-4-content .shape-0,\n.rx-activity-medium .layer-6-content .shape-0,\n.rx-activity-medium .layer-8-content .shape-0 {\n  position: absolute;\n  left: -4.5px;\n  top: -4.5px;\n  width: 9px;\n  height: 9px;\n  border-radius: 50%;\n}\n@-webkit-keyframes rx-activity-layer-1-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(1, 0.2, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(1, 0.2, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-1-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(1, 0.2, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(1, 0.2, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-2-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  14.29% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  47.62% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  66.67% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-2-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  14.29% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  47.62% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  66.67% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-3-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.88, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.88, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-3-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.88, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.88, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-4-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  9.52% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  42.86% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  61.9% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-4-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  9.52% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  42.86% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  61.9% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-5-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.76, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.76, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-5-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.76, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.76, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-6-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  4.76% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  38.1% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  57.14% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-6-scale {\n  0% {\n    -webkit-transform: scale(0.96);\n            transform: scale(0.96);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  4.76% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  38.1% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  57.14% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n            animation-timing-function: cubic-bezier(0.17, 0, 0.83, 1);\n  }\n  100% {\n    -webkit-transform: scale(0.8);\n            transform: scale(0.8);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-7-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.65, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.65, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-7-rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n    -webkit-animation-timing-function: cubic-bezier(0.65, 0.21, 0.25, 0.76);\n            animation-timing-function: cubic-bezier(0.65, 0.21, 0.25, 0.76);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@-webkit-keyframes rx-activity-layer-8-scale {\n  0% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  33.33% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 1, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 1, 1);\n  }\n  52.38% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.8, 0, 0.78, 1);\n            animation-timing-function: cubic-bezier(0.8, 0, 0.78, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(1.15);\n            transform: scale(1.15);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0, 1);\n  }\n  100% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n@keyframes rx-activity-layer-8-scale {\n  0% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0.67, 1);\n  }\n  33.33% {\n    -webkit-transform: scale(0.35);\n            transform: scale(0.35);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 1, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 1, 1);\n  }\n  52.38% {\n    -webkit-transform: scale(0.45);\n            transform: scale(0.45);\n    -webkit-animation-timing-function: cubic-bezier(0.8, 0, 0.78, 1);\n            animation-timing-function: cubic-bezier(0.8, 0, 0.78, 1);\n  }\n  72.62% {\n    -webkit-transform: scale(1.15);\n            transform: scale(1.15);\n    -webkit-animation-timing-function: cubic-bezier(0.33, 0, 0, 1);\n            animation-timing-function: cubic-bezier(0.33, 0, 0, 1);\n  }\n  100% {\n    -webkit-transform: scale(1);\n            transform: scale(1);\n    -webkit-animation-timing-function: linear;\n            animation-timing-function: linear;\n  }\n}\n`;\n\nexport interface ActivityIndicatorState {\n    isVisible?: boolean;\n}\n\nexport class ActivityIndicator extends React.Component<Types.ActivityIndicatorProps, ActivityIndicatorState> {\n    private static _isStyleSheetInstalled = false;\n    private _isMounted = false;\n\n    private static _installStyleSheet() {\n        // Have we installed the style sheet already?\n        if (ActivityIndicator._isStyleSheetInstalled) {\n            return;\n        }\n\n        // We set the CSS style sheet here to avoid the need\n        // for users of this class to carry along another CSS\n        // file.\n        const head = document.head || document.getElementsByTagName('head')[0];\n        const style = document.createElement('style') as any;\n\n        style.type = 'text/css';\n        if (style.styleSheet) {\n            style.styleSheet.cssText = _activityIndicatorCss;\n        } else {\n            style.appendChild(document.createTextNode(_activityIndicatorCss));\n        }\n\n        head.appendChild(style);\n        ActivityIndicator._isStyleSheetInstalled = true;\n    }\n\n    constructor(props: Types.ActivityIndicatorProps) {\n        super(props);\n\n        ActivityIndicator._installStyleSheet();\n\n        this.state = { isVisible: false };\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        if (this.props.deferTime && this.props.deferTime > 0) {\n            Timers.setTimeout(() => {\n                if (this._isMounted) {\n                    this.setState({ isVisible: true });\n                }\n            }, this.props.deferTime);\n        } else {\n            this.setState({ isVisible: true });\n        }\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    render() {\n        const colorStyle = {\n            backgroundColor: this.props.color,\n        };\n\n        const spinnerClasses = ['rx-activity'];\n        if (this.props.size === 'tiny') {\n            spinnerClasses.push('rx-activity-extra-small');\n        } else if (this.props.size === 'small') {\n            spinnerClasses.push('rx-activity-small');\n        } else if (this.props.size === 'medium') {\n            spinnerClasses.push('rx-activity-medium');\n        }\n\n        if (!this.state.isVisible) {\n            spinnerClasses.push('hidden');\n        }\n\n        return (\n            <div className={ spinnerClasses.join(' ') } data-test-id={ this.props.testId }>\n                <div className='layer-7'>\n                    <div className='layer-7-translate'>\n                        <div className='layer-7-rotate animation'>\n                            <div className='layer-8'>\n                                <div className='layer-8-translate'>\n                                    <div className='layer-8-scale animation'>\n                                        <div className='layer-8-content '>\n                                            <div className='shape shape-0' style={ colorStyle }></div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className='layer-5'>\n                    <div className='layer-5-translate'>\n                        <div className='layer-5-rotate animation'>\n                            <div className='layer-6'>\n                                <div className='layer-6-translate'>\n                                    <div className='layer-6-scale animation'>\n                                        <div className='layer-6-content '>\n                                            <div className='shape shape-0' style={ colorStyle }></div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className='layer-3'>\n                    <div className='layer-3-translate'>\n                        <div className='layer-3-rotate animation'>\n                            <div className='layer-4'>\n                                <div className='layer-4-translate'>\n                                    <div className='layer-4-scale animation'>\n                                        <div className='layer-4-content '>\n                                            <div className='shape shape-0' style={ colorStyle }></div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div className='layer-1'>\n                    <div className='layer-1-translate'>\n                        <div className='layer-1-rotate animation'>\n                            <div className='layer-2'>\n                                <div className='layer-2-translate'>\n                                    <div className='layer-2-scale animation'>\n                                        <div className='layer-2-content '>\n                                            <div className='shape shape-0' style={ colorStyle }></div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n\nexport default ActivityIndicator;\n"
  },
  {
    "path": "src/web/Alert.tsx",
    "content": "/**\n * Alert.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web Alert dialog boxes.\n */\n\nimport * as React from 'react';\n\nimport * as RX from '../common/Interfaces';\n\nimport { AlertModalContent } from './AlertModalContent';\nimport Modal from './Modal';\n\n// Web/HTML implementation for alert dialog boxes\nexport class Alert extends RX.Alert {\n    private _modalId = 'RX.Alert_WebModal';\n\n    show(title: string, message?: string, buttons?: RX.Types.AlertButtonSpec[],\n            options?: RX.Types.AlertOptions): void {\n        Modal.show(\n            (\n                <AlertModalContent\n                    modalId={ this._modalId }\n                    buttons={ buttons }\n                    title={ title }\n                    message={ message }\n                    theme={ options && options.theme }\n                    preventDismissOnPress={ options && options.preventDismissOnPress }\n                />\n            ), this._modalId,\n        );\n    }\n}\n\nexport default new Alert();\n"
  },
  {
    "path": "src/web/AlertModalContent.tsx",
    "content": "/**\n * AlertModalContent.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web Alert dialog boxes modal content.\n */\n\nimport * as React from 'react';\n\nimport * as RX from '../common/Interfaces';\n\nimport Button from './Button';\nimport Modal from './Modal';\nimport Styles from './Styles';\nimport Text from './Text';\nimport View from './View';\n\nexport interface AppModalContentProps extends RX.Types.ViewProps {\n    buttons?: RX.Types.AlertButtonSpec[];\n    title: string;\n    message?: string;\n    modalId: string;\n    theme?: RX.Types.AlertModalTheme;\n    preventDismissOnPress?: boolean;\n}\n\nexport interface AppModalContentState {\n    hoverIndex: number;\n}\n\nconst _styles = {\n    background: Styles.createViewStyle({\n        flex: 1,\n        backgroundColor: 'rgba(0, 0, 0, 0.1)',\n        alignItems: 'center',\n        alignSelf: 'stretch',\n    }),\n    verticalRoot: Styles.createViewStyle({\n        flex: 1,\n        flexDirection: 'row',\n        alignItems: 'center',\n    }),\n    defaultBody: Styles.createViewStyle({\n        width: 300,\n        backgroundColor: '#fff',\n        borderColor: '#bbb',\n        borderWidth: 1,\n        alignItems: 'stretch',\n        paddingHorizontal: 8,\n        paddingVertical: 4,\n    }),\n    defaultTitleText: Styles.createTextStyle({\n        fontSize: 20,\n        fontWeight: 'bold',\n        alignSelf: 'center',\n        padding: 12,\n        flex: 1,\n    }),\n    defaultMessageText: Styles.createTextStyle({\n        fontSize: 16,\n        alignSelf: 'center',\n        padding: 12,\n        flex: 1,\n    }),\n    defaultButtonContainer: Styles.createButtonStyle({\n        padding: 8,\n        flex: 1,\n    }),\n    defaultButton: Styles.createButtonStyle({\n        alignItems: 'center',\n        flex: 1,\n        borderWidth: 1,\n        borderRadius: 8,\n        borderColor: '#bbb',\n    }),\n    defaultButtonHover: Styles.createButtonStyle({\n        backgroundColor: '#eee',\n    }),\n    defaultCancelButton: Styles.createButtonStyle({\n        borderColor: 'red',\n    }),\n    defaultBtnText: Styles.createTextStyle({\n        fontSize: 14,\n        padding: 8,\n        color: '#333',\n    }),\n    defaultCancelBtnText: Styles.createTextStyle({\n        color: 'red',\n    }),\n};\n\nexport class AlertModalContent extends RX.Component<AppModalContentProps, AppModalContentState> {\n    constructor(props: AppModalContentProps) {\n        super(props);\n        this.state = {\n            hoverIndex: -1,\n        };\n    }\n\n    render() {\n        const theme = this.props.theme;\n\n        const buttons = this.props.buttons && this.props.buttons.map((btnSpec, i) => {\n            const isCancel = btnSpec.style === 'cancel';\n            const buttonStyle = [_styles.defaultButton, isCancel ? _styles.defaultCancelButton : undefined];\n            const buttonTextStyle = [_styles.defaultBtnText, isCancel ? _styles.defaultCancelBtnText : undefined];\n\n            // Is the mouse pointer currently hovering over this button?\n            if (this.state.hoverIndex === i) {\n                buttonStyle.push(_styles.defaultButtonHover);\n            }\n\n            if (theme) {\n                buttonStyle.push(theme.buttonStyle);\n                buttonTextStyle.push(theme.buttonTextStyle);\n                if (isCancel) {\n                    buttonStyle.push(theme.cancelButtonStyle);\n                    buttonTextStyle.push(theme.cancelButtonTextStyle);\n                }\n\n                if (this.state.hoverIndex === i) {\n                    buttonStyle.push(isCancel ? theme.cancelButtonHoverStyle : theme.buttonHoverStyle);\n                }\n            }\n\n            return (\n                <View key={ 'button_' + i } style={ _styles.defaultButtonContainer }>\n                    <Button\n                        onPress={ e => this._onPressButton(btnSpec) }\n                        onHoverStart={ () => this.setState({ hoverIndex: i }) }\n                        onHoverEnd={ () => this.setState({ hoverIndex: -1 }) }\n                        style={ buttonStyle }\n                    >\n                        <Text style={ buttonTextStyle }>\n                            { btnSpec.text }\n                        </Text>\n                    </Button>\n                </View>\n            );\n        });\n\n        return (\n            <View style={ _styles.background } onPress={ this._onPressBackground }>\n                <View style={ _styles.verticalRoot }>\n                    <View\n                        style={ [_styles.defaultBody, theme && theme.bodyStyle] }\n                        onPress={ this._onPressBody }\n                    >\n                        <View>\n                            <Text style={ [_styles.defaultTitleText, theme && theme.titleTextStyle] }>\n                                { this.props.title }\n                            </Text>\n                        </View>\n                        <View>\n                            <Text style={ [_styles.defaultMessageText, theme && theme.messageTextStyle] }>\n                                { this.props.message }\n                            </Text>\n                        </View>\n                        { buttons }\n                    </View>\n                </View>\n            </View>\n        );\n    }\n\n    private _onPressButton(btnSpec: RX.Types.AlertButtonSpec) {\n        Modal.dismiss(this.props.modalId);\n\n        if (btnSpec.onPress) {\n            btnSpec.onPress();\n        }\n    }\n\n    private _onPressBody = (e: RX.Types.SyntheticEvent) => {\n        e.stopPropagation();\n    };\n\n    private _onPressBackground = (e: RX.Types.SyntheticEvent) => {\n        if (!this.props.preventDismissOnPress) {\n            Modal.dismiss(this.props.modalId);\n        }\n    };\n}\n\nexport default AlertModalContent;\n"
  },
  {
    "path": "src/web/Animated.tsx",
    "content": "/**\n * Animated.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Implements animated components for web version of ReactXP.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport AppConfig from '../common/AppConfig';\nimport Easing from '../common/Easing';\nimport * as RX from '../common/Interfaces';\n\nimport { executeTransition, TransitionSpec } from './animated/executeTransition';\nimport RXImage from './Image';\nimport * as _ from './utils/lodashMini';\nimport Styles from './Styles';\nimport RXText from './Text';\nimport RXTextInput from './TextInput';\nimport RXView from './View';\n\n// Animated Css Property Units - check /common/Types for the list of available\n// css animated properties\nconst animatedPropUnits: { [key: string]: string } = {\n    // AnimatedFlexboxStyleRules\n    height: 'px',\n    width: 'px',\n    left: 'px',\n    right: 'px',\n    top: 'px',\n    bottom: 'px',\n\n    // AnimatedTransformStyleRules\n    perspective: '',\n    rotate: 'deg',\n    rotateX: 'deg',\n    rotateY: 'deg',\n    rotateZ: 'deg',\n    scale: '',\n    scaleX: '',\n    scaleY: '',\n    scaleZ: '',\n    translateX: 'px',\n    translateY: 'px',\n    skewX: '',\n    skewY: '',\n\n    // AnimatedViewAndImageCommonStyleRules\n    backgroundColor: '',\n    opacity: '',\n    borderRadius: 'px',\n\n    // AnimatedTextStyleRules\n    color: '',\n    fontSize: 'px',\n};\n\n// Every Animation subclass should extend this.\nexport abstract class Animation {\n    _id: number | undefined;\n\n    // Starts the animation\n    abstract start(onEnd?: RX.Types.Animated.EndCallback): void;\n\n    // Stops the animation\n    abstract stop(): void;\n}\n\n// Interface for a component that wants to know when the value\n// of an Animated.Value changes or is about to be animated.\ninterface ValueListener {\n    setValue(valueObject: Value, newValue: number | string): void;\n    startTransition(valueObject: Value, from: number | string, toValue: number | string, duration: number,\n        easing: string, delay: number, onEnd: RX.Types.Animated.EndCallback): void;\n    stopTransition(valueObject: Value): number | string | undefined;\n}\n\n// The animated value object\nexport class Value extends RX.Types.AnimatedValue {\n    protected _value: number | string;\n    private _listeners: ValueListener[];\n\n    // Initializes the object with the defaults and assigns the id for the animated value.\n    constructor(value: number) {\n        super(value);\n        this._value = value;\n        this._listeners = [];\n    }\n\n    // Gets the current animated value (this gets updates after animation concludes)\n    _getInputValue(): number | string {\n        return this._value;\n    }\n\n    _getOutputValue(): number | string {\n        return this._getInterpolatedValue(this._value);\n    }\n\n    _getInterpolatedValue(inputVal: number | string): number | string {\n        return inputVal;\n    }\n\n    _isInterpolated(): boolean {\n        return false;\n    }\n\n    interpolate(config: RX.Types.Animated.InterpolationConfigType) {\n        return new InterpolatedValue(config, this);\n    }\n\n    // Updates a value in this animated reference.\n    setValue(value: number | string): void {\n        if (value === undefined) {\n            throw new Error('An invalid value was passed into setvalue in the animated value api');\n        }\n\n        // If value the same, do nothing.\n        if (value === this._value) {\n            return;\n        }\n        this._value = value;\n\n        // Notify subscribers about the new value.\n        _.each(this._listeners, listener => listener.setValue(this, value));\n    }\n\n    // Add listener for when the value gets updated.\n    _addListener(listenerToAdd: ValueListener): void {\n        if (this._listeners.indexOf(listenerToAdd) < 0) {\n            this._listeners.push(listenerToAdd);\n        }\n    }\n\n    // Remove a specific listner.\n    _removeListener(listenerToRemove: ValueListener): void {\n        this._listeners = _.filter(this._listeners, listener => listener !== listenerToRemove);\n    }\n\n    // Remove all listeners.\n    _removeAllListeners(): void {\n        this._listeners = [];\n    }\n\n    // Start a specific animation.\n    _startTransition(toValue: number | string, duration: number, easing: string, delay: number,\n            onEnd: RX.Types.Animated.EndCallback): void {\n\n        // If there are no listeners, the app probably has a bug where it's\n        // starting an animation before the associated element is mounted.\n        // Complete the animation immediately by updating to the end value\n        // and caling the onEnd callback.\n        if (this._listeners.length === 0) {\n            this._updateFinalValue(toValue);\n            if (onEnd) {\n                onEnd({ finished: false });\n            }\n\n            return;\n        }\n\n        // Only call onEnd once for a series of listeners.\n        let onEndCalled = false;\n        const onEndWrapper = (result: RX.Types.Animated.EndResult) => {\n            if (onEndCalled) {\n                return;\n            }\n\n            onEndCalled = true;\n            onEnd(result);\n        };\n\n        _.each(this._listeners, listener => {\n            listener.startTransition(this, this._getOutputValue(), this._getInterpolatedValue(toValue),\n                duration, easing, delay, onEndWrapper);\n        });\n    }\n\n    // Stop animation.\n    _stopTransition() {\n        _.each(this._listeners, listener => {\n            const updatedValue = listener.stopTransition(this);\n            if (updatedValue !== undefined) {\n                this._updateFinalValue(updatedValue);\n            }\n        });\n    }\n\n    // After an animation is stopped or completed, updates\n    // the final value.\n    _updateFinalValue(value: number | string) {\n        this.setValue(value);\n    }\n}\n\nexport class InterpolatedValue extends Value {\n    private _interpolationConfig: { [key: number]: string | number } | undefined;\n    constructor(private _config: RX.Types.Animated.InterpolationConfigType, rootValue: Value) {\n        super(rootValue._getOutputValue() as number);\n\n        if (!this._config || !this._config.inputRange || !this._config.outputRange ||\n                this._config.inputRange.length < 2 || this._config.outputRange.length < 2 ||\n                this._config.inputRange.length !== this._config.outputRange.length) {\n            throw new Error('The interpolation config is invalid. Input and output arrays must be same length.');\n        }\n\n        const newInterpolationConfig: { [key: number]: string | number } = {};\n        _.each(this._config.inputRange, (key, index) => {\n            newInterpolationConfig[key] = this._config.outputRange[index];\n        });\n        this._interpolationConfig = newInterpolationConfig;\n\n        rootValue._addListener({\n            setValue: (valueObject: Value, newValue: number | string) => {\n                this.setValue(valueObject._getOutputValue());\n            },\n            startTransition: (valueObject: Value, from: number | string, toValue: number | string, duration: number,\n                    easing: string, delay: number, onEnd: RX.Types.Animated.EndCallback) => {\n                this._startTransition(toValue, duration, easing, delay, onEnd);\n            },\n            stopTransition: (valueObject: Value) => {\n                this._stopTransition();\n                return undefined;\n            },\n        });\n    }\n\n    _startTransition(toValue: number | string, duration: number, easing: string, delay: number,\n            onEnd: RX.Types.Animated.EndCallback): void {\n        // This API doesn't currently support more than two elements in the\n        // interpolation array. Supporting this in the web would require the\n        // use of JS-driven animations or keyframes, both of which are prohibitively\n        // expensive from a performance and responsiveness perspective.\n        if (this._config.inputRange.length !== 2) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.log('Web implementation of interpolate API currently supports only two interpolation values.');\n            }\n        }\n\n        super._startTransition(toValue, duration, easing, delay, onEnd);\n    }\n\n    _convertValueToNumeric(inputVal: number | string): number {\n        if (_.isNumber(inputVal)) {\n            return inputVal;\n        }\n\n        return parseInt(inputVal, 10);\n    }\n\n    _addUnitsToNumericValue(value: number, templateValue: number | string): number | string {\n        if (_.isNumber(templateValue)) {\n            return value;\n        }\n\n        // Does the template contain any of the common units?\n        const templateString = templateValue;\n        const commonUnits = ['deg', 'grad', 'rad'];\n        for (const unit of commonUnits) {\n            if (templateString.indexOf(unit) > 0) {\n                return value.toString() + unit;\n            }\n        }\n\n        return value;\n    }\n\n    _getInterpolatedValue(inputVal: number | string): number | string {\n        if (!this._interpolationConfig) {\n            throw new Error('There is no interpolation config but one is required');\n        }\n\n        const numericInputValue = this._convertValueToNumeric(inputVal);\n        const outputValues = this._config.outputRange.map(value => this._convertValueToNumeric(value));\n\n        if (this._interpolationConfig[numericInputValue]) {\n            return this._interpolationConfig[numericInputValue];\n        }\n\n        if (inputVal < this._config.inputRange[0]) {\n            return outputValues[0];\n        }\n\n        for (let i = 1; i < this._config.inputRange.length; i++) {\n            if (inputVal < this._config.inputRange[i]) {\n                const ratio = (numericInputValue - this._config.inputRange[i - 1]) /\n                    (this._config.inputRange[i] - this._config.inputRange[i - 1]);\n                return this._addUnitsToNumericValue(\n                    (this._config.outputRange as number[])[i] * ratio +\n                    (this._config.outputRange as number[])[i - 1] * (1 - ratio),\n                    inputVal);\n            }\n        }\n        return this._addUnitsToNumericValue(\n            outputValues[this._config.inputRange.length - 1],\n            inputVal);\n    }\n\n    _isInterpolated(): boolean {\n        return true;\n    }\n}\n\nexport const timing: RX.Types.Animated.TimingFunction = function(value: Value,\n        config: RX.Types.Animated.TimingAnimationConfig): RX.Types.Animated.CompositeAnimation {\n\n    if (!value  || !config) {\n        throw new Error('Timing animation requires value and config');\n    }\n\n    let stopLooping = false;\n    return {\n        start: function(onEnd?: RX.Types.Animated.EndCallback): void {\n            const animate = () => {\n                if (config.loop) {\n                    value.setValue(config.loop.restartFrom);\n                }\n\n                const easing: RX.Types.Animated.EasingFunction = config.easing || Easing.Default();\n                const duration = config.duration !== undefined ? config.duration : 500;\n                const delay = config.delay || 0;\n                value._startTransition(config.toValue, duration, easing.cssName, delay, result => {\n                    // Restart the loop?\n                    if (config.loop && !stopLooping) {\n                        animate();\n                    } else {\n                        value._updateFinalValue(config.toValue);\n                    }\n\n                    if (onEnd) {\n                        onEnd(result);\n                    }\n                });\n            };\n\n            // Trigger animation loop\n            animate();\n        },\n\n        stop: function(): void {\n            stopLooping = true;\n            value._stopTransition();\n        },\n    };\n};\n\nexport const sequence: RX.Types.Animated.SequenceFunction = function(\n        animations: RX.Types.Animated.CompositeAnimation[]): RX.Types.Animated.CompositeAnimation {\n\n    if (!animations) {\n        throw new Error('Sequence animation requires a list of animations');\n    }\n\n    let hasBeenStopped = false;\n    let doneCount = 0;\n    const result = {\n        start: function(onEnd?: RX.Types.Animated.EndCallback) {\n            if (!animations || animations.length === 0) {\n                throw new Error('No animations were passed to the animated sequence API');\n            }\n\n            const executeNext = () => {\n                doneCount++;\n\n                const isFinished = doneCount === animations.length;\n                if (hasBeenStopped || isFinished) {\n                    doneCount = 0;\n                    hasBeenStopped = false;\n                    if (onEnd) {\n                        onEnd({ finished: isFinished });\n                    }\n\n                    return;\n                }\n\n                animations[doneCount].start(executeNext);\n            };\n\n            animations[doneCount].start(executeNext);\n        },\n\n        stop: function() {\n            if (doneCount < animations.length) {\n                doneCount = 0;\n                hasBeenStopped = true;\n                animations[doneCount].stop();\n            }\n        },\n    };\n\n    return result;\n};\n\nexport const parallel: RX.Types.Animated.ParallelFunction = function(\n        animations: RX.Types.Animated.CompositeAnimation[]): RX.Types.Animated.CompositeAnimation {\n\n    if (!animations) {\n        throw new Error('Parallel animation requires a list of animations');\n    }\n\n    // Variable to make sure we only call stop() at most once\n    let hasBeenStopped = false;\n    let doneCount = 0;\n\n    const result = {\n        start: function(onEnd?: RX.Types.Animated.EndCallback) {\n            if (!animations || animations.length === 0) {\n                throw new Error('No animations were passed to the animated parallel API');\n            }\n\n            // Walk through animations and start all as soon as possible.\n            animations.forEach((animation, id) => {\n                animation.start(animationResult => {\n                    doneCount++;\n                    const isFinished = doneCount === animations.length;\n                    if (hasBeenStopped || isFinished) {\n                        doneCount = 0;\n                        hasBeenStopped = false;\n                        if (onEnd) {\n                            onEnd({ finished: isFinished });\n                        }\n\n                        return;\n                    }\n                });\n            });\n        },\n\n        stop: function(): void {\n            doneCount = 0;\n            hasBeenStopped = true;\n            animations.forEach(animation => {\n                animation.stop();\n            });\n        },\n    };\n\n    return result;\n};\n\ninterface ExtendedTransition extends TransitionSpec {\n    onEnd?: RX.Types.Animated.EndCallback;\n    toValue?: number | string;\n}\n\ninterface AnimatedAttribute {\n    valueObject: Value;\n    activeTransition?: ExtendedTransition;\n}\n\ninterface AnimatedValueMap {\n    [transform: string]: AnimatedAttribute;\n}\n\n// Function for creating wrapper AnimatedComponent around passed in component\nfunction createAnimatedComponent<PropsType extends RX.Types.CommonProps<C>, C>(Component: any): any {\n    class AnimatedComponentGenerated extends React.Component<PropsType, void>\n        implements RX.AnimatedComponent<PropsType, void, C>, ValueListener {\n\n        private _mountedComponent: any = null;\n        private _propsWithoutStyle: any;\n        // Gets initialized via _updateStypes\n        private _processedStyle!: { [attribute: string]: string};\n\n        private _animatedAttributes: AnimatedValueMap;\n        // Gets initialized via _updateStypes\n        private _staticTransforms!: { [transform: string]: string };\n        private _animatedTransforms: AnimatedValueMap;\n\n        constructor(props: PropsType) {\n            super(props);\n\n            this._animatedAttributes = {};\n            this._animatedTransforms = {};\n            this._updateStyles(props);\n        }\n\n        setNativeProps(props: PropsType) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('setNativeProps not supported on web');\n            }\n        }\n\n        UNSAFE_componentWillReceiveProps(props: RX.Types.CommonStyledProps<RX.Types.StyleRuleSet<object>, C>) {\n            this._updateStyles(props);\n        }\n\n        setValue(valueObject: Value, newValue: number | string): void {\n            // We should never get here if the component isn't mounted,\n            // but we'll add this additional protection.\n            if (!this._mountedComponent) {\n                return;\n            }\n\n            const attrib = this._findAnimatedAttributeByValue(this._animatedAttributes, valueObject);\n            if (attrib) {\n                const domNode = this._getDomNode();\n                if (domNode) {\n                    const cssValue = this._generateCssAttributeValue(attrib, valueObject._getOutputValue());\n                    (domNode.style as any)[attrib] = cssValue;\n                }\n                return;\n            }\n\n            const transform = this._findAnimatedAttributeByValue(this._animatedTransforms, valueObject);\n            if (transform) {\n                const domNode = this._getDomNode();\n                if (domNode) {\n                    domNode.style.transform = this._generateCssTransformList(true);\n                }\n            }\n        }\n\n        startTransition(valueObject: Value, fromValue: number | string, toValue: number | string, duration: number,\n                easing: string, delay: number, onEnd: RX.Types.Animated.EndCallback): void {\n\n            // We should never get here if the component isn't mounted,\n            // but we'll add this additional protection.\n            if (!this._mountedComponent) {\n                return;\n            }\n\n            let updateTransition = false;\n\n            const attrib = this._findAnimatedAttributeByValue(this._animatedAttributes, valueObject);\n            if (attrib) {\n                if (this._animatedAttributes[attrib].activeTransition) {\n                    if (AppConfig.isDevelopmentMode()) {\n                        console.error('Animation started while animation was already pending');\n                    }\n                }\n                this._animatedAttributes[attrib].activeTransition = {\n                    property: Styles.convertJsToCssStyle(attrib),\n                    from: this._generateCssAttributeValue(attrib, fromValue),\n                    to: this._generateCssAttributeValue(attrib, toValue),\n                    duration,\n                    timing: easing,\n                    delay,\n                    toValue,\n                    onEnd,\n                };\n                updateTransition = true;\n            }\n\n            const transform = this._findAnimatedAttributeByValue(this._animatedTransforms, valueObject);\n            if (transform) {\n                if (this._animatedTransforms[transform].activeTransition) {\n                    if (AppConfig.isDevelopmentMode()) {\n                        console.error('Animation started while animation was already pending');\n                    }\n                }\n                this._animatedTransforms[transform].activeTransition = {\n                    property: transform,\n                    from: fromValue,\n                    to: toValue,\n                    duration,\n                    timing: easing,\n                    delay,\n                    toValue,\n                    onEnd,\n                };\n                updateTransition = true;\n            }\n\n            if (updateTransition) {\n                this._updateTransition();\n            }\n        }\n\n        // Stops a pending transition, returning the value at the current time.\n        stopTransition(valueObject: Value): number | string | undefined {\n            // We should never get here if the component isn't mounted,\n            // but we'll add this additional protection.\n            if (!this._mountedComponent) {\n                return;\n            }\n\n            let partialValue: number | string | undefined;\n            let stoppedTransition: ExtendedTransition | undefined;\n            let updateTransition = false;\n\n            const attrib = this._findAnimatedAttributeByValue(this._animatedAttributes, valueObject);\n            if (attrib) {\n                const activeTransition = this._animatedAttributes[attrib].activeTransition;\n                if (activeTransition) {\n                    partialValue = activeTransition.toValue;\n\n                    // We don't currently support updating to an intermediate\n                    // value for interpolated values because this would involve\n                    // mapping the interpolated value in reverse. Instead, we'll\n                    // simply update it to the \"toValue\".\n                    if (!valueObject._isInterpolated()) {\n                        const domNode = this._getDomNode();\n                        if (domNode) {\n                            const computedStyle = window.getComputedStyle(domNode, undefined);\n                            if (computedStyle && (computedStyle as any)[attrib]) {\n                                partialValue = (computedStyle as any)[attrib];\n                            }\n                        }\n                    }\n\n                    stoppedTransition = this._animatedAttributes[attrib].activeTransition;\n                    delete this._animatedAttributes[attrib].activeTransition;\n                    updateTransition = true;\n                }\n            } else {\n                const transform = this._findAnimatedAttributeByValue(this._animatedTransforms, valueObject);\n                if (transform) {\n                    const activeTransition = this._animatedTransforms[transform].activeTransition;\n                    if (activeTransition) {\n                        // We don't currently support updating to an intermediate value\n                        // for transform values. This is because getComputedStyle\n                        // returns a transform matrix for 'transform'. To implement this, we'd\n                        // need to convert the matrix back to a rotation, scale, etc.\n                        partialValue = activeTransition.toValue;\n\n                        stoppedTransition = this._animatedTransforms[transform].activeTransition;\n                        delete this._animatedTransforms[transform].activeTransition;\n                        updateTransition = true;\n                    }\n                }\n            }\n\n            if (stoppedTransition && stoppedTransition.onEnd) {\n                stoppedTransition.onEnd({ finished: false });\n            }\n\n            if (updateTransition) {\n                this._updateTransition();\n            }\n\n            return partialValue;\n        }\n\n        private _getDomNode(): HTMLElement | null {\n            return ReactDOM.findDOMNode(this._mountedComponent) as HTMLElement | null;\n        }\n\n        // Looks for the specified value object in the specified map. Returns\n        // the key for the map (i.e. the attribute name) if found.\n        private _findAnimatedAttributeByValue(map: AnimatedValueMap, valueObj: Value): string | undefined {\n            const keys = _.keys(map);\n            const index = _.findIndex(keys, key => map[key].valueObject === valueObj);\n            return index >= 0 ? keys[index] : undefined;\n        }\n\n        // Updates the \"transform\" CSS attribute for the element to reflect all\n        // active transitions.\n        private _updateTransition() {\n            // We should never get here if the component isn't mounted,\n            // but we'll add this additional protection.\n            if (!this._mountedComponent) {\n                return;\n            }\n\n            const activeTransitions: TransitionSpec[] = [];\n            _.each(this._animatedAttributes, attrib => {\n                if (attrib.activeTransition) {\n                    activeTransitions.push(attrib.activeTransition);\n                }\n            });\n\n            // If there are any transform transitions, we need to combine\n            // these into a single transition. That means we can't specify\n            // different durations, delays or easing functions for each. That's\n            // an unfortunate limitation of CSS.\n            const keys = _.keys(this._animatedTransforms);\n            const index = _.findIndex(keys, key => !!this._animatedTransforms[key].activeTransition);\n            if (index >= 0) {\n                const transformTransition = this._animatedTransforms[keys[index]].activeTransition!;\n                activeTransitions.push({\n                    property: 'transform',\n                    from: this._generateCssTransformList(false),\n                    to: this._generateCssTransformList(true),\n                    duration: transformTransition.duration,\n                    timing: transformTransition.timing,\n                    delay: transformTransition.delay,\n                });\n            }\n\n            if (activeTransitions.length > 0) {\n                const domNode = this._getDomNode();\n                if (domNode) {\n                    executeTransition(domNode, activeTransitions, () => {\n                        // Clear all of the active transitions and invoke the onEnd callbacks.\n                        const completeTransitions: ExtendedTransition[] = [];\n\n                        _.each(this._animatedAttributes, attrib => {\n                            if (attrib.activeTransition) {\n                                completeTransitions.push(attrib.activeTransition);\n                                delete attrib.activeTransition;\n                            }\n                        });\n\n                        _.each(this._animatedTransforms, transform => {\n                            if (transform.activeTransition) {\n                                completeTransitions.push(transform.activeTransition);\n                                delete transform.activeTransition;\n                            }\n                        });\n\n                        _.each(completeTransitions, transition => {\n                            if (transition.onEnd) {\n                                transition.onEnd({ finished: true });\n                            }\n                        });\n                    });\n                }\n            }\n        }\n\n        // Generates the CSS value for the specified attribute given\n        // an animated value object.\n        private _generateCssAttributeValue(attrib: string, newValue: number | string): string {\n            // If the value is a raw number, append the default units.\n            // If it's a string, we assume the caller has specified the units.\n            if (typeof newValue === 'number') {\n                newValue = newValue + animatedPropUnits[attrib];\n            }\n            return newValue;\n        }\n\n        private _generateCssTransformValue(transform: string, newValue: number | string): string {\n            // If the value is a raw number, append the default units.\n            // If it's a string, we assume the caller has specified the units.\n            if (typeof newValue === 'number') {\n                newValue = newValue + animatedPropUnits[transform];\n            }\n            return newValue;\n        }\n\n        // Regenerates the list of transforms, combining all static and animated transforms.\n        private _generateCssTransformList(useActiveValues: boolean): string {\n            const transformList: string[] = [];\n            _.each(this._staticTransforms, (value, transform) => {\n                transformList.push(transform + '(' + value + ')');\n            });\n            _.each(this._animatedTransforms, (value, transform) => {\n                const newValue = useActiveValues && value.activeTransition ?\n                    value.activeTransition.to : value.valueObject._getOutputValue();\n                transformList.push(transform + '(' + this._generateCssTransformValue(transform, newValue) + ')');\n            });\n            return transformList.join(' ');\n        }\n\n        // Typing of `any` on StyleRuleSet isn't desirable, but there's not accurate typings that can be used to represent\n        // our merging of web/RX styles here here\n        private _updateStyles(props: RX.Types.CommonStyledProps<RX.Types.StyleRuleSet<any>, C>) {\n            this._propsWithoutStyle = _.omit(props, 'style');\n\n            const rawStyles = Styles.combine(props.style || {});\n            this._processedStyle = {};\n\n            const newAnimatedAttributes: { [transform: string]: Value } = {};\n\n            for (const attrib in rawStyles) {\n                // Handle transforms separately.\n                if (attrib === 'staticTransforms' || attrib === 'animatedTransforms') {\n                    continue;\n                }\n\n                // Is this a dynamic (animated) value?\n                if (rawStyles[attrib] instanceof Value) {\n                    const valueObj = rawStyles[attrib] as Value;\n                    this._processedStyle[attrib] = this._generateCssAttributeValue(attrib, valueObj._getOutputValue());\n                    newAnimatedAttributes[attrib] = valueObj;\n                } else {\n                    // Copy the static style value.\n                    this._processedStyle[attrib] = rawStyles[attrib];\n                }\n            }\n\n            // Handle transforms, which require special processing because they need to\n            // be combined into a single 'transform' CSS attribute.\n            this._staticTransforms = rawStyles.staticTransforms || {};\n            const newAnimatedTransforms: { [transform: string]: Value } = rawStyles.animatedTransforms || {};\n\n            // Update this._animatedAttributes and this._animatedTransforms so they match\n            // the updated style.\n\n            // Remove any previous animated attributes that are no longer present\n            // or associated with different value objects.\n            _.each(this._animatedAttributes, (value, attrib) => {\n                if (!newAnimatedAttributes[attrib] || newAnimatedAttributes[attrib] !== value.valueObject) {\n                    if (value.activeTransition) {\n                        if (AppConfig.isDevelopmentMode()) {\n                            console.error('Animated style attribute removed while the animation was active');\n                        }\n                    }\n                    value.valueObject._removeListener(this);\n                    delete this._animatedAttributes[attrib];\n                }\n            });\n\n            // Add new animated attributes.\n            _.each(newAnimatedAttributes, (value, attrib) => {\n                if (!this._animatedAttributes[attrib]) {\n                    this._animatedAttributes[attrib] = { valueObject: value };\n                    if (this._mountedComponent) {\n                        value._addListener(this);\n                    }\n                }\n            });\n\n            // Remove any previous animated transforms that are no longer present\n            // or associated with different value objects.\n            _.each(this._animatedTransforms, (value, transform) => {\n                if (!newAnimatedTransforms[transform] || newAnimatedTransforms[transform] !== value.valueObject) {\n                    if (value.activeTransition) {\n                        if (AppConfig.isDevelopmentMode()) {\n                            console.warn('Should not remove an animated transform attribute while the animation is active');\n                        }\n                    }\n                    value.valueObject._removeListener(this);\n                    delete this._animatedTransforms[transform];\n                }\n            });\n\n            // Add new animated transforms.\n            _.each(newAnimatedTransforms, (value, transform) => {\n                if (!this._animatedTransforms[transform]) {\n                    this._animatedTransforms[transform] = { valueObject: value };\n                    if (this._mountedComponent) {\n                        value._addListener(this);\n                    }\n                }\n            });\n\n            // Update the transform attribute in this._processedStyle.\n            const transformList = this._generateCssTransformList(true);\n            if (transformList) {\n                this._processedStyle.transform = transformList;\n            }\n        }\n\n        componentDidMount() {\n            _.each(this._animatedAttributes, value => {\n                value.valueObject._addListener(this);\n            });\n\n            _.each(this._animatedTransforms, value => {\n                value.valueObject._addListener(this);\n            });\n        }\n\n        componentWillUnmount() {\n            _.each(this._animatedAttributes, value => {\n                value.valueObject._removeListener(this);\n            });\n            this._animatedAttributes = {};\n\n            _.each(this._animatedTransforms, value => {\n                value.valueObject._removeListener(this);\n            });\n            this._animatedTransforms = {};\n        }\n\n        focus() {\n            if (this._mountedComponent && this._mountedComponent.focus) {\n                this._mountedComponent.focus();\n            }\n        }\n\n        requestFocus() {\n            if (this._mountedComponent && this._mountedComponent.requestFocus) {\n                this._mountedComponent.requestFocus();\n            }\n        }\n\n        blur() {\n            if (this._mountedComponent && this._mountedComponent.blur) {\n                this._mountedComponent.blur();\n            }\n        }\n\n        setFocusRestricted(restricted: boolean) {\n            if (this._mountedComponent && this._mountedComponent.setFocusRestricted) {\n                this._mountedComponent.setFocusRestricted(restricted);\n            }\n        }\n\n        setFocusLimited(limited: boolean) {\n            if (this._mountedComponent && this._mountedComponent.setFocusLimited) {\n                this._mountedComponent.setFocusLimited(limited);\n            }\n        }\n\n        render() {\n            return (\n                <Component\n                    style={ this._processedStyle }\n                    { ...this._propsWithoutStyle }\n                    ref={ this._onMount }\n                >\n                    { this.props.children }\n                </Component>\n            );\n        }\n\n        protected _onMount = (component: any) => {\n            this._mountedComponent = component;\n        };\n\n        // Update the component's display name for easy debugging in react devtools extension\n        static displayName = `Animated.${Component.displayName || Component.name || 'Component'}`;\n    }\n\n    return AnimatedComponentGenerated;\n}\n\nexport const Image = createAnimatedComponent(RXImage) as typeof RX.AnimatedImage;\nexport const Text = createAnimatedComponent(RXText) as typeof RX.AnimatedText;\nexport const TextInput = createAnimatedComponent(RXTextInput) as typeof RX.AnimatedTextInput;\nexport const View = createAnimatedComponent(RXView) as typeof RX.AnimatedView;\n\nexport type Image = RX.AnimatedImage;\nexport type Text = RX.AnimatedText;\nexport type TextInput = RX.AnimatedTextInput;\nexport type View = RX.AnimatedView;\n\nexport const createValue: (initialValue: number) => Value = function(initialValue: number) {\n    return new Value(initialValue);\n};\n\nexport const interpolate: (value: Value, inputRange: number[], outputRange: string[]) => Value =\n    function(value: Value, inputRange: number[], outputRange: string[]) {\n        return value.interpolate({ inputRange: inputRange, outputRange: outputRange });\n    };\n\nexport { Easing };\n"
  },
  {
    "path": "src/web/App.ts",
    "content": "/**\n * App.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Implements App interface for ReactXP.\n */\n\nimport * as RX from '../common/Interfaces';\n\nimport AppVisibilityUtils from './utils/AppVisibilityUtils';\n\nexport class App extends RX.App {\n    private _activationState: RX.Types.AppActivationState;\n\n    constructor() {\n        super();\n\n        // Handle test environment where document is not defined.\n        if (typeof(document) !== 'undefined') {\n            this._activationState = AppVisibilityUtils.isAppInForeground() ?\n                RX.Types.AppActivationState.Active : RX.Types.AppActivationState.Background;\n\n            AppVisibilityUtils.onAppForegroundedEvent.subscribe(() => {\n                this._setActivationState(RX.Types.AppActivationState.Active);\n            });\n\n            AppVisibilityUtils.onAppBackgroundedEvent.subscribe(() => {\n                this._setActivationState(RX.Types.AppActivationState.Background);\n            });\n        } else {\n            this._activationState = RX.Types.AppActivationState.Active;\n        }\n    }\n\n    initialize(debug: boolean, development: boolean): void {\n        super.initialize(debug, development);\n    }\n\n    getActivationState(): RX.Types.AppActivationState {\n        return this._activationState;\n    }\n\n    private _setActivationState = (currentState: RX.Types.AppActivationState): void => {\n        if (this._activationState !== currentState) {\n            this._activationState = currentState;\n            this.activationStateChangedEvent.fire(this._activationState);\n        }\n    };\n}\n\nexport default new App();\n"
  },
  {
    "path": "src/web/Button.tsx",
    "content": "/**\n * Button.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Button abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport AppConfig from '../common/AppConfig';\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Button as ButtonBase, Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport { applyFocusableComponentMixin } from './utils/FocusManager';\nimport Styles from './Styles';\nimport UserInterface from './UserInterface';\n\nconst _styles = {\n    defaultButton: {\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflow: 'hidden',\n        alignItems: 'stretch',\n        justifyContent: 'center',\n        appRegion: 'no-drag',\n        backgroundColor: 'transparent',\n        borderColor: 'transparent',\n        textAlign: 'left',\n        borderWidth: '0',\n    },\n};\n\nconst _longPressTime = 1000;\nconst _defaultAccessibilityTrait = Types.AccessibilityTrait.Button;\n\nexport interface ButtonContext {\n    hasRxButtonAscendant?: boolean;\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class Button extends ButtonBase {\n    static contextTypes = {\n        hasRxButtonAscendant: PropTypes.bool,\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: ButtonContext;\n\n    static childContextTypes = {\n        hasRxButtonAscendant: PropTypes.bool,\n    };\n\n    private _mountedButton: HTMLButtonElement | null = null;\n    private _lastMouseDownEvent: Types.SyntheticEvent | undefined;\n    private _ignoreTouchEnd = false;\n    private _ignoreClick = false;\n    private _longPressTimer: number | undefined;\n    private _isMouseOver = false;\n    private _isFocusedWithKeyboard = false;\n    private _isHoverStarted = false;\n\n    constructor(props: Types.ButtonProps, context?: ButtonContext) {\n        super(props, context);\n\n        if (context && context.hasRxButtonAscendant) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.warn('Button components should not be embedded. Some APIs, e.g. Accessibility, will not work.');\n            }\n        }\n    }\n\n    getChildContext(): ButtonContext {\n        return { hasRxButtonAscendant: true };\n    }\n\n    render() {\n        const ariaRole = AccessibilityUtil.accessibilityTraitToString(this.props.accessibilityTraits,\n            _defaultAccessibilityTrait);\n        const ariaSelected = AccessibilityUtil.accessibilityTraitToAriaSelected(this.props.accessibilityTraits);\n        const ariaChecked = AccessibilityUtil.accessibilityTraitToAriaChecked(this.props.accessibilityTraits);\n        const isAriaHidden = AccessibilityUtil.isHidden(this.props.importantForAccessibility);\n        const ariaHasPopup = AccessibilityUtil.accessibilityTraitToAriaHasPopup(this.props.accessibilityTraits);\n\n        // NOTE: We use tabIndex=0 to support focus.\n        return (\n            <button\n                ref={ this._onMount }\n                style={ this._getStyles() as any }\n                role={ ariaRole }\n                title={ this.props.title }\n                tabIndex={ this.props.tabIndex }\n                aria-label={ this.props.accessibilityLabel || this.props.title }\n                aria-disabled={ this.props.disabled }\n                aria-hidden={ isAriaHidden }\n                aria-selected={ ariaSelected }\n                aria-checked={ ariaChecked }\n                onClick={ this.onClick }\n                onTouchStart={ this._onMouseDown }\n                onTouchMove={ this._onTouchMove }\n                onTouchEnd={ this._onTouchEnd }\n                onContextMenu={ this._onContextMenu }\n                onMouseDown={ this._onMouseDown }\n                onMouseUp={ this._onMouseUp }\n                onMouseEnter={ this._onMouseEnter }\n                onMouseLeave={ this._onMouseLeave }\n                onFocus={ this._onFocus }\n                onBlur={ this._onBlur }\n                onKeyDown={ this.props.onKeyPress }\n                disabled={ this.props.disabled }\n                aria-haspopup={ ariaHasPopup }\n                aria-controls={ this.props.ariaControls }\n                id={ this.props.id }\n                data-test-id={ this.props.testId }\n            >\n                { this.props.children }\n            </button>\n        );\n    }\n\n    componentDidMount() {\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._mountedButton !== null,\n        );\n    }\n\n    focus() {\n        if (this._mountedButton) {\n            this._mountedButton.focus();\n        }\n    }\n\n    blur() {\n        if (this._mountedButton) {\n            this._mountedButton.blur();\n        }\n    }\n\n    private _onMount = (ref: HTMLButtonElement | null) => {\n        this._mountedButton = ref;\n    };\n\n    protected onClick = (e: Types.MouseEvent) => {\n        if (this._ignoreClick) {\n            e.stopPropagation();\n            this._ignoreClick = false;\n        } else if (!this.props.disabled && this.props.onPress) {\n            this.props.onPress(e);\n        }\n    };\n\n    private _getStyles(): Types.ButtonStyleRuleSet {\n        const buttonStyleMutations: Types.ButtonStyle = {};\n        const buttonStyles = Styles.combine(this.props.style) as any;\n\n        // Specify default style for padding only if padding is not already specified\n        if (buttonStyles && buttonStyles.padding === undefined  &&\n                buttonStyles.paddingRight === undefined && buttonStyles.paddingLeft === undefined &&\n                buttonStyles.paddingBottom === undefined && buttonStyles.paddingTop === undefined  &&\n                buttonStyles.paddingHorizontal === undefined && buttonStyles.paddingVertical === undefined) {\n            buttonStyleMutations.padding = 0;\n        }\n\n        if (this.props.disabled) {\n            buttonStyleMutations.opacity = this.props.disabledOpacity !== undefined ? this.props.disabledOpacity : 0.5;\n        }\n\n        // Default to 'pointer' cursor for enabled buttons unless otherwise specified.\n        if (!buttonStyles || !buttonStyles.cursor) {\n            buttonStyleMutations.cursor = this.props.disabled ? 'default' : 'pointer';\n        }\n\n        return Styles.combine([_styles.defaultButton, buttonStyles, buttonStyleMutations]);\n    }\n\n    private _onContextMenu = (e: React.MouseEvent<any>) => {\n        if (this.props.onContextMenu) {\n            this.props.onContextMenu(e);\n        }\n    };\n\n    private _onMouseDown = (e: React.SyntheticEvent<any>) => {\n        if (this.props.disabled) {\n            return;\n        }\n\n        this._isMouseOver = true;\n        if (this.props.onPressIn) {\n            this.props.onPressIn(e);\n        }\n\n        if (this.props.onLongPress) {\n            this._lastMouseDownEvent = e;\n            e.persist();\n\n            // In the unlikely event we get 2 mouse down events, clear existing timer\n            if (this._longPressTimer) {\n                Timers.clearTimeout(this._longPressTimer);\n            }\n            this._longPressTimer = Timers.setTimeout(() => {\n                this._longPressTimer = undefined;\n                if (this.props.onLongPress) {\n                    // lastMouseDownEvent can never be undefined at this point\n                    this.props.onLongPress(this._lastMouseDownEvent!);\n\n                    if ('touches' in e) {\n                        this._ignoreTouchEnd = true;\n                    } else {\n                        this._ignoreClick = true;\n                    }\n                }\n            }, this.props.delayLongPress || _longPressTime);\n        }\n    };\n\n    private _onTouchMove = (e: React.SyntheticEvent<HTMLButtonElement, TouchEvent>) => {\n        const buttonRect = (e.target as HTMLButtonElement).getBoundingClientRect();\n        const wasMouseOver = this._isMouseOver;\n        const isMouseOver =\n            e.nativeEvent.touches[0].clientX > buttonRect.left &&\n            e.nativeEvent.touches[0].clientX < buttonRect.right &&\n            e.nativeEvent.touches[0].clientY > buttonRect.top &&\n            e.nativeEvent.touches[0].clientY < buttonRect.bottom;\n\n        // Touch has left the button, cancel the longpress handler.\n        if (wasMouseOver && !isMouseOver) {\n            if (this._longPressTimer) {\n                clearTimeout(this._longPressTimer);\n            }\n            if (this.props.onHoverEnd) {\n                this.props.onHoverEnd(e);\n            }\n        }\n        this._isMouseOver = isMouseOver;\n    };\n\n    private _onMouseUp = (e: Types.SyntheticEvent | Types.TouchEvent) => {\n        if (!this.props.disabled && this.props.onPressOut) {\n            this.props.onPressOut(e);\n        }\n\n        if (this._longPressTimer) {\n            Timers.clearTimeout(this._longPressTimer);\n        }\n    };\n\n    /**\n     * Case where onPressOut is not triggered and the bubbling is canceled:\n     * 1- Long press > release\n     *\n     * Cases where onPressOut is triggered:\n     * 2- Long press > leave button > release touch\n     * 3- Tap\n     *\n     * All other cases: onPressOut is not triggered and the bubbling is NOT canceled:\n     */\n    private _onTouchEnd = (e: Types.SyntheticEvent | Types.TouchEvent) => {\n        if (this._isMouseOver && this._ignoreTouchEnd) {\n            /* 1 */\n            e.stopPropagation();\n        } else if (\n            /* 2 */\n            !this._isMouseOver && this._ignoreTouchEnd ||\n            /* 3 */\n            this._isMouseOver && !this._ignoreTouchEnd\n        ) {\n            if ('touches' in e) {\n                // Stop the to event sequence to prevent trigger button.onMouseDown\n                e.preventDefault();\n                if (this.props.onPress) {\n                    this.props.onPress(e);\n                }\n            }\n\n            if (this.props.onPressOut) {\n                this.props.onPressOut(e);\n            }\n        }\n\n        this._ignoreTouchEnd = false;\n\n        if (this._longPressTimer) {\n            Timers.clearTimeout(this._longPressTimer);\n        }\n    };\n\n    private _onMouseEnter = (e: Types.SyntheticEvent) => {\n        this._isMouseOver = true;\n        this._onHoverStart(e);\n    };\n\n    private _onMouseLeave = (e: Types.SyntheticEvent) => {\n        this._isMouseOver = false;\n        this._onHoverEnd(e);\n\n        // The mouse is still down. A long press may be just happened. Re-enable the next click.\n        this._ignoreClick = false;\n\n        // Cancel longpress if mouse has left.\n        if (this._longPressTimer) {\n            Timers.clearTimeout(this._longPressTimer);\n        }\n    };\n\n    // When we get focus on an element, show the hover effect on the element.\n    // This ensures that users using keyboard also get the similar experience as mouse users for accessibility.\n    private _onFocus = (e: Types.FocusEvent) => {\n        this._isFocusedWithKeyboard = UserInterface.isNavigatingWithKeyboard();\n        this._onHoverStart(e);\n\n        if (this.props.onFocus) {\n            this.props.onFocus(e);\n        }\n    };\n\n    private _onBlur = (e: Types.FocusEvent) => {\n        this._isFocusedWithKeyboard = false;\n        this._onHoverEnd(e);\n\n        if (this.props.onBlur) {\n            this.props.onBlur(e);\n        }\n    };\n\n    private _onHoverStart = (e: Types.SyntheticEvent) => {\n        if (!this._isHoverStarted && (this._isMouseOver || this._isFocusedWithKeyboard)) {\n            this._isHoverStarted = true;\n\n            if (this.props.onHoverStart) {\n                this.props.onHoverStart(e);\n            }\n        }\n    };\n\n    private _onHoverEnd = (e: Types.SyntheticEvent) => {\n        if (this._isHoverStarted && !this._isMouseOver && !this._isFocusedWithKeyboard) {\n            this._isHoverStarted = false;\n\n            if (this.props.onHoverEnd) {\n                this.props.onHoverEnd(e);\n            }\n        }\n    };\n}\n\napplyFocusableComponentMixin(Button);\n\nexport default Button;\n"
  },
  {
    "path": "src/web/Clipboard.ts",
    "content": "/**\n * Clipboard.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Clipboard abstraction.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class Clipboard extends RX.Clipboard {\n    setText(text: string): void {\n        const node = Clipboard._createInvisibleNode();\n        node.value = text;\n\n        document.body.appendChild(node);\n        Clipboard._copyNode(node);\n        document.body.removeChild(node);\n    }\n\n    getText(): Promise<string> {\n        // Not supported in web platforms. This should can be only handled\n        // in the paste event handlers.\n        return Promise.reject<string>('Not supported on web');\n    }\n\n    private static _createInvisibleNode(): HTMLTextAreaElement {\n        const node = document.createElement('textarea');\n        node.style.position = 'absolute';\n        node.style.left = '-10000px';\n        node.style.width = '10px';\n\n        // Use the same vertical position as the current page\n        // to avoid scrolling on iOS Safari.\n        const yPosition = window.pageYOffset || document.documentElement.scrollTop;\n        node.style.top = yPosition + 'px';\n\n        node.readOnly = true;\n\n        return node;\n    }\n\n    private static _copyNode(node: HTMLTextAreaElement): void {\n        node.select();\n        node.setSelectionRange(0, node.value.length);\n\n        document.execCommand('copy');\n\n        const selection = window.getSelection();\n        if (selection) {\n            selection.removeAllRanges();\n        }\n    }\n}\n\nexport default new Clipboard();\n"
  },
  {
    "path": "src/web/CustomScrollbar.ts",
    "content": "/**\n * CustomScrollbar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Custom scrollbar implementation for web.\n */\n\nimport * as React from 'react';\n\nimport assert from '../common/assert';\nimport Timers from '../common/utils/Timers';\n\nconst UNIT = 'px';\nconst SCROLLER_MIN_SIZE = 15;\nconst SCROLLER_NEGATIVE_MARGIN = 30;\nconst NEUTRAL_OVERRIDE_CLASS = 'neutraloverride';\n\ninterface ScrollbarInfo {\n    size?: number;\n    scrollSize?: number;\n    scroll2Slider?: number;\n    slider2Scroll?: number;\n    sliderSize?: number;\n    dragOffset?: number;\n    rail?: HTMLElement;\n    slider?: HTMLElement;\n}\n\nexport interface ScrollbarOptions {\n    horizontal?: boolean;\n    vertical?: boolean;\n    hiddenScrollbar?: boolean;\n}\n\nlet _nativeSrollBarWidth = -1;\nlet _isStyleSheetInstalled = false;\nconst _customScrollbarCss = `\n    .rxCustomScroll .scrollViewport > * {\n        box-sizing: border-box;\n        display: block;\n    }\n    .rxCustomScroll .rail {\n        position: absolute;\n        border-radius: 4px;\n        opacity: 0;\n        background-color: transparent;\n        transition-delay: 0, 0;\n        transition-duration: .2s, .2s;\n        transition-property: background-color, opacity;\n        transition-timing-function: linear, linear;\n        display: none;\n        box-sizing: border-box;\n    }\n    .rxCustomScroll .rail:hover {\n        background-color: #EEE;\n        border-color: #EEE;\n        opacity: .9;\n        border-radius: 6px;\n    }\n    .rxCustomScroll .rail:hover .slider {\n        border-radius: 6px;\n    }\n    .rxCustomScroll .rail .slider {\n        position: absolute;\n        border-radius: 4px;\n        background: #555;\n        box-sizing: border-box;\n        border: 1px solid #555;\n    }\n    .rxCustomScroll:not(.neutraloverride) > .scrollViewportV > * {\n        margin-right: em(-17px) !important;\n    }\n    .rxCustomScroll .railV {\n        top: 0;\n        bottom: 0;\n        right: 3px;\n        width: 8px;\n    }\n    .rxCustomScroll .railV .slider {\n        top: 10px;\n        width: 8px;\n        min-height: 15px;\n    }\n    .rxCustomScroll .railV.railBoth {\n        bottom: 15px;\n    }\n    .rxCustomScroll .railH {\n        left: 0;\n        right: 0;\n        bottom: 3px;\n        height: 8px;\n    }\n    .rxCustomScroll .railH .slider {\n        left: 10px;\n        top: -1px;\n        height: 8px;\n        min-width: 15px;\n    }\n    .rxCustomScroll .railH.railBoth {\n        right: 15px;\n    }\n    .rxCustomScroll.active .rail {\n        display: block;\n    }\n    .rxCustomScroll:hover .rail {\n        opacity: .6;\n    }\n    .rxCustomScroll:hover .rail .slider {\n        background: #AAA;\n        border-color: #AAA;\n    }\n    .rxCustomScroll.rxCustomScrollH {\n        width: auto;\n    }\n    .rxCustomScroll.rxCustomScrollV {\n        width: 100%;\n    }\n    .rxCustomScroll.scrolling .rail {\n        background-color: #EEE;\n        border-color: #EEE;\n        opacity: .9;\n        border-radius: 6px;\n    }\n    .rxCustomScroll.scrolling .rail .slider {\n        border-radius: 6px;\n        background: #AAA;\n        border-color: #AAA;\n    }\n    .rxCustomScroll.scrolling .scrollViewport > * {\n        pointer-events: none !important;\n    }\n    .rxCustomScroll.scrolling .railV {\n        width: 12px;\n    }\n    .rxCustomScroll.scrolling .railV .slider {\n        width: 12px;\n    }\n    .rxCustomScroll.scrolling .railH {\n        height: 12px;\n    }\n    .rxCustomScroll.scrolling .railH .slider {\n        height: 12px;\n    }\n    .rxCustomScroll .railV:hover {\n        width: 12px;\n    }\n    .rxCustomScroll .railV:hover .slider {\n        width: 12px;\n    }\n    .rxCustomScroll .railH:hover {\n        height: 12px;\n    }\n    .rxCustomScroll .railH:hover .slider {\n        height: 12px;\n    }\n`;\n\nexport class Scrollbar {\n    private _container: HTMLElement;\n    private _verticalBar: ScrollbarInfo = {};\n    private _horizontalBar: ScrollbarInfo = {};\n    // Viewport will always be initialized before it's used\n    private _viewport!: HTMLElement;\n    private _dragging = false;\n    private _dragIsVertical = false;\n    private _scrollingVisible = false;\n    private _hasHorizontal = false;\n    private _hasVertical = true;\n    private _hasHiddenScrollbar = false;\n    private _stopDragCallback = this._stopDrag.bind(this);\n    private _startDragVCallback = this._startDrag.bind(this, true);\n    private _startDragHCallback = this._startDrag.bind(this, false);\n    private _handleDragCallback = this._handleDrag.bind(this);\n    private _handleWheelCallback = this._handleWheel.bind(this);\n    private _handleMouseDownCallback = this._handleMouseDown.bind(this);\n    private _updateCallback = this.update.bind(this);\n    private _asyncInitTimer: number | undefined;\n\n    static getNativeScrollbarWidth(): number {\n        // Have we cached the value alread?\n        if (_nativeSrollBarWidth >= 0) {\n            return _nativeSrollBarWidth;\n        }\n\n        const inner = document.createElement('p');\n        inner.style.width = '100%';\n        inner.style.height = '100%';\n\n        const outer = document.createElement('div');\n        outer.style.position = 'absolute';\n        outer.style.top = '0';\n        outer.style.left = '0';\n        outer.style.visibility = 'hidden';\n        outer.style.width = '100px';\n        outer.style.height = '100px';\n        outer.style.overflow = 'hidden';\n        outer.appendChild(inner);\n\n        document.body.appendChild(outer);\n\n        const w1 = inner.offsetWidth;\n        outer.style.overflow = 'scroll';\n        let w2 = inner.offsetWidth;\n        if (w1 === w2) {\n            w2 = outer.clientWidth;\n        }\n\n        document.body.removeChild(outer);\n\n        _nativeSrollBarWidth = w1 - w2;\n\n        return _nativeSrollBarWidth;\n    }\n\n    private static _installStyleSheet(): void {\n        // Have we installed the style sheet already?\n        if (_isStyleSheetInstalled) {\n            return;\n        }\n\n        // We set the CSS style sheet here to avoid the need\n        // for users of this class to carry along another CSS\n        // file.\n        const head = document.head || document.getElementsByTagName('head')[0];\n        const style = document.createElement('style') as any;\n\n        style.type = 'text/css';\n        if (style.styleSheet) {\n            style.styleSheet.cssText = _customScrollbarCss;\n        } else {\n            style.appendChild(document.createTextNode(_customScrollbarCss));\n        }\n\n        head.appendChild(style);\n        _isStyleSheetInstalled = true;\n    }\n\n    constructor(container: HTMLElement) {\n        assert(container, 'Container must not be null');\n\n        this._container = container;\n    }\n\n    private _tryLtrOverride(): void {\n        const rtlbox = document.createElement('div');\n        rtlbox.style.cssText = 'position: absolute; overflow-y: scroll; width: 30px; visibility: hidden;';\n        rtlbox.innerHTML = '<div class=\"probe\"></div>';\n        this._container.appendChild(rtlbox);\n        const probe = rtlbox.querySelector('.probe')!;\n        const rtlboxRect = rtlbox.getBoundingClientRect();\n        const probeRect = probe.getBoundingClientRect();\n        const isLeftBound = rtlboxRect.left === probeRect.left;\n        const isRightBound = rtlboxRect.right === probeRect.right;\n        const isNeutral = isLeftBound && isRightBound;\n\n        this._container.classList.remove(NEUTRAL_OVERRIDE_CLASS);\n        if (isNeutral) {\n            this._container.classList.add(NEUTRAL_OVERRIDE_CLASS);\n        }\n\n        rtlbox.innerHTML = '';\n        this._container.removeChild(rtlbox);\n    }\n\n    private _prevent(e: React.SyntheticEvent<any>): void {\n        e.preventDefault();\n    }\n\n    private _updateSliders(): void {\n        if (this._hasHorizontal) {\n            // Read from DOM before we write back\n            const newSliderWidth = this._horizontalBar.sliderSize + UNIT;\n            const newSliderLeft = this._viewport.scrollLeft * this._horizontalBar.scroll2Slider! + UNIT;\n            this._horizontalBar.slider!.style.width = newSliderWidth;\n            this._horizontalBar.slider!.style.left = newSliderLeft;\n        }\n\n        if (this._hasVertical) {\n            // Read from DOM before we write back\n            const newSliderHeight = this._verticalBar.sliderSize + UNIT;\n            const newSliderTop = this._viewport.scrollTop * this._verticalBar.scroll2Slider! + UNIT;\n            this._verticalBar.slider!.style.height = newSliderHeight;\n            this._verticalBar.slider!.style.top = newSliderTop;\n        }\n    }\n\n    private _handleDrag(e: React.MouseEvent<any>): void {\n        if (this._dragIsVertical) {\n            this._viewport.scrollTop = (e.pageY - this._verticalBar.dragOffset!) * this._verticalBar.slider2Scroll!;\n        } else {\n            this._viewport.scrollLeft = (e.pageX - this._horizontalBar.dragOffset!) * this._horizontalBar.slider2Scroll!;\n        }\n    }\n\n    private _startDrag(dragIsVertical: boolean, e: React.MouseEvent<any>): void {\n        if (!this._dragging) {\n            window.addEventListener('mouseup', this._stopDragCallback);\n            window.addEventListener('mousemove', this._handleDragCallback);\n            this._container.classList.add('scrolling');\n            if (this._hasHorizontal) {\n                this._horizontalBar.dragOffset = e.pageX - this._horizontalBar.slider!.offsetLeft;\n            }\n            if (this._hasVertical) {\n                this._verticalBar.dragOffset = e.pageY - this._verticalBar.slider!.offsetTop;\n            }\n            this._dragging = true;\n            this._dragIsVertical = dragIsVertical;\n        }\n        this._prevent(e);\n    }\n\n    private _stopDrag(): void {\n        this._container.classList.remove('scrolling');\n        window.removeEventListener('mouseup', this._stopDragCallback);\n        window.removeEventListener('mousemove', this._handleDragCallback);\n        this._dragging = false;\n    }\n\n    private _handleWheel(e: React.WheelEvent<any>): void {\n        // Always prefer the vertical axis if present. User can override with the control key.\n        if (this._hasVertical) {\n            this._viewport.scrollTop = this._normalizeDelta(e) + this._viewport.scrollTop;\n        } else if (this._hasHorizontal) {\n            this._viewport.scrollLeft = this._normalizeDelta(e) + this._viewport.scrollLeft;\n        }\n    }\n\n    private _handleMouseDown(e: React.MouseEvent<HTMLElement>): void {\n        const target = e.currentTarget;\n\n        if (this._dragging || !target) {\n            this._prevent(e);\n            return;\n        }\n\n        if (this._hasVertical) {\n            const eventOffsetY = e.pageY - target.getBoundingClientRect().top;\n            const halfHeight = this._verticalBar.slider!.offsetHeight / 2;\n            const offsetY = (eventOffsetY - this._verticalBar.slider!.offsetTop - halfHeight) * this._verticalBar.slider2Scroll!;\n            this._viewport.scrollTop = offsetY + this._viewport.scrollTop;\n        }\n\n        if (this._hasHorizontal) {\n            const eventOffsetX = e.pageX - target.getBoundingClientRect().left;\n            const halfWidth = this._horizontalBar.slider!.offsetWidth / 2;\n            const offsetX = (eventOffsetX - this._horizontalBar.slider!.offsetLeft - halfWidth) * this._horizontalBar.slider2Scroll!;\n            this._viewport.scrollLeft = offsetX + this._viewport.scrollLeft;\n        }\n    }\n\n    private _normalizeDelta(e: React.WheelEvent<any>): number {\n        if (e.deltaY) {\n            return e.deltaY > 0 ? 100 : -100;\n        }\n        const originalEvent = (e as any).originalEvent;\n        if (originalEvent && originalEvent.wheelDelta) {\n            return originalEvent.wheelDelta;\n        }\n        return 0;\n    }\n\n    private _addListeners(): void {\n        if (this._hasVertical) {\n            this._verticalBar.slider!.addEventListener('mousedown', this._startDragVCallback);\n            this._verticalBar.rail!.addEventListener('wheel', this._handleWheelCallback, { passive: true });\n            this._verticalBar.rail!.addEventListener('mousedown', this._handleMouseDownCallback);\n        }\n\n        if (this._hasHorizontal) {\n            this._horizontalBar.slider!.addEventListener('mousedown', this._startDragHCallback);\n            this._horizontalBar.rail!.addEventListener('wheel', this._handleWheelCallback, { passive: true });\n            this._horizontalBar.rail!.addEventListener('mousedown', this._handleMouseDownCallback);\n        }\n    }\n\n    private _removeListeners(): void {\n        if (this._hasVertical) {\n            this._verticalBar.slider!.removeEventListener('mousedown', this._startDragVCallback);\n            this._verticalBar.rail!.removeEventListener('wheel', this._handleWheelCallback);\n            this._verticalBar.rail!.removeEventListener('mousedown', this._handleMouseDownCallback);\n        }\n\n        if (this._hasHorizontal) {\n            this._horizontalBar.slider!.removeEventListener('mousedown', this._startDragHCallback);\n            this._horizontalBar.rail!.removeEventListener('wheel', this._handleWheelCallback);\n            this._horizontalBar.rail!.removeEventListener('mousedown', this._handleMouseDownCallback);\n        }\n    }\n\n    private _createDivWithClass(className: string): HTMLElement {\n        const div = document.createElement('div');\n        div.setAttribute('role', 'none');\n        div.className = className;\n        return div;\n    }\n\n    private _addScrollBar(scrollbarInfo: ScrollbarInfo, railClass: string, hasBoth: boolean): void {\n        const slider = this._createDivWithClass('slider');\n\n        scrollbarInfo.rail = this._createDivWithClass('rail ' + railClass + (hasBoth ? ' railBoth' : ''));\n        scrollbarInfo.slider = slider;\n        scrollbarInfo.rail.appendChild(slider);\n\n        this._container.appendChild(scrollbarInfo.rail);\n    }\n\n    private _addScrollbars(): void {\n        const containerClass = this._hasVertical ? 'rxCustomScrollV' : 'rxCustomScrollH';\n\n        if (this._hasVertical) {\n            this._addScrollBar(this._verticalBar, 'railV', this._hasHorizontal);\n        }\n\n        if (this._hasHorizontal) {\n            this._addScrollBar(this._horizontalBar, 'railH', this._hasVertical);\n        }\n\n        this._container.classList.add(containerClass);\n        this._container.classList.add('rxCustomScroll');\n        this._viewport = this._container.querySelector('.scrollViewport') as HTMLElement;\n    }\n\n    private _removeScrollbars(): void {\n        if (this._hasVertical) {\n            this._verticalBar.rail!.innerHTML = '';\n            this._container.removeChild(this._verticalBar.rail!);\n        }\n\n        if (this._hasHorizontal) {\n            this._horizontalBar.rail!.innerHTML = '';\n            this._container.removeChild(this._horizontalBar.rail!);\n        }\n    }\n\n    private _calcNewBarSize(bar: ScrollbarInfo, newSize: number, newScrollSize: number, hasBoth: boolean): void {\n        if (hasBoth || this._hasHiddenScrollbar) {\n            newSize -= SCROLLER_NEGATIVE_MARGIN;\n            newScrollSize -= SCROLLER_NEGATIVE_MARGIN - Scrollbar.getNativeScrollbarWidth();\n        }\n\n        if (newScrollSize !== bar.scrollSize || newSize !== bar.size) {\n            bar.size = newSize;\n            bar.scrollSize = newScrollSize;\n            bar.scroll2Slider = newSize / newScrollSize;\n            bar.sliderSize = newSize * bar.scroll2Slider;\n\n            // Don't allow the sliders to overlap.\n            if (hasBoth) {\n                bar.sliderSize = Math.max(bar.sliderSize - SCROLLER_NEGATIVE_MARGIN + Scrollbar.getNativeScrollbarWidth(), 0);\n            }\n\n            if (bar.sliderSize < SCROLLER_MIN_SIZE) {\n                const railRange = newSize - SCROLLER_MIN_SIZE + bar.sliderSize;\n                bar.scroll2Slider = railRange / newScrollSize;\n                bar.slider2Scroll = newScrollSize / railRange;\n            } else {\n                bar.slider2Scroll = newScrollSize / newSize;\n            }\n        }\n    }\n\n    private _resize(): void {\n        if (this._hasHorizontal) {\n            this._calcNewBarSize(this._horizontalBar, this._viewport.offsetWidth, this._viewport.scrollWidth, this._hasVertical);\n        }\n\n        if (this._hasVertical) {\n            this._calcNewBarSize(this._verticalBar, this._viewport.offsetHeight, this._viewport.scrollHeight, this._hasHorizontal);\n        }\n    }\n\n    update(): void {\n        this._resize();\n\n        // We add one below to provide a small fudge factor because browsers round their scroll and offset values to the\n        // nearest integer, and IE sometimes ends up returning a scroll and offset value that are off by one.\n        if ((this._verticalBar && this._verticalBar.scrollSize! > this._verticalBar.size! + 1) ||\n                (this._horizontalBar && this._horizontalBar.scrollSize! > this._horizontalBar.size! + 1)) {\n            this.show();\n            this._updateSliders();\n        } else {\n            this.hide();\n        }\n    }\n\n    show(): void {\n        if (!this._scrollingVisible) {\n            this._container.classList.add('active');\n            this._addListeners();\n            this._scrollingVisible = true;\n        }\n    }\n\n    hide(): void {\n        if (this._scrollingVisible) {\n            this._container.classList.remove('active');\n            this._removeListeners();\n            this._scrollingVisible = false;\n        }\n    }\n\n    init(options?: ScrollbarOptions): void {\n        if (options) {\n            this._hasHorizontal = !!options.horizontal;\n\n            // Only if vertical is explicitly false as opposed to null, set it to false (default is true)\n            if (options.vertical === false) {\n                this._hasVertical = options.vertical;\n            }\n\n            // Our container may be scrollable even if the corresponding scrollbar is hidden (i.e. vertical\n            // or horizontal is false). We have to take it into account when calculating scroll bar sizes.\n            this._hasHiddenScrollbar = !!options.hiddenScrollbar;\n        }\n        Scrollbar._installStyleSheet();\n        this._addScrollbars();\n        this.show();\n        this._container.addEventListener('mouseenter', this._updateCallback);\n\n        // Defer remaining init work to avoid triggering sync layout\n        this._asyncInitTimer = Timers.setTimeout(() => {\n            this._asyncInitTimer = undefined;\n            this._tryLtrOverride();\n            this.update();\n        }, 0);\n    }\n\n    dispose(): void {\n        if (this._asyncInitTimer) {\n            Timers.clearInterval(this._asyncInitTimer);\n            this._asyncInitTimer = undefined;\n        }\n        this._stopDrag();\n        this._container.removeEventListener('mouseenter', this._updateCallback);\n        this.hide();\n        this._removeScrollbars();\n        // release DOM nodes\n        this._container = null!;\n        this._viewport = null!;\n        this._verticalBar = null!;\n        this._horizontalBar = null!;\n    }\n}\n\nexport default Scrollbar;\n"
  },
  {
    "path": "src/web/FrontLayerViewManager.tsx",
    "content": "/**\n * FrontLayerViewManager.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Manages the layering of the main view, modals and popups.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport MouseResponder from './utils/MouseResponder';\nimport { PopupDescriptor, RootView } from './RootView';\n\nconst MAX_CACHED_POPUPS = 4;\n\nexport class FrontLayerViewManager {\n    private _mainView: React.ReactElement<any> | undefined;\n    private _modalStack: { modal: React.ReactElement<Types.ViewProps>; id: string }[] = [];\n\n    private _activePopupOptions: Types.PopupOptions | undefined;\n    private _activePopupId: string | undefined;\n    private _activePopupAutoDismiss = false;\n    private _activePopupAutoDismissDelay = 0;\n    private _activePopupShowDelay = 0;\n    private _popupShowDelayTimer: number | undefined;\n    private _cachedPopups: PopupDescriptor[] = [];\n\n    // We need to be careful accessing document because it may not be defined\n    // in some environments like Electron.\n    private _isRtlDefault = typeof document !== 'undefined' &&\n        typeof document.documentElement !== 'undefined' && document.documentElement.dir === 'rtl';\n    private _isRtlAllowed = true;\n    private _isRtlForced = false;\n\n    setMainView(element: React.ReactElement<any>): void {\n        this._mainView = element;\n        this._renderRootView();\n    }\n\n    isModalDisplayed(modalId?: string): boolean {\n        if (modalId) {\n            return this._modalStack.some(d => d.id === modalId);\n        } else {\n            return this._modalStack.length > 0;\n        }\n    }\n\n    showModal(modal: React.ReactElement<Types.ViewProps>, modalId: string, options?: Types.ModalOptions) {\n        // Dismiss any active popups.\n        if (this._activePopupOptions) {\n            this.dismissPopup(this._activePopupId!);\n        }\n\n        this._modalStack.push({ modal: modal, id: modalId });\n        this._renderRootView();\n    }\n\n    dismissModal(modalId: string) {\n        this._modalStack = this._modalStack.filter(d => d.id !== modalId);\n        this._renderRootView();\n    }\n\n    dismissAllModals() {\n        if (this._modalStack.length > 0) {\n            this._modalStack = [];\n            this._renderRootView();\n        }\n    }\n\n    private _shouldPopupBeDismissed = (options: Types.PopupOptions): boolean => (\n        !!this._activePopupOptions &&\n            this._activePopupOptions.getAnchor() === options.getAnchor()\n    );\n\n    private _updateModalDisplayedState() {\n        MouseResponder.setModalIsDisplayed(this.isModalDisplayed());\n    }\n\n    showPopup(options: Types.PopupOptions, popupId: string, showDelay?: number): boolean {\n        // If options.dismissIfShown is true, calling this method will behave like a toggle.\n        // On one call, it will open the popup. If it is called when pop up is seen, it will\n        // dismiss the popup. If options.dismissIfShown is false, we will simply show the\n        // popup always.\n        if (options.dismissIfShown) {\n            if (this._shouldPopupBeDismissed(options)) {\n                this.dismissPopup(popupId);\n                return false;\n            }\n        }\n\n        this._showPopup(options, popupId, showDelay);\n        return true;\n    }\n\n    private _showPopup(options: Types.PopupOptions, popupId: string, showDelay?: number): void {\n        // New popup is transitioning from maybe cached to active.\n        this._cachedPopups = this._cachedPopups.filter(popup => popup.popupId !== popupId);\n        if (this._activePopupOptions && this._activePopupOptions.cacheable && this._activePopupId !== popupId) {\n            // Old popup is transitioning from active to cached.\n            this._cachedPopups.push({ popupOptions: this._activePopupOptions, popupId: this._activePopupId! });\n            this._cachedPopups = this._cachedPopups.slice(-MAX_CACHED_POPUPS);\n        }\n\n        // Update fields before calling onDismiss to guard against reentry.\n        const oldPopupOptions = this._activePopupOptions;\n        this._activePopupOptions = options;\n        this._activePopupId = popupId;\n        this._activePopupAutoDismiss = false;\n        this._activePopupAutoDismissDelay = 0;\n        this._activePopupShowDelay = showDelay || 0;\n\n        if (this._popupShowDelayTimer) {\n            Timers.clearTimeout(this._popupShowDelayTimer);\n            this._popupShowDelayTimer = undefined;\n        }\n        if (this._activePopupShowDelay > 0) {\n            this._popupShowDelayTimer = Timers.setTimeout(() => {\n                this._activePopupShowDelay = 0;\n                this._popupShowDelayTimer = undefined;\n                this._renderRootView();\n            }, this._activePopupShowDelay);\n        }\n\n        if (oldPopupOptions) {\n            if (oldPopupOptions.onDismiss) {\n                oldPopupOptions.onDismiss();\n            }\n        }\n\n        this._renderRootView();\n    }\n\n    autoDismissPopup(popupId: string, dismissDelay?: number): void {\n        if (popupId === this._activePopupId && this._activePopupOptions) {\n            if (this._popupShowDelayTimer) {\n                Timers.clearTimeout(this._popupShowDelayTimer);\n                this._popupShowDelayTimer = undefined;\n            }\n\n            this._activePopupAutoDismiss = true;\n            this._activePopupAutoDismissDelay = dismissDelay || 0;\n            this._renderRootView();\n        }\n    }\n\n    dismissPopup(popupId: string): void {\n        if (popupId === this._activePopupId && this._activePopupOptions) {\n            if (this._popupShowDelayTimer) {\n                Timers.clearTimeout(this._popupShowDelayTimer);\n                this._popupShowDelayTimer = undefined;\n            }\n\n            if (this._activePopupOptions.cacheable) {\n                // The popup is transitioning from active to cached.\n                this._cachedPopups.push({ popupOptions: this._activePopupOptions, popupId: this._activePopupId });\n                this._cachedPopups = this._cachedPopups.slice(-MAX_CACHED_POPUPS);\n            }\n\n            // Reset fields before calling onDismiss to guard against reentry.\n            const activePopupOptions = this._activePopupOptions;\n            this._activePopupOptions = undefined;\n            this._activePopupId = undefined;\n\n            if (activePopupOptions.onDismiss) {\n                activePopupOptions.onDismiss();\n            }\n\n            this._renderRootView();\n        }\n    }\n\n    dismissAllPopups() {\n        if (this._activePopupId) {\n            this.dismissPopup(this._activePopupId);\n        }\n    }\n\n    private _renderRootView() {\n        const topModal = this._modalStack.length > 0 ?\n            this._modalStack[this._modalStack.length - 1].modal : undefined;\n        const activePopup = (!this._activePopupOptions || this._activePopupShowDelay > 0) ? undefined :\n            { popupOptions: this._activePopupOptions, popupId: this._activePopupId! };\n\n        this._updateModalDisplayedState();\n\n        const rootView = (\n            <RootView\n                mainView={ this._mainView }\n                keyBoardFocusOutline={ this._mainView!.props.keyBoardFocusOutline }\n                mouseFocusOutline={ this._mainView!.props.mouseFocusOutline }\n                modal={ topModal }\n                activePopup={ activePopup }\n                cachedPopup={ this._cachedPopups }\n                autoDismiss={ this._activePopupAutoDismiss }\n                autoDismissDelay={ this._activePopupAutoDismissDelay }\n                onDismissPopup={ () => this.dismissPopup(this._activePopupId!) }\n                writingDirection={ this._isRtlForced ? 'rtl' : (this._isRtlAllowed ? 'auto' : 'ltr') }\n            />\n        );\n\n        const container = document.getElementsByClassName('app-container')[0];\n\n        ReactDOM.render(rootView, container);\n    }\n\n    isPopupDisplayed(popupId?: string): boolean {\n        if (popupId) {\n            return popupId === this._activePopupId;\n        } else {\n            return !!this._activePopupId;\n        }\n    }\n\n    allowRTL(allow: boolean) {\n        if (this._isRtlAllowed !== allow) {\n            this._isRtlAllowed = allow;\n            this._renderRootView();\n        }\n    }\n\n    forceRTL(force: boolean) {\n        if (this._isRtlForced !== force) {\n            this._isRtlForced = force;\n            this._renderRootView();\n        }\n    }\n\n    isRTL(): boolean {\n        return this._isRtlForced || (this._isRtlDefault && this._isRtlAllowed);\n    }\n}\n\nexport default new FrontLayerViewManager();\n"
  },
  {
    "path": "src/web/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform GestureView component.\n * It provides support for the scroll wheel, clicks and double clicks.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport GestureViewCommon, { GestureStatePoint, GestureStatePointVelocity, GestureType, TouchEventBasic,\n    TouchListBasic } from '../common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport { clone } from './utils/lodashMini';\nimport MouseResponder, { MouseResponderSubscription } from './utils/MouseResponder';\nimport Styles from './Styles';\n\n// Cast to any to allow merging of web and RX styles\nconst _styles = {\n    defaultView: {\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflow: 'hidden',\n        alignItems: 'stretch',\n        justifyContent: 'center',\n    } as any,\n};\n\n// Unique to web\nconst _preferredPanRatio = 3;\n\nexport interface GestureViewContext {\n    isInRxMainView?: boolean;\n}\n\nlet _idCounter = 1;\n\ninterface Point2D {\n    x: number;\n    y: number;\n}\n\nexport abstract class GestureView extends GestureViewCommon {\n    private _id = _idCounter++;\n    private _isMounted = false;\n\n    private _container: HTMLElement | null | undefined;\n\n    private _initialTouch: Point2D | undefined;\n    private _ongoingGesture: GestureStatePointVelocity | undefined;\n\n    private _responder: MouseResponderSubscription | undefined;\n\n    private _pendingMouseGestureType = GestureType.None;\n    private _gestureTypeLocked = false;\n\n    static contextTypes: React.ValidationMap<any> = {\n        isInRxMainView: PropTypes.bool,\n    };\n\n    // Get preferred pan ratio for platform.\n    protected _getPreferredPanRatio(): number {\n        return _preferredPanRatio;\n    }\n\n    // Returns the timestamp for the touch event in milliseconds.\n    protected _getEventTimestamp(e: Types.TouchEvent | Types.MouseEvent): number {\n        return e.timeStamp;\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n\n        this._isMounted = false;\n    }\n\n    render() {\n        const ariaRole = AccessibilityUtil.accessibilityTraitToString(this.props.accessibilityTraits);\n        const isAriaHidden = AccessibilityUtil.isHidden(this.props.importantForAccessibility);\n\n        return (\n            <div\n                style={ this._getStyles() }\n                tabIndex={ this.props.tabIndex }\n                ref={ this._setContainerRef }\n                onMouseDown={ this._onMouseDown }\n                onClick={ this._onClick }\n                onWheel={ this._onWheel }\n                onTouchStart={ this._onTouchStart }\n                onTouchMove={ this._onTouchMove }\n                onTouchEnd={ this._onTouchEnd }\n                onFocus={ this.props.onFocus }\n                onBlur={ this.props.onBlur }\n                onKeyPress={ this.props.onKeyPress }\n                role={ ariaRole }\n                aria-label={ this.props.accessibilityLabel }\n                aria-hidden={ isAriaHidden }\n                onContextMenu={ this.props.onContextMenu ? this._sendContextMenuEvent : undefined }\n                data-test-id={ this.props.testId }\n            >\n                { this.props.children }\n            </div>\n        );\n    }\n\n    blur() {\n        const el = this._getContainer();\n        if (el) {\n            el.blur();\n        }\n    }\n\n    focus() {\n        const el = this._getContainer();\n        if (el) {\n            el.focus();\n        }\n    }\n\n    protected _getContainer(): HTMLElement | null {\n        if (!this._isMounted) {\n            return null;\n        }\n        try {\n            return ReactDOM.findDOMNode(this) as HTMLElement | null;\n        } catch {\n            // Handle exception due to potential unmount race condition.\n            return null;\n        }\n    }\n\n    private _createMouseResponder(container: HTMLElement) {\n        this._disposeMouseResponder();\n\n        this._responder = MouseResponder.create({\n            id: this._id,\n            target: container,\n            disableWhenModal: !!this.context.isInRxMainView,\n            shouldBecomeFirstResponder: (event: MouseEvent) => {\n                if (!this.props.onPan && !this.props.onPanHorizontal && !this.props.onPanVertical) {\n                    return false;\n                }\n\n                const boundingRect = this._getGestureViewClientRect();\n                if (!boundingRect) {\n                    return false;\n                }\n\n                const { top, left, bottom, right } = boundingRect;\n                const { clientX, clientY } = event;\n\n                if (clientX >= left && clientX <= right && clientY >= top && clientY <= bottom) {\n                    return true;\n                }\n\n                return false;\n            },\n            onMove: (event: MouseEvent, gestureState: Types.PanGestureState) => {\n                this._pendingMouseGestureType = this._detectGestureType(gestureState);\n                if (this._pendingMouseGestureType !== GestureType.None) {\n                    this._cancelLongPressTimer();\n                }\n\n                this._sendMousePanEvent(gestureState);\n            },\n            onTerminate: (event: MouseEvent, gestureState: Types.PanGestureState) => {\n                this._cancelLongPressTimer();\n\n                this._pendingMouseGestureType = this._detectGestureType(gestureState);\n                this._sendMousePanEvent(gestureState);\n\n                this._pendingMouseGestureType = GestureType.None;\n                this._gestureTypeLocked = false;\n            },\n        });\n    }\n\n    private _disposeMouseResponder() {\n        if (this._responder) {\n            this._responder.dispose();\n            delete this._responder;\n        }\n    }\n\n    private _setContainerRef = (container: HTMLElement | null) => {\n        // safe since div refs resolve into HTMLElement and not react element.\n        this._container = container;\n\n        if (container) {\n            this._createMouseResponder(container);\n        } else {\n            this._disposeMouseResponder();\n        }\n    };\n\n    private _getStyles(): any {\n        const combinedStyles = Styles.combine([_styles.defaultView, this.props.style]);\n\n        let cursorName: string | undefined;\n        switch (this.props.mouseOverCursor) {\n            case Types.GestureMouseCursor.Grab:\n                cursorName = 'grab';\n                break;\n\n            case Types.GestureMouseCursor.Move:\n                cursorName = 'move';\n                break;\n\n            case Types.GestureMouseCursor.Pointer:\n                cursorName = 'pointer';\n                break;\n\n            case Types.GestureMouseCursor.NSResize:\n                cursorName = 'ns-resize';\n                break;\n\n            case Types.GestureMouseCursor.EWResize:\n                cursorName = 'ew-resize';\n                break;\n\n            case Types.GestureMouseCursor.NESWResize:\n                cursorName = 'nesw-resize';\n                break;\n\n            case Types.GestureMouseCursor.NWSEResize:\n                cursorName = 'nwse-resize';\n                break;\n\n            case Types.GestureMouseCursor.NotAllowed:\n                cursorName = 'not-allowed';\n                break;\n\n            case Types.GestureMouseCursor.ZoomIn:\n                cursorName = 'zoom-in';\n                break;\n\n            case Types.GestureMouseCursor.ZoomOut:\n                cursorName = 'zoom-out';\n                break;\n        }\n\n        if (cursorName) {\n            combinedStyles.cursor = cursorName;\n        }\n\n        return combinedStyles;\n    }\n\n    private _onMouseDown = (e: React.MouseEvent<any>) => {\n        if (this.props.onPan || this.props.onPanHorizontal || this.props.onPanVertical) {\n            // Disable mousedown default action that initiates a drag/drop operation and breaks panning with a not-allowed cursor.\n            // https://w3c.github.io/uievents/#mousedown\n            e.preventDefault();\n        }\n\n        if (this.props.onLongPress) {\n            const gsState = this._mouseEventToTapGestureState(e);\n            this._startLongPressTimer(gsState, true);\n        }\n    };\n\n    private _onClick = (e: React.MouseEvent<any>) => {\n        this._cancelLongPressTimer();\n\n        const gsState = this._mouseEventToTapGestureState(e);\n\n        if (!this.props.onDoubleTap) {\n            // If there is no double-tap handler, we can invoke the tap handler immediately.\n            this._sendTapEvent(gsState);\n        } else if (this._isDoubleTap(gsState)) {\n            // This is a double-tap, so swallow the previous single tap.\n            this._cancelDoubleTapTimer();\n            this._sendDoubleTapEvent(gsState);\n        } else {\n            // This wasn't a double-tap. Report any previous single tap and start the double-tap\n            // timer so we can determine whether the current tap is a single or double.\n            this._reportDelayedTap();\n            this._startDoubleTapTimer(gsState);\n        }\n    };\n\n    private _sendContextMenuEvent = (e: React.MouseEvent<any>) => {\n        if (this.props.onContextMenu) {\n            e.preventDefault();\n            e.stopPropagation();\n\n            const tapEvent = this._mouseEventToTapGestureState(e);\n            this.props.onContextMenu(tapEvent);\n        }\n    };\n\n    // The RN and React touch event types are basically identical except that React uses \"clientX/Y\"\n    // and RN uses \"locationX/Y\", so we need to map one to the other.  Unfortunately, due to inertia,\n    // web loses.  So, we need these 3 ugly functions...\n    private static _reactTouchEventToBasic(e: React.TouchEvent<any>): TouchEventBasic {\n        const ne = clone(e) as any as TouchEventBasic;\n        ne.changedTouches = this._mapReactTouchListToBasic(e.changedTouches);\n        ne.targetTouches = this._mapReactTouchListToBasic(e.targetTouches);\n        ne.touches = this._mapReactTouchListToBasic(e.touches);\n        const ft = ne.touches[0];\n        if (ft) {\n            // RN also apparently shims the first touch's location info onto the root touch event\n            ne.pageX = ft.pageX;\n            ne.pageY = ft.pageY;\n            ne.locationX = ft.locationX;\n            ne.locationY = ft.locationY;\n        }\n        return ne;\n    }\n\n    private static _mapReactTouchListToBasic(l: React.TouchList): TouchListBasic {\n        const nl: Types.Touch[] = new Array(l.length);\n        for (let i = 0; i < l.length; i++) {\n            nl[i] = this._mapReactTouchToRx(l[i]);\n        }\n        return nl;\n    }\n\n    private static _mapReactTouchToRx(l: React.Touch): Types.Touch {\n        return {\n            identifier: l.identifier,\n            locationX: l.clientX,\n            locationY: l.clientY,\n            screenX: l.screenX,\n            screenY: l.screenY,\n            clientX: l.clientX,\n            clientY: l.clientY,\n            pageX: l.pageX,\n            pageY: l.pageY,\n        };\n    }\n\n    private _onTouchStart = (e: React.TouchEvent<any>) => {\n        if (!this._initialTouch) {\n            const ft = e.touches[0];\n            this._initialTouch = { x: ft.clientX, y: ft.clientY };\n            this._ongoingGesture = { dx: 0, dy: 0, vx: 0, vy: 0 };\n\n            this._onTouchSeriesStart(GestureView._reactTouchEventToBasic(e));\n        }\n    };\n\n    private _onTouchMove = (e: React.TouchEvent<any>) => {\n        if (!this._initialTouch || !this._ongoingGesture) {\n            return;\n        }\n\n        const ft = e.touches[0];\n        this._ongoingGesture = {\n            dx: ft.clientX - this._initialTouch.x,\n            dy: ft.clientY - this._initialTouch.y,\n            // TODO: calculate velocity?\n            vx: 0,\n            vy: 0,\n        };\n        this._onTouchChange(GestureView._reactTouchEventToBasic(e), this._ongoingGesture);\n    };\n\n    private _onTouchEnd = (e: React.TouchEvent<any>) => {\n        if (!this._initialTouch || !this._ongoingGesture) {\n            return;\n        }\n\n        if (e.touches.length === 0) {\n            this._onTouchSeriesFinished(GestureView._reactTouchEventToBasic(e), this._ongoingGesture);\n            this._initialTouch = undefined;\n            this._ongoingGesture = undefined;\n        }\n    };\n\n    private _detectGestureType = (gestureState: Types.PanGestureState) => {\n        // we need to lock gesture type until it's completed\n        if (this._gestureTypeLocked) {\n            return this._pendingMouseGestureType;\n        }\n\n        this._gestureTypeLocked = true;\n\n        const gsBasic: GestureStatePoint = {\n            dx: gestureState.clientX - gestureState.initialClientX,\n            dy: gestureState.clientY - gestureState.initialClientY,\n        };\n\n        if (this._shouldRespondToPan(gsBasic)) {\n            return GestureType.Pan;\n        } else if (this._shouldRespondToPanVertical(gsBasic)) {\n            return GestureType.PanVertical;\n        } else if (this._shouldRespondToPanHorizontal(gsBasic)) {\n            return GestureType.PanHorizontal;\n        }\n\n        this._gestureTypeLocked = false;\n        return GestureType.None;\n    };\n\n    private _onWheel = (e: React.WheelEvent<any>) => {\n        if (this.props.onScrollWheel) {\n            const clientRect = this._getGestureViewClientRect();\n\n            if (clientRect) {\n                const scrollWheelEvent: Types.ScrollWheelGestureState = {\n                    clientX: e.clientX - clientRect.left,\n                    clientY: e.clientY - clientRect.top,\n                    pageX: e.pageX,\n                    pageY: e.pageY,\n                    scrollAmount: e.deltaY,\n                    timeStamp: e.timeStamp,\n                    isTouch: false,\n                };\n\n                this.props.onScrollWheel(scrollWheelEvent);\n            }\n        }\n    };\n\n    private _sendMousePanEvent = (gestureState: Types.PanGestureState) => {\n        switch (this._pendingMouseGestureType) {\n            case GestureType.Pan:\n                if (this.props.onPan) {\n                    this.props.onPan(gestureState);\n                }\n                break;\n            case GestureType.PanVertical:\n                if (this.props.onPanVertical) {\n                    this.props.onPanVertical(gestureState);\n                }\n                break;\n            case GestureType.PanHorizontal:\n                if (this.props.onPanHorizontal) {\n                    this.props.onPanHorizontal(gestureState);\n                }\n                break;\n\n            default:\n                // do nothing;\n        }\n\n        // we need to clean taps in case there was a pan event in the meantime\n        if (this._pendingMouseGestureType !== GestureType.None) {\n            this._clearLastTap();\n            this._cancelDoubleTapTimer();\n            this._skipNextTap();\n        }\n    };\n\n    protected _getClientXYOffset(): { x: number; y: number } {\n        const rect = this._getGestureViewClientRect();\n        return rect ? { x: rect.left, y: rect.top } : { x: 0, y: 0 };\n    }\n\n    private _getGestureViewClientRect() {\n        return this._container ? this._container.getBoundingClientRect() : null;\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/web/Image.tsx",
    "content": "/**\n * Image.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Image abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport assert from '../common/assert';\nimport { DEFAULT_RESIZE_MODE } from '../common/Image';\nimport { Types } from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\n\nimport * as _ from './utils/lodashMini';\nimport restyleForInlineText from './utils/restyleForInlineText';\nimport Styles from './Styles';\n\nconst _styles = {\n    image: {\n        position: 'absolute',\n        display: 'flex',\n        flexDirection: 'column',\n        opacity: 0,\n        maxWidth: '100%',\n        maxHeight: '100%',\n    },\n    defaultContainer: Styles.createImageStyle({\n        position: 'relative',\n        flex: 0,\n        overflow: 'visible',\n        backgroundColor: 'transparent',\n    }),\n};\n\nexport interface ImageState {\n    showImgTag: boolean;\n    xhrRequest: boolean;\n    displayUrl: string;\n}\n\nexport interface ImageContext {\n    isRxParentAText?: boolean;\n}\n\ninterface XhrBlobUrlCacheEntry {\n    xhrBlobUrl: string;\n    insertionDate: number;\n    refCount: number;\n}\n\nclass XhrBlobUrlCache {\n    // Use a global cache to work around the image loading delays introduced by the xhr requests. This is especially\n    // visible when scrolling a virtual list view which contains xhr images.\n    private static _maximumItems = 128;\n    private static _cachedXhrBlobUrls: { [source: string]: XhrBlobUrlCacheEntry } = {};\n\n    static get(source: string): string | undefined {\n        if (this._cachedXhrBlobUrls[source]) {\n            this._cachedXhrBlobUrls[source].refCount++;\n\n            return this._cachedXhrBlobUrls[source].xhrBlobUrl;\n        }\n\n        return undefined;\n    }\n\n    static insert(source: string, xhrBlobUrl: string) {\n        XhrBlobUrlCache._cleanupIfCapacityExceeded();\n\n        if (this._cachedXhrBlobUrls[source]) {\n            XhrBlobUrlCache._cachedXhrBlobUrls[source].refCount++;\n        } else {\n            const xhrBlobUrlCacheEntry: XhrBlobUrlCacheEntry = {\n                xhrBlobUrl: xhrBlobUrl,\n                insertionDate: Date.now(),\n                refCount: 1,\n            };\n\n            XhrBlobUrlCache._cachedXhrBlobUrls[source] = xhrBlobUrlCacheEntry;\n        }\n    }\n\n    static release(source: string) {\n        // Keep track of which cache entries are being used as we don't want to clean up a resource that someone is\n        // still relying on.\n        if (this._cachedXhrBlobUrls[source]) {\n            XhrBlobUrlCache._cachedXhrBlobUrls[source].refCount--;\n        }\n    }\n\n    private static _cleanupIfCapacityExceeded() {\n        // If we've reached maximum capacity, clean up the oldest freeable cache entry if any. An entry is freeable is\n        // it's not currently in use (refCount == 0). Return whether we have room to add more entries to the cache.\n        if (Object.keys(XhrBlobUrlCache._cachedXhrBlobUrls).length + 1 > XhrBlobUrlCache._maximumItems) {\n            let oldestFreeableKey: string | undefined;\n            let oldestFreeableEntry: XhrBlobUrlCacheEntry | undefined;\n\n            Object.keys(XhrBlobUrlCache._cachedXhrBlobUrls).forEach(key => {\n                if ((!oldestFreeableEntry || XhrBlobUrlCache._cachedXhrBlobUrls[key].insertionDate < oldestFreeableEntry.insertionDate) &&\n                    XhrBlobUrlCache._cachedXhrBlobUrls[key].refCount === 0) {\n                    oldestFreeableKey = key;\n                    oldestFreeableEntry = XhrBlobUrlCache._cachedXhrBlobUrls[key];\n                }\n            });\n\n            if (oldestFreeableKey) {\n                URL.revokeObjectURL(oldestFreeableEntry!.xhrBlobUrl);\n                delete XhrBlobUrlCache._cachedXhrBlobUrls[oldestFreeableKey];\n            }\n        }\n    }\n}\n\nexport class Image extends React.Component<Types.ImageProps, ImageState> {\n    static contextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool,\n    };\n\n    // Provided by super, just re-typing here\n    context!: ImageContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n    };\n\n    private _mountedComponent: HTMLImageElement | null = null;\n\n    getChildContext() {\n        // Let descendant RX components know that their nearest RX ancestor is not an RX.Text.\n        // Because they're in an RX.Image, they should use their normal styling rather than their\n        // special styling for appearing inline with text.\n        return { isRxParentAText: false };\n    }\n\n    static prefetch(url: string): Promise<boolean> {\n        const defer = new Defer<boolean>();\n\n        const img = new window.Image();\n\n        img.onload = ((event: Event) => {\n            defer.resolve(true);\n        });\n\n        img.onerror = ((event: Event) => {\n            defer.reject('Failed to prefetch url ' + url);\n        });\n\n        img.onabort = ((event: Event) => {\n            defer.reject('Prefetch cancelled for url ' + url);\n        });\n        img.src = url;\n\n        return defer.promise();\n    }\n\n    static getMetadata(url: string): Promise<Types.ImageMetadata> {\n        const defer = new Defer<Types.ImageMetadata>();\n\n        const img = new window.Image();\n\n        img.onload = ((event: Event) => {\n            defer.resolve({\n                width: img.naturalWidth,\n                height: img.naturalHeight,\n            });\n        });\n\n        img.onerror = ((event: Event) => {\n            defer.reject('Failed to prefetch url ' + url);\n        });\n\n        img.onabort = ((event: Event) => {\n            defer.reject('Prefetch cancelled for url ' + url);\n        });\n        img.src = url;\n\n        return defer.promise();\n    }\n\n    private _isMounted = false;\n    private _nativeImageWidth: number | undefined;\n    private _nativeImageHeight: number | undefined;\n\n    constructor(props: Types.ImageProps) {\n        super(props);\n\n        const performXhrRequest = this._initializeAndSetState(props, true);\n\n        if (performXhrRequest) {\n            this._startXhrImageFetch(props);\n        }\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.ImageProps) {\n        const sourceOrHeaderChanged = (nextProps.source !== this.props.source ||\n            !_.isEqual(nextProps.headers || {}, this.props.headers || {}));\n\n        if (!nextProps.onLoad !== !this.props.onLoad || !nextProps.onError !== !this.props.onError || sourceOrHeaderChanged) {\n            const performXhrRequest = this._initializeAndSetState(nextProps, false);\n\n            if (sourceOrHeaderChanged && performXhrRequest) {\n                this._startXhrImageFetch(nextProps);\n            }\n        }\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n        if (this.state.displayUrl && this.state.xhrRequest) {\n            XhrBlobUrlCache.release(this.props.source);\n        }\n    }\n\n    private _initializeAndSetState(props: Types.ImageProps, initial: boolean): boolean {\n        // Retrieve the xhr blob url from the cache if it exists. This is a performance optimization as we've seen xhr\n        // requests take some time and cause flicker during rendering. Even when we're hitting the browser cache, we've\n        // seen it stall and take some time.\n        const cachedXhrBlobUrl = props.headers ? XhrBlobUrlCache.get(props.source) : null;\n        const displayUrl = cachedXhrBlobUrl ? cachedXhrBlobUrl :\n            props.headers ? '' : props.source;\n\n        // Only make the xhr request if headers are specified and there was no cache hit.\n        const performXhrRequest = !!props.headers && !cachedXhrBlobUrl;\n\n        // We normally don't show an img tag because we use background images.  However, if the caller has supplied an\n        // onLoad or onError callback, we'll use the img tag until we receive an onLoad or onError.  But if we need to\n        // perform an XHR first to convert to a blob url, then wait on showing the img tag until we get the blob url\n        // since the basic IMG tag will fail to load it without headers.\n        const newState: ImageState = {\n            showImgTag: (!performXhrRequest || !!cachedXhrBlobUrl) && (!!props.onLoad || !!props.onError),\n            xhrRequest: !!props.headers,\n            displayUrl: displayUrl,\n        };\n        if (initial) {\n            this.state = newState;\n        } else {\n            this.setState(newState);\n        }\n\n        return performXhrRequest;\n    }\n\n    private _handleXhrBlob(blob: Blob) {\n        if (!this._isMounted) {\n            return;\n        }\n\n        const newUrl = URL.createObjectURL(blob);\n\n        // Save the newly fetched xhr blob url in the cache.\n        XhrBlobUrlCache.insert(this.props.source, newUrl);\n\n        this.setState({\n            displayUrl: newUrl,\n\n            // If we have an onload handler, we need to now load the img tag to get dimensions for the load.\n            showImgTag: !!this.props.onLoad,\n        });\n    }\n\n    private _startXhrImageFetch(props: Types.ImageProps) {\n        // Test hook to simulate a slower hxr request.\n        // Timers.setTimeout(() => this._actuallyStartXhrImageFetch(props), 2500);\n        this._actuallyStartXhrImageFetch(props);\n    }\n\n    private _actuallyStartXhrImageFetch(props: Types.ImageProps) {\n        // Fetch Implementation\n\n        // If an 'origin' header is passed, we assume this is intended to be a crossorigin request.\n        // In order to send the cookies with the request, the withCredentials: true / credentials: 'include' flag needs to be set.\n        const withCredentials = props.headers\n            && Object.keys(props.headers).some(header => header.toLowerCase() === 'origin');\n\n        if (window.fetch) {\n            const headers = new Headers();\n\n            if (props.headers) {\n                Object.keys(props.headers).forEach(key => {\n                    headers.append(key, props.headers![key]);\n                });\n            }\n\n            const xhr = new Request(props.source, {\n                credentials: withCredentials ? 'include' : 'same-origin',\n                method: 'GET',\n                mode: 'cors',\n                headers,\n            });\n\n            fetch(xhr)\n                .then(response => {\n                    if (!response.ok) {\n                        this._onError(new Error(response.statusText));\n                    }\n\n                    return response.blob().then(blob => {\n                        this._handleXhrBlob(blob);\n                    });\n                }, (err: Error) => {\n                    this._onError(err);\n                });\n        } else {\n            const req = new XMLHttpRequest();\n            req.open('GET', props.source, true);\n            if (withCredentials) {\n                req.withCredentials = true;\n            }\n            req.responseType = 'blob';\n            if (props.headers) {\n                Object.keys(props.headers).forEach(key => {\n                    req.setRequestHeader(key, props.headers![key]);\n                });\n            }\n\n            req.onload = () => {\n                if (req.status >= 400 || req.status < 600) {\n                    this._onError(new Error(req.statusText));\n                } else {\n                    this._handleXhrBlob(req.response as Blob);\n                }\n            };\n\n            req.onerror = () => {\n                this._onError(new Error('Network issue downloading the image.'));\n            };\n\n            req.send();\n        }\n    }\n\n    render() {\n        const { source } = this.props;\n        const isSourceValid = !(typeof source !== 'string' && typeof source !== 'undefined');\n\n        // Prepare image source (necessary as iOS implementation also allows objects)\n        assert(isSourceValid, `Types/web/Image only accepts string sources! You passed: ${ source } of type ${ typeof source }`);\n\n        let optionalImg: JSX.Element | null = null;\n        if (this.state.showImgTag) {\n            optionalImg = (\n                <img\n                    style={ _styles.image as any }\n                    src={ this.state.displayUrl }\n                    alt={ this.props.accessibilityLabel }\n                    onError={ this._imgOnError }\n                    onLoad={ this._onLoad }\n                    ref={ this._onMount }\n                />\n            );\n        }\n\n        const reactElement = (\n            <div\n                style={ this._getStyles() }\n                title={ this.props.title }\n                data-test-id={ this.props.testId }\n                onMouseUp={ this._onMouseUp }\n            >\n                { optionalImg }\n                { this.props.children }\n            </div>\n        );\n\n        return this.context.isRxParentAText ?\n            restyleForInlineText(reactElement) :\n            reactElement;\n    }\n\n    protected _onMount = (component: HTMLImageElement | null) => {\n        this._mountedComponent = component;\n    };\n\n    private _getStyles(): React.CSSProperties {\n        const { resizeMode } = this.props;\n        const styles = (Styles.combine([_styles.defaultContainer, this.props.style]) || {}) as React.CSSProperties;\n\n        const backgroundRepeat = resizeMode === 'repeat' ? 'repeat' : 'no-repeat';\n        const backgroundSize = this._buildBackgroundSize(resizeMode);\n\n        // It is necessary to wrap the url in quotes as in url(\"a.jpg?q=(a and b)\").\n        // If the url is unquoted and contains paranthesis, e.g. a.jpg?q=(a and b), it will become url(a.jpg?q=(a and b))\n        // which will not render on the screen.\n        const backgroundImage = `url(\"${ this.state.displayUrl }\")`;\n\n        // Types doesn't support border styles other than \"solid\" for images.\n        const borderStyle = styles.borderWidth ? 'solid' : 'none';\n\n        return {\n            ...styles,\n            backgroundPosition: 'center center',\n            backgroundRepeat,\n            backgroundImage,\n            backgroundSize,\n            borderStyle,\n            display: 'flex',\n        };\n    }\n\n    private _buildBackgroundSize(resizeMode: Types.ImageResizeMode = DEFAULT_RESIZE_MODE): string {\n        switch (resizeMode) {\n            case 'repeat':\n                return 'auto';\n\n            case 'stretch':\n                return '100% 100%';\n\n            // contain | cover | auto are valid BackgroundSize values\n            case 'contain':\n            case 'cover':\n            case 'auto':\n                return resizeMode as string;\n\n            // Prevents unknown resizeMode values\n            default:\n                return DEFAULT_RESIZE_MODE as string;\n        }\n    }\n\n    private _onLoad = () => {\n        if (!this._isMounted || !this._mountedComponent) {\n            return;\n        }\n\n        const imageDOM = this._mountedComponent;\n\n        // Measure the natural width & height of the image.\n        this._nativeImageWidth = undefined;\n        this._nativeImageHeight = undefined;\n\n        this._nativeImageWidth = imageDOM.naturalWidth;\n        this._nativeImageHeight = imageDOM.naturalHeight;\n\n        // We can hide the img now. We assume that if the img. URL resolved without error,\n        // then the background img. URL also did.\n        this.setState({\n            showImgTag: false,\n        });\n\n        if (this.props.onLoad) {\n            this.props.onLoad({ width: this._nativeImageWidth, height: this._nativeImageHeight });\n        }\n    };\n\n    private _imgOnError = () => {\n        this._onError();\n    };\n\n    private _onError(err?: Error) {\n        if (!this._isMounted) {\n            return;\n        }\n\n        // We can hide the img now. We assume that if the img. URL failed to resolve,\n        // then the background img. URL also did.\n        this.setState({\n            showImgTag: false,\n        });\n\n        if (this.props.onError) {\n            this.props.onError(err);\n        }\n    }\n\n    private _onMouseUp = (e: React.MouseEvent<any>) => {\n        if (e.button === 0) {\n            // Types.Image doesn't officially support an onClick prop, but when it's\n            // contained within a button, it may have this prop.\n            const onClick: (e: Types.MouseEvent) => void = (this.props as any).onClick;\n            if (onClick) {\n                onClick(e);\n            }\n        }\n    };\n\n    // Note: This works only if you have an onLoaded handler and wait for the image to load.\n    getNativeWidth(): number | undefined {\n        return this._nativeImageWidth;\n    }\n\n    getNativeHeight(): number | undefined {\n        return this._nativeImageHeight;\n    }\n}\n\nexport default Image;\n"
  },
  {
    "path": "src/web/Input.ts",
    "content": "/**\n * Input.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web implementation of Input interface.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class Input extends RX.Input {\n    dispatchKeyDown(e: RX.Types.KeyboardEvent): void {\n        this.keyDownEvent.fire(e);\n    }\n\n    dispatchKeyUp(e: RX.Types.KeyboardEvent): void {\n        if (this.keyUpEvent.fire(e)) {\n            e.stopPropagation();\n        }\n    }\n}\n\nexport default new Input();\n"
  },
  {
    "path": "src/web/International.ts",
    "content": "/**\n * International.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation for i18n.\n */\n\nimport * as RX from '../common/Interfaces';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\n\nexport class International implements RX.International {\n    allowRTL(allow: boolean): void {\n        FrontLayerViewManager.allowRTL(allow);\n    }\n\n    forceRTL(force: boolean): void {\n        FrontLayerViewManager.forceRTL(force);\n    }\n\n    isRTL(): boolean {\n        return FrontLayerViewManager.isRTL();\n    }\n}\n\nexport default new International();\n"
  },
  {
    "path": "src/web/Link.tsx",
    "content": "/**\n * Link.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Link abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Types } from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport { applyFocusableComponentMixin } from './utils/FocusManager';\nimport Styles from './Styles';\n\nconst _styles = {\n    defaultStyle: {\n        overflowWrap: 'break-word',\n        msHyphens: 'auto',\n        overflow: 'hidden',\n        flexShrink: 0,\n        flexGrow: 0,\n        position: 'relative',\n        display: 'inline',\n        cursor: 'pointer',\n    },\n    ellipsis: {\n        textOverflow: 'ellipsis',\n        whiteSpace: 'pre',\n        msHyphens: 'none',\n    },\n    selectable: {\n        WebkitUserSelect: 'text',\n        MozUserSelect: 'text',\n        msUserSelect: 'text',\n        userSelect: 'text',\n    },\n};\n\nconst _longPressTime = 1000;\n\nexport interface LinkContext {\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class Link extends React.Component<Types.LinkProps, Types.Stateless> {\n    static contextTypes = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: LinkContext;\n\n    private _mountedAnchor: HTMLAnchorElement | null = null;\n    private _longPressTimer: number | undefined;\n\n    render() {\n        // SECURITY WARNING:\n        //   Note the use of rel='noreferrer'\n        //   Destroy the back-link to this window. Otherwise the (untrusted) URL we are about to load can redirect OUR window.\n        //   See: https://mathiasbynens.github.io/rel-noopener/\n        return (\n            <a\n                ref={ this._onMount }\n                style={ this._getStyles() }\n                title={ this.props.title }\n                href={ this.props.url }\n                target={ '_blank' }\n                rel={ 'noreferrer' }\n                onClick={ this._onClick }\n                onMouseEnter={ this.props.onHoverStart }\n                onMouseLeave={ this.props.onHoverEnd }\n                onMouseDown={ this._onMouseDown }\n                onMouseUp={ this._onMouseUp }\n                tabIndex={ this.props.tabIndex }\n                onContextMenu={ this.props.onContextMenu ? this._onContextMenu : undefined }\n                data-test-id={ this.props.testId }\n            >\n                { this.props.children }\n            </a>\n        );\n    }\n\n    componentDidMount() {\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._mountedAnchor !== null,\n        );\n    }\n\n    focus() {\n        if (this._mountedAnchor) {\n            this._mountedAnchor.focus();\n        }\n    }\n\n    blur() {\n        if (this._mountedAnchor) {\n            this._mountedAnchor.blur();\n        }\n    }\n\n    private _onMount = (ref: HTMLAnchorElement | null) => {\n        this._mountedAnchor = ref;\n    };\n\n    private _getStyles(): React.CSSProperties {\n        // There's no way in HTML to properly handle numberOfLines > 1,\n        //  but we can correctly handle the common case where numberOfLines is 1.\n        const ellipsisStyles = this.props.numberOfLines === 1 ? _styles.ellipsis : {};\n        const selectableStyles = this.props.selectable ? _styles.selectable : {};\n\n        return Styles.combine([ _styles.defaultStyle, ellipsisStyles, this.props.style, selectableStyles ]) as React.CSSProperties;\n    }\n\n    private _onClick = (e: React.MouseEvent<any>) => {\n        e.stopPropagation();\n\n        if (this.props.onPress) {\n            e.preventDefault();\n            this.props.onPress(e, this.props.url);\n        }\n    };\n\n    private _onMouseDown = (e: React.SyntheticEvent<any>) => {\n        if (this.props.onLongPress) {\n            e.persist();\n\n            this._longPressTimer = Timers.setTimeout(() => {\n                this._longPressTimer = undefined;\n\n                const mouseEvent = e as React.MouseEvent<any>;\n                // Ignore right mouse button for long press. Context menu will\n                // be always displayed on mouseUp no matter the press length.\n                if (this.props.onLongPress && mouseEvent.button !== 2) {\n                    this.props.onLongPress(e, this.props.url);\n                }\n            }, _longPressTime);\n        }\n    };\n\n    private _onMouseUp = (e: Types.SyntheticEvent) => {\n        if (this._longPressTimer) {\n            Timers.clearTimeout(this._longPressTimer);\n            this._longPressTimer = undefined;\n        }\n    };\n\n    private _onContextMenu = (e: React.MouseEvent<any>) => {\n        if (this.props.onContextMenu) {\n            e.stopPropagation();\n            e.preventDefault();\n            this.props.onContextMenu(e);\n        }\n    };\n}\n\napplyFocusableComponentMixin(Link);\n\nexport default Link;\n"
  },
  {
    "path": "src/web/Linking.ts",
    "content": "/**\n * Linking.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation for deep linking\n */\n\nimport { Types } from '../common/Interfaces';\nimport { Linking as CommonLinking } from '../common/Linking';\n\nexport class Linking extends CommonLinking {\n    protected _openUrl(url: string): Promise<void> {\n        const otherWindow = window.open();\n        if (!otherWindow) {\n            // window opening was blocked by browser (probably not\n            // invoked in direct reaction to user action, like thru\n            // promise or setTimeout).\n            const linkingError: Types.LinkingErrorInfo = {\n                code: Types.LinkingErrorCode.Blocked,\n                url: url,\n                description: 'Window was blocked by popup blocker',\n            };\n            return Promise.reject<void>(linkingError);\n        }\n        // SECURITY WARNING:\n        //   Destroy the back-link to this window. Otherwise the (untrusted) URL we are about to load can redirect OUR window.\n        //   See: https://mathiasbynens.github.io/rel-noopener/\n        // Note: can only set to null, otherwise is readonly.\n        // Note: In order for mailto links to work properly window.opener cannot be null.\n        if (url.indexOf('mailto:') !== 0) {\n            otherWindow.opener = null;\n        }\n        otherWindow.location.href = url;\n\n        return Promise.resolve<void>(void 0);\n    }\n\n    launchEmail(emailInfo: Types.EmailInfo): Promise<void> {\n        // Format email info\n        const emailUrl = this._createEmailUrl(emailInfo);\n        window.location.href = emailUrl;\n\n        return Promise.resolve<void>(void 0);\n    }\n\n    getInitialUrl(): Promise<string | undefined> {\n        return Promise.resolve(undefined);\n    }\n}\n\nexport default new Linking();\n"
  },
  {
    "path": "src/web/Modal.ts",
    "content": "/**\n * Modal.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Modal abstraction.\n */\n\nimport * as React from 'react';\n\nimport assert from '../common/assert';\nimport * as RX from '../common/Interfaces';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\n\nexport class Modal extends RX.Modal {\n    isDisplayed(modalId?: string): boolean {\n        return FrontLayerViewManager.isModalDisplayed(modalId);\n    }\n\n    show(modal: React.ReactElement<RX.Types.ViewProps>, modalId: string, options?: RX.Types.ModalOptions): void {\n        assert(modal, `modal must be valid. Actual ${ modal }`);\n        assert(modalId, `modalId must be a non-empty string. Actual: ${ modalId }`);\n\n        FrontLayerViewManager.showModal(modal, modalId, options);\n    }\n\n    dismiss(modalId: string): void {\n        assert(modalId, `modalId must be a non-empty string. Actual: ${ modalId }`);\n\n        FrontLayerViewManager.dismissModal(modalId);\n    }\n\n    dismissAll(): void {\n        FrontLayerViewManager.dismissAllModals();\n    }\n}\n\nexport default new Modal();\n"
  },
  {
    "path": "src/web/ModalContainer.tsx",
    "content": "﻿/**\n * ModalContainer.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of a view that's used to render modals.\n */\n\nimport * as React from 'react';\n\nimport { Types } from '../common/Interfaces';\n\nconst _styles = {\n    modalContainerStyle: {\n        display: 'flex',\n        position: 'fixed',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'column',\n        flex: '1 1 auto',\n        alignSelf: 'stretch',\n        overflow: 'hidden',\n        zIndex: 10000,\n    },\n};\n\nexport class ModalContainer extends React.Component<Types.CommonProps<ModalContainer>, Types.Stateless> {\n    constructor(props: Types.CommonProps<ModalContainer>) {\n        super(props);\n    }\n\n    render() {\n        return (\n            <div style={ _styles.modalContainerStyle as any }>\n                { this.props.children }\n            </div>\n        );\n    }\n}\n\nexport default ModalContainer;\n"
  },
  {
    "path": "src/web/Picker.tsx",
    "content": "/**\n * Picker.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Select abstraction.\n */\n\nimport * as React from 'react';\n\nimport * as RX from '../common/Interfaces';\n\nimport * as _ from './utils/lodashMini';\nimport Styles from './Styles';\n\nexport class Picker extends RX.Picker {\n    render() {\n        return (\n            <select\n                style={ this._getStyles() as any }\n                value={ this.props.selectedValue }\n                onChange={ this._onValueChange }\n                data-test-id={ this.props.testId }\n            >\n                { _.map(this.props.items, (i, idx) => <option value={ i.value } key={ idx }>{ i.label }</option> ) }\n            </select>\n        );\n    }\n\n    private _getStyles(): RX.Types.PickerStyleRuleSet {\n        return Styles.combine(this.props.style) as any;\n    }\n\n    private _onValueChange = (e: React.SyntheticEvent<any>) => {\n        const selectEl = e.target as HTMLSelectElement;\n        const selectedValue = selectEl.value;\n        const selectedItemPosition = _.findIndex(this.props.items, i => i.value === selectedValue);\n\n        this.props.onValueChange(selectedValue, selectedItemPosition);\n    };\n}\n\nexport default Picker;\n"
  },
  {
    "path": "src/web/Platform.ts",
    "content": "/**\n * Platform.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of Platform interface.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class Platform extends RX.Platform {\n    getType(): RX.Types.PlatformType {\n        return 'web';\n    }\n\n    select<T>(specifics: { [ platform in RX.Types.PlatformType | 'default' ]?: T }): T | undefined {\n        const platformType = this.getType();\n        return platformType in specifics ? specifics[platformType] : specifics.default;\n    }\n}\n\nexport default new Platform();\n"
  },
  {
    "path": "src/web/Popup.ts",
    "content": "/**\n * Popup.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Popup abstraction.\n */\n\nimport assert from '../common/assert';\nimport * as RX from '../common/Interfaces';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\n\nexport class Popup extends RX.Popup {\n    show(options: RX.Types.PopupOptions, popupId: string, delay?: number): boolean {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n\n        return FrontLayerViewManager.showPopup(options, popupId, delay);\n    }\n\n    autoDismiss(popupId: string, delay?: number): void {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n\n        FrontLayerViewManager.autoDismissPopup(popupId, delay);\n    }\n\n    dismiss(popupId: string): void {\n        assert(popupId, `popupId must be a non-empty string. Actual: ${ popupId }`);\n\n        FrontLayerViewManager.dismissPopup(popupId);\n    }\n\n    dismissAll(): void {\n        FrontLayerViewManager.dismissAllPopups();\n    }\n\n    isDisplayed(popupId?: string): boolean {\n        return FrontLayerViewManager.isPopupDisplayed(popupId);\n    }\n}\n\nexport default new Popup();\n"
  },
  {
    "path": "src/web/PopupContainerView.tsx",
    "content": "/**\n * PopupContainerView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Common parent of all components rendered into a popup, web version.\n */\n\nimport * as React from 'react';\n\nimport { Types } from '../common/Interfaces';\nimport { PopupContainerViewBase, PopupContainerViewBaseProps, PopupContainerViewContext } from '../common/PopupContainerViewBase';\n\nimport { clone } from './utils/lodashMini';\n\nexport interface PopupContainerViewProps extends PopupContainerViewBaseProps<PopupContainerView> {\n    style: React.CSSProperties;\n    onMouseEnter?: (e: React.MouseEvent<HTMLDivElement>) => void;\n    onMouseLeave?: (e: React.MouseEvent<HTMLDivElement>) => void;\n}\n\nexport class PopupContainerView extends PopupContainerViewBase<PopupContainerViewProps, Types.Stateless, PopupContainerView> {\n    constructor(props: PopupContainerViewProps, context?: PopupContainerViewContext) {\n        super(props, context);\n    }\n\n    render() {\n        const style = clone(this.props.style);\n        if (this.props.hidden) {\n            style.visibility = 'hidden';\n        }\n        return (\n            <div\n                style={ style }\n                onMouseEnter={ this.props.onMouseEnter }\n                onMouseLeave={ this.props.onMouseLeave }\n            >\n                { this.props.children }\n            </div>\n        );\n    }\n}\n\nexport default PopupContainerView;\n"
  },
  {
    "path": "src/web/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Wrapper for all ReactXP functionality. Users of ReactXP should import just this\n* file instead of internals.\n*/\n\nimport React = require('react');\n\nimport { setSortAndFilterFunc } from '../common/utils/AutoFocusHelper';\nimport RXInterfaces = require('../common/Interfaces');\nimport LocationImpl from '../common/Location';\nimport RXModuleInterface = require('../common/ModuleInterface');\nimport PopupImpl from '../web/Popup';\nimport RXTypes = require('../common/Types');\n\nimport AccessibilityImpl from './Accessibility';\nimport { ActivityIndicator as ActivityIndicatorImpl } from './ActivityIndicator';\nimport AlertImpl from './Alert';\nimport AnimatedImpl = require('./Animated');\nimport AppImpl from './App';\nimport { Button as ButtonImpl } from './Button';\nimport ClipboardImpl from './Clipboard';\nimport FocusManager from './utils/FocusManager';\nimport { GestureView as GestureViewImpl } from './GestureView';\nimport { Image as ImageImpl } from './Image';\nimport InputImpl from './Input';\nimport InternationalImpl from './International';\nimport { Link as LinkImpl } from './Link';\nimport LinkingImpl from './Linking';\nimport ModalImpl from './Modal';\nimport { Picker as PickerImpl } from './Picker';\nimport PlatformImpl from './Platform';\nimport { ScrollView as ScrollViewImpl } from './ScrollView';\nimport StatusBarImpl from './StatusBar';\nimport StorageImpl from './Storage';\nimport StylesImpl from './Styles';\nimport { Text as TextImpl } from './Text';\nimport { TextInput as TextInputImpl } from './TextInput';\nimport UserInterfaceImpl from './UserInterface';\nimport UserPresenceImpl from './UserPresence';\nimport ViewImpl from './View';\nimport { ViewBase } from './ViewBase';\nsetSortAndFilterFunc(FocusManager.sortAndFilterAutoFocusCandidates);\n\n// -- STRANGE THINGS GOING ON HERE --\n//\n// 1) 'export type Foo = FooImpl; export var Foo = FooImpl;'\n//    If the var 'Foo' was exported alone then the name 'RX.Foo' would not be valid in a type position: 'function takesFoo(foo: RX.Foo)'.\n//    To avoid this problem, the type information is also exported. TypeScript will merge the var and type together (if the types match).\n\nmodule ReactXP {\n    export type Accessibility = RXInterfaces.Accessibility;\n    export let Accessibility: RXInterfaces.Accessibility = AccessibilityImpl;\n    export type ActivityIndicator = RXInterfaces.ActivityIndicator;\n    export let ActivityIndicator: typeof RXInterfaces.ActivityIndicator = ActivityIndicatorImpl;\n    export type Alert = RXInterfaces.Alert;\n    export let Alert: RXInterfaces.Alert = AlertImpl;\n    export type App = RXInterfaces.App;\n    export let App: RXInterfaces.App = AppImpl;\n    export type Button = RXInterfaces.Button;\n    export let Button: typeof RXInterfaces.Button = ButtonImpl;\n    export type Picker = RXInterfaces.Picker;\n    export let Picker: typeof RXInterfaces.Picker = PickerImpl;\n    export type Clipboard = RXInterfaces.Clipboard;\n    export let Clipboard: RXInterfaces.Clipboard = ClipboardImpl;\n    export type GestureView = RXInterfaces.GestureView;\n    export let GestureView: typeof RXInterfaces.GestureView = GestureViewImpl;\n    export type Image = RXInterfaces.Image;\n    export let Image: RXInterfaces.ImageConstructor = ImageImpl;\n    export type Input = RXInterfaces.Input;\n    export let Input: RXInterfaces.Input = InputImpl;\n    export type International = RXInterfaces.International;\n    export let International: RXInterfaces.International = InternationalImpl;\n    export type Link = RXInterfaces.Link;\n    export let Link: typeof RXInterfaces.Link = LinkImpl;\n    export type Linking = RXInterfaces.Linking;\n    export let Linking: RXInterfaces.Linking = LinkingImpl;\n    export type Location = RXInterfaces.Location;\n    export let Location: RXInterfaces.Location = LocationImpl;\n    export type Modal = RXInterfaces.Modal;\n    export let Modal: RXInterfaces.Modal = ModalImpl;\n    export type Platform = RXInterfaces.Platform;\n    export let Platform: RXInterfaces.Platform = PlatformImpl;\n    export type Popup = RXInterfaces.Popup;\n    export let Popup: RXInterfaces.Popup = PopupImpl;\n    export type ScrollView = RXInterfaces.ScrollView;\n    export let ScrollView: RXInterfaces.ScrollViewConstructor = ScrollViewImpl;\n    export type StatusBar = RXInterfaces.StatusBar;\n    export let StatusBar: RXInterfaces.StatusBar = StatusBarImpl;\n    export type Storage = RXInterfaces.Storage;\n    export let Storage: RXInterfaces.Storage = StorageImpl;\n    export type Styles = RXInterfaces.Styles;\n    export let Styles: RXInterfaces.Styles = StylesImpl;\n    export type Text = RXInterfaces.Text;\n    export let Text: typeof RXInterfaces.Text = TextImpl;\n    export type TextInput = RXInterfaces.TextInput;\n    export let TextInput: typeof RXInterfaces.TextInput = TextInputImpl;\n    export type UserInterface = RXInterfaces.UserInterface;\n    export let UserInterface: RXInterfaces.UserInterface = UserInterfaceImpl;\n    export type UserPresence = RXInterfaces.UserPresence;\n    export let UserPresence: RXInterfaces.UserPresence = UserPresenceImpl;\n    export type View = RXInterfaces.View;\n    export let View: typeof RXInterfaces.View = ViewImpl;\n\n    export import Animated = AnimatedImpl;\n    export import CommonProps = RXTypes.CommonProps;\n    export import CommonStyledProps = RXTypes.CommonStyledProps;\n    export import Stateless = RXTypes.Stateless;\n    export import Types = RXTypes;\n\n    export import Component = React.Component;\n    export import ComponentBase = RXTypes.ComponentBase;\n    export import createElement = React.createElement;\n    export import Children = React.Children;\n    export let __spread = (React as any).__spread;\n    export import Fragment = React.Fragment;\n}\n\nViewBase.setActivationState(AppImpl.getActivationState());\nAppImpl.activationStateChangedEvent.subscribe(newState => {\n    ViewBase.setActivationState(newState);\n});\n\n// -- STRANGE THINGS GOING ON HERE --\n//\n// 1) Unused variable\n//    This forces TypeScript to type-check the above RX module against the common RX interface. Missing/incorrect types will cause errors.\n//    Note: RX must be a module so 'RX.Foo' can be a valid value ('new RX.Foo') and valid type ('var k: RX.Foo'), but modules cannot\n//    implement an interface. If RX was a class or variable then it could directly check this, but then 'RX.Foo' would not be a valid type.\n\nlet _rxImplementsRxInterface: typeof RXModuleInterface.ReactXP = ReactXP;\n_rxImplementsRxInterface = _rxImplementsRxInterface;\nexport = ReactXP;\n\n/*\n\nvar rx = module.exports;\nObject.keys(rx)\n    .filter(key => rx[key] && rx[key].prototype instanceof React.Component && !rx[key].displayName)\n    .forEach(key => rx[key].displayName = 'RX.' + key + '');\n*/\n"
  },
  {
    "path": "src/web/RootView.tsx",
    "content": "/**\n * RootView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * The top-most view (rendered into window.body) that's used for proper\n * layering or modals, etc. in the web implementation of the ReactXP\n * cross-platform library.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { Types } from '../common/Interfaces';\nimport { recalcPositionFromLayoutData, RecalcResult } from '../common/PopupContainerViewBase';\nimport Timers from '../common/utils/Timers';\n\nimport AccessibilityAnnouncer from './AccessibilityAnnouncer';\nimport FocusManager from './utils/FocusManager';\nimport Input from './Input';\nimport * as _ from './utils/lodashMini';\nimport ModalContainer from './ModalContainer';\nimport PopupContainerView from './PopupContainerView';\nimport UserInterface from './UserInterface';\n\nexport class PopupDescriptor {\n    constructor(public popupId: string, public popupOptions: Types.PopupOptions) {}\n}\n\nexport interface RootViewProps extends Types.CommonProps<RootView> {\n    mainView?: React.ReactNode;\n    modal?: React.ReactElement<Types.ViewProps>;\n    activePopup?: PopupDescriptor;\n    cachedPopup?: PopupDescriptor[];\n    autoDismiss?: boolean;\n    autoDismissDelay?: number;\n    onDismissPopup?: () => void;\n    keyBoardFocusOutline?: string;\n    mouseFocusOutline?: string;\n    writingDirection?: 'auto' | 'rtl' | 'ltr';\n}\n\nexport interface RootViewState extends RecalcResult {\n    // We need to measure the popup before it can be positioned. This indicates that we're in the \"measuring\" phase.\n    isMeasuringPopup: boolean;\n\n    // Measured (unconstrained) dimensions of the popup; not valid if isMeasuringPopup is false.\n    popupWidth: number;\n    popupHeight: number;\n\n    // Assign css focus class if focus is due to Keyboard or mouse\n    focusClass: string | undefined;\n}\n\n// Button code for when right click is pressed in a mouse event\nconst _rightClickButtonCode = 2;\n\nconst KEY_CODE_TAB = 9;\nconst KEY_CODE_ESC = 27;\n\n// Setting the expected default box-sizing for everything.\nif (typeof document !== 'undefined') {\n    const defaultBoxSizing = '*, *:before, *:after { box-sizing: border-box; }';\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    style.appendChild(document.createTextNode(defaultBoxSizing));\n    document.head.appendChild(style);\n}\n\nexport interface MainViewContext {\n    isInRxMainView?: boolean;\n}\n\n// This helper class wraps the main view and passes a boolean value\n// \"isInRxMainView\" to all children found within it. This is used to\n// prevent gesture handling within the main view when a modal is displayed.\nexport class MainViewContainer extends React.Component<Types.CommonProps<MainViewContainer>, Types.Stateless>\n    implements React.ChildContextProvider<MainViewContext> {\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isInRxMainView: PropTypes.bool,\n    };\n\n    getChildContext(): MainViewContext {\n        return {\n            isInRxMainView: true,\n        };\n    }\n\n    render() {\n        return (\n            this.props.children\n        );\n    }\n}\n\nexport class RootView extends React.Component<RootViewProps, RootViewState> {\n    static childContextTypes: React.ValidationMap<any> = {\n        focusManager: PropTypes.object,\n    };\n\n    private _mountedComponent: Element | undefined;\n    private _hidePopupTimer: number | undefined;\n    private _respositionPopupTimer: number | undefined;\n    private _clickHandlerInstalled = false;\n    private _keyboardHandlerInstalled = false;\n    private _focusManager: FocusManager;\n    private _isNavigatingWithKeyboardUpateTimer: number | undefined;\n\n    private _shouldEnableKeyboardNavigationModeOnFocus = false;\n    private _applicationIsNotActive = false;\n    private _applicationIsNotActiveTimer: number | undefined;\n    private _prevFocusedElement: HTMLElement | undefined;\n    private _updateKeyboardNavigationModeOnFocusTimer: number | undefined;\n\n    constructor(props: RootViewProps) {\n        super(props);\n\n        this.state = this._getInitialState();\n\n        // Initialize the root FocusManager which is aware of all\n        // focusable elements.\n        this._focusManager = new FocusManager(undefined);\n    }\n\n    getChildContext() {\n        // Provide the context with root FocusManager to all descendants.\n        return {\n            focusManager: this._focusManager,\n        };\n    }\n\n    private _getInitialState(): RootViewState {\n        return {\n            isMeasuringPopup: true,\n            anchorPosition: 'left',\n            anchorOffset: 0,\n            popupY: 0,\n            popupX: 0,\n            popupWidth: 0,\n            popupHeight: 0,\n            constrainedPopupWidth: 0,\n            constrainedPopupHeight: 0,\n            focusClass: this.props.mouseFocusOutline,\n        };\n    }\n\n    UNSAFE_componentWillReceiveProps(prevProps: RootViewProps) {\n        if (this.props.activePopup !== prevProps.activePopup) {\n            this._stopHidePopupTimer();\n\n            // If the popup changes, reset our state.\n            this.setState(this._getInitialState());\n        }\n    }\n\n    componentDidUpdate(prevProps: RootViewProps, prevState: RootViewState) {\n        if (this.props.activePopup) {\n            this._stopHidePopupTimer();\n            this._recalcPosition();\n\n            if (!this._respositionPopupTimer) {\n                this._startRepositionPopupTimer();\n            }\n\n            this._startHidePopupTimer();\n\n            if (!this._clickHandlerInstalled) {\n                document.addEventListener('mousedown', this._tryClosePopup);\n                document.addEventListener('touchstart', this._tryClosePopup);\n                this._clickHandlerInstalled = true;\n            }\n        } else {\n            this._stopRepositionPopupTimer();\n\n            if (this._clickHandlerInstalled) {\n                document.removeEventListener('mousedown', this._tryClosePopup);\n                document.removeEventListener('touchstart', this._tryClosePopup);\n                this._clickHandlerInstalled = false;\n            }\n        }\n    }\n\n    componentDidMount() {\n        if (this.props.activePopup) {\n            this._recalcPosition();\n        }\n\n        if (this.props.activePopup) {\n            this._startRepositionPopupTimer();\n        }\n\n        if (!this._keyboardHandlerInstalled) {\n            window.addEventListener('keydown', this._onKeyDown);\n            window.addEventListener('keyup', this._onKeyUp);\n\n            window.addEventListener('keydown', this._onKeyDownCapture, true); // Capture!\n            window.addEventListener('mousedown', this._onMouseDownCapture, true); // Capture!\n            window.addEventListener('focusin', this._onFocusIn);\n            window.addEventListener('focusout', this._onFocusOut);\n\n            this._keyboardHandlerInstalled = true;\n        }\n    }\n\n    componentWillUnmount() {\n        this._stopHidePopupTimer();\n        this._stopRepositionPopupTimer();\n\n        if (this._keyboardHandlerInstalled) {\n            window.removeEventListener('keydown', this._onKeyDown);\n            window.removeEventListener('keyup', this._onKeyUp);\n\n            window.removeEventListener('keydown', this._onKeyDownCapture, true);\n            window.removeEventListener('mousedown', this._onMouseDownCapture, true);\n            window.removeEventListener('focusin', this._onFocusIn);\n            window.removeEventListener('focusout', this._onFocusOut);\n\n            this._keyboardHandlerInstalled = false;\n        }\n    }\n\n    private _renderPopup(popup: PopupDescriptor, hidden: boolean): JSX.Element {\n        const popupContainerStyle: React.CSSProperties = {\n            display: 'flex',\n            position: 'fixed',\n            zIndex: 100001,\n        };\n\n        if (!hidden) {\n            popupContainerStyle.top = this.state.popupY;\n            popupContainerStyle.left = this.state.popupX;\n\n            // Are we artificially constraining the width and/or height?\n            if (this.state.constrainedPopupWidth && this.state.constrainedPopupWidth !== this.state.popupWidth) {\n                popupContainerStyle.width = this.state.constrainedPopupWidth;\n            }\n\n            if (this.state.constrainedPopupHeight && this.state.constrainedPopupHeight !== this.state.popupHeight) {\n                popupContainerStyle.height = this.state.constrainedPopupHeight;\n            }\n        }\n\n        const key = (popup.popupOptions.cacheable ? 'CP:' : 'P:') + popup.popupId;\n        const renderedPopup = (hidden ?\n            popup.popupOptions.renderPopup('top', 0, 0, 0) :\n            popup.popupOptions.renderPopup(\n                this.state.anchorPosition, this.state.anchorOffset,\n                this.state.constrainedPopupWidth, this.state.constrainedPopupHeight)\n        );\n        return (\n            <PopupContainerView\n                key={ key }\n                style={ popupContainerStyle }\n                hidden={ hidden }\n                ref={ hidden ? undefined : this._onMount }\n                onMouseEnter={ e => this._onMouseEnter(e) }\n                onMouseLeave={ e => this._onMouseLeave(e) }\n            >\n                { renderedPopup }\n            </PopupContainerView>\n        );\n    }\n\n    render() {\n        const rootViewStyle = {\n            width: '100%',\n            height: '100%',\n            display: 'flex',\n            cursor: 'default',\n        };\n\n        const optionalPopups: JSX.Element[] = [];\n        if (this.props.activePopup) {\n            optionalPopups.push(this._renderPopup(this.props.activePopup, false));\n        }\n        if (this.props.cachedPopup) {\n            this.props.cachedPopup.forEach(popup => optionalPopups.push(this._renderPopup(popup, true)));\n        }\n\n        let optionalModal: JSX.Element | null = null;\n        if (this.props.modal) {\n            optionalModal = (\n                <ModalContainer>\n                    { this.props.modal }\n                </ModalContainer>\n            );\n        }\n\n        return (\n            <div\n                className={ this.state.focusClass }\n                style={ rootViewStyle }\n                dir={ this.props.writingDirection }\n            >\n                <MainViewContainer>\n                    { this.props.mainView }\n                </MainViewContainer>\n                { optionalModal }\n                { optionalPopups }\n                <AccessibilityAnnouncer />\n            </div>\n        );\n    }\n\n    protected _onMount = (component: PopupContainerView | null) => {\n        const domNode = component && ReactDOM.findDOMNode(component) as HTMLElement | null;\n        this._mountedComponent = domNode ? domNode : undefined;\n    };\n\n    private _tryClosePopup = (e: MouseEvent) => {\n        // Dismiss a visible popup if there's a click outside.\n        const popupContainer = this._mountedComponent;\n        if (!popupContainer) {\n            return;\n        }\n        let clickInPopup = false;\n        let el = e.target as HTMLElement | undefined;\n        while (el) {\n            if (el === popupContainer) {\n                clickInPopup = true;\n                break;\n            }\n            el = el.parentElement || undefined;\n        }\n\n        if (!clickInPopup && e.button !== _rightClickButtonCode) {\n            _.defer(() => {\n                if (this.props.activePopup) {\n                    const anchorReference = this.props.activePopup.popupOptions.getAnchor();\n                    const isClickOnAnchor = this._determineIfClickOnElement(anchorReference, e.srcElement as Element);\n\n                    let isClickOnContainer = false;\n                    if (!isClickOnAnchor && this.props.activePopup.popupOptions.getElementTriggeringPopup) {\n                        const containerRef = this.props.activePopup.popupOptions.getElementTriggeringPopup();\n                        isClickOnContainer = this._determineIfClickOnElement(containerRef, e.srcElement as Element);\n                    }\n\n                    if (isClickOnAnchor || isClickOnContainer) {\n                        // If the press event was on the anchor, we can notify the caller about it.\n                        // Showing another animation while dimissing the popup creates a conflict in the UI making it not doing one of the\n                        // two animations (i.e.: Opening an actionsheet while dismissing a popup). We introduce this delay to make sure\n                        // the popup dimissing animation has finished before we call the event handler.\n                        if (this.props.activePopup.popupOptions.onAnchorPressed) {\n                            Timers.setTimeout(() => {\n                                // We can't pass through the DOM event argument to the anchor event handler as the event we have at this\n                                // point is a DOM Event and the anchor expect a Synthetic event. There doesn't seem to be any way to convert\n                                // between them. Passing null for now.\n                                this.props.activePopup!.popupOptions.onAnchorPressed!(undefined);\n                            }, 500);\n                        }\n\n                        // If the popup is meant to behave like a toggle, we should not dimiss the popup from here since the event came\n                        // from the anchor/container of the popup. The popup will be dismissed during the click handling of the\n                        // anchor/container.\n                        if (this.props.activePopup.popupOptions.dismissIfShown) {\n                            return;\n                        }\n                    }\n\n                    if (this.props.activePopup.popupOptions.preventDismissOnPress) {\n                        return;\n                    }\n                }\n\n                this._dismissPopup();\n            });\n        }\n    };\n\n    private _determineIfClickOnElement(elementReference: React.Component<any, any>, eventSource: Element | null | undefined): boolean {\n        try {\n            const element = ReactDOM.findDOMNode(elementReference) as HTMLElement | null;\n            const isClickOnElement = !!element && !!eventSource && element.contains(eventSource);\n            return isClickOnElement;\n        } catch {\n            // Exception is due to race condition with unmounting.\n            return false;\n        }\n    }\n\n    private _onMouseDownCapture = (e: MouseEvent) => {\n        if (e &&\n                (e.clientX === 0) && (e.clientY === 0) &&\n                (e.screenX === 0) && (e.screenY === 0)) {\n            // This is most likely an event triggered by NVDA when Enter or\n            // Space is pressed, do not dismiss the keyboard navigation mode.\n            return;\n        }\n\n        this._shouldEnableKeyboardNavigationModeOnFocus = false;\n        this._updateKeyboardNavigationState(false);\n    };\n\n    private _onKeyDownCapture = (e: KeyboardEvent) => {\n        if (e.keyCode === KEY_CODE_TAB) {\n            this._updateKeyboardNavigationState(true);\n        }\n\n        if (e.keyCode === KEY_CODE_ESC) {\n            // If Esc is pressed and the focused element stays the same after some time,\n            // switch the keyboard navigation off to dismiss the outline.\n            const activeElement = document.activeElement;\n\n            if (this._isNavigatingWithKeyboardUpateTimer) {\n                Timers.clearTimeout(this._isNavigatingWithKeyboardUpateTimer);\n            }\n\n            this._isNavigatingWithKeyboardUpateTimer = Timers.setTimeout(() => {\n                this._isNavigatingWithKeyboardUpateTimer = undefined;\n\n                if ((document.activeElement === activeElement) && activeElement && (activeElement !== document.body)) {\n                    this._updateKeyboardNavigationState(false);\n                }\n            }, 500);\n        }\n    };\n\n    private _onFocusIn = (e: FocusEvent) => {\n        // When the screen reader is being used, we need to enable the keyboard navigation\n        // mode. It's not possible to detect the screen reader on web. To work it around we\n        // apply the following assumption: if the focus is moved without using the mouse and\n        // not from the application code with focus() method, it is most likely moved by the\n        // screen reader.\n        this._cancelApplicationIsNotActive();\n\n        const target = e.target as HTMLElement;\n\n        if (this._updateKeyboardNavigationModeOnFocusTimer) {\n            Timers.clearTimeout(this._updateKeyboardNavigationModeOnFocusTimer);\n        }\n\n        this._updateKeyboardNavigationModeOnFocusTimer = Timers.setTimeout(() => {\n            this._updateKeyboardNavigationModeOnFocusTimer = undefined;\n\n            const prev = this._prevFocusedElement;\n            const curShouldEnable = this._shouldEnableKeyboardNavigationModeOnFocus;\n\n            this._prevFocusedElement = target;\n            this._shouldEnableKeyboardNavigationModeOnFocus = true;\n\n            if (this._applicationIsNotActive) {\n                this._applicationIsNotActive = false;\n                return;\n            }\n\n            if ((prev === target) || (target === FocusManager.getLastFocusedProgrammatically(true))) {\n                return;\n            }\n\n            if (!UserInterface.isNavigatingWithKeyboard() && curShouldEnable) {\n                this._updateKeyboardNavigationState(true);\n            }\n        }, 0);\n    };\n\n    private _onFocusOut = (e: FocusEvent) => {\n        // If the focus is out and nothing is focused after some time, most likely\n        // the application has been deactivated, so the next focusin will be about\n        // activating the application back again and should be ignored.\n        // This is a safety pillow for checking that _prevFocusedElement is changed,\n        // as _prevFocusedElement might be gone while the application is not active.\n        this._requestApplicationIsNotActive();\n    };\n\n    private _requestApplicationIsNotActive() {\n        this._cancelApplicationIsNotActive();\n\n        this._applicationIsNotActiveTimer = Timers.setTimeout(() => {\n            this._applicationIsNotActiveTimer = undefined;\n            this._applicationIsNotActive = true;\n        }, 100);\n    }\n\n    private _cancelApplicationIsNotActive() {\n        if (this._applicationIsNotActiveTimer) {\n            Timers.clearTimeout(this._applicationIsNotActiveTimer);\n            this._applicationIsNotActiveTimer = undefined;\n        }\n    }\n\n    private _updateKeyboardNavigationState(isNavigatingWithKeyboard: boolean) {\n        if (this._isNavigatingWithKeyboardUpateTimer) {\n            Timers.clearTimeout(this._isNavigatingWithKeyboardUpateTimer);\n            this._isNavigatingWithKeyboardUpateTimer = undefined;\n        }\n\n        if (UserInterface.isNavigatingWithKeyboard() !== isNavigatingWithKeyboard) {\n            UserInterface.keyboardNavigationEvent.fire(isNavigatingWithKeyboard);\n\n            const focusClass = isNavigatingWithKeyboard ? this.props.keyBoardFocusOutline : this.props.mouseFocusOutline;\n\n            if (this.state.focusClass !== focusClass) {\n                this.setState({ focusClass: focusClass });\n            }\n        }\n    }\n\n    private _onKeyDown = (e: KeyboardEvent) => {\n        Input.dispatchKeyDown(e as any);\n    };\n\n    private _onKeyUp = (e: KeyboardEvent) => {\n        if (this.props.activePopup && (e.keyCode === KEY_CODE_ESC)) {\n            if (e.stopPropagation) {\n                e.stopPropagation();\n            }\n            this._dismissPopup();\n            return;\n        }\n\n        Input.dispatchKeyUp(e as any);\n    };\n\n    private _onMouseEnter(e: React.MouseEvent<any>) {\n        this._stopHidePopupTimer();\n    }\n\n    private _onMouseLeave(e: React.MouseEvent<any>) {\n        this._startHidePopupTimer();\n    }\n\n    private _startHidePopupTimer() {\n        if (this.props.autoDismiss) {\n            // Should we immediately hide it, or did the caller request a delay?\n            if (!_.isUndefined(this.props.autoDismissDelay) && this.props.autoDismissDelay > 0) {\n                this._hidePopupTimer = Timers.setTimeout(() => {\n                    this._hidePopupTimer = undefined;\n                    this._dismissPopup();\n                }, this.props.autoDismissDelay);\n            } else {\n                this._dismissPopup();\n            }\n        }\n    }\n\n    private _stopHidePopupTimer() {\n        if (this._hidePopupTimer) {\n            Timers.clearTimeout(this._hidePopupTimer);\n            this._hidePopupTimer = undefined;\n        }\n    }\n\n    private _dismissPopup() {\n        if (this.props.onDismissPopup) {\n            this.props.onDismissPopup();\n        }\n    }\n\n    private _startRepositionPopupTimer() {\n        this._respositionPopupTimer = Timers.setInterval(() => {\n            this._recalcPosition();\n        }, 500);\n    }\n\n    private _stopRepositionPopupTimer() {\n        if (this._respositionPopupTimer) {\n            Timers.clearInterval(this._respositionPopupTimer);\n            this._respositionPopupTimer = undefined;\n        }\n    }\n\n    // Recalculates the position and constrained size of the popup based on the current position of the anchor and the\n    // window size. If necessary, it also measures the unconstrained size of the popup.\n    private _recalcPosition() {\n        // Make a copy of the old state.\n        const newState: RootViewState = _.extend({}, this.state);\n\n        if (this.state.isMeasuringPopup) {\n            // Get the width/height of the popup.\n            const popup = this._mountedComponent;\n            if (!popup) {\n                return;\n            }\n\n            newState.isMeasuringPopup = false;\n            newState.popupHeight = popup.clientHeight;\n            newState.popupWidth = popup.clientWidth;\n        }\n\n        // Get the anchor element.\n        const anchorComponent = this.props.activePopup!.popupOptions.getAnchor();\n        // if the anchor is unmounted, dismiss the popup.\n        // Prevents app crash when we try to get dom node from unmounted Component\n        if (!anchorComponent) {\n            this._dismissPopup();\n            return;\n        }\n\n        let anchor: HTMLElement | null = null;\n        try {\n            anchor = ReactDOM.findDOMNode(anchorComponent) as HTMLElement | null;\n        } catch {\n            anchor = null;\n        }\n\n        // If the anchor has disappeared, dismiss the popup.\n        if (!anchor) {\n            this._dismissPopup();\n            return;\n        }\n\n        // Calculate the absolute position of the anchor element's top/left.\n        const anchorRect = anchor.getBoundingClientRect();\n\n        const popupDims = { width: newState.popupWidth, height: newState.popupHeight };\n\n        // Get the width/height of root view window.\n        const windowDims = { width: window.innerWidth, height: window.innerHeight };\n\n        // Run the common recalc function and see what magic it spits out.\n        const result = recalcPositionFromLayoutData(windowDims, anchorRect, popupDims,\n            this.props.activePopup!.popupOptions.positionPriorities, this.props.activePopup!.popupOptions.useInnerPositioning);\n        if (!result) {\n            this._dismissPopup();\n            return;\n        }\n\n        _.extend(newState, result);\n\n        if (!_.isEqual(newState, this.state)) {\n            this.setState(newState);\n        }\n    }\n}\n\nexport default RootView;\n"
  },
  {
    "path": "src/web/ScrollView.tsx",
    "content": "/**\n * ScrollView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform ScrollView abstraction.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport * as RX from '../common/Interfaces';\nimport Timers from '../common/utils/Timers';\n\nimport CustomScrollbar from './CustomScrollbar';\nimport * as _ from './utils/lodashMini';\nimport ScrollViewConfig from './ScrollViewConfig';\nimport Styles from './Styles';\nimport ViewBase from './ViewBase';\n\nconst _styles = {\n    defaultStyle: {\n        position: 'relative',\n        overflow: 'hidden',\n        alignSelf: 'stretch',\n        flexGrow: 1,\n        flexShrink: 1,\n\n        // This forces some browsers (like Chrome) to create a new render context,\n        // which can significantly speed up scrolling.\n        transform: 'translateZ(0)',\n    },\n    verticalStyle: {\n        flexDirection: 'column',\n        overflowY: 'auto',\n        overflowX: 'hidden',\n    },\n    horizontalStyle: {\n        flexDirection: 'row',\n        overflowY: 'hidden',\n        overflowX: 'auto',\n    },\n};\n\nlet _initializedCustomStyles = false;\nconst _customStyles = {\n    defaultStyle: {\n        overflow: 'hidden',\n        msOverflowStyle: 'auto',\n        flexDirection: 'column',\n\n        // This forces some browsers (like Chrome) to create a new render context,\n        // which can significantly speed up scrolling.\n        transform: 'translateZ(0)',\n    },\n    verticalStyle: {},\n    horizontalStyle: {},\n    customScrollContainer: {\n        position: 'relative',\n        overflow: 'hidden',\n        boxSizing: 'border-box',\n        alignSelf: 'stretch',\n    },\n    customScrollVertical: {\n        // Set flex only for vertical scroll view.\n        // Don't set flex for horizontal scroll view, otherwise it disappears.\n        display: 'flex',\n        flex: '1 1 0px',\n    },\n};\n\n// Default to once per frame.\nconst _defaultScrollThrottleValue = 1000 / 60;\n\nexport class ScrollView extends ViewBase<RX.Types.ScrollViewProps, RX.Types.Stateless, RX.ScrollView> implements RX.ScrollView {\n    private _mountedComponent: HTMLElement | null = null;\n\n    constructor(props: RX.Types.ScrollViewProps) {\n        super(props);\n\n        // Set final styles upon initialization of the first ScrollView. This was previously done in the head\n        // of this file, but it broke the pattern of not doing external work (such as accessing the document\n        // object) on Types initialization.\n        if (!_initializedCustomStyles) {\n            _initializedCustomStyles = true;\n\n            const nativeScrollbarWidth = CustomScrollbar.getNativeScrollbarWidth();\n\n            _customStyles.verticalStyle = {\n                overflowY: 'scroll',\n                paddingRight: 30 - nativeScrollbarWidth,\n                marginRight: -30,\n                // Fixes a bug for Chrome beta where the parent flexbox (customScrollContainer) doesn't\n                // recognize that its child got populated with items. Smallest default width gives an\n                // indication that content will exist here.\n                minHeight: 0,\n            };\n\n            _customStyles.horizontalStyle = {\n                // The display needs to be set to flex, otherwise the scrollview incorrectly shows up vertically.\n                display: 'flex',\n                overflowX: 'scroll',\n                paddingBottom: 30 - nativeScrollbarWidth,\n                marginBottom: -30,\n                // Fixes a bug for Chrome beta where the parent flexbox (customScrollContainer) doesn't\n                // recognize that its child got populated with items. Smallest default width gives an\n                // indication that content will exist here.\n                minWidth: 0,\n            };\n        }\n    }\n\n    private _mounted = false;\n    private _customScrollbar: CustomScrollbar | undefined;\n    private _customScrollbarEnabled = true;\n    private _dragging = false;\n\n    componentDidUpdate() {\n        super.componentDidUpdate();\n        if (!this.props.onContentSizeChange) {\n            return;\n        }\n\n        _.defer(() => {\n            if (this.props.onContentSizeChange) {\n                const container = this._getContainer();\n                if (!container) {\n                    return;\n                }\n                this.props.onContentSizeChange(container.scrollWidth, container.scrollHeight);\n            }\n        });\n    }\n\n    render() {\n        return this._customScrollbarEnabled ? this._renderWithCustomScrollbar() : this._renderNormal();\n    }\n\n    UNSAFE_componentWillMount() {\n        this._onPropsChange(this.props);\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n        this._mounted = true;\n\n        this._createCustomScrollbarsIfNeeded(this.props);\n    }\n\n    UNSAFE_componentWillReceiveProps(newProps: RX.Types.ScrollViewProps) {\n        super.UNSAFE_componentWillReceiveProps(newProps);\n        this._onPropsChange(newProps);\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n        this._mounted = false;\n\n        if (this._customScrollbar) {\n            this._customScrollbar.dispose();\n            this._customScrollbar = undefined;\n        }\n    }\n\n    protected _getContainer(): HTMLElement | null {\n        return this._mountedComponent;\n    }\n\n    // Throttled scroll handler\n    private _onScroll = _.throttle((e: React.SyntheticEvent<any>) => {\n        if (!this._mounted) {\n            return;\n        }\n\n        if (this._customScrollbarEnabled && this._customScrollbar) {\n            this._customScrollbar.update();\n        }\n\n        // Check if this should be also fire an onLayout event\n        // The browser sends a scroll event when resizing\n        const onLayoutPromise = this._checkAndReportLayout();\n\n        // Recent versions of Chrome have started to defer all timers until\n        // after scrolling has completed. Because of this, our deferred layout\n        // reporting sometimes doesn't get handled for up to seconds at a time.\n        // Force the list of deferred changes to be reported now.\n        ViewBase._reportDeferredLayoutChanges();\n\n        if (this.props.onScroll || this.props.scrollXAnimatedValue || this.props.scrollYAnimatedValue) {\n            onLayoutPromise.then(() => {\n                const container = this._getContainer();\n                if (!container) {\n                    return;\n                }\n                if (this.props.onScroll) {\n                    this.props.onScroll(container.scrollTop, container.scrollLeft);\n                }\n                if (this.props.scrollXAnimatedValue) {\n                    this.props.scrollXAnimatedValue.setValue(container.scrollLeft);\n                }\n                if (this.props.scrollYAnimatedValue) {\n                    this.props.scrollYAnimatedValue.setValue(container.scrollTop);\n                }\n            }).catch(e => {\n                console.warn('ScrollView onLayout exception: ' + JSON.stringify(e));\n            });\n        }\n    }, (this.props.scrollEventThrottle || _defaultScrollThrottleValue), { leading: true, trailing: true });\n\n    private _onPropsChange(props: RX.Types.ScrollViewProps) {\n        this._customScrollbarEnabled = ScrollViewConfig.useCustomScrollbars();\n\n        // If we're turning on custom scrollbars or toggling vertical and/or horizontal, we need to re-create\n        // the scrollbar.\n        this._createCustomScrollbarsIfNeeded(props);\n    }\n\n    private _createCustomScrollbarsIfNeeded(props: RX.Types.ScrollViewProps) {\n        if (this._mounted && this._customScrollbarEnabled) {\n            if (this._customScrollbar) {\n                if (this.props.horizontal === props.horizontal &&\n                    this.props.showsHorizontalScrollIndicator === props.showsHorizontalScrollIndicator &&\n                    this.props.showsVerticalScrollIndicator === props.showsVerticalScrollIndicator) {\n                    // No need to re-create the scrollbar.\n                    return;\n                }\n                this._customScrollbar.dispose();\n                this._customScrollbar = undefined;\n            }\n\n            const element = ReactDOM.findDOMNode(this) as HTMLElement | null;\n            if (element) {\n                this._customScrollbar = new CustomScrollbar(element);\n                const horizontalHidden = (props.horizontal && props.showsHorizontalScrollIndicator === false);\n                const verticalHidden = (!props.horizontal && props.showsVerticalScrollIndicator === false);\n                this._customScrollbar.init({\n                    horizontal: props.horizontal && !horizontalHidden,\n                    vertical: !props.horizontal && !verticalHidden,\n                    hiddenScrollbar: horizontalHidden || verticalHidden,\n                });\n            }\n        }\n    }\n\n    private _getContainerStyle(): RX.Types.ScrollViewStyleRuleSet {\n        const { scrollEnabled = true } = this.props;\n        const styles: any = [{ display: 'block' }];\n        const sourceStyles = this._customScrollbarEnabled ? _customStyles : _styles;\n\n        styles.push(sourceStyles.defaultStyle);\n\n        if (scrollEnabled && this.props.horizontal) {\n            styles.push(sourceStyles.horizontalStyle);\n        } else if (scrollEnabled) {\n            styles.push(sourceStyles.verticalStyle);\n        }\n\n        return Styles.combine([styles, this.props.style]);\n    }\n\n    private _renderNormal() {\n        return (\n            <div\n                ref={ this._onMount }\n                role={ 'none' }\n                onScroll={ this._onScroll }\n                onTouchStart={ this._onTouchStart }\n                onTouchEnd={ this._onTouchEnd }\n                style={ this._getContainerStyle() as any }\n                onKeyDown={ this.props.onKeyPress }\n                onFocus={ this.props.onFocus }\n                onBlur={ this.props.onBlur }\n                data-test-id={ this.props.testId }\n            >\n                { this.props.children }\n            </div>\n        );\n    }\n\n    private _renderWithCustomScrollbar() {\n        let containerStyles: any = _customStyles.customScrollContainer;\n\n        const scrollComponentClassNames = ['scrollViewport'];\n        if (this.props.horizontal) {\n            scrollComponentClassNames.push('scrollViewportH');\n        } else {\n            scrollComponentClassNames.push('scrollViewportV');\n            containerStyles = _.extend({}, _customStyles.customScrollVertical, containerStyles);\n        }\n\n        return (\n            <div\n                role={ 'none' }\n                className='rxCustomScroll'\n                style={ containerStyles }\n                data-test-id={ this.props.testId }\n            >\n                <div\n                    ref={ this._onMount }\n                    role={ 'none' }\n                    className={ scrollComponentClassNames.join(' ') }\n                    onScroll={ this._onScroll }\n                    style={ this._getContainerStyle() as any }\n                    onKeyDown={ this.props.onKeyPress }\n                    onFocus={ this.props.onFocus }\n                    onBlur={ this.props.onBlur }\n                    onTouchStart={ this._onTouchStart }\n                    onTouchEnd={ this._onTouchEnd }\n                >\n                    { this.props.children }\n                </div>\n            </div>\n        );\n    }\n\n    protected _onMount = (component: HTMLElement | null) => {\n        this._mountedComponent = component;\n    };\n\n    setScrollTop(scrollTop: number, animate = false): void {\n        const container = this._getContainer();\n        if (!container) {\n            return;\n        }\n        this._onScroll.cancel();\n        if (animate) {\n            const start = container.scrollTop;\n            const change = scrollTop - start;\n            const increment = 20;\n            const duration = 200;\n\n            const animateScroll = (elapsedTime: number) => {\n                elapsedTime += increment;\n                const position = this._easeInOut(elapsedTime, start, change, duration);\n                container.scrollTop = position;\n                if (elapsedTime < duration) {\n                    Timers.setTimeout(function() {\n                        animateScroll(elapsedTime);\n                    }, increment);\n                }\n            };\n\n            animateScroll(0);\n        } else {\n            container.scrollTop = scrollTop;\n        }\n    }\n\n    setScrollLeft(scrollLeft: number, animate = false): void {\n        const container = this._getContainer();\n        if (!container) {\n            return;\n        }\n        this._onScroll.cancel();\n        if (animate) {\n            const start = container.scrollLeft;\n            const change = scrollLeft - start;\n            const increment = 20;\n            const duration = 200;\n\n            const animateScroll = (elapsedTime: number) => {\n                elapsedTime += increment;\n                const position = this._easeInOut(elapsedTime, start, change, duration);\n                container.scrollLeft = position;\n                if (elapsedTime < duration) {\n                    Timers.setTimeout(function() {\n                        animateScroll(elapsedTime);\n                    }, increment);\n                }\n            };\n\n            animateScroll(0);\n        } else {\n            container.scrollLeft = scrollLeft;\n        }\n    }\n\n    private _easeInOut(currentTime: number, start: number, change: number, duration: number) {\n        currentTime /= duration / 2;\n        if (currentTime < 1) {\n            return change / 2 * currentTime * currentTime + start;\n        }\n        currentTime -= 1;\n        return -change / 2 * (currentTime * (currentTime - 2) - 1) + start;\n    }\n\n    private _onTouchStart = () => {\n        if (!this._dragging) {\n            this._dragging = true;\n            if (this.props.onScrollBeginDrag) {\n                this.props.onScrollBeginDrag();\n            }\n        }\n    };\n\n    private _onTouchEnd = () => {\n        this._dragging = false;\n        if (this.props.onScrollEndDrag) {\n            this.props.onScrollEndDrag();\n        }\n    };\n}\n\nexport default ScrollView;\n"
  },
  {
    "path": "src/web/ScrollViewConfig.ts",
    "content": "/**\n * ScrollViewConfig.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific scroll view configuration, required to avoid circular\n * dependency between application and ScrollView.\n */\n\nexport class ScrollViewConfig {\n    private _useCustomScrollbars = false;\n    // Enable native scrollbars for all instances.\n    setUseCustomScrollbars(value: boolean): void {\n        this._useCustomScrollbars = value;\n    }\n\n    useCustomScrollbars(): boolean {\n        return this._useCustomScrollbars;\n    }\n}\n\nexport default new ScrollViewConfig();\n"
  },
  {
    "path": "src/web/StatusBar.tsx",
    "content": "/**\n * StatusBar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform status bar.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class StatusBar extends RX.StatusBar {\n    isOverlay(): boolean {\n        return false;\n    }\n\n    setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void {\n        // Nothing to do on Web\n    }\n\n    setHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void {\n        // Nothing to do on Web\n    }\n\n    setNetworkActivityIndicatorVisible(value: boolean): void {\n        // Nothing to do on the web\n    }\n\n    setBackgroundColor(color: string, animated: boolean): void {\n        // Nothing to do on the web\n    }\n\n    setTranslucent(translucent: boolean): void {\n        // Nothing to do on the web\n    }\n}\n\nexport default new StatusBar();\n"
  },
  {
    "path": "src/web/Storage.ts",
    "content": "/**\n * Storage.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform database storage abstraction.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class Storage extends RX.Storage {\n    getItem(key: string): Promise<string | undefined> {\n        const value = window.localStorage.getItem(key);\n        return Promise.resolve<string | undefined>(value === null ? undefined : value);\n    }\n\n    setItem(key: string, value: string): Promise<void> {\n        try {\n            window.localStorage.setItem(key, value);\n        } catch (e) {\n            return Promise.resolve(e);\n        }\n        return Promise.resolve<void>(void 0);\n    }\n\n    removeItem(key: string): Promise<void> {\n        window.localStorage.removeItem(key);\n        return Promise.resolve<void>(void 0);\n    }\n\n    clear(): Promise<void> {\n        window.localStorage.clear();\n        return Promise.resolve<void>(void 0);\n    }\n}\n\nexport default new Storage();\n"
  },
  {
    "path": "src/web/Styles.ts",
    "content": "/**\n * Styles.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of style functions.\n */\n\nimport AppConfig from '../common/AppConfig';\nimport * as RX from '../common/Interfaces';\nimport StyleLeakDetector from '../common/StyleLeakDetector';\n\nimport * as _ from './utils/lodashMini';\n\ninterface CssAliasMap {\n    [prop: string]: string;\n}\n\nexport class Styles extends RX.Styles {\n    // Combines a set of styles - for web we need to flatten to a single object\n    combine<S>(ruleSet1: RX.Types.StyleRuleSetRecursive<S> | undefined, ruleSet2?: RX.Types.StyleRuleSetRecursive<S>): S | undefined {\n        if (!ruleSet1 && !ruleSet2) {\n            return undefined;\n        }\n\n        const ruleSet = ruleSet1 ? (ruleSet2 ? [ruleSet1, ruleSet2] : ruleSet1) : ruleSet2;\n\n        if (ruleSet instanceof Array) {\n            let combinedStyles: any = {};\n\n            for (let i = 0; i < ruleSet.length; i++) {\n                const subRuleSet = this.combine(ruleSet[i]);\n                combinedStyles = _.extend(combinedStyles, subRuleSet);\n            }\n\n            // Use the React Native model for combining styles. Specific attributes\n            // always override the general.\n            // https://github.com/necolas/react-native-web/blob/0.10.0/docs/guides/style.md#how-styles-are-resolved\n            if ((combinedStyles.marginLeft !== undefined || combinedStyles.marginRight !== undefined ||\n                    combinedStyles.marginTop !== undefined || combinedStyles.marginBottom !== undefined) &&\n                    combinedStyles.margin !== undefined) {\n                if (combinedStyles.marginLeft === undefined) {\n                    combinedStyles.marginLeft = combinedStyles.margin;\n                }\n                if (combinedStyles.marginRight === undefined) {\n                    combinedStyles.marginRight = combinedStyles.margin;\n                }\n                if (combinedStyles.marginTop === undefined) {\n                    combinedStyles.marginTop = combinedStyles.margin;\n                }\n                if (combinedStyles.marginBottom === undefined) {\n                    combinedStyles.marginBottom = combinedStyles.margin;\n                }\n                delete combinedStyles.margin;\n            }\n\n            if ((combinedStyles.paddingLeft !== undefined || combinedStyles.paddingRight !== undefined ||\n                    combinedStyles.paddingTop !== undefined || combinedStyles.paddingBottom !== undefined) &&\n                    combinedStyles.padding !== undefined) {\n                if (combinedStyles.paddingLeft === undefined) {\n                    combinedStyles.paddingLeft = combinedStyles.padding;\n                }\n                if (combinedStyles.paddingRight === undefined) {\n                    combinedStyles.paddingRight = combinedStyles.padding;\n                }\n                if (combinedStyles.paddingTop === undefined) {\n                    combinedStyles.paddingTop = combinedStyles.padding;\n                }\n                if (combinedStyles.paddingBottom === undefined) {\n                    combinedStyles.paddingBottom = combinedStyles.padding;\n                }\n                delete combinedStyles.padding;\n            }\n\n            if (combinedStyles.borderWidth ||\n                    combinedStyles.borderTopWidth || combinedStyles.borderRightWidth ||\n                    combinedStyles.borderBottomWidth || combinedStyles.borderLeftWidth) {\n                // If the caller specified a non-zero border width\n                // but no border color or style, set the defaults to\n                // match those of React Native platforms.\n                if (combinedStyles.borderColor === undefined) {\n                    combinedStyles.borderColor = 'black';\n                }\n                if (combinedStyles.borderStyle === undefined) {\n                    combinedStyles.borderStyle = 'solid';\n                }\n            }\n\n            return combinedStyles as S;\n        }\n\n        return ruleSet as S;\n    }\n\n    // Creates opaque styles that can be used for View\n    createViewStyle(ruleSet: RX.Types.ViewStyle, cacheStyle = true): RX.Types.ViewStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for View\n    createAnimatedViewStyle(ruleSet: RX.Types.AnimatedViewStyle): RX.Types.AnimatedViewStyleRuleSet {\n        return this._adaptStyles(ruleSet, false);\n    }\n\n    // Creates opaque styles that can be used for ScrollView\n    createScrollViewStyle(ruleSet: RX.Types.ScrollViewStyle, cacheStyle = true): RX.Types.ScrollViewStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Button\n    createButtonStyle(ruleSet: RX.Types.ButtonStyle, cacheStyle = true): RX.Types.ButtonStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Text\n    createTextStyle(ruleSet: RX.Types.TextStyle, cacheStyle = true): RX.Types.TextStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle, true);\n    }\n\n    // Creates opaque styles that can be used for Text\n    createAnimatedTextStyle(ruleSet: RX.Types.AnimatedTextStyle): RX.Types.AnimatedTextStyleRuleSet {\n        return this._adaptStyles(ruleSet, false);\n    }\n\n    // Creates opaque styles that can be used for TextInput\n    createTextInputStyle(ruleSet: RX.Types.TextInputStyle, cacheStyle = true): RX.Types.TextInputStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle, true);\n    }\n\n    // Creates opaque styles that can be used for TextInput\n    createAnimatedTextInputStyle(ruleSet: RX.Types.AnimatedTextInputStyle): RX.Types.AnimatedTextInputStyleRuleSet {\n        return this._adaptStyles(ruleSet, false);\n    }\n\n    // Creates opaque styles that can be used for Link\n    createLinkStyle(ruleSet: RX.Types.LinkStyle, cacheStyle = true): RX.Types.LinkStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Image\n    createImageStyle(ruleSet: RX.Types.ImageStyle, cacheStyle = true): RX.Types.ImageStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Creates opaque styles that can be used for Image\n    createAnimatedImageStyle(ruleSet: RX.Types.AnimatedImageStyle): RX.Types.AnimatedImageStyleRuleSet {\n        return this._adaptStyles(ruleSet, false);\n    }\n\n    // Creates opaque styles that can be used for Picker\n    createPickerStyle(ruleSet: RX.Types.PickerStyle, cacheStyle = true): RX.Types.PickerStyleRuleSet {\n        return this._adaptStyles(ruleSet, cacheStyle);\n    }\n\n    // Returns the name of a CSS property or its alias. Returns undefined if the property is not supported.\n    private _getCssPropertyAlias(name: string): string | undefined {\n        // If we're inside unit tests, document may not be defined yet. We don't need prefixes for tests\n        if (typeof document === 'undefined') {\n            return undefined;\n        }\n\n        const upperName = name.charAt(0).toUpperCase() + name.slice(1);\n        let propsToTest = [name, upperName];\n\n        propsToTest = propsToTest.concat(['Webkit', 'webkit', 'Moz', 'O', 'ms'].map(\n            prefix => prefix + upperName));\n\n        const testElement = this._createDummyElement();\n        const styleObj = testElement.style as any;\n\n        for (let i = 0; i < propsToTest.length; i++) {\n            const prop = propsToTest[i];\n\n            if (styleObj[prop] !== undefined) {\n                return prop;\n            }\n        }\n\n        return undefined;\n    }\n\n    // Use memoize to cache the result after the first call.\n    private _createDummyElement = _.memoize((): HTMLElement => document.createElement('testCss'));\n\n    private _getCssPropertyAliasesJsStyle = _.memoize(() => {\n        const props = [\n            'flex',\n            'flexDirection',\n            'alignItems',\n            'justifyContent',\n            'alignSelf',\n            'alignContent',\n            'transform',\n            'transition',\n            'animationDuration',\n            'animationTimingFunction',\n            'animationDirection',\n            'animationDelay',\n            'animationIterationCount',\n            'animationName',\n            'hyphens',\n            'filter',\n            'appRegion',\n        ];\n\n        const aliases: CssAliasMap = {};\n\n        props.forEach(prop => {\n            const alias = this._getCssPropertyAlias(prop);\n            if (alias && prop !== alias) {\n                aliases[prop] = alias;\n            }\n        });\n\n        return aliases;\n    });\n\n    // Converts a property from JavaScript style (camel-case) to CSS style (lowercase with hyphens).\n    convertJsToCssStyle(prop: string): string {\n        let cssString = '';\n\n        if (prop) {\n            for (let i = 0; i < prop.length; i++) {\n                const lowerChar = prop[i].toLowerCase();\n                if (lowerChar === prop[i]) {\n                    cssString += lowerChar;\n                } else {\n                    cssString += '-' + lowerChar;\n                }\n            }\n        }\n\n        return cssString;\n    }\n\n    private _cssPropertyAliasesCssStyle = memoize(() => {\n        const jsStyleAliases = this._getCssPropertyAliasesJsStyle();\n\n        const aliases: CssAliasMap = {};\n\n        _.each(_.keys(jsStyleAliases), prop => {\n            aliases[prop] = this.convertJsToCssStyle(jsStyleAliases[prop]);\n        });\n\n        return aliases;\n    });\n\n    getCssPropertyAliasesCssStyle(): {[key: string]: string} {\n        return this._cssPropertyAliasesCssStyle();\n    }\n\n    getParentComponentName(component: any): string {\n        let parentConstructor: any;\n        const internalInstance = component._reactInternalInstance;\n\n        if (internalInstance && internalInstance._currentElement &&\n            internalInstance._currentElement._owner && internalInstance._currentElement._owner._instance) {\n            parentConstructor = internalInstance._currentElement._owner._instance.constructor;\n        }\n\n        if (!parentConstructor) {\n            return '';\n        }\n\n        return parentConstructor.name ? parentConstructor.name : parentConstructor;\n    }\n\n    private _adaptStyles(def: any, validate: boolean, isTextStyle = false): Readonly<any> {\n        if (validate) {\n            StyleLeakDetector.detectLeaks(def);\n        }\n        // Expand composite types.\n        if (def.font) {\n            if (def.font.fontFamily !== undefined) {\n                def.fontFamily = def.font.fontFamily;\n            }\n            if (def.font.fontWeight !== undefined) {\n                def.fontWeight = def.font.fontWeight;\n            }\n            if (def.font.fontStyle !== undefined) {\n                def.fontStyle = def.font.fontStyle;\n            }\n            delete def.font;\n        }\n\n        if (def.flex !== undefined) {\n            // In development mode, see if we're going to overwrite explicit flexGrow\n            // or flexShrink attributes. It's a programming error to specify these in\n            // combination with flex.\n            if (AppConfig.isDevelopmentMode()) {\n                if (def.flexGrow !== undefined || def.flexShrink !== undefined) {\n                    console.error('Conflicting rules for flex specified.');\n                }\n            }\n\n            const flexValue = def.flex as number;\n            delete def.flex;\n\n            if (flexValue > 0) {\n                // p 1 auto\n                def.flexGrow = flexValue;\n                def.flexShrink = 1;\n            } else if (flexValue < 0) {\n                // 0 -n auto\n                def.flexGrow = 0;\n                def.flexShrink = -flexValue;\n            } else {\n                // 0 0 auto\n                def.flexGrow = 0;\n                def.flexShrink = 0;\n            }\n        }\n\n        if (def.transform) {\n            const transformStrings: string[] = [];\n            const animatedTransforms: { [key: string]: {} } = {};\n            const staticTransforms: { [key: string]: string } = {};\n\n            _.each(def.transform, (t: { [key: string]: string }) => {\n                _.each(_.keys(t), key => {\n                    // Animated transforms use Animated.Value objects rather\n                    // than strings. We need to store these separately.\n                    if (typeof t[key] === 'object') {\n                        animatedTransforms[key] = t[key];\n                    } else {\n                        let value: string = t[key].toString();\n                        if (key.indexOf('translate') === 0) {\n                            value += 'px';\n                        }\n\n                        transformStrings.push(key + '(' + value + ')');\n                        staticTransforms[key] = value;\n                    }\n                });\n            });\n\n            delete def.transform;\n\n            if (transformStrings.length > 0) {\n                def.transform = transformStrings.join(' ');\n            }\n\n            if (_.keys(animatedTransforms).length > 0) {\n                def.animatedTransforms = animatedTransforms;\n                def.staticTransforms = staticTransforms;\n            }\n        }\n\n        if (def.shadowOffset !== undefined || def.shadowRadius !== undefined || def.shadowColor !== undefined) {\n            let width = 0;\n            let height = 0;\n            let radius = 0;\n            let color = 'black';\n\n            if (def.shadowOffset !== undefined) {\n                width = def.shadowOffset.width;\n                height = def.shadowOffset.height;\n                delete def.shadowOffset;\n            }\n\n            if (def.shadowRadius !== undefined) {\n                radius = def.shadowRadius;\n                delete def.shadowRadius;\n            }\n\n            if (def.shadowColor !== undefined) {\n                color = def.shadowColor;\n                delete def.shadowColor;\n            }\n\n            if (isTextStyle) {\n                def.textShadow = width + 'px ' + height + 'px ' + radius + 'px ' + color;\n            } else {\n                def.boxShadow = width + 'px ' + height + 'px ' + radius + 'px 0px ' + color;\n            }\n        }\n\n        // CSS (and React JS) support lineHeight defined as either a multiple of the font\n        // size or a pixel count. The RX.Types interface always uses a pixel count. We need to\n        // convert to the string notation to make CSS happy.\n        if (def.lineHeight !== undefined) {\n            def.lineHeight = def.lineHeight + 'px';\n        }\n\n        // Add default border width if border style or some subset of border widths\n        // were provided. Otherwise the browser will default to a two-pixel border.\n        if (def.borderStyle || def.borderTopWidth || def.borderRightWidth || def.borderBottomWidth || def.borderLeftWidth) {\n            if (def.borderWidth === undefined) {\n                if (def.borderTopWidth === undefined) {\n                    def.borderTopWidth = 0;\n                }\n                if (def.borderRightWidth === undefined) {\n                    def.borderRightWidth = 0;\n                }\n                if (def.borderBottomWidth === undefined) {\n                    def.borderBottomWidth = 0;\n                }\n                if (def.borderLeftWidth === undefined) {\n                    def.borderLeftWidth = 0;\n                }\n            }\n        }\n\n        // CSS doesn't support vertical/horizontal margins or padding.\n        if (def.marginVertical !== undefined) {\n            if (def.marginTop === undefined) {\n                def.marginTop = def.marginVertical;\n            }\n            if (def.marginBottom === undefined) {\n                def.marginBottom = def.marginVertical;\n            }\n            delete def.marginVertical;\n        }\n\n        if (def.marginHorizontal !== undefined) {\n            if (def.marginLeft === undefined) {\n                def.marginLeft = def.marginHorizontal;\n            }\n            if (def.marginRight === undefined) {\n                def.marginRight = def.marginHorizontal;\n            }\n            delete def.marginHorizontal;\n        }\n\n        if (def.paddingVertical !== undefined) {\n            if (def.paddingTop === undefined) {\n                def.paddingTop = def.paddingVertical;\n            }\n            if (def.paddingBottom === undefined) {\n                def.paddingBottom = def.paddingVertical;\n            }\n            delete def.paddingVertical;\n        }\n\n        if (def.paddingHorizontal !== undefined) {\n            if (def.paddingLeft === undefined) {\n                def.paddingLeft = def.paddingHorizontal;\n            }\n            if (def.paddingRight === undefined) {\n                def.paddingRight = def.paddingHorizontal;\n            }\n            delete def.paddingHorizontal;\n        }\n\n        // CSS doesn't support 'textDecorationLine'\n        if (def.textDecorationLine !== undefined) {\n            def.textDecoration = def.textDecorationLine;\n            delete def.textDecorationLine;\n        }\n\n        // CSS doesn't support 'textDecorationStyle'\n        if (def.textDecorationStyle !== undefined) {\n            if (def.textDecoration !== undefined) {\n                def.textDecoration += ' ' + def.textDecorationStyle;\n            } else {\n                def.textDecoration = def.textDecorationStyle;\n            }\n            delete def.textDecorationStyle;\n        }\n\n        // CSS doesn't support 'textDecorationColor'\n        if (def.textDecorationColor !== undefined) {\n            if (def.textDecoration !== undefined) {\n                def.textDecoration += ' ' + def.textDecorationColor;\n            } else {\n                def.textDecoration = def.textDecorationColor;\n            }\n            delete def.textDecorationColor;\n        }\n\n        // Add common aliases if necessary.\n        const jsAliases = this._getCssPropertyAliasesJsStyle();\n        for (const prop in jsAliases) {\n            if (def[prop] !== undefined && jsAliases[prop]) {\n                def[jsAliases[prop]] = def[prop];\n            }\n        }\n\n        // Add IE-specific word wrap property.\n        if (def.wordBreak === 'break-word') {\n            def.wordWrap = 'break-word';\n        }\n\n        return AppConfig.isDevelopmentMode() ? Object.freeze(def) : def;\n    }\n}\n\nexport function memoize<T extends (...args: any[]) => any>(func: T, resolver?: (...args: any[]) => any): T {\n    return _.memoize(func, resolver);\n}\n\nexport default new Styles();\n"
  },
  {
    "path": "src/web/Text.tsx",
    "content": "/**\n * Text.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform Text abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Text as TextBase, Types } from '../common/Interfaces';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport Styles from './Styles';\n\n// Adding a CSS rule to display non-selectable texts. Those texts\n// will be displayed as pseudo elements to prevent them from being copied\n// to clipboard. It's not possible to style pseudo elements with inline\n// styles, so, we're dynamically creating a <style> tag with the rule.\nif (typeof document !== 'undefined') {\n    const textAsPseudoElement = '[data-text-as-pseudo-element]::before { content: attr(data-text-as-pseudo-element); }';\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    style.appendChild(document.createTextNode(textAsPseudoElement));\n    document.head.appendChild(style);\n}\n\n// Cast to any to allow merging of web and RX styles\nconst _styles = {\n    defaultStyle: {\n        position: 'relative',\n        display: 'inline',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflow: 'hidden',\n        whiteSpace: 'pre-wrap',\n        overflowWrap: 'break-word',\n    } as any,\n    ellipsis: {\n        position: 'relative',\n        display: 'inline',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflow: 'hidden',\n        whiteSpace: 'pre',\n        textOverflow: 'ellipsis',\n    } as any,\n};\n\nexport interface TextContext {\n    isRxParentAText: boolean;\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class Text extends TextBase {\n    static contextTypes = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: TextContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n    };\n\n    private _mountedText: HTMLDivElement | null = null;\n\n    getChildContext() {\n        // Let descendant Types components know that their nearest Types ancestor is an Types.Text.\n        // Because they're in an Types.Text, they should style themselves specially for appearing\n        // inline with text.\n        return { isRxParentAText: true };\n    }\n\n    render() {\n        // Handle special case\n        if (typeof this.props.children === 'string' && this.props.children === '\\n') {\n            return <br/>;\n        }\n\n        const isAriaHidden = AccessibilityUtil.isHidden(this.props.importantForAccessibility);\n\n        if (this.props.selectable || typeof this.props.children !== 'string') {\n            return (\n                <div\n                    ref={ this._onMount }\n                    style={ this._getStyles() as any }\n                    aria-hidden={ isAriaHidden }\n                    onClick={ this.props.onPress }\n                    id={ this.props.id }\n                    onContextMenu={ this.props.onContextMenu }\n                    data-test-id={ this.props.testId }\n                >\n                    { this.props.children }\n                </div>\n            );\n        } else {\n            // user-select CSS property doesn't prevent the text from being copied to clipboard.\n            // To avoid getting to clipboard, the text from data-text-as-pseudo-element attribute\n            // will be displayed as pseudo element.\n            return (\n                <div\n                    ref={ this._onMount }\n                    style={ this._getStyles() as any }\n                    aria-hidden={ isAriaHidden }\n                    onClick={ this.props.onPress }\n                    onContextMenu={ this.props.onContextMenu }\n                    data-text-as-pseudo-element={ this.props.children }\n                    id={ this.props.id }\n                    data-test-id={ this.props.testId }\n                />\n            );\n        }\n    }\n\n    componentDidMount() {\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    private _onMount = (ref: HTMLDivElement | null) => {\n        this._mountedText = ref;\n    };\n\n    private _getStyles(): Types.TextStyleRuleSet {\n        // There's no way in HTML to properly handle numberOfLines > 1,\n        // but we can correctly handle the common case where numberOfLines is 1.\n        const combinedStyles = Styles.combine([this.props.numberOfLines === 1 ?\n            _styles.ellipsis : _styles.defaultStyle, this.props.style]);\n\n        if (this.props.selectable) {\n            combinedStyles.userSelect = 'text';\n            combinedStyles.WebkitUserSelect = 'text';\n            combinedStyles.MozUserSelect = 'text';\n            combinedStyles.msUserSelect = 'text';\n        }\n\n        // Handle cursor styles\n        if (!combinedStyles.cursor) {\n            if (this.props.selectable) {\n                combinedStyles.cursor = 'text';\n            } else {\n                combinedStyles.cursor = 'inherit';\n            }\n\n            if (this.props.onPress) {\n                combinedStyles.cursor = 'pointer';\n            }\n        }\n\n        return combinedStyles;\n    }\n\n    blur() {\n        if (this._mountedText) {\n            this._mountedText.blur();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._mountedText !== null,\n        );\n    }\n\n    focus() {\n        if (this._mountedText) {\n            this._mountedText.focus();\n        }\n    }\n\n    getSelectedText(): string {\n        return ''; // Not implemented yet.\n    }\n}\n\nexport default Text;\n"
  },
  {
    "path": "src/web/TextInput.tsx",
    "content": "/**\n * TextInput.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform TextInput abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { Types } from '../common/Interfaces';\n\nimport { applyFocusableComponentMixin } from './utils/FocusManager';\nimport { isEmpty } from './utils/lodashMini';\nimport Styles from './Styles';\n\nexport interface TextInputState {\n    inputValue?: string;\n    autoResize?: boolean;\n}\n\nconst _isMac = (typeof navigator !== 'undefined') && (typeof navigator.platform === 'string') && (navigator.platform.indexOf('Mac') >= 0);\n\n// Cast to any to allow merging of web and RX styles\nconst _styles = {\n    defaultStyle: {\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'row',\n        flexBasis: 'auto',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflowX: 'hidden',\n        overflowY: 'auto',\n        alignItems: 'stretch',\n    } as any,\n    formStyle: {\n        display: 'flex',\n        flex: 1,\n    } as any,\n};\n\nexport interface TextInputContext {\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\ninterface TextInputPlaceholderCacheItem {\n    refCounter: number;\n    styleElement: HTMLStyleElement;\n}\n\nclass TextInputPlaceholderSupport {\n    private static _cachedStyles: { [color: string]: TextInputPlaceholderCacheItem } = {};\n\n    static getClassName(color: string): string {\n        const key = this._colorKey(color);\n\n        return `reactxp-placeholder-${key}`;\n    }\n\n    static addRef(color: string) {\n        if (typeof document === undefined) {\n            return;\n        }\n\n        const cache = this._cachedStyles;\n        const key = this._colorKey(color);\n\n        if (cache.hasOwnProperty(key)) {\n            cache[key].refCounter++;\n        } else {\n            const className = this.getClassName(color);\n            const style = document.createElement('style');\n            style.type = 'text/css';\n            style.textContent = this._getStyle(className, color);\n\n            document.head.appendChild(style);\n\n            cache[key] = {\n                refCounter: 1,\n                styleElement: style,\n            };\n        }\n    }\n\n    static removeRef(color: string) {\n        const cache = this._cachedStyles;\n        const key = this._colorKey(color);\n\n        if (cache.hasOwnProperty(key)) {\n            const item = cache[key];\n\n            if (--item.refCounter < 1) {\n                const styleElement = item.styleElement;\n                if (styleElement.parentNode) {\n                    styleElement.parentNode.removeChild(styleElement);\n                }\n                delete cache[key];\n            }\n        }\n    }\n\n    private static _colorKey(color: string): string {\n        return color.toLowerCase()\n            .replace(/(,|\\.|#)/g, '_')\n            .replace(/[^a-z0-9_]/g, '');\n    }\n\n    private static _getStyle(className: string, placeholderColor: string): string {\n        const selectors = [\n            '::placeholder', // Modern browsers\n            '::-webkit-input-placeholder',  // Webkit\n            '::-moz-placeholder', // Firefox 19+\n            ':-moz-placeholder', // Firefox 18-\n            ':-ms-input-placeholder', // IE 10+\n        ];\n\n        return selectors\n            .map(pseudoSelector =>\n                `.${className}${pseudoSelector} {\\n` +\n                    `  opacity: 1;\\n` +\n                    `  color: ${placeholderColor};\\n` +\n                    `}`,\n            ).join('\\n');\n    }\n}\n\nexport class TextInput extends React.Component<Types.TextInputProps, TextInputState> {\n    static contextTypes: React.ValidationMap<any> = {\n        focusArbitrator: PropTypes.object,\n    };\n\n    context!: TextInputContext;\n\n    private _mountedComponent: HTMLInputElement | HTMLTextAreaElement | null = null;\n    private _selectionStart = 0;\n    private _selectionEnd = 0;\n\n    private _isFocused = false;\n    private _ariaLiveEnabled = false;\n\n    constructor(props: Types.TextInputProps, context?: TextInputContext) {\n        super(props, context);\n\n        this.state = {\n            inputValue: props.value !== undefined ? props.value : (props.defaultValue || ''),\n            autoResize: TextInput._shouldAutoResize(props),\n        };\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.TextInputProps) {\n        const nextState: Partial<TextInputState> = {};\n\n        if (nextProps.value !== undefined && nextProps.value !== this.state.inputValue) {\n            nextState.inputValue = nextProps.value;\n        }\n\n        if (nextProps.style !== this.props.style || nextProps.multiline !== this.props.multiline) {\n            const fixedHeight = TextInput._shouldAutoResize(nextProps);\n            if (this.state.autoResize !== fixedHeight) {\n                nextState.autoResize = fixedHeight;\n            }\n        }\n\n        if (nextProps.placeholderTextColor !== this.props.placeholderTextColor) {\n            if (nextProps.placeholderTextColor) {\n                TextInputPlaceholderSupport.addRef(nextProps.placeholderTextColor);\n            }\n\n            if (this.props.placeholderTextColor) {\n                TextInputPlaceholderSupport.removeRef(this.props.placeholderTextColor);\n            }\n        }\n\n        if (!isEmpty(nextState)) {\n            this.setState(nextState, () => {\n                // Resize as needed after state is set\n                if (this._mountedComponent instanceof HTMLTextAreaElement) {\n                    TextInput._updateScrollPositions(this._mountedComponent, !!this.state.autoResize);\n                }\n            });\n        }\n    }\n\n    componentDidMount() {\n        if (this.props.placeholderTextColor) {\n            TextInputPlaceholderSupport.addRef(this.props.placeholderTextColor);\n        }\n\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n    }\n\n    componentWillUnmount() {\n        if (this.props.placeholderTextColor) {\n            TextInputPlaceholderSupport.removeRef(this.props.placeholderTextColor);\n        }\n    }\n\n    render() {\n        const combinedStyles = Styles.combine([_styles.defaultStyle, this.props.style]);\n\n        // Always hide the outline.\n        combinedStyles.outline = 'none';\n        combinedStyles.resize = 'none';\n\n        // Set the border to zero width if not otherwise specified.\n        if (combinedStyles.borderWidth === undefined) {\n            combinedStyles.borderWidth = 0;\n        }\n\n        // By default, the control is editable.\n        const editable = (this.props.editable !== undefined ? this.props.editable : true);\n        const spellCheck = (this.props.spellCheck !== undefined ? this.props.spellCheck : this.props.autoCorrect);\n\n        const className = this.props.placeholderTextColor !== undefined ?\n            TextInputPlaceholderSupport.getClassName(this.props.placeholderTextColor) : undefined;\n\n        // Use a textarea for multi-line and a regular input for single-line.\n        if (this.props.multiline) {\n            return (\n                <textarea\n                    ref={ this._onMount }\n                    style={ combinedStyles }\n                    value={ this.state.inputValue }\n                    title={ this.props.title }\n                    tabIndex={ this.props.tabIndex }\n\n                    autoCorrect={ this.props.autoCorrect === false ? 'off' : undefined }\n                    spellCheck={ spellCheck }\n                    disabled={ !editable }\n                    maxLength={ this.props.maxLength }\n                    placeholder={ this.props.placeholder }\n\n                    className={ className }\n\n                    onChange={ this._onInputChanged }\n                    onKeyDown={ this._onKeyDown }\n                    onKeyUp={ this._checkSelectionChanged }\n                    onInput={ this._onMultilineInput }\n                    onFocus={ this._onFocus }\n                    onBlur={ this._onBlur }\n                    onMouseDown={ this._checkSelectionChanged }\n                    onMouseUp={ this._checkSelectionChanged }\n                    onPaste={ this._onPaste }\n                    onScroll={ this._onScroll }\n                    aria-label={ this.props.accessibilityLabel || this.props.title }\n                    data-test-id={ this.props.testId }\n                />\n            );\n        } else {\n            const { keyboardTypeValue, wrapInForm, pattern } = this._getKeyboardType();\n\n            let input = (\n                <input\n                    ref={ this._onMount }\n                    style={ combinedStyles }\n                    value={ this.state.inputValue }\n                    title={ this.props.title }\n                    tabIndex={ this.props.tabIndex }\n\n                    className={ className }\n\n                    autoCapitalize={ this.props.autoCapitalize }\n                    autoCorrect={ this.props.autoCorrect === false ? 'off' : undefined }\n                    spellCheck={ spellCheck }\n                    disabled={ !editable }\n                    maxLength={ this.props.maxLength }\n                    placeholder={ this.props.placeholder }\n                    size={ 1 }\n\n                    onChange={ this._onInputChanged }\n                    onKeyDown={ this._onKeyDown }\n                    onKeyUp={ this._checkSelectionChanged }\n                    onInput={ this._onInput }\n                    onFocus={ this._onFocus }\n                    onBlur={ this._onBlur }\n                    onMouseDown={ this._checkSelectionChanged }\n                    onMouseUp={ this._checkSelectionChanged }\n                    onPaste={ this._onPaste }\n                    aria-label={ this.props.accessibilityLabel || this.props.title }\n                    type={ keyboardTypeValue }\n                    pattern={ pattern }\n                    data-test-id={ this.props.testId }\n                />\n            );\n\n            if (wrapInForm) {\n                // Wrap the input in a form tag if required\n                input = (\n                    <form action='' onSubmit={ ev => { /* prevent form submission/page reload */ ev.preventDefault(); this.blur(); } }\n                        style={ _styles.formStyle }>\n                        { input }\n                    </form>\n                );\n            }\n\n            return input;\n        }\n    }\n\n    private _onMount = (comp: HTMLInputElement | HTMLTextAreaElement | null) => {\n        this._mountedComponent = comp;\n        if (this._mountedComponent && this._mountedComponent instanceof HTMLTextAreaElement) {\n            TextInput._updateScrollPositions(this._mountedComponent, !!this.state.autoResize);\n        }\n    };\n\n    private _onMultilineInput = (ev: React.FormEvent<HTMLTextAreaElement>) => {\n        this._onInput();\n        TextInput._updateScrollPositions(ev.currentTarget, !!this.state.autoResize);\n    };\n\n    private _onInput = () => {\n        if (_isMac && this._mountedComponent && this._isFocused && !this._ariaLiveEnabled) {\n            // VoiceOver does not handle text inputs properly at the moment, aria-live is a temporary workaround.\n            // And we're adding aria-live only for the focused input which is being edited, otherwise it might\n            // interrupt some required announcements.\n            this._mountedComponent.setAttribute('aria-live', 'assertive');\n            this._ariaLiveEnabled = true;\n        }\n    };\n\n    private static _shouldAutoResize(props: Types.TextInputProps) {\n        // Single line boxes don't need auto-resize\n        if (!props.multiline) {\n            return false;\n        }\n\n        const combinedStyles = Styles.combine(props.style);\n        if (!combinedStyles || typeof combinedStyles === 'number') {\n            // Number-type styles aren't allowed on web but if they're found we can't decode them so assume not fixed height\n            return true;\n        } else if (Array.isArray(combinedStyles)) {\n            // Iterate across the array and see if there's any height value\n            // It's possible that the height could be set via another mechanism (like absolute positioning) which would potenailly\n            // incorrectly engage the autoResize mode\n            return combinedStyles.some(style => {\n                if (!style || typeof style === 'number') {\n                    return true;\n                }\n                return style.height === undefined;\n            });\n        } else {\n            return combinedStyles.height === undefined;\n        }\n    }\n\n    private static _updateScrollPositions(element: HTMLTextAreaElement, autoResize: boolean) {\n        // If the height is fixed, there's nothing more to do\n        if (!autoResize) {\n            return;\n        }\n\n        // When scrolling we need to retain scroll tops of all elements\n        const scrollTops = this._getParentElementAndTops(element);\n\n        // Reset height to 1px so that we can detect shrinking TextInputs\n        element.style.height = '1px';\n        element.style.height = element.scrollHeight + 'px';\n\n        scrollTops.forEach(obj => {\n            obj.el.scrollTop = obj.top;\n        });\n\n    }\n\n    private static _getParentElementAndTops(textAreaElement: HTMLTextAreaElement) {\n        let element: HTMLElement = textAreaElement;\n        const results = [];\n        while (element && element.parentElement) {\n            element = element.parentElement;\n            results.push({\n                el: element,\n                top: element.scrollTop,\n            });\n        }\n        return results;\n    }\n\n    private _onFocus = (e: Types.FocusEvent) => {\n        if (this._mountedComponent) {\n            this._isFocused = true;\n\n            if (this.props.onFocus) {\n                this.props.onFocus(e);\n            }\n        }\n    };\n\n    private _onBlur = (e: Types.FocusEvent) => {\n        if (this._mountedComponent) {\n            this._isFocused = false;\n\n            if (_isMac && this._ariaLiveEnabled) {\n                this._mountedComponent.removeAttribute('aria-live');\n                this._ariaLiveEnabled = false;\n            }\n\n            if (this.props.onBlur) {\n                this.props.onBlur(e);\n            }\n        }\n    };\n\n    private _getKeyboardType(): { keyboardTypeValue: string; wrapInForm: boolean; pattern: string | undefined } {\n        // Determine the correct virtual keyboardType in HTML 5.\n        // Some types require the <input> tag to be wrapped in a form.\n        // Pattern is used on numeric keyboardType to display numbers only.\n        let keyboardTypeValue = 'text';\n        let wrapInForm = false;\n        let pattern;\n\n        if (this.props.keyboardType === 'numeric') {\n            pattern = '\\\\d*';\n        } else if (this.props.keyboardType === 'number-pad') {\n            keyboardTypeValue = 'tel';\n        } else if (this.props.keyboardType === 'email-address') {\n            keyboardTypeValue = 'email';\n        }\n\n        if (this.props.returnKeyType === 'search') {\n            keyboardTypeValue = 'search';\n            wrapInForm = true;\n        }\n\n        if (this.props.secureTextEntry) {\n            keyboardTypeValue = 'password';\n        }\n\n        return { keyboardTypeValue, wrapInForm, pattern };\n    }\n\n    private _onPaste = (e: Types.ClipboardEvent) => {\n        if (this.props.onPaste) {\n            this.props.onPaste(e);\n        }\n\n        this._checkSelectionChanged();\n    };\n\n    private _onInputChanged = (event: React.ChangeEvent<HTMLElement>) => {\n        if (!event.defaultPrevented) {\n            if (this._mountedComponent) {\n                // Has the input value changed?\n                const value = this._mountedComponent.value || '';\n                if (this.state.inputValue !== value) {\n                    // If the parent component didn't specify a value, we'll keep\n                    // track of the modified value.\n                    if (this.props.value === undefined) {\n                        this.setState({\n                            inputValue: value,\n                        });\n                    }\n\n                    if (this.props.onChangeText) {\n                        this.props.onChangeText(value);\n                    }\n                }\n\n                this._checkSelectionChanged();\n            }\n        }\n    };\n\n    private _checkSelectionChanged = () => {\n        if (this._mountedComponent) {\n            if (this._selectionStart !== this._mountedComponent.selectionStart ||\n                    this._selectionEnd !== this._mountedComponent.selectionEnd) {\n                this._selectionStart = this._mountedComponent.selectionStart || 0;\n                this._selectionEnd = this._mountedComponent.selectionEnd || 0;\n\n                if (this.props.onSelectionChange) {\n                    this.props.onSelectionChange(this._selectionStart, this._selectionEnd);\n                }\n            }\n        }\n    };\n\n    private _onKeyDown = (e: Types.KeyboardEvent) => {\n        // Generate a \"submit editing\" event if the user\n        // pressed enter or return.\n        if (e.keyCode === 13 && (!this.props.multiline || this.props.blurOnSubmit)) {\n            if (this.props.onSubmitEditing) {\n                this.props.onSubmitEditing();\n            }\n\n            if (this.props.blurOnSubmit) {\n                this.blur();\n            }\n        }\n\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(e);\n        }\n\n        this._checkSelectionChanged();\n    };\n\n    private _onScroll = (e: React.UIEvent<HTMLTextAreaElement>) => {\n        const targetElement = e.currentTarget;\n        // Fix scrollTop if the TextInput can auto-grow\n        // If the item is bounded by max-height, don't scroll since we want input to follow the cursor at that point\n        if (this.state.autoResize && targetElement.scrollHeight < targetElement.clientHeight) {\n            targetElement.scrollTop = 0;\n        }\n\n        if (this.props.onScroll) {\n            this.props.onScroll(targetElement.scrollLeft, targetElement.scrollTop);\n        }\n    };\n\n    private _focus = () => {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => !!this._mountedComponent,\n        );\n    };\n\n    blur() {\n        if (this._mountedComponent) {\n            this._mountedComponent.blur();\n        }\n    }\n\n    requestFocus() {\n        this._focus();\n    }\n\n    focus() {\n        if (this._mountedComponent) {\n            this._mountedComponent.focus();\n        }\n    }\n\n    setAccessibilityFocus() {\n        this._focus();\n    }\n\n    isFocused() {\n        if (this._mountedComponent) {\n            return document.activeElement === this._mountedComponent;\n        }\n        return false;\n    }\n\n    selectAll() {\n        if (this._mountedComponent) {\n            this._mountedComponent.select();\n        }\n    }\n\n    selectRange(start: number, end: number) {\n        if (this._mountedComponent) {\n            const component = this._mountedComponent as HTMLInputElement;\n            component.setSelectionRange(start, end);\n        }\n    }\n\n    getSelectionRange(): { start: number; end: number } {\n        const range = {\n            start: 0,\n            end: 0,\n        };\n        if (this._mountedComponent) {\n            range.start = this._mountedComponent.selectionStart || 0;\n            range.end = this._mountedComponent.selectionEnd || 0;\n        }\n\n        return range;\n    }\n\n    setValue(value: string): void {\n        const inputValue = value || '';\n        if (this.state.inputValue !== inputValue) {\n            // It's important to set the actual value in the DOM immediately. This allows us to call other related methods\n            // like selectRange synchronously afterward.\n            if (this._mountedComponent) {\n                this._mountedComponent.value = inputValue;\n            }\n\n            this.setState({\n                inputValue: inputValue,\n            });\n\n            if (this.props.onChangeText) {\n                this.props.onChangeText(value);\n            }\n        }\n    }\n}\n\napplyFocusableComponentMixin(TextInput);\n\nexport default TextInput;\n"
  },
  {
    "path": "src/web/UserInterface.ts",
    "content": "/**\n * UserInterface.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the ReactXP interfaces related to\n * UI (layout measurements, etc.).\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport * as RX from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\nimport ScrollViewConfig from './ScrollViewConfig';\n\nexport class UserInterface extends RX.UserInterface {\n    private _isNavigatingWithKeyboard = false;\n\n    constructor() {\n        super();\n        this.keyboardNavigationEvent.subscribe(this._keyboardNavigationStateChanged);\n    }\n\n    measureLayoutRelativeToWindow(component: React.Component<any, any>): Promise<RX.Types.LayoutInfo> {\n        const deferred = new Defer<RX.Types.LayoutInfo>();\n        let componentDomNode: HTMLElement | null = null;\n\n        try {\n            componentDomNode = ReactDOM.findDOMNode(component) as HTMLElement | null;\n        } catch {\n            // Component is no longer mounted.\n        }\n\n        if (!componentDomNode) {\n            deferred.reject('measureLayoutRelativeToWindow failed');\n        } else {\n            const componentBoundingRect = componentDomNode.getBoundingClientRect();\n\n            deferred.resolve({\n                x: componentBoundingRect.left,\n                y: componentBoundingRect.top,\n                width: componentBoundingRect.width,\n                height: componentBoundingRect.height,\n            });\n        }\n\n        return deferred.promise();\n    }\n\n    measureLayoutRelativeToAncestor(component: React.Component<any, any>,\n            ancestor: React.Component<any, any>): Promise<RX.Types.LayoutInfo> {\n        const deferred = new Defer<RX.Types.LayoutInfo>();\n        let componentDomNode: HTMLElement | null = null;\n        let ancestorDomNode: HTMLElement | null = null;\n\n        try {\n            componentDomNode = ReactDOM.findDOMNode(component) as HTMLElement | null;\n            ancestorDomNode = ReactDOM.findDOMNode(ancestor) as HTMLElement | null;\n        } catch {\n            // Components are no longer mounted.\n        }\n\n        if (!componentDomNode || !ancestorDomNode) {\n            deferred.reject('measureLayoutRelativeToAncestor failed');\n        } else {\n            const componentBoundingRect = componentDomNode.getBoundingClientRect();\n            const ancestorBoundingRect = ancestorDomNode.getBoundingClientRect();\n\n            deferred.resolve({\n                x: componentBoundingRect.left - ancestorBoundingRect.left,\n                y: componentBoundingRect.top - ancestorBoundingRect.top,\n                width: componentBoundingRect.width,\n                height: componentBoundingRect.height,\n            });\n        }\n\n        return deferred.promise();\n    }\n\n    measureWindow(rootViewId?: string): RX.Types.LayoutInfo {\n        // Mo multi window support, default to main window\n        return {\n            x: 0,\n            y: 0,\n            width: window.innerWidth,\n            height: window.innerHeight,\n        };\n    }\n\n    getContentSizeMultiplier(): Promise<number> {\n        // Browsers don't support font-specific scaling. They scale all of their\n        // UI elements the same.\n        return Promise.resolve(1);\n    }\n\n    isHighPixelDensityScreen(): boolean {\n        return this.getPixelRatio() > 1;\n    }\n\n    getPixelRatio(): number {\n        let pixelRatio = 0;\n        if (window.devicePixelRatio) {\n            pixelRatio = window.devicePixelRatio;\n        }\n\n        return pixelRatio;\n    }\n\n    setMainView(element: React.ReactElement<any>): void {\n        FrontLayerViewManager.setMainView(element);\n    }\n\n    registerRootView(viewKey: string, getComponentFunc: Function): void {\n        // Nothing to do\n    }\n\n    useCustomScrollbars(enable = true): void {\n        ScrollViewConfig.setUseCustomScrollbars(enable);\n    }\n\n    dismissKeyboard(): void {\n        // Nothing to do\n    }\n\n    enableTouchLatencyEvents(latencyThresholdMs: number): void {\n        // Nothing to do\n    }\n\n    evaluateTouchLatency(e: RX.Types.MouseEvent): void {\n        // Nothing to do\n    }\n\n    isNavigatingWithKeyboard(): boolean {\n        return this._isNavigatingWithKeyboard;\n    }\n\n    private _keyboardNavigationStateChanged = (isNavigatingWithKeyboard: boolean): void => {\n        this._isNavigatingWithKeyboard = isNavigatingWithKeyboard;\n    };\n}\n\nexport default new UserInterface();\n"
  },
  {
    "path": "src/web/UserPresence.ts",
    "content": "/**\n * UserPresence.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the ReactXP interfaces related to\n * user presence.\n *\n * User is considered present when user is focused on the App and has interacted with the App in the last 60 seconds.\n * User is considered not present, if app is not focused (backgrounded or blurred) or the app is focused\n * but the user has not intereacted with the app in the last 60 seconds\n */\n\nimport * as RX from '../common/Interfaces';\n\nimport AppVisibilityUtils from './utils/AppVisibilityUtils';\n\nexport class UserPresence extends RX.UserPresence {\n    private _isPresent: boolean;\n\n    constructor() {\n        super();\n        // Handle test environment where document is not defined.\n        if (typeof(document) !== 'undefined') {\n            this._isPresent = AppVisibilityUtils.hasFocusAndActive();\n            AppVisibilityUtils.onFocusedEvent.subscribe(this._handleFocus.bind(this));\n            AppVisibilityUtils.onBlurredEvent.subscribe(this._handleBlur.bind(this));\n            AppVisibilityUtils.onWakeUpEvent.subscribe(this._handleWakeup.bind(this));\n            AppVisibilityUtils.onIdleEvent.subscribe(this._handleIdle.bind(this));\n        } else {\n            this._isPresent = false;\n        }\n    }\n\n    isUserPresent(): boolean {\n        // Handle test environment where document is not defined.\n        if (typeof(document) !== 'undefined') {\n            return this._isPresent;\n        } else {\n            return true;\n        }\n    }\n\n    private _setUserPresent(isPresent: boolean): void {\n        if (this._isPresent !== isPresent) {\n            this._isPresent = isPresent;\n\n            this.userPresenceChangedEvent.fire(isPresent);\n        }\n    }\n\n    private _handleWakeup(): void {\n        this._setUserPresent(true);\n    }\n\n    private _handleIdle(): void {\n        this._setUserPresent(false);\n    }\n\n    private _handleFocus(): void {\n        this._setUserPresent(true);\n    }\n\n    private _handleBlur(): void {\n        this._setUserPresent(false);\n    }\n}\n\nconst instance = new UserPresence();\nexport default instance;\n"
  },
  {
    "path": "src/web/View.tsx",
    "content": "/**\n * View.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific implementation of the cross-platform View abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport AppConfig from '../common/AppConfig';\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport { RestrictFocusType } from '../common/utils/FocusManager';\nimport * as RX from '../common/Interfaces';\nimport { PopupComponent } from '../common/PopupContainerViewBase';\n\nimport AccessibilityUtil from './AccessibilityUtil';\nimport AnimateListEdits from './listAnimations/AnimateListEdits';\nimport { applyFocusableComponentMixin, FocusManager } from './utils/FocusManager';\nimport PopupContainerView from './PopupContainerView';\nimport restyleForInlineText from './utils/restyleForInlineText';\nimport Styles from './Styles';\nimport ViewBase from './ViewBase';\n\n// Cast to any to allow merging of web and RX styles\nconst _styles = {\n    defaultStyle: {\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        flexGrow: 0,\n        flexShrink: 0,\n        overflow: 'hidden',\n        alignItems: 'stretch',\n    } as any,\n\n    // See resize detector comments in renderResizeDetectorIfNeeded() method below.\n    resizeDetectorContainerStyles: {\n        position: 'absolute',\n        left: '0',\n        top: '0',\n        right: '0',\n        bottom: '0',\n        overflow: 'scroll',\n        zIndex: '-1',\n        visibility: 'hidden',\n    },\n\n    resizeGrowDetectorStyles: {\n        position: 'absolute',\n        left: '100500px',\n        top: '100500px',\n        width: '1px',\n        height: '1px',\n    },\n\n    resizeShrinkDetectorStyles: {\n        position: 'absolute',\n        width: '150%',\n        height: '150%',\n    },\n};\n\nif (typeof document !== 'undefined') {\n    const ignorePointerEvents = '.reactxp-ignore-pointer-events  * { pointer-events: auto; }';\n    const blockPointerEvents = '.reactxp-block-pointer-events * { pointer-events: none !important; }';\n    const head = document.head;\n    const style = document.createElement('style');\n    style.type = 'text/css';\n    style.appendChild(document.createTextNode(ignorePointerEvents));\n    style.appendChild(document.createTextNode(blockPointerEvents));\n    head.appendChild(style);\n}\n\nexport interface ViewContext {\n    isRxParentAText?: boolean;\n    focusManager?: FocusManager;\n    popupContainer?: PopupContainerView;\n    focusArbitrator?: FocusArbitratorProvider;\n}\n\nexport class View extends ViewBase<RX.Types.ViewProps, RX.Types.Stateless, RX.View> {\n    static contextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool,\n        focusManager: PropTypes.object,\n        popupContainer: PropTypes.object,\n        focusArbitrator: PropTypes.object,\n    };\n    // Context is provided by super - just re-typing here\n    context!: ViewContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n        focusManager: PropTypes.object,\n        popupContainer: PropTypes.object,\n        focusArbitrator: PropTypes.object,\n    };\n\n    private _focusManager: FocusManager | undefined;\n    private _limitFocusWithin = false;\n    private _isFocusLimited = false;\n    private _isFocusRestricted: boolean | undefined;\n\n    private _focusArbitratorProvider: FocusArbitratorProvider | undefined;\n\n    private _resizeDetectorAnimationFrame: number | undefined;\n    private _resizeDetectorNodes: { grow?: HTMLDivElement; shrink?: HTMLDivElement } = {};\n\n    private _popupContainer: PopupContainerView | undefined;\n    private _popupToken: PopupComponent | undefined;\n\n    constructor(props: RX.Types.ViewProps, context?: ViewContext) {\n        super(props, context);\n\n        this._limitFocusWithin =\n            (props.limitFocusWithin === RX.Types.LimitFocusType.Limited) ||\n            (props.limitFocusWithin === RX.Types.LimitFocusType.Accessible);\n\n        if (this.props.restrictFocusWithin || this._limitFocusWithin) {\n            this._focusManager = new FocusManager(context && context.focusManager);\n\n            if (this._limitFocusWithin) {\n                this.setFocusLimited(true);\n            }\n        }\n\n        this._popupContainer = context && context.popupContainer;\n\n        if (props.arbitrateFocus) {\n            this._updateFocusArbitratorProvider(props);\n        }\n    }\n\n    private _renderResizeDetectorIfNeeded(containerStyles: any): React.ReactNode | null {\n        // If needed, additional invisible DOM elements will be added inside the\n        // view to track the size changes that are performed behind our back by\n        // the browser's layout engine faster (ViewBase checks for the layout\n        // updates once a second and sometimes it's not fast enough).\n\n        // Unfortunately <div> doesn't have `resize` event, so we're trying to\n        // detect the fact that the view has been resized with `scroll` events.\n        // To do that, we create two scrollable <div>s and we put them into a\n        // state in which `scroll` event is triggered by the browser when the\n        // container gets resized (one element triggers `scroll` when the\n        // container gets bigger, another triggers `scroll` when the container\n        // gets smaller).\n\n        if (!this.props.importantForLayout) {\n            return null;\n        }\n\n        if (containerStyles.position !== 'relative') {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('View: importantForLayout property is applicable only for a view with relative position');\n            }\n            return null;\n        }\n\n        return [\n            (\n                <div\n                    key={ 'grow' }\n                    style={ _styles.resizeDetectorContainerStyles as any }\n                    ref={ this._onResizeDetectorGrowRef }\n                    onScroll={ this._resizeDetectorOnScroll }\n                >\n                    <div style={ _styles.resizeGrowDetectorStyles as any } />\n                </div>\n            ),\n            (\n                <div\n                    key={ 'shrink' }\n                    style={ _styles.resizeDetectorContainerStyles as any }\n                    ref={ this._onResizeDetectorShrinkRef }\n                    onScroll={ this._resizeDetectorOnScroll }\n                >\n                    <div style={ _styles.resizeShrinkDetectorStyles as any } />\n                </div>\n            ),\n        ];\n    }\n\n    private _onResizeDetectorGrowRef = (node: HTMLDivElement | null) => {\n        this._resizeDetectorNodes.grow = node || undefined;\n        this._resizeDetectorOnScroll();\n    };\n\n    private _onResizeDetectorShrinkRef = (node: HTMLDivElement | null) => {\n        this._resizeDetectorNodes.shrink = node || undefined;\n        this._resizeDetectorOnScroll();\n    };\n\n    private _resizeDetectorReset() {\n        // Scroll the detectors to the bottom-right corner so\n        // that `scroll` events will be triggered when the container\n        // is resized.\n        const scrollMax = 100500;\n\n        let node = this._resizeDetectorNodes.grow;\n\n        if (node) {\n            node.scrollLeft = scrollMax;\n            node.scrollTop = scrollMax;\n        }\n\n        node = this._resizeDetectorNodes.shrink;\n\n        if (node) {\n            node.scrollLeft = scrollMax;\n            node.scrollTop = scrollMax;\n        }\n    }\n\n    private _resizeDetectorOnScroll = () => {\n        if (this._resizeDetectorAnimationFrame) {\n            // Do not execute action more often than once per animation frame.\n            return;\n        }\n\n        this._resizeDetectorAnimationFrame = window.requestAnimationFrame(() => {\n            if (this._isMounted) {\n                this._resizeDetectorReset();\n                this._resizeDetectorAnimationFrame = undefined;\n                ViewBase._checkViews();\n            }\n        });\n    };\n\n    getChildContext() {\n        // Let descendant Types components know that their nearest Types ancestor is not an Types.Text.\n        // Because they're in an Types.View, they should use their normal styling rather than their\n        // special styling for appearing inline with text.\n        const childContext: ViewContext = {\n            isRxParentAText: false,\n        };\n\n        // Provide the descendants with the focus manager and popup container (if any).\n        if (this._focusManager) {\n            childContext.focusManager = this._focusManager;\n        }\n\n        if (this._popupContainer) {\n            childContext.popupContainer = this._popupContainer;\n        }\n\n        if (this._focusArbitratorProvider) {\n            childContext.focusArbitrator = this._focusArbitratorProvider;\n        }\n\n        return childContext;\n    }\n\n    protected _getContainer(): HTMLElement | null {\n        if (!this._isMounted) {\n            return null;\n        }\n        try {\n            return ReactDOM.findDOMNode(this) as HTMLElement | null;\n        } catch {\n            // Handle exception due to potential unmount race condition.\n            return null;\n        }\n    }\n\n    private _isHidden(): boolean {\n        return !!this._popupContainer && this._popupContainer.isHidden();\n    }\n\n    private _updateFocusArbitratorProvider(props: RX.Types.ViewProps) {\n        if (props.arbitrateFocus) {\n            if (this._focusArbitratorProvider) {\n                this._focusArbitratorProvider.setCallback(props.arbitrateFocus);\n            } else {\n                this._focusArbitratorProvider = new FocusArbitratorProvider(this, props.arbitrateFocus);\n            }\n        } else if (this._focusArbitratorProvider) {\n            delete this._focusArbitratorProvider;\n        }\n    }\n\n    setFocusRestricted(restricted: boolean) {\n        if (!this._focusManager || !this.props.restrictFocusWithin) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('View: setFocusRestricted method requires restrictFocusWithin property to be set');\n            }\n            return;\n        }\n\n        if (!this._isHidden()) {\n            if (restricted) {\n                this._focusManager.restrictFocusWithin(RestrictFocusType.RestrictedFocusFirst);\n            } else {\n                this._focusManager.removeFocusRestriction();\n            }\n        }\n\n        this._isFocusRestricted = restricted;\n    }\n\n    setFocusLimited(limited: boolean) {\n        if (!this._focusManager || !this._limitFocusWithin) {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('View: setFocusLimited method requires limitFocusWithin property to be set');\n            }\n            return;\n        }\n\n        if (!this._isHidden()) {\n            if (limited && !this._isFocusLimited) {\n                this._focusManager.limitFocusWithin(this.props.limitFocusWithin!);\n            } else if (!limited && this._isFocusLimited) {\n                this._focusManager.removeFocusLimitation();\n            }\n        }\n\n        this._isFocusLimited = limited;\n    }\n\n    render() {\n        const combinedStyles = Styles.combine([_styles.defaultStyle, this.props.style]);\n        let ariaRole = AccessibilityUtil.accessibilityTraitToString(this.props.accessibilityTraits);\n        const tabIndex = this.props.tabIndex;\n        const ariaSelected = AccessibilityUtil.accessibilityTraitToAriaSelected(this.props.accessibilityTraits);\n        const isAriaHidden = AccessibilityUtil.isHidden(this.props.importantForAccessibility);\n        const accessibilityLabel = this.props.accessibilityLabel;\n        const ariaLabelledBy = this.props.ariaLabelledBy;\n        const ariaRoleDescription = this.props.ariaRoleDescription;\n        const ariaLive = this.props.accessibilityLiveRegion ?\n            AccessibilityUtil.accessibilityLiveRegionToString(this.props.accessibilityLiveRegion) :\n            undefined;\n        const ariaValueNow = this.props.ariaValueNow;\n\n        if (!ariaRole && !accessibilityLabel && !ariaLabelledBy && !ariaRoleDescription && !ariaLive &&\n                (ariaSelected === undefined) && (ariaValueNow === undefined) && (tabIndex === undefined)) {\n            // When the accessibility properties are not specified, set role to none.\n            // It tells the screen readers to skip the node, but unlike setting\n            // aria-hidden to true, allows the sub DOM to be processed further.\n            // This signigicantly improves the screen readers performance.\n            ariaRole = 'none';\n        }\n\n        const props: React.HTMLAttributes<any> = {\n            role: ariaRole,\n            tabIndex: tabIndex,\n            style: combinedStyles,\n            title: this.props.title,\n            'aria-label': accessibilityLabel,\n            'aria-hidden': isAriaHidden,\n            'aria-selected': ariaSelected,\n            'aria-labelledby': ariaLabelledBy,\n            'aria-roledescription': ariaRoleDescription,\n            'aria-live': ariaLive,\n            'aria-valuenow': ariaValueNow,\n            onContextMenu: this.props.onContextMenu,\n            onMouseEnter: this.props.onMouseEnter,\n            onMouseLeave: this.props.onMouseLeave,\n            onMouseOver: this.props.onMouseOver,\n            onMouseMove: this.props.onMouseMove,\n            // Weird things happen: ReactXP.Types.Touch is not assignable to React.Touch\n            onTouchStart: this.props.onResponderStart as React.HTMLAttributes<any>['onTouchStart'],\n            onTouchStartCapture: this.props.onTouchStartCapture as React.HTMLAttributes<any>['onTouchStartCapture'],\n            onTouchMove: this.props.onResponderMove as React.HTMLAttributes<any>['onTouchMove'],\n            onTouchMoveCapture: this.props.onTouchMoveCapture as React.HTMLAttributes<any>['onTouchMoveCapture'],\n            onTouchEnd: this.props.onResponderRelease,\n            onTouchCancel: this.props.onResponderTerminate,\n            draggable: this.props.onDragStart ? true : undefined,\n            onDragStart: this.props.onDragStart,\n            onDrag: this.props.onDrag,\n            onDragEnd: this.props.onDragEnd,\n            onDragEnter: this.props.onDragEnter,\n            onDragOver: this.props.onDragOver,\n            onDragLeave: this.props.onDragLeave,\n            onDrop: this.props.onDrop,\n            onClick: this.props.onPress,\n            onFocus: this.props.onFocus,\n            onBlur: this.props.onBlur,\n            onKeyDown: this.props.onKeyPress,\n            id: this.props.id,\n        };\n\n        if (this.props.blockPointerEvents) {\n            // Make this element and all children transparent to pointer events\n            props.className = 'reactxp-block-pointer-events';\n            combinedStyles.pointerEvents = 'none';\n        } else if (this.props.ignorePointerEvents) {\n            // Make this element transparent to pointer events, but allow children to still receive events\n            props.className = 'reactxp-ignore-pointer-events';\n            combinedStyles.pointerEvents = 'none';\n        }\n\n        let reactElement: React.ReactElement<any>;\n        const childAnimationsEnabled = this.props.animateChildEnter || this.props.animateChildMove || this.props.animateChildLeave;\n        if (childAnimationsEnabled) {\n            reactElement = (\n                <AnimateListEdits\n                    { ...props }\n                    data-test-id={ this.props.testId }\n                    animateChildEnter={ this.props.animateChildEnter }\n                    animateChildMove={ this.props.animateChildMove }\n                    animateChildLeave={ this.props.animateChildLeave }\n                >\n                    { this.props.children }\n                </AnimateListEdits>\n            );\n        } else {\n            reactElement = (\n                <div { ...props } data-test-id={ this.props.testId }>\n                    { this._renderResizeDetectorIfNeeded(combinedStyles) }\n                    { this.props.children }\n                </div>\n            );\n        }\n\n        return this.context.isRxParentAText ?\n            restyleForInlineText(reactElement) :\n            reactElement;\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: RX.Types.ViewProps) {\n        super.UNSAFE_componentWillReceiveProps(nextProps);\n\n        if (AppConfig.isDevelopmentMode()) {\n            if (this.props.restrictFocusWithin !== nextProps.restrictFocusWithin) {\n                console.error('View: restrictFocusWithin is readonly and changing it during the component life cycle has no effect');\n            }\n            if (this.props.limitFocusWithin !== nextProps.limitFocusWithin) {\n                console.error('View: limitFocusWithin is readonly and changing it during the component life cycle has no effect');\n            }\n        }\n\n        if (('arbitrateFocus' in nextProps) && (this.props.arbitrateFocus !== nextProps.arbitrateFocus)) {\n            this._updateFocusArbitratorProvider(nextProps);\n        }\n    }\n\n    enableFocusManager() {\n        if (this._focusManager) {\n            if (this.props.restrictFocusWithin && this._isFocusRestricted !== false) {\n                this._focusManager.restrictFocusWithin(RestrictFocusType.RestrictedFocusFirst);\n            }\n\n            if (this._limitFocusWithin && this._isFocusLimited) {\n                this._focusManager.limitFocusWithin(this.props.limitFocusWithin!);\n            }\n        }\n    }\n\n    disableFocusManager() {\n        if (this._focusManager) {\n            this._focusManager.release();\n        }\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n\n        if (this.props.autoFocus) {\n            this.requestFocus();\n        }\n\n        // If we are mounted as visible, do our initialization now. If we are hidden, it will\n        // be done later when the popup is shown.\n        if (!this._isHidden()) {\n            this.enableFocusManager();\n        }\n\n        if (this._focusManager && this._popupContainer) {\n            this._popupToken = this._popupContainer.registerPopupComponent(\n                () => this.enableFocusManager(), () => this.disableFocusManager());\n        }\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n        this.disableFocusManager();\n\n        if (this._popupToken) {\n            this._popupContainer!.unregisterPopupComponent(this._popupToken);\n        }\n    }\n\n    blur() {\n        const el = this._getContainer();\n        if (el) {\n            el.blur();\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => this.focus(),\n            () => this._isMounted,\n        );\n    }\n\n    focus() {\n        const el = this._getContainer();\n        if (el) {\n            el.focus();\n        }\n    }\n}\n\napplyFocusableComponentMixin(View, function(this: View, nextProps?: RX.Types.ViewProps) {\n    // VoiceOver with the VoiceOver key combinations (Ctrl+Option+Left/Right) focuses\n    // <div>s when whatever tabIndex is set (even if tabIndex=-1). So, View is focusable\n    // when tabIndex is not undefined.\n    const tabIndex = nextProps && ('tabIndex' in nextProps) ? nextProps.tabIndex : this.props.tabIndex;\n    return tabIndex !== undefined;\n});\n\nexport default View;\n"
  },
  {
    "path": "src/web/ViewBase.tsx",
    "content": "/**\n * ViewBase.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * A base class for the Web-specific implementation of the cross-platform View abstraction.\n */\n\nimport AppConfig from '../common/AppConfig';\nimport * as RX from '../common/Interfaces';\nimport { Defer } from '../common/utils/PromiseDefer';\nimport Timers from '../common/utils/Timers';\n\nimport FrontLayerViewManager from './FrontLayerViewManager';\nimport * as _ from './utils/lodashMini';\n\n// We create a periodic timer to detect layout changes that are performed behind\n// our back by the browser's layout engine. We do this more aggressively when\n// the app is known to be active and in the foreground.\nconst _layoutTimerActiveDuration = 1000;\nconst _layoutTimerInactiveDuration = 10000;\n\nexport abstract class ViewBase<P extends RX.Types.ViewPropsShared<C>, S, C extends RX.View | RX.ScrollView> extends RX.ViewBase<P, S> {\n    private static _viewCheckingTimer: number | undefined;\n    private static _isResizeHandlerInstalled = false;\n    private static _viewCheckingList: ViewBase<RX.Types.ViewPropsShared<RX.View | RX.ScrollView>, any, RX.View | RX.ScrollView>[] = [];\n    private static _appActivationState = RX.Types.AppActivationState.Active;\n\n    abstract render(): JSX.Element;\n    protected abstract _getContainer(): HTMLElement | null;\n    protected _isMounted = false;\n    private _isPopupDisplayed = false;\n\n    // Sets the activation state so we can stop our periodic timer\n    // when the app is in the background.\n    static setActivationState(newState: RX.Types.AppActivationState) {\n        if (ViewBase._appActivationState !== newState) {\n            ViewBase._appActivationState = newState;\n\n            // Cancel any existing timers.\n            if (ViewBase._viewCheckingTimer) {\n                Timers.clearInterval(ViewBase._viewCheckingTimer);\n                ViewBase._viewCheckingTimer = undefined;\n            }\n\n            if (ViewBase._viewCheckingList.length > 0) {\n                // If we're becoming active, check and report layout changes immediately.\n                if (newState === RX.Types.AppActivationState.Active) {\n                    ViewBase._checkViews();\n                }\n\n                ViewBase._viewCheckingTimer = Timers.setInterval(ViewBase._checkViews,\n                    newState === RX.Types.AppActivationState.Active ?\n                        _layoutTimerActiveDuration : _layoutTimerInactiveDuration);\n            }\n        }\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: RX.Types.ViewPropsShared<C>) {\n        if (!!this.props.onLayout !== !!nextProps.onLayout) {\n            if (this.props.onLayout) {\n                this._checkViewCheckerUnbuild();\n            }\n\n            if (nextProps.onLayout) {\n                this._checkViewCheckerBuild();\n            }\n        }\n    }\n\n    protected static _checkViews() {\n        _.each(ViewBase._viewCheckingList, view => {\n            view._checkAndReportLayout().catch(e => {\n                console.warn('ScrollView onLayout exception: ' + JSON.stringify(e));\n            });\n        });\n    }\n\n    private static _layoutReportList: Function[] = [];\n    private static _layoutReportingTimer: number | undefined;\n    private static _reportLayoutChange(func: Function) {\n        this._layoutReportList.push(func);\n\n        if (!ViewBase._layoutReportingTimer) {\n            ViewBase._layoutReportingTimer = Timers.setTimeout(() => {\n                ViewBase._layoutReportingTimer = undefined;\n                ViewBase._reportDeferredLayoutChanges();\n            }, 0);\n        }\n    }\n\n    protected static _reportDeferredLayoutChanges() {\n        const reportList = this._layoutReportList;\n        this._layoutReportList = [];\n\n        _.each(reportList, func => {\n            try {\n                func();\n            } catch (e) {\n                if (AppConfig.isDevelopmentMode()) {\n                    console.error('Caught exception on onLayout response: ', e);\n                }\n            }\n        });\n    }\n\n    protected _lastX = 0;\n    protected _lastY = 0;\n    protected _lastWidth = 0;\n    protected _lastHeight = 0;\n\n    // Returns a promise to indicate when firing of onLayout event has completed (if any)\n    protected _checkAndReportLayout(): Promise<void> {\n        if (!this._isMounted) {\n            return Promise.resolve(void 0);\n        }\n\n        const container = this._getContainer();\n        if (!container) {\n            return Promise.resolve(void 0);\n        }\n\n        const newX = container.offsetLeft;\n        const newY = container.offsetTop;\n        const marginTop = !container.style.marginTop ? 0 : parseInt(container.style.marginTop, 10) || 0;\n        const marginBottom = !container.style.marginBottom ? 0 : parseInt(container.style.marginBottom, 10) || 0;\n        const marginRight = !container.style.marginRight ? 0 : parseInt(container.style.marginRight, 10) || 0;\n        const marginLeft = !container.style.marginLeft ? 0 : parseInt(container.style.marginLeft, 10) || 0;\n        const newWidth = container.offsetWidth + marginRight + marginLeft;\n        const newHeight = container.offsetHeight + marginTop + marginBottom;\n\n        if (this._lastX !== newX || this._lastY !== newY || this._lastWidth !== newWidth || this._lastHeight !== newHeight) {\n            this._lastX = newX;\n            this._lastY = newY;\n            this._lastWidth = newWidth;\n            this._lastHeight = newHeight;\n\n            const deferred = new Defer<void>();\n            ViewBase._reportLayoutChange(() => {\n                if (!this._isMounted || !this.props.onLayout) {\n                    deferred.resolve(void 0);\n                    return;\n                }\n\n                this.props.onLayout({\n                    x: newX,\n                    y: newY,\n                    width: this._lastWidth,\n                    height: this._lastHeight,\n                });\n                deferred.resolve(void 0);\n            });\n            return deferred.promise();\n        }\n\n        return Promise.resolve(void 0);\n    }\n\n    private _checkViewCheckerBuild() {\n        // Enable the timer to check for layout changes. Use a different duration\n        // when the app is active versus inactive.\n        if (!ViewBase._viewCheckingTimer) {\n            ViewBase._viewCheckingTimer = Timers.setInterval(ViewBase._checkViews,\n                ViewBase._appActivationState === RX.Types.AppActivationState.Active ?\n                    _layoutTimerActiveDuration : _layoutTimerInactiveDuration);\n        }\n\n        if (!ViewBase._isResizeHandlerInstalled) {\n            window.addEventListener('resize', ViewBase._onResize);\n            ViewBase._isResizeHandlerInstalled = true;\n        }\n\n        ViewBase._viewCheckingList.push(this);\n    }\n\n    private _checkViewCheckerUnbuild() {\n        ViewBase._viewCheckingList = _.filter(ViewBase._viewCheckingList, v => v !== this);\n\n        if (ViewBase._viewCheckingList.length === 0) {\n            if (ViewBase._viewCheckingTimer) {\n                Timers.clearInterval(ViewBase._viewCheckingTimer);\n                ViewBase._viewCheckingTimer = undefined;\n            }\n\n            if (ViewBase._isResizeHandlerInstalled) {\n                window.removeEventListener('resize', ViewBase._onResize);\n                ViewBase._isResizeHandlerInstalled = false;\n            }\n        }\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n\n        if (this.props.onLayout) {\n            this._checkViewCheckerBuild();\n        }\n\n        // Chain through to the same render-checking code\n        this.componentDidUpdate();\n    }\n\n    componentDidUpdate() {\n        const isPopupDisplayed = FrontLayerViewManager.isPopupDisplayed();\n        if (this.props.onLayout) {\n            if (isPopupDisplayed && !this._isPopupDisplayed) {\n                // A popup was just added to DOM. Checking layout now would stall script\n                // execution because the browser would have to do a reflow. Avoid that\n                // by deferring the work.\n                setTimeout(() => {\n                    this._checkAndReportLayout().catch(e => {\n                        console.warn('ScrollView onLayout exception: ' + JSON.stringify(e));\n                    });\n                }, 0);\n            } else {\n                this._checkAndReportLayout().catch(e => {\n                    console.warn('ScrollView onLayout exception: ' + JSON.stringify(e));\n                });\n            }\n        }\n        this._isPopupDisplayed = isPopupDisplayed;\n    }\n\n    private static _onResize() {\n        // Often views change size in response to an overall window resize. Rather than\n        // wait for the next timer to fire, do it immediately.\n        ViewBase._checkViews();\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n\n        if (this.props.onLayout) {\n            this._checkViewCheckerUnbuild();\n        }\n    }\n}\n\nexport default ViewBase;\n"
  },
  {
    "path": "src/web/animated/executeTransition.ts",
    "content": "/**\n * executeTransition.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Provides a convenient API for applying a CSS transition to a DOM element and\n * notifying when the transition is complete.\n */\n\nimport Timers from '../../common/utils/Timers';\n\nimport * as _ from './../utils/lodashMini';\n\nexport interface TransitionSpec {\n    property: string;\n    duration: number;\n    timing?: string;\n    delay?: number;\n    from: any;\n    to: any;\n}\n\n// Convenient API for applying a CSS transition to a DOM element. Calls `done` when the transition is completed.\nexport function executeTransition(element: HTMLElement, transitions: TransitionSpec[], done: () => void): void {\n    let longestDurationPlusDelay = 0;\n    let longestDurationProperty = '';\n    const cssTransitions: string[] = [];\n\n    _.each(transitions, (transition: TransitionSpec) => {\n        const property = transition.property;\n        const duration = transition.duration;\n        const timing = transition.timing === undefined ? 'linear' : transition.timing;\n        const delay = transition.delay === undefined ? 0 : transition.delay;\n        const from = transition.from;\n\n        if (duration + delay > longestDurationPlusDelay) {\n            longestDurationPlusDelay = duration + delay;\n            longestDurationProperty = property;\n        }\n\n        // Initial state\n        (element.style as any)[property] = from;\n\n        // Resolve styles. This is a trick to force the browser to refresh the\n        // computed styles. Without this, it won't pick up the new \"from\" value\n        // that we just set above.\n        // eslint-disable-next-line no-unused-expressions\n        getComputedStyle(element).opacity;\n\n        // TODO: Cross-browser equivalent of 'transition' style (e.g. vendor prefixed).\n        cssTransitions.push(property + ' ' + duration + 'ms ' + timing + ' ' + delay + 'ms');\n    });\n\n    element.style.transition = cssTransitions.join(', ');\n\n    // eslint-disable-next-line prefer-const\n    let finish: () => void;\n    const onTransitionEnd = (ev: TransitionEvent): void => {\n        if (ev.target === element && ev.propertyName === longestDurationProperty) {\n            finish();\n        }\n    };\n\n    // TODO: Cross-browser equivalent of 'transitionEnd' event (e.g. vendor prefixed).\n    element.addEventListener('webkitTransitionEnd', onTransitionEnd);\n    element.addEventListener('transitionEnd', onTransitionEnd);\n\n    let timeoutId = 0;\n    let didFinish = false;\n    finish = function() {\n        if (!didFinish) {\n            Timers.clearTimeout(timeoutId);\n\n            // Only complete the transition if we are ending the same transition it was initially set.\n            // There are cases where transitions may be overriden before the transition ends.\n            if (element.dataset.transitionId === timeoutId.toString()) {\n                // TODO: Cross-browser equivalent of 'transitionEnd' event (e.g. vendor prefixed).\n                element.removeEventListener('webkitTransitionEnd', onTransitionEnd);\n                element.removeEventListener('transitionEnd', onTransitionEnd);\n\n                delete element.dataset.transitionId;\n                element.style.transition = 'none';\n\n                didFinish = true;\n                done();\n            }\n        }\n    };\n\n    // Watchdog timeout for cases where transitionEnd event doesn't fire.\n    timeoutId = Timers.setTimeout(function() {\n        // If the item was removed from the DOM (which can happen if a\n        // rerender occurred), don't bother finishing. We don't want to do\n        // this in the transition event finish path because it's expensive\n        // and unnecessary in that case because the transition event\n        // implies that the element is still in the DOC\n        if (document.body.contains(element)) {\n            finish();\n        }\n    }, longestDurationPlusDelay + 10);\n    element.dataset.transitionId = timeoutId.toString();\n\n    // Set the \"to\" values.\n    _.each(transitions, (transition: TransitionSpec) => {\n        const property = transition.property;\n        const to = transition.to;\n        (element.style as any)[property] = to;\n    });\n}\n\nexport default executeTransition;\n"
  },
  {
    "path": "src/web/listAnimations/AnimateListEdits.tsx",
    "content": "/**\n * AnimateListEdits.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Each time the component receives new children, animates insertions, removals,\n * and moves that occurred since the previous render.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport executeTransition from '../animated/executeTransition';\nimport { Types } from '../../common/Interfaces';\n\nimport { clone } from './../utils/lodashMini';\nimport { Edits, MonitorListEdits } from './MonitorListEdits';\n\nexport interface AnimateListEditsProps {\n    animateChildEnter?: boolean;\n    animateChildLeave?: boolean;\n    animateChildMove?: boolean;\n}\n\nexport class AnimateListEdits extends React.Component<AnimateListEditsProps, Types.Stateless> {\n    private _handleWillAnimate(edits: Edits, done: () => void) {\n        let counter = 1;\n        const animationCompleted = function() {\n            --counter;\n            if (counter === 0) {\n                done();\n            }\n        };\n\n        let delay = 0;\n        if (edits.removed.length > 0 && this.props.animateChildLeave) {\n            edits.removed.forEach(function(move) {\n                try {\n                    const domNode = ReactDOM.findDOMNode(move.element) as HTMLElement | null;\n                    if (domNode) {\n                        domNode.style.transform = 'translateY(' + -move.topDelta + 'px)';\n\n                        counter++;\n                        executeTransition(domNode, [{\n                            property: 'opacity',\n                            from: 1,\n                            to: 0,\n                            delay: delay,\n                            duration: 150,\n                            timing: 'linear',\n                        }], animationCompleted);\n                    }\n                } catch {\n                    // Exception probably due to race condition in unmounting. Ignore.\n                }\n            });\n            delay += 75;\n        }\n\n        if (edits.moved.length > 0 && this.props.animateChildMove) {\n            edits.moved.forEach(function(move) {\n                counter++;\n\n                try {\n                    const domNode = ReactDOM.findDOMNode(move.element) as HTMLElement | null;\n                    if (domNode) {\n                        executeTransition(domNode, [{\n                            property: 'transform',\n                            from: 'translateY(' + -move.topDelta + 'px)',\n                            to: '',\n                            delay: delay,\n                            duration: 300,\n                            timing: 'ease-out',\n                        }], animationCompleted);\n                    }\n                } catch {\n                    // Exception probably due to race condition in unmounting. Ignore.\n                }\n            });\n        }\n        delay += 75;\n\n        if (edits.added.length > 0 && this.props.animateChildEnter) {\n            edits.added.forEach(function(move) {\n                counter++;\n\n                try {\n                    const domNode = ReactDOM.findDOMNode(move.element) as HTMLElement | null;\n                    if (domNode) {\n                        executeTransition(domNode, [{\n                            property: 'opacity',\n                            from: 0,\n                            to: 1,\n                            delay: delay,\n                            duration: 150,\n                            timing: 'linear',\n                        }], animationCompleted);\n                    }\n                } catch {\n                    // Exception probably due to race condition in unmounting. Ignore.\n                }\n            });\n        }\n        animationCompleted();\n    }\n    render() {\n        // Do a shallow clone and remove the props that don't\n        // apply to the MontiroListEdits component.\n        const props = clone(this.props) as AnimateListEditsProps;\n        delete props.animateChildEnter;\n        delete props.animateChildLeave;\n        delete props.animateChildMove;\n\n        return (\n            <MonitorListEdits\n                componentWillAnimate={ (edits: Edits, done: () => void) => this._handleWillAnimate(edits, done) }\n                { ...props }\n            >\n                { this.props.children }\n            </MonitorListEdits>\n        );\n    }\n}\n\nexport default AnimateListEdits;\n"
  },
  {
    "path": "src/web/listAnimations/MonitorListEdits.tsx",
    "content": "/**\n * MonitorListEdits.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Looks for insertions, removals, and moves each time the component receives new\n * children. Communicates these list edits to the consumer giving it the opportunity\n * to animate the edits.\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport assert from '../../common/assert';\nimport { Types } from '../../common/Interfaces';\n\nimport * as _ from './../utils/lodashMini';\n\nfunction getPosition(el: HTMLElement): { left: number; top: number } {\n    return {\n        left: el.offsetLeft,\n        top: el.offsetTop,\n    };\n}\n\ntype ChildKey = string | number;\nfunction extractChildrenKeys(children: React.ReactNode | undefined): ChildKey[] {\n    const keys: ChildKey[] = [];\n    if (children) {\n        React.Children.forEach(children, function(child, index) {\n            if (child) {\n                const childReactElement = child as React.ReactElement<any>;\n                assert(\n                    childReactElement.key !== undefined && childReactElement.key !== null,\n                    'Children passed to a `View` with child animations enabled must have a `key`',\n                );\n                if (childReactElement.key !== null) {\n                    keys.push(childReactElement.key);\n                }\n            }\n        });\n    }\n    return keys;\n}\n\n// Returns true if the children were edited (e.g. an item was added, moved, or removed).\n// We use this information to determine whether or not we'll need to play any list edit\n// animations.\nfunction childrenEdited(prevChildrenKeys: ChildKey[], nextChildrenKeys: ChildKey[]): boolean {\n    return !_.isEqual(prevChildrenKeys, nextChildrenKeys);\n}\n\ninterface ChildrenMap {\n    [key: string]: React.ReactElement<any>;\n}\n\nfunction createChildrenMap(children: React.ReactNode | undefined): ChildrenMap {\n    const map: ChildrenMap = {};\n    if (children) {\n        React.Children.forEach(children, function(child, index) {\n            if (child) {\n                const childReactElement = child as React.ReactElement<any>;\n                assert(\n                    'key' in childReactElement,\n                    'Children passed to a `View` with child animations enabled must have a `key`',\n                );\n                const index = childReactElement.key;\n                if (index !== null) {\n                    map[index] = childReactElement;\n                }\n            }\n        });\n    }\n    return map;\n}\n\nfunction computePositions(refs: { [key: string]: MountedChildrenRef }) {\n    const positions: {[key: string]: { left: number; top: number }} = {};\n    _.each(refs, (ref, key) => {\n        positions[key] = getPosition(ref.domElement);\n    });\n    return positions;\n}\n\nexport interface AddEdit {\n    element: React.Component<any, any> | Element;\n}\n\nexport interface MoveEdit {\n    element: React.Component<any, any> | Element;\n    leftDelta: number;\n    topDelta: number;\n}\n\nexport interface RemoveEdit {\n    element: React.Component<any, any> | Element;\n    leftDelta: number;\n    topDelta: number;\n}\n\nexport interface Edits {\n    added: AddEdit[];\n    moved: MoveEdit[];\n    removed: RemoveEdit[];\n}\n\n// The states the React component can be in.\nenum ComponentPhaseEnum {\n    // The rest state. The component is not in the middle of anything.\n    rest,\n    // The component is about to play an animation. This occurs when the component\n    // detected a list edit in componentWillUpdate but hasn't yet gotten the opportunity\n    // to start the animation in componentDidUpdate.\n    willAnimate,\n    // The component is in the middle of playing an animation. The component should not\n    // rerender while in this state.\n    animating\n}\n\n// Pieces of information we calculate in componentWillUpdate and consume in componentDidUpdate.\n// More specifically, we calculate animation information in componentWillUpdate and start the\n// animation in componentDidUpdate.\ninterface WillAnimatePhaseInfo {\n    added: React.ReactElement<any>[];\n    removed: React.ReactElement<any>[];\n    other: React.ReactElement<any>[];\n    prevPositions: {[key: string]: { left: number; top: number }};\n    prevChildrenMap: ChildrenMap;\n}\n\ninterface MountedChildrenRef {\n    reactElement: React.Component<any, any> | Element;\n    domElement: HTMLElement;\n}\n\nexport interface MonitorListEditsProps extends React.HTMLAttributes<any> {\n    // Called when list edits are detected. Gives you an opportunity to animate them.\n    // Call `done` when the animations are finished. Until `done` is called, the component\n    // will refuse to rerender.\n    componentWillAnimate: (edits: Edits, done: () => void) => void;\n\n    testId?: string;\n}\n\nexport class MonitorListEdits extends React.Component<MonitorListEditsProps, Types.Stateless> {\n    private _itemRefs: { [key: string]: MountedChildrenRef } = {}; // Updated after render but before componentDidUpdate\n    private _refReplacementCache: {\n        [key: string]: {\n            replacement: (ref: React.Component<any, any>) => any;\n            exisiting: string | ((ref: React.Component<any, any>) => any);\n        };\n    } = {};\n\n    private _isMounted = false;\n    // These are assigned in component will mount - will get value before used\n    private _childrenKeys!: ChildKey[]; // Updated in componentWillUpdate\n    private _childrenMap!: ChildrenMap; // Updated in componentWillUpdate\n    // Extracted to don't leak it, shouldn't be a problem as js is singlethreaded\n    private _childrenToRender!: JSX.Element[];\n\n    private _phase: ComponentPhaseEnum = ComponentPhaseEnum.rest;\n    private _willAnimatePhaseInfo: WillAnimatePhaseInfo | undefined;\n\n    UNSAFE_componentWillMount() {\n        this._childrenKeys = extractChildrenKeys(this.props.children);\n        this._childrenMap = createChildrenMap(this.props.children);\n    }\n\n    componentDidMount() {\n        this._isMounted = true;\n    }\n\n    componentWillUnmount() {\n        this._isMounted = false;\n    }\n\n    shouldComponentUpdate() {\n        return this._phase !== ComponentPhaseEnum.animating;\n    }\n\n    UNSAFE_componentWillUpdate(nextProps: MonitorListEditsProps) {\n        assert(\n            this._phase !== ComponentPhaseEnum.animating,\n            'componentWillUpdate should never run while the component is animating due to the implementation of shouldComponentUpdate',\n        );\n\n        const prevChildrenKeys = this._childrenKeys;\n        const nextChildrenKeys = extractChildrenKeys(nextProps.children);\n        this._childrenKeys = nextChildrenKeys;\n        if (childrenEdited(prevChildrenKeys, nextChildrenKeys)) {\n            const prevChildrenMap = this._childrenMap;\n            const nextChildrenMap = createChildrenMap(nextProps.children);\n            this._childrenMap = nextChildrenMap;\n\n            const removed: React.ReactElement<any>[] = [];\n            const added: React.ReactElement<any>[] = [];\n            const other: React.ReactElement<any>[] = [];\n\n            Object.keys(prevChildrenMap).forEach(function(key) {\n                if (!(key in nextChildrenMap)) {\n                    removed.push(prevChildrenMap[key]);\n                }\n            });\n\n            Object.keys(nextChildrenMap).forEach(function(key) {\n                if (!(key in prevChildrenMap)) {\n                    added.push(nextChildrenMap[key]);\n                } else {\n                    other.push(nextChildrenMap[key]);\n                }\n            });\n\n            this._phase = ComponentPhaseEnum.willAnimate;\n            this._willAnimatePhaseInfo = {\n                added: added,\n                removed: removed,\n                other: other,\n                prevPositions: computePositions(this._itemRefs),\n                prevChildrenMap: prevChildrenMap,\n            };\n        }\n    }\n\n    render() {\n        this._childrenToRender = [];\n\n        // We need to cast this to \"any\" because of a recent bug introduced\n        // into React @types where children is redfined as ReactNode rather\n        // than ReactNode[].\n        _.each(this.props.children as any, child => {\n            if (child) {\n                const childElement = child;\n                let refData = this._refReplacementCache[childElement.key];\n\n                // Reuse the cached replacement ref function instead of recreating it every render, unless the child's ref changes.\n                if (!refData || refData.exisiting !== childElement.ref) {\n                    refData = {\n                        replacement: refValue => { this._saveRef(childElement, refValue); },\n                        exisiting: childElement.ref,\n                    };\n                    this._refReplacementCache[childElement.key] = refData;\n                }\n\n                this._childrenToRender.push(React.cloneElement(childElement, { ref: refData.replacement }));\n            }\n        });\n\n        if (this._phase === ComponentPhaseEnum.willAnimate) {\n            _.each(this._willAnimatePhaseInfo!.removed, childElement => {\n                if (childElement) {\n                    this._childrenToRender.push(React.cloneElement(childElement, {\n                        ref: (refValue: React.Component<any, any>) => {\n                            this._saveRef(childElement, refValue);\n                        },\n                    }));\n                }\n            });\n        }\n\n        // Do a shallow clone and remove the props that don't\n        // apply to div elements.\n        const props = _.clone(this.props) as MonitorListEditsProps;\n        delete props.componentWillAnimate;\n        delete props.testId;\n\n        return (\n            <div { ...props } data-test-id={ this.props.testId }>\n                { this._childrenToRender }\n            </div>\n        );\n    }\n\n    componentDidUpdate(prevProps: MonitorListEditsProps) {\n        assert(\n            this._phase !== ComponentPhaseEnum.animating,\n            'componentDidUpdate should never run while the component is animating due to the implementation of shouldComponentUpdate',\n        );\n\n        if (this._phase === ComponentPhaseEnum.willAnimate) {\n            const phaseInfo = this._willAnimatePhaseInfo!;\n            const prevPositions = phaseInfo.prevPositions;\n            const nextPositions = computePositions(this._itemRefs);\n\n            const added: AddEdit[] = phaseInfo.added.map(child => ({\n                element: this._itemRefs[(child as any).key].reactElement,\n            }));\n\n            const removed: RemoveEdit[] = phaseInfo.removed.map(child => {\n                const key = child.key as any;\n                const prevPos = prevPositions[key];\n                const nextPos = nextPositions[key];\n\n                return {\n                    leftDelta: nextPos.left - prevPos.left,\n                    topDelta: nextPos.top - prevPos.top,\n                    element: this._itemRefs[key].reactElement,\n                };\n            });\n\n            const moved: MoveEdit[] = [];\n            phaseInfo.other.map(child => {\n                const key = child.key as any;\n                const prevPos = prevPositions[key];\n                const nextPos = nextPositions[key];\n                if (prevPos.left !== nextPos.left || prevPos.top !== nextPos.top) {\n                    moved.push({\n                        leftDelta: nextPos.left - prevPos.left,\n                        topDelta: nextPos.top - prevPos.top,\n                        element: this._itemRefs[key].reactElement,\n                    });\n                }\n            });\n\n            this._phase = ComponentPhaseEnum.animating;\n            this._willAnimatePhaseInfo = undefined;\n            this.props.componentWillAnimate({\n                added: added,\n                moved: moved,\n                removed: removed,\n            }, () => {\n                this._phase = ComponentPhaseEnum.rest;\n                if (this._isMounted) {\n                    this.forceUpdate();\n                }\n                phaseInfo.removed.forEach(child => {\n                    const key = child.key as any;\n                    delete this._refReplacementCache[key];\n                });\n            });\n        }\n    }\n\n    private _saveRef(reactElement: any, refValue: React.Component<any, any> | null) {\n        if (refValue === null) {\n            delete this._itemRefs[reactElement.key];\n        } else {\n            // Cache both the react component reference and the corresponding HTML DOM node (for perf reasons).\n            this._itemRefs[reactElement.key] = {\n                reactElement: refValue,\n                domElement: ReactDOM.findDOMNode(refValue) as HTMLElement,\n            };\n        }\n\n        assert(\n            typeof reactElement.ref === 'function' || reactElement.ref === undefined || reactElement.ref === null,\n            'Invalid ref: ' + reactElement.ref + '. Only callback refs are supported when using child animations on a `View`',\n        );\n\n        // If the creator of the reactElement also provided a ref, call it.\n        if (typeof reactElement.ref === 'function') {\n            reactElement.ref(refValue);\n        }\n    }\n}\n"
  },
  {
    "path": "src/web/utils/AppVisibilityUtils.ts",
    "content": "/**\n * AppVisibilityUtils.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Web-specific helpers for firing focus/activity related events\n */\n\nimport SubscribableEvent from 'subscribableevent';\n\nimport Timers from '../../common/utils/Timers';\n\nimport { isUndefined } from './lodashMini';\n\nconst idleTimeInMs = 60 * 1000;\n\nexport class AppVisibilityUtils {\n    private _isIdle = false;\n    private _timer: number | undefined;\n\n    readonly onFocusedEvent = new SubscribableEvent<() => void>();\n    readonly onBlurredEvent = new SubscribableEvent<() => void>();\n    readonly onAppForegroundedEvent = new SubscribableEvent<() => void>();\n    readonly onAppBackgroundedEvent = new SubscribableEvent<() => void>();\n    readonly onIdleEvent = new SubscribableEvent<() => void>();\n    readonly onWakeUpEvent = new SubscribableEvent<() => void>();\n\n    constructor() {\n        // Handle test environment where document is not defined.\n        if (typeof (document) !== 'undefined') {\n            window.addEventListener('focus', this._onFocus);\n            window.addEventListener('blur', this._onBlur);\n            document.addEventListener('visibilitychange', this._onAppVisibilityChanged);\n\n            this._trackIdleStatus();\n        }\n    }\n\n    hasFocusAndActive(): boolean {\n        // Handle test environment where document is not defined.\n        if (typeof (document) !== 'undefined') {\n            return document.hasFocus() && !this._isIdle;\n        }\n\n        return true;\n    }\n\n    hasFocus(): boolean {\n        // Handle test environment where document is not defined.\n        if (typeof (document) !== 'undefined') {\n            return document.hasFocus();\n        }\n\n        return true;\n    }\n\n    isAppInForeground(): boolean {\n        // Handle test environment where document is not defined.\n        if (typeof (document) !== 'undefined') {\n            return !document.hidden;\n        }\n\n        return true;\n    }\n\n    private _trackIdleStatus(): void {\n        document.addEventListener('mousemove', this._wakeUpAndSetTimerForIdle);\n        document.addEventListener('keyup', this._wakeUpAndSetTimerForIdle);\n        document.addEventListener('touchstart', this._wakeUpAndSetTimerForIdle);\n        document.addEventListener('scroll', this._wakeUpAndSetTimerForIdle);\n\n        this._wakeUpAndSetTimerForIdle();\n    }\n\n    private _wakeUpAndSetTimerForIdle = (): void => {\n        if (!isUndefined(this._timer)) {\n            Timers.clearTimeout(this._timer);\n        }\n\n        if (!this.hasFocus()) {\n            return;\n        }\n\n        if (this.hasFocus() && this._isIdle) {\n            this._onWakeUp();\n        }\n\n        this._timer = Timers.setTimeout(() => {\n            if (this.hasFocus()) {\n                this._onIdle();\n            }\n        }, idleTimeInMs);\n    };\n\n    private _onFocus = (): void => {\n        this._wakeUpAndSetTimerForIdle();\n        this.onFocusedEvent.fire();\n    };\n\n    private _onBlur = (): void => {\n        this._onIdle();\n        this.onBlurredEvent.fire();\n    };\n\n    private _onAppVisibilityChanged = (): void => {\n        if (document.hidden) {\n            this.onAppBackgroundedEvent.fire();\n        } else {\n            this.onAppForegroundedEvent.fire();\n        }\n    };\n\n    private _onWakeUp = (): void => {\n        this._isIdle = false;\n        this.onWakeUpEvent.fire();\n    };\n\n    private _onIdle = (): void => {\n        this._isIdle = true;\n        this.onIdleEvent.fire();\n    };\n}\n\nexport default new AppVisibilityUtils();\n"
  },
  {
    "path": "src/web/utils/FocusManager.ts",
    "content": "/**\n * FocusManager.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Manages focusable elements for better keyboard navigation (web version)\n */\n\nimport * as ReactDOM from 'react-dom';\n\nimport {\n    FocusArbitratorProvider,\n    FocusCandidateInternal,\n    FocusCandidateType,\n} from '../../common/utils/AutoFocusHelper';\nimport {\n    applyFocusableComponentMixin as applyFocusableComponentMixinCommon,\n    FocusableComponentInternal,\n    FocusableComponentStateCallback,\n    FocusManager as FocusManagerBase,\n    StoredFocusableComponent as StoredFocusableComponentBase,\n} from '../../common/utils/FocusManager';\nimport Timers from '../../common/utils/Timers';\nimport UserInterface from '../UserInterface';\n\nconst ATTR_NAME_TAB_INDEX = 'tabindex';\nconst ATTR_NAME_ARIA_HIDDEN = 'aria-hidden';\nlet _isShiftPressed: boolean;\n\nexport { FocusableComponentStateCallback };\n\nexport interface StoredFocusableComponent extends StoredFocusableComponentBase {\n    origTabIndex?: number;\n    origAriaHidden?: string;\n    curTabIndex?: number;\n    curAriaHidden?: boolean;\n}\n\ninterface FocusableComponent {\n    storedComponent: StoredFocusableComponent;\n    el: HTMLElement;\n}\n\nexport class FocusManager extends FocusManagerBase {\n    private static _setTabIndexTimer: number | undefined;\n    private static _setTabIndexElement: HTMLElement | undefined;\n    private static _lastFocusedProgrammatically: HTMLElement | undefined;\n\n    constructor(parent: FocusManager | undefined) {\n        super(parent);\n    }\n\n    // Not really public\n    static initListeners(): void {\n        // The default behaviour on Electron is to release the focus after the\n        // Tab key is pressed on a last focusable element in the page and focus\n        // the first focusable element on a consecutive Tab key press.\n        // We want to avoid losing this first Tab key press.\n        let _checkFocusTimer: number | undefined;\n\n        // Checking if Shift is pressed to move the focus into the right direction.\n        window.addEventListener('keydown', event => {\n            _isShiftPressed = event.shiftKey;\n        });\n        window.addEventListener('keyup', event => {\n            _isShiftPressed = event.shiftKey;\n        });\n\n        document.body.addEventListener('focusout', event => {\n            if (!UserInterface.isNavigatingWithKeyboard() || (event.target === document.body)) {\n                return;\n            }\n\n            if (_checkFocusTimer) {\n                Timers.clearTimeout(_checkFocusTimer);\n            }\n\n            if (FocusManager._skipFocusCheck) {\n                // When in between the FocusManager restrictions,\n                // don't check for the focus change here, FocusManager\n                // will take care of it.\n                FocusManager._skipFocusCheck = false;\n                return;\n            }\n\n            _checkFocusTimer = Timers.setTimeout(() => {\n                _checkFocusTimer = undefined;\n\n                if (UserInterface.isNavigatingWithKeyboard() &&\n                        (!FocusManager._currentFocusedComponent || !FocusManager._currentFocusedComponent.removed) &&\n                        (!document.activeElement || (document.activeElement === document.body))) {\n                    // This should work for Electron and the browser should\n                    // send the focus to the address bar anyway.\n                    FocusManager.focusFirst(_isShiftPressed);\n                }\n            }, 100);\n        });\n    }\n\n    protected addFocusListenerOnComponent(component: FocusableComponentInternal, onFocus: () => void): void {\n        try {\n            const el = ReactDOM.findDOMNode(component) as HTMLElement | null;\n            if (el) {\n                el.addEventListener('focus', onFocus);\n            }\n        } catch {\n            // Swallow exception due to component unmount race condition.\n        }\n    }\n\n    protected removeFocusListenerFromComponent(component: FocusableComponentInternal, onFocus: () => void): void {\n        try {\n            const el = ReactDOM.findDOMNode(component) as HTMLElement | null;\n            if (el) {\n                el.removeEventListener('focus', onFocus);\n            }\n        } catch {\n            // Swallow exception due to component unmount race condition.\n        }\n    }\n\n    protected focusComponent(component: FocusableComponentInternal): boolean {\n        try {\n            const el = ReactDOM.findDOMNode(component) as HTMLElement | null;\n            if (el && el.focus) {\n                FocusManager.setLastFocusedProgrammatically(el);\n                el.focus();\n                return true;\n            }\n        } catch {\n            // Swallow exception due to component unmount race condition.\n        }\n        return false;\n    }\n\n    static setLastFocusedProgrammatically(element: HTMLElement | undefined): void {\n        this._lastFocusedProgrammatically = element;\n    }\n\n    static getLastFocusedProgrammatically(reset?: boolean): HTMLElement | undefined {\n        const ret = FocusManager._lastFocusedProgrammatically;\n        if (ret && reset) {\n            FocusManager._lastFocusedProgrammatically = undefined;\n        }\n        return ret;\n    }\n\n    private static _isComponentAvailable(storedComponent: StoredFocusableComponent): boolean {\n        return !storedComponent.accessibleOnly &&\n            !storedComponent.removed &&\n            !storedComponent.restricted &&\n            storedComponent.limitedCount === 0 &&\n            storedComponent.limitedCountAccessible === 0;\n    }\n\n    private static _getFirstFocusable(last?: boolean, parent?: FocusManager): FocusableComponent | undefined {\n        const focusable = Object.keys(FocusManager._allFocusableComponents)\n            .filter(componentId => !parent || (componentId in parent._myFocusableComponentIds))\n            .map(componentId => FocusManager._allFocusableComponents[componentId])\n            .filter(FocusManager._isComponentAvailable)\n            .map(storedComponent => ({ storedComponent, el: ReactDOM.findDOMNode(storedComponent.component) as HTMLElement }))\n            .filter(f => f.el && f.el.focus && ((f.el.tabIndex || 0) >= 0) && !(f.el as any).disabled);\n\n        if (focusable.length) {\n            focusable.sort((a, b) => {\n                // Some element which is mounted later could come earlier in the DOM,\n                // so, we sort the elements by their appearance in the DOM.\n                if (a === b) {\n                    return 0;\n                }\n                return a.el.compareDocumentPosition(b.el) & document.DOCUMENT_POSITION_PRECEDING ? 1 : -1;\n            });\n\n            return focusable[last ? focusable.length - 1 : 0];\n        }\n\n        return undefined;\n    }\n\n    static focusFirst(last?: boolean): void {\n        const first = FocusManager._getFirstFocusable(last);\n\n        if (first) {\n            const storedComponent = first.storedComponent;\n\n            FocusArbitratorProvider.requestFocus(\n                storedComponent.component,\n                () => {\n                    FocusManager.setLastFocusedProgrammatically(first.el);\n                    first.el.focus();\n                },\n                () => FocusManager._isComponentAvailable(storedComponent),\n                FocusCandidateType.FocusFirst,\n            );\n        }\n    }\n\n    protected /* static */ resetFocus(focusFirstWhenNavigatingWithKeyboard: boolean): void {\n        if (FocusManager._resetFocusTimer) {\n            Timers.clearTimeout(FocusManager._resetFocusTimer);\n            FocusManager._resetFocusTimer = undefined;\n        }\n\n        if (UserInterface.isNavigatingWithKeyboard() && focusFirstWhenNavigatingWithKeyboard) {\n            // When we're in the keyboard navigation mode, we want to have the\n            // first focusable component to be focused straight away, without the\n            // necessity to press Tab.\n            const first = FocusManager._getFirstFocusable(false, FocusManager._currentRestrictionOwner as FocusManager);\n\n            if (first) {\n                const storedComponent = first.storedComponent;\n\n                FocusArbitratorProvider.requestFocus(\n                    storedComponent.component,\n                    () => {\n                        FocusManager.setLastFocusedProgrammatically(first.el);\n                        first.el.focus();\n                    },\n                    () => FocusManager._isComponentAvailable(storedComponent),\n                    FocusCandidateType.FocusFirst,\n                );\n            }\n        } else if ((typeof document !== 'undefined') && document.body && document.body.focus && document.body.blur) {\n            // An example to explain this part:\n            // We've shown a modal dialog which is higher in the DOM by clicking\n            // on a button which is lower in the DOM, we've applied the restrictions\n            // and only the elements from the modal dialog are focusable now.\n            // But internally the browser keeps the last focus position in the DOM\n            // (even if we do blur() for the button) and when Tab is pressed again,\n            // the browser will start searching for the next focusable element from\n            // this position.\n            // This means that the first Tab press will get us to the browser's address\n            // bar (or nowhere in case of Electron) and only the second Tab press will\n            // lead us to focusing the first focusable element in the modal dialog.\n            // In order to avoid losing this first Tab press, we're making <body>\n            // focusable, focusing it, removing the focus and making it unfocusable\n            // back again.\n            // Defer the work to avoid triggering sync layout.\n            FocusManager._resetFocusTimer = Timers.setTimeout(() => {\n                FocusManager._resetFocusTimer = undefined;\n\n                const currentFocused = FocusManager._currentFocusedComponent;\n                if (currentFocused && !currentFocused.removed && !currentFocused.restricted) {\n                    // No need to reset the focus because it's moved inside the restricted area\n                    // already (manually or with autofocus).\n                    return;\n                }\n\n                const prevTabIndex = FocusManager._setTabIndex(document.body, -1);\n                FocusManager.setLastFocusedProgrammatically(document.body);\n                document.body.focus();\n                document.body.blur();\n                FocusManager._setTabIndex(document.body, prevTabIndex);\n            }, 100);\n        }\n    }\n\n    protected /* static */  _updateComponentFocusRestriction(storedComponent: StoredFocusableComponent): void {\n        const newAriaHidden = storedComponent.restricted || (storedComponent.limitedCount > 0) ? true : undefined;\n        const newTabIndex = newAriaHidden || (storedComponent.limitedCountAccessible > 0) ? -1 : undefined;\n        const restrictionRemoved = newTabIndex === undefined;\n\n        if ((storedComponent.curTabIndex !== newTabIndex) || (storedComponent.curAriaHidden !== newAriaHidden)) {\n            const el = ReactDOM.findDOMNode(storedComponent.component) as HTMLElement | null;\n\n            if (el) {\n                if (storedComponent.curTabIndex !== newTabIndex) {\n                    storedComponent.curTabIndex = newTabIndex;\n\n                    if (restrictionRemoved) {\n                        FocusManager._setTabIndex(el, storedComponent.origTabIndex);\n                    } else {\n                        const prevTabIndex = FocusManager._setTabIndex(el, newTabIndex);\n                        if (!('origTabIndex' in storedComponent)) {\n                            storedComponent.origTabIndex = prevTabIndex;\n                        }\n                    }\n                }\n\n                if (storedComponent.curAriaHidden !== newAriaHidden) {\n                    storedComponent.curAriaHidden = newAriaHidden;\n\n                    if (restrictionRemoved) {\n                        FocusManager._setAriaHidden(el, storedComponent.origAriaHidden);\n                    } else {\n                        const prevAriaHidden = FocusManager._setAriaHidden(el, newAriaHidden ? 'true' : undefined);\n                        if (!('origAriaHidden' in storedComponent)) {\n                            storedComponent.origAriaHidden = prevAriaHidden;\n                        }\n                    }\n                }\n\n                if (restrictionRemoved) {\n                    delete storedComponent.origTabIndex;\n                    delete storedComponent.origAriaHidden;\n                }\n            }\n\n            FocusManager._callFocusableComponentStateChangeCallbacks(storedComponent, !restrictionRemoved);\n        }\n    }\n\n    private static _setTabIndex(element: HTMLElement, value: number | undefined): number | undefined {\n        // If a tabIndex assignment is pending for this element, cancel it now.\n        if (FocusManager._setTabIndexTimer && element === FocusManager._setTabIndexElement) {\n            Timers.clearTimeout(FocusManager._setTabIndexTimer);\n            FocusManager._setTabIndexTimer = undefined;\n            FocusManager._setTabIndexElement = undefined;\n        }\n\n        const prev = element.hasAttribute(ATTR_NAME_TAB_INDEX) ? element.tabIndex : undefined;\n        if (value === undefined) {\n            if (prev !== undefined) {\n                element.removeAttribute(ATTR_NAME_TAB_INDEX);\n            }\n        } else if (value !== prev) {\n            // Setting tabIndex to -1 on the active element would trigger sync layout. Defer it.\n            if (value === -1 && element === document.activeElement) {\n                // If a tabIndex assignment is pending for another element, run it now as we know\n                // that it's not active anymore.\n                if (FocusManager._setTabIndexTimer) {\n                    FocusManager._setTabIndexElement!.tabIndex = -1;\n                    Timers.clearTimeout(FocusManager._setTabIndexTimer);\n                    FocusManager._setTabIndexTimer = undefined;\n                    FocusManager._setTabIndexElement = undefined;\n                }\n\n                FocusManager._setTabIndexElement = element;\n                FocusManager._setTabIndexTimer = Timers.setTimeout(() => {\n                    element.tabIndex = value;\n                    if (element === FocusManager._setTabIndexElement) {\n                        FocusManager._setTabIndexTimer = undefined;\n                        FocusManager._setTabIndexElement = undefined;\n                    }\n                }, 0);\n            } else {\n                element.tabIndex = value;\n            }\n        }\n\n        return prev;\n    }\n\n    private static _setAriaHidden(element: HTMLElement, value: string | undefined): string | undefined {\n        const prev = element.hasAttribute(ATTR_NAME_ARIA_HIDDEN) ? element.getAttribute(ATTR_NAME_ARIA_HIDDEN) || undefined : undefined;\n\n        if (value === undefined) {\n            if (prev !== undefined) {\n                element.removeAttribute(ATTR_NAME_ARIA_HIDDEN);\n            }\n        } else {\n            element.setAttribute(ATTR_NAME_ARIA_HIDDEN, value);\n        }\n\n        return prev;\n    }\n\n    static sortAndFilterAutoFocusCandidates(candidates: FocusCandidateInternal[]): FocusCandidateInternal[] {\n        return candidates\n            .filter(candidate => {\n                const id = (candidate.component as FocusableComponentInternal).focusableComponentId;\n                if (id) {\n                    const storedComponent = FocusManager._allFocusableComponents[id];\n                    if (storedComponent &&\n                        (storedComponent.removed ||\n                            (storedComponent.limitedCount > 0) || (storedComponent.limitedCountAccessible > 0))) {\n                        return false;\n                    }\n                }\n                return true;\n            })\n            .map(candidate => ({ candidate, el: ReactDOM.findDOMNode(candidate.component) as HTMLElement }))\n            .sort((a, b) => {\n                // Some element which is mounted later could come earlier in the DOM,\n                // so, we sort the elements by their appearance in the DOM.\n                if (a === b) {\n                    return 0;\n                }\n                return a.el.compareDocumentPosition(b.el) & document.DOCUMENT_POSITION_PRECEDING ? 1 : -1;\n            })\n            .map(ce => ce.candidate);\n    }\n}\n\nexport function applyFocusableComponentMixin(Component: any, isConditionallyFocusable?: Function): void {\n    applyFocusableComponentMixinCommon(Component, isConditionallyFocusable);\n\n    const origFocus = Component.prototype.focus;\n    if (origFocus) {\n        Component.prototype.focus = function() {\n            try {\n                const el = ReactDOM.findDOMNode(this) as HTMLElement | null;\n                if (el) {\n                    FocusManager.setLastFocusedProgrammatically(el);\n                }\n            } catch {\n                // Swallow exception due to component unmount race condition.\n            }\n\n            origFocus.apply(this, arguments);\n        };\n    }\n}\n\nif ((typeof document !== 'undefined') && (typeof window !== 'undefined')) {\n    FocusManager.initListeners();\n}\n\nexport default FocusManager;\n"
  },
  {
    "path": "src/web/utils/MouseResponder.ts",
    "content": "/**\n * MouseResponder.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Handles tracking of mouse movements.\n */\n\nimport { Types } from '../../common/Interfaces';\n\nimport * as _ from './../utils/lodashMini';\n\nconst _compareDOMOrder = (a: Responder, b: Responder): number => {\n    if (a.target.compareDocumentPosition(b.target) & Node.DOCUMENT_POSITION_PRECEDING) {\n        return 1;\n    } else {\n        return -1;\n    }\n};\n\ninterface Responder {\n    id: number;\n    target: HTMLElement;\n    shouldBecomeFirstResponder: (event: MouseEvent, gestureState: Types.PanGestureState) => boolean;\n    onMove: (event: MouseEvent, gestureState: Types.PanGestureState) => void;\n    onTerminate: (event: MouseEvent, gestureState: Types.PanGestureState) => void;\n}\n\ninterface Velocity {\n    velocityX: number;\n    velocityY: number;\n}\n\nexport interface MouseResponderConfig {\n    id: number;\n    target: HTMLElement;\n    disableWhenModal: boolean;\n    shouldBecomeFirstResponder?: (event: MouseEvent, gestureState: Types.PanGestureState) => boolean;\n    onMove?: (event: MouseEvent, gestureState: Types.PanGestureState) => void;\n    onTerminate?: (event: MouseEvent, gestureState: Types.PanGestureState) => void;\n}\n\nexport interface MouseResponderSubscription {\n    dispose(): void;\n}\n\nexport default class MouseResponder {\n    private static _currentResponder: Responder | null = null;\n    private static _pendingGestureState: Types.PanGestureState | null = null;\n    private static _initialized = false;\n    private static _isModalDisplayed = false;\n\n    private static _responders: Responder[];\n\n    static setModalIsDisplayed(isDisplayed: boolean): void {\n        MouseResponder._isModalDisplayed = isDisplayed;\n    }\n\n    static create(config: MouseResponderConfig): MouseResponderSubscription {\n        MouseResponder._initializeEventHandlers();\n\n        MouseResponder._responders = MouseResponder._responders || [];\n\n        const responder: Responder = {\n            id: config.id,\n            target: config.target,\n            shouldBecomeFirstResponder(event: MouseEvent, gestureState: Types.PanGestureState) {\n                if (MouseResponder._isModalDisplayed && config.disableWhenModal) {\n                    return false;\n                }\n\n                if (!config.shouldBecomeFirstResponder) {\n                    return false;\n                }\n\n                return config.shouldBecomeFirstResponder(event, gestureState);\n            },\n\n            onMove(event: MouseEvent, gestureState: Types.PanGestureState) {\n                if (!config.onMove) {\n                    return;\n                }\n\n                config.onMove(event, gestureState);\n            },\n\n            onTerminate(event: MouseEvent, gestureState: Types.PanGestureState) {\n                if (!config.onTerminate) {\n                    return;\n                }\n\n                config.onTerminate(event, gestureState);\n            },\n        };\n\n        MouseResponder._responders.push(responder);\n\n        return {\n            dispose() {\n                _.remove(MouseResponder._responders, r => r.id === responder.id);\n\n                if (MouseResponder._responders.length === 0) {\n                    MouseResponder._removeEventHandlers();\n                }\n            },\n        };\n    }\n\n    private static _initializeEventHandlers(): void {\n        if (MouseResponder._initialized) {\n            return;\n        }\n\n        window.addEventListener('mousedown', MouseResponder._onMouseDown);\n        window.addEventListener('mousemove', MouseResponder._onMouseMove);\n        window.addEventListener('mouseup', MouseResponder._onMouseUp);\n\n        MouseResponder._initialized = true;\n    }\n\n    private static _removeEventHandlers(): void {\n        if (!MouseResponder._initialized) {\n            return;\n        }\n\n        window.removeEventListener('mousedown', MouseResponder._onMouseDown);\n        window.removeEventListener('mousemove', MouseResponder._onMouseMove);\n        window.removeEventListener('mouseup', MouseResponder._onMouseUp);\n\n        MouseResponder._initialized = false;\n    }\n\n    private static _onMouseDown = (event: MouseEvent): void => {\n        // We need to skip new gesture starts when there is already on in progress\n        if (MouseResponder._currentResponder) {\n            event.preventDefault();\n            event.stopPropagation();\n\n            return;\n        }\n\n        MouseResponder._pendingGestureState = {\n            initialClientX: event.clientX,\n            initialClientY: event.clientY,\n            initialPageX: event.pageX,\n            initialPageY: event.pageY,\n            clientX: event.clientX,\n            clientY: event.clientY,\n            pageX: event.pageX,\n            pageY: event.pageY,\n            velocityX: 0,\n            velocityY: 0,\n            timeStamp: Date.now(),\n            isComplete: false,\n            isTouch: false,\n        };\n\n        // We must sort them properly to be consistent with native PanResponder picks it's first responders\n        // In native there is no z-index and PanResponder picks always the last registered element.\n        // in case of native, that's last element in \"DOM\"\n        MouseResponder._responders.sort(_compareDOMOrder);\n\n        // We need to pick a responder that will handle this GestureView\n        const firstResponder = _.findLast(MouseResponder._responders, (responder: Responder) => (\n            responder.shouldBecomeFirstResponder(event, MouseResponder._pendingGestureState!)\n        ));\n\n        if (firstResponder) {\n            MouseResponder._currentResponder = firstResponder;\n        }\n    };\n\n    private static _onMouseMove = (event: MouseEvent): void => {\n        if (MouseResponder._currentResponder && MouseResponder._pendingGestureState) {\n            const { velocityX, velocityY } = MouseResponder._calcVelocity(event, MouseResponder._pendingGestureState);\n\n            MouseResponder._pendingGestureState = _.merge({}, MouseResponder._pendingGestureState, {\n                clientX: event.clientX,\n                clientY: event.clientY,\n                pageX: event.pageX,\n                pageY: event.pageY,\n                velocityX,\n                velocityY,\n                isComplete: false,\n            });\n\n            if (event.buttons === 0) {\n                MouseResponder._onMouseUp(event);\n            } else {\n                MouseResponder._currentResponder.onMove(event, MouseResponder._pendingGestureState);\n            }\n        }\n    };\n\n    private static _onMouseUp = (event: MouseEvent): void => {\n        // We check whether there is still some buttom pressed\n        // in case there are still some buttons left,\n        // we don't stop terminate the gesture.\n        if (event.buttons !== 0) {\n            event.preventDefault();\n            event.stopPropagation();\n\n            return;\n        }\n\n        if (MouseResponder._currentResponder && MouseResponder._pendingGestureState) {\n            const { velocityX, velocityY } = MouseResponder._calcVelocity(event, MouseResponder._pendingGestureState);\n\n            MouseResponder._pendingGestureState = _.merge({}, MouseResponder._pendingGestureState, {\n                clientX: event.clientX,\n                clientY: event.clientY,\n                pageX: event.pageX,\n                pageY: event.pageY,\n                velocityX,\n                velocityY,\n                isComplete: true,\n            });\n\n            MouseResponder._currentResponder.onTerminate(event, MouseResponder._pendingGestureState);\n\n            MouseResponder._currentResponder = null;\n            MouseResponder._pendingGestureState = null;\n        }\n    };\n\n    private static _calcVelocity = (e: MouseEvent, gestureState: Types.PanGestureState): Velocity => {\n        const time = Date.now() - gestureState.timeStamp;\n\n        const velocityX = (e.clientX - gestureState.initialClientX) / time;\n        const velocityY = (e.clientY - gestureState.initialClientY) / time;\n\n        return {\n            velocityX,\n            velocityY,\n        };\n    };\n}\n"
  },
  {
    "path": "src/web/utils/lodashMini.ts",
    "content": "/**\n * lodashMini.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Import and re-export of part of the lodash module. This helps reduce bundle size.\n */\n\nimport assign = require('lodash/assign');\nimport clone = require('lodash/clone');\nimport cloneDeep = require('lodash/cloneDeep');\nimport defer = require('lodash/defer');\nimport each = require('lodash/each');\nimport endsWith = require('lodash/endsWith');\nimport extend = require('lodash/extend');\nimport filter = require('lodash/filter');\nimport findIndex = require('lodash/findIndex');\nimport findLast = require('lodash/findLast');\nimport flatten = require('lodash/flatten');\nimport get = require('lodash/get');\nimport isEmpty = require('lodash/isEmpty');\nimport isEqual = require('lodash/isEqual');\nimport isNumber = require('lodash/isNumber');\nimport isObject = require('lodash/isObject');\nimport isUndefined = require('lodash/isUndefined');\nimport kebabCase = require('lodash/kebabCase');\nimport keys = require('lodash/keys');\nimport map = require('lodash/map');\nimport mapValues = require('lodash/mapValues');\nimport max = require('lodash/max');\nimport memoize = require('lodash/memoize');\nimport merge = require('lodash/merge');\nimport omit = require('lodash/omit');\nimport remove = require('lodash/remove');\nimport throttle = require('lodash/throttle');\nimport union = require('lodash/union');\n\nexport {\n    assign,\n    clone,\n    cloneDeep,\n    defer,\n    each,\n    endsWith,\n    extend,\n    filter,\n    findIndex,\n    findLast,\n    flatten,\n    get,\n    isEmpty,\n    isEqual,\n    isNumber,\n    isObject,\n    isUndefined,\n    kebabCase,\n    keys,\n    map,\n    mapValues,\n    max,\n    memoize,\n    merge,\n    omit,\n    remove,\n    throttle,\n    union,\n};\n"
  },
  {
    "path": "src/web/utils/restyleForInlineText.tsx",
    "content": "/**\n * restyleForInlineText.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * When a ReactXP component appears as a child of an RX.Text, it needs to be styled\n * specially so that it appears inline with the text rather than introducing line\n * breaks.\n *\n * This utility restyles the component that is passed to it as inline so it flows\n * with the text. When a ReactXP component is a child of a text, pass the return value\n * of its render method to this utility. See RX.View for an example.\n */\n\nimport * as React from 'react';\n\nimport assert from '../../common/assert';\n\nimport { assign } from './../utils/lodashMini';\n\nfunction restyleForInlineText(reactElement: React.ReactElement<any>) {\n    const style = reactElement.props.style;\n    assert(\n        style &&\n        style.width !== undefined &&\n        style.height !== undefined,\n        'Children of an <RX.Text> must have a defined height and width',\n    );\n\n    /*\n      We'll use display: inline-block for inline element because\n      inline-flex will introduce new lines into the text that is\n      copied to the clipboard. In most our use-cases inline-block\n      is fine and should behave same as inline-flex.\n\n      Example:\n        <flex>\n          <inline> // InlineView\n            <inline text node>\n            <inline-flex> // set by this function - will introduce new line when copied\n              <inline transparent text with emoticon text representation>\n              <inline-block sprite clipping element>\n                <inline-block sprite background texture>\n            <inline text node>\n\n        result into selection: \"[text node][transparent text][new line][text node]\"\n        with inline-block this will properly resolve as \"[text node][transparent text][text node]\"\n    */\n\n    return React.cloneElement(reactElement, {\n        style: assign({}, style, {\n            display: 'inline-block',\n\n            // Reset the line height so the value from outside\n            // the inlined item doesn't cascade into this element.\n            lineHeight: 'normal',\n        }),\n    });\n}\n\nexport default restyleForInlineText;\n"
  },
  {
    "path": "src/web/window.ts",
    "content": "/*\n * window.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Window module to enable easy mocking.\n */\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\nexport = typeof window !== 'undefined' ? window : {} as Window;\n"
  },
  {
    "path": "src/windows/Accessibility.ts",
    "content": "/**\n * Accessibility.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n */\n\nimport * as RN from 'react-native';\n\nimport { Accessibility as NativeAccessibility } from '../native-common/Accessibility';\n\n// Be aware that we import class and extend it here, but the default export of native-common/Accessibility\n// is an instance of the class we import here. So any state in the default export from native-common will be in\n// a different instance than default export of this windows/Accessibility. For example, susbscribing to\n// newAnnouncementReadyEvent on this default export instance and calling announceForAccessibility on\n// native-common default export will not raise this instance event.\n\nexport class Accessibility extends NativeAccessibility {\n    // Work around the fact that the public react-native type definition doesn't\n    // include initialHighContrast in RN.AccessibilityInfoStatic.\n    private _isHighContrast = (RN.AccessibilityInfo as RN.ExtendedAccessibilityInfoStatic).initialHighContrast || false;\n\n    constructor() {\n        super();\n\n        // Work around the fact that the public react-native type definition doesn't\n        // include 'highContrastDidChange' in RN.AccessibilityEventName.\n        RN.AccessibilityInfo.addEventListener(\n            'highContrastDidChange' as RN.AccessibilityEventName,\n            (isEnabled: boolean) => this._updateIsHighContrast(isEnabled),\n        );\n    }\n\n    private _updateIsHighContrast(isEnabled: boolean): void {\n        if (this._isHighContrast !== isEnabled) {\n            this._isHighContrast = isEnabled;\n            this.highContrastChangedEvent.fire(isEnabled);\n        }\n    }\n\n    isHighContrastEnabled(): boolean {\n        return this._isHighContrast;\n    }\n}\n\nexport default new Accessibility();\n"
  },
  {
    "path": "src/windows/AccessibilityAnnouncer.tsx",
    "content": "/**\n * AccessibilityAnnouncer.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Implements the behavior for announcing text via screen readers.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport { SubscriptionToken } from 'subscribableevent';\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport { Types } from '../common/Interfaces';\nimport Styles from '../native-common/Styles';\nimport Timers from '../common/utils/Timers';\n\nimport Accessibility from './Accessibility';\n\nconst _styles = {\n    liveRegionContainer: Styles.createViewStyle({\n        position: 'absolute',\n        opacity: 0,\n        top: -30,\n        height: 30,\n        left: 0,\n        right: 0,\n    }),\n};\n\nexport class AccessibilityAnnouncer extends React.Component<{}, {}> {\n    private _viewElement: any = null;\n    private _announcementQueue: string[] = [];\n    private _announcementQueueTimer: number | undefined;\n    private _newAnnouncementEventChangedSubscription: SubscriptionToken | undefined;\n    private _lastAnnouncement: string | undefined;\n\n    constructor(props: {}) {\n        super(props);\n\n        // Update announcement text.\n        this._newAnnouncementEventChangedSubscription =\n            Accessibility.newAnnouncementReadyEvent.subscribe(announcement => {\n                this._announcementQueue.push(announcement);\n                this._tryDequeueAndAnnounce();\n            });\n    }\n\n    componentWillUnmount() {\n        if (this._newAnnouncementEventChangedSubscription) {\n            this._newAnnouncementEventChangedSubscription.unsubscribe();\n            this._newAnnouncementEventChangedSubscription = undefined;\n        }\n        if (this._announcementQueueTimer) {\n            Timers.clearTimeout(this._announcementQueueTimer);\n            this._announcementQueueTimer = undefined;\n        }\n    }\n\n    render() {\n        return (\n            <RN.View\n                ref={ this._onViewRef }\n                style={ _styles.liveRegionContainer as RN.StyleProp<RN.ViewStyle> }\n                accessibilityLiveRegion={ AccessibilityUtil.accessibilityLiveRegionToString(Types.AccessibilityLiveRegion.Assertive) }\n            />\n        );\n    }\n\n    private _onViewRef = (view: RN.View | null): void => {\n        this._viewElement = view;\n        if (view !== null) {\n            this._tryDequeueAndAnnounce();\n        }\n    };\n\n    private _tryDequeueAndAnnounce() {\n        if (this._announcementQueueTimer === undefined) {\n            this._dequeueAndPostAnnouncement();\n        }\n    }\n\n    private _dequeueAndPostAnnouncement = () => {\n        if (this._announcementQueue.length > 0) {\n            if (this._viewElement) {\n                const announcement = this._announcementQueue.shift();\n                // This hack was copied from android/Accessibility.ts in order to not increase variety of hacks in codebase.\n                //\n                // Screen reader fails to announce, if the new announcement is the same as the last one.\n                // The behavior is screen reader specific. NVDA is better than Narrator in this situation but\n                // ultimately does not fully support this case. Narrator tends to ignore subsequent identical texts at all.\n                // NVDA tends to announce 2 or 3 subsequent identical texts but usually ignores 4+ ones.\n                const textToAnnounce = (announcement && announcement === this._lastAnnouncement) ? announcement + ' ' : announcement;\n\n                this._viewElement.setNativeProps({ accessibilityLabel : textToAnnounce });\n                this._lastAnnouncement = textToAnnounce;\n\n                // 2 seconds is probably enough for screen reader to finally receive UIA live region event\n                // and go query the accessible name of the region to put into its own queue, so that we can\n                // set name of the region to next announcement and fire the UIA live region event again.\n                // The magic number is copied from web/AccessibilityAnnouncer clear timer.\n                this._announcementQueueTimer = Timers.setTimeout(this._dequeueAndPostAnnouncement, 2000);\n            }\n        } else {\n            if (this._viewElement) {\n                // We want to hide the view used for announcement from screen reader so user cannot navigate to it.\n                // We do it by emptying accessible name on it as soon as possible - after we think screen reader\n                // already processed live region event.\n                this._viewElement.setNativeProps({ accessibilityLabel : '' });\n            }\n            this._lastAnnouncement = undefined;\n            this._announcementQueueTimer = undefined;\n        }\n    };\n}\n\nexport default AccessibilityAnnouncer;\n"
  },
  {
    "path": "src/windows/AccessibilityUtil.ts",
    "content": "/**\n * AccessibilityUtil.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows-specific accessibility utils.\n */\n\nimport * as React from 'react';\n\nimport { AccessibilityPlatformUtil } from '../common/AccessibilityUtil';\n\nexport class AccessibilityUtil extends AccessibilityPlatformUtil {\n    setAccessibilityFocus(component: React.Component<any, any>): void {\n        // No-Op\n    }\n}\n\nexport default new AccessibilityUtil();\n"
  },
  {
    "path": "src/windows/App.ts",
    "content": "/**\n * App.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows implementation of App API namespace.\n */\n\nimport { ComponentProvider } from 'react-native';\n\nimport { App as AppCommon } from '../native-common/App';\n\nimport { RootView, RootViewUsingProps } from './RootView';\n\nexport class App extends AppCommon {\n\n    protected getRootViewFactory(): ComponentProvider {\n        return () => RootView;\n    }\n\n    protected getRootViewUsingPropsFactory(): ComponentProvider {\n        return () => RootViewUsingProps;\n    }\n}\n\nexport default new App();\n"
  },
  {
    "path": "src/windows/Button.tsx",
    "content": "/**\n * Button.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Windows-specific implementation of the cross-platform Button abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RNW from 'react-native-windows';\n\nimport AccessibilityUtil, { ImportantForAccessibilityValue } from '../native-common/AccessibilityUtil';\nimport assert from '../common/assert';\nimport { Button as ButtonBase, ButtonContext as ButtonContextBase } from '../native-common/Button';\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport { applyFocusableComponentMixin, FocusManagerFocusableComponent } from '../native-desktop/utils/FocusManager';\nimport { Types } from '../common/Interfaces';\nimport UserInterface from '../native-common/UserInterface';\n\nconst KEY_CODE_ENTER = 13;\nconst KEY_CODE_SPACE = 32;\nconst KEY_CODE_F10 = 121;\nconst KEY_CODE_APP = 500;\n\nconst DOWN_KEYCODES = [KEY_CODE_SPACE, KEY_CODE_ENTER, KEY_CODE_F10, KEY_CODE_APP];\nconst UP_KEYCODES = [KEY_CODE_SPACE];\n\nconst FocusableAnimatedView = RNW.createFocusableComponent(RN.Animated.View);\n\nexport interface ButtonContext extends ButtonContextBase {\n    isRxParentAContextMenuResponder?: boolean;\n    isRxParentAFocusableInSameFocusManager?: boolean;\n}\n\nexport class Button extends ButtonBase implements React.ChildContextProvider<ButtonContext>, FocusManagerFocusableComponent {\n\n    // Context is provided by super - just re-typing here\n    context!: ButtonContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAContextMenuResponder: PropTypes.bool,\n        isRxParentAFocusableInSameFocusManager: PropTypes.bool,\n        ...ButtonBase.childContextTypes,\n    };\n\n    private _isFocusedWithKeyboard = false;\n\n    // Offset to show context menu using keyboard.\n    protected _getContextMenuOffset() {\n        return { x: 0, y: 0 };\n    }\n\n    protected _render(internalProps: RN.ViewProps, onMount: (btn: any) => void): JSX.Element {\n        // RNW.FocusableProps tabIndex: default is 0.\n        // -1 has no special semantic similar to DOM.\n        const tabIndex: number | undefined = this.getTabIndex();\n        // RNW.FocusableProps windowsTabFocusable:\n        // - true: keyboard focusable through any mean, receives keyboard input\n        // - false: not focusable at all, doesn't receive keyboard input\n        // The intermediate \"focusable, but not in the tab order\" case is not supported.\n        const windowsTabFocusable: boolean = !this.props.disabled && tabIndex !== undefined && tabIndex >= 0;\n\n        const importantForAccessibility: ImportantForAccessibilityValue | undefined = this.getImportantForAccessibility();\n\n        // We don't use 'string' ref type inside ReactXP\n        const originalRef = (internalProps as any).ref;\n        assert(!(typeof originalRef === 'string'), 'Button: ReactXP must not use string refs internally');\n\n        const componentRef = originalRef as Function;\n        const focusableViewProps: RNW.FocusableWindowsProps<RN.ExtendedViewProps | RNW.AccessibilityEvents> = {\n            ...internalProps,\n            ref: onMount,\n            componentRef: componentRef,\n            onMouseEnter: this._onMouseEnter,\n            onMouseLeave: this._onMouseLeave,\n            isTabStop: windowsTabFocusable,\n            tabIndex: tabIndex,\n            importantForAccessibility: importantForAccessibility,\n            disableSystemFocusVisuals: false,\n            handledKeyDownKeys: DOWN_KEYCODES,\n            handledKeyUpKeys: UP_KEYCODES,\n            onKeyDown: this._onKeyDown,\n            onKeyUp: this._onKeyUp,\n            onFocus: this._onFocus,\n            onBlur: this._onBlur,\n            onAccessibilityTap: this._onAccessibilityTap,\n        };\n\n        return (\n            <FocusableAnimatedView { ...focusableViewProps }>\n                { this.props.children }\n            </FocusableAnimatedView>\n        );\n    }\n\n    focus() {\n        if (this._buttonElement && this._buttonElement.focus) {\n            this._buttonElement.focus();\n        }\n\n    }\n\n    blur() {\n        if (this._buttonElement && this._buttonElement.blur) {\n            this._buttonElement.blur();\n        }\n    }\n\n    setNativeProps(nativeProps: RN.ViewProps) {\n        // Redirect to focusable component if present.\n        if (this._buttonElement) {\n            this._buttonElement.setNativeProps(nativeProps);\n        } else {\n            super.setNativeProps(nativeProps);\n        }\n    }\n\n    getChildContext(): ButtonContext {\n        const childContext: ButtonContext = super.getChildContext();\n\n        // We use a context field to signal any component in the subtree to disable any system provided context menus.\n        // This is not a bulletproof mechanism, context changes not being guaranteed to be detected by children, depending on factors\n        // like shouldComponentUpdate methods on intermediate nodes, etc.\n        // Fortunately press handlers are pretty stable.\n\n        // This instance can be a responder (even when button is disabled). It may or may not have to invoke an onContextMenu handler, but\n        // it will consume all corresponding touch events, so overwriting any parent-set value is the correct thing to do.\n        childContext.isRxParentAContextMenuResponder = !!this.props.onContextMenu;\n\n        // This button will hide other \"accessible focusable\" controls as part of being restricted/limited by a focus manager\n        // (more detailed description is in windows/View.tsx)\n        childContext.isRxParentAFocusableInSameFocusManager = true;\n\n        return childContext;\n    }\n\n    private _onAccessibilityTap = (e: RN.NativeSyntheticEvent<any>): void => {\n        if (!this.props.disabled && this.props.onPress) {\n            this.props.onPress(e);\n        }\n    };\n\n    private _onKeyDown = (e: React.SyntheticEvent<any>): void => {\n        if (!this.props.disabled) {\n            const keyEvent = EventHelpers.toKeyboardEvent(e);\n            if (this.props.onKeyPress) {\n                this.props.onKeyPress(keyEvent);\n            }\n\n            if (this.props.onPress) {\n                const key = keyEvent.keyCode;\n                // ENTER triggers press on key down\n                if (key === KEY_CODE_ENTER) {\n                    this.props.onPress(keyEvent);\n                }\n            }\n\n            if (this.props.onContextMenu) {\n                const key = keyEvent.keyCode;\n                if ((key === KEY_CODE_APP) || (key === KEY_CODE_F10 && keyEvent.shiftKey)) {\n                    if (this._isMounted) {\n                        UserInterface.measureLayoutRelativeToWindow(this).then( layoutInfo => {\n                            // need to simulate the mouse event so that we\n                            // can show the context menu in the right position\n                            if (this._isMounted) {\n                                const mouseEvent = EventHelpers.keyboardToMouseEvent(keyEvent, layoutInfo,\n                                    this._getContextMenuOffset());\n                                if (this.props.onContextMenu) {\n                                    this.props.onContextMenu(mouseEvent);\n                                }\n                            }\n                        }).catch(e => {\n                            console.warn('Button measureKayoutRelativeToWindow exception: ' + JSON.stringify(e));\n                        });\n                    }\n                }\n            }\n        }\n    };\n\n    private _onKeyUp = (e: React.SyntheticEvent<any>): void => {\n        const keyEvent = EventHelpers.toKeyboardEvent(e);\n        if (keyEvent.keyCode === KEY_CODE_SPACE && !this.props.disabled && this.props.onPress) {\n            this.props.onPress(keyEvent);\n        }\n    };\n\n    // When we get focus on an element, show the hover effect on the element.\n    // This ensures that users using keyboard also get the similar experience as mouse users for accessibility.\n    private _onFocus = (e: React.SyntheticEvent<any>): void => {\n        if (e.currentTarget === e.target) {\n            this.onFocus();\n        }\n\n        this._isFocusedWithKeyboard = UserInterface.isNavigatingWithKeyboard();\n        this._onHoverStart(e);\n\n        if (this.props.onFocus) {\n            this.props.onFocus(EventHelpers.toFocusEvent(e));\n        }\n    };\n\n    private _onBlur = (e: React.SyntheticEvent<any>): void => {\n        this._isFocusedWithKeyboard = false;\n        this._onHoverEnd(e);\n\n        if (this.props.onBlur) {\n            this.props.onBlur(EventHelpers.toFocusEvent(e));\n        }\n    };\n\n    protected _onHoverStart = (e: React.SyntheticEvent<any>) => {\n        if (!this._isHoverStarted && (this._isMouseOver || this._isFocusedWithKeyboard)) {\n            this._isHoverStarted = true;\n\n            if (this.props.onHoverStart) {\n                this.props.onHoverStart(e);\n            }\n        }\n    };\n\n    protected _onHoverEnd = (e: React.SyntheticEvent<any>) => {\n        if (this._isHoverStarted && !this._isMouseOver && !this._isFocusedWithKeyboard) {\n            this._isHoverStarted = false;\n\n            if (this.props.onHoverEnd) {\n                this.props.onHoverEnd(e);\n            }\n        }\n    };\n\n    // From FocusManagerFocusableComponent interface\n    //\n    onFocus() {\n        // Focus Manager hook\n    }\n\n    getTabIndex(): number | undefined {\n        // Button defaults to a tabIndex of 0\n        // Focus Manager may override this\n        return this.props.tabIndex || 0;\n    }\n\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined {\n        // Focus Manager may override this\n        // We force a default of YES if no property is provided, consistent with the base class\n        return AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility,\n            Types.ImportantForAccessibility.Yes);\n    }\n\n    updateNativeAccessibilityProps(): void {\n        if (this._buttonElement) {\n            const tabIndex: number | undefined = this.getTabIndex();\n            const windowsTabFocusable: boolean = !this.props.disabled && tabIndex !== undefined && tabIndex >= 0;\n            const importantForAccessibility: ImportantForAccessibilityValue | undefined = this.getImportantForAccessibility();\n\n            this._buttonElement.setNativeProps({\n                tabIndex: tabIndex,\n                isTabStop: windowsTabFocusable,\n                importantForAccessibility: importantForAccessibility,\n            });\n        }\n    }\n}\n\napplyFocusableComponentMixin(Button);\n\nexport default Button;\n"
  },
  {
    "path": "src/windows/GestureView.tsx",
    "content": "/**\n * GestureView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows-specific implementation of RN GestureView component.\n */\n\nimport { GestureView as BaseGestureView } from '../native-common/GestureView';\nimport { Types } from '../common/Interfaces';\n\nconst _preferredPanRatio = 3;\n\nexport class GestureView extends BaseGestureView {\n\n    constructor(props: Types.GestureViewProps) {\n        super(props);\n    }\n\n    protected _getPreferredPanRatio(): number {\n        return _preferredPanRatio;\n    }\n\n    protected _getEventTimestamp(e: Types.TouchEvent | Types.MouseEvent): number {\n        let timestamp = e.timeStamp;\n\n        // Work around a bug in some versions of RN where \"timestamp\" is\n        // capitalized differently for some events.\n        if (!timestamp) {\n            timestamp = (e as any).timestamp;\n        }\n\n        if (!timestamp) {\n            return 0;\n        }\n\n        return timestamp.valueOf();\n    }\n}\n\nexport default GestureView;\n"
  },
  {
    "path": "src/windows/Link.tsx",
    "content": "/**\n * Link.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Desktop-specific implementation of the cross-platform Link abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RNW from 'react-native-windows';\n\nimport AccessibilityUtil, { ImportantForAccessibilityValue } from '../native-common/AccessibilityUtil';\nimport assert from '../common/assert';\nimport { FocusArbitratorProvider } from '../common/utils/AutoFocusHelper';\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport { applyFocusableComponentMixin, FocusManager, FocusManagerFocusableComponent } from '../native-desktop/utils/FocusManager';\nimport { Types } from '../common/Interfaces';\nimport { LinkBase } from '../native-common/Link';\nimport UserInterface from '../native-common/UserInterface';\n\nconst KEY_CODE_ENTER = 13;\nconst KEY_CODE_SPACE = 32;\nconst KEY_CODE_F10 = 121;\nconst KEY_CODE_APP = 500;\n\nconst DOWN_KEYCODES = [KEY_CODE_SPACE, KEY_CODE_ENTER, KEY_CODE_APP, KEY_CODE_F10];\nconst UP_KEYCODES = [KEY_CODE_SPACE];\n\nconst FocusableText = RNW.createFocusableComponent(RN.Text);\n\nexport interface LinkState {\n    isRestrictedOrLimited: boolean;\n}\n\ntype Without<T, K> = Pick<T, Exclude<keyof T, K>>;\n\nexport class Link extends LinkBase<LinkState> implements FocusManagerFocusableComponent {\n\n    // Offset to show context menu using keyboard.\n    protected _getContextMenuOffset() {\n        return { x: 0, y: 0 };\n    }\n\n    constructor(props: Types.LinkProps) {\n        super(props);\n\n        this.state = {\n            isRestrictedOrLimited: false,\n        };\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n        // Retrieve focus restriction state and subscribe for further changes.\n        // This is the earliest point this can be done since Focus Manager uses a pre-\"componentDidMount\" hook\n        // to connect to component instances\n        this._restrictedOrLimitedCallback(FocusManager.isComponentFocusRestrictedOrLimited(this));\n        FocusManager.subscribe(this, this._restrictedOrLimitedCallback);\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n        // This is for symmetry, but the callbacks have already been deleted by FocusManager since its\n        // hook executes first\n        FocusManager.unsubscribe(this, this._restrictedOrLimitedCallback);\n    }\n\n    private _restrictedOrLimitedCallback = (restrictedOrLimited: boolean): void => {\n        this.setState({\n            isRestrictedOrLimited: restrictedOrLimited,\n        });\n    };\n\n    protected _render(internalProps: RN.TextProps, onMount: (text: any) => void) {\n        if (this.context && !this.context.isRxParentAText) {\n            // Standalone link. We use a keyboard focusable RN.Text\n            return this._renderLinkAsFocusableText(internalProps, onMount);\n        } else if (RNW.HyperlinkWindows && !this.state.isRestrictedOrLimited) {\n            // Inline Link. We use a native Hyperlink inline if RN supports it and element is not \"focus restricted/limited\"\n            return this._renderLinkAsNativeHyperlink(internalProps);\n        } else {\n            // Inline Link. We defer to base class (that uses a plain RN.Text) for the rest of the cases.\n            return super._render(internalProps, onMount);\n        }\n    }\n\n    private _renderLinkAsFocusableText(internalProps: RN.TextProps, onMount: (text: any) => void) {\n        const focusableTextProps = this._createFocusableTextProps(internalProps);\n        return (\n            <FocusableText { ...focusableTextProps } ref={ onMount }/>\n        );\n    }\n\n    private _focusableElement: RNW.FocusableWindows<RN.TextProps> | null = null;\n\n    private _onFocusableRef = (btn: RNW.FocusableWindows<RN.TextProps> | null): void => {\n        this._focusableElement = btn;\n    };\n\n    private _createFocusableTextProps(internalProps: RN.TextProps) {\n        const tabIndex: number | undefined = this.getTabIndex();\n        const windowsTabFocusable: boolean =  tabIndex !== undefined && tabIndex >= 0;\n        const importantForAccessibility = this.getImportantForAccessibility();\n\n        // We don't use 'string' ref type inside ReactXP\n        const originalRef = (internalProps as any).ref;\n        assert(!(typeof originalRef === 'string'), 'Link: ReactXP must not use string refs internally');\n\n        const componentRef = originalRef as Function;\n        const focusableTextProps: RNW.FocusableWindowsProps<Without<RN.TextProps, 'onAccessibilityTap'> & RNW.AccessibilityEvents> = {\n            ...internalProps,\n            componentRef,\n            ref: this._onFocusableRef,\n            isTabStop: windowsTabFocusable,\n            tabIndex,\n            importantForAccessibility,\n            disableSystemFocusVisuals: false,\n            handledKeyDownKeys: DOWN_KEYCODES,\n            handledKeyUpKeys: UP_KEYCODES,\n            onKeyDown: this._onKeyDown,\n            onKeyUp: this._onKeyUp,\n            onFocus: this._onFocus,\n            onAccessibilityTap: this._onPress,\n        };\n\n        return focusableTextProps;\n    }\n\n    private _nativeHyperlinkElement: RNW.HyperlinkWindows | null = null;\n\n    private _onNativeHyperlinkRef = (ref: RNW.HyperlinkWindows | null): void => {\n        this._nativeHyperlinkElement = ref;\n    };\n\n    private _renderLinkAsNativeHyperlink(internalProps: RN.TextProps) {\n        // We don't use 'string' ref type inside ReactXP\n        const originalRef = (internalProps as any).ref;\n        assert(!(typeof originalRef === 'string'), 'Link: ReactXP must not use string refs internally');\n\n        return (\n            <RNW.HyperlinkWindows\n                { ...internalProps }\n                ref={ this._onNativeHyperlinkRef }\n                onFocus={ this._onFocus }\n            />\n        );\n    }\n\n    focus() {\n        if (this._focusableElement && this._focusableElement.focus) {\n            this._focusableElement.focus();\n        } else if (this._nativeHyperlinkElement && this._nativeHyperlinkElement.focus) {\n            this._nativeHyperlinkElement.focus();\n        }\n    }\n\n    blur() {\n        if (this._focusableElement && this._focusableElement.blur) {\n            this._focusableElement.blur();\n        } else if (this._nativeHyperlinkElement && this._nativeHyperlinkElement.blur) {\n            this._nativeHyperlinkElement.blur();\n        }\n    }\n\n    setNativeProps(nativeProps: RN.TextProps) {\n        // Redirect to focusable component if present.\n        if (this._focusableElement) {\n            this._focusableElement.setNativeProps(nativeProps);\n        } else {\n            super.setNativeProps(nativeProps);\n        }\n    }\n\n    requestFocus() {\n        FocusArbitratorProvider.requestFocus(\n            this,\n            () => { this.focus(); },\n            () => this._isAvailableToFocus(),\n        );\n    }\n\n    private _isAvailableToFocus(): boolean {\n        return !!((this._focusableElement && this._focusableElement.focus) ||\n            (this._nativeHyperlinkElement && this._nativeHyperlinkElement.focus));\n    }\n\n    private _onKeyDown = (e: React.SyntheticEvent<any>): void => {\n        const keyEvent = EventHelpers.toKeyboardEvent(e);\n        const key = keyEvent.keyCode;\n        // ENTER triggers press on key down\n        if (key === KEY_CODE_ENTER) {\n            // Defer to base class\n            this._onPress(keyEvent);\n        }\n\n        if (this.props.onContextMenu) {\n            const key = keyEvent.keyCode;\n            if ((key === KEY_CODE_APP) || (key === KEY_CODE_F10 && keyEvent.shiftKey)) {\n                if (this._isMounted) {\n                    UserInterface.measureLayoutRelativeToWindow(this).then( layoutInfo => {\n                        // need to simulate the mouse event so that we\n                        // can show the context menu in the right position\n                        if (this._isMounted) {\n                            const mouseEvent = EventHelpers.keyboardToMouseEvent(keyEvent, layoutInfo, this._getContextMenuOffset());\n                            if (this.props.onContextMenu) {\n                                this.props.onContextMenu(mouseEvent);\n                            }\n                        }\n                    }).catch(e => {\n                        console.warn('Link measureKayoutRelativeToWindow exception: ' + JSON.stringify(e));\n                    });\n                }\n            }\n        }\n    };\n\n    private _onKeyUp = (e: React.SyntheticEvent<any>): void => {\n        const keyEvent = EventHelpers.toKeyboardEvent(e);\n        if (keyEvent.keyCode === KEY_CODE_SPACE) {\n            // Defer to base class\n            this._onPress(keyEvent);\n        }\n    };\n\n    private _onFocus = (e: React.SyntheticEvent<any>): void => {\n        if (e.currentTarget === e.target) {\n            this.onFocus();\n        }\n    };\n\n    // From FocusManagerFocusableComponent interface\n    //\n    onFocus() {\n        // Focus Manager hook\n    }\n\n    getTabIndex(): number | undefined {\n        // Link defaults to a tabIndex of 0\n        // Focus Manager may override this\n        return this.props.tabIndex || 0;\n    }\n\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined {\n        // Focus Manager may override this\n\n        // Go by default of Auto, LinkProps has no corresponding accessibility property\n        return AccessibilityUtil.importantForAccessibilityToString(Types.ImportantForAccessibility.Auto);\n    }\n\n    updateNativeAccessibilityProps(): void {\n        if (this._focusableElement) {\n            const tabIndex: number | undefined = this.getTabIndex();\n            const windowsTabFocusable: boolean = tabIndex !== undefined && tabIndex >= 0;\n            const importantForAccessibility: ImportantForAccessibilityValue | undefined = this.getImportantForAccessibility();\n\n            this._focusableElement.setNativeProps({\n                tabIndex: tabIndex,\n                isTabStop: windowsTabFocusable,\n                importantForAccessibility: importantForAccessibility,\n            });\n        }\n    }\n}\n\napplyFocusableComponentMixin(Link);\n\nexport default Link;\n"
  },
  {
    "path": "src/windows/ReactXP.ts",
    "content": "/**\n* ReactXP.ts\n*\n* Copyright (c) Microsoft Corporation. All rights reserved.\n* Licensed under the MIT license.\n*\n* Wrapper for all ReactXP functionality. Users of ReactXP should import just this\n* file instead of internals.\n*/\n\nimport React = require('react');\nimport RN = require('react-native');\n\nimport AccessibilityUtil from '../native-common/AccessibilityUtil';\nimport ActivityIndicatorImpl from '../native-common/ActivityIndicator';\nimport AlertImpl from '../native-common/Alert';\nimport { CommonAnimatedClasses, makeAnimated } from '../native-common/Animated';\nimport ClipboardImpl from '../native-common/Clipboard';\nimport ImageImpl from '../native-common/Image';\nimport InputImpl from '../native-desktop/Input';\nimport RXInterfaces = require('../common/Interfaces');\nimport InternationalImpl from '../native-common/International';\nimport LinkingImpl from '../native-common/Linking';\nimport LocationImpl from '../common/Location';\nimport ModalImpl from '../native-common/Modal';\nimport RXModuleInterface = require('../common/ModuleInterface');\nimport PickerImpl from '../native-common/Picker';\nimport PlatformImpl from '../native-common/Platform';\nimport PopupImpl from '../native-common/Popup';\nimport ScrollViewImpl from '../native-desktop/ScrollView';\nimport StorageImpl from '../native-common/Storage';\nimport StylesImpl from '../native-common/Styles';\nimport RXTypes = require('../common/Types');\nimport UserInterfaceImpl from '../native-common/UserInterface';\nimport UserPresenceImpl from '../native-common/UserPresence';\n\nimport AccessibilityImpl from './Accessibility';\nimport AccessibilityPlatformUtil from './AccessibilityUtil';\nimport AppImpl from './App';\nimport ButtonImpl from './Button';\nimport GestureViewImpl from './GestureView';\nimport LinkImpl from './Link';\nimport StatusBarImpl from './StatusBar';\nimport TextImpl from './Text';\nimport TextInputImpl from './TextInput';\nimport ViewImpl from './View';\n\nAccessibilityUtil.setAccessibilityPlatformUtil(AccessibilityPlatformUtil);\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nmodule ReactXP {\n    export type Accessibility = RXInterfaces.Accessibility;\n    export let Accessibility: RXInterfaces.Accessibility = AccessibilityImpl;\n    export type ActivityIndicator = RXInterfaces.ActivityIndicator;\n    export let ActivityIndicator: typeof RXInterfaces.ActivityIndicator = ActivityIndicatorImpl;\n    export type Alert = RXInterfaces.Alert;\n    export let Alert: RXInterfaces.Alert = AlertImpl;\n    export type App = RXInterfaces.App;\n    export let App: RXInterfaces.App = AppImpl;\n    export type Button = RXInterfaces.Button;\n    export let Button: typeof RXInterfaces.Button = ButtonImpl;\n    export type Picker = RXInterfaces.Picker;\n    export let Picker: typeof RXInterfaces.Picker = PickerImpl;\n    export type Clipboard = RXInterfaces.Clipboard;\n    export let Clipboard: RXInterfaces.Clipboard = ClipboardImpl;\n    export type GestureView = RXInterfaces.GestureView;\n    export let GestureView: typeof RXInterfaces.GestureView = GestureViewImpl;\n    export type Image = RXInterfaces.Image;\n    export let Image: RXInterfaces.ImageConstructor = ImageImpl;\n    export type Input = RXInterfaces.Input;\n    export let Input: RXInterfaces.Input = InputImpl;\n    export type International = RXInterfaces.International;\n    export let International: RXInterfaces.International = InternationalImpl;\n    export type Link = RXInterfaces.Link;\n    export let Link: typeof RXInterfaces.Link = LinkImpl;\n    export type Linking = RXInterfaces.Linking;\n    export let Linking: RXInterfaces.Linking = LinkingImpl;\n    export type Location = RXInterfaces.Location;\n    export let Location: RXInterfaces.Location = LocationImpl;\n    export type Modal = RXInterfaces.Modal;\n    export let Modal: RXInterfaces.Modal = ModalImpl;\n    export type Platform = RXInterfaces.Platform;\n    export let Platform: RXInterfaces.Platform = PlatformImpl;\n    export type Popup = RXInterfaces.Popup;\n    export let Popup: RXInterfaces.Popup = PopupImpl;\n    export type ScrollView = RXInterfaces.ScrollView;\n    export let ScrollView: RXInterfaces.ScrollViewConstructor = ScrollViewImpl;\n    export type StatusBar = RXInterfaces.StatusBar;\n    export let StatusBar: RXInterfaces.StatusBar = StatusBarImpl;\n    export type Storage = RXInterfaces.Storage;\n    export let Storage: RXInterfaces.Storage = StorageImpl;\n    export type Styles = RXInterfaces.Styles;\n    export let Styles: RXInterfaces.Styles = StylesImpl;\n    export type Text = RXInterfaces.Text;\n    export let Text: typeof RXInterfaces.Text = TextImpl;\n    export type TextInput = RXInterfaces.TextInput;\n    export let TextInput: typeof RXInterfaces.TextInput = TextInputImpl;\n    export type UserInterface = RXInterfaces.UserInterface;\n    export let UserInterface: RXInterfaces.UserInterface = UserInterfaceImpl;\n    export type UserPresence = RXInterfaces.UserPresence;\n    export let UserPresence: RXInterfaces.UserPresence = UserPresenceImpl;\n    export type View = RXInterfaces.View;\n    export let View: typeof RXInterfaces.View = ViewImpl;\n\n    const windowsAnimatedClasses =  {\n        ...CommonAnimatedClasses,\n        View: RN.Animated.createAnimatedComponent(ViewImpl),\n        TextInput:  RN.Animated.createAnimatedComponent(TextInputImpl),\n        Text:  RN.Animated.createAnimatedComponent(TextImpl),\n    };\n\n    export const Animated = makeAnimated(windowsAnimatedClasses, true);\n    export import CommonProps = RXTypes.CommonProps;\n    export import CommonStyledProps = RXTypes.CommonStyledProps;\n    export import Stateless = RXTypes.Stateless;\n    export import Types = RXTypes;\n\n    export import Component = React.Component;\n    export import ComponentBase = RXTypes.ComponentBase;\n    export import createElement = React.createElement;\n    export import Children = React.Children;\n    export let __spread = (React as any).__spread;\n    export import Fragment = React.Fragment;\n}\n\n// -- STRANGE THINGS GOING ON HERE --\n// See web/ReactXP.tsx for more details.\n\nlet _rxImplementsRxInterface: typeof RXModuleInterface.ReactXP = ReactXP;\n_rxImplementsRxInterface = _rxImplementsRxInterface;\nexport = ReactXP;\n\n/*\nvar rx = module.exports;\nObject.keys(rx)\n    .filter(key => rx[key] && rx[key].prototype instanceof React.Component && !rx[key].displayName)\n    .forEach(key => rx[key].displayName = 'RX.' + key + '');\n*/\n"
  },
  {
    "path": "src/windows/RootView.tsx",
    "content": "/**\n * RootView.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * The top-most view that's used for proper layering or modals and popups.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RNW from 'react-native-windows';\n\nimport {\n    BaseRootView,\n    BaseRootViewProps,\n    RootView as RootViewBase,\n    RootViewPropsWithMainViewType,\n    RootViewState,\n    RootViewUsingProps as RootViewUsingPropsBase,\n} from '../native-desktop/RootView';\n\nimport { AccessibilityAnnouncer } from './AccessibilityAnnouncer';\n\n//\n// We use a custom RNW provided component to capture key input before being dispatched to native controls.\n// If support not present, we fallback to the base class implementation.\nconst _isRootInputViewSupported = !!RNW.RootInputViewWindows;\n\nconst _styles = RN.StyleSheet.create({\n    appWrapperStyle: {\n        flex: 1,\n    },\n});\n\ntype Handler = (e: RN.NativeSyntheticEvent<any>) => void;\n\nfunction _renderTopView(content: JSX.Element, onKeyDown: Handler, onKeyDownCapture: Handler, onKeyUp: Handler,\n        onTouchStartCapture: Handler): JSX.Element {\n    return (\n        <RNW.RootInputViewWindows\n            onTouchStartCapture={ onTouchStartCapture }\n            onAccelKeyDown={ (e: RN.NativeSyntheticEvent<any>) => {onKeyDownCapture(e); onKeyDown(e); } }\n            onAccelKeyUp={ onKeyUp }\n            style={ _styles.appWrapperStyle }\n        >\n            { content }\n        </RNW.RootInputViewWindows>\n    );\n}\n\nclass RootViewUsingStore extends RootViewBase {\n    renderTopView(content: JSX.Element): JSX.Element {\n        if (_isRootInputViewSupported) {\n            return _renderTopView(\n                content,\n                this._onKeyDown,\n                this._onKeyDownCapture,\n                this._onKeyUp,\n                this._onTouchStartCapture,\n            );\n        } else {\n            return super.renderTopView(content);\n        }\n    }\n\n    protected _renderAnnouncerView(): JSX.Element {\n        return (\n            <AccessibilityAnnouncer />\n        );\n    }\n}\n\nclass RootViewUsingProps extends RootViewUsingPropsBase {\n    renderTopView(content: JSX.Element): JSX.Element {\n        if (_isRootInputViewSupported) {\n            return _renderTopView (\n                content,\n                this._onKeyDown,\n                this._onKeyDownCapture,\n                this._onKeyUp,\n                this._onTouchStartCapture,\n            );\n        } else {\n            return super.renderTopView(content);\n        }\n    }\n\n    protected _renderAnnouncerView(): JSX.Element {\n        return (\n            <AccessibilityAnnouncer />\n        );\n    }\n}\n\nexport {\n    BaseRootViewProps,\n    RootViewPropsWithMainViewType,\n    RootViewState,\n    BaseRootView,\n    RootViewUsingStore as RootView,\n    RootViewUsingProps,\n};\n\nexport default RootViewUsingStore;\n"
  },
  {
    "path": "src/windows/StatusBar.ts",
    "content": "/**\n * StatusBar.ts\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows-specific implementation of StatusBar APIs.\n */\n\nimport * as RX from '../common/Interfaces';\n\nexport class StatusBar extends RX.StatusBar {\n    isOverlay(): boolean {\n        // We currently only care about Windows desktop which doesn't have a\n        // status bar.\n        return false;\n    }\n\n    setHidden(hidden: boolean, showHideTransition: 'fade' | 'slide'): void {\n        // Nothing to do on Windows\n    }\n\n    setBackgroundColor(color: string, animated: boolean): void {\n        // Nothing to do on Windows\n    }\n\n    setTranslucent(translucent: boolean): void {\n        // Nothing to do on Windows\n    }\n\n    setBarStyle(style: 'default' | 'light-content' | 'dark-content', animated: boolean): void {\n        // Nothing to do on Windows\n    }\n\n    setNetworkActivityIndicatorVisible(value: boolean): void {\n        // Nothing to do on Windows\n    }\n}\n\nexport default new StatusBar();\n"
  },
  {
    "path": "src/windows/Text.tsx",
    "content": "/**\n * Text.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Windows-specific implementation of the cross-platform Text abstraction.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport { ExtendedTextProps, NativeSyntheticEvent } from 'react-native';\nimport { TextWindowsSelectionChangeEventData as SelectionChangeEventData } from 'react-native-windows';\n\nimport AccessibilityUtil, { ImportantForAccessibilityValue } from '../native-common/AccessibilityUtil';\nimport { applyFocusableComponentMixin, FocusManagerFocusableComponent } from '../native-desktop/utils/FocusManager';\nimport { Types } from '../common/Interfaces';\nimport { Text as TextBase, TextContext as TextContextBase } from '../native-common/Text';\n\nexport interface TextContext extends TextContextBase {\n    isRxParentAFocusableInSameFocusManager?: boolean;\n}\n\nexport class Text extends TextBase implements React.ChildContextProvider<TextContext>, FocusManagerFocusableComponent {\n    static contextTypes: React.ValidationMap<any> = {\n        isRxParentAFocusableInSameFocusManager: PropTypes.bool,\n        ...TextBase.contextTypes,\n    };\n\n    private _selectedText = '';\n\n    // Context is provided by super - just re-typing here\n    context!: TextContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAFocusableInSameFocusManager: PropTypes.bool,\n        ...TextBase.childContextTypes,\n    };\n\n    protected _getExtendedProperties(): ExtendedTextProps {\n        const superExtendedProps: ExtendedTextProps = super._getExtendedProperties();\n        return {\n            ...superExtendedProps,\n            onSelectionChange: this._onSelectionChange,\n        };\n    }\n\n    private _onSelectionChange = (event: NativeSyntheticEvent<SelectionChangeEventData>) => {\n        this._selectedText = event.nativeEvent.selectedText;\n    };\n\n    requestFocus() {\n        // UWP doesn't support casually focusing RN.Text elements. We override requestFocus in order to drop any focus requests\n    }\n\n    getChildContext(): TextContext {\n        const childContext: TextContext = super.getChildContext();\n\n        // This control will hide other \"accessible focusable\" controls as part of being restricted/limited by a focus manager\n        // (more detailed description is in windows/View.tsx)\n        childContext.isRxParentAFocusableInSameFocusManager = true;\n\n        return childContext;\n    }\n\n    // From FocusManagerFocusableComponent interface\n    //\n    onFocus() {\n        // Focus Manager hook\n        // Not used\n    }\n\n    getTabIndex(): number {\n        // Not used\n        return -1;\n    }\n\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined {\n        // Focus Manager may override this\n\n        // We force a default of Auto if no property is provided\n        return AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility,\n            Types.ImportantForAccessibility.Auto);\n    }\n\n    updateNativeAccessibilityProps(): void {\n        if (this._mountedComponent) {\n            const importantForAccessibility = this.getImportantForAccessibility();\n            this._mountedComponent.setNativeProps({\n                importantForAccessibility: importantForAccessibility,\n            });\n        }\n    }\n\n    getSelectedText(): string {\n        return this._selectedText;\n    }\n}\n\n// Text is focusable just by screen readers\napplyFocusableComponentMixin(Text, function(this: Text, nextProps?: Types.TextProps, nextState?: any, nextCtx?: TextContext) {\n    // This control should be tracked by a FocusManager if there's no other control tracked by the same FocusManager in\n    // the parent path\n    return nextCtx && ('isRxParentAFocusableInSameFocusManager' in nextCtx)\n        ? !nextCtx.isRxParentAFocusableInSameFocusManager : !this.context.isRxParentAFocusableInSameFocusManager;\n}, true);\n\nexport default Text;\n"
  },
  {
    "path": "src/windows/TextInput.tsx",
    "content": "/**\n * TextInput.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * RN Windows-specific implementation of the cross-platform TextInput abstraction.\n */\n\nimport * as React from 'react';\nimport * as RN from 'react-native';\n\nimport AccessibilityUtil, { ImportantForAccessibilityValue } from '../native-common/AccessibilityUtil';\nimport { applyFocusableComponentMixin, FocusManagerFocusableComponent } from '../native-desktop/utils/FocusManager';\nimport { Types } from '../common/Interfaces';\nimport { TextInput as TextInputBase } from '../native-common/TextInput';\n\nexport class TextInput extends TextInputBase implements FocusManagerFocusableComponent {\n\n    protected _render(props: RN.TextInputProps, onMount: (textInput: any) => void): JSX.Element {\n        const extendedProps: RN.ExtendedTextInputProps = {\n            tabIndex: this.getTabIndex(),\n        };\n\n        return (\n            <RN.TextInput\n                { ...props }\n                { ...extendedProps }\n                ref={ onMount }\n                importantForAccessibility={ this.getImportantForAccessibility() }\n                onFocus={ (e: RN.NativeSyntheticEvent<RN.TextInputFocusEventData>) => { this._onFocusEx(e, props.onFocus); } }\n            />\n        );\n    }\n\n    private _onFocusEx(e: RN.NativeSyntheticEvent<RN.TextInputFocusEventData>,\n            origHandler: ((e: RN.NativeSyntheticEvent<RN.TextInputFocusEventData>) => void) | undefined) {\n        if (e.currentTarget === e.target) {\n            this.onFocus();\n        }\n\n        if (origHandler) {\n            origHandler(e);\n        }\n    }\n\n    // From FocusManagerFocusableComponent interface\n    //\n    onFocus() {\n        // Focus Manager hook\n    }\n\n    getTabIndex(): number {\n        // Focus Manager may override this\n        return this.props.tabIndex || 0;\n    }\n\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined {\n        // Focus Manager may override this\n\n        // Note: currently native-common flavor doesn't pass any accessibility properties to RN.TextInput.\n        // This should ideally be fixed.\n        // We force a default of Auto if no property is provided\n        return AccessibilityUtil.importantForAccessibilityToString(this.props.importantForAccessibility,\n            Types.ImportantForAccessibility.Auto);\n    }\n\n    updateNativeAccessibilityProps(): void {\n        if (this._mountedComponent) {\n            const tabIndex = this.getTabIndex();\n            const importantForAccessibility = this.getImportantForAccessibility();\n            this._mountedComponent.setNativeProps({\n                tabIndex: tabIndex,\n                value: this.state.inputValue, // mandatory for some reason\n                isTabStop: this.props.editable && tabIndex >= 0,\n                importantForAccessibility: importantForAccessibility,\n            });\n        }\n    }\n}\n\napplyFocusableComponentMixin(TextInput);\n\nexport default TextInput;\n"
  },
  {
    "path": "src/windows/View.tsx",
    "content": "/**\n * View.tsx\n *\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT license.\n *\n * Windows-specific implementation of View.\n */\n\nimport * as PropTypes from 'prop-types';\nimport * as React from 'react';\nimport * as RN from 'react-native';\nimport * as RNW from 'react-native-windows';\n\nimport AccessibilityUtil, { ImportantForAccessibilityValue } from '../native-common/AccessibilityUtil';\nimport AppConfig from '../common/AppConfig';\nimport assert from '../common/assert';\nimport EventHelpers from '../native-common/utils/EventHelpers';\nimport {\n    applyFocusableComponentMixin,\n    FocusManager,\n    FocusManagerFocusableComponent,\n} from '../native-desktop/utils/FocusManager';\nimport { RestrictFocusType } from '../common/utils/FocusManager';\nimport { Types } from '../common/Interfaces';\nimport PopupContainerView from '../native-common/PopupContainerView';\nimport { PopupComponent } from '../common/PopupContainerViewBase';\nimport UserInterface from '../native-common/UserInterface';\nimport { View as ViewCommon, ViewContext as ViewContextCommon } from '../native-common/View';\n\nconst KEY_CODE_ENTER = 13;\nconst KEY_CODE_SPACE = 32;\nconst KEY_CODE_F10 = 121;\nconst KEY_CODE_APP = 500;\n\nconst DOWN_KEYCODES = [KEY_CODE_SPACE, KEY_CODE_ENTER, KEY_CODE_F10, KEY_CODE_APP];\nconst UP_KEYCODES = [KEY_CODE_SPACE];\n\nexport interface ViewContext extends ViewContextCommon {\n    isRxParentAText?: boolean;\n    focusManager?: FocusManager;\n    popupContainer?: PopupContainerView;\n    isRxParentAContextMenuResponder?: boolean;\n    isRxParentAFocusableInSameFocusManager?: boolean;\n}\n\nconst FocusableView = RNW.createFocusableComponent(RN.View);\nconst FocusableAnimatedView = RNW.createFocusableComponent(RN.Animated.View);\n\nexport class View extends ViewCommon implements React.ChildContextProvider<ViewContext>, FocusManagerFocusableComponent {\n    static contextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool,\n        focusManager: PropTypes.object,\n        popupContainer: PropTypes.object,\n        ...ViewCommon.contextTypes,\n    };\n    // Context is provided by super - just re-typing here\n    context!: ViewContext;\n\n    static childContextTypes: React.ValidationMap<any> = {\n        isRxParentAText: PropTypes.bool.isRequired,\n        focusManager: PropTypes.object,\n        popupContainer: PropTypes.object,\n        isRxParentAContextMenuResponder: PropTypes.bool,\n        isRxParentAFocusableInSameFocusManager: PropTypes.bool,\n        ...ViewCommon.childContextTypes,\n    };\n\n    // Offset to show context menu using keyboard.\n    protected _getContextMenuOffset() {\n        return { x: 0, y: 0 };\n    }\n\n    private _onKeyDown: ((e: React.SyntheticEvent<any>) => void) | undefined;\n    private _onMouseEnter: ((e: React.SyntheticEvent<any>) => void) | undefined;\n    private _onMouseLeave: ((e: React.SyntheticEvent<any>) => void) | undefined;\n    private _onMouseOver: ((e: React.SyntheticEvent<any>) => void) | undefined;\n    private _onMouseMove: ((e: React.SyntheticEvent<any>) => void) | undefined;\n\n    private _focusableElement: RNW.FocusableWindows<RN.ViewProps> | null = null;\n\n    private _focusManager: FocusManager | undefined;\n    private _limitFocusWithin = false;\n    private _isFocusLimited = false;\n    private _isFocusRestricted: boolean | undefined;\n\n    private _popupContainer: PopupContainerView | undefined;\n    private _popupToken: PopupComponent | undefined;\n\n    constructor(props: Types.ViewProps, context?: ViewContext) {\n        super(props, context);\n\n        this._limitFocusWithin =\n            (props.limitFocusWithin === Types.LimitFocusType.Limited) ||\n            (props.limitFocusWithin === Types.LimitFocusType.Accessible);\n\n        if (this.props.restrictFocusWithin || this._limitFocusWithin) {\n            this._focusManager = new FocusManager(context && context.focusManager);\n\n            if (this._limitFocusWithin) {\n                this.setFocusLimited(true);\n            }\n        }\n        this._popupContainer = context && context.popupContainer;\n    }\n\n    UNSAFE_componentWillReceiveProps(nextProps: Types.ViewProps) {\n        super.UNSAFE_componentWillReceiveProps(nextProps);\n\n        if (AppConfig.isDevelopmentMode()) {\n            if (this.props.restrictFocusWithin !== nextProps.restrictFocusWithin) {\n                console.error('View: restrictFocusWithin is readonly and changing it during the component life cycle has no effect');\n            }\n\n            if (this.props.limitFocusWithin !== nextProps.limitFocusWithin) {\n                console.error('View: limitFocusWithin is readonly and changing it during the component life cycle has no effect');\n            }\n        }\n    }\n\n    enableFocusManager() {\n        if (this._focusManager) {\n            if (this.props.restrictFocusWithin && this._isFocusRestricted !== false) {\n                this._focusManager.restrictFocusWithin(RestrictFocusType.RestrictedFocusFirst);\n            }\n\n            if (this._limitFocusWithin && this._isFocusLimited) {\n                this._focusManager.limitFocusWithin(this.props.limitFocusWithin!);\n            }\n        }\n    }\n\n    disableFocusManager() {\n        if (this._focusManager) {\n            this._focusManager.release();\n        }\n    }\n\n    componentDidMount() {\n        super.componentDidMount();\n\n        if (this._focusManager) {\n            this._focusManager.setRestrictionStateCallback(this._focusRestrictionCallback.bind(this));\n        }\n\n        // If we are mounted as visible, do our initialization now. If we are hidden, it will\n        // be done later when the popup is shown.\n        if (!this._isHidden()) {\n            this.enableFocusManager();\n        }\n\n        if (this._focusManager && this._popupContainer) {\n            this._popupToken = this._popupContainer.registerPopupComponent(\n                () => this.enableFocusManager(), () => { this.disableFocusManager(); });\n        }\n    }\n\n    componentWillUnmount() {\n        super.componentWillUnmount();\n        this.disableFocusManager();\n\n        if (this._focusManager) {\n            this._focusManager.setRestrictionStateCallback(undefined);\n        }\n        if (this._popupToken) {\n            this._popupContainer!.unregisterPopupComponent(this._popupToken);\n        }\n    }\n\n    private _hasTrait(trait: Types.AccessibilityTrait, traits: Types.AccessibilityTrait | Types.AccessibilityTrait[] | undefined) {\n        return traits === trait || (Array.isArray(traits) && traits.indexOf(trait) !== -1);\n    }\n\n    private _showContextMenu(keyEvent: Types.KeyboardEvent) {\n        if (this._isMounted) {\n            UserInterface.measureLayoutRelativeToWindow(this).then( layoutInfo => {\n                // need to simulate the mouse event so that we\n                // can show the context menu in the right position\n                if (this._isMounted) {\n                    const mouseEvent = EventHelpers.keyboardToMouseEvent(keyEvent, layoutInfo, this._getContextMenuOffset());\n                    if (this.props.onContextMenu) {\n                        this.props.onContextMenu(mouseEvent);\n                    }\n                }\n            }).catch(e => {\n                console.warn('View measureKayoutRelativeToWindow exception: ' + JSON.stringify(e));\n            });\n        }\n    }\n\n    protected _buildInternalProps(props: Types.ViewProps) {\n        // Base class does the bulk of _internalprops creation\n        super._buildInternalProps(props);\n\n        // On Windows a view with importantForAccessibility='Yes' or\n        // non-empty accessibilityLabel and importantForAccessibility='Auto' (or unspecified) will hide its children.\n        // However, a view that is also a group or a dialog should keep children visible to UI Automation.\n        // The following condition checks and sets RN importantForAccessibility property\n        // to 'yes-dont-hide-descendants' to keep view children visible.\n        const hasGroup = this._hasTrait(Types.AccessibilityTrait.Group, props.accessibilityTraits);\n        const hasDialog = this._hasTrait(Types.AccessibilityTrait.Dialog, props.accessibilityTraits);\n        const i4aYes = props.importantForAccessibility === Types.ImportantForAccessibility.Yes;\n        const i4aAuto = (props.importantForAccessibility === Types.ImportantForAccessibility.Auto\n            || props.importantForAccessibility === undefined);\n        const hasLabel = props.accessibilityLabel && props.accessibilityLabel.length > 0;\n        if ((hasGroup || hasDialog) && (i4aYes || (i4aAuto && hasLabel))) {\n            this._internalProps.importantForAccessibility = 'yes-dont-hide-descendants';\n        }\n\n        if (props.onKeyPress) {\n\n            // Define the handler for \"onKeyDown\" on first use, it's the safest way when functions\n            // called from super constructors are involved. Ensuring nothing happens here if a\n            // tabIndex is specified else KeyDown is handled twice, in _onFocusableKeyDown as well.\n            if (this.props.tabIndex === undefined) {\n                if (!this._onKeyDown) {\n                    this._onKeyDown =  (e: Types.SyntheticEvent) => {\n                        const keyEvent = EventHelpers.toKeyboardEvent(e);\n                        if (this.props.onKeyPress) {\n                            // A conversion to a KeyboardEvent looking event is needed\n                            this.props.onKeyPress(keyEvent);\n                        }\n\n                        // This needs to be handled when there is no\n                        // tabIndex so we do not lose the bubbled events\n                        if (this.props.onContextMenu) {\n                            const key = keyEvent.keyCode;\n                            if ((key === KEY_CODE_APP) || (key === KEY_CODE_F10 && keyEvent.shiftKey)) {\n                                this._showContextMenu(keyEvent);\n                            }\n                        }\n                    };\n                }\n                // \"onKeyDown\" is fired by native buttons and bubbles up to views\n                this._internalProps.onKeyDown = this._onKeyDown;\n            }\n        }\n\n        // Drag and drop related properties\n        for (const name of ['onDragEnter', 'onDragOver', 'onDrop', 'onDragLeave']) {\n            const handler = this._internalProps[name];\n\n            if (handler) {\n                this._internalProps.allowDrop = true;\n\n                this._internalProps[name] = (e: React.SyntheticEvent<View>) => {\n                    handler({\n                        dataTransfer: (e.nativeEvent as any).dataTransfer,\n\n                        stopPropagation() {\n                            if (e.stopPropagation) {\n                                e.stopPropagation();\n                            }\n                        },\n\n                        preventDefault() {\n                            if (e.preventDefault) {\n                                e.preventDefault();\n                            }\n                        },\n                    });\n                };\n            }\n        }\n\n        // Drag and drop related properties\n        for (const name of ['onDragStart', 'onDrag', 'onDragEnd']) {\n            const handler = this._internalProps[name];\n\n            if (handler) {\n                if (name === 'onDragStart') {\n                    this._internalProps.allowDrag = true;\n                }\n\n                this._internalProps[name] = (e: React.SyntheticEvent<View>) => {\n                    handler({\n                        dataTransfer: (e.nativeEvent as any).dataTransfer,\n\n                        stopPropagation() {\n                            if (e.stopPropagation) {\n                                e.stopPropagation();\n                            }\n                        },\n\n                        preventDefault() {\n                            if (e.preventDefault) {\n                                e.preventDefault();\n                            }\n                        },\n                    });\n                };\n            }\n        }\n\n        // Mouse events (using same lazy initialization as for onKeyDown)\n        if (props.onMouseEnter) {\n            if (!this._onMouseEnter) {\n                this._onMouseEnter =  (e: React.SyntheticEvent<any>) => {\n                    if (this.props.onMouseEnter) {\n                        this.props.onMouseEnter(EventHelpers.toMouseEvent(e));\n                    }\n                };\n            }\n            this._internalProps.onMouseEnter = this._onMouseEnter;\n        }\n\n        if (props.onMouseLeave) {\n            if (!this._onMouseLeave) {\n                this._onMouseLeave =  (e: React.SyntheticEvent<any>) => {\n                    if (this.props.onMouseLeave) {\n                        this.props.onMouseLeave(EventHelpers.toMouseEvent(e));\n                    }\n                };\n            }\n            this._internalProps.onMouseLeave = this._onMouseLeave;\n        }\n\n        if (props.onMouseOver) {\n            if (!this._onMouseOver) {\n                this._onMouseOver =  (e: React.SyntheticEvent<any>) => {\n                    if (this.props.onMouseOver) {\n                        this.props.onMouseOver(EventHelpers.toMouseEvent(e));\n                    }\n                };\n            }\n            this._internalProps.onMouseOver = this._onMouseOver;\n        }\n\n        if (props.onMouseMove) {\n            if (!this._onMouseMove) {\n                this._onMouseMove =  (e: React.SyntheticEvent<any>) => {\n                    if (this.props.onMouseMove) {\n                        this.props.onMouseMove(EventHelpers.toMouseEvent(e));\n                    }\n                };\n            }\n            this._internalProps.onMouseMove = this._onMouseMove;\n        }\n    }\n\n    render(): JSX.Element {\n        if (this.props.tabIndex !== undefined) {\n            const tabIndex: number = this.getTabIndex() || 0;\n            const windowsTabFocusable: boolean =  tabIndex >= 0;\n            const importantForAccessibility: string | undefined = this.getImportantForAccessibility();\n\n            // We don't use 'string' ref type inside ReactXP\n            const originalRef = this._internalProps.ref;\n            assert(!(typeof originalRef === 'string'), 'View: ReactXP must not use string refs internally');\n\n            const componentRef: Function = originalRef as Function;\n            const focusableViewProps: RNW.FocusableWindowsProps<RN.ViewProps> = {\n                ...this._internalProps,\n                ref: this._onFocusableRef,\n                componentRef: componentRef,\n                isTabStop: windowsTabFocusable,\n                tabIndex: tabIndex,\n                importantForAccessibility: importantForAccessibility,\n                disableSystemFocusVisuals: false,\n                handledKeyDownKeys: DOWN_KEYCODES,\n                handledKeyUpKeys: UP_KEYCODES,\n                onKeyDown: this._onFocusableKeyDown,\n                onKeyUp: this._onFocusableKeyUp,\n                onFocus: this._onFocus,\n                onBlur: this._onBlur,\n                onAccessibilityTap: this._internalProps.onPress,\n                testID: this.props.testId,\n            };\n\n            const PotentiallyAnimatedFocusableView = this._isButton(this.props) ? FocusableAnimatedView : FocusableView;\n            return (\n                <PotentiallyAnimatedFocusableView\n                    { ...focusableViewProps }\n                />\n            );\n        } else {\n            return super.render();\n        }\n    }\n\n    private _onFocusableRef = (btn: RNW.FocusableWindows<RN.ViewProps>): void => {\n        this._focusableElement = btn;\n    };\n\n    requestFocus() {\n        if (!this._focusableElement) {\n            // Views with no tabIndex (even if -1) can't receive focus\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('View: requestFocus called on a non focusable element');\n            }\n            return;\n        }\n\n        super.requestFocus();\n    }\n\n    focus() {\n        // Only forward to Button.\n        // The other cases are RN.View based elements with no meaningful focus support\n        if (this._focusableElement) {\n            this._focusableElement.focus();\n        } else {\n            if (AppConfig.isDevelopmentMode()) {\n                console.error('View: focus called on a non focusable element');\n            }\n        }\n    }\n\n    blur() {\n        // Only forward to Button.\n        // The other cases are RN.View based elements with no meaningful focus support\n        if (this._focusableElement) {\n            this._focusableElement.blur();\n        }\n    }\n\n    getChildContext() {\n        // Let descendant RX components know that their nearest RX ancestor is not an RX.Text.\n        // Because they're in an RX.View, they should use their normal styling rather than their\n        // special styling for appearing inline with text.\n        const childContext: ViewContext = super.getChildContext();\n\n        childContext.isRxParentAText = false;\n\n        // Provide the descendants with the focus manager (if any).\n        if (this._focusManager) {\n            childContext.focusManager = this._focusManager;\n\n            // This FocusManager instance can restrict/limit the controls it tracks.\n            // The count of keyboard focusable controls is relatively low, yet the \"accessible focusable\" (by screen reader) one can\n            // trigger performance issues.\n            // One way to narrow down to a manageable set is to ignore \"accessible focusable\" controls that are children of\n            // focusable controls, as long as they are tracked by same FocusManager .\n            childContext.isRxParentAFocusableInSameFocusManager = false;\n        }\n        if (this._popupContainer) {\n            childContext.popupContainer = this._popupContainer;\n        }\n\n        // We use a context field to signal any component in the subtree to disable any system provided context menus.\n        // This is not a bulletproof mechanism, context changes not being guaranteed to be detected by children, depending on factors\n        // like shouldComponentUpdate methods on intermediate nodes, etc.\n        // Fortunately press handlers are pretty stable.\n        if (this._isButton(this.props)) {\n            // This instance can be a responder. It may or may not have to invoke an onContextMenu handler, but\n            // it will consume all corresponding touch events, so overwriting any parent-set value is the correct thing to do.\n            childContext.isRxParentAContextMenuResponder = !!this.props.onContextMenu;\n        }\n\n        if (this.props.tabIndex !== undefined) {\n            // This button will hide other \"accessible focusable\" controls as part of being restricted/limited by a focus manager\n            childContext.isRxParentAFocusableInSameFocusManager = true;\n        }\n\n        return childContext;\n    }\n\n    private _isHidden(): boolean {\n        return !!this._popupContainer && this._popupContainer.isHidden();\n    }\n\n    setFocusRestricted(restricted: boolean) {\n        if (!this._focusManager || !this.props.restrictFocusWithin) {\n            console.error('View: setFocusRestricted method requires restrictFocusWithin property to be set');\n            return;\n        }\n\n        if (!this._isHidden()) {\n            if (restricted) {\n                this._focusManager.restrictFocusWithin(RestrictFocusType.RestrictedFocusFirst);\n            } else {\n                this._focusManager.removeFocusRestriction();\n            }\n        }\n        this._isFocusRestricted = restricted;\n    }\n\n    setFocusLimited(limited: boolean) {\n        if (!this._focusManager || !this._limitFocusWithin) {\n            console.error('View: setFocusLimited method requires limitFocusWithin property to be set');\n            return;\n        }\n\n        if (!this._isHidden()) {\n            if (limited && !this._isFocusLimited) {\n                this._focusManager.limitFocusWithin(this.props.limitFocusWithin!);\n            } else if (!limited && this._isFocusLimited) {\n                this._focusManager.removeFocusLimitation();\n            }\n        }\n        this._isFocusLimited = limited;\n    }\n\n    private _focusRestrictionCallback(restricted: RestrictFocusType) {\n        // Complementary mechanism to ensure focus cannot get out (through tabbing) of this view\n        // when restriction is enabled.\n        // This covers cases where outside the view focusable controls are not controlled and/or not controllable\n        // by FocusManager\n        const viewProps: RNW.ViewProps = {\n            tabNavigation: restricted !== RestrictFocusType.Unrestricted ? 'cycle' : 'local',\n        };\n        this.setNativeProps(viewProps);\n    }\n\n    setNativeProps(nativeProps: RN.ViewProps & RNW.ViewProps) {\n        // Redirect to focusable component if present.\n        if (this._focusableElement) {\n            this._focusableElement.setNativeProps(nativeProps);\n        } else {\n            super.setNativeProps(nativeProps);\n        }\n    }\n\n    protected _isButton(viewProps: Types.ViewProps): boolean {\n        return super._isButton(viewProps) || !!viewProps.onContextMenu;\n    }\n\n    private _onFocusableKeyDown = (e: React.SyntheticEvent<any>): void => {\n\n        const keyEvent = EventHelpers.toKeyboardEvent(e);\n        if (this.props.onKeyPress) {\n            this.props.onKeyPress(keyEvent);\n        }\n\n        if (this.props.onPress) {\n            const key = keyEvent.keyCode;\n            // ENTER triggers press on key down\n            if (key === KEY_CODE_ENTER) {\n                this.props.onPress(keyEvent);\n            }\n        }\n\n        if (this.props.onContextMenu) {\n            const key = keyEvent.keyCode;\n            if ((key === KEY_CODE_APP) || (key === KEY_CODE_F10 && keyEvent.shiftKey)) {\n                this._showContextMenu(keyEvent);\n            }\n        }\n    };\n\n    private _onFocusableKeyUp = (e: React.SyntheticEvent<any>): void => {\n        const keyEvent = EventHelpers.toKeyboardEvent(e);\n        if (keyEvent.keyCode === KEY_CODE_SPACE) {\n            if (this.props.onPress) {\n                this.props.onPress(keyEvent);\n            }\n        }\n    };\n\n    private _onFocus = (e: React.SyntheticEvent<any>): void => {\n        if (e.currentTarget === e.target) {\n            this.onFocus();\n        }\n\n        if (this.props.onFocus) {\n            this.props.onFocus(EventHelpers.toFocusEvent(e));\n        }\n    };\n\n    private _onBlur = (e: React.SyntheticEvent<any>): void => {\n        if (this.props.onBlur) {\n            this.props.onBlur(EventHelpers.toFocusEvent(e));\n        }\n    };\n\n    // From FocusManagerFocusableComponent interface\n    //\n    onFocus() {\n        // Focus Manager hook\n    }\n\n    getTabIndex(): number | undefined {\n        // Focus Manager may override this\n        return this.props.tabIndex;\n    }\n\n    getImportantForAccessibility(): ImportantForAccessibilityValue | undefined {\n        // Focus Manager may override this\n\n        // Use a default of Auto if the computed value is undefined\n        return this._internalProps.importantForAccessibility ||\n            AccessibilityUtil.importantForAccessibilityToString(Types.ImportantForAccessibility.Auto);\n    }\n\n    updateNativeAccessibilityProps(): void {\n        if (this._focusableElement) {\n            const tabIndex: number = this.getTabIndex() || 0;\n            const windowsTabFocusable: boolean = tabIndex >= 0;\n            const importantForAccessibility: ImportantForAccessibilityValue | undefined = this.getImportantForAccessibility();\n\n            this._focusableElement.setNativeProps({\n                tabIndex: tabIndex,\n                isTabStop: windowsTabFocusable,\n                importantForAccessibility: importantForAccessibility,\n            });\n        }\n    }\n}\n\n// A value for tabIndex marks a View as being potentially keyboard/screen reader focusable\napplyFocusableComponentMixin(View, function(this: View, nextProps?: Types.ViewProps) {\n    const tabIndex = nextProps && ('tabIndex' in nextProps) ? nextProps.tabIndex : this.props.tabIndex;\n    return tabIndex !== undefined;\n});\n\nexport default View;\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"forceConsistentCasingInFileNames\": true,\n        \"strictPropertyInitialization\": true,\n        \"experimentalDecorators\": true,\n        \"noImplicitReturns\": true,\n        \"strictNullChecks\": true,\n        \"noImplicitThis\": true,\n        \"noUnusedLocals\": true,\n        \"noImplicitAny\": true,\n        \"skipLibCheck\": true,\n        \"declaration\": true,\n        \"noResolve\": false,\n        \"target\": \"es5\",\n        \"module\": \"commonjs\",\n        \"outDir\": \"dist\",\n        \"types\": [\"lodash\", \"react\", \"react-dom\", \"react-native\"],\n        \"jsx\": \"react\",\n        \"lib\": [\"es2015.promise\", \"es2018.promise\", \"es5\", \"dom\"]\n    },\n\n    \"include\": [\n        \"src/**/*\"\n    ],\n\n    \"exclude\": [\n        \"node_modules\",\n        \"extensions\",\n        \"samples\",\n        \"dist\"\n    ]\n}\n"
  }
]