[
  {
    "path": ".gitignore",
    "content": "# Built application files\n*.apk\n*.aar\n*.ap_\n*.aab\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\n#  Uncomment the following line in case you need and you don't have the release build type files in your app\n# release/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# IntelliJ\n*.iml\n.idea/workspace.xml\n.idea/tasks.xml\n.idea/gradle.xml\n.idea/assetWizardSettings.xml\n.idea/dictionaries\n.idea/libraries\n# Android Studio 3 in .gitignore file.\n.idea/caches\n.idea/modules.xml\n# Comment next line if keeping position of elements in Navigation Editor is relevant for you\n.idea/navEditor.xml\n\n# Keystore files\n# Uncomment the following lines if you do not want to check your keystore files in.\n#*.jks\n#*.keystore\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n.cxx/\n\n# Google Services (e.g. APIs or Firebase)\n# google-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n\n# fastlane\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\nfastlane/readme.md\n\n# Version control\nvcs.xml\n\n# lint\nlint/intermediates/\nlint/generated/\nlint/outputs/\nlint/tmp/\n# lint/reports/\n"
  },
  {
    "path": ".idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": ".idea/.name",
    "content": "My Application"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"1.8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <remote-repository>\n      <option name=\"id\" value=\"central\" />\n      <option name=\"name\" value=\"Maven Central repository\" />\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"jboss.community\" />\n      <option name=\"name\" value=\"JBoss Community repository\" />\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"BintrayJCenter\" />\n      <option name=\"name\" value=\"BintrayJCenter\" />\n      <option name=\"url\" value=\"https://jcenter.bintray.com/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"Google\" />\n      <option name=\"name\" value=\"Google\" />\n      <option name=\"url\" value=\"https://dl.google.com/dl/android/maven2/\" />\n    </remote-repository>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_8\" default=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\n.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations."
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Feeling Awesome! Thanks for thinking about this.\n\nYou can contribute us by filing issues, bugs and PRs. You can also take a look at active issues and fix them.\n\nIf you want to discuss on something then feel free to present your opinions, views or any other relevant comment on [discussions](https://github.com/devrath/DroidAndroidKotlinWiki/discussions).\n\n### Code contribution\n\n- Open issue regarding proposed change.\n- If your proposed change is approved, Fork this repo and do changes.\n- Open PR against latest *development* branch. Add nice description in PR.\n- You're done!\n\n### How to Contribute\n- Fork it\n- Create your feature branch (git checkout -b my-new-feature)\n- Commit your changes (git commit -am 'Add some feature')\n- Push to the branch (git push origin my-new-feature)\n- Create new Pull Request\n\n### Code contribution checklist\n\n- New code addition/deletion should not break existing flow of a system.\n- All tests should be passed.\n- Verify `./gradlew build` is passing before raising a PR.\n- Reformat code with Spotless `./gradlew spotlessApply` before raising a PR.\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\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"
  },
  {
    "path": "README.md",
    "content": "<h1 align=\"center\">𝙺𝚘𝚝𝚕𝚒𝚗𝙰𝚕𝚌𝚑𝚎𝚖𝚢</h1>\n\n<div align=\"center\">\n\n![840cee8b164c10b](https://github.com/devrath/KotlinAlchemy/assets/1456191/cc6f0f21-c092-44e3-b7bb-1897be6452af)\n\n</div>\n\n<div align=\"center\">\n\n⚗️ 𝚃𝚑𝚒𝚜 𝚙𝚛𝚘𝚓𝚎𝚌𝚝 𝚌𝚘𝚗𝚝𝚊𝚒𝚗𝚜 𝚟𝚊𝚛𝚒𝚘𝚞𝚜 𝚌𝚘𝚗𝚌𝚎𝚙𝚝𝚜 𝚊𝚗𝚍 𝚕𝚎𝚊𝚛𝚗𝚒𝚗𝚐𝚜 𝚘𝚏 𝚔𝚘𝚝𝚕𝚒𝚗 𝚞𝚜𝚎𝚍 𝚏𝚘𝚛 𝚊𝚗𝚍𝚛𝚘𝚒𝚍 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚖𝚎𝚗𝚝\n\n</div>\n\n<div align=\"center\">\n\n| `𝙲𝙾𝙽𝚃𝙴𝙽𝚃𝚂` |\n| ---------- |\n| [`𝙺𝚘𝚝𝚕𝚒𝚗 𝙱𝚊𝚜𝚒𝚌 𝙵𝚞𝚗𝚍𝚊𝚖𝚎𝚗𝚝𝚊𝚕𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basic-Fundamentals) |\n| [`𝙺𝚘𝚝𝚕𝚒𝚗 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗𝚜`](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#kotlin-collection-functions)\n| [`𝙺𝚘𝚝𝚕𝚒𝚗 𝙿𝚘𝚠𝚎𝚛𝚜`](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#kotlin-powers) |\n| [`𝙺𝚘𝚝𝚕𝚒𝚗 𝙲𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#kotlin-coroutines) |\n\n</div>\n\n# `Kotlin Basic Fundamentals`\n\n<div align=\"center\">\n \n![Android-discountinuing-kotlin-synthetics-for-views-header](https://github.com/devrath/KotlinAlchemy/assets/1456191/ea264b24-ae7d-499c-ba2a-b07c9cb2e589)\n\n</div>\n\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚅𝙰𝙻 𝚊𝚗𝚍 𝚅𝙰𝚁 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-val-and-var-in-Kotlin)\n* [**`𝚄𝚜𝚒𝚗𝚐 (𝚅𝙰𝙻) 𝚊𝚗𝚍 (𝙲𝙾𝙽𝚂𝚃 𝚅𝙰𝙻) 𝚒𝚗 𝙺𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-(val)-and-(const-val)-in-Kotlin)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚂𝚝𝚛𝚒𝚗𝚐𝚜 𝚒𝚗 𝙺𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics-:-Strings)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚌𝚘𝚖𝚙𝚊𝚛𝚒𝚜𝚘𝚗 𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics-:-Comparison-Operators)\n* [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚝𝚑𝚎 𝚜𝚌𝚘𝚙𝚎 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics-:-Using-Scopes-in-kotlin)\n* [**`𝙻𝚊𝚛𝚐𝚎 𝚝𝚛𝚎𝚎 𝚘𝚏 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics:-Large-tree-of-condition-statements)\n* [**`𝙳𝚎𝚏𝚒𝚗𝚒𝚗𝚐 𝚊𝚗𝚍 𝚞𝚜𝚒𝚗𝚐 𝙽𝚞𝚕𝚕𝚊𝚋𝚕𝚎 𝚟𝚊𝚕𝚞𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics:-Defining-and-using-Nullable-values)\n* [**`𝚆𝚑𝚊𝚝 𝚊𝚛𝚎 𝚙𝚊𝚒𝚛𝚜 𝚊𝚗𝚍 𝚝𝚛𝚒𝚙𝚕𝚎𝚝𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Basics-:-What-are-pairs-and-triplets)\n* [**`𝙼𝚎𝚖𝚋𝚎𝚛 𝚁𝚎𝚏𝚎𝚛𝚎𝚗𝚌𝚎 𝚒𝚗 𝙺𝚘𝚝𝚕𝚒𝚗: 𝚄𝚜𝚒𝚗𝚐 (::) 𝙾𝚙𝚎𝚛𝚊𝚝𝚘𝚛`**](https://github.com/devrath/KotlinAlchemy/wiki/Member-Reference-in-Kotlin:-Using-(::)-Operator)\n* [**`𝚆𝚑𝚊𝚝 𝚊𝚛𝚎 𝚝𝚑𝚎 𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚌𝚎𝚜 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚊𝚗 𝙴𝚚𝚞𝚊𝚕𝚒𝚝𝚢 𝙾𝚙𝚎𝚛𝚊𝚝𝚘𝚛 𝚊𝚗𝚍 𝚊 𝚁𝚎𝚏𝚎𝚛𝚎𝚗𝚝𝚒𝚊𝚕 𝙴𝚚𝚞𝚊𝚕𝚒𝚝𝚢 𝙾𝚙𝚎𝚛𝚊𝚝𝚘𝚛?`**](https://github.com/devrath/KotlinAlchemy/wiki/What-are-the-difference-between-Equality-Operator-and-Referential-Equality-Operator)\n* [**`𝙻𝚘𝚘𝚙𝚒𝚗𝚐 𝚖𝚎𝚌𝚑𝚊𝚗𝚒𝚜𝚖𝚜 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Looping-mechanisms)\n* [**`𝙲𝚞𝚜𝚝𝚘𝚖 𝙰𝚌𝚌𝚎𝚜𝚜𝚘𝚛𝚜 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Custom-Accessors)\n* [**`𝙴𝚗𝚞𝚖 𝚒𝚗 𝙺𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Enum-in-Kotlin)\n* **Classes and Interfaces**\n  * [**`𝙲𝚕𝚊𝚜𝚜𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Fundamentals:-Classes)\n  * [**`𝙸𝚗𝚑𝚎𝚛𝚒𝚝𝚊𝚗𝚌𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Fundamentals:-Inheritance)\n* **Kotlin Basic collections**\n  * [**`𝚄𝚜𝚒𝚗𝚐 𝚊𝚛𝚛𝚊𝚢𝚜 𝚒𝚗 𝚝𝚑𝚎 𝚌𝚘𝚍𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Using-arrays-in-the-code)\n  * [**`𝚄𝚜𝚒𝚗𝚐 𝚕𝚒𝚜𝚝 𝚒𝚗 𝚝𝚑𝚎 𝚌𝚘𝚍𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Using-list-in-the-code)\n  * [**`𝚄𝚜𝚒𝚗𝚐 𝙼𝚊𝚙 𝚒𝚗 𝚝𝚑𝚎 𝚌𝚘𝚍𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-basics-:-Using-Map-in-the-code)\n  * [**`𝚄𝚜𝚒𝚗𝚐 𝚂𝚎𝚝 𝚒𝚗 𝚝𝚑𝚎 𝚌𝚘𝚍𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/kotlin-basics-:-Using-Set-in-the-code)\n\n# `Kotlin Collection Functions`\n\n<div align=\"center\">\n\n  <img src=\"https://github.com/devrath/KotlinAlchemy/assets/1456191/e8da4540-39e3-4ca3-abab-b0c3ecbedea0\" \n       alt=\"collection\"\n       width=\"450\"\n       height=\"300\">\n\n</div>\n\n<div align=\"center\">\n \n| `Operation` | `Operators`                                                  |\n| ----------- | ------------------------------------------------------------ |\n| [`Removing Duplicates`](https://github.com/devrath/KotlinAlchemy/wiki/Collections:-Removing-duplicates) | `distinct` , `toSet` . `toMutableSet`, `toHashSet` |\n| [`Combining a list of items to a string`](https://github.com/devrath/KotlinAlchemy/wiki/Collections:-Converting--a-list-array-to-string) | `joinToString` |\n| [`Transform a collection into a single result`](https://github.com/devrath/KotlinAlchemy/wiki/Collections:-Transform-a-collection-into-a-single-result) | `reduce` |\n| [`Find if all elements are satisfying a particular condition`](https://github.com/devrath/KotlinAlchemy/wiki/Collection:-Find-if-all-elements-are-satisfying-a-particular-condition) | `all` |\n| [`Find a particular element based on a certain condition`](https://github.com/devrath/KotlinAlchemy/wiki/Collection:-Find-a-particular-element-based-on-a-certain-condition) | `single`,`all` |\n| [`Break the list of items to sub‐chunks of items`](https://github.com/devrath/KotlinAlchemy/wiki/Collections:-Break-the-list-of-items-to-sub%E2%80%90chunks-of-items) | `chunked` |\n| [`Associating the data using some key`](https://github.com/devrath/KotlinAlchemy/wiki/Collections:-Associating-the-data-using-some-key) | `AssociateBy` |\n| [`Using the Intersection and Union`](https://github.com/devrath/KotlinAlchemy/wiki/Collection:-Intersection-&-Union) | `union`,`intersect` |\n| [`Sorting a collection of objects based on a parameter in the object`](https://github.com/devrath/KotlinAlchemy/wiki/Collection:-Sorting-a-collection-of-objects-based-on-a-parameter-in-the-object) | `sortBy` |\n\n</div>      \n\n  \n# `Kotlin Powers`\n<div align=\"center\">\n\n  <img src=\"https://github.com/devrath/KotlinAlchemy/assets/1456191/629a6f77-5853-418c-8aa9-360df6f957bd\" \n       alt=\"kotlin  powers\"\n       width=\"450\"\n       height=\"270\">\n\n</div>\n\n<div align=\"center\">\n\n| `🪴` | `🍀`                                | `🌿`                                  |\n| ---------- | --------------------------------------------- | --------------------------------------------- |\n| [`𝙺𝚘𝚝𝚕𝚒𝚗 𝚂𝚌𝚘𝚙𝚎 𝙵𝚞𝚗𝚌𝚝𝚒𝚘𝚗𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-scope-functions) | [`𝙺𝚘𝚝𝚕𝚒𝚗: 𝙲𝚕𝚊𝚜𝚜 𝚟𝚜 𝙳𝚊𝚝𝚊𝙲𝚕𝚊𝚜𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin:-Class-vs-DataClass) | [`𝚂𝚎𝚊𝚕𝚎𝚍 𝚌𝚕𝚊𝚜𝚜𝚎𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Sealed-Class) |\n| [`𝙷𝚒𝚐𝚑𝚎𝚛-𝚘𝚛𝚍𝚎𝚛 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Higher-order-functions) | [`𝙺𝚘𝚝𝚕𝚒𝚗 𝙾𝚋𝚓𝚎𝚌𝚝`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Object) | [`𝙺𝚘𝚝𝚕𝚒𝚗 𝙲𝚘𝚖𝚙𝚊𝚗𝚒𝚘𝚗 𝙾𝚋𝚓𝚎𝚌𝚝`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Companion-Object) |\n| [`𝙰𝚗𝚗𝚘𝚝𝚊𝚝𝚒𝚘𝚗𝚜 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`](https://github.com/devrath/KotlinAlchemy/wiki/Annotations-in-kotlin) | [`𝚃𝚢𝚙𝚎 𝙰𝚕𝚒𝚊𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin:-Type-Alias) | [`𝙸𝚗𝚕𝚒𝚗𝚎 𝙵𝚞𝚗𝚌𝚝𝚒𝚘𝚗`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin:-Inline-Functions) |\n| [`𝚂𝚖𝚊𝚛𝚝 𝙲𝚊𝚜𝚝𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin:-Smart-Casts) | [`𝙽𝚎𝚜𝚝𝚎𝚍 𝚌𝚕𝚊𝚜𝚜 𝚟𝚜 𝙸𝚗𝚗𝚎𝚛 𝚌𝚕𝚊𝚜𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Nested-class-vs-Inner-class) | [`𝚂𝚎𝚊𝚕𝚎𝚍 𝙲𝚕𝚊𝚜𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Sealed-Class) |\n| [`𝙰𝚗𝚗𝚘𝚝𝚊𝚝𝚒𝚘𝚗𝚜 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`](https://github.com/devrath/KotlinAlchemy/wiki/Annotations-in-kotlin) | [`𝙶𝚎𝚗𝚎𝚛𝚒𝚌𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Generics)                                            | [`𝚁𝚎𝚒𝚏𝚒𝚎𝚍`](https://github.com/devrath/KotlinAlchemy/wiki/Reified)                                              |\n| [`𝙲𝚛𝚘𝚜𝚜𝚕𝚒𝚗𝚎 𝚖𝚘𝚍𝚒𝚏𝚒𝚎𝚛`](https://github.com/devrath/KotlinAlchemy/wiki/Crossline-modifier) | [ `𝚍𝚎𝚕𝚎𝚐𝚊𝚝𝚒𝚘𝚗 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗` ](https://github.com/devrath/KotlinAlchemy/wiki/what-is-delegation-in-kotlin)  | [`𝚂𝚎𝚚𝚞𝚎𝚗𝚌𝚎𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Sequences-in-kotlin) |\n| [`noinline`](https://github.com/devrath/KotlinAlchemy/wiki/noinline) | [`𝚆𝚑𝚊𝚝 𝚊𝚛𝚎 𝚎𝚡𝚝𝚎𝚗𝚜𝚒𝚘𝚗 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗𝚜?`](https://github.com/devrath/KotlinAlchemy/wiki/What-are-extension-functions)  | [`𝚂𝚎𝚊𝚕𝚎𝚍 𝙸𝚗𝚝𝚎𝚛𝚏𝚊𝚌𝚎`](https://github.com/devrath/KotlinAlchemy/wiki/sealed-interface) |\n| [`𝙺𝚘𝚝𝚕𝚒𝚗: 𝙾𝚋𝚓𝚎𝚌𝚝 𝙲𝚕𝚊𝚜𝚜 𝚟𝚜 𝙳𝚊𝚝𝚊 𝙾𝚋𝚓𝚎𝚌𝚝 𝙲𝚕𝚊𝚜𝚜`](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin:-Object-Class-vs-Data-Object-Class) |  |  |\n\n</div>\n\n\n# `Kotlin Coroutines`\n<p align=\"center\">\n<img src=\"documentation/images/coroutines.png\" height=\"200\" />\n</p>\n\n<div align=\"center\">\n\n| `Contents` |\n| ---------- |\n| [𝙵𝚞𝚗𝚍𝚊𝚖𝚎𝚗𝚝𝚊𝚕 𝚌𝚘𝚗𝚌𝚎𝚙𝚝𝚜 𝚘𝚏 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#%F0%9D%99%B5%F0%9D%9A%9E%F0%9D%9A%97%F0%9D%9A%8D%F0%9D%9A%8A%F0%9D%9A%96%F0%9D%9A%8E%F0%9D%9A%97%F0%9D%9A%9D%F0%9D%9A%8A%F0%9D%9A%95-%F0%9D%9A%8C%F0%9D%9A%98%F0%9D%9A%97%F0%9D%9A%8C%F0%9D%9A%8E%F0%9D%9A%99%F0%9D%9A%9D%F0%9D%9A%9C-%F0%9D%9A%98%F0%9D%9A%8F-%F0%9D%9A%8C%F0%9D%9A%98%F0%9D%9A%9B%F0%9D%9A%98%F0%9D%9A%9E%F0%9D%9A%9D%F0%9D%9A%92%F0%9D%9A%97%F0%9D%9A%8E%F0%9D%9A%9C) |\n| [𝙲𝚘𝚖𝚖𝚞𝚗𝚒𝚌𝚊𝚝𝚒𝚗𝚐 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚌𝚘-𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#%F0%9D%99%B2%F0%9D%9A%98%F0%9D%9A%96%F0%9D%9A%96%F0%9D%9A%9E%F0%9D%9A%97%F0%9D%9A%92%F0%9D%9A%8C%F0%9D%9A%8A%F0%9D%9A%9D%F0%9D%9A%92%F0%9D%9A%97%F0%9D%9A%90-%F0%9D%9A%8B%F0%9D%9A%8E%F0%9D%9A%9D%F0%9D%9A%A0%F0%9D%9A%8E%F0%9D%9A%8E%F0%9D%9A%97-%F0%9D%9A%8C%F0%9D%9A%98-%F0%9D%9A%9B%F0%9D%9A%98%F0%9D%9A%9E%F0%9D%9A%9D%F0%9D%9A%92%F0%9D%9A%97%F0%9D%9A%8E%F0%9D%9A%9C) |\n| [𝙶𝚒𝚜𝚝 𝚎𝚡𝚊𝚖𝚙𝚕𝚎𝚜 𝚘𝚏 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚒𝚗 𝚊𝚌𝚝𝚒𝚘𝚗](https://github.com/devrath/KotlinAlchemy/blob/main/README.md#%F0%9D%99%B6%F0%9D%9A%92%F0%9D%9A%9C%F0%9D%9A%9D-%F0%9D%9A%8E%F0%9D%9A%A1%F0%9D%9A%8A%F0%9D%9A%96%F0%9D%9A%99%F0%9D%9A%95%F0%9D%9A%8E%F0%9D%9A%9C-%F0%9D%9A%98%F0%9D%9A%8F-%F0%9D%9A%8C%F0%9D%9A%98%F0%9D%9A%9B%F0%9D%9A%98%F0%9D%9A%9E%F0%9D%9A%9D%F0%9D%9A%92%F0%9D%9A%97%F0%9D%9A%8E%F0%9D%9A%9C-%F0%9D%9A%92%F0%9D%9A%97-%F0%9D%9A%8A%F0%9D%9A%8C%F0%9D%9A%9D%F0%9D%9A%92%F0%9D%9A%98%F0%9D%9A%97) |\n| [𝙳𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚌𝚎 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝙻𝚒𝚟𝚎𝙳𝚊𝚝𝚊, 𝚂𝚝𝚊𝚝𝚎𝙵𝚕𝚘𝚠, 𝙵𝚕𝚘𝚠, 𝚂𝚑𝚊𝚛𝚎𝚍𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/Difference-between-LiveData,-StateFlow,-Flow,-SharedFlow) |\n| [𝙲𝚑𝚊𝚗𝚗𝚎𝚕𝚜 𝚊𝚗𝚍 𝙵𝚕𝚘𝚠𝚜 - 𝚆𝚑𝚎𝚗 𝚝𝚘 𝚞𝚜𝚎 𝚎𝚊𝚌𝚑 𝚘𝚏 𝚝𝚑𝚎𝚖](https://github.com/devrath/KotlinAlchemy/wiki/Channels-and-Flows-%E2%80%90-When-to-use-each-of-them) |\n\n\n</div>\n\n#### `𝙵𝚞𝚗𝚍𝚊𝚖𝚎𝚗𝚝𝚊𝚕 𝚌𝚘𝚗𝚌𝚎𝚙𝚝𝚜 𝚘𝚏 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`\n* [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚌𝚘𝚗𝚌𝚞𝚛𝚛𝚎𝚗𝚌𝚢`**](https://github.com/devrath/KotlinAlchemy/wiki/What-is-concurrency)\n* [**`𝙱𝚕𝚘𝚌𝚔𝚒𝚗𝚐 𝚟𝚜 𝚂𝚞𝚜𝚙𝚎𝚗𝚍𝚒𝚗𝚐`**](https://github.com/devrath/KotlinAlchemy/wiki/Blocking-function-vs-Suspending-function)\n* About asynchronous code, suspending code, co-routines\n  * [**`𝙷𝚘𝚠 𝚊𝚜𝚢𝚗𝚌𝚑𝚛𝚘𝚗𝚘𝚞𝚜 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/How-asynchronous-programming-works)\n  * [**`𝙷𝚘𝚠 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚙𝚛𝚘𝚐𝚛𝚊𝚖𝚖𝚒𝚗𝚐 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/How-coroutines-programming-works)\n  * [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚊 𝚌𝚘-𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚊𝚗𝚍 𝙷𝚘𝚠 𝚒𝚝 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/What-is-Coroutine-and-How-it-works)\n  * [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚜𝚞𝚜𝚙𝚎𝚗𝚍𝚒𝚗𝚐 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗 𝚊𝚗𝚍 𝚑𝚘𝚠 𝚒𝚝 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/What-is-suspending-function-and-how-it-works)\n  * [**`𝙲𝚘𝚖𝚙𝚊𝚛𝚒𝚗𝚐 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚟𝚜 𝚜𝚞𝚜𝚙𝚎𝚗𝚍 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Comparing-coroutine-vs-suspend-function)\n* Context and Scope\n  * [**`𝙳𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚌𝚎 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚕𝚊𝚞𝚗𝚌𝚑 𝚊𝚗𝚍 𝚠𝚒𝚝𝚑𝙲𝚘𝚗𝚝𝚎𝚡𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Difference-between-launch--and--withContext)\n  * [**`𝚁𝚎𝚕𝚊𝚝𝚒𝚘𝚗𝚜𝚑𝚒𝚙 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚜𝚌𝚘𝚙𝚎 𝚊𝚗𝚍 𝚌𝚘𝚗𝚝𝚎𝚡𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Relationship-between-Scope-and-Context)\n  * [**`𝚄𝚗𝚍𝚎𝚛𝚜𝚝𝚊𝚗𝚍𝚒𝚗𝚐 𝚟𝚒𝚎𝚠-𝚖𝚘𝚍𝚎𝚕 𝚜𝚌𝚘𝚙𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Understanding-ViewModel-Scope)\n* [**`𝙷𝚘𝚠 𝚊𝚜𝚢𝚗𝚌/𝚊𝚠𝚊𝚒𝚝 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/How-async-await-works)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚓𝚘𝚒𝚗 𝚒𝚗 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-join-in-coroutines)\n* Dispatchers\n  * [**`𝙳𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝 𝚝𝚢𝚙𝚎𝚜 𝚘𝚏 𝚍𝚒𝚜𝚙𝚊𝚝𝚌𝚑𝚎𝚛𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Types-of-dispatchers)\n  * [**`𝚂𝚝𝚛𝚊𝚝𝚎𝚐𝚒𝚎𝚜 𝚏𝚘𝚛 𝚞𝚜𝚒𝚗𝚐 𝚝𝚑𝚎 𝚍𝚒𝚜𝚙𝚊𝚝𝚌𝚑𝚎𝚛𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Strategies-for-using-the-dispatchers)\n  * [**`𝙳𝚒𝚜𝚙𝚊𝚝𝚌𝚑𝚎𝚛𝚜 𝚁𝚞𝚗𝚗𝚒𝚗𝚐 𝚘𝚗 𝚝𝚑𝚛𝚎𝚊𝚍 𝚍𝚎𝚖𝚘`**](https://github.com/devrath/KotlinAlchemy/wiki/Dispatchers-Running-on-thread-demo)\n* Using coroutines sample use cases\n  * [**`𝙲𝚛𝚎𝚊𝚝𝚒𝚗𝚐 𝚊 𝚜𝚒𝚖𝚙𝚕𝚎 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚌𝚘𝚗𝚝𝚎𝚡𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Creating-a-simple-coroutine-context)\n  * [**`𝚆𝚊𝚒𝚝 𝚏𝚘𝚛 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚝𝚘 𝚏𝚒𝚗𝚒𝚜𝚑`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Wait-for-coroutine-to-finish)\n  * [**`𝚂𝚎𝚚𝚞𝚎𝚗𝚝𝚒𝚊𝚕 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚎𝚡𝚎𝚌𝚞𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Coroutines:-Sequential-coroutines-execution) \n* Cancelling the coroutines\n  * [**`𝙱𝚕𝚘𝚌𝚔 𝙳𝚒𝚊𝚐𝚛𝚊𝚖 𝚘𝚏 𝚌𝚊𝚗𝚌𝚎𝚕𝚕𝚊𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Block-Diagram-of-cancellation)\n * [**`𝚂𝚒𝚐𝚗𝚒𝚏𝚒𝚌𝚊𝚗𝚌𝚎 𝚘𝚏 𝚎𝚗𝚜𝚞𝚛𝚎 𝚊𝚌𝚝𝚒𝚟𝚎 𝚌𝚘‐𝚘𝚙𝚎𝚛𝚊𝚝𝚒𝚟𝚎 𝚌𝚊𝚗𝚌𝚎𝚕𝚕𝚊𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Significance-of-ensureActive-co%E2%80%90operative-cancellation)\n  * [**`𝚄𝚜𝚒𝚗𝚐 𝙸𝚜𝙰𝚌𝚝𝚒𝚟𝚎 𝚏𝚘𝚛 𝚌𝚘‐𝚘𝚙𝚎𝚛𝚊𝚝𝚒𝚟𝚎 𝚌𝚊𝚗𝚌𝚎𝚕𝚕𝚊𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-IsActive-for-co%E2%80%90operative-cancellation)\n  * [**`𝙲𝚊𝚗𝚌𝚎𝚕𝚕𝚒𝚗𝚐 𝙲𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚅𝚜 𝙲𝚊𝚗𝚌𝚎𝚕𝚕𝚒𝚗𝚐 𝙲𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚌𝚑𝚒𝚕𝚍𝚛𝚎𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/Cancelling-Coroutine-Vs-Cancelling-Coroutines-children)\n  * [**`𝙽𝚘𝚗-𝚌𝚊𝚗𝚌𝚎𝚕𝚕𝚊𝚋𝚕𝚎 𝚓𝚘𝚋`**](https://github.com/devrath/KotlinAlchemy/wiki/Non-Cancellable-job)\n* Structured Concurrency\n  * [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚂𝚝𝚛𝚞𝚌𝚝𝚞𝚛𝚎𝚍 𝚌𝚘𝚗𝚌𝚞𝚛𝚛𝚎𝚗𝚌𝚢?`**](https://github.com/devrath/KotlinAlchemy/wiki/What-is-Structured-concurrency)\n* Jobs\n  * [**`𝙷𝚘𝚠 𝚓𝚘𝚋 𝚒𝚗 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚠𝚘𝚛𝚔𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/How-Job-in-coroutine-works)\n  * [**`𝙹𝚘𝚋-𝙷𝚒𝚎𝚛𝚊𝚛𝚌𝚑𝚢`**](https://github.com/devrath/KotlinAlchemy/wiki/Job%E2%80%90Hierarchy)\n* Parallel Decomposition\n  * [**`𝙰𝚋𝚘𝚞𝚝 𝚙𝚊𝚛𝚊𝚕𝚕𝚎𝚕 𝚍𝚎𝚌𝚘𝚖𝚙𝚘𝚜𝚒𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/About-parallel-decomposition)\n  * [**`𝙰𝚋𝚘𝚞𝚝 𝙰𝚜𝚢𝚗𝚌 𝚊𝚗𝚍 𝙰𝚠𝚊𝚒𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/About-Async-and-Await)\n  * [**`𝙺𝚘𝚝𝚕𝚒𝚗 𝙲𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚓𝚘𝚒𝚗 𝚟𝚜 𝚊𝚠𝚊𝚒𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Kotlin-Coroutines-join-vs-await)\n* Exception Handling\n  * [**`𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗 𝚑𝚊𝚗𝚍𝚕𝚒𝚗𝚐 𝚒𝚗 𝚕𝚊𝚞𝚗𝚌𝚑`**](https://github.com/devrath/KotlinAlchemy/wiki/Exception-handling-in-launch)\n  * [**`𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗 𝚑𝚊𝚗𝚍𝚕𝚒𝚗𝚐 𝚒𝚗 𝚊𝚜𝚢𝚗𝚌`**](https://github.com/devrath/KotlinAlchemy/wiki/Exception-handling-in-async)\n* [**`𝚂𝚞𝚙𝚎𝚛𝚟𝚒𝚜𝚘𝚛 𝚂𝚌𝚘𝚙𝚎 𝚊𝚗𝚍 𝚂𝚞𝚙𝚎𝚛𝚟𝚒𝚜𝚘𝚛 𝙹𝚘𝚋 𝚒𝚗 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Supervisor-Scope-and-Supervisor-Job-in-coroutines)\n* [**`𝚆𝚑𝚊𝚝 𝚒𝚜 𝚝𝚊𝚒𝚕𝚛𝚎𝚌 𝚒𝚗 𝚔𝚘𝚝𝚕𝚒𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/What-is-tailrec-in-kotlin)\n\n#### `𝙲𝚘𝚖𝚖𝚞𝚗𝚒𝚌𝚊𝚝𝚒𝚗𝚐 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚌𝚘-𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`\n* [𝙰𝚋𝚘𝚞𝚝 𝙲𝚘𝚖𝚖𝚞𝚗𝚒𝚌𝚊𝚝𝚒𝚗𝚐 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚝𝚑𝚎 𝚌𝚘‐𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜](https://github.com/devrath/KotlinAlchemy/wiki/About-Communicating-between-the-co%E2%80%90routines)\n* Kotlin flow\n   * [𝙰𝚋𝚘𝚞𝚝 𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/About-Flow)\n   * [𝙵𝚕𝚘𝚠 𝙱𝚞𝚒𝚕𝚍𝚎𝚛𝚜](https://github.com/devrath/KotlinAlchemy/wiki/KotlinFlow:-Flow-Builders)\n   * [𝙵𝚕𝚘𝚠 𝙲𝚘𝚗𝚝𝚎𝚡𝚝](https://github.com/devrath/KotlinAlchemy/wiki/Flow-Context)\n   * Composing and Flattening Flows\n     * [𝙰𝚋𝚘𝚞𝚝 𝚌𝚘𝚖𝚙𝚘𝚜𝚒𝚗𝚐 𝚊𝚗𝚍 𝚏𝚕𝚊𝚝𝚝𝚎𝚗𝚒𝚗𝚐 𝚏𝚕𝚘𝚠𝚜](https://github.com/devrath/KotlinAlchemy/wiki/About-composing-and-flattening-flows)\n     * Composing\n       * [𝙱𝚞𝚏𝚏𝚎𝚛𝚒𝚗𝚐](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Buffering)\n       * [𝙲𝚘𝚗𝚏𝚕𝚊𝚝𝚒𝚘𝚗](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Conflation)\n       * [𝙲𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚗𝚐 𝙻𝚊𝚝𝚎𝚜𝚝](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Collecting-Latest)\n       * [𝚉𝚒𝚙𝚙𝚒𝚗𝚐](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Zipping)\n       * [𝙲𝚘𝚖𝚋𝚒𝚗𝚒𝚗𝚐](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Combining)\n     * Flattening\n       * [𝚆𝚑𝚊𝚝 𝚒𝚜 𝚖𝚎𝚊𝚗𝚝 𝚋𝚢 𝚏𝚕𝚊𝚝𝚝𝚎𝚗𝚒𝚗𝚐](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-What-is-meant-by-flattening)\n       * [𝙵𝚕𝚊𝚝𝙼𝚊𝚙𝙲𝚘𝚗𝚌𝚊𝚝 𝚘𝚛 𝙵𝚕𝚊𝚝𝚝𝚎𝚗𝙲𝚘𝚗𝚌𝚊𝚝](https://github.com/devrath/KotlinAlchemy/wiki/Flattening-Flow:-FlatMapConcat-or-FlattenConcat)\n       * [𝙵𝚕𝚊𝚝𝙼𝚊𝚙𝙼𝚎𝚛𝚐𝚎 𝚘𝚛 𝙵𝚕𝚊𝚝𝚝𝚎𝚗𝙼𝚎𝚛𝚐𝚎](https://github.com/devrath/KotlinAlchemy/wiki/Flattening-Flow:-FlatMapMerge-or-FlattenMerge)\n       * [𝙵𝚕𝚊𝚝𝙼𝚊𝚙𝙻𝚊𝚝𝚎𝚜𝚝 𝚘𝚛 𝙵𝚕𝚊𝚝𝚝𝚎𝚗𝙻𝚊𝚝𝚎𝚜𝚝](https://github.com/devrath/KotlinAlchemy/wiki/Flattening-Flow:-FlatMapLatest-or-FlattenLatest) \n   * Operators\n     * [𝚃𝚎𝚛𝚖𝚒𝚗𝚊𝚕 𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Flow:-Terminal-operators)\n     * [𝙸𝚗𝚝𝚎𝚛𝚖𝚎𝚍𝚒𝚊𝚝𝚎 𝚘𝚙𝚎𝚛𝚊𝚝𝚘𝚛𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Flow:-Intermediate-operators)\n     * [𝙻𝚒𝚏𝚎𝚌𝚢𝚌𝚕𝚎 𝙾𝚙𝚎𝚛𝚊𝚝𝚘𝚛𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Flow:-Lifecycle-operators)\n   * [𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗 𝙷𝚊𝚗𝚍𝚕𝚒𝚗𝚐](https://github.com/devrath/KotlinAlchemy/wiki/Flows:-Exception-Handeling)\n* [𝚂𝚝𝚊𝚝𝚎 𝙵𝚕𝚘𝚠 𝚊𝚗𝚍 𝚂𝚑𝚊𝚛𝚎𝚍 𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/State-Flow-and-Shared-Flow)\n   * Shared Flow\n     * [𝙲𝚛𝚎𝚊𝚝𝚒𝚗𝚐 𝚊 𝚂𝚑𝚊𝚛𝚎𝚍 𝙵𝚕𝚘𝚠 𝚠𝚒𝚝𝚑 𝚂𝚑𝚊𝚛𝚎𝚍‐𝙸𝚗](https://github.com/devrath/KotlinAlchemy/wiki/Creating-a-Shared-Flow-with-Shared%E2%80%90In)\n     * [𝚄𝚜𝚒𝚗𝚐 𝙼𝚞𝚝𝚊𝚋𝚕𝚎 𝚂𝚑𝚊𝚛𝚎𝚍 𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/Using-Mutable-Shared-Flow)\n   * State Flow\n     * [𝙲𝚛𝚎𝚊𝚝𝚒𝚗𝚐 𝚊 𝚂𝚝𝚊𝚝𝚎 𝙵𝚕𝚘𝚠 𝚠𝚒𝚝𝚑 𝚂𝚝𝚊𝚝𝚎‐𝙸𝚗](https://github.com/devrath/KotlinAlchemy/wiki/Creating-a-state-flow-with-state-in)\n     * [𝚄𝚜𝚒𝚗𝚐 𝙼𝚞𝚝𝚊𝚋𝚕𝚎 𝚂𝚝𝚊𝚝𝚎 𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/Using-Mutable-State-Flow)\n   * Collecting the flows\n     * [𝙲𝚘𝚗𝚜𝚞𝚖𝚒𝚗𝚐 𝚝𝚑𝚎 𝚏𝚕𝚘𝚠𝚜 𝚜𝚊𝚏𝚎𝚕𝚢 𝚒𝚗 𝙲𝚘𝚖𝚙𝚘𝚜𝚎](https://github.com/devrath/KotlinAlchemy/wiki/Consuming-the-flows-safely-in-Compose)\n* [𝙲𝚊𝚕𝚕𝚋𝚊𝚌𝚔 𝙵𝚕𝚘𝚠](https://github.com/devrath/KotlinAlchemy/wiki/CallbackFlow)\n* 𝙺𝚘𝚝𝚕𝚒𝚗 𝙲𝚑𝚊𝚗𝚗𝚎𝚕𝚜\n   * [𝙰𝚋𝚘𝚞𝚝 𝙲𝚑𝚊𝚗𝚗𝚎𝚕𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Channels-%E2%80%90-About)\n   * [𝙲𝚘𝚖𝚖𝚞𝚗𝚒𝚌𝚊𝚝𝚒𝚘𝚗 𝚋𝚎𝚝𝚠𝚎𝚎𝚗 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Channels-%E2%80%90-Communication-between-coroutines)\n   * [𝚄𝚜𝚒𝚗𝚐 𝙿𝚛𝚘𝚍𝚞𝚌𝚎](https://github.com/devrath/KotlinAlchemy/wiki/Channel-%E2%80%90-Using-produce\n   )\n   * [𝙴𝚗𝚍-𝚝𝚘-𝚎𝚗𝚍 𝚌𝚘𝚖𝚖𝚞𝚗𝚒𝚌𝚊𝚝𝚒𝚘𝚗 𝚝𝚢𝚙𝚎𝚜](https://github.com/devrath/KotlinAlchemy/wiki/End-to-end-communication-types-in-channels)\n   * [𝙲𝚑𝚊𝚗𝚗𝚎𝚕 𝚝𝚢𝚙𝚎𝚜](https://github.com/devrath/KotlinAlchemy/wiki/Channel-Types)\n\n#### `𝙶𝚒𝚜𝚝 𝚎𝚡𝚊𝚖𝚙𝚕𝚎𝚜 𝚘𝚏 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚒𝚗 𝚊𝚌𝚝𝚒𝚘𝚗`\n* [**`𝚂𝚒𝚗𝚐𝚕𝚎 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Single-network-request)\n* [**`𝚂𝚎𝚚𝚞𝚎𝚗𝚝𝚒𝚊𝚕 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Sequential-network-request)\n* [**`𝙲𝚘𝚗𝚌𝚞𝚛𝚛𝚎𝚗𝚝 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Concurrent-network-request)\n* [**`𝚅𝚊𝚛𝚒𝚊𝚋𝚕𝚎 𝚗𝚞𝚖𝚋𝚎𝚛 𝚘𝚏 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Variable-number-of-network-requests)\n* [**`𝙸𝚖𝚙𝚕𝚎𝚖𝚎𝚗𝚝𝚒𝚗𝚐 𝚊 𝚝𝚒𝚖𝚎𝚘𝚞𝚝 𝚏𝚘𝚛 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Implementing-a-timeout-for-network-request)\n* [**`𝚁𝚎𝚝𝚛𝚢𝚒𝚗𝚐 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝𝚜 𝚒𝚗 𝚌𝚊𝚜𝚎 𝚘𝚏 𝚏𝚊𝚒𝚕𝚞𝚛𝚎`**](https://github.com/devrath/KotlinAlchemy/wiki/Retrying-network-requests-in-case-of-failure)\n* [**`𝙲𝚘𝚖𝚋𝚒𝚗𝚒𝚗𝚐 𝚝𝚒𝚖𝚎𝚘𝚞𝚝 𝚊𝚗𝚍 𝚛𝚎𝚝𝚛𝚢 𝚘𝚏 𝚗𝚎𝚝𝚠𝚘𝚛𝚔 𝚛𝚎𝚚𝚞𝚎𝚜𝚝`**](https://github.com/devrath/KotlinAlchemy/wiki/Combining-timeout-and-retry-of-network-request)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚛𝚘𝚘𝚖 𝚒𝚗 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-room-in-coroutines)\n* [**`𝙰𝚗𝚊𝚕𝚢𝚣𝚒𝚗𝚐 𝚊𝚗𝚍 𝚍𝚎𝚋𝚞𝚐𝚐𝚒𝚗𝚐 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Analysing-and-debugging-of-coroutines)\n* [**`𝙷𝚘𝚠 𝚝𝚘 𝚙𝚎𝚛𝚏𝚘𝚛𝚖 𝚊 𝚑𝚎𝚊𝚟𝚢 𝚘𝚙𝚎𝚛𝚊𝚝𝚒𝚘𝚗 𝚒𝚗 𝚝𝚑𝚎 𝚋𝚊𝚌𝚔𝚐𝚛𝚘𝚞𝚗𝚍 𝚝𝚑𝚛𝚎𝚊𝚍`**](https://github.com/devrath/KotlinAlchemy/wiki/How-to-perform-a-heavy-operation-in-background-thread)\n* [**`𝙷𝚘𝚠 𝚝𝚘 𝚙𝚎𝚛𝚏𝚘𝚛𝚖 𝚝𝚑𝚎 𝚌𝚊𝚗𝚌𝚎𝚕𝚕𝚊𝚝𝚒𝚘𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/How-to-perform-cancellation)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚖𝚊𝚗𝚢 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚝𝚘 𝚙𝚊𝚜𝚜 𝚘𝚗 𝚝𝚑𝚎 𝚠𝚘𝚛𝚔`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-many-coroutines-to-pass-on-the-work)\n* [**`𝙷𝚘𝚠 𝚝𝚘 𝚙𝚎𝚛𝚏𝚘𝚛𝚖 𝚎𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗 𝚑𝚊𝚗𝚍𝚕𝚒𝚗𝚐 𝚒𝚗 𝚝𝚑𝚎 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/How-to-perform-exception-handling-in-the-coroutines)\n* [**`𝙷𝚘𝚠 𝚝𝚘 𝚛𝚞𝚗 𝚝𝚑𝚎 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚎𝚟𝚎𝚗 𝚒𝚏 𝚝𝚑𝚎 𝚞𝚜𝚎𝚛 𝚕𝚎𝚊𝚟𝚎𝚜 𝚝𝚑𝚎 𝚜𝚌𝚛𝚎𝚎𝚗`**](https://github.com/devrath/KotlinAlchemy/wiki/How-to-run-the-coroutine-even-if-the-user-leaves-the-screen)\n* [**`𝚄𝚜𝚒𝚗𝚐 𝚠𝚘𝚛𝚔 𝚖𝚊𝚗𝚊𝚐𝚎𝚛 𝚊𝚕𝚘𝚗𝚐 𝚠𝚒𝚝𝚑 𝚌𝚘𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜`**](https://github.com/devrath/KotlinAlchemy/wiki/Using-work-manager-along-with-coroutines)\n* [**`𝙼𝚊𝚔𝚒𝚗𝚐 𝚙𝚊𝚛𝚎𝚗𝚝 𝚌𝚘 𝚛𝚘𝚞𝚝𝚒𝚗𝚎 𝚝𝚘 𝚠𝚊𝚒𝚝 𝚞𝚗𝚝𝚒𝚕 𝚊𝚕𝚕 𝚝𝚑𝚎 𝚌𝚑𝚒𝚕𝚍𝚛𝚎𝚗 𝚌𝚘 𝚛𝚘𝚞𝚝𝚒𝚗𝚎𝚜 𝚊𝚛𝚎 𝚏𝚒𝚗𝚒𝚜𝚑𝚎𝚍`**](https://github.com/devrath/KotlinAlchemy/wiki/Making-parent-co-routine-to-wait-until-all-the-children-co-routines-are-finished)\n* [**`𝙲𝚊𝚗𝚌𝚎𝚕𝚒𝚗𝚐 𝚝𝚑𝚎 𝚙𝚊𝚛𝚎𝚗𝚝 𝚊𝚗𝚍 𝚌𝚑𝚒𝚕𝚍 𝚓𝚘𝚋`**](https://github.com/devrath/KotlinAlchemy/wiki/Canceling-the-parent-and-child-job)\n\n\n## **`𝚂𝚞𝚙𝚙𝚘𝚛𝚝`** ☕\n𝙸𝚏 𝚢𝚘𝚞 𝚏𝚎𝚎𝚕 𝚕𝚒𝚔𝚎 𝚜𝚞𝚙𝚙𝚘𝚛𝚝 𝚖𝚎 𝚊 𝚌𝚘𝚏𝚏𝚎𝚎 𝚏𝚘𝚛 𝚖𝚢 𝚎𝚏𝚏𝚘𝚛𝚝𝚜, 𝙸 𝚠𝚘𝚞𝚕𝚍 𝚐𝚛𝚎𝚊𝚝𝚕𝚢 𝚊𝚙𝚙𝚛𝚎𝚌𝚒𝚊𝚝𝚎 𝚒𝚝.</br>\n<a href=\"https://www.buymeacoffee.com/devrath\" target=\"_blank\"><img src=\"https://www.buymeacoffee.com/assets/img/custom_images/yellow_img.png\" alt=\"𝙱𝚞𝚢 𝙼𝚎 𝙰 𝙲𝚘𝚏𝚏𝚎𝚎\" style=\"height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;\" ></a>\n\n## **`𝙲𝚘𝚗𝚝𝚛𝚒𝚋𝚞𝚝𝚎`** 🙋‍♂️\n𝚁𝚎𝚊𝚍 [𝚌𝚘𝚗𝚝𝚛𝚒𝚋𝚞𝚝𝚒𝚘𝚗 𝚐𝚞𝚒𝚍𝚎𝚕𝚒𝚗𝚎𝚜](CONTRIBUTING.md) 𝚏𝚘𝚛 𝚖𝚘𝚛𝚎 𝚒𝚗𝚏𝚘𝚛𝚖𝚊𝚝𝚒𝚘𝚗 𝚛𝚎𝚐𝚊𝚛𝚍𝚒𝚗𝚐 𝚌𝚘𝚗𝚝𝚛𝚒𝚋𝚞𝚝𝚒𝚘𝚗.\n\n## **`𝙵𝚎𝚎𝚍𝚋𝚊𝚌𝚔`** ✍️\n𝙵𝚎𝚊𝚝𝚞𝚛𝚎 𝚛𝚎𝚚𝚞𝚎𝚜𝚝𝚜 𝚊𝚛𝚎 𝚊𝚕𝚠𝚊𝚢𝚜 𝚠𝚎𝚕𝚌𝚘𝚖𝚎, [𝙵𝚒𝚕𝚎 𝚊𝚗 𝚒𝚜𝚜𝚞𝚎 𝚑𝚎𝚛𝚎](https://github.com/devrath/KotlinAlchemy/issues/new).\n\n## **`𝙵𝚒𝚗𝚍 𝚝𝚑𝚒𝚜 𝚙𝚛𝚘𝚓𝚎𝚌𝚝 𝚞𝚜𝚎𝚏𝚞𝚕`** ? ❤️\n𝚂𝚞𝚙𝚙𝚘𝚛𝚝 𝚒𝚝 𝚋𝚢 𝚌𝚕𝚒𝚌𝚔𝚒𝚗𝚐 𝚝𝚑𝚎 ⭐ 𝚋𝚞𝚝𝚝𝚘𝚗 𝚘𝚗 𝚝𝚑𝚎 𝚞𝚙𝚙𝚎𝚛 𝚛𝚒𝚐𝚑𝚝 𝚘𝚏 𝚝𝚑𝚒𝚜 𝚙𝚊𝚐𝚎. ✌️\n\n## **`𝙻𝚒𝚌𝚎𝚗𝚜𝚎`** ![Licence](https://img.shields.io/github/license/google/docsy) :credit_card:\n𝚃𝚑𝚒𝚜 𝚙𝚛𝚘𝚓𝚎𝚌𝚝 𝚒𝚜 𝚕𝚒𝚌𝚎𝚗𝚜𝚎𝚍 𝚞𝚗𝚍𝚎𝚛 𝚝𝚑𝚎 𝙰𝚙𝚊𝚌𝚑𝚎 𝙻𝚒𝚌𝚎𝚗𝚜𝚎 𝟸.𝟶 - 𝚜𝚎𝚎 𝚝𝚑𝚎 [𝙻𝙸𝙲𝙴𝙽𝚂𝙴](https://github.com/devrath/KotlinAlchemy/blob/main/LICENSE) 𝚏𝚒𝚕𝚎 𝚏𝚘𝚛 𝚍𝚎𝚝𝚊𝚒𝚕𝚜.\n\n\n<p align=\"center\">\n<a><img src=\"https://forthebadge.com/images/badges/built-for-android.svg\"></a>\n</p>\n"
  },
  {
    "path": "application/.idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": "application/.idea/.name",
    "content": "My Application"
  },
  {
    "path": "application/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"1.8\" />\n  </component>\n</project>"
  },
  {
    "path": "application/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"testRunner\" value=\"GRADLE\" />\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/buildSrc\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/.idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RemoteRepositoriesConfiguration\">\n    <remote-repository>\n      <option name=\"id\" value=\"central\" />\n      <option name=\"name\" value=\"Maven Central repository\" />\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"jboss.community\" />\n      <option name=\"name\" value=\"JBoss Community repository\" />\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"BintrayJCenter\" />\n      <option name=\"name\" value=\"BintrayJCenter\" />\n      <option name=\"url\" value=\"https://jcenter.bintray.com/\" />\n    </remote-repository>\n    <remote-repository>\n      <option name=\"id\" value=\"Google\" />\n      <option name=\"name\" value=\"Google\" />\n      <option name=\"url\" value=\"https://dl.google.com/dl/android/maven2/\" />\n    </remote-repository>\n  </component>\n</project>"
  },
  {
    "path": "application/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DesignSurface\">\n    <option name=\"filePathToZoomLevelMap\">\n      <map>\n        <entry key=\"app/src/main/res/layout/activity_cooperativecancellation.xml\" value=\"0.19293478260869565\" />\n        <entry key=\"app/src/main/res/layout/activity_debuggingcoroutines.xml\" value=\"0.13722826086956522\" />\n        <entry key=\"app/src/main/res/layout/activity_exceptionhandling.xml\" value=\"0.13722826086956522\" />\n        <entry key=\"app/src/main/res/layout/activity_flow_usecase1.xml\" value=\"0.19293478260869565\" />\n        <entry key=\"app/src/main/res/layout/activity_jobs.xml\" value=\"0.1\" />\n        <entry key=\"app/src/main/res/layout/activity_observable_types.xml\" value=\"0.13722826086956522\" />\n        <entry key=\"app/src/main/res/layout/activity_selection.xml\" value=\"0.19293478260869565\" />\n        <entry key=\"app/src/main/res/layout/activity_suspending_func.xml\" value=\"0.1\" />\n      </map>\n    </option>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_8\" default=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": "application/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/My_Application.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/My_Application.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/app/My_Application.app.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/app/My_Application.app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/My_Application.buildSrc.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/My_Application.buildSrc.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n"
  },
  {
    "path": "application/KotlinConcepts/.idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n"
  },
  {
    "path": "application/KotlinConcepts/.idea/.name",
    "content": "KotlinAlchemy"
  },
  {
    "path": "application/KotlinConcepts/.idea/appInsightsSettings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AppInsightsSettings\">\n    <option name=\"tabSettings\">\n      <map>\n        <entry key=\"Android Vitals\">\n          <value>\n            <InsightsFilterSettings>\n              <option name=\"connection\">\n                <ConnectionSetting>\n                  <option name=\"appId\" value=\"com.istudio.distancetracker\" />\n                </ConnectionSetting>\n              </option>\n              <option name=\"failureTypes\">\n                <list>\n                  <option value=\"FATAL\" />\n                </list>\n              </option>\n              <option name=\"signal\" value=\"SIGNAL_UNSPECIFIED\" />\n              <option name=\"timeIntervalDays\" value=\"SEVEN_DAYS\" />\n              <option name=\"visibilityType\" value=\"ALL\" />\n            </InsightsFilterSettings>\n          </value>\n        </entry>\n        <entry key=\"Firebase Crashlytics\">\n          <value>\n            <InsightsFilterSettings>\n              <option name=\"connection\">\n                <ConnectionSetting>\n                  <option name=\"appId\" value=\"PLACEHOLDER\" />\n                  <option name=\"mobileSdkAppId\" value=\"\" />\n                  <option name=\"projectId\" value=\"\" />\n                  <option name=\"projectNumber\" value=\"\" />\n                </ConnectionSetting>\n              </option>\n              <option name=\"signal\" value=\"SIGNAL_UNSPECIFIED\" />\n              <option name=\"timeIntervalDays\" value=\"THIRTY_DAYS\" />\n              <option name=\"visibilityType\" value=\"ALL\" />\n            </InsightsFilterSettings>\n          </value>\n        </entry>\n      </map>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"21\" />\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/deploymentTargetDropDown.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetDropDown\">\n    <value>\n      <entry key=\"app\">\n        <State />\n      </entry>\n    </value>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/deploymentTargetSelector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetSelector\">\n    <selectionStates>\n      <SelectionState runConfigName=\"app\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n    </selectionStates>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleJvm\" value=\"#GRADLE_LOCAL_JAVA_HOME\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveExternalAnnotations\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"PreviewAnnotationInFunctionWithParameters\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewApiLevelMustBeValid\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewDimensionRespectsLimit\" enabled=\"true\" level=\"WARNING\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewFontScaleMustBeGreaterThanZero\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewMultipleParameterProviders\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewMustBeTopLevelFunction\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewNeedsComposableAnnotation\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewNotSupportedInUnitTestFiles\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n    <inspection_tool class=\"PreviewPickerAnnotation\" enabled=\"true\" level=\"ERROR\" enabled_by_default=\"true\">\n      <option name=\"composableFile\" value=\"true\" />\n      <option name=\"previewFile\" value=\"true\" />\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": "application/KotlinConcepts/.idea/kotlinc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"KotlinJpsPluginSettings\">\n    <option name=\"version\" value=\"1.9.24\" />\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/material_theme_project_new.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MaterialThemeProjectNewConfig\">\n    <option name=\"metadata\">\n      <MTProjectMetadataState>\n        <option name=\"migrated\" value=\"true\" />\n        <option name=\"pristineConfig\" value=\"false\" />\n        <option name=\"userId\" value=\"1aad7385:1912621c654:-7ff9\" />\n      </MTProjectMetadataState>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/migrations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectMigrations\">\n    <option name=\"MigrateToGradleLocalJavaHome\">\n      <set>\n        <option value=\"$PROJECT_DIR$\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" enabled=\"true\" />\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_21\" default=\"true\" project-jdk-name=\"jbr-21\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/other.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"direct_access_persist.xml\">\n    <option name=\"deviceSelectionList\">\n      <list>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"27\" />\n          <option name=\"brand\" value=\"DOCOMO\" />\n          <option name=\"codename\" value=\"F01L\" />\n          <option name=\"id\" value=\"F01L\" />\n          <option name=\"manufacturer\" value=\"FUJITSU\" />\n          <option name=\"name\" value=\"F-01L\" />\n          <option name=\"screenDensity\" value=\"360\" />\n          <option name=\"screenX\" value=\"720\" />\n          <option name=\"screenY\" value=\"1280\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"28\" />\n          <option name=\"brand\" value=\"DOCOMO\" />\n          <option name=\"codename\" value=\"SH-01L\" />\n          <option name=\"id\" value=\"SH-01L\" />\n          <option name=\"manufacturer\" value=\"SHARP\" />\n          <option name=\"name\" value=\"AQUOS sense2 SH-01L\" />\n          <option name=\"screenDensity\" value=\"480\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2160\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"a51\" />\n          <option name=\"id\" value=\"a51\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy A51\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"akita\" />\n          <option name=\"id\" value=\"akita\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"b0q\" />\n          <option name=\"id\" value=\"b0q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S22 Ultra\" />\n          <option name=\"screenDensity\" value=\"600\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3088\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"32\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"bluejay\" />\n          <option name=\"id\" value=\"bluejay\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 6a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"29\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"crownqlteue\" />\n          <option name=\"id\" value=\"crownqlteue\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Note9\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2220\" />\n          <option name=\"screenY\" value=\"1080\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"dm3q\" />\n          <option name=\"id\" value=\"dm3q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S23 Ultra\" />\n          <option name=\"screenDensity\" value=\"600\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3088\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"felix\" />\n          <option name=\"id\" value=\"felix\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Fold\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2208\" />\n          <option name=\"screenY\" value=\"1840\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"felix_camera\" />\n          <option name=\"id\" value=\"felix_camera\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Fold (Camera-enabled)\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2208\" />\n          <option name=\"screenY\" value=\"1840\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"gts8uwifi\" />\n          <option name=\"id\" value=\"gts8uwifi\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Tab S8 Ultra\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"1848\" />\n          <option name=\"screenY\" value=\"2960\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"husky\" />\n          <option name=\"id\" value=\"husky\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8 Pro\" />\n          <option name=\"screenDensity\" value=\"390\" />\n          <option name=\"screenX\" value=\"1008\" />\n          <option name=\"screenY\" value=\"2244\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"motorola\" />\n          <option name=\"codename\" value=\"java\" />\n          <option name=\"id\" value=\"java\" />\n          <option name=\"manufacturer\" value=\"Motorola\" />\n          <option name=\"name\" value=\"G20\" />\n          <option name=\"screenDensity\" value=\"280\" />\n          <option name=\"screenX\" value=\"720\" />\n          <option name=\"screenY\" value=\"1600\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"lynx\" />\n          <option name=\"id\" value=\"lynx\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 7a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"oriole\" />\n          <option name=\"id\" value=\"oriole\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 6\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"panther\" />\n          <option name=\"id\" value=\"panther\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 7\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"q2q\" />\n          <option name=\"id\" value=\"q2q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Z Fold3\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1768\" />\n          <option name=\"screenY\" value=\"2208\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"q5q\" />\n          <option name=\"id\" value=\"q5q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Z Fold5\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1812\" />\n          <option name=\"screenY\" value=\"2176\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"r11\" />\n          <option name=\"id\" value=\"r11\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Watch\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"384\" />\n          <option name=\"screenY\" value=\"384\" />\n          <option name=\"type\" value=\"WEAR_OS\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"redfin\" />\n          <option name=\"id\" value=\"redfin\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 5\" />\n          <option name=\"screenDensity\" value=\"440\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2340\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"shiba\" />\n          <option name=\"id\" value=\"shiba\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"tangorpro\" />\n          <option name=\"id\" value=\"tangorpro\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Tablet\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"1600\" />\n          <option name=\"screenY\" value=\"2560\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"29\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"x1q\" />\n          <option name=\"id\" value=\"x1q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S20\" />\n          <option name=\"screenDensity\" value=\"480\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3200\" />\n        </PersistentDeviceSelectionData>\n      </list>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/.idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.AllInPackageConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.PatternConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.TestInClassConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.UniqueIdConfigurationProducer\" />\n        <option value=\"com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer\" />\n        <option value=\"org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer\" />\n        <option value=\"org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/KotlinConcepts/app/.gitignore",
    "content": "/build"
  },
  {
    "path": "application/KotlinConcepts/app/build.gradle.kts",
    "content": "plugins {\n    id(\"com.android.application\")\n    id(\"org.jetbrains.kotlin.android\")\n    id(\"com.google.dagger.hilt.android\")\n    kotlin(\"kapt\")\n}\n\nandroid {\n    namespace = \"com.istudio.app\"\n    compileSdk = 34\n\n    defaultConfig {\n        applicationId = \"com.istudio.app\"\n        minSdk = 24\n        targetSdk = 34\n        versionCode = 1\n        versionName = \"1.0\"\n\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n        vectorDrawables {\n            useSupportLibrary = true\n        }\n    }\n\n    buildTypes {\n        release {\n            isMinifyEnabled = false\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = \"1.8\"\n    }\n    buildFeatures {\n        compose = true\n    }\n    composeOptions {\n        kotlinCompilerExtensionVersion = \"1.5.14\"\n    }\n    packaging {\n        resources {\n            excludes += \"/META-INF/{AL2.0,LGPL2.1}\"\n        }\n    }\n    // Allow references to generated code\n    kapt {\n        correctErrorTypes = true\n    }\n}\n\ndependencies {\n\n    implementation(\"androidx.core:core-ktx:1.13.1\")\n    implementation(\"androidx.lifecycle:lifecycle-runtime-ktx:2.8.6\")\n    implementation(\"androidx.activity:activity-compose:1.9.3\")\n    implementation(platform(\"androidx.compose:compose-bom:2024.10.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.ui:ui-graphics\")\n    implementation(\"androidx.compose.ui:ui-tooling-preview\")\n    implementation(\"androidx.compose.material3:material3\")\n    testImplementation(\"junit:junit:4.13.2\")\n    androidTestImplementation(\"androidx.test.ext:junit:1.2.1\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-core:3.6.1\")\n    androidTestImplementation(platform(\"androidx.compose:compose-bom:2024.10.00\"))\n    androidTestImplementation(\"androidx.compose.ui:ui-test-junit4\")\n    debugImplementation(\"androidx.compose.ui:ui-tooling\")\n    debugImplementation(\"androidx.compose.ui:ui-test-manifest\")\n\n    // Hilt\n    implementation(\"com.google.dagger:hilt-android:2.51.1\")\n    kapt(\"com.google.dagger:hilt-android-compiler:2.51.1\")\n    // Hilt-Navigation\n    implementation(\"androidx.hilt:hilt-navigation-compose:1.2.0\")\n    // Navigation\n    implementation (\"androidx.navigation:navigation-compose:2.8.3\")\n    // Lifecycle\n    implementation(\"androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6\")\n    implementation(\"androidx.lifecycle:lifecycle-livedata-ktx:2.8.6\")\n    implementation(\"androidx.lifecycle:lifecycle-runtime-ktx:2.8.6\")\n    implementation(\"androidx.lifecycle:lifecycle-runtime-compose:2.8.6\")\n    // Retrofit\n    implementation(\"com.squareup.retrofit2:retrofit:2.9.0\")\n    implementation(\"com.google.code.gson:gson:2.10.1\")\n    implementation(\"com.squareup.retrofit2:converter-gson:2.9.0\")\n    // Joda Time\n    implementation(\"joda-time:joda-time:2.10.13\")\n    // Open CSV reader\n    implementation(\"com.opencsv:opencsv:5.5.2\")\n    // Desugar jdk\n    coreLibraryDesugaring(\"com.android.tools:desugar_jdk_libs:2.1.2\")\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\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# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "application/KotlinConcepts/app/src/androidTest/java/com/istudio/app/ExampleInstrumentedTest.kt",
    "content": "package com.istudio.app\n\nimport androidx.test.platform.app.InstrumentationRegistry\nimport androidx.test.ext.junit.runners.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getInstrumentation().targetContext\n        assertEquals(\"com.istudio.app\", appContext.packageName)\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/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    <application\n        android:name=\".application.CurrentApplication\"\n        android:allowBackup=\"true\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:fullBackupContent=\"@xml/backup_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.KotlinConcepts\"\n        tools:targetApi=\"31\">\n        <activity\n            android:name=\".main.MainActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\"\n            android:theme=\"@style/Theme.KotlinConcepts\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/assets/stockdata.csv",
    "content": "\"Rank\",\"Name\",\"Symbol\",\"marketcap\",\"price (USD)\",\"country\"\n\"1\",\"Apple\",\"AAPL\",\"2378193174528\",\"146.94\",\"United States\"\n\"2\",\"Saudi Aramco\",\"2222.SR\",\"2224200000000\",\"10.11\",\"Saudi Arabia\"\n\"3\",\"Microsoft\",\"MSFT\",\"1951727484928\",\"260.96\",\"United States\"\n\"4\",\"Alphabet (Google)\",\"GOOG\",\"1534749310976\",\"2338.99\",\"United States\"\n\"5\",\"Amazon\",\"AMZN\",\"1133733478400\",\"111.43\",\"United States\"\n\"6\",\"Tesla\",\"TSLA\",\"720812179456\",\"695.5\",\"United States\"\n\"7\",\"Berkshire Hathaway\",\"BRK-B\",\"615390314496\",\"278.77\",\"United States\"\n\"8\",\"UnitedHealth\",\"UNH\",\"485138137088\",\"517.11\",\"United States\"\n\"9\",\"Johnson & Johnson\",\"JNJ\",\"467810287616\",\"177.78\",\"United States\"\n\"10\",\"Meta Platforms (Facebook)\",\"META\",\"443647000576\",\"163.93\",\"United States\"\n\"11\",\"Visa\",\"V\",\"438732455936\",\"207.32\",\"United States\"\n\"12\",\"TSMC\",\"TSM\",\"414552883200\",\"79.94\",\"Taiwan\"\n\"13\",\"Tencent\",\"TCEHY\",\"414527651840\",\"43.11\",\"China\"\n\"14\",\"NVIDIA\",\"NVDA\",\"378534789120\",\"151.9\",\"United States\"\n\"15\",\"Kweichow Moutai\",\"600519.SS\",\"363981359625\",\"289.75\",\"China\"\n\"16\",\"Procter & Gamble\",\"PG\",\"351233540096\",\"146.39\",\"United States\"\n\"17\",\"Exxon Mobil\",\"XOM\",\"350748901376\",\"83.25\",\"United States\"\n\"18\",\"Walmart\",\"WMT\",\"347239546880\",\"126.68\",\"United States\"\n\"19\",\"JPMorgan Chase\",\"JPM\",\"333942587392\",\"113.7\",\"United States\"\n\"20\",\"Roche\",\"ROG.SW\",\"329940108327\",\"334.04\",\"Switzerland\"\n\"21\",\"Alibaba\",\"BABA\",\"323570630656\",\"107.45\",\"China\"\n\"22\",\"Nestlé\",\"NESN.SW\",\"321120893727\",\"116.77\",\"Switzerland\"\n\"23\",\"Mastercard\",\"MA\",\"316819668992\",\"325.73\",\"United States\"\n\"24\",\"Eli Lilly\",\"LLY\",\"312279597056\",\"328.66\",\"United States\"\n\"25\",\"LVMH\",\"MC.PA\",\"306576221828\",\"609.15\",\"France\"\n\"26\",\"Home Depot\",\"HD\",\"300447301632\",\"292.34\",\"United States\"\n\"27\",\"Samsung\",\"005930.KS\",\"298950483006\",\"44.43\",\"South Korea\"\n\"28\",\"Pfizer\",\"PFE\",\"293365907456\",\"52.29\",\"United States\"\n\"29\",\"Coca-Cola\",\"KO\",\"274329354240\",\"63.28\",\"United States\"\n\"30\",\"AbbVie\",\"ABBV\",\"271138455552\",\"153.44\",\"United States\"\n\"31\",\"Chevron\",\"CVX\",\"270799929344\",\"137.83\",\"United States\"\n\"32\",\"Bank of America\",\"BAC\",\"252113485824\",\"31.29\",\"United States\"\n\"33\",\"Novo Nordisk\",\"NVO\",\"248601198592\",\"109.17\",\"Denmark\"\n\"34\",\"Pepsico\",\"PEP\",\"237420003328\",\"171.71\",\"United States\"\n\"35\",\"Merck\",\"MRK\",\"236737069056\",\"93.62\",\"United States\"\n\"36\",\"ICBC\",\"1398.HK\",\"235530494429\",\"0.54\",\"China\"\n\"37\",\"Costco\",\"COST\",\"221647618048\",\"500.38\",\"United States\"\n\"38\",\"Prosus\",\"PRX.AS\",\"214848079027\",\"67.54\",\"Netherlands\"\n\"39\",\"Verizon\",\"VZ\",\"213635678208\",\"50.87\",\"United States\"\n\"40\",\"Thermo Fisher Scientific\",\"TMO\",\"213437136896\",\"545.23\",\"United States\"\n\"41\",\"Toyota\",\"TM\",\"212765818880\",\"155.05\",\"Japan\"\n\"42\",\"Astrazeneca\",\"AZN\",\"207878225920\",\"67.08\",\"United Kingdom\"\n\"43\",\"Reliance Industries\",\"RELIANCE.NS\",\"205975990364\",\"30.44\",\"India\"\n\"44\",\"Broadcom\",\"AVGO\",\"197727453184\",\"489.65\",\"United States\"\n\"45\",\"Abbott Laboratories\",\"ABT\",\"192463323136\",\"109.92\",\"United States\"\n\"46\",\"Danaher\",\"DHR\",\"191083102208\",\"262.81\",\"United States\"\n\"47\",\"Oracle\",\"ORCL\",\"189423239168\",\"71.08\",\"United States\"\n\"48\",\"McDonald\",\"MCD\",\"188900343808\",\"255.43\",\"United States\"\n\"49\",\"Novartis\",\"NVS\",\"187214659584\",\"84.23\",\"Switzerland\"\n\"50\",\"ASML\",\"ASML\",\"182929080320\",\"439.8\",\"Netherlands\"\n\"51\",\"CATL\",\"300750.SZ\",\"182810754503\",\"74.9\",\"China\"\n\"52\",\"L'Oréal\",\"OR.PA\",\"181052129239\",\"337.61\",\"France\"\n\"53\",\"Cisco\",\"CSCO\",\"180587266048\",\"43.61\",\"United States\"\n\"54\",\"Adobe\",\"ADBE\",\"179328237568\",\"383.18\",\"United States\"\n\"55\",\"Comcast\",\"CMCSA\",\"178707611648\",\"39.89\",\"United States\"\n\"56\",\"Shell\",\"SHEL\",\"176618078208\",\"47.24\",\"United Kingdom\"\n\"57\",\"Accenture\",\"ACN\",\"174998831104\",\"276.44\",\"Ireland\"\n\"58\",\"Walt Disney\",\"DIS\",\"171856625664\",\"94.35\",\"United States\"\n\"59\",\"T-Mobile US\",\"TMUS\",\"169308520448\",\"135.06\",\"United States\"\n\"60\",\"China Construction Bank\",\"601939.SS\",\"168015942810\",\"0.86\",\"China\"\n\"61\",\"Salesforce\",\"CRM\",\"166821707776\",\"167.66\",\"United States\"\n\"62\",\"Nike\",\"NKE\",\"165167153152\",\"104.95\",\"United States\"\n\"63\",\"Bristol-Myers Squibb\",\"BMY\",\"160829194240\",\"75.54\",\"United States\"\n\"64\",\"Nextera Energy\",\"NEE\",\"158613716992\",\"80.74\",\"United States\"\n\"65\",\"United Parcel Service\",\"UPS\",\"158335139840\",\"181.21\",\"United States\"\n\"66\",\"Agricultural Bank of China\",\"601288.SS\",\"154914093284\",\"0.45\",\"China\"\n\"67\",\"Intel\",\"INTC\",\"152376573952\",\"37.27\",\"United States\"\n\"68\",\"QUALCOMM\",\"QCOM\",\"150750658560\",\"134.6\",\"United States\"\n\"69\",\"Wells Fargo\",\"WFC\",\"150306324480\",\"39.66\",\"United States\"\n\"70\",\"AT&T\",\"T\",\"148364541952\",\"20.72\",\"United States\"\n\"71\",\"CM Bank\",\"3968.HK\",\"145418845079\",\"5.99\",\"China\"\n\"72\",\"Philip Morris\",\"PM\",\"145338318848\",\"93.76\",\"United States\"\n\"73\",\"Texas Instruments\",\"TXN\",\"142718681088\",\"154.77\",\"United States\"\n\"74\",\"Tata Consultancy Services\",\"TCS.NS\",\"141961448754\",\"38.8\",\"India\"\n\"75\",\"Raytheon Technologies\",\"RTX\",\"140765806592\",\"94.65\",\"United States\"\n\"76\",\"Meituan\",\"3690.HK\",\"140235181378\",\"22.68\",\"China\"\n\"77\",\"Linde\",\"LIN\",\"138571120640\",\"275.64\",\"United Kingdom\"\n\"78\",\"Royal Bank Of Canada\",\"RY\",\"138145038336\",\"98.09\",\"Canada\"\n\"79\",\"Bank of China\",\"601988.SS\",\"135173874314\",\"0.5\",\"China\"\n\"80\",\"China Mobile\",\"0941.HK\",\"134848291425\",\"6.31\",\"China\"\n\"81\",\"Amgen\",\"AMGN\",\"133353414656\",\"249.63\",\"United States\"\n\"82\",\"Morgan Stanley\",\"MS\",\"133269602304\",\"76.19\",\"United States\"\n\"83\",\"PetroChina\",\"PTR\",\"131350069248\",\"44.55\",\"China\"\n\"84\",\"Union Pacific Corporation\",\"UNP\",\"129662050304\",\"206.46\",\"United States\"\n\"85\",\"BHP Group\",\"BHP\",\"127157625000\",\"50.25\",\"Australia\"\n\"86\",\"TotalEnergies\",\"TTE\",\"127135703040\",\"48.45\",\"France\"\n\"87\",\"AIA\",\"1299.HK\",\"126843997277\",\"10.61\",\"Hong Kong\"\n\"88\",\"IBM\",\"IBM\",\"126609686528\",\"141.26\",\"United States\"\n\"89\",\"HSBC\",\"HSBC\",\"125697081344\",\"31.17\",\"United Kingdom\"\n\"90\",\"CVS Health\",\"CVS\",\"125439918080\",\"95.66\",\"United States\"\n\"91\",\"Sanofi\",\"SNY\",\"125390430208\",\"50.21\",\"France\"\n\"92\",\"BYD\",\"002594.SZ\",\"124273194295\",\"45.95\",\"China\"\n\"93\",\"Ping An Insurance\",\"601318.SS\",\"123036377112\",\"6.77\",\"China\"\n\"94\",\"AMD\",\"AMD\",\"121959579648\",\"75.26\",\"United States\"\n\"95\",\"S&P Global\",\"SPGI\",\"120256618496\",\"353.8\",\"United States\"\n\"96\",\"American Tower\",\"AMT\",\"119659479040\",\"257.5\",\"United States\"\n\"97\",\"Charles Schwab\",\"SCHW\",\"119471185920\",\"63\",\"United States\"\n\"98\",\"Medtronic\",\"MDT\",\"119132143616\",\"89.66\",\"Ireland\"\n\"99\",\"Honeywell\",\"HON\",\"118369255424\",\"173.89\",\"United States\"\n\"100\",\"Unilever\",\"UL\",\"118089531392\",\"45.94\",\"United Kingdom\"\n\"101\",\"Lowe's Companies\",\"LOW\",\"117864972288\",\"184.42\",\"United States\"\n\"102\",\"Anthem\",\"ANTM\",\"116342792192\",\"482.58\",\"United States\"\n\"103\",\"Toronto Dominion Bank\",\"TD\",\"114630156288\",\"62.36\",\"Canada\"\n\"104\",\"Hermès\",\"RMS.PA\",\"113668592298\",\"1086.98\",\"France\"\n\"105\",\"Intuit\",\"INTU\",\"112438706176\",\"398.61\",\"United States\"\n\"106\",\"Lockheed Martin\",\"LMT\",\"111373762560\",\"418.53\",\"United States\"\n\"107\",\"Wuliangye Yibin\",\"000858.SZ\",\"109674459453\",\"28.25\",\"China\"\n\"108\",\"HDFC Bank\",\"HDB\",\"108887891968\",\"58.81\",\"India\"\n\"109\",\"Commonwealth Bank\",\"CBA.AX\",\"108265977043\",\"63.29\",\"Australia\"\n\"110\",\"GlaxoSmithKline\",\"GSK\",\"107212218368\",\"42.18\",\"United Kingdom\"\n\"111\",\"SAP\",\"SAP\",\"106530742272\",\"87.56\",\"Germany\"\n\"112\",\"ConocoPhillips\",\"COP\",\"106476806144\",\"82.32\",\"United States\"\n\"113\",\"Dior\",\"CDI.PA\",\"106033417653\",\"587.73\",\"France\"\n\"114\",\"American Express\",\"AXP\",\"106015784960\",\"140.78\",\"United States\"\n\"115\",\"Equinor\",\"EQNR\",\"105215623168\",\"32.77\",\"Norway\"\n\"116\",\"China Life Insurance\",\"LFC\",\"103967932416\",\"7.88\",\"China\"\n\"117\",\"Sony\",\"SONY\",\"102031015936\",\"82.53\",\"Japan\"\n\"118\",\"Goldman Sachs\",\"GS\",\"101423333376\",\"295.31\",\"United States\"\n\"119\",\"Nippon Telegraph & Telephone\",\"NPPXF\",\"100178526208\",\"28.15\",\"Japan\"\n\"120\",\"Diageo\",\"DEO\",\"97791942656\",\"171.37\",\"United Kingdom\"\n\"121\",\"Anheuser-Busch Inbev\",\"BUD\",\"96170795008\",\"54.6\",\"Belgium\"\n\"122\",\"Deutsche Telekom\",\"DTE.DE\",\"95439246480\",\"19.2\",\"Germany\"\n\"123\",\"CSL\",\"CSL.AX\",\"95308949865\",\"197.86\",\"Australia\"\n\"124\",\"China Shenhua Energy\",\"601088.SS\",\"93917975546\",\"4.42\",\"China\"\n\"125\",\"Jingdong Mall\",\"JD\",\"93776707584\",\"59.44\",\"China\"\n\"126\",\"Rio Tinto\",\"RIO\",\"93689520128\",\"57.48\",\"United Kingdom\"\n\"127\",\"Caterpillar\",\"CAT\",\"93137764352\",\"174.62\",\"United States\"\n\"128\",\"British American Tobacco\",\"BTI\",\"92813344768\",\"40.61\",\"United Kingdom\"\n\"129\",\"Volkswagen\",\"VOW3.DE\",\"92251598834\",\"129.97\",\"Germany\"\n\"130\",\"BlackRock\",\"BLK\",\"92232753152\",\"608.79\",\"United States\"\n\"131\",\"Starbucks\",\"SBUX\",\"90919804928\",\"79.27\",\"United States\"\n\"132\",\"Deere & Company\",\"DE\",\"90821263360\",\"297.16\",\"United States\"\n\"133\",\"Automatic Data Processing\",\"ADP\",\"90730471424\",\"217.19\",\"United States\"\n\"134\",\"Prologis\",\"PLD\",\"90695835648\",\"122.51\",\"United States\"\n\"135\",\"Citigroup\",\"C\",\"89988571136\",\"46.34\",\"United States\"\n\"136\",\"Cigna\",\"CI\",\"89369452544\",\"281.68\",\"United States\"\n\"137\",\"ServiceNow\",\"NOW\",\"88252514304\",\"440.25\",\"United States\"\n\"138\",\"Estee Lauder\",\"EL\",\"88073527296\",\"246.47\",\"United States\"\n\"139\",\"Mondelez\",\"MDLZ\",\"87463747584\",\"63.2\",\"United States\"\n\"140\",\"BP\",\"BP\",\"87246266368\",\"26.68\",\"United Kingdom\"\n\"141\",\"Al Rajhi Bank\",\"1120.SR\",\"86965784828\",\"21.74\",\"Saudi Arabia\"\n\"142\",\"Keyence\",\"6861.T\",\"86548585173\",\"356.86\",\"Japan\"\n\"143\",\"Boeing\",\"BA\",\"84349542400\",\"142.57\",\"United States\"\n\"144\",\"Enbridge\",\"ENB\",\"84313849856\",\"41.56\",\"Canada\"\n\"145\",\"China Yangtze Power\",\"600900.SS\",\"84210470774\",\"3.7\",\"China\"\n\"146\",\"Zoetis\",\"ZTS\",\"83847266304\",\"178.16\",\"United States\"\n\"147\",\"Duke Energy\",\"DUK\",\"83434070016\",\"108.37\",\"United States\"\n\"148\",\"PayPal\",\"PYPL\",\"83043049472\",\"71.71\",\"United States\"\n\"149\",\"Chubb\",\"CB\",\"82276999168\",\"193.69\",\"Switzerland\"\n\"150\",\"The Saudi National Bank\",\"1180.SR\",\"79657426000\",\"17.96\",\"Saudi Arabia\"\n\"151\",\"Gazprom\",\"GAZP.ME\",\"79519488952\",\"3.36\",\"Russia\"\n\"152\",\"Marsh & McLennan Companies\",\"MMC\",\"78662475776\",\"156.73\",\"United States\"\n\"153\",\"Netflix\",\"NFLX\",\"78436573184\",\"176.55\",\"United States\"\n\"154\",\"Charter Communications\",\"CHTR\",\"78328422400\",\"466.64\",\"United States\"\n\"155\",\"Gilead Sciences\",\"GILD\",\"78325391360\",\"62.45\",\"United States\"\n\"156\",\"Airbus\",\"AIR.PA\",\"78078384459\",\"99.17\",\"Netherlands\"\n\"157\",\"SABIC\",\"2010.SR\",\"78013429632\",\"26\",\"Saudi Arabia\"\n\"158\",\"Applied Materials\",\"AMAT\",\"77725417472\",\"89.35\",\"United States\"\n\"159\",\"Siemens\",\"SIE.DE\",\"77468197840\",\"96.55\",\"Germany\"\n\"160\",\"Analog Devices\",\"ADI\",\"77321142272\",\"148.75\",\"United States\"\n\"161\",\"Canadian National Railway\",\"CNI\",\"77027328000\",\"111.44\",\"Canada\"\n\"162\",\"Altria Group\",\"MO\",\"76668166144\",\"42.35\",\"United States\"\n\"163\",\"Southern Company\",\"SO\",\"76607692800\",\"72.1\",\"United States\"\n\"164\",\"Infosys\",\"INFY\",\"76407988224\",\"18.17\",\"India\"\n\"165\",\"Merck KGaA\",\"MRK.DE\",\"76247297416\",\"176.92\",\"Germany\"\n\"166\",\"CME Group\",\"CME\",\"75446059008\",\"209.91\",\"United States\"\n\"167\",\"Stryker Corporation\",\"SYK\",\"75354742784\",\"199.27\",\"United States\"\n\"168\",\"Crown Castle\",\"CCI\",\"74888552448\",\"172.94\",\"United States\"\n\"169\",\"3M\",\"MMM\",\"74546733056\",\"131\",\"United States\"\n\"170\",\"Intuitive Surgical\",\"ISRG\",\"74311278592\",\"207.02\",\"United States\"\n\"171\",\"Northrop Grumman\",\"NOC\",\"74147258368\",\"477\",\"United States\"\n\"172\",\"Vertex Pharmaceuticals\",\"VRTX\",\"74020904960\",\"289.42\",\"United States\"\n\"173\",\"Inditex\",\"IDEXY\",\"73387630592\",\"11.78\",\"Spain\"\n\"174\",\"Petrobras\",\"PBR\",\"73373630464\",\"11.25\",\"Brazil\"\n\"175\",\"Brookfield Asset Management\",\"BAM\",\"73337307136\",\"44.68\",\"Canada\"\n\"176\",\"Allianz\",\"ALV.DE\",\"73295170799\",\"177.56\",\"Germany\"\n\"177\",\"Fomento Económico Mexicano\",\"FMX\",\"72901607424\",\"60.37\",\"Mexico\"\n\"178\",\"Hindustan Unilever\",\"HINDUNILVR.NS\",\"72388160781\",\"30.81\",\"India\"\n\"179\",\"LG Energy Solution\",\"373220.KS\",\"71759376859\",\"306.66\",\"South Korea\"\n\"180\",\"KDDI\",\"9433.T\",\"71515200856\",\"32.46\",\"Japan\"\n\"181\",\"Pinduoduo\",\"PDD\",\"70906994688\",\"56.08\",\"China\"\n\"182\",\"Booking.com\",\"BKNG\",\"70722723840\",\"1740.94\",\"United States\"\n\"183\",\"Progressive\",\"PGR\",\"69725921280\",\"119.21\",\"United States\"\n\"184\",\"Scotiabank\",\"BNS\",\"69618311168\",\"57.86\",\"Canada\"\n\"185\",\"Blackstone Group\",\"BX\",\"69571920000\",\"96.36\",\"United States\"\n\"186\",\"TJX Companies\",\"TJX\",\"69278605312\",\"59.13\",\"United States\"\n\"187\",\"General Electric\",\"GE\",\"68956348416\",\"62.65\",\"United States\"\n\"188\",\"Becton Dickinson\",\"BDX\",\"68917313536\",\"241.76\",\"United States\"\n\"189\",\"Target\",\"TGT\",\"68803215360\",\"148.38\",\"United States\"\n\"190\",\"Postal Savings Bank of China\",\"601658.SS\",\"68796334378\",\"0.76\",\"China\"\n\"191\",\"U.S. Bancorp\",\"USB\",\"68745191424\",\"46.27\",\"United States\"\n\"192\",\"Sinopec\",\"SNP\",\"68631175168\",\"43.73\",\"China\"\n\"193\",\"Moderna\",\"MRNA\",\"68466429952\",\"172.13\",\"United States\"\n\"194\",\"Mitsubishi UFJ Financial\",\"MUFG\",\"67919392768\",\"5.39\",\"Japan\"\n\"195\",\"Regeneron Pharmaceuticals\",\"REGN\",\"67411390464\",\"613.69\",\"United States\"\n\"196\",\"Air Liquide\",\"AI.PA\",\"67053509309\",\"128.53\",\"France\"\n\"197\",\"LONGi Green Energy Technology\",\"601012.SS\",\"66441263206\",\"8.76\",\"China\"\n\"198\",\"Canadian Pacific Railway\",\"CP\",\"66365038592\",\"71.37\",\"Canada\"\n\"199\",\"ICICI Bank\",\"IBN\",\"66358902784\",\"19.08\",\"India\"\n\"200\",\"Colgate-Palmolive\",\"CL\",\"66247692288\",\"79.06\",\"United States\"\n\"201\",\"Glencore\",\"GLCNF\",\"65910607872\",\"5.03\",\"Switzerland\"\n\"202\",\"PNC Financial Services\",\"PNC\",\"65668390912\",\"158.78\",\"United States\"\n\"203\",\"Bank of Montreal\",\"BMO\",\"65290514432\",\"96.42\",\"Canada\"\n\"204\",\"Sherwin-Williams\",\"SHW\",\"64902684672\",\"249.5\",\"United States\"\n\"205\",\"Dominion Energy\",\"D\",\"64836698112\",\"79.92\",\"United States\"\n\"206\",\"EssilorLuxottica\",\"EL.PA\",\"64815075169\",\"145.8\",\"France\"\n\"207\",\"Micron Technology\",\"MU\",\"64732839936\",\"58.68\",\"United States\"\n\"208\",\"Schneider Electric\",\"SU.PA\",\"64583495690\",\"115.9\",\"France\"\n\"209\",\"Zurich Insurance Group\",\"ZURN.SW\",\"63836780707\",\"430.48\",\"Switzerland\"\n\"210\",\"Waste Management\",\"WM\",\"63725969408\",\"153.48\",\"United States\"\n\"211\",\"Iberdrola\",\"IBE.MC\",\"63707956642\",\"10.2\",\"Spain\"\n\"212\",\"Nongfu Spring\",\"9633.HK\",\"63684359373\",\"5.66\",\"China\"\n\"213\",\"Truist Financial\",\"TFC\",\"63117758464\",\"47.41\",\"United States\"\n\"214\",\"America Movil\",\"AMX\",\"62997082112\",\"19.71\",\"Mexico\"\n\"215\",\"Vale\",\"VALE\",\"62857179136\",\"13.26\",\"Brazil\"\n\"216\",\"Midea\",\"000333.SZ\",\"62540821091\",\"8.94\",\"China\"\n\"217\",\"Humana\",\"HUM\",\"61536317440\",\"486.48\",\"United States\"\n\"218\",\"CSX Corporation\",\"CSX\",\"61488074752\",\"28.28\",\"United States\"\n\"219\",\"Kering\",\"KER.PA\",\"61436474433\",\"497.79\",\"France\"\n\"220\",\"National Australia Bank\",\"NAB.AX\",\"61399004005\",\"19.02\",\"Australia\"\n\"221\",\"General Dynamics\",\"GD\",\"61331398656\",\"220.85\",\"United States\"\n\"222\",\"Activision Blizzard\",\"ATVI\",\"61111824384\",\"78.16\",\"United States\"\n\"223\",\"Airbnb\",\"ABNB\",\"60882583552\",\"95.66\",\"United States\"\n\"224\",\"Edwards Lifesciences\",\"EW\",\"60850868224\",\"97.87\",\"United States\"\n\"225\",\"SoftBank\",\"9984.T\",\"60702771275\",\"38.16\",\"Japan\"\n\"226\",\"Fiserv\",\"FISV\",\"60696395776\",\"93.9\",\"United States\"\n\"227\",\"Industrial Bank\",\"601166.SS\",\"59562283228\",\"2.87\",\"China\"\n\"228\",\"CNOOC\",\"0883.HK\",\"59472837162\",\"1.25\",\"China\"\n\"229\",\"China Tourism Group Duty Free\",\"601888.SS\",\"59098487748\",\"30.27\",\"China\"\n\"230\",\"Bank Central Asia\",\"BBCA.JK\",\"59025566624\",\"0.48\",\"Indonesia\"\n\"231\",\"Aon\",\"AON\",\"58756030464\",\"276.65\",\"United Kingdom\"\n\"232\",\"Equinix\",\"EQIX\",\"58737278976\",\"645.31\",\"United States\"\n\"233\",\"Hong Kong Exchanges & Clearing\",\"0388.HK\",\"58726209021\",\"46.32\",\"Hong Kong\"\n\"234\",\"Compagnie Financière Richemont\",\"CFR.SW\",\"58713235001\",\"103.47\",\"Switzerland\"\n\"235\",\"Foshan Haitian Flavouring and Food\",\"603288.SS\",\"58332025005\",\"12.59\",\"China\"\n\"236\",\"FedEx\",\"FDX\",\"58248957952\",\"224.75\",\"United States\"\n\"237\",\"United Heavy Machinery\",\"OMZZP.ME\",\"58162943422\",\"68.7\",\"Russia\"\n\"238\",\"EOG Resources\",\"EOG\",\"58003161088\",\"99.03\",\"United States\"\n\"239\",\"Dollar General\",\"DG\",\"57786626048\",\"254.57\",\"United States\"\n\"240\",\"Bayer\",\"BAYZF\",\"57762664448\",\"57.68\",\"Germany\"\n\"241\",\"Fidelity National Information Services\",\"FIS\",\"57697112064\",\"94.91\",\"United States\"\n\"242\",\"Illinois Tool Works\",\"ITW\",\"57582698496\",\"184.89\",\"United States\"\n\"243\",\"Walmex\",\"WMMVF\",\"57335689216\",\"3.24\",\"Mexico\"\n\"244\",\"NetEase\",\"NTES\",\"57259651072\",\"87.18\",\"China\"\n\"245\",\"Life Insurance Corporation of India (LIC)\",\"LICI.NS\",\"57114731940\",\"9.03\",\"India\"\n\"246\",\"Mercedes-Benz\",\"MBG.DE\",\"56972073315\",\"53.25\",\"Germany\"\n\"247\",\"Rosneft\",\"ROSN.ME\",\"56669219081\",\"5.97\",\"Russia\"\n\"248\",\"DBS Group\",\"D05.SI\",\"56341976050\",\"21.86\",\"Singapore\"\n\"249\",\"Mindray\",\"300760.SZ\",\"56326308614\",\"46.46\",\"China\"\n\"250\",\"Lam Research\",\"LRCX\",\"56281530368\",\"405.74\",\"United States\"\n\"251\",\"UBS\",\"UBS\",\"56033374208\",\"15.88\",\"Switzerland\"\n\"252\",\"Public Storage\",\"PSA\",\"55115890688\",\"313.13\",\"United States\"\n\"253\",\"Canadian Natural Resources\",\"CNQ\",\"54877323264\",\"47.54\",\"Canada\"\n\"254\",\"Siemens Healthineers\",\"SHL.DE\",\"54502265629\",\"48.55\",\"Germany\"\n\"255\",\"State Bank of India\",\"SBIN.NS\",\"54473674788\",\"6.1\",\"India\"\n\"256\",\"Reckitt Benckiser\",\"RKT.L\",\"54187486436\",\"7574.08\",\"United Kingdom\"\n\"257\",\"Heineken\",\"HEIA.AS\",\"53953714647\",\"93.74\",\"Netherlands\"\n\"258\",\"Intercontinental Exchange\",\"ICE\",\"53800095744\",\"96.37\",\"United States\"\n\"259\",\"Boston Scientific\",\"BSX\",\"53794721792\",\"37.63\",\"United States\"\n\"260\",\"Enterprise Products\",\"EPD\",\"53660876800\",\"24.61\",\"United States\"\n\"261\",\"BNP Paribas\",\"BNP.PA\",\"53500106844\",\"43.38\",\"France\"\n\"262\",\"Investor AB\",\"IVS.F\",\"53287584370\",\"18.05\",\"Sweden\"\n\"263\",\"Enel\",\"ENEL.MI\",\"53178304161\",\"5.22\",\"Italy\"\n\"264\",\"Occidental Petroleum\",\"OXY\",\"53026267136\",\"56.58\",\"United States\"\n\"265\",\"Norfolk Southern\",\"NSC\",\"52740706304\",\"221.29\",\"United States\"\n\"266\",\"Moody's\",\"MCO\",\"52438589440\",\"284.22\",\"United States\"\n\"267\",\"Saudi Telecom Company\",\"7010.SR\",\"52147685099\",\"26.11\",\"Saudi Arabia\"\n\"268\",\"Air Products and Chemicals\",\"APD\",\"52090040320\",\"234.88\",\"United States\"\n\"269\",\"Thomson Reuters\",\"TRI\",\"51974729728\",\"106.52\",\"Canada\"\n\"270\",\"RELX\",\"RELX\",\"51832664064\",\"26.97\",\"United Kingdom\"\n\"271\",\"Monster Beverage\",\"MNST\",\"51748855808\",\"97.7\",\"United States\"\n\"272\",\"Liberty Bancshares\",\"LBSI\",\"51685834752\",\"66.56\",\"United States\"\n\"273\",\"Palo Alto Networks\",\"PANW\",\"51661709312\",\"515\",\"United States\"\n\"274\",\"ABB\",\"ABB\",\"51578695680\",\"26.61\",\"Switzerland\"\n\"275\",\"London Stock Exchange\",\"LS4C.F\",\"51571333599\",\"91.5\",\"United Kingdom\"\n\"276\",\"Keurig Dr Pepper\",\"KDP\",\"51500457984\",\"36.31\",\"United States\"\n\"277\",\"Eaton\",\"ETN\",\"51263516672\",\"128.48\",\"Ireland\"\n\"278\",\"Fast Retailing\",\"9983.T\",\"51152133899\",\"500.78\",\"Japan\"\n\"279\",\"Sberbank\",\"SBER.ME\",\"51004713573\",\"2.26\",\"Russia\"\n\"280\",\"Centene\",\"CNC\",\"50885165056\",\"87\",\"United States\"\n\"281\",\"Housing Development Finance Corporation\",\"HDFC.NS\",\"50820582823\",\"28.01\",\"India\"\n\"282\",\"Nintendo\",\"7974.T\",\"50580466642\",\"434.46\",\"Japan\"\n\"283\",\"MetLife\",\"MET\",\"50561085440\",\"62.18\",\"United States\"\n\"284\",\"Novatek\",\"NVTK.ME\",\"50524683940\",\"16.87\",\"Russia\"\n\"285\",\"Daiichi Sankyō\",\"4568.T\",\"50499079512\",\"26.35\",\"Japan\"\n\"286\",\"Hapag-Lloyd\",\"HLAG.DE\",\"50376528957\",\"283.16\",\"Germany\"\n\"287\",\"Muyuan Foods\",\"002714.SZ\",\"50257023990\",\"9.44\",\"China\"\n\"288\",\"HCA Healthcare\",\"HCA\",\"50209378304\",\"169.92\",\"United States\"\n\"289\",\"Pioneer Natural Resources\",\"PXD\",\"49988730880\",\"206.6\",\"United States\"\n\"290\",\"Recruit\",\"6098.T\",\"49960211199\",\"31.05\",\"Japan\"\n\"291\",\"TC Energy\",\"TRP\",\"49863196672\",\"50.7\",\"Canada\"\n\"292\",\"Fortinet\",\"FTNT\",\"49806376960\",\"62.05\",\"United States\"\n\"293\",\"Baidu\",\"BIDU\",\"49384947712\",\"142.44\",\"China\"\n\"294\",\"Vinci\",\"DG.PA\",\"49287252432\",\"87.13\",\"France\"\n\"295\",\"American Electric Power\",\"AEP\",\"49079398400\",\"95.57\",\"United States\"\n\"296\",\"Atlassian\",\"TEAM\",\"49067483136\",\"193.57\",\"Australia\"\n\"297\",\"SK Hynix\",\"000660.KS\",\"49064590654\",\"71.35\",\"South Korea\"\n\"298\",\"Bharti Airtel\",\"BHARTIARTL.NS\",\"49043471562\",\"8.34\",\"India\"\n\"299\",\"Dassault Systèmes\",\"DSY.PA\",\"49038131612\",\"37.62\",\"France\"\n\"300\",\"China Telecom\",\"0728.HK\",\"48866688441\",\"0.35\",\"China\"\n\"301\",\"AXA\",\"CS.PA\",\"48822738437\",\"21.5\",\"France\"\n\"302\",\"Snowflake\",\"SNOW\",\"48573870080\",\"152.7\",\"United States\"\n\"303\",\"BMW\",\"BMW.DE\",\"48400963700\",\"73.84\",\"Germany\"\n\"304\",\"Synopsys\",\"SNPS\",\"48324751360\",\"315.91\",\"United States\"\n\"305\",\"National Grid\",\"NGG\",\"47789305856\",\"65.47\",\"United Kingdom\"\n\"306\",\"McKesson\",\"MCK\",\"47787528192\",\"330.95\",\"United States\"\n\"307\",\"Kraft Heinz\",\"KHC\",\"47706955776\",\"38.98\",\"United States\"\n\"308\",\"Emerson\",\"EMR\",\"47603929088\",\"80.14\",\"United States\"\n\"309\",\"Shin-Etsu Chemical\",\"4063.T\",\"47578818234\",\"115.33\",\"Japan\"\n\"310\",\"Tokyo Electron\",\"8035.T\",\"47554904096\",\"305.33\",\"Japan\"\n\"311\",\"Vmware\",\"VMW\",\"47538995200\",\"112.8\",\"United States\"\n\"312\",\"Westpac Banking\",\"WBC.AX\",\"47502607558\",\"13.59\",\"Australia\"\n\"313\",\"Bank of Communications\",\"601328.SS\",\"47165156457\",\"0.69\",\"China\"\n\"314\",\"Ørsted\",\"DOGEF\",\"46992867328\",\"111.4\",\"Denmark\"\n\"315\",\"Daikin\",\"6367.T\",\"46857195400\",\"160.09\",\"Japan\"\n\"316\",\"Foxconn (Hon Hai Precision Industry)\",\"2317.TW\",\"46683448783\",\"3.37\",\"Taiwan\"\n\"317\",\"Sempra Energy\",\"SRE\",\"46608285696\",\"148.29\",\"United States\"\n\"318\",\"Newmont\",\"NEM\",\"46349221888\",\"58.4\",\"United States\"\n\"319\",\"Marriott International\",\"MAR\",\"46090104832\",\"140.82\",\"United States\"\n\"320\",\"Constellation Brands\",\"STZ\",\"46058692608\",\"241.75\",\"United States\"\n\"321\",\"Schlumberger\",\"SLB\",\"46008119296\",\"32.55\",\"United States\"\n\"322\",\"Atlas Copco\",\"ATCO-B.ST\",\"46002917355\",\"8.55\",\"Sweden\"\n\"323\",\"Adani Green Energy\",\"ADANIGREEN.NS\",\"45843912306\",\"28.86\",\"India\"\n\"324\",\"Kimberly-Clark\",\"KMB\",\"45700644864\",\"135.64\",\"United States\"\n\"325\",\"General Mills\",\"GIS\",\"45658701824\",\"76.46\",\"United States\"\n\"326\",\"The Hershey Company\",\"HSY\",\"45656645632\",\"222.06\",\"United States\"\n\"327\",\"Samsung Biologics\",\"207940.KS\",\"45610158120\",\"637.8\",\"South Korea\"\n\"328\",\"Hikvision\",\"002415.SZ\",\"45591390965\",\"4.83\",\"China\"\n\"329\",\"Hitachi\",\"6501.T\",\"45513616919\",\"47.35\",\"Japan\"\n\"330\",\"East Money Information\",\"300059.SZ\",\"45472018864\",\"3.44\",\"China\"\n\"331\",\"General Motors\",\"GM\",\"45467922432\",\"31.18\",\"United States\"\n\"332\",\"ITC\",\"ITC.NS\",\"45454863826\",\"3.68\",\"India\"\n\"333\",\"Adyen\",\"ADYEN.AS\",\"45439376539\",\"1467.07\",\"Netherlands\"\n\"334\",\"Pernod Ricard\",\"RI.PA\",\"45369874277\",\"179.49\",\"France\"\n\"335\",\"KLA\",\"KLAC\",\"45263466496\",\"317.22\",\"United States\"\n\"336\",\"L3Harris Technologies\",\"LHX\",\"45221474304\",\"234.46\",\"United States\"\n\"337\",\"Takeda Pharmaceutical\",\"TAK\",\"45028302848\",\"14.5\",\"Japan\"\n\"338\",\"Ford\",\"F\",\"44997832704\",\"11.4\",\"United States\"\n\"339\",\"Bajaj Finance\",\"BAJFINANCE.NS\",\"44725276759\",\"73.87\",\"India\"\n\"340\",\"WuXi AppTec\",\"2359.HK\",\"44569958476\",\"13.67\",\"China\"\n\"341\",\"Anglo American\",\"AAL.L\",\"44560876178\",\"3213.52\",\"United Kingdom\"\n\"342\",\"Sysco\",\"SYY\",\"44492541952\",\"87.33\",\"United States\"\n\"343\",\"Ecolab\",\"ECL\",\"44490768384\",\"155.75\",\"United States\"\n\"344\",\"Chugai Pharmaceutical\",\"4519.T\",\"44476216931\",\"27.05\",\"Japan\"\n\"345\",\"BCE\",\"BCE\",\"44400099328\",\"48.7\",\"Canada\"\n\"346\",\"Oriental Land\",\"4661.T\",\"44200711170\",\"134.95\",\"Japan\"\n\"347\",\"CIBC\",\"CM\",\"44183601152\",\"48.67\",\"Canada\"\n\"348\",\"Marathon Petroleum\",\"MPC\",\"44161421312\",\"81.63\",\"United States\"\n\"349\",\"Deutsche Post\",\"DPW.DE\",\"44030088945\",\"35.98\",\"Germany\"\n\"350\",\"Kuaishou Technology\",\"1024.HK\",\"43991504193\",\"10.25\",\"China\"\n\"351\",\"Cadence Design Systems\",\"CDNS\",\"43989078016\",\"159.52\",\"United States\"\n\"352\",\"Exelon Corporation\",\"EXC\",\"43844792320\",\"44.73\",\"United States\"\n\"353\",\"Macquarie\",\"MQG.AX\",\"43815332592\",\"113.34\",\"Australia\"\n\"354\",\"Nornickel\",\"GMKN.ME\",\"43636719546\",\"283.99\",\"Russia\"\n\"355\",\"O'Reilly Automotive\",\"ORLY\",\"43592699904\",\"663.26\",\"United States\"\n\"356\",\"Maersk\",\"DP4A.F\",\"43546093723\",\"2306.69\",\"Denmark\"\n\"357\",\"Suncor Energy\",\"SU\",\"43243556864\",\"30.59\",\"Canada\"\n\"358\",\"Vodafone\",\"VOD\",\"43209293824\",\"15.32\",\"United Kingdom\"\n\"359\",\"Lukoil\",\"LKOH.ME\",\"43201620616\",\"66.43\",\"Russia\"\n\"360\",\"Wanhua Chemical\",\"600309.SS\",\"43194032529\",\"13.76\",\"China\"\n\"361\",\"ANZ Bank\",\"ANZ.AX\",\"43175575215\",\"15.35\",\"Australia\"\n\"362\",\"Kotak Mahindra Bank\",\"KOTAKBANK.NS\",\"42924670528\",\"21.62\",\"India\"\n\"363\",\"Safran\",\"SAF.PA\",\"42691197361\",\"100\",\"France\"\n\"364\",\"AutoZone\",\"AZO\",\"42428403712\",\"2177.2\",\"United States\"\n\"365\",\"CrowdStrike\",\"CRWD\",\"42415800320\",\"182.77\",\"United States\"\n\"366\",\"Lonza\",\"LONN.SW\",\"42258575330\",\"568.89\",\"Switzerland\"\n\"367\",\"Roper Technologies\",\"ROP\",\"42250285056\",\"398.92\",\"United States\"\n\"368\",\"Paychex\",\"PAYX\",\"42198274048\",\"117.25\",\"United States\"\n\"369\",\"Capital One\",\"COF\",\"42174373888\",\"107.3\",\"United States\"\n\"370\",\"CITIC Securities\",\"600030.SS\",\"42155743279\",\"3.01\",\"China\"\n\"371\",\"Valero Energy\",\"VLO\",\"41993080832\",\"102.9\",\"United States\"\n\"372\",\"Uber\",\"UBER\",\"41992871936\",\"21.39\",\"United States\"\n\"373\",\"Realty Income\",\"O\",\"41883254784\",\"69.62\",\"United States\"\n\"374\",\"Bank Rakyat Indonesia\",\"BYRA.F\",\"41618214226\",\"0.26\",\"Indonesia\"\n\"375\",\"Ping An Bank\",\"000001.SZ\",\"41613961470\",\"2.14\",\"China\"\n\"376\",\"Mitsubishi Corporation\",\"8058.T\",\"41579827574\",\"28.16\",\"Japan\"\n\"377\",\"Nutrien\",\"NTR\",\"41556250624\",\"74.92\",\"Canada\"\n\"378\",\"Republic Services\",\"RSG\",\"41337495552\",\"130.86\",\"United States\"\n\"379\",\"IQVIA\",\"IQV\",\"41335693312\",\"218.39\",\"United States\"\n\"380\",\"Santander\",\"SAN\",\"41277276160\",\"2.46\",\"Spain\"\n\"381\",\"Archer Daniels Midland (ADM)\",\"ADM\",\"41027039232\",\"72.91\",\"United States\"\n\"382\",\"Honda\",\"HMC\",\"40985972736\",\"23.96\",\"Japan\"\n\"383\",\"Alimentation Couche-Tard\",\"ATD.TO\",\"40978640490\",\"40.05\",\"Canada\"\n\"384\",\"Sumitomo Mitsui Financial Group\",\"SMFG\",\"40955514880\",\"5.98\",\"Japan\"\n\"385\",\"American International Group\",\"AIG\",\"40940482560\",\"51.68\",\"United States\"\n\"386\",\"KKR & Co.\",\"KKR\",\"40930082816\",\"48\",\"United States\"\n\"387\",\"Itōchū Shōji\",\"8001.T\",\"40872562434\",\"27.77\",\"Japan\"\n\"388\",\"WuXi Biologics\",\"WXXWY\",\"40697753600\",\"19.31\",\"China\"\n\"389\",\"Shopify\",\"SHOP\",\"40466481152\",\"32.08\",\"Canada\"\n\"390\",\"Tokio Marine\",\"8766.T\",\"40461255380\",\"60.07\",\"Japan\"\n\"391\",\"The Travelers Companies\",\"TRV\",\"40441827328\",\"168.54\",\"United States\"\n\"392\",\"Denso\",\"6902.T\",\"40406937165\",\"52.93\",\"Japan\"\n\"393\",\"NXP Semiconductors\",\"NXPI\",\"40400875520\",\"153.87\",\"Netherlands\"\n\"394\",\"Sea (Garena)\",\"SE\",\"40400195584\",\"71.92\",\"Singapore\"\n\"395\",\"Woodside Energy\",\"WDS\",\"39997214720\",\"20.56\",\"Australia\"\n\"396\",\"EDF (Electricité de France)\",\"EDF.PA\",\"39682723459\",\"10.26\",\"France\"\n\"397\",\"Itaú Unibanco\",\"ITUB\",\"39643025408\",\"4.05\",\"Brazil\"\n\"398\",\"BioNTech\",\"BNTX\",\"39420112896\",\"162.21\",\"Germany\"\n\"399\",\"ENI\",\"E\",\"39257710592\",\"22.18\",\"Italy\"\n\"400\",\"Cintas\",\"CTAS\",\"39170519040\",\"382.81\",\"United States\"\n\"401\",\"Amphenol\",\"APH\",\"39064764416\",\"65.42\",\"United States\"\n\"402\",\"Xiaomi\",\"XIACF\",\"39041183744\",\"1.56\",\"China\"\n\"403\",\"Marvell Technology Group\",\"MRVL\",\"39038627840\",\"45.93\",\"United States\"\n\"404\",\"Ambev\",\"ABEV\",\"39033462784\",\"2.48\",\"Brazil\"\n\"405\",\"YANGHE\",\"002304.SZ\",\"38868666275\",\"25.79\",\"China\"\n\"406\",\"Bank of China (Hong Kong)\",\"2388.HK\",\"38790566845\",\"3.67\",\"Hong Kong\"\n\"407\",\"BASF\",\"BAS.DE\",\"38780223710\",\"42.22\",\"Germany\"\n\"408\",\"Adani Total Gas\",\"ATGL.NS\",\"38706103498\",\"35.19\",\"India\"\n\"409\",\"Autodesk\",\"ADSK\",\"38622769152\",\"177.76\",\"United States\"\n\"410\",\"Stellantis\",\"STLA\",\"38392586240\",\"12.26\",\"Netherlands\"\n\"411\",\"Xcel Energy\",\"XEL\",\"38314487808\",\"70.35\",\"United States\"\n\"412\",\"Freeport-McMoRan\",\"FCX\",\"38229250048\",\"26.37\",\"United States\"\n\"413\",\"Compass Group\",\"CPG.L\",\"38167271842\",\"2153.24\",\"United Kingdom\"\n\"414\",\"Phillips 66\",\"PSX\",\"38122364928\",\"79.24\",\"United States\"\n\"415\",\"Adani Transmission\",\"ADANITRANS.NS\",\"38047871769\",\"34.59\",\"India\"\n\"416\",\"Banco Santander Brasil\",\"BSBR\",\"38042787840\",\"5.1\",\"Brazil\"\n\"417\",\"Corteva\",\"CTVA\",\"37965299712\",\"52.46\",\"United States\"\n\"418\",\"Budweiser APAC\",\"1876.HK\",\"37958801916\",\"2.87\",\"Hong Kong\"\n\"419\",\"Jardine Matheson\",\"J36.SI\",\"37895760000\",\"52.56\",\"Hong Kong\"\n\"420\",\"Block\",\"SQ\",\"37703794688\",\"64.95\",\"United States\"\n\"421\",\"TE Connectivity\",\"TEL\",\"37691576320\",\"113.93\",\"Switzerland\"\n\"422\",\"S.F. Express\",\"002352.SZ\",\"37657626877\",\"7.69\",\"China\"\n\"423\",\"Southern Copper\",\"SCCO\",\"37641748480\",\"48.69\",\"United States\"\n\"424\",\"Welltower\",\"WELL\",\"37636214784\",\"82.91\",\"United States\"\n\"425\",\"Dollar Tree\",\"DLTR\",\"37622112256\",\"167.54\",\"United States\"\n\"426\",\"Williams Companies\",\"WMB\",\"37599969280\",\"30.87\",\"United States\"\n\"427\",\"Kinder Morgan\",\"KMI\",\"37435932672\",\"16.51\",\"United States\"\n\"428\",\"Nidec\",\"6594.T\",\"37264206473\",\"64.62\",\"Japan\"\n\"429\",\"Dow\",\"DOW\",\"37256978432\",\"51.17\",\"United States\"\n\"430\",\"Simon Property Group\",\"SPG\",\"37024165888\",\"98.49\",\"United States\"\n\"431\",\"Verbund AG\",\"OEWA.F\",\"36857014765\",\"105.88\",\"Austria\"\n\"432\",\"Digital Realty\",\"DLR\",\"36771905536\",\"126.38\",\"United States\"\n\"433\",\"OCBC Bank\",\"O39.SI\",\"36731549362\",\"8.17\",\"Singapore\"\n\"434\",\"Agilent Technologies\",\"A\",\"36650807296\",\"122.09\",\"United States\"\n\"435\",\"lululemon athletica\",\"LULU\",\"36449734656\",\"285.56\",\"Canada\"\n\"436\",\"Great Wall Motors\",\"601633.SS\",\"36312608778\",\"5.01\",\"China\"\n\"437\",\"Workday\",\"WDAY\",\"36286439424\",\"142.86\",\"United States\"\n\"438\",\"Prudential Financial\",\"PRU\",\"36279525376\",\"96.75\",\"United States\"\n\"439\",\"Aflac\",\"AFL\",\"36208513024\",\"56.21\",\"United States\"\n\"440\",\"Chipotle Mexican Grill\",\"CMG\",\"36164608000\",\"1293.33\",\"United States\"\n\"441\",\"Motorola Solutions\",\"MSI\",\"35921174528\",\"214.72\",\"United States\"\n\"442\",\"Li Auto\",\"LI\",\"35884945408\",\"37.18\",\"China\"\n\"443\",\"Allstate\",\"ALL\",\"35670794240\",\"129.72\",\"United States\"\n\"444\",\"Ferrari\",\"RACE\",\"35639443456\",\"191.68\",\"Italy\"\n\"445\",\"ING\",\"ING\",\"35577761792\",\"9.23\",\"Netherlands\"\n\"446\",\"7-Eleven\",\"3382.T\",\"35426306526\",\"40.12\",\"Japan\"\n\"447\",\"MSCI\",\"MSCI\",\"35397861376\",\"435.57\",\"United States\"\n\"448\",\"Luxshare Precision\",\"002475.SZ\",\"35192810072\",\"4.97\",\"China\"\n\"449\",\"Arthur J. Gallagher & Co.\",\"AJG\",\"35192692736\",\"167.53\",\"United States\"\n\"450\",\"Sika\",\"SIKA.SW\",\"35188874825\",\"228.94\",\"Switzerland\"\n\"451\",\"Fortescue\",\"FMG.AX\",\"35154218347\",\"11.42\",\"Australia\"\n\"452\",\"Jiangsu Hengrui Medicine\",\"600276.SS\",\"34975643191\",\"5.48\",\"China\"\n\"453\",\"Asian Paints\",\"ASIANPAINT.NS\",\"34902598884\",\"36.39\",\"India\"\n\"454\",\"Alcon\",\"ALC\",\"34899640320\",\"70.44\",\"Switzerland\"\n\"455\",\"SBA Communications\",\"SBAC\",\"34897780736\",\"323.64\",\"United States\"\n\"456\",\"Lloyds Banking Group\",\"LYG\",\"34818658304\",\"1.98\",\"United Kingdom\"\n\"457\",\"China State Construction Engineering\",\"601668.SS\",\"34740253999\",\"0.83\",\"China\"\n\"458\",\"Electronic Arts\",\"EA\",\"34698182656\",\"124.23\",\"United States\"\n\"459\",\"Danone\",\"BN.PA\",\"34626047743\",\"54.16\",\"France\"\n\"460\",\"Yili Group\",\"600887.SS\",\"34625138400\",\"5.41\",\"China\"\n\"461\",\"Cognizant Technology Solutions\",\"CTSH\",\"34590322688\",\"66.37\",\"United States\"\n\"462\",\"Shanghai Pudong Development Bank\",\"600000.SS\",\"34526863637\",\"1.18\",\"China\"\n\"463\",\"Wesfarmers\",\"WES.AX\",\"34331634779\",\"30.27\",\"Australia\"\n\"464\",\"Murata Manufacturing (Murata Seisakusho)\",\"6981.T\",\"34324091587\",\"54.1\",\"Japan\"\n\"465\",\"Kroger\",\"KR\",\"34300368896\",\"47.94\",\"United States\"\n\"466\",\"Sun Hung Kai Properties\",\"0016.HK\",\"34297124771\",\"11.83\",\"Hong Kong\"\n\"467\",\"Bank of New York Mellon\",\"BK\",\"34064840704\",\"42.17\",\"United States\"\n\"468\",\"Zijin Mining\",\"601899.SS\",\"33931947428\",\"1.33\",\"China\"\n\"469\",\"Adani Enterprises\",\"ADANIENT.NS\",\"33919113816\",\"29.75\",\"India\"\n\"470\",\"NIO\",\"NIO\",\"33894887424\",\"20.29\",\"China\"\n\"471\",\"Intesa Sanpaolo\",\"ISP.MI\",\"33770904261\",\"1.7\",\"Italy\"\n\"472\",\"Devon Energy\",\"DVN\",\"33706199040\",\"51.07\",\"United States\"\n\"473\",\"Manulife Financial\",\"MFC\",\"33578180608\",\"17.27\",\"Canada\"\n\"474\",\"China Overseas Land &amp; Investment\",\"0688.HK\",\"33462832246\",\"3.06\",\"Hong Kong\"\n\"475\",\"Yum! Brands\",\"YUM\",\"33406963712\",\"117.15\",\"United States\"\n\"476\",\"Warner Bros. Discovery\",\"WBD\",\"33288810000\",\"13.83\",\"United States\"\n\"477\",\"AIER Eye Hospital\",\"300015.SZ\",\"33285517067\",\"4.73\",\"China\"\n\"478\",\"Brown Forman\",\"BF-A\",\"33279332352\",\"68.31\",\"United States\"\n\"479\",\"Prudential\",\"PUK\",\"33260937216\",\"23.87\",\"United Kingdom\"\n\"480\",\"Mitsui Bussan\",\"8031.T\",\"33228178527\",\"20.91\",\"Japan\"\n\"481\",\"Neste\",\"NESTE.HE\",\"33225672913\",\"43.26\",\"Finland\"\n\"482\",\"Bank of Ningbo\",\"002142.SZ\",\"33172618650\",\"5.02\",\"China\"\n\"483\",\"Naspers\",\"NPSNY\",\"33147598848\",\"30.77\",\"South Africa\"\n\"484\",\"Cenovus Energy\",\"CVE\",\"33133355008\",\"16.72\",\"Canada\"\n\"485\",\"MercadoLibre\",\"MELI\",\"33098346496\",\"657\",\"Argentina\"\n\"486\",\"Consolidated Edison\",\"ED\",\"33087610880\",\"93.39\",\"United States\"\n\"487\",\"Johnson Controls\",\"JCI\",\"33065146368\",\"47.53\",\"Ireland\"\n\"488\",\"Hoya\",\"7741.T\",\"33010072838\",\"91.39\",\"Japan\"\n\"489\",\"Microchip Technology\",\"MCHP\",\"32981719040\",\"59.48\",\"United States\"\n\"490\",\"Nordea Bank\",\"NDA-FI.HE\",\"32963714252\",\"8.8\",\"Finland\"\n\"491\",\"Walgreens Boots Alliance\",\"WBA\",\"32962762752\",\"38.14\",\"United States\"\n\"492\",\"Volvo Group\",\"VOLVF\",\"32942080000\",\"15.29\",\"Sweden\"\n\"493\",\"HP\",\"HPQ\",\"32833945600\",\"31.75\",\"United States\"\n\"494\",\"Banco Bradesco\",\"BBD\",\"32828178432\",\"3.08\",\"Brazil\"\n\"495\",\"MTR Corporation\",\"0066.HK\",\"32782946422\",\"5.29\",\"Hong Kong\"\n\"496\",\"MediaTek\",\"2454.TW\",\"32740699373\",\"20.58\",\"Taiwan\"\n\"497\",\"ResMed\",\"RMD\",\"32598441984\",\"219.11\",\"United States\"\n\"498\",\"Zoom\",\"ZM\",\"32526184448\",\"109.01\",\"United States\"\n\"499\",\"Baxter\",\"BAX\",\"32517902336\",\"64.58\",\"United States\"\n\"500\",\"Chunghwa Telecom\",\"CHT\",\"32468807680\",\"41.86\",\"Taiwan\"\n\"501\",\"Seagen\",\"SGEN\",\"32344913920\",\"175.72\",\"United States\"\n\"502\",\"Anta Sports\",\"AS7.F\",\"32279661659\",\"11.9\",\"China\"\n\"503\",\"Hang Seng Bank\",\"0011.HK\",\"32270898416\",\"16.88\",\"Hong Kong\"\n\"504\",\"Givaudan\",\"GIVN.SW\",\"32193741568\",\"3491.12\",\"Switzerland\"\n\"505\",\"COSCO Shipping\",\"601919.SS\",\"32149213756\",\"2.16\",\"China\"\n\"506\",\"Waste Connections\",\"WCN\",\"32144594944\",\"125\",\"United States\"\n\"507\",\"Parker-Hannifin\",\"PH\",\"32134080512\",\"250.32\",\"United States\"\n\"508\",\"Veeva Systems\",\"VEEV\",\"32056428544\",\"207.02\",\"United States\"\n\"509\",\"Maruti Suzuki India\",\"MARUTI.NS\",\"31989522640\",\"105.9\",\"India\"\n\"510\",\"WEC Energy Group\",\"WEC\",\"31940950016\",\"101.26\",\"United States\"\n\"511\",\"Maaden\",\"1211.SR\",\"31935271806\",\"12.98\",\"Saudi Arabia\"\n\"512\",\"UOB\",\"U11.SI\",\"31910380516\",\"19.06\",\"Singapore\"\n\"513\",\"Datadog\",\"DDOG\",\"31882868736\",\"101.21\",\"United States\"\n\"514\",\"DSV\",\"DSV.VI\",\"31849153319\",\"139.37\",\"Denmark\"\n\"515\",\"Dell\",\"DELL\",\"31847342080\",\"43.07\",\"United States\"\n\"516\",\"Constellation Software\",\"CSU.TO\",\"31846662697\",\"1502.8\",\"Canada\"\n\"517\",\"Biogen\",\"BIIB\",\"31845986304\",\"217.45\",\"United States\"\n\"518\",\"Global Payments\",\"GPN\",\"31816835072\",\"113.01\",\"United States\"\n\"519\",\"Hilton Worldwide\",\"HLT\",\"31750721536\",\"114.08\",\"United States\"\n\"520\",\"Silergy\",\"6415.TW\",\"31651959760\",\"83.27\",\"China\"\n\"521\",\"IDEXX Laboratories\",\"IDXX\",\"31643832320\",\"376.68\",\"United States\"\n\"522\",\"DMart\",\"DMART.NS\",\"31601242379\",\"48.78\",\"India\"\n\"523\",\"HCL Technologies\",\"HCLTECH.NS\",\"31592785377\",\"11.67\",\"India\"\n\"524\",\"Carrier\",\"CARR\",\"31427364864\",\"37.05\",\"United States\"\n\"525\",\"Grupo México\",\"GMBXF\",\"31385446400\",\"3.98\",\"Mexico\"\n\"526\",\"Arista Networks\",\"ANET\",\"31350745088\",\"102.02\",\"United States\"\n\"527\",\"Hyundai\",\"HYMTF\",\"31325120512\",\"34.34\",\"South Korea\"\n\"528\",\"Maybank\",\"MLYBY\",\"31312375808\",\"5.23\",\"Malaysia\"\n\"529\",\"Vanke\",\"2202.HK\",\"31180951322\",\"2.35\",\"China\"\n\"530\",\"PSEG\",\"PEG\",\"31133782016\",\"62.34\",\"United States\"\n\"531\",\"Lucid Motors\",\"LCID\",\"31071858688\",\"18.63\",\"United States\"\n\"532\",\"BAE Systems\",\"BSP.F\",\"31046901575\",\"9.83\",\"United Kingdom\"\n\"533\",\"Munich RE (Münchener Rück)\",\"MUV2.DE\",\"30964065174\",\"221.02\",\"Germany\"\n\"534\",\"Adidas\",\"ADS.DE\",\"30944614838\",\"161.09\",\"Germany\"\n\"535\",\"Cheniere Energy\",\"LNG\",\"30885513216\",\"121.53\",\"United States\"\n\"536\",\"Trane Technologies\",\"TT\",\"30860167168\",\"131.96\",\"Ireland\"\n\"537\",\"Apollo Global Management\",\"APO\",\"30780000256\",\"51.3\",\"United States\"\n\"538\",\"Japan Tobacco\",\"2914.T\",\"30734430180\",\"17.32\",\"Japan\"\n\"539\",\"Singtel\",\"Z74.SI\",\"30655097381\",\"1.88\",\"Singapore\"\n\"540\",\"Loblaw Companies\",\"L.TO\",\"30598907599\",\"91.54\",\"Canada\"\n\"541\",\"CITIC Bank\",\"601998.SS\",\"30596231300\",\"0.71\",\"China\"\n\"542\",\"Woolworths Group\",\"WOW.AX\",\"30576051614\",\"25.12\",\"Australia\"\n\"543\",\"Telus\",\"TU\",\"30549661696\",\"22.12\",\"Canada\"\n\"544\",\"Old Dominion Freight Line\",\"ODFL\",\"30523965440\",\"269.28\",\"United States\"\n\"545\",\"VICI Properties\",\"VICI\",\"30262337536\",\"31.43\",\"United States\"\n\"546\",\"Deutsche Börse\",\"DB1.DE\",\"30206204267\",\"164.5\",\"Germany\"\n\"547\",\"SAIC Motor\",\"600104.SS\",\"30179868895\",\"2.57\",\"China\"\n\"548\",\"CITIC limited\",\"0267.HK\",\"30165897051\",\"1.04\",\"China\"\n\"549\",\"Telstra\",\"TLS.AX\",\"30149384255\",\"2.61\",\"Australia\"\n\"550\",\"Tyson Foods\",\"TSN\",\"29923602432\",\"82.77\",\"United States\"\n\"551\",\"Illumina\",\"ILMN\",\"29889060864\",\"190.26\",\"United States\"\n\"552\",\"AmerisourceBergen\",\"ABC\",\"29886322688\",\"142.68\",\"United States\"\n\"553\",\"International Flavors & Fragrances\",\"IFF\",\"29810950144\",\"116.98\",\"United States\"\n\"554\",\"Barclays\",\"BCS\",\"29784672256\",\"7.2\",\"United Kingdom\"\n\"555\",\"Infineon\",\"IFX.DE\",\"29696706349\",\"22.81\",\"Germany\"\n\"556\",\"Barrick Gold\",\"GOLD\",\"29670825984\",\"16.68\",\"Canada\"\n\"557\",\"Otis Worldwide\",\"OTIS\",\"29582895104\",\"69.97\",\"United States\"\n\"558\",\"Transurban\",\"TCL.AX\",\"29517676004\",\"9.61\",\"Australia\"\n\"559\",\"Japan Post Bank\",\"7182.T\",\"29472872088\",\"7.86\",\"Japan\"\n\"560\",\"TransDigm\",\"TDG\",\"29429962752\",\"538.96\",\"United States\"\n\"561\",\"Fanuc\",\"6954.T\",\"29375321518\",\"153.14\",\"Japan\"\n\"562\",\"Mizuho Financial Group\",\"MFG\",\"29337997312\",\"2.32\",\"Japan\"\n\"563\",\"Fastenal\",\"FAST\",\"29298348032\",\"50.9\",\"United States\"\n\"564\",\"Gree Electric Appliances\",\"000651.SZ\",\"29252012361\",\"5.19\",\"China\"\n\"565\",\"Nucor\",\"NUE\",\"29234892800\",\"109.88\",\"United States\"\n\"566\",\"Larsen &amp; Toubro\",\"LT.NS\",\"29226829370\",\"20.8\",\"India\"\n\"567\",\"MPLX\",\"MPLX\",\"29194733568\",\"28.84\",\"United States\"\n\"568\",\"Eversource Energy\",\"ES\",\"29185095680\",\"84.22\",\"United States\"\n\"569\",\"Energy Transfer Partners\",\"ET\",\"29111977984\",\"9.44\",\"United States\"\n\"570\",\"LG Chem\",\"051910.KS\",\"29035879627\",\"393.08\",\"South Korea\"\n\"571\",\"Royalty Pharma\",\"RPRX\",\"29022887936\",\"43.05\",\"United Kingdom\"\n\"572\",\"Orange\",\"ORAN\",\"29004179456\",\"10.71\",\"France\"\n\"573\",\"Astellas Pharma\",\"4503.T\",\"28922668451\",\"15.83\",\"Japan\"\n\"574\",\"Hexagon\",\"HXGBF\",\"28862496768\",\"10.79\",\"Sweden\"\n\"575\",\"Hess\",\"HES\",\"28729577472\",\"92.3\",\"United States\"\n\"576\",\"LyondellBasell\",\"LYB\",\"28706449408\",\"87.63\",\"United States\"\n\"577\",\"Experian\",\"EXPGF\",\"28630034432\",\"30.85\",\"Ireland\"\n\"578\",\"China Pacific Insurance\",\"601601.SS\",\"28531854609\",\"3.25\",\"China\"\n\"579\",\"M&T Bank\",\"MTB\",\"28490520576\",\"158.8\",\"United States\"\n\"580\",\"People’s Insurance Company of China\",\"1339.HK\",\"28471188635\",\"0.3\",\"China\"\n\"581\",\"Foxconn Industrial Internet\",\"601138.SS\",\"28448347253\",\"1.43\",\"China\"\n\"582\",\"STMicroelectronics\",\"STM\",\"28430168064\",\"31.23\",\"Switzerland\"\n\"583\",\"DNB\",\"DNB.OL\",\"28423626770\",\"18.34\",\"Norway\"\n\"584\",\"Verisk Analytics\",\"VRSK\",\"28386199552\",\"179.77\",\"United States\"\n\"585\",\"Kühne + Nagel\",\"KNIN.SW\",\"28363932345\",\"237.19\",\"Switzerland\"\n\"586\",\"Discover Financial Services\",\"DFS\",\"28328294400\",\"100.83\",\"United States\"\n\"587\",\"Wipro\",\"WIT\",\"28326803456\",\"5.15\",\"India\"\n\"588\",\"Cummins\",\"CMI\",\"28274628608\",\"200.39\",\"United States\"\n\"589\",\"Capgemini\",\"CAP.PA\",\"28252307242\",\"165.71\",\"France\"\n\"590\",\"Dupont De Nemours\",\"DD\",\"28197822464\",\"55.45\",\"United States\"\n\"591\",\"SMC corp\",\"6273.T\",\"28004967723\",\"428.6\",\"Japan\"\n\"592\",\"Cellnex Telecom\",\"CLNX.MC\",\"27956886588\",\"41.23\",\"Spain\"\n\"593\",\"Equity Residential\",\"EQR\",\"27933915136\",\"71.61\",\"United States\"\n\"594\",\"Cerner\",\"CERN\",\"27915780096\",\"94.92\",\"United States\"\n\"595\",\"Paccar\",\"PCAR\",\"27910254592\",\"80.28\",\"United States\"\n\"596\",\"Swisscom\",\"SCMN.SW\",\"27897225615\",\"538.54\",\"Switzerland\"\n\"597\",\"Telefónica\",\"TEF\",\"27778904064\",\"4.81\",\"Spain\"\n\"598\",\"Mettler-Toledo\",\"MTD\",\"27673141248\",\"1220.14\",\"United States\"\n\"599\",\"Airports of Thailand\",\"AOT.BK\",\"27633442380\",\"1.93\",\"Thailand\"\n\"600\",\"American Water Works\",\"AWK\",\"27611004928\",\"151.92\",\"United States\"\n\"601\",\"Corning\",\"GLW\",\"27610363904\",\"32.69\",\"United States\"\n\"602\",\"Baker Hughes\",\"BKR\",\"27569195008\",\"27.15\",\"United States\"\n\"603\",\"Imperial Oil\",\"IMO\",\"27543427072\",\"42.58\",\"Canada\"\n\"604\",\"PPG Industries\",\"PPG\",\"27504791552\",\"116.45\",\"United States\"\n\"605\",\"NatWest Group\",\"NWG\",\"27461072896\",\"5.27\",\"United Kingdom\"\n\"606\",\"Banco Bilbao Vizcaya Argentaria\",\"BBVA\",\"27244232704\",\"4.11\",\"Spain\"\n\"607\",\"First Republic Bank\",\"FRC\",\"27220330496\",\"151.49\",\"United States\"\n\"608\",\"Copart\",\"CPRT\",\"27108980736\",\"114.06\",\"United States\"\n\"609\",\"Naturgy\",\"NTGY.MC\",\"26867509156\",\"27.96\",\"Spain\"\n\"610\",\"AvalonBay Communities\",\"AVB\",\"26862393344\",\"192.12\",\"United States\"\n\"611\",\"Samsung SDI\",\"006405.KS\",\"26815211489\",\"206.1\",\"South Korea\"\n\"612\",\"Naver\",\"035420.KS\",\"26775127887\",\"178.57\",\"South Korea\"\n\"613\",\"Enphase Energy\",\"ENPH\",\"26746345472\",\"198.08\",\"United States\"\n\"614\",\"Cement Roadstone Holding\",\"CRH\",\"26737291264\",\"34.65\",\"Ireland\"\n\"615\",\"Riyad Bank\",\"1010.SR\",\"26697219874\",\"8.9\",\"Saudi Arabia\"\n\"616\",\"Telkom Indonesia\",\"TLK\",\"26648188928\",\"26.65\",\"Indonesia\"\n\"617\",\"Sun Life Financial\",\"SLF\",\"26643374080\",\"45.3\",\"Canada\"\n\"618\",\"PTT PCL\",\"PTT-R.BK\",\"26638697971\",\"0.93\",\"Thailand\"\n\"619\",\"Anhui Conch Cement\",\"AHCHF\",\"26614216704\",\"4.41\",\"China\"\n\"620\",\"Saudi Electricity\",\"5110.SR\",\"26576832484\",\"6.38\",\"Saudi Arabia\"\n\"621\",\"Ross Stores\",\"ROST\",\"26468403200\",\"75.64\",\"United States\"\n\"622\",\"Formosa Petrochemical\",\"6505.TW\",\"26431737677\",\"2.77\",\"Taiwan\"\n\"623\",\"Thales\",\"HO.PA\",\"26430091777\",\"124.13\",\"France\"\n\"624\",\"Ahold Delhaize\",\"AD.AS\",\"26414101108\",\"26.46\",\"Netherlands\"\n\"625\",\"Hormel Foods\",\"HRL\",\"26407268352\",\"48.36\",\"United States\"\n\"626\",\"Rivian\",\"RIVN\",\"26367723520\",\"29.85\",\"United States\"\n\"627\",\"T. Rowe Price\",\"TROW\",\"26282350592\",\"115.63\",\"United States\"\n\"628\",\"D. R. Horton\",\"DHI\",\"26279041024\",\"74.65\",\"United States\"\n\"629\",\"Nasdaq\",\"NDAQ\",\"26251321344\",\"159.41\",\"United States\"\n\"630\",\"Henkel\",\"HEN3.DE\",\"26190993697\",\"60.98\",\"Germany\"\n\"631\",\"Japan Post Holdings\",\"6178.T\",\"26183242730\",\"7.19\",\"Japan\"\n\"632\",\"ENGIE\",\"ENGI.PA\",\"26171415682\",\"10.81\",\"France\"\n\"633\",\"China Securities\",\"601066.SS\",\"26052228978\",\"4.01\",\"China\"\n\"634\",\"SMIC\",\"MKN2.F\",\"26031375316\",\"2.17\",\"China\"\n\"635\",\"Weyerhaeuser\",\"WY\",\"26020204544\",\"34.95\",\"United States\"\n\"636\",\"Ametek\",\"AME\",\"26003929088\",\"112.62\",\"United States\"\n\"637\",\"Axis Bank\",\"AXISBANK.BO\",\"25997195827\",\"8.5\",\"India\"\n\"638\",\"Nokia\",\"NOK\",\"25982339072\",\"4.59\",\"Finland\"\n\"639\",\"CK Hutchison Holdings\",\"0001.HK\",\"25889638320\",\"6.75\",\"Hong Kong\"\n\"640\",\"GoTo\",\"GOTO.JK\",\"25856055572\",\"0.02\",\"Indonesia\"\n\"641\",\"Keysight\",\"KEYS\",\"25805156352\",\"143.41\",\"United States\"\n\"642\",\"Coupang\",\"CPNG\",\"25793163264\",\"14.64\",\"South Korea\"\n\"643\",\"Sartorius\",\"SRT.DE\",\"25773409689\",\"369.53\",\"Germany\"\n\"644\",\"CK Asset Holdings\",\"1113.HK\",\"25761081560\",\"7.08\",\"Hong Kong\"\n\"645\",\"Twitter\",\"TWTR\",\"25730052096\",\"33.67\",\"United States\"\n\"646\",\"Sun Pharmaceutical\",\"SUNPHARMA.NS\",\"25698914226\",\"10.71\",\"India\"\n\"647\",\"Intact Financial\",\"IFC.TO\",\"25692246045\",\"146.04\",\"Canada\"\n\"648\",\"Crédit Agricole\",\"ACA.PA\",\"25636079397\",\"8.48\",\"France\"\n\"649\",\"Ameriprise Financial\",\"AMP\",\"25622743040\",\"233.14\",\"United States\"\n\"650\",\"Fujitsu\",\"6702.T\",\"25605668899\",\"130.3\",\"Japan\"\n\"651\",\"Bridgestone\",\"5108.T\",\"25577604040\",\"36.65\",\"Japan\"\n\"652\",\"Ericsson\",\"ERIC\",\"25555001344\",\"7.27\",\"Sweden\"\n\"653\",\"Halliburton\",\"HAL\",\"25507880960\",\"28.28\",\"United States\"\n\"654\",\"Longfor Group\",\"RLF.F\",\"25398904728\",\"4.06\",\"China\"\n\"655\",\"Holcim\",\"HOLN.SW\",\"25313110640\",\"41.63\",\"Switzerland\"\n\"656\",\"Franco-Nevada\",\"FNV\",\"25291442176\",\"131.29\",\"Canada\"\n\"657\",\"DoorDash\",\"DASH\",\"25244338176\",\"71.87\",\"United States\"\n\"658\",\"CBRE Group\",\"CBRE\",\"25119266816\",\"76.85\",\"United States\"\n\"659\",\"JD Health\",\"6618.HK\",\"25104054724\",\"7.9\",\"China\"\n\"660\",\"Kellogg's\",\"K\",\"24879278080\",\"73.64\",\"United States\"\n\"661\",\"Koninklijke DSM\",\"DSM.AS\",\"24845271328\",\"143.64\",\"Netherlands\"\n\"662\",\"Wolters Kluwer\",\"WOSB.F\",\"24830662468\",\"96.57\",\"Netherlands\"\n\"663\",\"XPeng\",\"XPEV\",\"24785737728\",\"29.01\",\"China\"\n\"664\",\"Galaxy Entertainment\",\"0027.HK\",\"24784435898\",\"5.68\",\"Hong Kong\"\n\"665\",\"Olympus\",\"7733.T\",\"24757929786\",\"19.65\",\"Japan\"\n\"666\",\"RWE\",\"RWE.DE\",\"24750538200\",\"36.6\",\"Germany\"\n\"667\",\"Las Vegas Sands\",\"LVS\",\"24722745344\",\"32.36\",\"United States\"\n\"668\",\"Lindt\",\"LISN.SW\",\"24704239857\",\"101637.61\",\"Switzerland\"\n\"669\",\"Sirius XM\",\"SIRI\",\"24581068800\",\"6.25\",\"United States\"\n\"670\",\"W. W. Grainger\",\"GWW\",\"24539037696\",\"480.2\",\"United States\"\n\"671\",\"eBay\",\"EBAY\",\"24526678016\",\"43.81\",\"United States\"\n\"672\",\"DTE Energy\",\"DTE\",\"24502171648\",\"126.47\",\"United States\"\n\"673\",\"Shenzhen Inovance\",\"300124.SZ\",\"24420329463\",\"9.26\",\"China\"\n\"674\",\"Oneok\",\"OKE\",\"24313774080\",\"54.44\",\"United States\"\n\"675\",\"CoStar Group\",\"CSGP\",\"24169723904\",\"61\",\"United States\"\n\"676\",\"Extra Space Storage\",\"EXR\",\"24167462912\",\"171.65\",\"United States\"\n\"677\",\"UDR Apartments\",\"UDR\",\"24161243136\",\"44.93\",\"United States\"\n\"678\",\"Kia\",\"000270.KS\",\"24130306176\",\"60.19\",\"South Korea\"\n\"679\",\"KONE\",\"KNEBV.HE\",\"24014860356\",\"46.34\",\"Finland\"\n\"680\",\"EDP Renováveis\",\"EDPR.LS\",\"24001878363\",\"24.99\",\"Spain\"\n\"681\",\"SVB Financial Group\",\"SIVB\",\"23977744384\",\"407.43\",\"United States\"\n\"682\",\"Aptiv\",\"APTV\",\"23966556160\",\"88.46\",\"Ireland\"\n\"683\",\"Generali\",\"G.MI\",\"23944707346\",\"15.15\",\"Italy\"\n\"684\",\"Edison International\",\"EIX\",\"23939358720\",\"62.8\",\"United States\"\n\"685\",\"Tesco\",\"TSCDF\",\"23826530304\",\"3.13\",\"United Kingdom\"\n\"686\",\"Sany Heavy Industry\",\"600031.SS\",\"23820871685\",\"2.8\",\"China\"\n\"687\",\"Titan Company\",\"TITAN.NS\",\"23783569719\",\"26.79\",\"India\"\n\"688\",\"Bajaj Finserv\",\"BAJAJFINSV.NS\",\"23772328336\",\"149.23\",\"India\"\n\"689\",\"Partners Group\",\"PGHN.SW\",\"23771629395\",\"901.5\",\"Switzerland\"\n\"690\",\"Assa Abloy\",\"ASAZF\",\"23745069056\",\"21.28\",\"Sweden\"\n\"691\",\"Canon\",\"CAJ\",\"23717197824\",\"22.98\",\"Japan\"\n\"692\",\"Coca-Cola European Partners\",\"CCEP\",\"23624986624\",\"50.75\",\"United Kingdom\"\n\"693\",\"Restaurant Brands International\",\"QSR\",\"23607676928\",\"51.75\",\"Canada\"\n\"694\",\"Alexandria Real Estate Equities\",\"ARE\",\"23528689664\",\"144.16\",\"United States\"\n\"695\",\"Amadeus IT Group\",\"AMS.MC\",\"23523713094\",\"52.29\",\"Spain\"\n\"696\",\"Goodman Group\",\"GMG.AX\",\"23477461827\",\"12.57\",\"Australia\"\n\"697\",\"Ferguson\",\"FERG\",\"23458136064\",\"110.72\",\"United Kingdom\"\n\"698\",\"Coloplast\",\"CBHD.F\",\"23457927916\",\"110.21\",\"Denmark\"\n\"699\",\"Rockwell Automation\",\"ROK\",\"23446556672\",\"201.67\",\"United States\"\n\"700\",\"Vestas Wind Systems\",\"VWSB.F\",\"23412830729\",\"23.2\",\"Denmark\"\n\"701\",\"Kakao\",\"035720.KS\",\"23402079836\",\"53.76\",\"South Korea\"\n\"702\",\"West Pharmaceutical\",\"WST\",\"23391221760\",\"315.78\",\"United States\"\n\"703\",\"Equifax\",\"EFX\",\"23363536896\",\"190.98\",\"United States\"\n\"704\",\"Terumo\",\"4543.T\",\"23332181238\",\"30.85\",\"Japan\"\n\"705\",\"Church & Dwight\",\"CHD\",\"23298734080\",\"95.97\",\"United States\"\n\"706\",\"Snap\",\"SNAP\",\"23217743872\",\"14.15\",\"United States\"\n\"707\",\"ON Semiconductor\",\"ON\",\"23211309056\",\"53.42\",\"United States\"\n\"708\",\"Bank Mandiri\",\"PPERF\",\"23191015424\",\"0.5\",\"Indonesia\"\n\"709\",\"Fifth Third Bank\",\"FITB\",\"23182878720\",\"33.79\",\"United States\"\n\"710\",\"Z Holdings\",\"4689.T\",\"23163886115\",\"3.09\",\"Japan\"\n\"711\",\"State Street Corporation\",\"STT\",\"23124574208\",\"62.99\",\"United States\"\n\"712\",\"Rogers Communication\",\"RCI\",\"23093321728\",\"45.66\",\"Canada\"\n\"713\",\"Zscaler\",\"ZS\",\"23051321344\",\"162.49\",\"United States\"\n\"714\",\"Sociedad Química y Minera\",\"SQM\",\"23026708480\",\"80.62\",\"Chile\"\n\"715\",\"BT Group\",\"BT-A.L\",\"23007427089\",\"230.78\",\"United Kingdom\"\n\"716\",\"Albemarle\",\"ALB\",\"22982256640\",\"196.24\",\"United States\"\n\"717\",\"China Railway Group\",\"0390.HK\",\"22880204154\",\"0.66\",\"China\"\n\"718\",\"Roblox\",\"RBLX\",\"22859640832\",\"38.54\",\"United States\"\n\"719\",\"Ameren\",\"AEE\",\"22811772928\",\"88.34\",\"United States\"\n\"720\",\"Tractor Supply\",\"TSCO\",\"22786447360\",\"203.67\",\"United States\"\n\"721\",\"Entergy\",\"ETR\",\"22775853056\",\"111.99\",\"United States\"\n\"722\",\"SSE\",\"SCT.F\",\"22759997522\",\"21.32\",\"United Kingdom\"\n\"723\",\"Southwest Airlines\",\"LUV\",\"22757652480\",\"38.38\",\"United States\"\n\"724\",\"The Saudi British Bank\",\"1060.SR\",\"22747661805\",\"11.07\",\"Saudi Arabia\"\n\"725\",\"ČEZ Group\",\"CEZ.F\",\"22710548979\",\"42.31\",\"Czech Republic\"\n\"726\",\"Interactive Brokers\",\"IBKR\",\"22703095808\",\"54.47\",\"United States\"\n\"727\",\"Vonovia\",\"VNA.DE\",\"22702915057\",\"28.14\",\"Germany\"\n\"728\",\"GlobalFoundries\",\"GFS\",\"22693701632\",\"42.05\",\"United States\"\n\"729\",\"Great-West Lifeco\",\"GWO.TO\",\"22690573390\",\"24.29\",\"Canada\"\n\"730\",\"Continental Resources\",\"CLR\",\"22652895232\",\"62.41\",\"United States\"\n\"731\",\"China Tower\",\"0788.HK\",\"22646308620\",\"0.13\",\"China\"\n\"732\",\"LabCorp\",\"LH\",\"22597478400\",\"243.77\",\"United States\"\n\"733\",\"Lennar\",\"LEN\",\"22571474944\",\"79.3\",\"United States\"\n\"734\",\"National Bank of Canada\",\"NA.TO\",\"22542125874\",\"67.01\",\"Canada\"\n\"735\",\"Sampo\",\"SAMPO.HE\",\"22517163825\",\"42.45\",\"Finland\"\n\"736\",\"Brookfield Renewable Partners\",\"BEP\",\"22513283072\",\"34.53\",\"Bermuda\"\n\"737\",\"China Minsheng Bank\",\"600016.SS\",\"22473901979\",\"0.55\",\"China\"\n\"738\",\"KBC\",\"KBCSF\",\"22430013440\",\"53.79\",\"Belgium\"\n\"739\",\"China Everbright Bank\",\"601818.SS\",\"22394563412\",\"0.44\",\"China\"\n\"740\",\"Duke Realty\",\"DRE\",\"22389692416\",\"57.62\",\"United States\"\n\"741\",\"Mitsubishi Electric\",\"6503.T\",\"22355433967\",\"10.59\",\"Japan\"\n\"742\",\"Willis Towers Watson\",\"WTW\",\"22321012736\",\"200.21\",\"United Kingdom\"\n\"743\",\"Beiersdorf\",\"BEI.DE\",\"22250841452\",\"98.1\",\"Germany\"\n\"744\",\"McCormick & Company\",\"MKC\",\"22244671488\",\"82.91\",\"United States\"\n\"745\",\"Compagnie de Saint-Gobain\",\"SGO.PA\",\"22184780324\",\"41.54\",\"France\"\n\"746\",\"Fortis\",\"FTS\",\"22180380672\",\"46.49\",\"Canada\"\n\"747\",\"EnBW Energie\",\"EBK.DE\",\"22060588533\",\"81.45\",\"Germany\"\n\"748\",\"The Trade Desk\",\"TTD\",\"22006251520\",\"45.25\",\"United States\"\n\"749\",\"Nestlé India\",\"NESTLEIND.NS\",\"21979536178\",\"227.97\",\"India\"\n\"750\",\"BOE Technology\",\"000725.SZ\",\"21885115912\",\"0.57\",\"China\"\n\"751\",\"Invitation Homes\",\"INVH\",\"21863745536\",\"35.68\",\"United States\"\n\"752\",\"Ball Corporation\",\"BALL\",\"21851183104\",\"68.33\",\"United States\"\n\"753\",\"CaixaBank\",\"CABK.MC\",\"21822400676\",\"2.71\",\"Spain\"\n\"754\",\"Fujifilm\",\"4901.T\",\"21804731399\",\"54.4\",\"Japan\"\n\"755\",\"Genmab\",\"GMAB\",\"21745997824\",\"33.25\",\"Denmark\"\n\"756\",\"China Resources Beer\",\"0291.HK\",\"21716867019\",\"6.69\",\"Hong Kong\"\n\"757\",\"Geely\",\"0175.HK\",\"21701759883\",\"2.17\",\"China\"\n\"758\",\"Zimmer Biomet\",\"ZBH\",\"21699602432\",\"103.54\",\"United States\"\n\"759\",\"Central Japan Railway\",\"9022.T\",\"21666951653\",\"110.1\",\"Japan\"\n\"760\",\"CDW Corporation\",\"CDW\",\"21655042048\",\"160.27\",\"United States\"\n\"761\",\"The Hartford\",\"HIG\",\"21517635584\",\"65.43\",\"United States\"\n\"762\",\"BTG Pactual\",\"BPAC3.SA\",\"21487048166\",\"2.19\",\"Brazil\"\n\"763\",\"Unicharm\",\"8113.T\",\"21454739104\",\"35.94\",\"Japan\"\n\"764\",\"FirstEnergy\",\"FE\",\"21444204544\",\"37.56\",\"United States\"\n\"765\",\"Swiss Re\",\"SREN.SW\",\"21423107838\",\"74.14\",\"Switzerland\"\n\"766\",\"Volvo Car\",\"VOLCAR-B.ST\",\"21364076742\",\"6.94\",\"Sweden\"\n\"767\",\"Polestar\",\"PSNY\",\"21343750310\",\"10.04\",\"Sweden\"\n\"768\",\"CLP Group\",\"0002.HK\",\"21338696040\",\"8.45\",\"Hong Kong\"\n\"769\",\"Ansys\",\"ANSS\",\"21332580352\",\"245.23\",\"United States\"\n\"770\",\"ZTO Express\",\"ZTO\",\"21295976448\",\"26.3\",\"China\"\n\"771\",\"Steris\",\"STE\",\"21149906944\",\"211.33\",\"Ireland\"\n\"772\",\"Chongqing Changan\",\"000625.SZ\",\"21146246120\",\"2.46\",\"China\"\n\"773\",\"E.ON\",\"EOAN.DE\",\"21136869486\",\"8.11\",\"Germany\"\n\"774\",\"Waters Corporation\",\"WAT\",\"21025130496\",\"349.05\",\"United States\"\n\"775\",\"UltraTech Cement\",\"ULTRACEMCO.NS\",\"20960215181\",\"72.68\",\"India\"\n\"776\",\"Coterra Energy\",\"CTRA\",\"20942872576\",\"25.99\",\"United States\"\n\"777\",\"Aker BP\",\"AKRBP.OL\",\"20913513005\",\"33.11\",\"Norway\"\n\"778\",\"H&amp;M\",\"HM-B.ST\",\"20883314697\",\"12.62\",\"Sweden\"\n\"779\",\"Standard Chartered\",\"STAN.L\",\"20864153669\",\"682.29\",\"United Kingdom\"\n\"780\",\"Skandinaviska Enskilda Banken\",\"SEBA.F\",\"20819181337\",\"9.79\",\"Sweden\"\n\"781\",\"Tata Motors\",\"TTM\",\"20750245888\",\"27.1\",\"India\"\n\"782\",\"EQT\",\"EQT.ST\",\"20747167276\",\"20.84\",\"Sweden\"\n\"783\",\"MongoDB\",\"MDB\",\"20713164800\",\"304.09\",\"United States\"\n\"784\",\"FirstRand\",\"FSRA.F\",\"20701610281\",\"3.62\",\"South Africa\"\n\"785\",\"Daimler Truck\",\"DTG.F\",\"20642371700\",\"24.08\",\"Germany\"\n\"786\",\"Ventas\",\"VTR\",\"20484419584\",\"51.25\",\"United States\"\n\"787\",\"WEG ON\",\"WEGE3.SA\",\"20470792735\",\"4.88\",\"Brazil\"\n\"788\",\"CRRC\",\"1766.HK\",\"20397071466\",\"0.37\",\"China\"\n\"789\",\"Pacific Gas and Electric\",\"PCG\",\"20312047616\",\"10.22\",\"United States\"\n\"790\",\"Ecopetrol\",\"EC\",\"20311601152\",\"9.88\",\"Colombia\"\n\"791\",\"Match Group\",\"MTCH\",\"20311373824\",\"71.12\",\"United States\"\n\"792\",\"Sandvik\",\"SAND.ST\",\"20276365497\",\"16.16\",\"Sweden\"\n\"793\",\"Agnico Eagle Mines\",\"AEM\",\"20240758784\",\"44.18\",\"Canada\"\n\"794\",\"Sonova\",\"SOON.SW\",\"20237726055\",\"331.29\",\"Switzerland\"\n\"795\",\"PPL\",\"PPL\",\"20215255040\",\"27.47\",\"United States\"\n\"796\",\"Mid-America Apartment Communities\",\"MAA\",\"20171931648\",\"170.04\",\"United States\"\n\"797\",\"Porsche SE\",\"PAH3.DE\",\"20164152889\",\"65.84\",\"Germany\"\n\"798\",\"Imperial Brands\",\"ITBA.F\",\"20135464414\",\"20.92\",\"United Kingdom\"\n\"799\",\"Delta Electronics\",\"2308.TW\",\"20107628977\",\"7.74\",\"Taiwan\"\n\"800\",\"Fortive\",\"FTV\",\"20083841024\",\"56.03\",\"United States\"\n\"801\",\"Kaō\",\"4452.T\",\"20070685821\",\"42.41\",\"Japan\"\n\"802\",\"Ashtead\",\"0LC.F\",\"20054034534\",\"44.85\",\"United Kingdom\"\n\"803\",\"ULTA Beauty\",\"ULTA\",\"20029769728\",\"386.54\",\"United States\"\n\"804\",\"Sun Communities\",\"SUI\",\"19984195584\",\"160.95\",\"United States\"\n\"805\",\"Komatsu\",\"6301.T\",\"19932904156\",\"21.09\",\"Japan\"\n\"806\",\"Northern Trust\",\"NTRS\",\"19923212288\",\"95.61\",\"United States\"\n\"807\",\"Hong Kong and China Gas\",\"0003.HK\",\"19896578186\",\"1.07\",\"Hong Kong\"\n\"808\",\"Take 2 Interactive\",\"TTWO\",\"19878430720\",\"122.72\",\"United States\"\n\"809\",\"Gartner\",\"IT\",\"19850043392\",\"246.47\",\"United States\"\n\"810\",\"Garmin\",\"GRMN\",\"19828142080\",\"102.67\",\"Switzerland\"\n\"811\",\"Celltrion\",\"068270.KS\",\"19824424666\",\"143.39\",\"South Korea\"\n\"812\",\"ORIX\",\"IX\",\"19809046528\",\"83.16\",\"Japan\"\n\"813\",\"Vulcan Materials\",\"VMC\",\"19801503744\",\"149\",\"United States\"\n\"814\",\"CGI\",\"GIB\",\"19801077760\",\"80.86\",\"Canada\"\n\"815\",\"Constellation Energy\",\"CEG\",\"19765288960\",\"60.5\",\"United States\"\n\"816\",\"Align Technology\",\"ALGN\",\"19754176512\",\"250.67\",\"United States\"\n\"817\",\"Cheniere Energy\",\"CQP\",\"19748300800\",\"40.8\",\"United States\"\n\"818\",\"Martin Marietta\",\"MLM\",\"19711240192\",\"316.06\",\"United States\"\n\"819\",\"Mitsui Fudosan\",\"8801.T\",\"19710824291\",\"20.87\",\"Japan\"\n\"820\",\"Otsuka Holdings\",\"4578.T\",\"19637872929\",\"36.21\",\"Japan\"\n\"821\",\"Oil &amp; Natural Gas\",\"ONGC.NS\",\"19635950838\",\"1.56\",\"India\"\n\"822\",\"ArcelorMittal\",\"MT\",\"19621896192\",\"21.82\",\"Luxembourg\"\n\"823\",\"Schindler Group\",\"SCHN.SW\",\"19616270099\",\"181.07\",\"Switzerland\"\n\"824\",\"Raymond James\",\"RJF\",\"19607640064\",\"90.5\",\"United States\"\n\"825\",\"Delta Air Lines\",\"DAL\",\"19574706176\",\"30.54\",\"United States\"\n\"826\",\"Genuine Parts Company\",\"GPC\",\"19562766336\",\"138.16\",\"United States\"\n\"827\",\"Techtronic Industries\",\"TIB1.F\",\"19545939017\",\"10.65\",\"Hong Kong\"\n\"828\",\"Legrand\",\"LR.PA\",\"19523276131\",\"73.32\",\"France\"\n\"829\",\"Palantir\",\"PLTR\",\"19483332608\",\"9.52\",\"United States\"\n\"830\",\"Adani Ports & SEZ\",\"ADANIPORTS.NS\",\"19453325749\",\"9.21\",\"India\"\n\"831\",\"VeriSign\",\"VRSN\",\"19405895680\",\"177.15\",\"United States\"\n\"832\",\"NTT Data\",\"9613.T\",\"19393753755\",\"13.83\",\"Japan\"\n\"833\",\"Yum China\",\"YUMC\",\"19373137920\",\"45.97\",\"China\"\n\"834\",\"Cathay Financial Holding\",\"2882.TW\",\"19329478745\",\"1.47\",\"Taiwan\"\n\"835\",\"CMS Energy\",\"CMS\",\"19322591232\",\"66.6\",\"United States\"\n\"836\",\"M3, Inc\",\"2413.T\",\"19301553259\",\"28.43\",\"Japan\"\n\"837\",\"Spotify\",\"SPOT\",\"19250487296\",\"99.92\",\"Sweden\"\n\"838\",\"Catalent\",\"CTLT\",\"19249268736\",\"107.41\",\"United States\"\n\"839\",\"Pembina Pipeline\",\"PBA\",\"19238918144\",\"34.71\",\"Canada\"\n\"840\",\"Endesa\",\"ELE.MC\",\"19234511220\",\"18.17\",\"Spain\"\n\"841\",\"KE Holdings\",\"BEKE\",\"19225354240\",\"15.21\",\"China\"\n\"842\",\"Polyus\",\"PLZL.ME\",\"19206824475\",\"142.27\",\"Russia\"\n\"843\",\"Philips\",\"PHG\",\"19200432128\",\"20.82\",\"Netherlands\"\n\"844\",\"Diamondback Energy\",\"FANG\",\"19155331072\",\"109.09\",\"United States\"\n\"845\",\"Fubon Financial\",\"2881.TW\",\"19135916837\",\"1.87\",\"Taiwan\"\n\"846\",\"Argenx\",\"ARGX\",\"19129954304\",\"352.7\",\"Netherlands\"\n\"847\",\"Paycom\",\"PAYC\",\"19109857280\",\"317.16\",\"United States\"\n\"848\",\"Horizon Therapeutics\",\"HZNP\",\"19020601344\",\"82.74\",\"Ireland\"\n\"849\",\"Panasonic\",\"6752.T\",\"19015356946\",\"8.15\",\"Japan\"\n\"850\",\"Live Nation\",\"LYV\",\"18992029696\",\"83.28\",\"United States\"\n\"851\",\"Huatai Securities\",\"206G.F\",\"18983843845\",\"20.92\",\"China\"\n\"852\",\"Mengniu Dairy\",\"2319.HK\",\"18967403746\",\"4.8\",\"China\"\n\"853\",\"Straumann\",\"STMN.SW\",\"18956581000\",\"119.31\",\"Switzerland\"\n\"854\",\"Chow Tai Fook\",\"1929.HK\",\"18955993037\",\"1.9\",\"Hong Kong\"\n\"855\",\"Ferrovial\",\"FER.MC\",\"18939261490\",\"25.19\",\"Spain\"\n\"856\",\"Amcor\",\"AMCR\",\"18927388672\",\"12.6\",\"Switzerland\"\n\"857\",\"Mitsubishi Estate\",\"8802.T\",\"18884756047\",\"14.28\",\"Japan\"\n\"858\",\"Cincinnati Financial\",\"CINF\",\"18878595072\",\"117.73\",\"United States\"\n\"859\",\"Liberty Broadband\",\"LBRDA\",\"18799249408\",\"113.93\",\"United States\"\n\"860\",\"CenterPoint Energy\",\"CNP\",\"18738698240\",\"29.77\",\"United States\"\n\"861\",\"Powergrid Corporation of India\",\"POWERGRID.NS\",\"18730926309\",\"2.69\",\"India\"\n\"862\",\"Teleperformance\",\"TEP.PA\",\"18702646958\",\"313.62\",\"France\"\n\"863\",\"Quanta Services\",\"PWR\",\"18687916032\",\"130.04\",\"United States\"\n\"864\",\"Evolution Gaming\",\"EVO.ST\",\"18663730583\",\"86.32\",\"Sweden\"\n\"865\",\"Air China\",\"601111.SS\",\"18654770747\",\"1.49\",\"China\"\n\"866\",\"EDP Group\",\"EDP.F\",\"18588014560\",\"4.71\",\"Portugal\"\n\"867\",\"Centrais Electricas Brasileiras\",\"EBR\",\"18524712960\",\"7.73\",\"Brazil\"\n\"868\",\"UniCredit\",\"UCG.MI\",\"18522628891\",\"8.97\",\"Italy\"\n\"869\",\"Michelin\",\"ML.PA\",\"18494210188\",\"25.93\",\"France\"\n\"870\",\"Kyocera\",\"6971.T\",\"18466953297\",\"51.45\",\"Japan\"\n\"871\",\"Atlantia\",\"ATL.MI\",\"18443093591\",\"22.52\",\"Italy\"\n\"872\",\"Nu Holdings\",\"NU\",\"18439960576\",\"4\",\"Brazil\"\n\"873\",\"East Japan Railway\",\"9020.T\",\"18416384740\",\"48.82\",\"Japan\"\n\"874\",\"EPAM Systems\",\"EPAM\",\"18415513600\",\"322.23\",\"United States\"\n\"875\",\"Nippon Paint\",\"4612.T\",\"18375762176\",\"7.83\",\"Japan\"\n\"876\",\"Carlsberg\",\"CBGA.F\",\"18350518637\",\"139.27\",\"Denmark\"\n\"877\",\"Rollins\",\"ROL\",\"18255527936\",\"37.07\",\"United States\"\n\"878\",\"Wilmar International\",\"F34.SI\",\"18242552352\",\"2.91\",\"Singapore\"\n\"879\",\"Avantor\",\"AVTR\",\"18224723968\",\"29.86\",\"United States\"\n\"880\",\"Formosa Plastics\",\"1301.TW\",\"18217693590\",\"2.86\",\"Taiwan\"\n\"881\",\"Kubota\",\"6326.T\",\"18206599682\",\"15.23\",\"Japan\"\n\"882\",\"Nexon\",\"3659.T\",\"18205920368\",\"21.04\",\"Japan\"\n\"883\",\"Telenor\",\"TEL.OL\",\"18205067649\",\"13.01\",\"Norway\"\n\"884\",\"China Communications Construction\",\"601800.SS\",\"18182136995\",\"1.35\",\"China\"\n\"885\",\"Monolithic Power Systems\",\"MPWR\",\"18156720128\",\"389.27\",\"United States\"\n\"886\",\"Toyota Industries\",\"6201.T\",\"18114193856\",\"58.34\",\"Japan\"\n\"887\",\"PerkinElmer\",\"PKI\",\"18108545024\",\"143.55\",\"United States\"\n\"888\",\"United Rentals\",\"URI\",\"18093363200\",\"252.66\",\"United States\"\n\"889\",\"American Campus Communities\",\"ACC\",\"17999226880\",\"64.96\",\"United States\"\n\"890\",\"Citizens Financial Group\",\"CFG\",\"17979736064\",\"36.29\",\"United States\"\n\"891\",\"Hologic\",\"HOLX\",\"17965406208\",\"72.04\",\"United States\"\n\"892\",\"Teledyne\",\"TDY\",\"17960036352\",\"383.41\",\"United States\"\n\"893\",\"NTPC Limited\",\"NTPC.NS\",\"17940082850\",\"1.85\",\"India\"\n\"894\",\"Mahindra &amp; Mahindra\",\"M&M.NS\",\"17920560235\",\"14.41\",\"India\"\n\"895\",\"Fox Corporation\",\"FOX\",\"17914306560\",\"30.69\",\"United States\"\n\"896\",\"Ares Management\",\"ARES\",\"17878687744\",\"60.91\",\"United States\"\n\"897\",\"CF Industries\",\"CF\",\"17877190656\",\"85.7\",\"United States\"\n\"898\",\"Dai-ichi Life Holdings\",\"8750.T\",\"17867513716\",\"17.37\",\"Japan\"\n\"899\",\"Markel\",\"MKL\",\"17826592768\",\"1313.88\",\"United States\"\n\"900\",\"Essex Property Trust\",\"ESS\",\"17822771200\",\"263.59\",\"United States\"\n\"901\",\"Incyte\",\"INCY\",\"17784635392\",\"80.29\",\"United States\"\n\"902\",\"Huntington Bancshares\",\"HBAN\",\"17744965632\",\"12.33\",\"United States\"\n\"903\",\"Alinma Bank\",\"1150.SR\",\"17744857039\",\"8.87\",\"Saudi Arabia\"\n\"904\",\"Regions Financial\",\"RF\",\"17736808448\",\"18.98\",\"United States\"\n\"905\",\"W. R. Berkley\",\"WRB\",\"17730803712\",\"66.86\",\"United States\"\n\"906\",\"Orient Overseas Container Line\",\"0316.HK\",\"17716729106\",\"26.83\",\"Hong Kong\"\n\"907\",\"BeiGene\",\"BGNE\",\"17694849024\",\"171.14\",\"China\"\n\"908\",\"Epiroc\",\"EPI-A.ST\",\"17679608871\",\"15.46\",\"Sweden\"\n\"909\",\"Aena\",\"AENA.MC\",\"17667000510\",\"117.78\",\"Spain\"\n\"910\",\"Dover\",\"DOV\",\"17658525696\",\"122.49\",\"United States\"\n\"911\",\"Chewy\",\"CHWY\",\"17648668672\",\"41.96\",\"United States\"\n\"912\",\"Avangrid\",\"AGR\",\"17606201344\",\"45.53\",\"United States\"\n\"913\",\"VF Corporation\",\"VFC\",\"17598144512\",\"45.3\",\"United States\"\n\"914\",\"Alnylam Pharmaceuticals\",\"ALNY\",\"17589309440\",\"145.59\",\"United States\"\n\"915\",\"Power Corporation of Canada\",\"POW.TO\",\"17587120168\",\"25.91\",\"Canada\"\n\"916\",\"Essity\",\"ESWB.F\",\"17577744329\",\"25.2\",\"Sweden\"\n\"917\",\"PhosAgro\",\"PHOR.ME\",\"17576778390\",\"135.73\",\"Russia\"\n\"918\",\"Henderson Land Development\",\"0012.HK\",\"17575829085\",\"3.63\",\"Hong Kong\"\n\"919\",\"Clorox\",\"CLX\",\"17567823872\",\"142.74\",\"United States\"\n\"920\",\"PTT Exploration and Production\",\"PTTEP.BK\",\"17545462847\",\"4.42\",\"Thailand\"\n\"921\",\"Brookfield Infrastructure Partners\",\"BIP\",\"17520183296\",\"38.25\",\"Bermuda\"\n\"922\",\"Broadridge Financial Solutions\",\"BR\",\"17503162368\",\"149.31\",\"United States\"\n\"923\",\"Dollarama\",\"DOL.TO\",\"17475489586\",\"59.41\",\"Canada\"\n\"924\",\"Rocket Companies\",\"RKT\",\"17458429952\",\"8.79\",\"United States\"\n\"925\",\"JSW Steel\",\"JSWSTEEL.NS\",\"17401834953\",\"7.22\",\"India\"\n\"926\",\"George Weston\",\"WN.TO\",\"17346409303\",\"118.73\",\"Canada\"\n\"927\",\"MS&amp;AD Insurance\",\"8725.T\",\"17321001855\",\"31.64\",\"Japan\"\n\"928\",\"Repsol\",\"REP.MC\",\"17305690510\",\"12.37\",\"Spain\"\n\"929\",\"Hewlett Packard Enterprise\",\"HPE\",\"17294084096\",\"13.31\",\"United States\"\n\"930\",\"Conagra Brands\",\"CAG\",\"17286674432\",\"35.77\",\"United States\"\n\"931\",\"J. B. Hunt\",\"JBHT\",\"17281859584\",\"164.93\",\"United States\"\n\"932\",\"Renesas Electronics\",\"6723.T\",\"17238178383\",\"8.83\",\"Japan\"\n\"933\",\"Legal &amp; General\",\"LGEN.L\",\"17236211332\",\"288.69\",\"United Kingdom\"\n\"934\",\"ICON plc\",\"ICLR\",\"17197533184\",\"211\",\"Ireland\"\n\"935\",\"Banco do Brasil\",\"BZLA.F\",\"17196063061\",\"6.03\",\"Brazil\"\n\"936\",\"Link REIT\",\"0823.HK\",\"17177434006\",\"8.14\",\"Hong Kong\"\n\"937\",\"Ingersoll Rand\",\"IR\",\"17093711872\",\"42.11\",\"Ireland\"\n\"938\",\"Copel\",\"ELP\",\"17076070400\",\"6.24\",\"Brazil\"\n\"939\",\"Toshiba\",\"6502.T\",\"17002873627\",\"39.3\",\"Japan\"\n\"940\",\"SGS\",\"SGSN.SW\",\"16960433109\",\"2263.91\",\"Switzerland\"\n\"941\",\"Cloudflare\",\"NET\",\"16931700736\",\"51.9\",\"United States\"\n\"942\",\"Magna International\",\"MGA\",\"16925381632\",\"55.78\",\"Canada\"\n\"943\",\"Brown &amp; Brown\",\"BRO\",\"16913797120\",\"59.92\",\"United States\"\n\"944\",\"Sumitomo\",\"8053.T\",\"16880528264\",\"13.5\",\"Japan\"\n\"945\",\"Saudi Arabian Fertilizer Company\",\"2020.SR\",\"16868979627\",\"35.44\",\"Saudi Arabia\"\n\"946\",\"Molina Healthcare\",\"MOH\",\"16852183040\",\"287.09\",\"United States\"\n\"947\",\"Geberit\",\"GEBN.SW\",\"16845247416\",\"479.1\",\"Switzerland\"\n\"948\",\"Svenska Handelsbanken\",\"SVHH.F\",\"16842764548\",\"8.46\",\"Sweden\"\n\"949\",\"Coles Group\",\"COL.AX\",\"16839072753\",\"12.58\",\"Australia\"\n\"950\",\"Tourmaline Oil\",\"TOU.TO\",\"16822056242\",\"50.14\",\"Canada\"\n\"951\",\"Fleetcor\",\"FLT\",\"16809248768\",\"217.34\",\"United States\"\n\"952\",\"Principal\",\"PFG\",\"16765583360\",\"66.35\",\"United States\"\n\"953\",\"Arch Capital\",\"ACGL\",\"16754078720\",\"44.6\",\"Bermuda\"\n\"954\",\"Freddie Mac\",\"FMCCT\",\"16750811136\",\"5.2\",\"United States\"\n\"955\",\"Nomura Research Institute\",\"4307.T\",\"16682763555\",\"28.3\",\"Japan\"\n\"956\",\"Advanced Info Service (AIS)\",\"ADVANC.BK\",\"16666609286\",\"5.6\",\"Thailand\"\n\"957\",\"Société Générale\",\"GLE.PA\",\"16662235693\",\"20.05\",\"France\"\n\"958\",\"Tradeweb\",\"TW\",\"16613964800\",\"71.36\",\"United States\"\n\"959\",\"China Merchants Securities\",\"600999.SS\",\"16534660315\",\"2.06\",\"China\"\n\"960\",\"Novozymes\",\"NZYM.VI\",\"16504899060\",\"58.9\",\"Denmark\"\n\"961\",\"Astra International\",\"ASII.JK\",\"16479809757\",\"0.41\",\"Indonesia\"\n\"962\",\"United Microelectronics\",\"UMC\",\"16475988992\",\"6.6\",\"Taiwan\"\n\"963\",\"Snam\",\"SRG.MI\",\"16453529353\",\"5.03\",\"Italy\"\n\"964\",\"Zhongsheng Group\",\"0881.HK\",\"16423793799\",\"6.81\",\"China\"\n\"965\",\"Hannover Rück\",\"HNR1.DE\",\"16407054399\",\"136.05\",\"Germany\"\n\"966\",\"NIBE Industrier\",\"NIBE-B.ST\",\"16397239893\",\"7.95\",\"Sweden\"\n\"967\",\"Stanley Black &amp; Decker\",\"SWK\",\"16393892864\",\"108.59\",\"United States\"\n\"968\",\"BioMarin Pharmaceutical\",\"BMRN\",\"16348009472\",\"88.37\",\"United States\"\n\"969\",\"Shiseido\",\"4911.T\",\"16342537951\",\"40.91\",\"Japan\"\n\"970\",\"Aeon\",\"8267.T\",\"16334468739\",\"19.29\",\"Japan\"\n\"971\",\"UCB\",\"UCB.VI\",\"16291460474\",\"86.12\",\"Belgium\"\n\"972\",\"Sunny Optical\",\"2382.HK\",\"16279603370\",\"14.17\",\"China\"\n\"973\",\"Jacobs Engineering\",\"J\",\"16275174400\",\"126.53\",\"United States\"\n\"974\",\"Seagate Technology\",\"STX\",\"16242205696\",\"75.6\",\"Ireland\"\n\"975\",\"KeyCorp (KeyBank)\",\"KEY\",\"16234319872\",\"17.41\",\"United States\"\n\"976\",\"Tsingtao\",\"600600.SS\",\"16228974486\",\"14.23\",\"China\"\n\"977\",\"The Mosaic Company\",\"MOS\",\"16217285632\",\"44.8\",\"United States\"\n\"978\",\"Flutter Entertainment\",\"PPBA.F\",\"16179559984\",\"43.99\",\"Ireland\"\n\"979\",\"Check Point Software\",\"CHKP\",\"16179517440\",\"126.29\",\"Israel\"\n\"980\",\"Deutsche Bank\",\"DB\",\"16162776064\",\"7.8\",\"Germany\"\n\"981\",\"Best Buy\",\"BBY\",\"16119776256\",\"71.59\",\"United States\"\n\"982\",\"Aristocrat\",\"ALL.AX\",\"16117585561\",\"24.18\",\"Australia\"\n\"983\",\"Veolia\",\"VIE.PA\",\"16114174713\",\"23.42\",\"France\"\n\"984\",\"Nan Ya Plastics\",\"1303.TW\",\"16102917739\",\"2.03\",\"Taiwan\"\n\"985\",\"Hydro One\",\"H.TO\",\"16099800949\",\"26.89\",\"Canada\"\n\"986\",\"Insulet\",\"PODD\",\"16096494592\",\"232.14\",\"United States\"\n\"987\",\"Quest Diagnostics\",\"DGX\",\"16087221248\",\"137.07\",\"United States\"\n\"988\",\"Expeditors\",\"EXPD\",\"16076704768\",\"95.84\",\"United States\"\n\"989\",\"HEICO\",\"HEI\",\"16068281344\",\"133.87\",\"United States\"\n\"990\",\"Trip.com\",\"TCOM\",\"16058397696\",\"24.46\",\"China\"\n\"991\",\"Bandai Namco\",\"7832.T\",\"16051378774\",\"72.97\",\"Japan\"\n\"992\",\"TransUnion\",\"TRU\",\"16023071744\",\"83.28\",\"United States\"\n\"993\",\"Bayan Resources\",\"BYAN.JK\",\"16015999506\",\"4.8\",\"Indonesia\"\n\"994\",\"W. P. Carey\",\"WPC\",\"15948861440\",\"82.69\",\"United States\"\n\"995\",\"Shionogi\",\"4507.T\",\"15859047659\",\"52.6\",\"Japan\"\n\"996\",\"ZTE\",\"000063.SZ\",\"15847459024\",\"3.57\",\"China\"\n\"997\",\"Huaneng Power\",\"HNP\",\"15840093184\",\"21.51\",\"China\"\n\"998\",\"International Paper\",\"IP\",\"15833271296\",\"42.72\",\"United States\"\n\"999\",\"Santos\",\"STO.AX\",\"15809833170\",\"4.71\",\"Australia\"\n\"1000\",\"Surgutneftegas\",\"SNGS.ME\",\"15773744352\",\"0.44\",\"Russia\"\n\"1001\",\"Okta\",\"OKTA\",\"15769223168\",\"99.95\",\"United States\"\n\"1002\",\"UPM-Kymmene\",\"UPM.HE\",\"15685999590\",\"29.41\",\"Finland\"\n\"1003\",\"Twilio\",\"TWLO\",\"15644379136\",\"86.11\",\"United States\"\n\"1004\",\"Wheaton Precious Metals\",\"WPM\",\"15619410944\",\"34.22\",\"Canada\"\n\"1005\",\"CK Infrastructure\",\"1038.HK\",\"15615641002\",\"6.2\",\"Hong Kong\"\n\"1006\",\"Atmos Energy\",\"ATO\",\"15611385856\",\"112.3\",\"United States\"\n\"1007\",\"Icahn Enterprises\",\"IEP\",\"15578626048\",\"50.75\",\"United States\"\n\"1008\",\"CP All\",\"CPALL.BK\",\"15576524330\",\"1.73\",\"Thailand\"\n\"1009\",\"Tatneft\",\"TATN.ME\",\"15567219405\",\"6.96\",\"Russia\"\n\"1010\",\"Fairfax Financial\",\"FFH.TO\",\"15559306954\",\"530.34\",\"Canada\"\n\"1011\",\"Zebra Technologies\",\"ZBRA\",\"15555111936\",\"296.21\",\"United States\"\n\"1012\",\"Skyworks Solutions\",\"SWKS\",\"15555107840\",\"96.66\",\"United States\"\n\"1013\",\"Telia Company\",\"TELIA.ST\",\"15541533516\",\"3.81\",\"Sweden\"\n\"1014\",\"Splunk\",\"SPLK\",\"15507542016\",\"96.38\",\"United States\"\n\"1015\",\"Fresenius\",\"FRE.DE\",\"15477714180\",\"27.66\",\"Germany\"\n\"1016\",\"Banque Saudi Fransi\",\"1050.SR\",\"15437674705\",\"12.87\",\"Saudi Arabia\"\n\"1017\",\"Daiwa House\",\"1925.T\",\"15421327016\",\"23.52\",\"Japan\"\n\"1018\",\"FactSet\",\"FDS\",\"15408513024\",\"405.71\",\"United States\"\n\"1019\",\"Banorte\",\"GFNORTEO.MX\",\"15388265745\",\"5.34\",\"Mexico\"\n\"1020\",\"MTN Group\",\"MTN.JO\",\"15381611979\",\"8.29\",\"South Africa\"\n\"1021\",\"Evergreen Marine\",\"2603.TW\",\"15266223685\",\"2.89\",\"Taiwan\"\n\"1022\",\"Swedish Match\",\"SWMA.ST\",\"15247164069\",\"10.02\",\"Sweden\"\n\"1023\",\"MFHC\",\"2886.TW\",\"15244573811\",\"1.12\",\"Taiwan\"\n\"1024\",\"Ryanair\",\"RYAAY\",\"15236452352\",\"67.11\",\"Ireland\"\n\"1025\",\"Weichai Power\",\"2338.HK\",\"15208417276\",\"1.54\",\"China\"\n\"1026\",\"Paramount Global\",\"PARA\",\"15201156096\",\"24.58\",\"United States\"\n\"1027\",\"China Railway Construction\",\"601186.SS\",\"15199983421\",\"1.2\",\"China\"\n\"1028\",\"Sompo Holdings\",\"8630.T\",\"15189017150\",\"44.41\",\"Japan\"\n\"1029\",\"Synchrony\",\"SYF\",\"15185087488\",\"30.28\",\"United States\"\n\"1030\",\"Ubiquiti\",\"UI\",\"15183143936\",\"251.3\",\"United States\"\n\"1031\",\"POOLCORP\",\"POOL\",\"15178914816\",\"379.24\",\"United States\"\n\"1032\",\"Bio-Rad Laboratories\",\"BIO\",\"15154044928\",\"513.74\",\"United States\"\n\"1033\",\"Wabtec\",\"WAB\",\"15142431744\",\"82.91\",\"United States\"\n\"1034\",\"SS&C Technologies\",\"SSNC\",\"15105965056\",\"59.29\",\"United States\"\n\"1035\",\"Suzuki Motor\",\"7269.T\",\"15104701680\",\"31.1\",\"Japan\"\n\"1036\",\"Cooper Companies\",\"COO\",\"15074274304\",\"305.54\",\"United States\"\n\"1037\",\"China Steel\",\"2002A.TW\",\"15067551283\",\"1.7\",\"Taiwan\"\n\"1038\",\"Terna\",\"TRN.MI\",\"15048704000\",\"7.5\",\"Italy\"\n\"1039\",\"Evergy\",\"EVRG\",\"15035398144\",\"65.52\",\"United States\"\n\"1040\",\"Coal India\",\"COALINDIA.NS\",\"15029345882\",\"2.44\",\"India\"\n\"1041\",\"CNH Industrial\",\"CNHI\",\"15022291968\",\"11.09\",\"United Kingdom\"\n\"1042\",\"Symrise\",\"SY1.DE\",\"15017232346\",\"107.44\",\"Germany\"\n\"1043\",\"CTBC Financial Holding\",\"2891.TW\",\"14994677868\",\"0.77\",\"Taiwan\"\n\"1044\",\"Swiss Life\",\"SLHN.SW\",\"14967219162\",\"484.26\",\"Switzerland\"\n\"1045\",\"Telefonica Brasil\",\"VIV\",\"14887016448\",\"8.89\",\"Brazil\"\n\"1046\",\"China Merchants Shekou Industrial Zone\",\"001979.SZ\",\"14869384537\",\"1.92\",\"China\"\n\"1047\",\"Associated British Foods\",\"ABF.L\",\"14867805927\",\"1870.94\",\"United Kingdom\"\n\"1048\",\"Grupo Bimbo\",\"BIMBOA.MX\",\"14848312640\",\"3.38\",\"Mexico\"\n\"1049\",\"Tenaris\",\"TS\",\"14843764736\",\"25.15\",\"Luxembourg\"\n\"1050\",\"SolarEdge\",\"SEDG\",\"14797271040\",\"267.16\",\"Israel\"\n\"1051\",\"Eurofins Scientific\",\"ERF.PA\",\"14794644915\",\"76.88\",\"Luxembourg\"\n\"1052\",\"Trimble\",\"TRMB\",\"14788395008\",\"59.12\",\"United States\"\n\"1053\",\"Shimano\",\"7309.T\",\"14784310375\",\"162.22\",\"Japan\"\n\"1054\",\"Campbell Soup\",\"CPB\",\"14776315904\",\"49.16\",\"United States\"\n\"1055\",\"Standard Bank Group\",\"SBK.JO\",\"14750515537\",\"8.94\",\"South Africa\"\n\"1056\",\"ZoomInfo\",\"ZI\",\"14697624576\",\"36.44\",\"United States\"\n\"1057\",\"DiDi\",\"DIDIY\",\"14659201024\",\"3.02\",\"China\"\n\"1058\",\"Alliant Energy\",\"LNT\",\"14640013312\",\"58.37\",\"United States\"\n\"1059\",\"Marubeni\",\"8002.T\",\"14637211177\",\"8.64\",\"Japan\"\n\"1060\",\"NVR\",\"NVR\",\"14624325632\",\"4445.53\",\"United States\"\n\"1061\",\"Expedia Group\",\"EXPE\",\"14581633024\",\"92.82\",\"United States\"\n\"1062\",\"Darden Restaurants\",\"DRI\",\"14573920256\",\"116.84\",\"United States\"\n\"1063\",\"Akamai\",\"AKAM\",\"14566915072\",\"90.87\",\"United States\"\n\"1064\",\"Cardinal Health\",\"CAH\",\"14558498816\",\"53.44\",\"United States\"\n\"1065\",\"Teradyne\",\"TER\",\"14544030720\",\"90.79\",\"United States\"\n\"1066\",\"China Unicom\",\"0762.HK\",\"14539415144\",\"0.48\",\"Hong Kong\"\n\"1067\",\"SEGRO\",\"SGRO.L\",\"14501205187\",\"1199.35\",\"United Kingdom\"\n\"1068\",\"Nissan\",\"7201.T\",\"14487917643\",\"3.7\",\"Japan\"\n\"1069\",\"Shanghai Airport\",\"600009.SS\",\"14485512375\",\"7.52\",\"China\"\n\"1070\",\"CarMax\",\"KMX\",\"14455455744\",\"90.82\",\"United States\"\n\"1071\",\"Shinhan Financial Group\",\"SHG\",\"14441759744\",\"27.13\",\"South Korea\"\n\"1072\",\"China Southern Airlines\",\"ZNH\",\"14436993024\",\"27.61\",\"China\"\n\"1073\",\"Domino's Pizza\",\"DPZ\",\"14436080640\",\"400.5\",\"United States\"\n\"1074\",\"NetApp\",\"NTAP\",\"14421586944\",\"65.2\",\"United States\"\n\"1075\",\"Marathon Oil\",\"MRO\",\"14419204096\",\"20.38\",\"United States\"\n\"1076\",\"Healthpeak Properties\",\"PEAK\",\"14406171648\",\"26.7\",\"United States\"\n\"1077\",\"Pidilite\",\"PIDILITIND.NS\",\"14389167297\",\"28.31\",\"India\"\n\"1078\",\"LKQ Corporation\",\"LKQ\",\"14387714048\",\"50.87\",\"United States\"\n\"1079\",\"Equity LifeStyle Properties\",\"ELS\",\"14378648576\",\"73.62\",\"United States\"\n\"1080\",\"CNP Assurances\",\"CNP.PA\",\"14366616004\",\"20.94\",\"France\"\n\"1081\",\"American Homes 4 Rent\",\"AMH\",\"14356146176\",\"35.92\",\"United States\"\n\"1082\",\"HDFC Life\",\"HDFCLIFE.NS\",\"14345518944\",\"6.79\",\"India\"\n\"1083\",\"SBI Life Insurance\",\"SBILIFE.NS\",\"14341915239\",\"14.34\",\"India\"\n\"1084\",\"Loews Corporation\",\"L\",\"14311180288\",\"58.15\",\"United States\"\n\"1085\",\"Western Digital\",\"WDC\",\"14285158400\",\"45.62\",\"United States\"\n\"1086\",\"LPL Financial\",\"LPLA\",\"14277698560\",\"178.55\",\"United States\"\n\"1087\",\"AES\",\"AES\",\"14272167936\",\"21.37\",\"United States\"\n\"1088\",\"IDEX\",\"IEX\",\"14261310464\",\"187.64\",\"United States\"\n\"1089\",\"Bio-Techne\",\"TECH\",\"14247841792\",\"363.16\",\"United States\"\n\"1090\",\"J.M. Smucker Company\",\"SJM\",\"14231353344\",\"133.56\",\"United States\"\n\"1091\",\"Swedbank\",\"SWED-A.ST\",\"14230920599\",\"12.67\",\"Sweden\"\n\"1092\",\"Hindustan Zinc\",\"HINDZINC.NS\",\"14229125536\",\"3.37\",\"India\"\n\"1093\",\"Credit Suisse\",\"CS\",\"14221350912\",\"5.47\",\"Switzerland\"\n\"1094\",\"Albertsons\",\"ACI\",\"14217375744\",\"26.75\",\"United States\"\n\"1095\",\"Hyundai Mobis\",\"012330.KS\",\"14204180135\",\"156.01\",\"South Korea\"\n\"1096\",\"Adani Power\",\"ADANIPOWER.NS\",\"14201327880\",\"3.68\",\"India\"\n\"1097\",\"Xylem\",\"XYL\",\"14189527040\",\"78.79\",\"United States\"\n\"1098\",\"Exor\",\"EYX.F\",\"14189486142\",\"61.64\",\"Netherlands\"\n\"1099\",\"Camden Property Trust\",\"CPT\",\"14179010560\",\"133.11\",\"United States\"\n\"1100\",\"Generac Power Systems\",\"GNRC\",\"14153025536\",\"221.73\",\"United States\"\n\"1101\",\"Tyler Technologies\",\"TYL\",\"14126564352\",\"340.62\",\"United States\"\n\"1102\",\"KPN\",\"KPN.F\",\"14122638351\",\"3.39\",\"Netherlands\"\n\"1103\",\"Coinbase\",\"COIN\",\"14087601152\",\"53.79\",\"United States\"\n\"1104\",\"Novolipetsk Steel\",\"NLMK.ME\",\"14047824989\",\"2.34\",\"Russia\"\n\"1105\",\"Iron Mountain\",\"IRM\",\"14022520832\",\"48.26\",\"United States\"\n\"1106\",\"Swire Properties\",\"1972.HK\",\"13980809066\",\"2.39\",\"Hong Kong\"\n\"1107\",\"Bajaj Auto\",\"BAJAJ-AUTO.NS\",\"13971421060\",\"48.4\",\"India\"\n\"1108\",\"Leidos\",\"LDOS\",\"13947723776\",\"102.06\",\"United States\"\n\"1109\",\"Fresenius Medical Care\",\"FMS\",\"13923907584\",\"23.28\",\"Germany\"\n\"1110\",\"Wharf REIC\",\"1997.HK\",\"13904145256\",\"4.58\",\"Hong Kong\"\n\"1111\",\"Bank Leumi\",\"LUMI.TA\",\"13878871318\",\"9.3\",\"Israel\"\n\"1112\",\"Power Financial\",\"PWF-PS.TO\",\"13865844361\",\"15.09\",\"Canada\"\n\"1113\",\"Secom\",\"9735.T\",\"13856154169\",\"64.07\",\"Japan\"\n\"1114\",\"Tata Steel\",\"TATASTEEL.NS\",\"13855541995\",\"11.35\",\"India\"\n\"1115\",\"JDE Peet's\",\"JDE.F\",\"13841255095\",\"27.41\",\"Netherlands\"\n\"1116\",\"Howmet Aerospace\",\"HWM\",\"13820414976\",\"33.07\",\"United States\"\n\"1117\",\"Boston Properties\",\"BXP\",\"13782819840\",\"87.95\",\"United States\"\n\"1118\",\"Teck Resources\",\"TECK\",\"13781452800\",\"25.74\",\"Canada\"\n\"1119\",\"Formula One Group\",\"FWONK\",\"13778725888\",\"59.85\",\"United States\"\n\"1120\",\"Jack Henry &amp; Associates\",\"JKHY\",\"13758493696\",\"188.83\",\"United States\"\n\"1121\",\"Ono Pharmaceutical\",\"4528.T\",\"13754910551\",\"28.17\",\"Japan\"\n\"1122\",\"Power Assets\",\"0006.HK\",\"13689588651\",\"6.41\",\"Hong Kong\"\n\"1123\",\"Almarai\",\"2280.SR\",\"13639170346\",\"13.72\",\"Saudi Arabia\"\n\"1124\",\"Entegris\",\"ENTG\",\"13623327744\",\"91.57\",\"United States\"\n\"1125\",\"Avery Dennison\",\"AVY\",\"13593991168\",\"166.36\",\"United States\"\n\"1126\",\"Sasol\",\"SSL\",\"13552975872\",\"21.33\",\"South Africa\"\n\"1127\",\"Ajinomoto\",\"2802.T\",\"13547678676\",\"25.25\",\"Japan\"\n\"1128\",\"Itaúsa\",\"ITSA3.SA\",\"13531824768\",\"1.6\",\"Brazil\"\n\"1129\",\"OMV\",\"OMV.F\",\"13529297022\",\"39.72\",\"Austria\"\n\"1130\",\"3i Group\",\"III.L\",\"13506805748\",\"1381.21\",\"United Kingdom\"\n\"1131\",\"Brookfield Property Partners\",\"BPYPP\",\"13500818432\",\"20.43\",\"Bermuda\"\n\"1132\",\"OBIC\",\"4684.T\",\"13482780249\",\"152.04\",\"Japan\"\n\"1133\",\"Grupo Elektra\",\"XEKT.MC\",\"13467905416\",\"53.8\",\"Mexico\"\n\"1134\",\"HubSpot\",\"HUBS\",\"13454645248\",\"281.66\",\"United States\"\n\"1135\",\"Bolloré\",\"BOP.F\",\"13436910496\",\"4.48\",\"France\"\n\"1136\",\"Shaw Communications\",\"SJR\",\"13434424320\",\"26.9\",\"Canada\"\n\"1137\",\"Prada\",\"1913.HK\",\"13430141644\",\"5.25\",\"Italy\"\n\"1138\",\"NortonLifeLock\",\"NLOK\",\"13411080192\",\"23.12\",\"United States\"\n\"1139\",\"Kirin Holdings\",\"2503.T\",\"13410732720\",\"16.16\",\"Japan\"\n\"1140\",\"Aviva\",\"AV.L\",\"13392562603\",\"473.68\",\"United Kingdom\"\n\"1141\",\"Warner Music Group\",\"WMG\",\"13380925440\",\"25.99\",\"United States\"\n\"1142\",\"Capitec Bank\",\"CPI.JO\",\"13378098430\",\"115.23\",\"South Africa\"\n\"1143\",\"Inpex\",\"1605.T\",\"13328633653\",\"10.17\",\"Japan\"\n\"1144\",\"Vodacom\",\"5VD.F\",\"13280862986\",\"7.84\",\"South Africa\"\n\"1145\",\"Uni-President Enterprises\",\"1216.TW\",\"13233483245\",\"2.33\",\"Taiwan\"\n\"1146\",\"Textron\",\"TXT\",\"13227604992\",\"61.5\",\"United States\"\n\"1147\",\"Targa Resources\",\"TRGP\",\"13216464896\",\"57.97\",\"United States\"\n\"1148\",\"Bunge\",\"BG\",\"13215128576\",\"87.1\",\"United States\"\n\"1149\",\"WSP Global\",\"WSP.TO\",\"13207427636\",\"111.86\",\"Canada\"\n\"1150\",\"Omnicom\",\"OMC\",\"13193656320\",\"64.13\",\"United States\"\n\"1151\",\"Carlisle Companies\",\"CSL\",\"13167866880\",\"254.71\",\"United States\"\n\"1152\",\"AppLovin\",\"APP\",\"13167343616\",\"34.83\",\"United States\"\n\"1153\",\"Bill.com\",\"BILL\",\"13152355328\",\"126.14\",\"United States\"\n\"1154\",\"Sysmex\",\"6869.T\",\"13137419376\",\"62.79\",\"Japan\"\n\"1155\",\"Metro\",\"MRU.TO\",\"13133462642\",\"54.73\",\"Canada\"\n\"1156\",\"FMC\",\"FMC\",\"13108989952\",\"104.09\",\"United States\"\n\"1157\",\"POSCO\",\"PKX\",\"13066746880\",\"43.03\",\"South Korea\"\n\"1158\",\"Jerónimo Martins\",\"JEM.F\",\"13063726592\",\"20.43\",\"Portugal\"\n\"1159\",\"Chandra Asri Petrochemical\",\"TPIA.JK\",\"13061895079\",\"0.6\",\"Indonesia\"\n\"1160\",\"NN Group\",\"NN.AS\",\"13052732879\",\"43.63\",\"Netherlands\"\n\"1161\",\"Cboe\",\"CBOE\",\"13034169344\",\"122.75\",\"United States\"\n\"1162\",\"Packaging Corporation of America\",\"PKG\",\"13023529984\",\"138.99\",\"United States\"\n\"1163\",\"Antofagasta\",\"ANTO.L\",\"12957025749\",\"1259.97\",\"United Kingdom\"\n\"1164\",\"Continental\",\"CON.DE\",\"12935531471\",\"64.68\",\"Germany\"\n\"1165\",\"Nippon Steel\",\"5401.T\",\"12932667763\",\"14.04\",\"Japan\"\n\"1166\",\"Eisai\",\"4523.T\",\"12926204690\",\"45.09\",\"Japan\"\n\"1167\",\"NICE\",\"NICE\",\"12850889728\",\"200.14\",\"Israel\"\n\"1168\",\"Citrix Systems\",\"CTXS\",\"12830148608\",\"101.36\",\"United States\"\n\"1169\",\"IHH Healthcare\",\"Q0F.SI\",\"12773078392\",\"1.45\",\"Malaysia\"\n\"1170\",\"Subaru\",\"7270.T\",\"12766507488\",\"16.65\",\"Japan\"\n\"1171\",\"Formosa Chemicals &amp; Fibre\",\"1326.TW\",\"12661997290\",\"2.16\",\"Taiwan\"\n\"1172\",\"Masco\",\"MAS\",\"12653462528\",\"53.63\",\"United States\"\n\"1173\",\"DocuSign\",\"DOCU\",\"12638459904\",\"63.21\",\"United States\"\n\"1174\",\"First Quantum Minerals\",\"FM.TO\",\"12622978263\",\"16.73\",\"Canada\"\n\"1175\",\"bioMérieux\",\"BIM.PA\",\"12576296414\",\"105.18\",\"France\"\n\"1176\",\"Steel Dynamics\",\"STLD\",\"12572413952\",\"66.63\",\"United States\"\n\"1177\",\"Indian Oil\",\"IOC.NS\",\"12547954267\",\"0.89\",\"India\"\n\"1178\",\"Sino Biopharmaceutical\",\"1177.HK\",\"12535859929\",\"0.67\",\"China\"\n\"1179\",\"JBS\",\"JBSS3.SA\",\"12524485424\",\"5.65\",\"Brazil\"\n\"1180\",\"EQT Corporation\",\"EQT\",\"12492164096\",\"33.81\",\"United States\"\n\"1181\",\"kyowa Kirin\",\"4151.T\",\"12488499398\",\"23.24\",\"Japan\"\n\"1182\",\"Carrefour\",\"CA.PA\",\"12480119698\",\"16.87\",\"France\"\n\"1183\",\"Siam Cement\",\"SCC.BK\",\"12435061205\",\"10.36\",\"Thailand\"\n\"1184\",\"Unilever Indonesia\",\"UNVR.JK\",\"12423890639\",\"0.33\",\"Indonesia\"\n\"1185\",\"Dassault Aviation\",\"AM.PA\",\"12416147757\",\"149.22\",\"France\"\n\"1186\",\"Siemens Gamesa\",\"GCTAF\",\"12404151296\",\"18.13\",\"Spain\"\n\"1187\",\"Kimco Realty\",\"KIM\",\"12403399680\",\"20.07\",\"United States\"\n\"1188\",\"Molson Coors\",\"TAP\",\"12396820480\",\"57.13\",\"United States\"\n\"1189\",\"Stora Enso\",\"STEAV.HE\",\"12392199851\",\"15.99\",\"Finland\"\n\"1190\",\"Israel Chemicals\",\"ICL\",\"12369510400\",\"9.61\",\"Israel\"\n\"1191\",\"KB Financial Group\",\"KB\",\"12346183680\",\"35.03\",\"South Korea\"\n\"1192\",\"Westlake Chemical\",\"WLK\",\"12326000640\",\"96.05\",\"United States\"\n\"1193\",\"MGM Resorts\",\"MGM\",\"12321424384\",\"28.92\",\"United States\"\n\"1194\",\"Emera\",\"EMA.TO\",\"12316344557\",\"46.81\",\"Canada\"\n\"1195\",\"Divis Laboratories\",\"DIVISLAB.NS\",\"12312013796\",\"46.38\",\"India\"\n\"1196\",\"Pinterest\",\"PINS\",\"12301011968\",\"18.54\",\"United States\"\n\"1197\",\"PTC\",\"PTC\",\"12298856448\",\"105.14\",\"United States\"\n\"1198\",\"Booz Allen Hamilton\",\"BAH\",\"12295330816\",\"92.89\",\"United States\"\n\"1199\",\"Essential Utilities\",\"WTRG\",\"12275265536\",\"46.84\",\"United States\"\n\"1200\",\"Viatris\",\"VTRS\",\"12226348032\",\"10.09\",\"United States\"\n\"1201\",\"China Eastern Airlines\",\"CEA\",\"12224380928\",\"18.95\",\"China\"\n\"1202\",\"Celanese\",\"CE\",\"12221587456\",\"112.84\",\"United States\"\n\"1203\",\"Tech Mahindra\",\"TECHM.NS\",\"12199824985\",\"12.54\",\"India\"\n\"1204\",\"Gaming and Leisure Properties\",\"GLPI\",\"12199317504\",\"47.95\",\"United States\"\n\"1205\",\"New China Life Insurance\",\"601336.SS\",\"12155254149\",\"4.59\",\"China\"\n\"1206\",\"Huazhu Hotels\",\"HTHT\",\"12135794688\",\"37.71\",\"China\"\n\"1207\",\"C. H. Robinson\",\"CHRW\",\"12128450560\",\"95.3\",\"United States\"\n\"1208\",\"Abiomed\",\"ABMD\",\"12126881792\",\"265.79\",\"United States\"\n\"1209\",\"Liberty Media\",\"LSXMB\",\"12117979136\",\"37.02\",\"United States\"\n\"1210\",\"Dabur\",\"DABUR.NS\",\"12110060417\",\"6.84\",\"India\"\n\"1211\",\"United Airlines Holdings\",\"UAL\",\"12069442560\",\"36.94\",\"United States\"\n\"1212\",\"Lufax\",\"LU\",\"12057647104\",\"5.28\",\"China\"\n\"1213\",\"Franklin Resources\",\"BEN\",\"12045668352\",\"24.1\",\"United States\"\n\"1214\",\"Mowi\",\"MNHVF\",\"12041125888\",\"23.2\",\"Norway\"\n\"1215\",\"CNA Financial\",\"CNA\",\"12027173888\",\"44.33\",\"United States\"\n\"1216\",\"Bank Hapoalim\",\"POLI.TA\",\"12006175256\",\"8.99\",\"Israel\"\n\"1217\",\"Nordson\",\"NDSN\",\"12000412672\",\"208.66\",\"United States\"\n\"1218\",\"Arab National Bank\",\"1080.SR\",\"11989768594\",\"7.99\",\"Saudi Arabia\"\n\"1219\",\"Shinkin Central Bank\",\"8421.T\",\"11986768808\",\"1786.88\",\"Japan\"\n\"1220\",\"Mitsubishi Heavy Industries\",\"7011.T\",\"11982530775\",\"35.69\",\"Japan\"\n\"1221\",\"Signature Bank\",\"SBNY\",\"11966388224\",\"190.16\",\"United States\"\n\"1222\",\"Aéroports de Paris\",\"ADP.PA\",\"11953905199\",\"120.81\",\"France\"\n\"1223\",\"Barry Callebaut\",\"BARN.SW\",\"11922940329\",\"2175.33\",\"Switzerland\"\n\"1224\",\"Newcrest Mining\",\"NCM.AX\",\"11905265031\",\"12.99\",\"Australia\"\n\"1225\",\"Unity Software\",\"U\",\"11902682112\",\"40.21\",\"United States\"\n\"1226\",\"Suntory\",\"2587.T\",\"11897926500\",\"38.5\",\"Japan\"\n\"1227\",\"Smith & Nephew\",\"SNN\",\"11863567360\",\"26.92\",\"United Kingdom\"\n\"1228\",\"E.SUN Bank\",\"2884.TW\",\"11859419025\",\"0.89\",\"Taiwan\"\n\"1229\",\"Bangkok Dusit Medical Services (BDMS)\",\"BDMS.BK\",\"11857079249\",\"0.75\",\"Thailand\"\n\"1230\",\"Hua Xia Bank\",\"600015.SS\",\"11853029104\",\"0.77\",\"China\"\n\"1231\",\"Siemens India\",\"SIEMENS.NS\",\"11849540238\",\"33.27\",\"India\"\n\"1232\",\"Swatch\",\"UHR.SW\",\"11843308978\",\"236.17\",\"Switzerland\"\n\"1233\",\"Vifor Pharma\",\"VIFN.SW\",\"11812897246\",\"182.04\",\"Switzerland\"\n\"1234\",\"American Financial Group\",\"AFG\",\"11801094144\",\"138.67\",\"United States\"\n\"1235\",\"B3\",\"B3SA3.SA\",\"11796704623\",\"1.94\",\"Brazil\"\n\"1236\",\"Campari\",\"CPR.MI\",\"11794060292\",\"10.44\",\"Italy\"\n\"1237\",\"Roku\",\"ROKU\",\"11792837632\",\"86.73\",\"United States\"\n\"1238\",\"LG Electronics\",\"LGLG.F\",\"11788304475\",\"16.69\",\"South Korea\"\n\"1239\",\"Suzano\",\"SUZ\",\"11779824640\",\"8.73\",\"Brazil\"\n\"1240\",\"AspenTech\",\"AZPN\",\"11753614336\",\"189.06\",\"United States\"\n\"1241\",\"NiSource\",\"NI\",\"11747853312\",\"28.95\",\"United States\"\n\"1242\",\"QBE Insurance\",\"QBE.AX\",\"11741347502\",\"7.92\",\"Australia\"\n\"1243\",\"Texas Pacific Land Trust\",\"TPL\",\"11734085632\",\"1515.7\",\"United States\"\n\"1244\",\"GoDaddy\",\"GDDY\",\"11709195264\",\"72.25\",\"United States\"\n\"1245\",\"GBL\",\"GBLB.VI\",\"11700485534\",\"81.15\",\"Belgium\"\n\"1246\",\"Severstal\",\"CHMF.ME\",\"11687513808\",\"13.95\",\"Russia\"\n\"1247\",\"Eastman Chemical\",\"EMN\",\"11685730304\",\"90.67\",\"United States\"\n\"1248\",\"Teleflex\",\"TFX\",\"11682111488\",\"249.09\",\"United States\"\n\"1249\",\"Country Garden\",\"2007.HK\",\"11675332374\",\"0.51\",\"China\"\n\"1250\",\"First Horizon National\",\"FHN\",\"11670993920\",\"21.82\",\"United States\"\n\"1251\",\"Carlyle Group\",\"CG\",\"11664633856\",\"32.29\",\"United States\"\n\"1252\",\"New Hope Liuhe\",\"000876.SZ\",\"11637060963\",\"2.58\",\"China\"\n\"1253\",\"ESR\",\"1821.HK\",\"11632630399\",\"2.61\",\"Hong Kong\"\n\"1254\",\"Bunzl\",\"BNZL.L\",\"11591576783\",\"3434.01\",\"United Kingdom\"\n\"1255\",\"Host Hotels & Resorts\",\"HST\",\"11585006592\",\"15.98\",\"United States\"\n\"1256\",\"ENEOS Holdings\",\"5020.T\",\"11582446786\",\"3.66\",\"Japan\"\n\"1257\",\"Hasbro\",\"HAS\",\"11575080960\",\"83.01\",\"United States\"\n\"1258\",\"Sekisui House\",\"1928.T\",\"11570607733\",\"17.29\",\"Japan\"\n\"1259\",\"Hansoh Pharma\",\"3692.HK\",\"11558365822\",\"1.95\",\"China\"\n\"1260\",\"SG Holdings\",\"9143.T\",\"11556028399\",\"18.18\",\"Japan\"\n\"1261\",\"Sumitomo Mitsui Trust Holdings\",\"8309.T\",\"11547624293\",\"30.8\",\"Japan\"\n\"1262\",\"Hai Di Lao Hot Pot\",\"6862.HK\",\"11531787448\",\"2.07\",\"China\"\n\"1263\",\"Edenred\",\"EDEN.PA\",\"11511885225\",\"46.19\",\"France\"\n\"1264\",\"Taiwan Cooperative Financial\",\"5880.TW\",\"11485630372\",\"0.84\",\"Taiwan\"\n\"1265\",\"Carl Zeiss Meditec\",\"AFXA.F\",\"11453254146\",\"122.67\",\"Germany\"\n\"1266\",\"Nippon Yūsen\",\"9101.T\",\"11438941809\",\"67.71\",\"Japan\"\n\"1267\",\"Dynatrace\",\"DT\",\"11430693888\",\"39.85\",\"United States\"\n\"1268\",\"Grasim Industries\",\"GRASIM.NS\",\"11426271397\",\"17.36\",\"India\"\n\"1269\",\"South32\",\"S32.AX\",\"11413226559\",\"2.4\",\"Australia\"\n\"1270\",\"Arca Continental\",\"AC.MX\",\"11403721308\",\"6.46\",\"Mexico\"\n\"1271\",\"Coca-Cola FEMSA\",\"KOF\",\"11401204736\",\"54.27\",\"Mexico\"\n\"1272\",\"Wharf Holdings\",\"0004.HK\",\"11368000881\",\"3.72\",\"Hong Kong\"\n\"1273\",\"Charles River Laboratories\",\"CRL\",\"11362515968\",\"223.65\",\"United States\"\n\"1274\",\"Croda International\",\"CRDA.L\",\"11331553400\",\"8011.51\",\"United Kingdom\"\n\"1275\",\"Sino Land\",\"0083.HK\",\"11307203946\",\"1.47\",\"Hong Kong\"\n\"1276\",\"Britannia Industries\",\"BRITANNIA.NS\",\"11290034531\",\"46.86\",\"India\"\n\"1277\",\"Danske Bank\",\"DANS.VI\",\"11277905601\",\"13.25\",\"Denmark\"\n\"1278\",\"Poste Italiane\",\"PST.MI\",\"11246046793\",\"8.5\",\"Italy\"\n\"1279\",\"Alleghany\",\"Y\",\"11226768384\",\"834.4\",\"United States\"\n\"1280\",\"Nitori Holdings\",\"9843.T\",\"11204827157\",\"99.23\",\"Japan\"\n\"1281\",\"Advance Auto Parts\",\"AAP\",\"11193846784\",\"184.6\",\"United States\"\n\"1282\",\"Toyota Tsusho\",\"8015.T\",\"11178168900\",\"31.77\",\"Japan\"\n\"1283\",\"Publicis Groupe\",\"PUB.PA\",\"11176023521\",\"44.71\",\"France\"\n\"1284\",\"Nomura Holdings\",\"NMR\",\"11156177920\",\"3.68\",\"Japan\"\n\"1285\",\"Service Corporation International\",\"SCI\",\"11151204352\",\"70.25\",\"United States\"\n\"1286\",\"ASX\",\"ASX.AX\",\"11149481317\",\"57.16\",\"Australia\"\n\"1287\",\"AkzoNobel\",\"AKZA.AS\",\"11142298964\",\"62.99\",\"Netherlands\"\n\"1288\",\"Rentokil Initial\",\"RTO.L\",\"11139247736\",\"597.65\",\"United Kingdom\"\n\"1289\",\"Norsk Hydro\",\"NHY.OL\",\"11137382595\",\"5.39\",\"Norway\"\n\"1290\",\"Thai Beverage\",\"TBVPF\",\"11135013888\",\"0.44\",\"Thailand\"\n\"1291\",\"Ally\",\"ALLY\",\"11119243264\",\"34.42\",\"United States\"\n\"1292\",\"Lumen\",\"LUMN\",\"11100229632\",\"10.75\",\"United States\"\n\"1293\",\"Hongkong Land\",\"H78.SI\",\"11095524352\",\"4.95\",\"Hong Kong\"\n\"1294\",\"Interpublic Group\",\"IPG\",\"11059989504\",\"28.1\",\"United States\"\n\"1295\",\"Bureau Veritas\",\"BVI.PA\",\"11048024036\",\"24.28\",\"France\"\n\"1296\",\"Everest Re\",\"RE\",\"11017793536\",\"279.37\",\"BM\"\n\"1297\",\"Etsy\",\"ETSY\",\"11017403392\",\"86.67\",\"United States\"\n\"1298\",\"Godrej\",\"GODREJCP.NS\",\"11015100355\",\"10.77\",\"India\"\n\"1299\",\"Moncler\",\"MONC.MI\",\"11001975441\",\"40.94\",\"Italy\"\n\"1300\",\"Singapore Airlines\",\"C6L.SI\",\"10975850231\",\"3.7\",\"Singapore\"\n\"1301\",\"Apache Corporation\",\"APA\",\"10968863744\",\"32.43\",\"United States\"\n\"1302\",\"Fortum\",\"FORTUM.HE\",\"10964111638\",\"12.34\",\"Finland\"\n\"1303\",\"Sodexo\",\"SW.PA\",\"10960084625\",\"74.75\",\"France\"\n\"1304\",\"FICO\",\"FICO\",\"10950176768\",\"422.27\",\"United States\"\n\"1305\",\"Lamb Weston\",\"LW\",\"10933194752\",\"75.69\",\"United States\"\n\"1306\",\"Crown Holdings\",\"CCK\",\"10917250048\",\"88.8\",\"United States\"\n\"1307\",\"Shandong Gold Mining\",\"600547.SS\",\"10914485022\",\"2.63\",\"China\"\n\"1308\",\"Sonic Healthcare\",\"SHL.AX\",\"10904565824\",\"22.71\",\"Australia\"\n\"1309\",\"Bank Albilad\",\"1140.SR\",\"10897368057\",\"10.9\",\"Saudi Arabia\"\n\"1310\",\"ASE Group\",\"ASX\",\"10894992384\",\"5.09\",\"Taiwan\"\n\"1311\",\"Hotai Motor\",\"2207.TW\",\"10890268722\",\"19.94\",\"Taiwan\"\n\"1312\",\"Reliance Steel &amp; Aluminum\",\"RS\",\"10880253952\",\"175.64\",\"United States\"\n\"1313\",\"Bouygues\",\"EN.PA\",\"10867331539\",\"28.3\",\"France\"\n\"1314\",\"Kikkoman\",\"2801.T\",\"10866350570\",\"56.73\",\"Japan\"\n\"1315\",\"Lasertec\",\"6920.T\",\"10859081532\",\"120.42\",\"Japan\"\n\"1316\",\"UiPath\",\"PATH\",\"10855202816\",\"19.93\",\"United States\"\n\"1317\",\"Korea Electric Power\",\"KEP\",\"10849208320\",\"8.45\",\"South Korea\"\n\"1318\",\"Lenovo\",\"0992.HK\",\"10830191639\",\"0.9\",\"Hong Kong\"\n\"1319\",\"United Therapeutics\",\"UTHR\",\"10827033600\",\"239.01\",\"United States\"\n\"1320\",\"DLF\",\"DLF.NS\",\"10807991997\",\"4.36\",\"India\"\n\"1321\",\"Ramsay Health Care\",\"RHC.AX\",\"10801225098\",\"47.19\",\"Australia\"\n\"1322\",\"Kanzhun\",\"BZ\",\"10795334656\",\"24.82\",\"China\"\n\"1323\",\"NEC Corp\",\"6701.T\",\"10791446662\",\"39.6\",\"Japan\"\n\"1324\",\"Vedanta\",\"VEDL.NS\",\"10788145242\",\"2.9\",\"India\"\n\"1325\",\"First Citizens BancShares\",\"FCNCA\",\"10784381952\",\"676.82\",\"United States\"\n\"1326\",\"Qiagen\",\"QGEN\",\"10758479872\",\"47.3\",\"Netherlands\"\n\"1327\",\"TDK\",\"6762.T\",\"10751439126\",\"28.37\",\"Japan\"\n\"1328\",\"Snap-on\",\"SNA\",\"10744760320\",\"201.31\",\"United States\"\n\"1329\",\"Hong Kong Telecom\",\"6823.HK\",\"10731822017\",\"1.42\",\"Hong Kong\"\n\"1330\",\"Nexi\",\"NEXI.MI\",\"10720400668\",\"8.17\",\"Italy\"\n\"1331\",\"Builders FirstSource\",\"BLDR\",\"10689772544\",\"61.88\",\"United States\"\n\"1332\",\"Rede D'Or Sao Luiz\",\"RDOR3.SA\",\"10679800796\",\"5.41\",\"Brazil\"\n\"1333\",\"PulteGroup\",\"PHM\",\"10676581376\",\"44.93\",\"United States\"\n\"1334\",\"Fidelity National Financial\",\"FNF\",\"10658331648\",\"37.97\",\"United States\"\n\"1335\",\"Henry Schein\",\"HSIC\",\"10645112832\",\"77.11\",\"United States\"\n\"1336\",\"First Financial Holding\",\"2892.TW\",\"10643842732\",\"0.82\",\"Taiwan\"\n\"1337\",\"SK Innovation\",\"096775.KS\",\"10638275958\",\"82.21\",\"South Korea\"\n\"1338\",\"Acciona\",\"ANA.MC\",\"10616869068\",\"194.27\",\"Spain\"\n\"1339\",\"Adani Wilmar\",\"AWL.NS\",\"10599575523\",\"8.15\",\"India\"\n\"1340\",\"OpenText\",\"OTEX\",\"10565862400\",\"38.94\",\"Canada\"\n\"1341\",\"James Hardie Industries\",\"JHX\",\"10556738560\",\"23.7\",\"Ireland\"\n\"1342\",\"WPP\",\"WPP\",\"10555172864\",\"46.88\",\"United Kingdom\"\n\"1343\",\"Plug Power\",\"PLUG\",\"10552829952\",\"17.89\",\"United States\"\n\"1344\",\"Agilon Health\",\"AGL\",\"10550602752\",\"25.94\",\"United States\"\n\"1345\",\"RPM International\",\"RPM\",\"10539679744\",\"81.39\",\"United States\"\n\"1346\",\"Liberty Global\",\"LBTYB\",\"10539267072\",\"21.75\",\"United Kingdom\"\n\"1347\",\"AMEC\",\"688012.SS\",\"10520456461\",\"17.07\",\"China\"\n\"1348\",\"Regency Centers\",\"REG\",\"10470418432\",\"60.48\",\"United States\"\n\"1349\",\"REA Group\",\"REA.AX\",\"10457364472\",\"79.15\",\"Australia\"\n\"1350\",\"Asahi Kasei\",\"3407.T\",\"10449841203\",\"7.53\",\"Japan\"\n\"1351\",\"ASM International\",\"ASM.AS\",\"10436029329\",\"214.93\",\"Netherlands\"\n\"1352\",\"Yara International\",\"YAR.OL\",\"10399024330\",\"40.53\",\"Norway\"\n\"1353\",\"Ryan Specialty Group\",\"RYAN\",\"10348439552\",\"39.93\",\"United States\"\n\"1354\",\"Brambles\",\"BXB.AX\",\"10340000076\",\"7.46\",\"Australia\"\n\"1355\",\"Lundbergföretagen\",\"LUND-B.ST\",\"10335889668\",\"41.98\",\"Sweden\"\n\"1356\",\"Siemens Energy\",\"ENR.F\",\"10322812718\",\"14.39\",\"Germany\"\n\"1357\",\"Enel Américas\",\"ENIA\",\"10320480256\",\"4.81\",\"Chile\"\n\"1358\",\"Westrock\",\"WRK\",\"10320231424\",\"40.5\",\"United States\"\n\"1359\",\"Biohaven Pharmaceutical\",\"BHVN\",\"10319734784\",\"145.26\",\"United States\"\n\"1360\",\"Erie Indemnity\",\"ERIE\",\"10279932928\",\"196.6\",\"United States\"\n\"1361\",\"Amundi\",\"AMUN.PA\",\"10278610309\",\"50.68\",\"France\"\n\"1362\",\"Ovintiv\",\"OVV\",\"10258245632\",\"39.74\",\"United States\"\n\"1363\",\"Paylocity\",\"PCTY\",\"10247700480\",\"185.9\",\"United States\"\n\"1364\",\"Tenaga Nasional\",\"TNABY\",\"10235984896\",\"6.83\",\"Malaysia\"\n\"1365\",\"Carnival\",\"CCL\",\"10234935296\",\"8.67\",\"United States\"\n\"1366\",\"Morningstar\",\"MORN\",\"10207912960\",\"238.89\",\"United States\"\n\"1367\",\"Amdocs\",\"DOX\",\"10204318720\",\"83.07\",\"United States\"\n\"1368\",\"Qorvo\",\"QRVO\",\"10196364288\",\"98.3\",\"United States\"\n\"1369\",\"Alfa Laval\",\"ALFA.ST\",\"10183201813\",\"24.64\",\"Sweden\"\n\"1370\",\"Rexford Industrial\",\"REXR\",\"10173134848\",\"59.83\",\"United States\"\n\"1371\",\"InterContinental Hotels Group\",\"IHG\",\"10166884352\",\"55.25\",\"United Kingdom\"\n\"1372\",\"Graco\",\"GGG\",\"10166312960\",\"60.08\",\"United States\"\n\"1373\",\"Eicher Motors\",\"EICHERMOT.NS\",\"10159014338\",\"37.15\",\"India\"\n\"1374\",\"Red Eléctrica\",\"REE.MC\",\"10140251383\",\"18.8\",\"Spain\"\n\"1375\",\"Magellan Midstream Partners\",\"MMP\",\"10140118016\",\"47.93\",\"United States\"\n\"1376\",\"Western Midstream\",\"WES\",\"10131750912\",\"25.12\",\"United States\"\n\"1377\",\"Aluminum Corporation of China\",\"ACH\",\"10112157696\",\"8.98\",\"China\"\n\"1378\",\"Black Knight\",\"BKI\",\"10092559360\",\"64.71\",\"United States\"\n\"1379\",\"SBI Card\",\"SBICARD.NS\",\"10083582988\",\"10.69\",\"India\"\n\"1380\",\"CIMB Group\",\"1023.KL\",\"10070020753\",\"1.15\",\"Malaysia\"\n\"1381\",\"Gjensidige Forsikring\",\"XGJ.F\",\"10060795367\",\"20.01\",\"Norway\"\n\"1382\",\"GameStop\",\"GME\",\"10060446720\",\"132.15\",\"United States\"\n\"1383\",\"Getlink\",\"GET.PA\",\"10040153709\",\"18.6\",\"France\"\n\"1384\",\"Computershare\",\"CPU.AX\",\"10023378971\",\"16.6\",\"Australia\"\n\"1385\",\"Hubbell\",\"HUBB\",\"10011589632\",\"186.57\",\"United States\"\n\"1386\",\"Worldline\",\"WLN.PA\",\"10003468871\",\"35.33\",\"France\"\n\"1387\",\"HF Sinclair\",\"DINO\",\"9987310592\",\"44.74\",\"United States\"\n\"1388\",\"Bentley Systems\",\"BSY\",\"9983181824\",\"34.72\",\"United States\"\n\"1389\",\"MarketAxess\",\"MKTX\",\"9972191232\",\"264.22\",\"United States\"\n\"1390\",\"Yonyou\",\"600588.SS\",\"9962793782\",\"2.9\",\"China\"\n\"1391\",\"Globe Life\",\"GL\",\"9945988096\",\"100.87\",\"United States\"\n\"1392\",\"Quanta Computer\",\"2382.TW\",\"9920148808\",\"2.57\",\"Taiwan\"\n\"1393\",\"Omron\",\"6645.T\",\"9878232474\",\"49.44\",\"Japan\"\n\"1394\",\"Equitable Holdings\",\"EQH\",\"9875676160\",\"25.92\",\"United States\"\n\"1395\",\"Watsco\",\"WSO\",\"9872649216\",\"254.1\",\"United States\"\n\"1396\",\"Burlington Stores\",\"BURL\",\"9869189120\",\"149.37\",\"United States\"\n\"1397\",\"INWIT\",\"INW.MI\",\"9862284549\",\"10.28\",\"Italy\"\n\"1398\",\"Advantest\",\"6857.T\",\"9856308302\",\"51.9\",\"Japan\"\n\"1399\",\"CapitaLand Mall Trust\",\"C38U.SI\",\"9855451910\",\"1.49\",\"Singapore\"\n\"1400\",\"Chesapeake Energy\",\"CHK\",\"9848011776\",\"77.43\",\"United States\"\n\"1401\",\"Taiwan Mobile\",\"3045.TW\",\"9829762012\",\"3.49\",\"Taiwan\"\n\"1402\",\"Jazz Pharmaceuticals\",\"JAZZ\",\"9784427520\",\"156.7\",\"Ireland\"\n\"1403\",\"Bruker\",\"BRKR\",\"9750830080\",\"65.33\",\"United States\"\n\"1404\",\"Hindalco Industries\",\"HINDALCO.NS\",\"9733426828\",\"4.36\",\"India\"\n\"1405\",\"Life Storage\",\"LSI\",\"9727062016\",\"114\",\"United States\"\n\"1406\",\"Grifols\",\"GRFS\",\"9720487936\",\"10.68\",\"Spain\"\n\"1407\",\"Next plc\",\"NXT.L\",\"9712928289\",\"7505.14\",\"United Kingdom\"\n\"1408\",\"Comerica\",\"CMA\",\"9708930048\",\"74.25\",\"United States\"\n\"1409\",\"Halma\",\"HLMA.L\",\"9702204339\",\"2555.6\",\"United Kingdom\"\n\"1410\",\"AerCap\",\"AER\",\"9694582784\",\"39.47\",\"Ireland\"\n\"1411\",\"Vistra\",\"VST\",\"9693583360\",\"22.45\",\"United States\"\n\"1412\",\"Elbit Systems\",\"ESLT\",\"9663606784\",\"218.18\",\"Israel\"\n\"1413\",\"Assurant\",\"AIZ\",\"9659328512\",\"178.6\",\"United States\"\n\"1414\",\"Industrivarden\",\"INDU-A.ST\",\"9653890071\",\"22.7\",\"Sweden\"\n\"1415\",\"Credicorp\",\"BAP\",\"9634506752\",\"121.14\",\"Bermuda\"\n\"1416\",\"PUMA\",\"PUM.DE\",\"9630745227\",\"64.37\",\"Germany\"\n\"1417\",\"Vivendi\",\"VIV.PA\",\"9627847755\",\"9.3\",\"France\"\n\"1418\",\"Saputo\",\"SAP.TO\",\"9625415168\",\"23.09\",\"Canada\"\n\"1419\",\"Havells India\",\"HAVELLS.NS\",\"9623609439\",\"15.36\",\"India\"\n\"1420\",\"Erste Group Bank\",\"EBO.F\",\"9622037366\",\"23.73\",\"Austria\"\n\"1421\",\"XP Inc.\",\"XP\",\"9621108736\",\"17.18\",\"Brazil\"\n\"1422\",\"Scentre Group\",\"SCG.AX\",\"9613764435\",\"1.85\",\"Australia\"\n\"1423\",\"Yang Ming\",\"2609.TW\",\"9607634481\",\"2.75\",\"Taiwan\"\n\"1424\",\"Localiza\",\"RENT3.SA\",\"9607092445\",\"9.85\",\"Brazil\"\n\"1425\",\"Evonik Industries\",\"EVK.DE\",\"9605074695\",\"19.72\",\"Germany\"\n\"1426\",\"Chailease Holding\",\"5871.TW\",\"9594419010\",\"6.3\",\"Taiwan\"\n\"1427\",\"Anaplan\",\"PLAN\",\"9593149440\",\"63.73\",\"United States\"\n\"1428\",\"Kasikornbank\",\"KBANK.BK\",\"9591766234\",\"4.05\",\"Thailand\"\n\"1429\",\"Annaly Capital Management\",\"NLY\",\"9545636864\",\"6.12\",\"United States\"\n\"1430\",\"Elanco\",\"ELAN\",\"9535255552\",\"20.11\",\"United States\"\n\"1431\",\"Suncorp\",\"SUN.AX\",\"9516655759\",\"7.54\",\"Australia\"\n\"1432\",\"ICICI Prulife\",\"ICICIPRULI.NS\",\"9512760065\",\"6.61\",\"India\"\n\"1433\",\"CubeSmart\",\"CUBE\",\"9499011072\",\"42.05\",\"United States\"\n\"1434\",\"Cipla\",\"CIPLA.NS\",\"9496695058\",\"11.77\",\"India\"\n\"1435\",\"WH Group\",\"0288.HK\",\"9479928220\",\"0.74\",\"Hong Kong\"\n\"1436\",\"Hua Nan Financial Holdings\",\"2880.TW\",\"9461939263\",\"0.72\",\"Taiwan\"\n\"1437\",\"MTU Aero Engines\",\"MTX.DE\",\"9454061209\",\"176.92\",\"Germany\"\n\"1438\",\"SK Telecom\",\"SKM\",\"9428099072\",\"23.34\",\"South Korea\"\n\"1439\",\"Ares Capital\",\"ARCC\",\"9418213376\",\"19.04\",\"United States\"\n\"1440\",\"Antero Resources\",\"AR\",\"9409792000\",\"30.25\",\"United States\"\n\"1441\",\"Medical Properties Trust\",\"MPW\",\"9400565760\",\"15.67\",\"United States\"\n\"1442\",\"Informa plc\",\"INF.L\",\"9392071547\",\"635.69\",\"United Kingdom\"\n\"1443\",\"LG Corp\",\"003550.KS\",\"9386466483\",\"58.81\",\"South Korea\"\n\"1444\",\"East West Bancorp\",\"EWBC\",\"9380829184\",\"66.11\",\"United States\"\n\"1445\",\"Brenntag\",\"BNR.DE\",\"9380302319\",\"60.71\",\"Germany\"\n\"1446\",\"Repligen\",\"RGEN\",\"9375139840\",\"169.13\",\"United States\"\n\"1447\",\"Spirax-Sarco Engineering\",\"SPX.L\",\"9364439164\",\"12694.79\",\"United Kingdom\"\n\"1448\",\"Yandex\",\"YNDX.ME\",\"9355487462\",\"28.94\",\"Netherlands\"\n\"1449\",\"Darling Ingredients\",\"DAR\",\"9329048576\",\"57.76\",\"United States\"\n\"1450\",\"Full Truck Alliance\",\"YMM\",\"9327185920\",\"8.42\",\"China\"\n\"1451\",\"Yakult\",\"2267.T\",\"9324382803\",\"59.51\",\"Japan\"\n\"1452\",\"Juniper Networks\",\"JNPR\",\"9321290752\",\"28.85\",\"United States\"\n\"1453\",\"Julius Bär\",\"BAER.SW\",\"9320319896\",\"44.55\",\"Switzerland\"\n\"1454\",\"Pan Pacific\",\"7532.T\",\"9318984756\",\"15.63\",\"Japan\"\n\"1455\",\"Lamar Advertising\",\"LAMR\",\"9275454464\",\"91.4\",\"United States\"\n\"1456\",\"Delivery Hero\",\"DHER.F\",\"9272773567\",\"38.09\",\"Germany\"\n\"1457\",\"Bank Negara Indonesia\",\"BBNI.JK\",\"9271459590\",\"0.5\",\"Indonesia\"\n\"1458\",\"BJ's Wholesale Club\",\"BJ\",\"9265374208\",\"68.54\",\"United States\"\n\"1459\",\"American Airlines\",\"AAL\",\"9265332224\",\"14.27\",\"United States\"\n\"1460\",\"Ambuja Cements\",\"AMBUJACEM.NS\",\"9264148927\",\"4.66\",\"India\"\n\"1461\",\"Whirlpool\",\"WHR\",\"9259486208\",\"164.75\",\"United States\"\n\"1462\",\"Dr. Reddy's\",\"RDY\",\"9257973760\",\"55.78\",\"India\"\n\"1463\",\"Saudi International Petrochemical Company (Sipchem)\",\"2310.SR\",\"9251656110\",\"12.62\",\"Saudi Arabia\"\n\"1464\",\"AECOM\",\"ACM\",\"9216833536\",\"65.35\",\"United States\"\n\"1465\",\"Bilibili\",\"BILI\",\"9212935168\",\"24.06\",\"China\"\n\"1466\",\"Clarivate\",\"CLVT\",\"9197121536\",\"13.68\",\"United Kingdom\"\n\"1467\",\"F5 Networks\",\"FFIV\",\"9194162176\",\"152.04\",\"United States\"\n\"1468\",\"Dish Network\",\"DISH\",\"9192797184\",\"17.35\",\"United States\"\n\"1469\",\"News Corp\",\"NWS\",\"9189396480\",\"15.87\",\"United States\"\n\"1470\",\"Adevinta\",\"ADE.OL\",\"9185834844\",\"7.02\",\"Norway\"\n\"1471\",\"Zendesk\",\"ZEN\",\"9162733568\",\"74.33\",\"United States\"\n\"1472\",\"Wan Hai Lines\",\"2615.TW\",\"9158357870\",\"3.75\",\"Taiwan\"\n\"1473\",\"Rémy Cointreau\",\"RCO.PA\",\"9157875515\",\"180.49\",\"France\"\n\"1474\",\"Neurocrine Biosciences\",\"NBIX\",\"9154336768\",\"95.78\",\"United States\"\n\"1475\",\"Amerco\",\"UHAL\",\"9136254976\",\"465.95\",\"United States\"\n\"1476\",\"Cochlear\",\"COH.AX\",\"9115079273\",\"138.58\",\"Australia\"\n\"1477\",\"Kesko\",\"KESKOA.HE\",\"9111499487\",\"21.67\",\"Finland\"\n\"1478\",\"Grab Holdings\",\"GRAB\",\"9099851776\",\"2.37\",\"Singapore\"\n\"1479\",\"HMM\",\"011200.KS\",\"9097479796\",\"18.01\",\"South Korea\"\n\"1480\",\"HeidelbergCement\",\"HEI.DE\",\"9096390210\",\"47.11\",\"Germany\"\n\"1481\",\"Far EasTone\",\"4904.TW\",\"9085057300\",\"2.79\",\"Taiwan\"\n\"1482\",\"Olaplex\",\"OLPX\",\"9084991488\",\"14\",\"United States\"\n\"1483\",\"KEPCO\",\"9503.T\",\"9081179935\",\"10.18\",\"Japan\"\n\"1484\",\"WiseTech Global\",\"WTC.AX\",\"9071416849\",\"27.8\",\"Australia\"\n\"1485\",\"ABN AMRO\",\"ABN.AS\",\"9069981410\",\"10.11\",\"Netherlands\"\n\"1486\",\"Algonquin Power & Utilities\",\"AQN\",\"9066323968\",\"13.42\",\"Canada\"\n\"1487\",\"Impala Platinum\",\"IMP.JO\",\"9062835638\",\"10.1\",\"South Africa\"\n\"1488\",\"Mizrahi-Tefahot\",\"MZTF.TA\",\"9060288693\",\"35.31\",\"Israel\"\n\"1489\",\"Shree Cement\",\"SHREECEM.NS\",\"9058792965\",\"251.07\",\"India\"\n\"1490\",\"ST Engineering\",\"SJX.F\",\"9048355395\",\"2.9\",\"Singapore\"\n\"1491\",\"Talanx\",\"TLX.DE\",\"9034741189\",\"35.7\",\"Germany\"\n\"1492\",\"NRG Energy\",\"NRG\",\"9033401344\",\"38.07\",\"United States\"\n\"1493\",\"Knorr-Bremse\",\"KBX.DE\",\"9031447296\",\"55.87\",\"Germany\"\n\"1494\",\"Kingdom Holding\",\"4280.SR\",\"9005306789\",\"2.43\",\"Saudi Arabia\"\n\"1495\",\"Williams-Sonoma\",\"WSM\",\"9004171264\",\"130.95\",\"United States\"\n\"1496\",\"Nitto Denko\",\"6988.T\",\"9003904186\",\"60.83\",\"Japan\"\n\"1497\",\"Recordati\",\"REC.MI\",\"8995928036\",\"43.76\",\"Italy\"\n\"1498\",\"Azrieli Group\",\"AZRG.TA\",\"8932622104\",\"73.6\",\"Israel\"\n\"1499\",\"A. O. Smith\",\"AOS\",\"8930933760\",\"57.25\",\"United States\"\n\"1500\",\"Schroders\",\"SDR.L\",\"8927620621\",\"3228.38\",\"United Kingdom\"\n\"1501\",\"Tata Power\",\"TATAPOWER.NS\",\"8906439987\",\"2.79\",\"India\"\n\"1502\",\"Embracer Group\",\"EMBRAC-B.ST\",\"8891998066\",\"7.9\",\"Sweden\"\n\"1503\",\"SK Group\",\"034730.KS\",\"8863366892\",\"157.92\",\"South Korea\"\n\"1504\",\"Logitech\",\"LOGI\",\"8857518080\",\"53.48\",\"Switzerland\"\n\"1505\",\"Resona Holdings\",\"8308.T\",\"8837456067\",\"3.71\",\"Japan\"\n\"1506\",\"Toray Industries\",\"3402.T\",\"8812004839\",\"5.22\",\"Japan\"\n\"1507\",\"Alstom\",\"ALO.PA\",\"8806193038\",\"23.56\",\"France\"\n\"1508\",\"Synnex\",\"SNX\",\"8796947456\",\"91.78\",\"United States\"\n\"1509\",\"Doosan Enerbility\",\"034020.KS\",\"8771925823\",\"13.88\",\"South Korea\"\n\"1510\",\"Tata Consumer Products\",\"TATACONSUM.NS\",\"8767771527\",\"9.51\",\"India\"\n\"1511\",\"Larsen &amp; Toubro Infotech\",\"LTI.BO\",\"8753932871\",\"50.15\",\"India\"\n\"1512\",\"Randstad\",\"RAND.AS\",\"8743292975\",\"47.82\",\"Netherlands\"\n\"1513\",\"Elisa\",\"ELISA.HE\",\"8695454826\",\"54.26\",\"Finland\"\n\"1514\",\"Allegion\",\"ALLE\",\"8685220864\",\"98.92\",\"Ireland\"\n\"1515\",\"Deutsche Wohnen\",\"DWNI.DE\",\"8677090783\",\"21.86\",\"Germany\"\n\"1516\",\"Demant\",\"WDH1.F\",\"8675608068\",\"36.6\",\"Denmark\"\n\"1517\",\"New World Development Company\",\"0017.HK\",\"8672219286\",\"3.45\",\"Hong Kong\"\n\"1518\",\"Huntington Ingalls Industries\",\"HII\",\"8670618624\",\"216.51\",\"United States\"\n\"1519\",\"Jones Lang LaSalle\",\"JLL\",\"8662467584\",\"177.28\",\"United States\"\n\"1520\",\"Cameco\",\"CCJ\",\"8637496320\",\"21.21\",\"Canada\"\n\"1521\",\"SIG Combibloc\",\"SIGN.SW\",\"8634821704\",\"22.59\",\"Switzerland\"\n\"1522\",\"Robert Half\",\"RHI\",\"8626722816\",\"78.06\",\"United States\"\n\"1523\",\"Ascendas Reit\",\"A17U.SI\",\"8605646763\",\"2.05\",\"Singapore\"\n\"1524\",\"Rolls-Royce Holdings\",\"RR.L\",\"8598143213\",\"102.3\",\"United Kingdom\"\n\"1525\",\"Nippon Building Fund\",\"8951.T\",\"8579224827\",\"5043.67\",\"Japan\"\n\"1526\",\"Mondi\",\"MNDI.L\",\"8576854764\",\"1748.51\",\"United Kingdom\"\n\"1527\",\"GFL Environmental\",\"GFL\",\"8556924928\",\"25\",\"Canada\"\n\"1528\",\"Xero\",\"XRO.AX\",\"8554251508\",\"56.97\",\"New Zealand\"\n\"1529\",\"Vail Resorts\",\"MTN\",\"8535533568\",\"211.9\",\"United States\"\n\"1530\",\"Eiffage\",\"FGR.PA\",\"8510386260\",\"86.78\",\"France\"\n\"1531\",\"Krafton\",\"259960.KS\",\"8501239218\",\"181.25\",\"South Korea\"\n\"1532\",\"Admiral Group\",\"ADM.L\",\"8481681152\",\"2805.22\",\"United Kingdom\"\n\"1533\",\"Galp Energia\",\"GZ5.F\",\"8479003672\",\"10.05\",\"Portugal\"\n\"1534\",\"United Utilities\",\"UU.L\",\"8478108733\",\"1243.33\",\"United Kingdom\"\n\"1535\",\"Americold\",\"COLD\",\"8474674176\",\"31.45\",\"United States\"\n\"1536\",\"West Japan Railway\",\"9021.T\",\"8471918240\",\"34.75\",\"Japan\"\n\"1537\",\"UGI Corporation\",\"UGI\",\"8466917376\",\"40.32\",\"United States\"\n\"1538\",\"Dropbox\",\"DBX\",\"8454845952\",\"22.51\",\"United States\"\n\"1539\",\"AEGON\",\"AEG\",\"8451020800\",\"4.14\",\"Netherlands\"\n\"1540\",\"Rheinmetall\",\"RHM.F\",\"8425587322\",\"194.57\",\"Germany\"\n\"1541\",\"Bharat Petroleum\",\"BPCL.NS\",\"8423627586\",\"3.88\",\"India\"\n\"1542\",\"Taiwan Cement\",\"1101.TW\",\"8403303692\",\"1.37\",\"Taiwan\"\n\"1543\",\"Nielsen\",\"NLSN\",\"8400324096\",\"23.35\",\"United States\"\n\"1544\",\"Gold Fields\",\"GFI\",\"8388414976\",\"9.11\",\"South Africa\"\n\"1545\",\"Hapvida\",\"HAPV3.SA\",\"8386664748\",\"1.18\",\"Brazil\"\n\"1546\",\"Zillow\",\"ZG\",\"8385399808\",\"34.03\",\"United States\"\n\"1547\",\"Euronext\",\"ENX.PA\",\"8379058904\",\"78.43\",\"Netherlands\"\n\"1548\",\"Sealed Air\",\"SEE\",\"8376456704\",\"57.34\",\"United States\"\n\"1549\",\"Nykaa\",\"NYKAA.NS\",\"8361292226\",\"17.62\",\"India\"\n\"1550\",\"AVEVA\",\"AVV.L\",\"8360927927\",\"2771.93\",\"United Kingdom\"\n\"1551\",\"Caesars Entertainment\",\"CZR\",\"8358130688\",\"38.99\",\"United States\"\n\"1552\",\"Royal Caribbean\",\"RCL\",\"8354908160\",\"32.77\",\"United States\"\n\"1553\",\"Legend Biotech\",\"LEGN\",\"8349132288\",\"54.14\",\"United States\"\n\"1554\",\"Swire Pacific\",\"0019.HK\",\"8347702852\",\"5.9\",\"Hong Kong\"\n\"1555\",\"Hyatt Hotels\",\"H\",\"8340312576\",\"75.61\",\"United States\"\n\"1556\",\"Wolfspeed\",\"WOLF\",\"8335471616\",\"67.42\",\"United States\"\n\"1557\",\"ANA Holdings\",\"9202.T\",\"8316568454\",\"17.68\",\"Japan\"\n\"1558\",\"Penske Automotive\",\"PAG\",\"8300968960\",\"109.38\",\"United States\"\n\"1559\",\"Organon\",\"OGN\",\"8286320128\",\"32.67\",\"United States\"\n\"1560\",\"Isuzu\",\"7202.T\",\"8284326968\",\"10.69\",\"Japan\"\n\"1561\",\"Keppel\",\"BN4.SI\",\"8282496428\",\"4.64\",\"Singapore\"\n\"1562\",\"Advantech\",\"2395.TW\",\"8277735851\",\"10.62\",\"Taiwan\"\n\"1563\",\"Sumitomo Denki Kōgyō\",\"5802.T\",\"8269398382\",\"10.6\",\"Japan\"\n\"1564\",\"Banco de Chile\",\"BCH\",\"8258139648\",\"16.35\",\"Chile\"\n\"1565\",\"IndusInd Bank\",\"INDUSINDBK.NS\",\"8257671693\",\"10.65\",\"India\"\n\"1566\",\"Fortune Brands Home &amp; Security\",\"FBHS\",\"8255229952\",\"63.11\",\"United States\"\n\"1567\",\"Boliden\",\"BOL.ST\",\"8251548977\",\"30.17\",\"Sweden\"\n\"1568\",\"China Gas\",\"0384.HK\",\"8247391615\",\"1.52\",\"China\"\n\"1569\",\"Dentsu\",\"4324.T\",\"8245411324\",\"30.67\",\"Japan\"\n\"1570\",\"Chr. Hansen\",\"51C.F\",\"8242232117\",\"62.68\",\"Denmark\"\n\"1571\",\"Monotaro\",\"3064.T\",\"8225576905\",\"16.29\",\"Japan\"\n\"1572\",\"The Toro Company\",\"TTC\",\"8225555456\",\"78.66\",\"United States\"\n\"1573\",\"Intertek\",\"ITRK.L\",\"8216503018\",\"5090.99\",\"United Kingdom\"\n\"1574\",\"BorgWarner\",\"BWA\",\"8215027200\",\"34.29\",\"United States\"\n\"1575\",\"GitLab\",\"GTLB\",\"8207688704\",\"55.57\",\"United States\"\n\"1576\",\"Largan Precision\",\"3008.TW\",\"8207291404\",\"61.49\",\"Taiwan\"\n\"1577\",\"InterGlobe Aviation\",\"INDIGO.NS\",\"8205590242\",\"21.3\",\"India\"\n\"1578\",\"SRF Limited\",\"SRF.NS\",\"8201087259\",\"27.67\",\"India\"\n\"1579\",\"Ocado\",\"OCDO.L\",\"8199938437\",\"994.19\",\"United Kingdom\"\n\"1580\",\"Empire Company\",\"EMP-A.TO\",\"8167087810\",\"31.18\",\"Canada\"\n\"1581\",\"Lincoln National Corporation\",\"LNC\",\"8164903936\",\"47.49\",\"United States\"\n\"1582\",\"Mitsui O.S.K. Lines\",\"9104.T\",\"8161909494\",\"22.62\",\"Japan\"\n\"1583\",\"HK Electric Investments\",\"2638.HK\",\"8161069819\",\"0.92\",\"Hong Kong\"\n\"1584\",\"New Fortress Energy\",\"NFE\",\"8156950528\",\"39.3\",\"United States\"\n\"1585\",\"Japan Exchange Group\",\"8697.T\",\"8154068605\",\"15.46\",\"Japan\"\n\"1586\",\"Genpact\",\"G\",\"8148406784\",\"44.01\",\"Bermuda\"\n\"1587\",\"Aisin Seiki\",\"7259.T\",\"8148139004\",\"30.23\",\"Japan\"\n\"1588\",\"Switch\",\"SWCH\",\"8147959808\",\"33.73\",\"United States\"\n\"1589\",\"Sage Group\",\"SGE.L\",\"8147350245\",\"799.72\",\"United Kingdom\"\n\"1590\",\"Samsung Life Insurance\",\"032830.KS\",\"8129916196\",\"45.27\",\"South Korea\"\n\"1591\",\"Orkla\",\"ORKLF\",\"8127648768\",\"8.08\",\"Norway\"\n\"1592\",\"Marico\",\"MARICO.NS\",\"8122892959\",\"6.29\",\"India\"\n\"1593\",\"Solvay\",\"SOLB.VI\",\"8111790270\",\"77.24\",\"Belgium\"\n\"1594\",\"Lithia Motors\",\"LAD\",\"8108931072\",\"280.26\",\"United States\"\n\"1595\",\"Canadian Utilities\",\"CU.TO\",\"8101373397\",\"30.19\",\"Canada\"\n\"1596\",\"Advanced Drainage Systems\",\"WMS\",\"8095749632\",\"95.36\",\"United States\"\n\"1597\",\"Genscript Biotech\",\"1548.HK\",\"8084348089\",\"3.83\",\"China\"\n\"1598\",\"Commerce Bancshares\",\"CBSH\",\"8081934336\",\"66.94\",\"United States\"\n\"1599\",\"Pinnacle West Capital\",\"PNW\",\"8077312000\",\"71.48\",\"United States\"\n\"1600\",\"Tōkyō Gas\",\"9531.T\",\"8070803767\",\"18.49\",\"Japan\"\n\"1601\",\"Hang Lung Properties\",\"0101.HK\",\"8069790408\",\"1.79\",\"Hong Kong\"\n\"1602\",\"Bank Jago\",\"ARTO.JK\",\"8067757319\",\"0.58\",\"Indonesia\"\n\"1603\",\"Hana Financial Group\",\"086790.KS\",\"8038150359\",\"27.57\",\"South Korea\"\n\"1604\",\"Mattel\",\"MAT\",\"8035101184\",\"22.8\",\"United States\"\n\"1605\",\"Knight-Swift\",\"KNX\",\"8031188480\",\"49.1\",\"United States\"\n\"1606\",\"Exact Sciences\",\"EXAS\",\"8023091200\",\"45.6\",\"United States\"\n\"1607\",\"S-OIL\",\"010950.KS\",\"8021236756\",\"69.75\",\"South Korea\"\n\"1608\",\"Umicore\",\"UMI.VI\",\"8020689794\",\"32.5\",\"Belgium\"\n\"1609\",\"Disco Corp.\",\"6146.T\",\"8018321522\",\"222.17\",\"Japan\"\n\"1610\",\"Ipsen\",\"IPN.PA\",\"8009014443\",\"97.03\",\"France\"\n\"1611\",\"Cleveland-Cliffs\",\"CLF\",\"7970754560\",\"15.19\",\"United States\"\n\"1612\",\"Lifco\",\"LIFCO-B.ST\",\"7951126241\",\"16.23\",\"Sweden\"\n\"1613\",\"Tele2\",\"TEL2-A.ST\",\"7930454578\",\"11.37\",\"Sweden\"\n\"1614\",\"Canadian Tire\",\"CTC.TO\",\"7929058974\",\"205.35\",\"Canada\"\n\"1615\",\"Burberry\",\"BRBY.L\",\"7928591644\",\"1992.18\",\"United Kingdom\"\n\"1616\",\"dLocal\",\"DLO\",\"7927402496\",\"26.87\",\"Uruguay\"\n\"1617\",\"Mohawk Industries\",\"MHK\",\"7920186368\",\"124.65\",\"United States\"\n\"1618\",\"Newell Brands\",\"NWL\",\"7910254592\",\"19.13\",\"United States\"\n\"1619\",\"Aramark\",\"ARMK\",\"7906890240\",\"30.73\",\"United States\"\n\"1620\",\"Owens Corning\",\"OC\",\"7885176832\",\"81.23\",\"United States\"\n\"1621\",\"Yaskawa\",\"6506.T\",\"7874549809\",\"30.12\",\"Japan\"\n\"1622\",\"Western Alliance Bancorporation\",\"WAL\",\"7871906304\",\"72.7\",\"United States\"\n\"1623\",\"Doximity\",\"DOCS\",\"7870616576\",\"41.14\",\"United States\"\n\"1624\",\"Lennox\",\"LII\",\"7860164608\",\"218.89\",\"United States\"\n\"1625\",\"AMC Entertainment\",\"AMC\",\"7859031040\",\"15.31\",\"United States\"\n\"1626\",\"Federal Realty Investment Trust\",\"FRT\",\"7853151232\",\"98.07\",\"United States\"\n\"1627\",\"National Retail Properties\",\"NNN\",\"7852667392\",\"44.64\",\"United States\"\n\"1628\",\"Melrose Industries\",\"MRO.L\",\"7850835854\",\"186.74\",\"United Kingdom\"\n\"1629\",\"DaVita\",\"DVA\",\"7844231680\",\"82.92\",\"United States\"\n\"1630\",\"Pentair\",\"PNR\",\"7830035968\",\"47.34\",\"United Kingdom\"\n\"1631\",\"Reinsurance Group of America\",\"RGA\",\"7824420352\",\"116.8\",\"United States\"\n\"1632\",\"Floor &amp; Decor\",\"FND\",\"7820788736\",\"73.88\",\"United States\"\n\"1633\",\"Tapestry\",\"TPR\",\"7813416448\",\"31.03\",\"United States\"\n\"1634\",\"IMCD\",\"IMCD.AS\",\"7811278447\",\"137.2\",\"Netherlands\"\n\"1635\",\"OGE Energy\",\"OGE\",\"7807316992\",\"39\",\"United States\"\n\"1636\",\"TFI International\",\"TFII\",\"7807016960\",\"85.23\",\"Canada\"\n\"1637\",\"Petro Rabigh\",\"2380.SR\",\"7773625663\",\"4.72\",\"Saudi Arabia\"\n\"1638\",\"Yuanta Financial Holding\",\"2885.TW\",\"7768651957\",\"0.64\",\"Taiwan\"\n\"1639\",\"Cognex\",\"CGNX\",\"7759138816\",\"44.66\",\"United States\"\n\"1640\",\"Alcoa\",\"AA\",\"7757943296\",\"42.06\",\"United States\"\n\"1641\",\"CAE\",\"CAE\",\"7746366464\",\"24.42\",\"Canada\"\n\"1642\",\"Chubu Electric Power\",\"9502.T\",\"7738168029\",\"10.23\",\"Japan\"\n\"1643\",\"Cable One\",\"CABO\",\"7736752128\",\"1291.01\",\"United States\"\n\"1644\",\"LG Household &amp; Health Care\",\"051905.KS\",\"7723371470\",\"244.34\",\"South Korea\"\n\"1645\",\"Manhattan Associates\",\"MANH\",\"7709629440\",\"122.16\",\"United States\"\n\"1646\",\"Pure Storage\",\"PSTG\",\"7702493184\",\"26.02\",\"United States\"\n\"1647\",\"DexCom\",\"DXCM\",\"7700670000\",\"79.23\",\"United States\"\n\"1648\",\"JD Sports Fashion\",\"JD.L\",\"7698195600\",\"147.45\",\"United Kingdom\"\n\"1649\",\"Lear Corporation\",\"LEA\",\"7689594368\",\"128.64\",\"United States\"\n\"1650\",\"Zions Bancorporation\",\"ZION\",\"7673901568\",\"50.7\",\"United States\"\n\"1651\",\"GAIL\",\"GAIL.NS\",\"7663286209\",\"1.75\",\"India\"\n\"1652\",\"Teva Pharmaceutical Industries\",\"TEVA\",\"7659096064\",\"6.84\",\"Israel\"\n\"1653\",\"Jardine Cycle &amp; Carriage\",\"C07.SI\",\"7641023322\",\"19.33\",\"Singapore\"\n\"1654\",\"Sinopharm\",\"1099.HK\",\"7632930564\",\"2.45\",\"China\"\n\"1655\",\"ASUS\",\"2357.TW\",\"7628964919\",\"10.27\",\"Taiwan\"\n\"1656\",\"Webster Financial\",\"WBS\",\"7626199552\",\"42.82\",\"United States\"\n\"1657\",\"Regal Rexnord\",\"RRX\",\"7622420480\",\"113.76\",\"United States\"\n\"1658\",\"Novocure\",\"NVCR\",\"7612814848\",\"72.79\",\"Jersey\"\n\"1659\",\"ARC Resources\",\"ARX.TO\",\"7604524891\",\"11.17\",\"Canada\"\n\"1660\",\"Oracle Corp Japan\",\"4716.T\",\"7602290457\",\"59.37\",\"Japan\"\n\"1661\",\"ICICI Lombard\",\"ICICIGI.NS\",\"7600271651\",\"15.48\",\"India\"\n\"1662\",\"Ceridian\",\"CDAY\",\"7597141504\",\"49.77\",\"United States\"\n\"1663\",\"Confluent\",\"CFLT\",\"7586880000\",\"27.26\",\"United States\"\n\"1664\",\"Churchill Downs\",\"CHDN\",\"7549582336\",\"198.54\",\"United States\"\n\"1665\",\"Dentsply Sirona\",\"XRAY\",\"7541897728\",\"35.01\",\"United States\"\n\"1666\",\"China Oilfield Services\",\"2883.HK\",\"7541790995\",\"0.93\",\"China\"\n\"1667\",\"Mitsubishi Chemical Holdings\",\"4188.T\",\"7536800989\",\"5.3\",\"Japan\"\n\"1668\",\"Avalara\",\"AVLR\",\"7529575424\",\"85.7\",\"United States\"\n\"1669\",\"Universal Health Services\",\"UHS\",\"7525880320\",\"101.18\",\"United States\"\n\"1670\",\"Tetra Tech\",\"TTEK\",\"7525324800\",\"140.18\",\"United States\"\n\"1671\",\"KT&amp;G (Korea Tobacco)\",\"033780.KS\",\"7523867621\",\"62.71\",\"South Korea\"\n\"1672\",\"Indus Towers\",\"INDUSTOWER.NS\",\"7515129586\",\"2.79\",\"India\"\n\"1673\",\"AGC\",\"5201.T\",\"7510722739\",\"33.89\",\"Japan\"\n\"1674\",\"TPG Telecom\",\"TPG.AX\",\"7502688028\",\"3.99\",\"Australia\"\n\"1675\",\"Becle\",\"CUERVO.MX\",\"7501366476\",\"2.09\",\"Mexico\"\n\"1676\",\"Performance Food Group\",\"PFGC\",\"7495896576\",\"48.36\",\"United States\"\n\"1677\",\"Cullen/Frost Bankers\",\"CFR\",\"7493580288\",\"116.91\",\"United States\"\n\"1678\",\"Sampoerna\",\"HSZ.F\",\"7492542102\",\"0.06\",\"Indonesia\"\n\"1679\",\"Commerzbank\",\"CBK.F\",\"7491998439\",\"5.97\",\"Germany\"\n\"1680\",\"Entain\",\"ENT.L\",\"7491819962\",\"1247.49\",\"Isle of Man\"\n\"1681\",\"HELLA\",\"HLE.F\",\"7490914204\",\"65.76\",\"Germany\"\n\"1682\",\"Qualtrics\",\"XM\",\"7488699392\",\"12.86\",\"United States\"\n\"1683\",\"Chemed\",\"CHE\",\"7486943744\",\"500.2\",\"United States\"\n\"1684\",\"Central Pattana\",\"CPN.BK\",\"7474478322\",\"1.67\",\"Thailand\"\n\"1685\",\"Meridian Energy\",\"MEZ.AX\",\"7472737084\",\"2.87\",\"New Zealand\"\n\"1686\",\"Samsung Electro-Mechanics\",\"009155.KS\",\"7469770876\",\"55.9\",\"South Korea\"\n\"1687\",\"Globant\",\"GLOB\",\"7461611520\",\"178.61\",\"Luxembourg\"\n\"1688\",\"Arrow Electronics\",\"ARW\",\"7455577600\",\"112.9\",\"United States\"\n\"1689\",\"STORE Capital\",\"STOR\",\"7451886080\",\"26.56\",\"United States\"\n\"1690\",\"West Fraser Timber\",\"WFG\",\"7417688064\",\"82.93\",\"Canada\"\n\"1691\",\"SEI Investments\",\"SEIC\",\"7413736448\",\"54.01\",\"United States\"\n\"1692\",\"Tencent Music\",\"TME\",\"7399023616\",\"4.37\",\"China\"\n\"1693\",\"Dolby\",\"DLB\",\"7387531776\",\"73.22\",\"United States\"\n\"1694\",\"Fisher & Paykel Healthcare\",\"FPH.NZ\",\"7386256024\",\"12.79\",\"New Zealand\"\n\"1695\",\"Magnit\",\"MGNT.ME\",\"7383510057\",\"75.4\",\"Russia\"\n\"1696\",\"Casey's General Stores\",\"CASY\",\"7362167808\",\"197.97\",\"United States\"\n\"1697\",\"Insurance Australia Group\",\"IAG.AX\",\"7348807679\",\"2.98\",\"Australia\"\n\"1698\",\"Meggitt\",\"MGGT.L\",\"7347825325\",\"938.56\",\"United Kingdom\"\n\"1699\",\"Syneos Health\",\"SYNH\",\"7344369664\",\"71.6\",\"United States\"\n\"1700\",\"Unimicron\",\"3037.TW\",\"7341446884\",\"4.98\",\"Taiwan\"\n\"1701\",\"Hess Midstream\",\"HESM\",\"7339876864\",\"27.84\",\"United States\"\n\"1702\",\"Fosun\",\"0656.HK\",\"7333350922\",\"0.88\",\"China\"\n\"1703\",\"Osaka Gas\",\"9532.T\",\"7332728689\",\"17.64\",\"Japan\"\n\"1704\",\"Singapore Exchange\",\"S68.SI\",\"7328224426\",\"6.86\",\"Singapore\"\n\"1705\",\"Change Healthcare\",\"CHNG\",\"7328150016\",\"23.01\",\"United States\"\n\"1706\",\"DiaSorin\",\"DIA.MI\",\"7328018405\",\"135.19\",\"Italy\"\n\"1707\",\"Hindustan Aeronautics\",\"HAL.NS\",\"7326986838\",\"21.91\",\"India\"\n\"1708\",\"Nissin Foods\",\"2897.T\",\"7326811561\",\"71.89\",\"Japan\"\n\"1709\",\"Konami Holdings\",\"9766.T\",\"7324033380\",\"54.83\",\"Japan\"\n\"1710\",\"Masimo\",\"MASI\",\"7318810112\",\"131.86\",\"United States\"\n\"1711\",\"Daifuku\",\"6383.T\",\"7315253637\",\"58.05\",\"Japan\"\n\"1712\",\"Trend Micro\",\"4704.T\",\"7313405194\",\"52.34\",\"Japan\"\n\"1713\",\"Shanghai Commercial and Savings Bank\",\"5876.TW\",\"7310285934\",\"1.64\",\"Taiwan\"\n\"1714\",\"FinecoBank\",\"FBK.MI\",\"7302008084\",\"11.97\",\"Italy\"\n\"1715\",\"Toast\",\"TOST\",\"7299408896\",\"14.26\",\"United States\"\n\"1716\",\"Ritchie Bros. Auctioneers\",\"RBA\",\"7298430464\",\"65.91\",\"Canada\"\n\"1717\",\"Rational AG\",\"RAA.F\",\"7293734741\",\"625.94\",\"Germany\"\n\"1718\",\"Meiji Holdings\",\"2269.T\",\"7277732600\",\"51.68\",\"Japan\"\n\"1719\",\"Avis Budget Group\",\"CAR\",\"7269411328\",\"150.55\",\"United States\"\n\"1720\",\"Sibanye-Stillwater\",\"SBSW\",\"7262510592\",\"9.94\",\"South Africa\"\n\"1721\",\"Indofood CBP\",\"ICBP.JK\",\"7257071270\",\"0.62\",\"Indonesia\"\n\"1722\",\"First Solar\",\"FSLR\",\"7254106624\",\"68.06\",\"United States\"\n\"1723\",\"SentinelOne\",\"S\",\"7250560512\",\"25.99\",\"United States\"\n\"1724\",\"Lincoln Electric\",\"LECO\",\"7249236992\",\"123.66\",\"United States\"\n\"1725\",\"Maravai LifeSciences\",\"MRVI\",\"7241498624\",\"28.38\",\"United States\"\n\"1726\",\"United Spirits\",\"UNITDSPR.BO\",\"7241261190\",\"10.21\",\"India\"\n\"1727\",\"Telus International\",\"TIXT\",\"7239633920\",\"27.2\",\"Canada\"\n\"1728\",\"WillScot\",\"WSC\",\"7234189824\",\"32.51\",\"United States\"\n\"1729\",\"Invesco\",\"IVZ\",\"7230347264\",\"15.89\",\"United States\"\n\"1730\",\"Rakuten\",\"4755.T\",\"7227569904\",\"4.56\",\"Japan\"\n\"1731\",\"Pilgrim's Pride\",\"PPC\",\"7226722816\",\"30.07\",\"United States\"\n\"1732\",\"Hero MotoCorp\",\"HEROMOTOCO.NS\",\"7226688110\",\"36.17\",\"India\"\n\"1733\",\"Deckers Brands\",\"DECK\",\"7215457280\",\"269.34\",\"United States\"\n\"1734\",\"WEX\",\"WEX\",\"7209920512\",\"160.26\",\"United States\"\n\"1735\",\"Jabil\",\"JBL\",\"7203755520\",\"52.37\",\"United States\"\n\"1736\",\"Olin\",\"OLN\",\"7202956800\",\"47.44\",\"United States\"\n\"1737\",\"Omega Healthcare\",\"OHI\",\"7188016640\",\"29.75\",\"United States\"\n\"1738\",\"Yanbu National Petrochemical\",\"2290.SR\",\"7186367175\",\"12.78\",\"Saudi Arabia\"\n\"1739\",\"Hainan Airlines\",\"900945.SS\",\"7170642944\",\"0.19\",\"China\"\n\"1740\",\"Ciena\",\"CIEN\",\"7152904192\",\"47.78\",\"United States\"\n\"1741\",\"US Foods\",\"USFD\",\"7151110656\",\"31.94\",\"United States\"\n\"1742\",\"Japan Airlines\",\"9201.T\",\"7143387321\",\"16.35\",\"Japan\"\n\"1743\",\"Gerdau\",\"GGB\",\"7142145536\",\"4.18\",\"Brazil\"\n\"1744\",\"Etihad Etisalat (Mobily)\",\"7020.SR\",\"7139507416\",\"9.27\",\"Saudi Arabia\"\n\"1745\",\"Indutrade\",\"INDT.ST\",\"7119296662\",\"19.54\",\"Sweden\"\n\"1746\",\"Bharat Electronics\",\"BEL.NS\",\"7117497991\",\"2.92\",\"India\"\n\"1747\",\"PKO Bank Polski\",\"P9O.F\",\"7114598580\",\"5.6\",\"Poland\"\n\"1748\",\"SKF (Svenska Kullagerfabriken)\",\"SKF-B.ST\",\"7109230090\",\"15.45\",\"Sweden\"\n\"1749\",\"Bâloise\",\"BALN.SW\",\"7108920710\",\"157.45\",\"Switzerland\"\n\"1750\",\"Apollo Hospitals\",\"APOLLOHOSP.NS\",\"7106603624\",\"49.43\",\"India\"\n\"1751\",\"Bank of Baroda\",\"BANKBARODA.NS\",\"7105838702\",\"1.37\",\"India\"\n\"1752\",\"Traton\",\"8TRA.DE\",\"7104072334\",\"14.21\",\"Germany\"\n\"1753\",\"Elastic NV\",\"ESTC\",\"7098194432\",\"74.83\",\"United States\"\n\"1754\",\"OTE Group\",\"OTE.F\",\"7097878910\",\"15.88\",\"Greece\"\n\"1755\",\"Phoenix Group\",\"PHNX.L\",\"7096174304\",\"709.62\",\"United Kingdom\"\n\"1756\",\"Berger Paints\",\"BERGEPAINT.NS\",\"7090545211\",\"7.3\",\"India\"\n\"1757\",\"ShockWave Medical\",\"SWAV\",\"7085364736\",\"197.96\",\"United States\"\n\"1758\",\"Royal Gold\",\"RGLD\",\"7085073920\",\"107.94\",\"United States\"\n\"1759\",\"Zoomlion\",\"1157.HK\",\"7054232600\",\"0.55\",\"China\"\n\"1760\",\"Motherson Sumi Systems\",\"MOTHERSUMI.NS\",\"7039944148\",\"1.56\",\"India\"\n\"1761\",\"Prysmian Group\",\"PRY.MI\",\"7023777657\",\"26.66\",\"Italy\"\n\"1762\",\"AGCO\",\"AGCO\",\"7017543680\",\"94.14\",\"United States\"\n\"1763\",\"Old Republic International\",\"ORI\",\"7010810368\",\"22.74\",\"United States\"\n\"1764\",\"Grupo Aeroportuario del Pacífico\",\"PAC\",\"7006988288\",\"139.32\",\"Mexico\"\n\"1765\",\"Quidel\",\"QDEL\",\"7000135168\",\"104.59\",\"United States\"\n\"1766\",\"PGNiG\",\"7GG.F\",\"6998561207\",\"1.15\",\"Poland\"\n\"1767\",\"Nemetschek\",\"NEM.F\",\"6997511465\",\"59.95\",\"Germany\"\n\"1768\",\"Idemitsu Kosan\",\"5019.T\",\"6996927139\",\"23.53\",\"Japan\"\n\"1769\",\"Indorama Ventures\",\"I93A.F\",\"6991415859\",\"1.23\",\"Thailand\"\n\"1770\",\"Dino Polska\",\"DNP.WA\",\"6989006553\",\"71.29\",\"Poland\"\n\"1771\",\"Sofina\",\"SOF.VI\",\"6988384531\",\"207.94\",\"Belgium\"\n\"1772\",\"Dick's Sporting Goods\",\"DKS\",\"6987756032\",\"86.78\",\"United States\"\n\"1773\",\"Mobile TeleSystems\",\"MBT\",\"6986429952\",\"5.5\",\"Russia\"\n\"1774\",\"Accor\",\"AC.PA\",\"6985480366\",\"26.57\",\"France\"\n\"1775\",\"Plains All American Pipeline\",\"PAA\",\"6981007360\",\"9.94\",\"United States\"\n\"1776\",\"Spring Airlines\",\"601021.SS\",\"6979264823\",\"7.62\",\"China\"\n\"1777\",\"Varun Beverages\",\"VBL.NS\",\"6972360665\",\"10.73\",\"India\"\n\"1778\",\"Robinhood\",\"HOOD\",\"6965351424\",\"8.34\",\"United States\"\n\"1779\",\"QNB Finansbank\",\"QNBFB.IS\",\"6961211883\",\"2.08\",\"Turkey\"\n\"1780\",\"Range Resources\",\"RRC\",\"6958064640\",\"25.79\",\"United States\"\n\"1781\",\"Samsara\",\"IOT\",\"6955699200\",\"13.66\",\"United States\"\n\"1782\",\"China Development Financial\",\"2883.TW\",\"6946629325\",\"0.41\",\"Taiwan\"\n\"1783\",\"Berry Global\",\"BERY\",\"6946293248\",\"53.31\",\"United States\"\n\"1784\",\"Sarepta Therapeutics\",\"SRPT\",\"6931829248\",\"79.22\",\"United States\"\n\"1785\",\"Bajaj Holdings &amp; Investment\",\"BAJAJHLDNG.NS\",\"6918500441\",\"62.16\",\"India\"\n\"1786\",\"Bangkok Bank\",\"BBL.BK\",\"6909971015\",\"3.62\",\"Thailand\"\n\"1787\",\"Tokyu\",\"9005.T\",\"6909335995\",\"11.47\",\"Japan\"\n\"1788\",\"Cathay Pacific\",\"0293.HK\",\"6904825780\",\"1.07\",\"Hong Kong\"\n\"1789\",\"Sagax\",\"SAGA-B.ST\",\"6889612294\",\"20.64\",\"Sweden\"\n\"1790\",\"Middleby\",\"MIDD\",\"6887924224\",\"126.64\",\"United States\"\n\"1791\",\"MISC Berhad\",\"3816.KL\",\"6874168840\",\"1.54\",\"Malaysia\"\n\"1792\",\"Bancolombia\",\"CIB\",\"6857833472\",\"28.52\",\"Colombia\"\n\"1793\",\"Starwood Property Trust\",\"STWD\",\"6853733888\",\"21.64\",\"United States\"\n\"1794\",\"Zalando\",\"ZAL.DE\",\"6850421510\",\"26.38\",\"Germany\"\n\"1795\",\"Ivanhoe Mines\",\"IVN.TO\",\"6849753347\",\"5.44\",\"Canada\"\n\"1796\",\"Clearway Energy\",\"CWEN\",\"6849362944\",\"34.99\",\"United States\"\n\"1797\",\"Futu Holdings\",\"FUTU\",\"6841007616\",\"46.54\",\"Hong Kong\"\n\"1798\",\"United Tractors\",\"UTY.F\",\"6834905516\",\"1.78\",\"Indonesia\"\n\"1799\",\"Copenhagen Airport\",\"KLH.F\",\"6830854822\",\"854.7\",\"Denmark\"\n\"1800\",\"Elang Mahkota Teknologi\",\"EMTK.JK\",\"6818239310\",\"0.11\",\"Indonesia\"\n\"1801\",\"Ternium\",\"TX\",\"6805998080\",\"34.67\",\"Luxembourg\"\n\"1802\",\"Yamaha\",\"7951.T\",\"6793559099\",\"39.6\",\"Japan\"\n\"1803\",\"Pearson\",\"PSO\",\"6778295296\",\"9.19\",\"United Kingdom\"\n\"1804\",\"Banco Santander-Chile\",\"BSAC\",\"6774633984\",\"14.38\",\"Chile\"\n\"1805\",\"Nexstar Media Group\",\"NXST\",\"6774588928\",\"167.67\",\"United States\"\n\"1806\",\"ABB India\",\"ABB.NS\",\"6774337403\",\"31.96\",\"India\"\n\"1807\",\"Persimmon\",\"PSN.L\",\"6767511797\",\"2119.36\",\"United Kingdom\"\n\"1808\",\"Dexus\",\"DXS.AX\",\"6754576873\",\"6.28\",\"Australia\"\n\"1809\",\"CACI\",\"CACI\",\"6750817792\",\"288.34\",\"United States\"\n\"1810\",\"IAC/InterActiveCorp\",\"IAC\",\"6748615680\",\"75.09\",\"United States\"\n\"1811\",\"Halozyme Therapeutics\",\"HALO\",\"6745755136\",\"48.9\",\"United States\"\n\"1812\",\"Concentrix\",\"CNXC\",\"6741843968\",\"129.54\",\"United States\"\n\"1813\",\"Unum\",\"UNM\",\"6740704768\",\"33.52\",\"United States\"\n\"1814\",\"KBR\",\"KBR\",\"6739352576\",\"48.29\",\"United States\"\n\"1815\",\"Renault\",\"RNO.PA\",\"6731336849\",\"23.2\",\"France\"\n\"1816\",\"Hertz\",\"HTZ\",\"6729772544\",\"16.33\",\"United States\"\n\"1817\",\"Five Below\",\"FIVE\",\"6725955072\",\"121.21\",\"United States\"\n\"1818\",\"Levi Strauss\",\"LEVI\",\"6724302336\",\"16.95\",\"United States\"\n\"1819\",\"EastGroup Properties\",\"EGP\",\"6722254336\",\"154.36\",\"United States\"\n\"1820\",\"Procore\",\"PCOR\",\"6718552064\",\"49.56\",\"United States\"\n\"1821\",\"KT Corporation\",\"KT\",\"6704936960\",\"14.2\",\"South Korea\"\n\"1822\",\"Nippon Prologis REIT\",\"3283.T\",\"6704854476\",\"2510.85\",\"Japan\"\n\"1823\",\"Flex\",\"FLEX\",\"6703276032\",\"14.63\",\"Singapore\"\n\"1824\",\"Unibail-Rodamco-Westfield\",\"URW.AS\",\"6694862576\",\"48.25\",\"France\"\n\"1825\",\"Credit Acceptance\",\"CACC\",\"6691867136\",\"509.29\",\"United States\"\n\"1826\",\"DXC Technology\",\"DXC\",\"6689850368\",\"29.13\",\"United States\"\n\"1827\",\"AutoNation\",\"AN\",\"6689324032\",\"114.69\",\"United States\"\n\"1828\",\"Axon Enterprise\",\"AXON\",\"6686078464\",\"94.16\",\"United States\"\n\"1829\",\"Lufthansa\",\"LHA.DE\",\"6680078673\",\"5.59\",\"Germany\"\n\"1830\",\"Acadia Healthcare\",\"ACHC\",\"6679059968\",\"73.78\",\"United States\"\n\"1831\",\"Getinge\",\"GETI-B.ST\",\"6669309323\",\"22.95\",\"Sweden\"\n\"1832\",\"MinebeaMitsumi\",\"6479.T\",\"6668658964\",\"16.42\",\"Japan\"\n\"1833\",\"Nissan Chemical\",\"4021.T\",\"6662229953\",\"47.14\",\"Japan\"\n\"1834\",\"Gentex\",\"GNTX\",\"6662152704\",\"28.42\",\"United States\"\n\"1835\",\"Daiwa Securities Group\",\"8601.T\",\"6652368873\",\"4.48\",\"Japan\"\n\"1836\",\"Jefferies Financial Group\",\"JEF\",\"6643506688\",\"28.58\",\"United States\"\n\"1837\",\"Lodha Group\",\"LODHA.NS\",\"6640579114\",\"13.79\",\"India\"\n\"1838\",\"Planet Fitness\",\"PLNT\",\"6636835840\",\"72.88\",\"United States\"\n\"1839\",\"Atacadão\",\"CRFB3.SA\",\"6628580140\",\"3.15\",\"Brazil\"\n\"1840\",\"Shoprite\",\"SHP.JO\",\"6628522511\",\"12.16\",\"South Africa\"\n\"1841\",\"Rohm\",\"6963.T\",\"6623684189\",\"67.49\",\"Japan\"\n\"1842\",\"OCI\",\"OCI.AS\",\"6623057472\",\"31.55\",\"Netherlands\"\n\"1843\",\"Kakao Pay\",\"377300.KS\",\"6607407285\",\"49.86\",\"South Korea\"\n\"1844\",\"Coherent\",\"COHR\",\"6605557248\",\"266.22\",\"United States\"\n\"1845\",\"Inter &amp; Co\",\"INTR\",\"6604856832\",\"2.55\",\"Brazil\"\n\"1846\",\"Exelixis\",\"EXEL\",\"6594434560\",\"20.56\",\"United States\"\n\"1847\",\"Great Eastern\",\"G07.SI\",\"6581823914\",\"13.91\",\"Singapore\"\n\"1848\",\"Healthcare Trust of America\",\"HTA\",\"6576714240\",\"28.71\",\"United States\"\n\"1849\",\"Auckland Airport\",\"AIA.AX\",\"6574795755\",\"4.45\",\"New Zealand\"\n\"1850\",\"Lattice Semiconductor\",\"LSCC\",\"6571613696\",\"47.76\",\"United States\"\n\"1851\",\"Wacker Chemie\",\"WCH.F\",\"6568785472\",\"132.23\",\"Germany\"\n\"1852\",\"AptarGroup\",\"ATR\",\"6563867136\",\"100.1\",\"United States\"\n\"1853\",\"FTI Consulting\",\"FCN\",\"6554144768\",\"190.14\",\"United States\"\n\"1854\",\"Southwestern Energy\",\"SWN\",\"6551976448\",\"5.87\",\"United States\"\n\"1855\",\"Five9\",\"FIVN\",\"6547438080\",\"94.13\",\"United States\"\n\"1856\",\"Arabian Internet and Communications Services\",\"7202.SR\",\"6545838423\",\"55.1\",\"Saudi Arabia\"\n\"1857\",\"Swedish Orphan Biovitrum\",\"SOBI.ST\",\"6544897571\",\"22.17\",\"Sweden\"\n\"1858\",\"Airtel Africa\",\"AAF.L\",\"6535408052\",\"173.9\",\"United Kingdom\"\n\"1859\",\"PLDT\",\"PHI\",\"6533372928\",\"30.02\",\"Philippines\"\n\"1860\",\"Makita\",\"6586.T\",\"6531540781\",\"24.05\",\"Japan\"\n\"1861\",\"RenaissanceRe\",\"RNR\",\"6531134464\",\"147.8\",\"Bermuda\"\n\"1862\",\"Apartment Income REIT\",\"AIRC\",\"6530522112\",\"41.57\",\"United States\"\n\"1863\",\"Autoliv\",\"ALV\",\"6511502848\",\"74.55\",\"Sweden\"\n\"1864\",\"Holmen\",\"HOLM-B.ST\",\"6500435649\",\"40.22\",\"Sweden\"\n\"1865\",\"CPFL Energia\",\"CPFE3.SA\",\"6499729863\",\"5.64\",\"Brazil\"\n\"1866\",\"Trex\",\"TREX\",\"6489189376\",\"57.33\",\"United States\"\n\"1867\",\"Origin Energy\",\"ORG.AX\",\"6486661010\",\"3.77\",\"Australia\"\n\"1868\",\"National Storage\",\"NSA\",\"6474109440\",\"50.25\",\"United States\"\n\"1869\",\"Murphy USA\",\"MUSA\",\"6473928192\",\"267.5\",\"United States\"\n\"1870\",\"Polaris\",\"PII\",\"6466761728\",\"108.69\",\"United States\"\n\"1871\",\"Ralph Lauren\",\"RL\",\"6446697984\",\"92.48\",\"United States\"\n\"1872\",\"Graphic Packaging\",\"GPK\",\"6443616256\",\"20.9\",\"United States\"\n\"1873\",\"Sanlam\",\"SLM.JO\",\"6423670230\",\"3.13\",\"South Africa\"\n\"1874\",\"UPL\",\"UPL.NS\",\"6421536986\",\"8.56\",\"India\"\n\"1875\",\"Restoration Hardware\",\"RH\",\"6421307904\",\"260.17\",\"United States\"\n\"1876\",\"Gecina\",\"GFC.PA\",\"6418259531\",\"87.03\",\"France\"\n\"1877\",\"TIS\",\"3626.T\",\"6414349128\",\"26.1\",\"Japan\"\n\"1878\",\"Hankyu Hanshin Holdings\",\"9042.T\",\"6411588217\",\"26.61\",\"Japan\"\n\"1879\",\"Cholamandalam Investment and Finance\",\"CHOLAFIN.NS\",\"6407254049\",\"7.8\",\"India\"\n\"1880\",\"Arkema\",\"AKE.PA\",\"6392182283\",\"86.44\",\"France\"\n\"1881\",\"CDK Global\",\"CDK\",\"6390491648\",\"54.76\",\"United States\"\n\"1882\",\"T&amp;D Holdings\",\"8795.T\",\"6385589124\",\"11.42\",\"Japan\"\n\"1883\",\"PKN Orlen\",\"PKY1.F\",\"6380186707\",\"14.62\",\"Poland\"\n\"1884\",\"First Industrial Realty Trust\",\"FR\",\"6379608576\",\"48.33\",\"United States\"\n\"1885\",\"Japan Real Estate Investment\",\"8952.T\",\"6378129629\",\"4604.45\",\"Japan\"\n\"1886\",\"Israel Discount Bank\",\"ISDAY\",\"6378023936\",\"51.56\",\"Israel\"\n\"1887\",\"R1 RCM\",\"RCM\",\"6374476800\",\"22.79\",\"United States\"\n\"1888\",\"Hitachi Metals\",\"5486.T\",\"6372294057\",\"14.9\",\"Japan\"\n\"1889\",\"Woori Financial Group\",\"WF\",\"6370507264\",\"26.25\",\"South Korea\"\n\"1890\",\"Pershing Square Holdings\",\"PSHZF\",\"6367568384\",\"29.53\",\"United States\"\n\"1891\",\"Sensata Technologies\",\"ST\",\"6362240000\",\"40.55\",\"United States\"\n\"1892\",\"Axfood\",\"AXFO.ST\",\"6361844331\",\"28.93\",\"Sweden\"\n\"1893\",\"AngloGold Ashanti\",\"AU\",\"6357632000\",\"14.48\",\"South Africa\"\n\"1894\",\"Prosperity Bancshares\",\"PB\",\"6346290688\",\"68.85\",\"United States\"\n\"1895\",\"Coty\",\"COTY\",\"6344283648\",\"7.56\",\"United States\"\n\"1896\",\"Vipshop\",\"VIPS\",\"6341003264\",\"9.67\",\"China\"\n\"1897\",\"Japan Post Insurance\",\"7181.T\",\"6335035439\",\"15.86\",\"Japan\"\n\"1898\",\"Western Union\",\"WU\",\"6325167104\",\"16.39\",\"United States\"\n\"1899\",\"Siam Commercial Bank\",\"NVPI.F\",\"6323279799\",\"1.86\",\"Thailand\"\n\"1900\",\"Torrent Pharmaceuticals\",\"TORNTPHARM.NS\",\"6314662651\",\"18.66\",\"India\"\n\"1901\",\"Banco Santander México\",\"BSMX\",\"6306609152\",\"4.65\",\"Mexico\"\n\"1902\",\"Choice Hotels International\",\"CHH\",\"6302801408\",\"113.02\",\"United States\"\n\"1903\",\"NextEra Energy Partners\",\"NEP\",\"6300876288\",\"75.1\",\"United States\"\n\"1904\",\"Amorepacific\",\"090430.KS\",\"6296771396\",\"99.42\",\"South Korea\"\n\"1905\",\"Hamamatsu\",\"6965.T\",\"6279345644\",\"40.55\",\"Japan\"\n\"1906\",\"Dun &amp; Bradstreet\",\"DNB\",\"6272470016\",\"14.45\",\"United States\"\n\"1907\",\"HashiCorp\",\"HCP\",\"6268133888\",\"34\",\"United States\"\n\"1908\",\"UnipolSai\",\"US.MI\",\"6266451660\",\"2.22\",\"Italy\"\n\"1909\",\"ENGIE Brasil\",\"EGIE3.SA\",\"6264316880\",\"7.68\",\"Brazil\"\n\"1910\",\"Korean Air Lines\",\"003495.KS\",\"6262805863\",\"24.13\",\"South Korea\"\n\"1911\",\"Avast\",\"AV2.F\",\"6262734576\",\"6.01\",\"Czech Republic\"\n\"1912\",\"Dongfeng Motor\",\"0489.HK\",\"6256482208\",\"0.73\",\"China\"\n\"1913\",\"Affirm\",\"AFRM\",\"6252767232\",\"21.83\",\"United States\"\n\"1914\",\"Wynn Resorts\",\"WYNN\",\"6249353728\",\"53.89\",\"United States\"\n\"1915\",\"II-VI Incorporated\",\"IIVI\",\"6249213440\",\"48.43\",\"United States\"\n\"1916\",\"Bath &amp; Body Works\",\"BBWI\",\"6249067520\",\"27.32\",\"United States\"\n\"1917\",\"International Consolidated Airlines\",\"BABWF\",\"6240389632\",\"1.26\",\"Spain\"\n\"1918\",\"Envista\",\"NVST\",\"6239652352\",\"38.37\",\"United States\"\n\"1919\",\"Teladoc Health\",\"TDOC\",\"6234558976\",\"38.68\",\"United States\"\n\"1920\",\"Tata Elxsi\",\"TATAELXSI.NS\",\"6233279253\",\"100.09\",\"India\"\n\"1921\",\"Genting Singapore\",\"G13.SI\",\"6225335856\",\"0.52\",\"Singapore\"\n\"1922\",\"ZOZO\",\"3092.T\",\"6224016135\",\"20.76\",\"Japan\"\n\"1923\",\"Guidewire Software\",\"GWRE\",\"6223367680\",\"74.25\",\"United States\"\n\"1924\",\"Orion Corporation\",\"ORNAV.HE\",\"6221763765\",\"44.24\",\"Finland\"\n\"1925\",\"Bumble\",\"BMBL\",\"6219173888\",\"33.69\",\"United States\"\n\"1926\",\"Investec\",\"INVR.L\",\"6211083569\",\"704.28\",\"United Kingdom\"\n\"1927\",\"Info Edge\",\"NAUKRI.NS\",\"6210562805\",\"48.15\",\"India\"\n\"1928\",\"FAW Car\",\"000800.SZ\",\"6188283336\",\"1.32\",\"China\"\n\"1929\",\"Skanska\",\"SKA-B.ST\",\"6183449587\",\"14.99\",\"Sweden\"\n\"1930\",\"Huntsman Corporation\",\"HUN\",\"6176453120\",\"29.44\",\"United States\"\n\"1931\",\"Yamaha Motor\",\"7272.T\",\"6171587141\",\"18.18\",\"Japan\"\n\"1932\",\"Bid Corp\",\"BID.JO\",\"6171544204\",\"18.47\",\"South Africa\"\n\"1933\",\"Brookfield Renewable\",\"BEPC\",\"6169135104\",\"35.82\",\"United States\"\n\"1934\",\"Endeavor Group\",\"EDR\",\"6168892416\",\"21.72\",\"United States\"\n\"1935\",\"Wyndham Hotels &amp; Resorts\",\"WH\",\"6162857984\",\"66.92\",\"United States\"\n\"1936\",\"Medibank\",\"MPL.AX\",\"6162197753\",\"2.24\",\"Australia\"\n\"1937\",\"UWM Holdings\",\"UWMC\",\"6155827200\",\"3.84\",\"United States\"\n\"1938\",\"POSCO Chemical\",\"003670.KS\",\"6154962401\",\"79.53\",\"South Korea\"\n\"1939\",\"Kongsberg Gruppen\",\"KOG.OL\",\"6134975536\",\"34.57\",\"Norway\"\n\"1940\",\"Kilroy Realty\",\"KRC\",\"6130262528\",\"52.01\",\"United States\"\n\"1941\",\"Korea Zinc\",\"010130.KS\",\"6129647729\",\"346.81\",\"South Korea\"\n\"1942\",\"Charoen Pokphand Indonesia\",\"CPIN.JK\",\"6128048043\",\"0.37\",\"Indonesia\"\n\"1943\",\"BOSCH India\",\"BOSCHLTD.NS\",\"6127683771\",\"207.69\",\"India\"\n\"1944\",\"Brixmor Property Group\",\"BRX\",\"6117982208\",\"20.43\",\"United States\"\n\"1945\",\"Beijer Ref\",\"BEIJ-B.ST\",\"6108584646\",\"14.5\",\"Sweden\"\n\"1946\",\"Daito Trust Construction\",\"1878.T\",\"6104857063\",\"89.53\",\"Japan\"\n\"1947\",\"Sumitomo Chemical\",\"4005.T\",\"6103894702\",\"3.73\",\"Japan\"\n\"1948\",\"Stockland\",\"SGP.AX\",\"6099846100\",\"2.56\",\"Australia\"\n\"1949\",\"ADT\",\"ADT\",\"6090457088\",\"6.72\",\"United States\"\n\"1950\",\"ENKA\",\"ENKAI.IS\",\"6090305722\",\"1.04\",\"Turkey\"\n\"1951\",\"Adaro Energy\",\"ADRO.JK\",\"6080205827\",\"0.19\",\"Indonesia\"\n\"1952\",\"Grupo ACS\",\"ACS.MC\",\"6077484790\",\"21.58\",\"Spain\"\n\"1953\",\"Covestro\",\"1COV.F\",\"6074775232\",\"31.44\",\"Germany\"\n\"1954\",\"TIM S.A.\",\"TIMB\",\"6068154368\",\"12.36\",\"Brazil\"\n\"1955\",\"Vornado Realty Trust\",\"VNO\",\"6058548224\",\"29.41\",\"United States\"\n\"1956\",\"Frontier Communications\",\"FYBR\",\"6057934848\",\"24.73\",\"United States\"\n\"1957\",\"Voya Financial\",\"VOYA\",\"6056933888\",\"59.28\",\"United States\"\n\"1958\",\"Pandora\",\"3P7.F\",\"6055758898\",\"65.18\",\"Denmark\"\n\"1959\",\"Capri Holdings\",\"CPRI\",\"6050817024\",\"42.37\",\"United Kingdom\"\n\"1960\",\"RaiaDrogasil\",\"RADL3.SA\",\"6048463474\",\"3.67\",\"Brazil\"\n\"1961\",\"Page Industries\",\"PAGEIND.NS\",\"6044784542\",\"541.94\",\"India\"\n\"1962\",\"Merdeka Copper Gold\",\"MDKA.JK\",\"6031606762\",\"0.25\",\"Indonesia\"\n\"1963\",\"Donaldson\",\"DCI\",\"6004461056\",\"48.87\",\"United States\"\n\"1964\",\"NOV\",\"NOV\",\"6001953792\",\"15.28\",\"United States\"\n\"1965\",\"Fresnillo\",\"FNLPF\",\"6001483264\",\"7.92\",\"Mexico\"\n\"1966\",\"Sekisui Chemical\",\"4204.T\",\"5998992579\",\"13.73\",\"Japan\"\n\"1967\",\"Littelfuse\",\"LFUS\",\"5995547648\",\"242.36\",\"United States\"\n\"1968\",\"Whitbread\",\"WTB.L\",\"5993764281\",\"2966.87\",\"United Kingdom\"\n\"1969\",\"AGNC Investment\",\"AGNC\",\"5992472064\",\"11.45\",\"United States\"\n\"1970\",\"DCP Midstream\",\"DCP\",\"5991782400\",\"28.75\",\"United States\"\n\"1971\",\"Française des Jeux\",\"FDJ.VI\",\"5988643395\",\"31.37\",\"France\"\n\"1972\",\"First American\",\"FAF\",\"5973329408\",\"55.62\",\"United States\"\n\"1973\",\"Jabal Omar Development\",\"4250.SR\",\"5972804399\",\"6.43\",\"Saudi Arabia\"\n\"1974\",\"GEA Group\",\"G1A.F\",\"5971306956\",\"33.11\",\"Germany\"\n\"1975\",\"Reece Group\",\"REH.AX\",\"5969445830\",\"9.24\",\"Australia\"\n\"1976\",\"Nedbank\",\"NED.JO\",\"5968057256\",\"12.09\",\"South Africa\"\n\"1977\",\"Rightmove\",\"3JDA.F\",\"5967868911\",\"6.79\",\"United Kingdom\"\n\"1978\",\"M&G plc\",\"MNG.L\",\"5964617119\",\"231.64\",\"United Kingdom\"\n\"1979\",\"Informatica\",\"INFA\",\"5944803328\",\"21.23\",\"United States\"\n\"1980\",\"TopBuild\",\"BLD\",\"5942305280\",\"181.29\",\"United States\"\n\"1981\",\"National Fuel Gas\",\"NFG\",\"5940505088\",\"64.96\",\"United States\"\n\"1982\",\"Indian Railway Catering & Tourism\",\"IRCTC.NS\",\"5939024619\",\"7.42\",\"India\"\n\"1983\",\"Itochu Techno-Solutions\",\"4739.T\",\"5937274836\",\"25.69\",\"Japan\"\n\"1984\",\"Leonardo\",\"LDO.MI\",\"5926616487\",\"10.3\",\"Italy\"\n\"1985\",\"Sainsbury's\",\"SBRY.L\",\"5922772961\",\"252.71\",\"United Kingdom\"\n\"1986\",\"Mindtree\",\"MINDTREE.NS\",\"5921531153\",\"35.89\",\"India\"\n\"1987\",\"Hualan Biological Engineering\",\"002007.SZ\",\"5919808795\",\"3.24\",\"China\"\n\"1988\",\"Kingfisher\",\"KFI1.F\",\"5916239541\",\"2.93\",\"United Kingdom\"\n\"1989\",\"H&amp;R Block\",\"HRB\",\"5916149760\",\"37.07\",\"United States\"\n\"1990\",\"AltaGas\",\"ALA.TO\",\"5913716405\",\"21.07\",\"Canada\"\n\"1991\",\"SailPoint\",\"SAIL\",\"5912243712\",\"62.67\",\"United States\"\n\"1992\",\"Sinopac Financial Holdings\",\"2890.TW\",\"5911085965\",\"0.52\",\"Taiwan\"\n\"1993\",\"LEG Immobilien\",\"LEG.DE\",\"5907843668\",\"79.18\",\"Germany\"\n\"1994\",\"Centrica\",\"CNA.L\",\"5899916176\",\"99.87\",\"United Kingdom\"\n\"1995\",\"Banco Popular\",\"BPOP\",\"5896886784\",\"77.01\",\"United States\"\n\"1996\",\"Cosan\",\"CSAN\",\"5890811392\",\"12.61\",\"Brazil\"\n\"1997\",\"Stifel\",\"SF\",\"5887846400\",\"55.25\",\"United States\"\n\"1998\",\"GlobalWafers\",\"6488.TWO\",\"5885128847\",\"13.52\",\"Taiwan\"\n\"1999\",\"Washington H. Soul Pattinson and Company (WHSP)\",\"SOL.AX\",\"5868505720\",\"16.26\",\"Australia\"\n\"2000\",\"Saudi Kayan Petrochemical Company\",\"2350.SR\",\"5866993431\",\"3.91\",\"Saudi Arabia\"\n\"2001\",\"FS KKR Capital\",\"FSK\",\"5864950784\",\"20.65\",\"United States\"\n\"2002\",\"Clariant\",\"CLN.SW\",\"5862227929\",\"17.81\",\"Switzerland\"\n\"2003\",\"Cemex\",\"CX\",\"5859665920\",\"3.81\",\"Mexico\"\n\"2004\",\"Megacable Holdings\",\"MEGACPO.MX\",\"5852535964\",\"2.28\",\"Mexico\"\n\"2005\",\"Hulic\",\"3003.T\",\"5852175948\",\"7.68\",\"Japan\"\n\"2006\",\"Chart Industries\",\"GTLS\",\"5849596416\",\"159.76\",\"United States\"\n\"2007\",\"Zomato\",\"ZOMATO.NS\",\"5848085056\",\"0.74\",\"India\"\n\"2008\",\"Dutch Bros\",\"BROS\",\"5840140288\",\"35.68\",\"United States\"\n\"2009\",\"Temenos\",\"TEMN.SW\",\"5833099430\",\"81.41\",\"Switzerland\"\n\"2010\",\"Reynolds Consumer\",\"REYN\",\"5832093184\",\"27.79\",\"United States\"\n\"2011\",\"Mapletree Logistics Trust\",\"M44U.SI\",\"5824010379\",\"1.22\",\"Singapore\"\n\"2012\",\"Datto\",\"MSP\",\"5821586432\",\"35.18\",\"United States\"\n\"2013\",\"Tenet Healthcare\",\"THC\",\"5810040320\",\"53.94\",\"United States\"\n\"2014\",\"Flowers Foods\",\"FLO\",\"5803589632\",\"27.37\",\"United States\"\n\"2015\",\"RBC Bearings\",\"ROLL\",\"5803556352\",\"200.95\",\"United States\"\n\"2016\",\"Yuhan\",\"000100.KS\",\"5798557863\",\"43.9\",\"South Korea\"\n\"2017\",\"GPT Group\",\"GPT.AX\",\"5788306924\",\"3.02\",\"Australia\"\n\"2018\",\"First Financial Bankshares\",\"FFIN\",\"5785828864\",\"40.54\",\"United States\"\n\"2019\",\"Metso Outotec (Mo Group)\",\"MOCORP.HE\",\"5781122510\",\"6.98\",\"Finland\"\n\"2020\",\"Land Securities Group\",\"LAND.L\",\"5778349268\",\"779.28\",\"United Kingdom\"\n\"2021\",\"Kintetsu GHD\",\"9041.T\",\"5777561324\",\"30.38\",\"Japan\"\n\"2022\",\"Southwest Gas\",\"SWX\",\"5775344128\",\"86.39\",\"United States\"\n\"2023\",\"Globus Medical\",\"GMED\",\"5760262144\",\"56.62\",\"United States\"\n\"2024\",\"CCC Intelligent Solutions\",\"CCCS\",\"5759926272\",\"9.37\",\"United States\"\n\"2025\",\"Skechers\",\"SKX\",\"5758817280\",\"36.97\",\"United States\"\n\"2026\",\"GMO Payment Gateway\",\"3769.T\",\"5757302334\",\"75.91\",\"Japan\"\n\"2027\",\"HelloFresh\",\"HFG.DE\",\"5743172215\",\"33.06\",\"Germany\"\n\"2028\",\"Fastighets AB Balder\",\"BALD-B.ST\",\"5738583994\",\"5.13\",\"Sweden\"\n\"2029\",\"Charoen Pokphand Foods\",\"CPF.BK\",\"5734081719\",\"0.72\",\"Thailand\"\n\"2030\",\"BOC Aviation\",\"2588.HK\",\"5733493113\",\"8.26\",\"Singapore\"\n\"2031\",\"Klépierre\",\"LI.PA\",\"5732071932\",\"20.09\",\"France\"\n\"2032\",\"Mineral Resources\",\"MIN.AX\",\"5731154530\",\"30.29\",\"Australia\"\n\"2033\",\"Ingredion\",\"INGR\",\"5729319424\",\"86.52\",\"United States\"\n\"2034\",\"Bandhan Bank\",\"BANDHANBNK.NS\",\"5721274120\",\"3.55\",\"India\"\n\"2035\",\"Tomra\",\"TOM.OL\",\"5719903950\",\"19.34\",\"Norway\"\n\"2036\",\"Procter &amp; Gamble India\",\"PGHH.NS\",\"5717836094\",\"176.15\",\"India\"\n\"2037\",\"RTL Group\",\"RRTL.F\",\"5716700090\",\"36.94\",\"Luxembourg\"\n\"2038\",\"NCsoft\",\"036570.KS\",\"5712717641\",\"273.78\",\"South Korea\"\n\"2039\",\"South State Corp\",\"SSB\",\"5697652736\",\"75.49\",\"United States\"\n\"2040\",\"MOL Group\",\"MOL.BD\",\"5695291712\",\"7.02\",\"Hungary\"\n\"2041\",\"Paytm\",\"PAYTM.NS\",\"5691954452\",\"8.77\",\"India\"\n\"2042\",\"Sonoco\",\"SON\",\"5682067456\",\"58.28\",\"United States\"\n\"2043\",\"Taishin Financial Holdings\",\"2887.TW\",\"5677745324\",\"0.5\",\"Taiwan\"\n\"2044\",\"CRISPR Therapeutics\",\"CRSP\",\"5668311040\",\"73.18\",\"Switzerland\"\n\"2045\",\"Spark New Zealand\",\"NZTCF\",\"5664342528\",\"3.03\",\"New Zealand\"\n\"2046\",\"Azenta\",\"AZTA\",\"5659029504\",\"75.47\",\"United States\"\n\"2047\",\"Otsuka\",\"4768.T\",\"5655846191\",\"29.83\",\"Japan\"\n\"2048\",\"FirstService\",\"FSV\",\"5653104640\",\"127.92\",\"Canada\"\n\"2049\",\"Perrigo\",\"PRGO\",\"5649838592\",\"41.99\",\"Ireland\"\n\"2050\",\"SiteOne Landscape Supply\",\"SITE\",\"5643245568\",\"125.6\",\"United States\"\n\"2051\",\"Bausch + Lomb\",\"BLCO\",\"5631071232\",\"16.08\",\"Canada\"\n\"2052\",\"Barratt Developments\",\"BDEV.L\",\"5621652767\",\"549.04\",\"United Kingdom\"\n\"2053\",\"Delhivery\",\"DELHIVERY.NS\",\"5615471747\",\"7.75\",\"India\"\n\"2054\",\"Capcom\",\"9697.T\",\"5610703986\",\"26.28\",\"Japan\"\n\"2055\",\"EVA Air\",\"2618.TW\",\"5607812036\",\"1.06\",\"Taiwan\"\n\"2056\",\"XPO Logistics\",\"XPO\",\"5600318464\",\"48.69\",\"United States\"\n\"2057\",\"Toll Brothers\",\"TOL\",\"5599379968\",\"48.7\",\"United States\"\n\"2058\",\"Woodward\",\"WWD\",\"5592691200\",\"92.22\",\"United States\"\n\"2059\",\"Agree Realty\",\"ADC\",\"5589313024\",\"74.01\",\"United States\"\n\"2060\",\"Balkrishna Industries\",\"BALKRISIND.NS\",\"5588122494\",\"28.91\",\"India\"\n\"2061\",\"Grupo Aeroportuario del Sureste\",\"ASR\",\"5581799936\",\"186.06\",\"Mexico\"\n\"2062\",\"Allegro.eu\",\"ALE.WA\",\"5568354194\",\"5.44\",\"Poland\"\n\"2063\",\"TMX Group\",\"X.TO\",\"5564062491\",\"99.57\",\"Canada\"\n\"2064\",\"STAG Industrial\",\"STAG\",\"5549997056\",\"30.31\",\"United States\"\n\"2065\",\"Celsius Holdings\",\"CELH\",\"5545866752\",\"73.59\",\"United States\"\n\"2066\",\"Shell Midstream Partners\",\"SHLX\",\"5545389056\",\"14.1\",\"United States\"\n\"2067\",\"WESCO International\",\"WCC\",\"5545254400\",\"109.34\",\"United States\"\n\"2068\",\"Descartes Systems\",\"DSGX\",\"5542297088\",\"63.32\",\"Canada\"\n\"2069\",\"Elm Company\",\"7203.SR\",\"5541600000\",\"69.27\",\"Saudi Arabia\"\n\"2070\",\"ITT\",\"ITT\",\"5537302528\",\"66.32\",\"United States\"\n\"2071\",\"Tenable\",\"TENB\",\"5531311616\",\"50.02\",\"United States\"\n\"2072\",\"Boyd Gaming\",\"BYD\",\"5530704384\",\"50.47\",\"United States\"\n\"2073\",\"Northern Star\",\"NST.AX\",\"5529591347\",\"4.6\",\"Australia\"\n\"2074\",\"Commercial International Bank\",\"CIN1.F\",\"5525632531\",\"2.06\",\"Egypt\"\n\"2075\",\"TOTO\",\"5332.T\",\"5523027448\",\"32.58\",\"Japan\"\n\"2076\",\"Kobe Bussan\",\"3038.T\",\"5521861677\",\"25.33\",\"Japan\"\n\"2077\",\"GLP J-REIT\",\"3281.T\",\"5518993305\",\"1229.07\",\"Japan\"\n\"2078\",\"Mirvac Group\",\"MGR.AX\",\"5517578920\",\"1.4\",\"Australia\"\n\"2079\",\"Dai Nippon Printing\",\"7912.T\",\"5515766566\",\"20.58\",\"Japan\"\n\"2080\",\"Nomura Real Estate Master Fund\",\"3462.T\",\"5512319626\",\"1202.72\",\"Japan\"\n\"2081\",\"Ashland\",\"ASH\",\"5505043456\",\"101.71\",\"United States\"\n\"2082\",\"Treasury Wine Estates\",\"TWE.AX\",\"5504255429\",\"7.63\",\"Australia\"\n\"2083\",\"MKS Instruments\",\"MKSI\",\"5502488064\",\"98.86\",\"United States\"\n\"2084\",\"Saia\",\"SAIA\",\"5498228736\",\"208.2\",\"United States\"\n\"2085\",\"OTP Bank\",\"OTP.F\",\"5493497951\",\"19.67\",\"Hungary\"\n\"2086\",\"MDU Resources\",\"MDU\",\"5488443904\",\"26.99\",\"United States\"\n\"2087\",\"Rayonier\",\"RYN\",\"5483023360\",\"36.65\",\"United States\"\n\"2088\",\"Spirit Realty Capital\",\"SRC\",\"5481109504\",\"40.81\",\"United States\"\n\"2089\",\"Pinnacle Financial Partners\",\"PNFP\",\"5478361088\",\"71.72\",\"United States\"\n\"2090\",\"MasTec\",\"MTZ\",\"5478177792\",\"72.05\",\"United States\"\n\"2091\",\"KION Group\",\"KGX.DE\",\"5461594868\",\"41.66\",\"Germany\"\n\"2092\",\"Landstar System\",\"LSTR\",\"5457341952\",\"146.99\",\"United States\"\n\"2093\",\"On Holding\",\"ONON\",\"5454020096\",\"17.34\",\"Switzerland\"\n\"2094\",\"Square Enix\",\"9684.T\",\"5445863959\",\"45.53\",\"Japan\"\n\"2095\",\"CyberArk\",\"CYBR\",\"5435625984\",\"133.5\",\"Israel\"\n\"2096\",\"Sotera Health\",\"SHC\",\"5432913920\",\"19.21\",\"United States\"\n\"2097\",\"Kajima\",\"1812.T\",\"5424778855\",\"11\",\"Japan\"\n\"2098\",\"Inspire Medical Systems\",\"INSP\",\"5419168256\",\"196.41\",\"United States\"\n\"2099\",\"Qantas Airways\",\"QAN.AX\",\"5417987946\",\"2.87\",\"Australia\"\n\"2100\",\"GDS Holdings\",\"GDS\",\"5412130816\",\"27.48\",\"China\"\n\"2101\",\"PI Industries\",\"PIIND.NS\",\"5403216240\",\"35.63\",\"India\"\n\"2102\",\"Houlihan Lokey\",\"HLI\",\"5400423424\",\"78.5\",\"United States\"\n\"2103\",\"Lumentum\",\"LITE\",\"5397870080\",\"78.23\",\"United States\"\n\"2104\",\"Ampol\",\"ALD.AX\",\"5396550260\",\"22.65\",\"Australia\"\n\"2105\",\"United Breweries\",\"UBL.NS\",\"5388164259\",\"20.38\",\"India\"\n\"2106\",\"Realtek\",\"2379.TW\",\"5387974565\",\"10.51\",\"Taiwan\"\n\"2107\",\"Unite Group (Unite Students)\",\"UTG.L\",\"5383594585\",\"1341.99\",\"United Kingdom\"\n\"2108\",\"SCSK Corporation\",\"9719.T\",\"5379269168\",\"17.23\",\"Japan\"\n\"2109\",\"Texas Roadhouse\",\"TXRH\",\"5379137024\",\"78.91\",\"United States\"\n\"2110\",\"Oak Street Health\",\"OSH\",\"5375949824\",\"22.3\",\"United States\"\n\"2111\",\"Brunswick Corporation\",\"BC\",\"5373793792\",\"70.96\",\"United States\"\n\"2112\",\"Playtika\",\"PLTK\",\"5373545984\",\"13.03\",\"Israel\"\n\"2113\",\"Koei Tecmo\",\"3635.T\",\"5372097517\",\"34.11\",\"Japan\"\n\"2114\",\"10x Genomics\",\"TXG\",\"5365897216\",\"47.33\",\"United States\"\n\"2115\",\"Idacorp\",\"IDA\",\"5360033792\",\"106.02\",\"United States\"\n\"2116\",\"Toppan\",\"7911.T\",\"5351560757\",\"16.05\",\"Japan\"\n\"2117\",\"Trent Limited\",\"TRENT.NS\",\"5348983446\",\"15.04\",\"India\"\n\"2118\",\"Alfamart\",\"AMRT.JK\",\"5348166687\",\"0.13\",\"Indonesia\"\n\"2119\",\"Mimecast\",\"MIME\",\"5346544128\",\"79.92\",\"United Kingdom\"\n\"2120\",\"Seek Limited\",\"SEK.AX\",\"5343844337\",\"14.36\",\"Australia\"\n\"2121\",\"Glacier Bancorp\",\"GBCI\",\"5335453696\",\"48.17\",\"United States\"\n\"2122\",\"Valley Bank\",\"VLY\",\"5331391488\",\"10.53\",\"United States\"\n\"2123\",\"Coca-Cola Consolidated\",\"COKE\",\"5330267136\",\"579.29\",\"United States\"\n\"2124\",\"ASR Nederland\",\"ASRNL.AS\",\"5329311469\",\"39.25\",\"Netherlands\"\n\"2125\",\"Rumo\",\"RAIL3.SA\",\"5327313960\",\"2.88\",\"Brazil\"\n\"2126\",\"Oshkosh Corporation\",\"OSK\",\"5325439488\",\"80.94\",\"United States\"\n\"2127\",\"ZIM Integrated Shipping Services\",\"ZIM\",\"5324447232\",\"44.39\",\"Israel\"\n\"2128\",\"AMN Healthcare Services\",\"AMN\",\"5318022656\",\"118.92\",\"United States\"\n\"2129\",\"Sabesp\",\"SBS\",\"5317708288\",\"7.78\",\"Brazil\"\n\"2130\",\"Option Care Health\",\"OPCH\",\"5315134976\",\"29.52\",\"United States\"\n\"2131\",\"Valvoline\",\"VVV\",\"5304954368\",\"29.77\",\"United States\"\n\"2132\",\"Selective Insurance\",\"SIGI\",\"5304761856\",\"87.9\",\"United States\"\n\"2133\",\"“K” Line\",\"9107.T\",\"5303173583\",\"56.37\",\"Japan\"\n\"2134\",\"Atlas Arteria\",\"ALX.AX\",\"5303026588\",\"5.53\",\"Australia\"\n\"2135\",\"Ashok Leyland\",\"ASHOKLEY.NS\",\"5294498426\",\"1.8\",\"India\"\n\"2136\",\"X5 Retail Group\",\"FIVE.ME\",\"5292727990\",\"19.49\",\"Netherlands\"\n\"2137\",\"iA Financial\",\"IAG.TO\",\"5277396132\",\"49.03\",\"Canada\"\n\"2138\",\"Synovus\",\"SNV\",\"5270791168\",\"36.27\",\"United States\"\n\"2139\",\"PDC Energy\",\"PDCE\",\"5268898816\",\"53.08\",\"United States\"\n\"2140\",\"RLI Corp.\",\"RLI\",\"5266851840\",\"116.23\",\"United States\"\n\"2141\",\"Colgate-Palmolive India\",\"COLPAL.NS\",\"5259703137\",\"19.33\",\"India\"\n\"2142\",\"Emcor\",\"EME\",\"5257898496\",\"102.81\",\"United States\"\n\"2143\",\"Convatec Group\",\"CTEC.L\",\"5251897101\",\"257.22\",\"United Kingdom\"\n\"2144\",\"nVent Electric\",\"NVT\",\"5243257856\",\"31.52\",\"United Kingdom\"\n\"2145\",\"Alaska Airlines\",\"ALK\",\"5240383488\",\"41.56\",\"United States\"\n\"2146\",\"Telecom Italia\",\"TIT.MI\",\"5232328012\",\"0.25\",\"Italy\"\n\"2147\",\"Kosé\",\"4922.T\",\"5228665461\",\"91.65\",\"Japan\"\n\"2148\",\"MP Materials\",\"MP\",\"5225507328\",\"29.44\",\"United States\"\n\"2149\",\"Hyundai Glovis\",\"086280.KS\",\"5220539983\",\"136.51\",\"South Korea\"\n\"2150\",\"Barito Pacific\",\"OB8.F\",\"5219346019\",\"0.04\",\"Indonesia\"\n\"2151\",\"Mandiant\",\"MNDT\",\"5217666048\",\"22.12\",\"United States\"\n\"2152\",\"SAIC\",\"SAIC\",\"5217562624\",\"93.7\",\"United States\"\n\"2153\",\"Koç Holding\",\"KCHOL.IS\",\"5212080720\",\"2.06\",\"Turkey\"\n\"2154\",\"Acuity Brands\",\"AYI\",\"5209234432\",\"159.24\",\"United States\"\n\"2155\",\"Industrial Bank of Korea (IBK)\",\"024110.KS\",\"5208206012\",\"7\",\"South Korea\"\n\"2156\",\"Ginkgo Bioworks\",\"DNA\",\"5205555200\",\"2.93\",\"United States\"\n\"2157\",\"Abbott India\",\"ABBOTINDIA.NS\",\"5204939102\",\"244.8\",\"India\"\n\"2158\",\"Saudi Investment Bank\",\"1030.SR\",\"5200895236\",\"5.2\",\"Saudi Arabia\"\n\"2159\",\"Hanover Insurance Group\",\"THG\",\"5195848704\",\"145.99\",\"United States\"\n\"2160\",\"Erdemir\",\"EREGL.IS\",\"5192630325\",\"1.53\",\"Turkey\"\n\"2161\",\"Kinsale Capital Group\",\"KNSL\",\"5190494720\",\"226.58\",\"United States\"\n\"2162\",\"Sunrun\",\"RUN\",\"5187689984\",\"24.69\",\"United States\"\n\"2163\",\"Groupe SEB\",\"SK.PA\",\"5186068851\",\"94.37\",\"France\"\n\"2164\",\"Ionis Pharmaceuticals\",\"IONS\",\"5182716928\",\"36.55\",\"United States\"\n\"2165\",\"PS Business Parks\",\"PSB\",\"5177590784\",\"187.38\",\"United States\"\n\"2166\",\"Matador Resources\",\"MTDR\",\"5167968768\",\"43.75\",\"United States\"\n\"2167\",\"Nan Ya PCB\",\"8046.TW\",\"5164390971\",\"7.99\",\"Taiwan\"\n\"2168\",\"Container Corporation of India\",\"CONCOR.NS\",\"5163534410\",\"8.47\",\"India\"\n\"2169\",\"Omnicell\",\"OMCL\",\"5149090304\",\"116.5\",\"United States\"\n\"2170\",\"Gland Pharma\",\"GLAND.NS\",\"5148968749\",\"31.27\",\"India\"\n\"2171\",\"Gildan\",\"GIL\",\"5148507648\",\"26.7\",\"Canada\"\n\"2172\",\"BOK Financial\",\"BOKF\",\"5143214080\",\"75.52\",\"United States\"\n\"2173\",\"Axalta\",\"AXTA\",\"5138057728\",\"23.2\",\"United States\"\n\"2174\",\"United Internet\",\"UTDI.F\",\"5135972135\",\"27.01\",\"Germany\"\n\"2175\",\"Piramal Group\",\"PEL.NS\",\"5134211445\",\"21.51\",\"India\"\n\"2176\",\"Quebecor\",\"QBR-B.TO\",\"5133172220\",\"21.43\",\"Canada\"\n\"2177\",\"EXL Service\",\"EXLS\",\"5132731904\",\"154.2\",\"United States\"\n\"2178\",\"BWX Technologies\",\"BWXT\",\"5127771136\",\"56.23\",\"United States\"\n\"2179\",\"Muthoot Finance\",\"MUTHOOTFIN.NS\",\"5126253950\",\"12.77\",\"India\"\n\"2180\",\"Mphasis\",\"MPHASIS.NS\",\"5121211070\",\"27.23\",\"India\"\n\"2181\",\"Bombardier Recreational Products\",\"DOOO\",\"5119842816\",\"65.13\",\"Canada\"\n\"2182\",\"ACC\",\"ACC.NS\",\"5118747330\",\"27.26\",\"India\"\n\"2183\",\"Ubisoft\",\"UBI.PA\",\"5118254206\",\"41.14\",\"France\"\n\"2184\",\"Turquoise Hill Resources\",\"TRQ\",\"5115258880\",\"24.36\",\"Canada\"\n\"2185\",\"American National Insurance\",\"ANAT\",\"5109105664\",\"190.02\",\"United States\"\n\"2186\",\"KOBAYASHI Pharmaceutical\",\"4967.T\",\"5108344936\",\"66.1\",\"Japan\"\n\"2187\",\"Post Holdings\",\"POST\",\"5100125184\",\"83.96\",\"United States\"\n\"2188\",\"Intra-Cellular Therapies\",\"ITCI\",\"5097285632\",\"54.04\",\"United States\"\n\"2189\",\"Bright Horizons\",\"BFAM\",\"5088478208\",\"85.66\",\"United States\"\n\"2190\",\"DWS Group\",\"DWS.F\",\"5083655980\",\"25.04\",\"Germany\"\n\"2191\",\"Curtiss-Wright\",\"CW\",\"5082097664\",\"132.19\",\"United States\"\n\"2192\",\"Obayashi\",\"1802.T\",\"5074692052\",\"7.08\",\"Japan\"\n\"2193\",\"Magnolia Oil &amp; Gas\",\"MGY\",\"5073658368\",\"19.15\",\"United States\"\n\"2194\",\"Crane Co.\",\"CR\",\"5072986624\",\"90.5\",\"United States\"\n\"2195\",\"TVS Motor\",\"TVSMOTOR.NS\",\"5072163754\",\"10.68\",\"India\"\n\"2196\",\"Terminix Global\",\"TMX\",\"5070320128\",\"41.73\",\"United States\"\n\"2197\",\"Santander Polska\",\"BZI.F\",\"5069079554\",\"48.69\",\"Poland\"\n\"2198\",\"Covivio\",\"COV.PA\",\"5052763511\",\"53.9\",\"France\"\n\"2199\",\"Alkermes\",\"ALKS\",\"5052136960\",\"30.78\",\"Ireland\"\n\"2200\",\"Enagás\",\"ENG.MC\",\"5047526130\",\"19.32\",\"Spain\"\n\"2201\",\"COSCO SHIPPING Development\",\"601866.SS\",\"5044811340\",\"0.44\",\"China\"\n\"2202\",\"Mapletree Industrial Trust\",\"ME8U.SI\",\"5028539953\",\"1.87\",\"Singapore\"\n\"2203\",\"HealthEquity\",\"HQY\",\"5024518144\",\"59.56\",\"United States\"\n\"2204\",\"Qualys\",\"QLYS\",\"5024355840\",\"129.38\",\"United States\"\n\"2205\",\"Euronet Worldwide\",\"EEFT\",\"5023455744\",\"99.38\",\"United States\"\n\"2206\",\"Jarir\",\"4190.SR\",\"5019716645\",\"41.83\",\"Saudi Arabia\"\n\"2207\",\"Bechtle\",\"BC8.F\",\"5015046950\",\"38.36\",\"Germany\"\n\"2208\",\"Endava\",\"DAVA\",\"5013929984\",\"89.54\",\"United Kingdom\"\n\"2209\",\"Braskem\",\"BAK\",\"5008943616\",\"12.57\",\"Brazil\"\n\"2210\",\"Novavax\",\"NVAX\",\"5006865408\",\"64.08\",\"United States\"\n\"2211\",\"DraftKings\",\"DKNG\",\"4999223808\",\"11.43\",\"United States\"\n\"2212\",\"Discovery Limited\",\"DSY.JO\",\"4997401484\",\"7.56\",\"South Africa\"\n\"2213\",\"Owl Rock Capital\",\"ORCC\",\"4997368320\",\"12.67\",\"United States\"\n\"2214\",\"Marriott Vacations Worldwide\",\"VAC\",\"4996504064\",\"120.6\",\"United States\"\n\"2215\",\"Ascendis Pharma\",\"ASND\",\"4994980352\",\"89.51\",\"Denmark\"\n\"2216\",\"Universal Display Corporation\",\"OLED\",\"4993856512\",\"105.77\",\"United States\"\n\"2217\",\"TriNet\",\"TNET\",\"4993131520\",\"80.2\",\"United States\"\n\"2218\",\"British Land\",\"BLDA.F\",\"4986823883\",\"5.38\",\"United Kingdom\"\n\"2219\",\"Penn National Gaming\",\"PENN\",\"4981655040\",\"29.87\",\"United States\"\n\"2220\",\"CTS Eventim\",\"EVD.F\",\"4975717937\",\"51.84\",\"Germany\"\n\"2221\",\"Cabot Microelectronics\",\"CCMP\",\"4969444864\",\"173.69\",\"United States\"\n\"2222\",\"Keyera\",\"KEY.TO\",\"4969002983\",\"22.48\",\"Canada\"\n\"2223\",\"Sharp Corporation\",\"6753.T\",\"4961848772\",\"7.64\",\"Japan\"\n\"2224\",\"Apellis Pharmaceuticals\",\"APLS\",\"4955403264\",\"46.52\",\"United States\"\n\"2225\",\"DAQO New Energy\",\"DQ\",\"4951355904\",\"66.46\",\"China\"\n\"2226\",\"Mercury NZ\",\"MCY.AX\",\"4950822989\",\"3.58\",\"New Zealand\"\n\"2227\",\"Canara Bank\",\"CANBK.NS\",\"4948996089\",\"2.73\",\"India\"\n\"2228\",\"CyberAgent\",\"4751.T\",\"4943289026\",\"9.78\",\"Japan\"\n\"2229\",\"Stantec\",\"STN\",\"4940787712\",\"44.6\",\"Canada\"\n\"2230\",\"Savola Group\",\"2050.SR\",\"4938134959\",\"9.26\",\"Saudi Arabia\"\n\"2231\",\"Chemours\",\"CC\",\"4937695232\",\"31.76\",\"United States\"\n\"2232\",\"HYBE\",\"352820.KS\",\"4933490277\",\"119.3\",\"South Korea\"\n\"2233\",\"OneMain Financial\",\"OMF\",\"4930183168\",\"39.38\",\"United States\"\n\"2234\",\"City Developments\",\"C09.SI\",\"4915417415\",\"5.42\",\"Singapore\"\n\"2235\",\"Nanya Technology\",\"2408.TW\",\"4914333610\",\"1.59\",\"Taiwan\"\n\"2236\",\"MSA Safety\",\"MSA\",\"4902040064\",\"124.62\",\"United States\"\n\"2237\",\"Wintrust Financial\",\"WTFC\",\"4901893632\",\"80.73\",\"United States\"\n\"2238\",\"RingCentral\",\"RNG\",\"4900553216\",\"51.64\",\"United States\"\n\"2239\",\"Biocon\",\"BIOCON.NS\",\"4899314498\",\"4.08\",\"India\"\n\"2240\",\"Medpace\",\"MEDP\",\"4898356224\",\"152.76\",\"United States\"\n\"2241\",\"Offcn Education\",\"002607.SZ\",\"4897600814\",\"0.79\",\"China\"\n\"2242\",\"New York Times\",\"NYT\",\"4896395776\",\"29.37\",\"United States\"\n\"2243\",\"Vonage Holdings Corp.\",\"VG\",\"4895584768\",\"19.08\",\"United States\"\n\"2244\",\"Penumbra\",\"PEN\",\"4894320128\",\"129.9\",\"United States\"\n\"2245\",\"GXO Logistics\",\"GXO\",\"4890125312\",\"41.23\",\"United States\"\n\"2246\",\"Leggett &amp; Platt\",\"LEG\",\"4889631744\",\"36.61\",\"United States\"\n\"2247\",\"Endeavour Mining\",\"EDV.TO\",\"4886655668\",\"19.25\",\"United Kingdom\"\n\"2248\",\"LHC Group\",\"LHCG\",\"4884070400\",\"157.41\",\"United States\"\n\"2249\",\"Rogers Corporation\",\"ROG\",\"4874969600\",\"259.26\",\"United States\"\n\"2250\",\"Gelsenwasser\",\"WWG.F\",\"4873680378\",\"1417.8\",\"Germany\"\n\"2251\",\"Iridium Communications\",\"IRDM\",\"4871375872\",\"38.06\",\"United States\"\n\"2252\",\"Mapfre\",\"MAP.MC\",\"4870921911\",\"1.58\",\"Spain\"\n\"2253\",\"Hanwha Solutions\",\"009830.KS\",\"4867695064\",\"25.47\",\"South Korea\"\n\"2254\",\"IPG Photonics\",\"IPGP\",\"4866168320\",\"93.81\",\"United States\"\n\"2255\",\"Komerční banka\",\"KONN.F\",\"4865249496\",\"25.76\",\"Czech Republic\"\n\"2256\",\"McDonald's Japan\",\"2702.T\",\"4861612131\",\"36.56\",\"Japan\"\n\"2257\",\"Nippon Express\",\"9147.T\",\"4861333402\",\"53.66\",\"Japan\"\n\"2258\",\"Falabella\",\"FALABELLA.SN\",\"4856128420\",\"1.94\",\"Chile\"\n\"2259\",\"Exponent\",\"EXPO\",\"4855165952\",\"93.69\",\"United States\"\n\"2260\",\"Colliers International\",\"CIGI\",\"4853089280\",\"112.37\",\"Canada\"\n\"2261\",\"SoFi\",\"SOFI\",\"4845757952\",\"6.06\",\"United States\"\n\"2262\",\"Odakyu Electric Railway\",\"9007.T\",\"4835752163\",\"13.31\",\"Japan\"\n\"2263\",\"Tube Investments of India\",\"TIINDIA.NS\",\"4833998993\",\"25.05\",\"India\"\n\"2264\",\"Weibo\",\"WB\",\"4830729216\",\"20.2\",\"China\"\n\"2265\",\"Nuvei\",\"NVEI\",\"4823290368\",\"31.63\",\"Canada\"\n\"2266\",\"Soitec\",\"SOI.PA\",\"4822940638\",\"136.9\",\"France\"\n\"2267\",\"Harley-Davidson\",\"HOG\",\"4813365248\",\"32.66\",\"United States\"\n\"2268\",\"Sanderson Farms\",\"SAFM\",\"4813350912\",\"215.65\",\"United States\"\n\"2269\",\"Thoughtworks\",\"TWKS\",\"4813140480\",\"15.51\",\"United States\"\n\"2270\",\"Blackstone Mortgage Trust\",\"BXMT\",\"4808876544\",\"28.24\",\"United States\"\n\"2271\",\"HealthSouth\",\"EHC\",\"4805211648\",\"48.15\",\"United States\"\n\"2272\",\"JSW Energy\",\"JSWENERGY.NS\",\"4801996740\",\"2.93\",\"India\"\n\"2273\",\"Ruchi Soya\",\"RUCHI.NS\",\"4800975470\",\"13.27\",\"India\"\n\"2274\",\"Lynas\",\"LYI.F\",\"4800024969\",\"5.03\",\"Malaysia\"\n\"2275\",\"United Bankshares\",\"UBSI\",\"4798807552\",\"35.47\",\"United States\"\n\"2276\",\"Jubilant FoodWorks\",\"JUBLFOOD.NS\",\"4798540579\",\"7.27\",\"India\"\n\"2277\",\"Eurazeo\",\"RF.PA\",\"4786145625\",\"62.44\",\"France\"\n\"2278\",\"Valmont Industries\",\"VMI\",\"4786114048\",\"224.58\",\"United States\"\n\"2279\",\"BlueScope Steel\",\"BSL.AX\",\"4784596563\",\"10.17\",\"Australia\"\n\"2280\",\"Novatek Microelectronics\",\"3034.TW\",\"4781879668\",\"7.86\",\"Taiwan\"\n\"2281\",\"Worley\",\"WOR.AX\",\"4770135756\",\"9.09\",\"Australia\"\n\"2282\",\"Bank AlJazira\",\"1020.SR\",\"4767238384\",\"5.81\",\"Saudi Arabia\"\n\"2283\",\"Louisiana-Pacific\",\"LPX\",\"4767071744\",\"58.42\",\"United States\"\n\"2284\",\"Intermediate Capital Group (ICG)\",\"ICP.L\",\"4767048699\",\"1621.91\",\"United Kingdom\"\n\"2285\",\"Clean Harbors\",\"CLH\",\"4746805248\",\"87.21\",\"United States\"\n\"2286\",\"Mazda\",\"7261.T\",\"4744501554\",\"7.53\",\"Japan\"\n\"2287\",\"Lechwerke\",\"LEC.F\",\"4740203085\",\"133.74\",\"Germany\"\n\"2288\",\"ERG\",\"ERG.MI\",\"4736296543\",\"31.81\",\"Italy\"\n\"2289\",\"Guardant Health\",\"GH\",\"4725150208\",\"46.36\",\"United States\"\n\"2290\",\"Columbia Sportswear\",\"COLM\",\"4718931968\",\"75.06\",\"United States\"\n\"2291\",\"Cemig\",\"CIG\",\"4717636096\",\"1.93\",\"Brazil\"\n\"2292\",\"Paycor\",\"PYCR\",\"4712075264\",\"26.94\",\"United States\"\n\"2293\",\"Wayfair\",\"W\",\"4711031808\",\"50.11\",\"United States\"\n\"2294\",\"Kingsoft\",\"3888.HK\",\"4710582108\",\"3.46\",\"China\"\n\"2295\",\"Rockwool\",\"R90.F\",\"4709838834\",\"217.6\",\"Denmark\"\n\"2296\",\"Dechra Pharmaceuticals\",\"DPH.L\",\"4709236377\",\"4210.2\",\"United Kingdom\"\n\"2297\",\"World Wrestling Entertainment\",\"WWE\",\"4708281856\",\"63.33\",\"United States\"\n\"2298\",\"Norwegian Cruise Line\",\"NCLH\",\"4693428224\",\"11.2\",\"United States\"\n\"2299\",\"Marqeta\",\"MQ\",\"4687636992\",\"8.61\",\"United States\"\n\"2300\",\"Yancoal\",\"YAL.AX\",\"4687065288\",\"3.52\",\"Australia\"\n\"2301\",\"HomeServe\",\"HSV.L\",\"4684410807\",\"1391.39\",\"United Kingdom\"\n\"2302\",\"Black Hills\",\"BKH\",\"4676568064\",\"72.13\",\"United States\"\n\"2303\",\"ASGN\",\"ASGN\",\"4669517824\",\"91.38\",\"United States\"\n\"2304\",\"AXIS Capital\",\"AXS\",\"4664280064\",\"54.69\",\"Bermuda\"\n\"2305\",\"Driven Brands\",\"DRVN\",\"4660072448\",\"27.82\",\"United States\"\n\"2306\",\"Hargreaves Lansdown\",\"HL.L\",\"4659582803\",\"977.31\",\"United Kingdom\"\n\"2307\",\"DS Smith\",\"SMDS.L\",\"4657589369\",\"338.41\",\"United Kingdom\"\n\"2308\",\"Coupa\",\"COUP\",\"4654306816\",\"61.61\",\"United States\"\n\"2309\",\"Topicus\",\"TOI.V\",\"4651137791\",\"58.19\",\"Canada\"\n\"2310\",\"Hikari Tsushin\",\"9435.T\",\"4648351828\",\"103.73\",\"Japan\"\n\"2311\",\"Alkem Laboratories\",\"ALKEM.NS\",\"4647227005\",\"38.87\",\"India\"\n\"2312\",\"Welcia Holdings\",\"3141.T\",\"4646974971\",\"21.91\",\"Japan\"\n\"2313\",\"Douglas Emmett\",\"DEI\",\"4629547520\",\"22.41\",\"United States\"\n\"2314\",\"Independence Realty Trust\",\"IRT\",\"4627657728\",\"20.29\",\"United States\"\n\"2315\",\"monday.com\",\"MNDY\",\"4626013184\",\"105.81\",\"Israel\"\n\"2316\",\"Lundbeck\",\"LDB.F\",\"4620411560\",\"23.15\",\"Denmark\"\n\"2317\",\"Tobu Railway\",\"9001.T\",\"4619642677\",\"22.14\",\"Japan\"\n\"2318\",\"Macy's\",\"M\",\"4616480256\",\"17.12\",\"United States\"\n\"2319\",\"DT Midstream\",\"DTM\",\"4614212096\",\"47.7\",\"United States\"\n\"2320\",\"Rexel\",\"RXL.PA\",\"4613460819\",\"15.14\",\"France\"\n\"2321\",\"Richter Gedeon\",\"RGEDF\",\"4610442240\",\"24.81\",\"Hungary\"\n\"2322\",\"Proximus\",\"PROX.VI\",\"4608267712\",\"14.28\",\"Belgium\"\n\"2323\",\"Cadila Healthcare\",\"CADILAHC.NS\",\"4603836898\",\"4.5\",\"India\"\n\"2324\",\"National Beverage\",\"FIZZ\",\"4600640000\",\"49.29\",\"United States\"\n\"2325\",\"Primerica\",\"PRI\",\"4598443520\",\"119.5\",\"United States\"\n\"2326\",\"Reply\",\"REY.MI\",\"4592011391\",\"122.98\",\"Italy\"\n\"2327\",\"U.S. Steel\",\"X\",\"4587176448\",\"17.6\",\"United States\"\n\"2328\",\"Argo Investments\",\"ARG.AX\",\"4584055442\",\"6.11\",\"Australia\"\n\"2329\",\"IDP Education\",\"IEL.AX\",\"4581546494\",\"16.46\",\"Australia\"\n\"2330\",\"ZhongAn Insurance\",\"6060.HK\",\"4578083675\",\"3.11\",\"China\"\n\"2331\",\"Banca Mediolanum\",\"BMED.MI\",\"4576060364\",\"6.21\",\"Italy\"\n\"2332\",\"AU Small Finance Bank\",\"AUBANK.NS\",\"4573342396\",\"7.26\",\"India\"\n\"2333\",\"Synaptics\",\"SYNA\",\"4569934336\",\"115.38\",\"United States\"\n\"2334\",\"Yamana Gold\",\"AUY\",\"4569740288\",\"4.76\",\"Canada\"\n\"2335\",\"Equatorial Energia\",\"EQTL3.SA\",\"4562086198\",\"4.15\",\"Brazil\"\n\"2336\",\"Godrej Properties\",\"GODREJPROP.NS\",\"4548951033\",\"16.36\",\"India\"\n\"2337\",\"Silicon Labs\",\"SLAB\",\"4546968576\",\"124.3\",\"United States\"\n\"2338\",\"Chord Energy\",\"CHRD\",\"4540237312\",\"107.37\",\"United States\"\n\"2339\",\"Wärtsilä\",\"WRT1V.HE\",\"4537451600\",\"7.69\",\"Finland\"\n\"2340\",\"Ultragenyx\",\"RARE\",\"4533575168\",\"64.83\",\"United States\"\n\"2341\",\"Schaeffler India\",\"SCHAEFFLER.NS\",\"4530787025\",\"28.99\",\"India\"\n\"2342\",\"Hexcel\",\"HXL\",\"4526582272\",\"53.86\",\"United States\"\n\"2343\",\"Bank OZK\",\"OZK\",\"4513997312\",\"37.58\",\"United States\"\n\"2344\",\"Italgas\",\"IG.MI\",\"4509701148\",\"5.54\",\"Italy\"\n\"2345\",\"Simpson Manufacturing Company\",\"SSD\",\"4507188224\",\"104.43\",\"United States\"\n\"2346\",\"Lantheus Holdings\",\"LNTH\",\"4506514944\",\"65.66\",\"United States\"\n\"2347\",\"Universal Forest Products\",\"UFPI\",\"4505570304\",\"71.82\",\"United States\"\n\"2348\",\"Lundin Mining\",\"LUN.TO\",\"4504049772\",\"5.78\",\"Canada\"\n\"2349\",\"Intellia Therapeutics\",\"NTLA\",\"4500412416\",\"59.33\",\"United States\"\n\"2350\",\"GOL Airlines\",\"GOL\",\"4496665600\",\"2.81\",\"Brazil\"\n\"2351\",\"Neoen\",\"NEOEN.PA\",\"4495958234\",\"41.97\",\"France\"\n\"2352\",\"Novanta\",\"NOVT\",\"4493373440\",\"125.85\",\"United States\"\n\"2353\",\"ScottsMiracle-Gro\",\"SMG\",\"4491769344\",\"81.09\",\"United States\"\n\"2354\",\"Ebos Group\",\"EBO.NZ\",\"4491615827\",\"23.72\",\"New Zealand\"\n\"2355\",\"Affiliated Managers Group\",\"AMG\",\"4487471616\",\"116.03\",\"United States\"\n\"2356\",\"Somfy\",\"SO.PA\",\"4480352660\",\"129.11\",\"France\"\n\"2357\",\"Hilton Grand Vacations\",\"HGV\",\"4479046144\",\"37.25\",\"United States\"\n\"2358\",\"Ollie's Bargain Outlet\",\"OLLI\",\"4478682624\",\"71.67\",\"United States\"\n\"2359\",\"Valmet\",\"VALMT.HE\",\"4474592209\",\"24.29\",\"Finland\"\n\"2360\",\"Jindal Steel &amp; Power\",\"JINDALSTEL.NS\",\"4471906589\",\"4.38\",\"India\"\n\"2361\",\"Grupo Simec\",\"SIM\",\"4470770688\",\"29.25\",\"Mexico\"\n\"2362\",\"Phillips Edison &amp; Company\",\"PECO\",\"4469711872\",\"34.8\",\"United States\"\n\"2363\",\"New Residential Investment\",\"NRZ\",\"4469485568\",\"9.58\",\"United States\"\n\"2364\",\"China Airlines\",\"2610.TW\",\"4467350627\",\"0.75\",\"Taiwan\"\n\"2365\",\"IAA-Insurance Auto Auctions\",\"IAA\",\"4466453504\",\"33.33\",\"United States\"\n\"2366\",\"Thor Industries\",\"THO\",\"4463916032\",\"81.86\",\"United States\"\n\"2367\",\"Kinnevik\",\"KINV-A.ST\",\"4455503808\",\"16.24\",\"Sweden\"\n\"2368\",\"Blue Owl Capital\",\"OWL\",\"4451295232\",\"10.41\",\"United States\"\n\"2369\",\"Mainfreight\",\"MFT.NZ\",\"4447910142\",\"44.17\",\"New Zealand\"\n\"2370\",\"Lendlease\",\"LLC.AX\",\"4447415853\",\"6.46\",\"Australia\"\n\"2371\",\"Asahi Intecc\",\"7747.T\",\"4446007556\",\"16.37\",\"Japan\"\n\"2372\",\"Hikma Pharmaceuticals\",\"H5P.F\",\"4442694789\",\"20.11\",\"United Kingdom\"\n\"2373\",\"Televisa\",\"TV\",\"4434362368\",\"7.82\",\"Mexico\"\n\"2374\",\"Premier\",\"PINC\",\"4432771584\",\"37.57\",\"United States\"\n\"2375\",\"Autohome\",\"ATHM\",\"4430652416\",\"34.67\",\"China\"\n\"2376\",\"Merlin Properties\",\"MRL.MC\",\"4429421917\",\"9.49\",\"Spain\"\n\"2377\",\"Husqvarna\",\"HUSQ-A.ST\",\"4427072900\",\"8.13\",\"Sweden\"\n\"2378\",\"Air Canada\",\"AC.TO\",\"4421153860\",\"12.35\",\"Canada\"\n\"2379\",\"Tegna\",\"TGNA\",\"4414697984\",\"19.81\",\"United States\"\n\"2380\",\"LOTTE Chemical\",\"011170.KS\",\"4403624283\",\"128.48\",\"South Korea\"\n\"2381\",\"Portland General Electric\",\"POR\",\"4401444352\",\"49.33\",\"United States\"\n\"2382\",\"Old National Bank\",\"ONB\",\"4400244224\",\"15.02\",\"United States\"\n\"2383\",\"Evotec\",\"EVO\",\"4394646528\",\"12.4\",\"Germany\"\n\"2384\",\"Home BancShares\",\"HOMB\",\"4392449536\",\"21.36\",\"United States\"\n\"2385\",\"ALD Automotive\",\"ALD.PA\",\"4392138329\",\"10.74\",\"France\"\n\"2386\",\"UOL Group\",\"U14.SI\",\"4384247733\",\"5.19\",\"Singapore\"\n\"2387\",\"Silgan Holdings\",\"SLGN\",\"4383248384\",\"39.56\",\"United States\"\n\"2388\",\"Royal Unibrew\",\"0R1.F\",\"4378999312\",\"88.25\",\"Denmark\"\n\"2389\",\"Element Solutions\",\"ESI\",\"4377106432\",\"17.67\",\"United States\"\n\"2390\",\"Topdanmarks\",\"TQ71.F\",\"4374923391\",\"48.43\",\"Denmark\"\n\"2391\",\"IDBI Bank\",\"IDBI.NS\",\"4374907411\",\"0.41\",\"India\"\n\"2392\",\"KGHM Polska Miedź\",\"KGHA.F\",\"4374551167\",\"21.37\",\"Poland\"\n\"2393\",\"Indian Hotels Company\",\"INDHOTEL.NS\",\"4370824805\",\"3.08\",\"India\"\n\"2394\",\"Hawaiian Electric Industries\",\"HE\",\"4369580032\",\"39.93\",\"United States\"\n\"2395\",\"Leroy Seafood\",\"LSG.OL\",\"4367028099\",\"7.33\",\"Norway\"\n\"2396\",\"Lyft\",\"LYFT\",\"4363694592\",\"12.54\",\"United States\"\n\"2397\",\"BlackLine\",\"BL\",\"4359446528\",\"73.5\",\"United States\"\n\"2398\",\"Eagle Materials\",\"EXP\",\"4358941184\",\"114.41\",\"United States\"\n\"2399\",\"Bezeq\",\"BEZQ.TA\",\"4353882816\",\"1.57\",\"Israel\"\n\"2400\",\"Astral Poly Technik\",\"ASTRAL.NS\",\"4343225799\",\"21.62\",\"India\"\n\"2401\",\"Orica\",\"ORI.AX\",\"4340507775\",\"10.6\",\"Australia\"\n\"2402\",\"Tower Bersama Infrastructure\",\"TBIG.JK\",\"4339378496\",\"0.19\",\"Indonesia\"\n\"2403\",\"Bankinter\",\"BKT.MC\",\"4336267262\",\"4.76\",\"Spain\"\n\"2404\",\"AAK\",\"AAK.ST\",\"4332788700\",\"16.51\",\"Sweden\"\n\"2405\",\"Iida Group\",\"3291.T\",\"4331862259\",\"15.37\",\"Japan\"\n\"2406\",\"Sallie Mae\",\"SLM\",\"4328961536\",\"16.08\",\"United States\"\n\"2407\",\"Ormat Technologies\",\"ORA\",\"4328735232\",\"77.2\",\"United States\"\n\"2408\",\"Integra LifeSciences\",\"IART\",\"4328429056\",\"52.07\",\"United States\"\n\"2409\",\"ServisFirst Bancshares\",\"SFBS\",\"4326944768\",\"79.7\",\"United States\"\n\"2410\",\"ONE Gas\",\"OGS\",\"4320160256\",\"79.87\",\"United States\"\n\"2411\",\"The Bidvest Group\",\"BVT.JO\",\"4316541101\",\"12.59\",\"South Africa\"\n\"2412\",\"Antero Midstream\",\"AM\",\"4305932800\",\"9\",\"United States\"\n\"2413\",\"Hitachi Construction Machinery\",\"6305.T\",\"4305728838\",\"20.25\",\"Japan\"\n\"2414\",\"Seaboard\",\"SEB\",\"4300701696\",\"3705.01\",\"United States\"\n\"2415\",\"Terreno Realty\",\"TRNO\",\"4295713280\",\"56.87\",\"United States\"\n\"2416\",\"UMB Financial\",\"UMBF\",\"4290055168\",\"88.63\",\"United States\"\n\"2417\",\"New York Community Bank\",\"NYCB\",\"4285073920\",\"9.18\",\"United States\"\n\"2418\",\"Mapletree Commercial Trust\",\"N2IU.SI\",\"4284636256\",\"1.29\",\"Singapore\"\n\"2419\",\"Smartsheet\",\"SMAR\",\"4282206208\",\"33.08\",\"United States\"\n\"2420\",\"Cadence Bancorp\",\"CADE\",\"4281405184\",\"23.33\",\"United States\"\n\"2421\",\"Onex\",\"ONEX.TO\",\"4279266694\",\"49.42\",\"Canada\"\n\"2422\",\"Murphy Oil\",\"MUR\",\"4277391360\",\"27.53\",\"United States\"\n\"2423\",\"Scout24\",\"G24.F\",\"4277333462\",\"53.33\",\"Germany\"\n\"2424\",\"Aroundtown\",\"AT1.F\",\"4273095626\",\"2.96\",\"Luxembourg\"\n\"2425\",\"Avnet\",\"AVT\",\"4271620608\",\"43.73\",\"United States\"\n\"2426\",\"Grocery Outlet\",\"GO\",\"4269075712\",\"44.3\",\"United States\"\n\"2427\",\"Punjab National Bank\",\"PNB.NS\",\"4265467537\",\"0.39\",\"India\"\n\"2428\",\"Pepkor\",\"PPH.JO\",\"4263933637\",\"1.15\",\"South Africa\"\n\"2429\",\"Gujarat Fluorochemicals\",\"FLUOROCHEM.NS\",\"4262695932\",\"38.77\",\"India\"\n\"2430\",\"Asset World Corp\",\"AWC.BK\",\"4262292982\",\"0.13\",\"Thailand\"\n\"2431\",\"Power Integrations\",\"POWI\",\"4261702144\",\"73.09\",\"United States\"\n\"2432\",\"The Weir Group\",\"WEIR.L\",\"4259942973\",\"1591.01\",\"United Kingdom\"\n\"2433\",\"Parsons\",\"PSN\",\"4257597696\",\"41.05\",\"United States\"\n\"2434\",\"Element Fleet Management\",\"EFN.TO\",\"4256169003\",\"10.68\",\"Canada\"\n\"2435\",\"Remgro Limited\",\"REM.JO\",\"4252842149\",\"7.6\",\"South Africa\"\n\"2436\",\"Sixt\",\"SIX2.F\",\"4251389812\",\"103.87\",\"Germany\"\n\"2437\",\"Wendy’s Company\",\"WEN\",\"4239948544\",\"19.79\",\"United States\"\n\"2438\",\"First Interstate BancSystem\",\"FIBK\",\"4239607808\",\"38.72\",\"United States\"\n\"2439\",\"Light &amp; Wonder\",\"LNW\",\"4235107328\",\"44.27\",\"United States\"\n\"2440\",\"Indian Overseas Bank\",\"IOB.NS\",\"4232089579\",\"0.22\",\"India\"\n\"2441\",\"PCCW\",\"0008.HK\",\"4229817802\",\"0.55\",\"Hong Kong\"\n\"2442\",\"New Jersey Resources\",\"NJR\",\"4229757696\",\"43.99\",\"United States\"\n\"2443\",\"Valeo\",\"FR.PA\",\"4228569902\",\"17.72\",\"France\"\n\"2444\",\"GN Store Nord\",\"GNN.F\",\"4228184036\",\"31.49\",\"Denmark\"\n\"2445\",\"Carsales\",\"CAR.AX\",\"4227807898\",\"12.71\",\"Australia\"\n\"2446\",\"Kinross Gold\",\"KGC\",\"4227567616\",\"3.25\",\"Canada\"\n\"2447\",\"Essent Group\",\"ESNT\",\"4222801152\",\"39.25\",\"Bermuda\"\n\"2448\",\"Netmarble\",\"251270.KS\",\"4210707211\",\"51.39\",\"South Korea\"\n\"2449\",\"Watts Water Technologies\",\"WTS\",\"4207663616\",\"125.78\",\"United States\"\n\"2450\",\"Yes Bank\",\"YESBANK.NS\",\"4206925876\",\"0.17\",\"India\"\n\"2451\",\"Shriram Transport Finance\",\"SRTRANSFIN.NS\",\"4206418127\",\"15.55\",\"India\"\n\"2452\",\"Ryman Hospitality Properties\",\"RHP\",\"4198257152\",\"76.13\",\"United States\"\n\"2453\",\"Cousins Properties\",\"CUZ\",\"4196632320\",\"28.21\",\"United States\"\n\"2454\",\"Johnson Matthey\",\"JMAT.L\",\"4195659523\",\"2237.04\",\"United Kingdom\"\n\"2455\",\"Helmerich &amp; Payne\",\"HP\",\"4194633984\",\"39.84\",\"United States\"\n\"2456\",\"Ortho Clinical Diagnostics\",\"OCDX\",\"4191268096\",\"17.63\",\"United States\"\n\"2457\",\"Howden Joinery\",\"HWDN.L\",\"4189074588\",\"732.92\",\"United Kingdom\"\n\"2458\",\"WeWork\",\"WE\",\"4185350656\",\"5.28\",\"United States\"\n\"2459\",\"Olam\",\"VC2.SI\",\"4181822184\",\"1.09\",\"Singapore\"\n\"2460\",\"Bank Pekao (Bank Polska Kasa Opieki)\",\"PEO.WA\",\"4179436116\",\"15.92\",\"Poland\"\n\"2461\",\"Hindustan Petroleum\",\"HINDPETRO.NS\",\"4174934339\",\"2.94\",\"India\"\n\"2462\",\"Rapid7\",\"RPD\",\"4171516672\",\"71.6\",\"United States\"\n\"2463\",\"Polycab India\",\"POLYCAB.NS\",\"4170635775\",\"27.85\",\"India\"\n\"2464\",\"Mediclinic International\",\"MEI.JO\",\"4169852943\",\"5.62\",\"South Africa\"\n\"2465\",\"NHPC Limited\",\"NHPC.NS\",\"4169202783\",\"0.42\",\"India\"\n\"2466\",\"Arrowhead Pharmaceuticals\",\"ARWR\",\"4164941056\",\"39.39\",\"United States\"\n\"2467\",\"Royal Boskalis Westminster\",\"BOKA.AS\",\"4161287079\",\"32.18\",\"Netherlands\"\n\"2468\",\"National Instruments\",\"NATI\",\"4159527424\",\"31.71\",\"United States\"\n\"2469\",\"South Jersey Industries\",\"SJI\",\"4153269504\",\"33.93\",\"United States\"\n\"2470\",\"Viper Energy Partners\",\"VNOM\",\"4150819328\",\"24.76\",\"United States\"\n\"2471\",\"MSC Industrial Direct\",\"MSM\",\"4147339264\",\"74.08\",\"United States\"\n\"2472\",\"Parkland Corp\",\"PKI.TO\",\"4141618864\",\"26.26\",\"Canada\"\n\"2473\",\"Schneider\",\"SNDR\",\"4131348736\",\"23.22\",\"United States\"\n\"2474\",\"Balchem\",\"BCPC\",\"4130978304\",\"128.62\",\"United States\"\n\"2475\",\"Indofood\",\"INDF.JK\",\"4130933203\",\"0.47\",\"Indonesia\"\n\"2476\",\"A1 Telekom Austria\",\"TA1.F\",\"4128085333\",\"6.06\",\"Austria\"\n\"2477\",\"Empresas CMPC\",\"CMPC.SN\",\"4127796363\",\"1.65\",\"Chile\"\n\"2478\",\"Banco de Crédito e Inversiones\",\"BCI.SN\",\"4123182445\",\"26.45\",\"Chile\"\n\"2479\",\"Fomento de Construcciones y Contratas\",\"FCC.MC\",\"4120598910\",\"9.5\",\"Spain\"\n\"2480\",\"China Lesso Group\",\"2128.HK\",\"4118242743\",\"1.33\",\"China\"\n\"2481\",\"AllianceBernstein\",\"AB\",\"4115712512\",\"41.32\",\"United States\"\n\"2482\",\"Altair Engineering\",\"ALTR\",\"4109740032\",\"51.52\",\"United States\"\n\"2483\",\"Grupo Aval\",\"AVAL\",\"4107608320\",\"3.46\",\"Colombia\"\n\"2484\",\"Nippon Shinyaku\",\"4516.T\",\"4107071377\",\"60.98\",\"Japan\"\n\"2485\",\"51job\",\"JOBS\",\"4106925568\",\"60.9\",\"China\"\n\"2486\",\"Univar Solutions\",\"UNVR\",\"4103876096\",\"24.25\",\"United States\"\n\"2487\",\"NCR Corporation\",\"NCR\",\"4101414912\",\"30.03\",\"United States\"\n\"2488\",\"MGIC Investment\",\"MTG\",\"4099117056\",\"13.24\",\"United States\"\n\"2489\",\"Hera Group\",\"HER.MI\",\"4090951819\",\"2.8\",\"Italy\"\n\"2490\",\"LG Display\",\"LPL\",\"4089831168\",\"5.72\",\"South Korea\"\n\"2491\",\"Madras Rubber Factory\",\"MRF.NS\",\"4089468748\",\"964.24\",\"India\"\n\"2492\",\"K+S\",\"SDF.F\",\"4086068127\",\"21.3\",\"Germany\"\n\"2493\",\"PNM Resources\",\"PNM\",\"4085312000\",\"47.6\",\"United States\"\n\"2494\",\"Commercial Metals Company\",\"CMC\",\"4084611072\",\"33.9\",\"United States\"\n\"2495\",\"COSMOS Pharmaceutical\",\"3349.T\",\"4084353713\",\"103.14\",\"Japan\"\n\"2496\",\"Petronet LNG\",\"PETRONET.NS\",\"4082607943\",\"2.72\",\"India\"\n\"2497\",\"Evoqua Water Technologies\",\"AQUA\",\"4082385664\",\"33.66\",\"United States\"\n\"2498\",\"Stericycle\",\"SRCL\",\"4080423680\",\"44.31\",\"United States\"\n\"2499\",\"ManpowerGroup\",\"MAN\",\"4079446528\",\"77.35\",\"United States\"\n\"2500\",\"Gruma (Maseca)\",\"GRUMAB.MX\",\"4078801838\",\"10.96\",\"Mexico\"\n\"2501\",\"Tecan\",\"TECN.SW\",\"4076772886\",\"320.39\",\"Switzerland\"\n\"2502\",\"EVN Group\",\"EVN.F\",\"4074292642\",\"21.77\",\"Austria\"\n\"2503\",\"Atotech\",\"ATC\",\"4071093248\",\"20.91\",\"United Kingdom\"\n\"2504\",\"The Ensign Group\",\"ENSG\",\"4070354944\",\"73.37\",\"United States\"\n\"2505\",\"Capital Power\",\"CPX.TO\",\"4065553079\",\"34.95\",\"Canada\"\n\"2506\",\"Tokyo Century\",\"8439.T\",\"4061264250\",\"33.23\",\"Japan\"\n\"2507\",\"First International Bank of Israel\",\"FIBI.TA\",\"4060711361\",\"40.47\",\"Israel\"\n\"2508\",\"SPS Commerce\",\"SPSC\",\"4058893824\",\"112.45\",\"United States\"\n\"2509\",\"Teradata\",\"TDC\",\"4055554560\",\"38.74\",\"United States\"\n\"2510\",\"Seven Group Holdings\r\n (SGH)\",\"SVW.AX\",\"4055287468\",\"11.03\",\"Australia\"\n\"2511\",\"Amkor Technology\",\"AMKR\",\"4053540352\",\"16.56\",\"United States\"\n\"2512\",\"Petco\",\"WOOF\",\"4052948480\",\"15.27\",\"United States\"\n\"2513\",\"Pirelli\",\"PIRC.MI\",\"4049271055\",\"4.05\",\"Italy\"\n\"2514\",\"Gudang Garam\",\"GGG.F\",\"4043900589\",\"1.88\",\"Indonesia\"\n\"2515\",\"Strabag\",\"XD4.F\",\"4041790295\",\"38.11\",\"Austria\"\n\"2516\",\"Virtu Financial\",\"VIRT\",\"4038326973\",\"22.17\",\"United States\"\n\"2517\",\"Dairy Farm\",\"D01.SI\",\"4032774400\",\"2.98\",\"Hong Kong\"\n\"2518\",\"Braze\",\"BRZE\",\"4029495552\",\"42.86\",\"United States\"\n\"2519\",\"Toyo Suisan\",\"2875.T\",\"4022112094\",\"39.38\",\"Japan\"\n\"2520\",\"Clicks Group\",\"CLS.JO\",\"4019518055\",\"16.48\",\"South Africa\"\n\"2521\",\"iRhythm\",\"IRTC\",\"4018995968\",\"134.91\",\"United States\"\n\"2522\",\"ChargePoint\",\"CHPT\",\"4018284032\",\"11.93\",\"United States\"\n\"2523\",\"Alight\",\"ALIT\",\"4016128768\",\"7.21\",\"United States\"\n\"2524\",\"Pershing Square Tontine\",\"PSTH\",\"4016000000\",\"20.08\",\"United States\"\n\"2525\",\"Cirrus Logic\",\"CRUS\",\"4012207360\",\"71.79\",\"United States\"\n\"2526\",\"Cerevel Therapeutics\",\"CERE\",\"4009734400\",\"27.04\",\"United States\"\n\"2527\",\"Signify\",\"LIGHT.AS\",\"4004091495\",\"32.28\",\"Netherlands\"\n\"2528\",\"Aalberts\",\"AALB.AS\",\"4003483222\",\"36.06\",\"Netherlands\"\n\"2529\",\"YETI Holdings\",\"YETI\",\"4002581504\",\"46.46\",\"United States\"\n\"2530\",\"EnLink Midstream\",\"ENLC\",\"4001947904\",\"8.29\",\"United States\"\n\"2531\",\"Andritz\",\"AZ2.F\",\"3993560358\",\"40.26\",\"Austria\"\n\"2532\",\"Civitas Resources\",\"CIVI\",\"3991620352\",\"46.98\",\"United States\"\n\"2533\",\"Tempur Sealy\",\"TPX\",\"3988359680\",\"22.72\",\"United States\"\n\"2534\",\"QuantumScape\",\"QS\",\"3985920768\",\"9.26\",\"United States\"\n\"2535\",\"Voltas\",\"VOLTAS.NS\",\"3982080893\",\"12.03\",\"India\"\n\"2536\",\"Chiba Bank\",\"CHBAY\",\"3975372800\",\"26.32\",\"Japan\"\n\"2537\",\"Stevanato\",\"STVN\",\"3973147136\",\"15.01\",\"Italy\"\n\"2538\",\"Physicians Realty Trust\",\"DOC\",\"3972064768\",\"16.75\",\"United States\"\n\"2539\",\"Frasers Group\",\"FRAS.L\",\"3968091593\",\"825.52\",\"United Kingdom\"\n\"2540\",\"Timken Company\",\"TKR\",\"3966728192\",\"53.51\",\"United States\"\n\"2541\",\"Sweco\",\"SWEC-A.ST\",\"3966032351\",\"11.22\",\"Sweden\"\n\"2542\",\"Pegasystems\",\"PEGA\",\"3965757440\",\"48.47\",\"United States\"\n\"2543\",\"ATCO\",\"ACO-X.TO\",\"3957520820\",\"34.49\",\"Canada\"\n\"2544\",\"Altice USA\",\"ATUS\",\"3955498496\",\"8.7\",\"United States\"\n\"2545\",\"Turkish Airlines\",\"THYAO.IS\",\"3946141313\",\"2.86\",\"Turkey\"\n\"2546\",\"Aurobindo Pharma\",\"AUROPHARMA.NS\",\"3944556861\",\"6.73\",\"India\"\n\"2547\",\"Honeywell Automation India\",\"HONAUT.NS\",\"3944322356\",\"446.11\",\"India\"\n\"2548\",\"Denali Therapeutics\",\"DNLI\",\"3944172032\",\"32.08\",\"United States\"\n\"2549\",\"Insperity\",\"NSP\",\"3940360960\",\"102.86\",\"United States\"\n\"2550\",\"Huhtamäki\",\"HUH1V.HE\",\"3933232909\",\"37.69\",\"Finland\"\n\"2551\",\"Wiwynn\",\"6669.TW\",\"3925587678\",\"22.45\",\"Taiwan\"\n\"2552\",\"Colas\",\"RE.PA\",\"3922291708\",\"120.16\",\"France\"\n\"2553\",\"Amedisys\",\"AMED\",\"3919647744\",\"120.34\",\"United States\"\n\"2554\",\"ManTech\",\"MANT\",\"3917487616\",\"95.66\",\"United States\"\n\"2555\",\"Pan American Silver\",\"PAAS\",\"3916502784\",\"18.38\",\"Canada\"\n\"2556\",\"Whitecap Resources\",\"WCP.TO\",\"3913817128\",\"6.32\",\"Canada\"\n\"2557\",\"Vir Biotechnology\",\"VIR\",\"3911710720\",\"29.55\",\"United States\"\n\"2558\",\"Janus Henderson\",\"JHG\",\"3908463104\",\"23.41\",\"United Kingdom\"\n\"2559\",\"Aspen Pharmacare\",\"APN.JO\",\"3906501970\",\"8.58\",\"South Africa\"\n\"2560\",\"Enviva\",\"EVA\",\"3905662464\",\"58.68\",\"United States\"\n\"2561\",\"Carvana\",\"CVNA\",\"3904536064\",\"21.99\",\"United States\"\n\"2562\",\"ICU Medical\",\"ICUI\",\"3899827200\",\"163.2\",\"United States\"\n\"2563\",\"Healthcare Realty\",\"HR\",\"3891700224\",\"25.67\",\"United States\"\n\"2564\",\"Shin Kong Financial Holding\",\"2888.TW\",\"3887175238\",\"0.27\",\"Taiwan\"\n\"2565\",\"Box\",\"BOX\",\"3886657536\",\"26.98\",\"United States\"\n\"2566\",\"Maximus\",\"MMS\",\"3876990208\",\"63.13\",\"United States\"\n\"2567\",\"DoubleVerify\",\"DV\",\"3869298944\",\"23.67\",\"United States\"\n\"2568\",\"Granite Real Estate\",\"GRP-UN\",\"3868498176\",\"58.73\",\"Canada\"\n\"2569\",\"F.N.B. Corporation\",\"FNB\",\"3867927552\",\"11.01\",\"United States\"\n\"2570\",\"Kite Realty\",\"KRG\",\"3863954176\",\"17.44\",\"United States\"\n\"2571\",\"Gujarat Gas\",\"GUJGASLTD.NS\",\"3863686983\",\"5.61\",\"India\"\n\"2572\",\"Bank Mega\",\"MEGA.JK\",\"3862705153\",\"0.33\",\"Indonesia\"\n\"2573\",\"Hancock Whitney\",\"HWC\",\"3862421760\",\"44.72\",\"United States\"\n\"2574\",\"Callaway Golf\",\"ELY\",\"3861993216\",\"20.91\",\"United States\"\n\"2575\",\"Beacon Roofing Supply\",\"BECN\",\"3859143680\",\"55.82\",\"United States\"\n\"2576\",\"Bakkafrost\",\"6BF.F\",\"3858872181\",\"65.31\",\"Denmark\"\n\"2577\",\"Ibiden\",\"4062.T\",\"3852820069\",\"27.6\",\"Japan\"\n\"2578\",\"Perfect World Entertainment\",\"002624.SZ\",\"3851379351\",\"1.99\",\"China\"\n\"2579\",\"CG Power and Industrial Solutions\",\"CGPOWER.NS\",\"3849966609\",\"2.52\",\"India\"\n\"2580\",\"DigitalOcean\",\"DOCN\",\"3845596672\",\"37.67\",\"United States\"\n\"2581\",\"Hiscox\",\"HSX.L\",\"3842003171\",\"1090.47\",\"Bermuda\"\n\"2582\",\"AGL Energy\",\"AGL.AX\",\"3838511729\",\"5.67\",\"Australia\"\n\"2583\",\"Allegro MicroSystems\",\"ALGM\",\"3837048576\",\"20.11\",\"United States\"\n\"2584\",\"MEG Energy\",\"MEG.TO\",\"3836267183\",\"12.08\",\"Canada\"\n\"2585\",\"Oberoi Realty\",\"OBEROIRLTY.NS\",\"3830241435\",\"10.53\",\"India\"\n\"2586\",\"Cytokinetics\",\"CYTK\",\"3827796736\",\"44.69\",\"United States\"\n\"2587\",\"Phillips-Van Heusen\",\"PVH\",\"3827462144\",\"57.16\",\"United States\"\n\"2588\",\"Kerry Properties\",\"0683.HK\",\"3824470728\",\"2.63\",\"Hong Kong\"\n\"2589\",\"Electrolux\",\"ELUX-A.ST\",\"3824452799\",\"16.1\",\"Sweden\"\n\"2590\",\"ALTEN\",\"ATE.PA\",\"3821309040\",\"112.52\",\"France\"\n\"2591\",\"Casella Waste Systems\",\"CWST\",\"3811452416\",\"73.81\",\"United States\"\n\"2592\",\"Cummins India\",\"CUMMINSIND.NS\",\"3811377621\",\"13.75\",\"India\"\n\"2593\",\"Direct Line Group\",\"DLG.L\",\"3809730599\",\"289.2\",\"United Kingdom\"\n\"2594\",\"Assaí Atacadista\",\"ASAI\",\"3807229696\",\"14.13\",\"Brazil\"\n\"2595\",\"Sarana Menara Nusantara\",\"TOWR.JK\",\"3805121291\",\"0.08\",\"Indonesia\"\n\"2596\",\"Şişecam\",\"SISE.IS\",\"3805016721\",\"1.24\",\"Turkey\"\n\"2597\",\"National Mineral Development Corporation\",\"NMDC.NS\",\"3803880481\",\"1.3\",\"India\"\n\"2598\",\"Atkore\",\"ATKR\",\"3797498880\",\"88.08\",\"United States\"\n\"2599\",\"Karuna Therapeutics\",\"KRTX\",\"3797194752\",\"127.07\",\"United States\"\n\"2600\",\"Bank of East Asia\",\"0023.HK\",\"3794895921\",\"1.41\",\"Hong Kong\"\n\"2601\",\"IMI plc\",\"IMI.L\",\"3789921630\",\"1437.08\",\"United Kingdom\"\n\"2602\",\"Clearwater Analytics\",\"CWAN\",\"3789408768\",\"13\",\"United States\"\n\"2603\",\"Boston Beer Company\",\"SAM\",\"3785559808\",\"308.18\",\"United States\"\n\"2604\",\"Crescent Point Energy\",\"CPG\",\"3784611840\",\"6.56\",\"Canada\"\n\"2605\",\"Core &amp; Main\",\"CNM\",\"3783575808\",\"22.53\",\"United States\"\n\"2606\",\"Atlantica\",\"AY\",\"3783423232\",\"33.16\",\"United Kingdom\"\n\"2607\",\"Under Armour\",\"UA\",\"3782439936\",\"7.7\",\"United States\"\n\"2608\",\"Hanesbrands\",\"HBI\",\"3780731904\",\"10.84\",\"United States\"\n\"2609\",\"Global-e\",\"GLBE\",\"3780315136\",\"24.16\",\"Israel\"\n\"2610\",\"Minda Industries\",\"MINDAIND.NS\",\"3780032311\",\"6.61\",\"India\"\n\"2611\",\"İsdemir\",\"ISDMR.IS\",\"3776370725\",\"1.3\",\"Turkey\"\n\"2612\",\"NWS holdings\",\"0659.HK\",\"3771749944\",\"0.96\",\"Hong Kong\"\n\"2613\",\"Kumho Petrochemical\",\"011780.KS\",\"3764896417\",\"93.3\",\"South Korea\"\n\"2614\",\"Inari Medical\",\"NARI\",\"3755965696\",\"70.7\",\"United States\"\n\"2615\",\"Livent\",\"LTHM\",\"3755182592\",\"20.95\",\"United States\"\n\"2616\",\"Kohl's\",\"KSS\",\"3754915072\",\"29.23\",\"United States\"\n\"2617\",\"TFS Financial\",\"TFSL\",\"3754255872\",\"13.37\",\"United States\"\n\"2618\",\"Duolingo\",\"DUOL\",\"3749694464\",\"95.75\",\"United States\"\n\"2619\",\"SD BioSensor\",\"137310.KS\",\"3743614082\",\"37.01\",\"South Korea\"\n\"2620\",\"SM Energy\",\"SM\",\"3742443264\",\"30.71\",\"United States\"\n\"2621\",\"Fluidra\",\"FDR.MC\",\"3741211801\",\"19.62\",\"Spain\"\n\"2622\",\"Kojamo\",\"KOJAMO.HE\",\"3740087666\",\"15.13\",\"Finland\"\n\"2623\",\"Ziff Davis\",\"ZD\",\"3737598208\",\"79.03\",\"United States\"\n\"2624\",\"Independent Bank\",\"INDB\",\"3727818752\",\"79.69\",\"United States\"\n\"2625\",\"Turning Point\",\"TPTX\",\"3727662336\",\"75.03\",\"United States\"\n\"2626\",\"Air Lease Corporation\",\"AL\",\"3727045888\",\"33.62\",\"United States\"\n\"2627\",\"Schibsted\",\"SCHA.OL\",\"3726624623\",\"16.63\",\"Norway\"\n\"2628\",\"WNS\",\"WNS\",\"3721873920\",\"76.19\",\"India\"\n\"2629\",\"Fox Factory Holding\",\"FOXF\",\"3721730304\",\"88.3\",\"United States\"\n\"2630\",\"Cabot Corporation\",\"CBT\",\"3720109312\",\"65.92\",\"United States\"\n\"2631\",\"White Mountains Insurance Group\",\"WTM\",\"3718806016\",\"1247.21\",\"Bermuda\"\n\"2632\",\"Flowserve\",\"FLS\",\"3715543808\",\"28.44\",\"United States\"\n\"2633\",\"Sembcorp\",\"U96.SI\",\"3708684510\",\"2.08\",\"Singapore\"\n\"2634\",\"Bharat Forge\",\"BHARATFORG.NS\",\"3707354845\",\"7.96\",\"India\"\n\"2635\",\"Nikon\",\"NINOY\",\"3706847232\",\"10.16\",\"Japan\"\n\"2636\",\"Umpqua Holdings\",\"UMPQ\",\"3706060544\",\"17.08\",\"United States\"\n\"2637\",\"Spire Energy\",\"SR\",\"3705092352\",\"71.09\",\"United States\"\n\"2638\",\"Acom\",\"8572.T\",\"3704166510\",\"2.36\",\"Japan\"\n\"2639\",\"Tate &amp; Lyle\",\"TATE.L\",\"3703471840\",\"921.2\",\"United Kingdom\"\n\"2640\",\"Société Foncière Lyonnaise\",\"FLY.PA\",\"3702600463\",\"86.48\",\"France\"\n\"2641\",\"Ryder\",\"R\",\"3701785600\",\"72.39\",\"United States\"\n\"2642\",\"Freshworks\",\"FRSH\",\"3694223104\",\"13\",\"United States\"\n\"2643\",\"Steel Authority of India\",\"SAIL.NS\",\"3693724729\",\"0.89\",\"India\"\n\"2644\",\"Powszechny Zakład Ubezpieczeń\",\"7PZ.F\",\"3689805611\",\"6.34\",\"Poland\"\n\"2645\",\"Marel\",\"MAREL.AS\",\"3687180227\",\"4.88\",\"Iceland\"\n\"2646\",\"Asbury Automotive Group\",\"ABG\",\"3682758912\",\"166.41\",\"United States\"\n\"2647\",\"Kangwon Land\",\"035250.KS\",\"3682301872\",\"18.16\",\"South Korea\"\n\"2648\",\"Dillard's\",\"DDS\",\"3682171136\",\"210.13\",\"United States\"\n\"2649\",\"Mercury Systems\",\"MRCY\",\"3681280512\",\"63.83\",\"United States\"\n\"2650\",\"HUGO BOSS\",\"BOSS.DE\",\"3680864016\",\"53.33\",\"Germany\"\n\"2651\",\"Evercore\",\"EVR\",\"3676891904\",\"90.58\",\"United States\"\n\"2652\",\"Armstrong World Industries\",\"AWI\",\"3673461504\",\"78.23\",\"United States\"\n\"2653\",\"MSG Sports\",\"MSGS\",\"3666907904\",\"151.36\",\"United States\"\n\"2654\",\"Wix.com\",\"WIX\",\"3664402688\",\"63.77\",\"Israel\"\n\"2655\",\"Galapagos NV\",\"GLPG\",\"3661974784\",\"55.38\",\"Belgium\"\n\"2656\",\"Power Finance Corp\",\"PFC.NS\",\"3657553735\",\"1.39\",\"India\"\n\"2657\",\"Bangkok Expressway and Metro (BEM)\",\"BEM.BK\",\"3653565899\",\"0.24\",\"Thailand\"\n\"2658\",\"Banco Sabadell\",\"BDSB.F\",\"3652274132\",\"0.65\",\"Spain\"\n\"2659\",\"Hochtief\",\"HOT.F\",\"3652210550\",\"48.42\",\"Germany\"\n\"2660\",\"Sime Darby\",\"SIME.KL\",\"3647383203\",\"0.54\",\"Malaysia\"\n\"2661\",\"BE Semiconductor\",\"BESI.AS\",\"3640932907\",\"45.56\",\"Netherlands\"\n\"2662\",\"Hamilton Lane\",\"HLNE\",\"3640107776\",\"68.37\",\"United States\"\n\"2663\",\"Allison Transmission\",\"ALSN\",\"3639922432\",\"37.5\",\"United States\"\n\"2664\",\"SPX FLOW\",\"FLOW\",\"3637604864\",\"86.49\",\"United States\"\n\"2665\",\"Tandem Diabetes Care\",\"TNDM\",\"3636919040\",\"56.86\",\"United States\"\n\"2666\",\"EPR Properties\",\"EPR\",\"3636775168\",\"48.51\",\"United States\"\n\"2667\",\"International Game Technology\",\"IGT\",\"3635061248\",\"17.92\",\"United Kingdom\"\n\"2668\",\"New Relic\",\"NEWR\",\"3631518976\",\"53.98\",\"United States\"\n\"2669\",\"STAAR Surgical\",\"STAA\",\"3626965248\",\"75.86\",\"United States\"\n\"2670\",\"Coromandel\",\"COROMANDEL.NS\",\"3626529066\",\"12.35\",\"India\"\n\"2671\",\"Max Financial Services\",\"MFSL.NS\",\"3626377812\",\"10.5\",\"India\"\n\"2672\",\"Cleanaway Waste Management\",\"CWY.AX\",\"3625187048\",\"1.73\",\"Australia\"\n\"2673\",\"ChampionX\",\"CHX\",\"3623588864\",\"17.82\",\"United States\"\n\"2674\",\"Natera\",\"NTRA\",\"3623324928\",\"37.62\",\"United States\"\n\"2675\",\"New Oriental\",\"EDU\",\"3622182144\",\"21.35\",\"China\"\n\"2676\",\"Fannie Mae\",\"FNMAL\",\"3621263872\",\"4.84\",\"United States\"\n\"2677\",\"Lupin Limited\",\"LUPIN.NS\",\"3621179558\",\"7.97\",\"India\"\n\"2678\",\"Zai Lab\",\"ZLAB\",\"3621153536\",\"36.99\",\"China\"\n\"2679\",\"Bendigo and Adelaide Bank\",\"BEN.AX\",\"3617144152\",\"6.39\",\"Australia\"\n\"2680\",\"Quiñenco\",\"QUINENCO.SN\",\"3616653914\",\"2.18\",\"Chile\"\n\"2681\",\"Simply Good Foods\",\"SMPL\",\"3613356032\",\"36\",\"United States\"\n\"2682\",\"Highwoods Properties\",\"HIW\",\"3611959296\",\"33.55\",\"United States\"\n\"2683\",\"IG Group\",\"IGG.L\",\"3611454980\",\"836.81\",\"United Kingdom\"\n\"2684\",\"Zurn Water Solutions\",\"ZWS\",\"3611376640\",\"28.67\",\"United States\"\n\"2685\",\"Charter Hall Group\",\"CHC.AX\",\"3609907345\",\"7.63\",\"Australia\"\n\"2686\",\"Broadstone Net Lease\",\"BNL\",\"3609817088\",\"21.32\",\"United States\"\n\"2687\",\"Avient\",\"AVNT\",\"3609498368\",\"39.48\",\"United States\"\n\"2688\",\"Fuchs Petrolub\",\"FPE.F\",\"3607560752\",\"23.73\",\"Germany\"\n\"2689\",\"Workiva\",\"WK\",\"3606860032\",\"69.26\",\"United States\"\n\"2690\",\"Derwent London\",\"DLN.L\",\"3606140170\",\"3171.32\",\"United Kingdom\"\n\"2691\",\"Nisshin Seifun Group\",\"2002.T\",\"3605167601\",\"12.12\",\"Japan\"\n\"2692\",\"Enact Holdings\",\"ACT\",\"3603693312\",\"22.13\",\"United States\"\n\"2693\",\"Frasers Logistics &amp; Industrial Trust\",\"BUOU.SI\",\"3601173614\",\"0.97\",\"Singapore\"\n\"2694\",\"Signify Health\",\"SGFY\",\"3599814656\",\"15.46\",\"United States\"\n\"2695\",\"Beazley\",\"BEZ.L\",\"3591913790\",\"588.86\",\"United Kingdom\"\n\"2696\",\"APi Group\",\"APG\",\"3591110400\",\"15.4\",\"United States\"\n\"2697\",\"Tikehau Capital\",\"TKO.PA\",\"3590217621\",\"20.31\",\"France\"\n\"2698\",\"Voestalpine\",\"VAS.F\",\"3590165623\",\"20.11\",\"Austria\"\n\"2699\",\"CSN Mineração\",\"CMIN3.SA\",\"3585781100\",\"0.65\",\"Brazil\"\n\"2700\",\"Fraport\",\"FRA.DE\",\"3584169380\",\"38.79\",\"Germany\"\n\"2701\",\"Applied Industrial Technologies\",\"AIT\",\"3581836800\",\"93.17\",\"United States\"\n\"2702\",\"Enstar Group\",\"ESGR\",\"3576221696\",\"198.2\",\"Bermuda\"\n\"2703\",\"Radian Group\",\"RDN\",\"3572681216\",\"20.68\",\"United States\"\n\"2704\",\"Sega Sammy Holdings\",\"6460.T\",\"3571731320\",\"16.19\",\"Japan\"\n\"2705\",\"Natura&Co\",\"NTCO\",\"3564605184\",\"5.16\",\"Brazil\"\n\"2706\",\"Privia Health Group\",\"PRVA\",\"3562637568\",\"32.8\",\"United States\"\n\"2707\",\"Korea Aerospace Industries\",\"047810.KS\",\"3559471764\",\"36.52\",\"South Korea\"\n\"2708\",\"John Bean Technologies\",\"JBT\",\"3557298688\",\"111.92\",\"United States\"\n\"2709\",\"Vontier\",\"VNT\",\"3550204416\",\"22.05\",\"United States\"\n\"2710\",\"Infratil\",\"IFT.NZ\",\"3549724968\",\"4.9\",\"New Zealand\"\n\"2711\",\"Assured Guaranty\",\"AGO\",\"3549628672\",\"55.35\",\"Bermuda\"\n\"2712\",\"Asana\",\"ASAN\",\"3549243904\",\"18.65\",\"United States\"\n\"2713\",\"Oberbank\",\"OBS.VI\",\"3548275580\",\"100.55\",\"Austria\"\n\"2714\",\"Contact Energy\",\"CEN.NZ\",\"3547557703\",\"4.55\",\"New Zealand\"\n\"2715\",\"Schaeffler\",\"SHA.F\",\"3541600531\",\"5.28\",\"Germany\"\n\"2716\",\"Spectris\",\"SXS.L\",\"3540504435\",\"3344.86\",\"United Kingdom\"\n\"2717\",\"Ardagh Metal Packaging\",\"AMBP\",\"3535385088\",\"5.86\",\"Luxembourg\"\n\"2718\",\"Grupo Catalana Occidente\",\"GCO.MC\",\"3535277627\",\"29.96\",\"Spain\"\n\"2719\",\"Coway\",\"021240.KS\",\"3534901252\",\"48.71\",\"South Korea\"\n\"2720\",\"Samsung Heavy Industries\",\"010145.KS\",\"3534476424\",\"173.98\",\"South Korea\"\n\"2721\",\"SPIE\",\"SPIE.PA\",\"3532778634\",\"21.72\",\"France\"\n\"2722\",\"Workman\",\"7564.T\",\"3530693781\",\"43.26\",\"Japan\"\n\"2723\",\"Vodafone Idea\",\"IDEA.NS\",\"3527095408\",\"0.11\",\"India\"\n\"2724\",\"nCino\",\"NCNO\",\"3519756032\",\"31.94\",\"United States\"\n\"2725\",\"O2 Czech Republic\",\"TEE.F\",\"3517120270\",\"11.39\",\"Czech Republic\"\n\"2726\",\"Venture Corporation\",\"V03.SI\",\"3516829635\",\"12.08\",\"Singapore\"\n\"2727\",\"Lawson\",\"2651.T\",\"3512596504\",\"35.1\",\"Japan\"\n\"2728\",\"Howard Hughes Corporation\",\"HHC\",\"3511976960\",\"68.39\",\"United States\"\n\"2729\",\"Certara\",\"CERT\",\"3511728640\",\"21.97\",\"United States\"\n\"2730\",\"Lancaster Colony Corporation\",\"LANC\",\"3510981632\",\"127.57\",\"United States\"\n\"2731\",\"Wendel\",\"MF.PA\",\"3510588621\",\"80.89\",\"France\"\n\"2732\",\"Eastern Bankshares\",\"EBC\",\"3509186816\",\"19.21\",\"United States\"\n\"2733\",\"Dorman Products\",\"DORM\",\"3507732224\",\"111.54\",\"United States\"\n\"2734\",\"Indosat\",\"ISAT.JK\",\"3497325434\",\"0.43\",\"Indonesia\"\n\"2735\",\"Companhia Siderúrgica Nacional\",\"SID\",\"3495627264\",\"2.59\",\"Brazil\"\n\"2736\",\"Apple Hospitality REIT\",\"APLE\",\"3495134976\",\"15.27\",\"United States\"\n\"2737\",\"B2Gold\",\"BTG\",\"3491355392\",\"3.25\",\"Canada\"\n\"2738\",\"Choice Properties REIT\",\"CHP-UN.TO\",\"3489197769\",\"10.65\",\"Canada\"\n\"2739\",\"Curaleaf\",\"CURLF\",\"3487246336\",\"4.99\",\"United States\"\n\"2740\",\"Franklin Electric\",\"FELE\",\"3485539072\",\"75.26\",\"United States\"\n\"2741\",\"Travel + Leisure\",\"TNL\",\"3481129216\",\"40.76\",\"United States\"\n\"2742\",\"Cushman &amp; Wakefield\",\"CWK\",\"3479943424\",\"15.43\",\"United States\"\n\"2743\",\"BAWAG Group\",\"0B2.F\",\"3473788203\",\"39.1\",\"Austria\"\n\"2744\",\"Magazine Luíza\",\"MGLU3.SA\",\"3470758737\",\"0.52\",\"Brazil\"\n\"2745\",\"Diploma plc\",\"DPLM.L\",\"3469085276\",\"2783.82\",\"United Kingdom\"\n\"2746\",\"Triton International\",\"TRTN\",\"3463660032\",\"53.94\",\"Bermuda\"\n\"2747\",\"Uniper\",\"UN01.DE\",\"3463058083\",\"9.33\",\"Germany\"\n\"2748\",\"Cencosud\",\"CENCOSUD.SN\",\"3462934283\",\"1.22\",\"Chile\"\n\"2749\",\"CVB Financial\",\"CVBF\",\"3460128000\",\"24.53\",\"United States\"\n\"2750\",\"Kirby Corporation\",\"KEX\",\"3458808064\",\"57.36\",\"United States\"\n\"2751\",\"Investors Bancorp\",\"ISBC\",\"3455835392\",\"13.87\",\"United States\"\n\"2752\",\"SSR Mining\",\"SSRM\",\"3455367424\",\"16.25\",\"Canada\"\n\"2753\",\"Raiffeisen Bank International\",\"RAW.F\",\"3451217215\",\"10.39\",\"Austria\"\n\"2754\",\"Community Bank System\",\"CBU\",\"3450233600\",\"64\",\"United States\"\n\"2755\",\"Japan Airport Terminal\",\"9706.T\",\"3449836045\",\"37.04\",\"Japan\"\n\"2756\",\"Petro Rio\",\"PRIO3.SA\",\"3449715667\",\"4.09\",\"Brazil\"\n\"2757\",\"PagSeguro\",\"PAGS\",\"3446439168\",\"10.51\",\"Brazil\"\n\"2758\",\"Melisron\",\"MLSR.TA\",\"3443509163\",\"71.21\",\"Israel\"\n\"2759\",\"NEXTDC\",\"NXT.AX\",\"3436086235\",\"7.51\",\"Australia\"\n\"2760\",\"Appian\",\"APPN\",\"3432503808\",\"49.73\",\"United States\"\n\"2761\",\"Kansai Paint\",\"4613.T\",\"3430079344\",\"13.35\",\"Japan\"\n\"2762\",\"Welbilt\",\"WBT\",\"3425581312\",\"23.93\",\"United States\"\n\"2763\",\"Vale Indonesia\",\"INCO.JK\",\"3414891476\",\"0.34\",\"Indonesia\"\n\"2764\",\"GarantiBank\",\"GARAN.IS\",\"3413418053\",\"0.81\",\"Turkey\"\n\"2765\",\"Romgaz\",\"RZ8G.F\",\"3410471385\",\"8.85\",\"Romania\"\n\"2766\",\"Scor\",\"SCR.PA\",\"3409496808\",\"19.81\",\"France\"\n\"2767\",\"American Equity Investment Life Holding\",\"AEL\",\"3403313920\",\"36.57\",\"United States\"\n\"2768\",\"Beam Therapeutics\",\"BEAM\",\"3403021056\",\"48.43\",\"United States\"\n\"2769\",\"Alteryx\",\"AYX\",\"3402592256\",\"51.69\",\"United States\"\n\"2770\",\"Fielmann\",\"FIE.F\",\"3400504760\",\"40.46\",\"Germany\"\n\"2771\",\"Storebrand\",\"STB.OL\",\"3396096541\",\"7.2\",\"Norway\"\n\"2772\",\"Fluor Corporation\",\"FLR\",\"3394725120\",\"23.91\",\"United States\"\n\"2773\",\"AppFolio\",\"APPF\",\"3394005504\",\"97.25\",\"United States\"\n\"2774\",\"Icade\",\"ICAD.PA\",\"3393922381\",\"43.78\",\"France\"\n\"2775\",\"Mister Car Wash\",\"MCW\",\"3391491840\",\"11.22\",\"United States\"\n\"2776\",\"Just Eat Takeaway\",\"TKWY.AS\",\"3390606351\",\"15.34\",\"Netherlands\"\n\"2777\",\"Computacenter\",\"CCC.L\",\"3389131263\",\"2969.25\",\"United Kingdom\"\n\"2778\",\"Crocs\",\"CROX\",\"3387251712\",\"55.01\",\"United States\"\n\"2779\",\"Nutanix\",\"NTNX\",\"3384596480\",\"15.09\",\"United States\"\n\"2780\",\"Haemonetics\",\"HAE\",\"3384221440\",\"65.97\",\"United States\"\n\"2781\",\"Semtech\",\"SMTC\",\"3382097152\",\"53.28\",\"United States\"\n\"2782\",\"Helen of Troy\",\"HELE\",\"3378120448\",\"140.94\",\"United States\"\n\"2783\",\"Sensient Technologies\",\"SXT\",\"3375443968\",\"80.31\",\"United States\"\n\"2784\",\"Renishaw\",\"RSW.L\",\"3372550555\",\"4628.61\",\"United Kingdom\"\n\"2785\",\"Easterly Government Properties\",\"DEA\",\"3372057088\",\"19.06\",\"United States\"\n\"2786\",\"Encavis\",\"ECV.F\",\"3367947584\",\"20.92\",\"Germany\"\n\"2787\",\"BlackBerry\",\"BB\",\"3359356928\",\"5.61\",\"Canada\"\n\"2788\",\"Nomad Foods\",\"NOMD\",\"3353673728\",\"19.27\",\"United Kingdom\"\n\"2789\",\"Nexans\",\"NEX.PA\",\"3351154550\",\"77.28\",\"France\"\n\"2790\",\"Allete\",\"ALE\",\"3349231872\",\"58.77\",\"United States\"\n\"2791\",\"Mainova\",\"MNV6.F\",\"3345475186\",\"542.99\",\"Germany\"\n\"2792\",\"UniFirst\",\"UNF\",\"3339861760\",\"178.42\",\"United States\"\n\"2793\",\"CJ Group\",\"001040.KS\",\"3338409927\",\"58.12\",\"South Korea\"\n\"2794\",\"Laurus Labs\",\"LAURUSLABS.NS\",\"3331663236\",\"6.19\",\"India\"\n\"2795\",\"DigitalBridge Group\",\"DBRG\",\"3329812992\",\"5.08\",\"United States\"\n\"2796\",\"BB Biotech\",\"BION.SW\",\"3329265765\",\"60.39\",\"Switzerland\"\n\"2797\",\"Mirati Therapeutics\",\"MRTX\",\"3328771072\",\"59.95\",\"United States\"\n\"2798\",\"Indian Railway Finance\",\"IRFC.NS\",\"3328548735\",\"0.25\",\"India\"\n\"2799\",\"Sprout Social\",\"SPT\",\"3327366656\",\"61.12\",\"United States\"\n\"2800\",\"Aarti Industries\",\"AARTIIND.NS\",\"3323074763\",\"9.17\",\"India\"\n\"2801\",\"Taisho Pharmaceutical\",\"4581.T\",\"3318870302\",\"40.48\",\"Japan\"\n\"2802\",\"Sabra Health Care REIT\",\"SBRA\",\"3318823424\",\"14.37\",\"United States\"\n\"2803\",\"Allied Properties REIT\",\"AP-UN.TO\",\"3316880987\",\"25.92\",\"Canada\"\n\"2804\",\"Kuka\",\"KU2.F\",\"3315645587\",\"82.96\",\"Germany\"\n\"2805\",\"Varonis\",\"VRNS\",\"3315588352\",\"30.26\",\"United States\"\n\"2806\",\"ASM Pacific Technology\",\"0522.HK\",\"3314884833\",\"8.03\",\"Hong Kong\"\n\"2807\",\"LivaNova\",\"LIVN\",\"3312782848\",\"61.99\",\"United Kingdom\"\n\"2808\",\"Nordstrom\",\"JWN\",\"3311781632\",\"20.62\",\"United States\"\n\"2809\",\"JCDecaux\",\"DEC.PA\",\"3309771358\",\"15.56\",\"France\"\n\"2810\",\"Lazard\",\"LAZ\",\"3301994752\",\"33.73\",\"Bermuda\"\n\"2811\",\"MultiPlan\",\"MPLN\",\"3300502016\",\"5.17\",\"United States\"\n\"2812\",\"iQIYI\",\"IQ\",\"3299544576\",\"3.83\",\"China\"\n\"2813\",\"Vertiv Holdings\",\"VRT\",\"3296002560\",\"8.75\",\"United States\"\n\"2814\",\"PBF Energy\",\"PBF\",\"3293771264\",\"27.26\",\"United States\"\n\"2815\",\"Boralex\",\"BLX.TO\",\"3290756576\",\"32.04\",\"Canada\"\n\"2816\",\"Acushnet Holdings\",\"GOLF\",\"3289108224\",\"45.54\",\"United States\"\n\"2817\",\"Nelnet\",\"NNI\",\"3286824960\",\"87.48\",\"United States\"\n\"2818\",\"Spirit AeroSystems\",\"SPR\",\"3285456896\",\"31.29\",\"United States\"\n\"2819\",\"Qube Holdings\",\"QUB.AX\",\"3282147048\",\"1.85\",\"Australia\"\n\"2820\",\"Select Medical Holdings\",\"SEM\",\"3281350400\",\"25.12\",\"United States\"\n\"2821\",\"Jinko Solar\",\"JKS\",\"3277842176\",\"67.17\",\"China\"\n\"2822\",\"AntarChile\",\"ANTARCHILE.SN\",\"3277690126\",\"7.19\",\"Chile\"\n\"2823\",\"Instructure Holdings\",\"INST\",\"3276423680\",\"23.18\",\"United States\"\n\"2824\",\"Abcam\",\"ABCM\",\"3274242560\",\"14.3\",\"United Kingdom\"\n\"2825\",\"Perficient\",\"PRFT\",\"3268748800\",\"94.34\",\"United States\"\n\"2826\",\"United Community Bank\",\"UCBI\",\"3265631488\",\"30.8\",\"United States\"\n\"2827\",\"GATX\",\"GATX\",\"3265232128\",\"91.72\",\"United States\"\n\"2828\",\"Thyssenkrupp\",\"TKA.F\",\"3262945882\",\"5.21\",\"Germany\"\n\"2829\",\"AmTrust Financial Services\",\"AFFS\",\"3262066432\",\"16.5\",\"United States\"\n\"2830\",\"Walker &amp; Dunlop\",\"WD\",\"3261668096\",\"98.45\",\"United States\"\n\"2831\",\"BellRing Brands\",\"BRBR\",\"3261097472\",\"23.92\",\"United States\"\n\"2832\",\"DMG Mori\",\"GIL.F\",\"3257630504\",\"40.82\",\"Germany\"\n\"2833\",\"Alarm.com\",\"ALRM\",\"3255674624\",\"65\",\"United States\"\n\"2834\",\"Park Hotels &amp; Resorts\",\"PK\",\"3253177600\",\"13.94\",\"United States\"\n\"2835\",\"Onto Innovation\",\"ONTO\",\"3252406016\",\"65.63\",\"United States\"\n\"2836\",\"NorthWestern Corporation\",\"NWE\",\"3251258368\",\"57.91\",\"United States\"\n\"2837\",\"ITV plc\",\"ITV.L\",\"3250884751\",\"77.17\",\"United Kingdom\"\n\"2838\",\"3M India\",\"3MINDIA.NS\",\"3249980216\",\"288.5\",\"India\"\n\"2839\",\"Guoco\",\"0053.HK\",\"3248691971\",\"9.87\",\"Hong Kong\"\n\"2840\",\"Inchcape\",\"INCH.L\",\"3248041726\",\"862.37\",\"United Kingdom\"\n\"2841\",\"Aerojet Rocketdyne\",\"AJRD\",\"3246895872\",\"40.35\",\"United States\"\n\"2842\",\"Harvey Norman\",\"HVN.AX\",\"3242843529\",\"2.6\",\"Australia\"\n\"2843\",\"Spectrum Brands\",\"SPB\",\"3233552896\",\"79.3\",\"United States\"\n\"2844\",\"easyJet\",\"EJT1.F\",\"3231528543\",\"4.21\",\"United Kingdom\"\n\"2845\",\"Indraprastha Gas\",\"IGL.NS\",\"3231111251\",\"4.61\",\"India\"\n\"2846\",\"MACOM\",\"MTSI\",\"3229653760\",\"46.21\",\"United States\"\n\"2847\",\"Jamf\",\"JAMF\",\"3228166400\",\"26.94\",\"United States\"\n\"2848\",\"Squarespace\",\"SQSP\",\"3227104000\",\"23.07\",\"United States\"\n\"2849\",\"FirstCash\",\"FCFS\",\"3225205760\",\"67.95\",\"United States\"\n\"2850\",\"SATS\",\"S58.SI\",\"3222222963\",\"2.87\",\"Singapore\"\n\"2851\",\"Lion Corp\",\"4912.T\",\"3222186145\",\"11.34\",\"Japan\"\n\"2852\",\"Cohen &amp; Steers\",\"CNS\",\"3217677312\",\"66.09\",\"United States\"\n\"2853\",\"Academy Sports\",\"ASO\",\"3206021888\",\"37.68\",\"United States\"\n\"2854\",\"Persistent Systems\",\"PERSISTENT.NS\",\"3201116300\",\"41.89\",\"India\"\n\"2855\",\"Wynn Macau\",\"1128.HK\",\"3197588765\",\"0.61\",\"Macau\"\n\"2856\",\"Old Mutual\",\"OMU.JO\",\"3195261382\",\"0.68\",\"South Africa\"\n\"2857\",\"Thermax\",\"THERMAX.NS\",\"3191198487\",\"26.07\",\"India\"\n\"2858\",\"Suntec REIT\",\"T82U.SI\",\"3186008951\",\"1.12\",\"Singapore\"\n\"2859\",\"H.B. Fuller\",\"FUL\",\"3185249280\",\"59.92\",\"United States\"\n\"2860\",\"Gates Industrial Corp\",\"GTES\",\"3182824960\",\"10.99\",\"United States\"\n\"2861\",\"Inmobiliaria Colonial\",\"COL.MC\",\"3182245518\",\"5.99\",\"Spain\"\n\"2862\",\"Bellway\",\"BWY.L\",\"3182202113\",\"2576.99\",\"United Kingdom\"\n\"2863\",\"Blueprint Medicines\",\"BPMC\",\"3181064704\",\"53.4\",\"United States\"\n\"2864\",\"CLEAR Secure\",\"YOU\",\"3178403328\",\"21.21\",\"United States\"\n\"2865\",\"Korn Ferry\",\"KFY\",\"3176922368\",\"59.92\",\"United States\"\n\"2866\",\"Skyline Champion\",\"SKY\",\"3173299200\",\"55.83\",\"United States\"\n\"2867\",\"PotlatchDeltic\",\"PCH\",\"3172395520\",\"45.73\",\"United States\"\n\"2868\",\"Indoritel\",\"DNET.JK\",\"3170930771\",\"0.22\",\"Indonesia\"\n\"2869\",\"Kemper\",\"KMPR\",\"3167704832\",\"49.65\",\"United States\"\n\"2870\",\"PacWest Bancorp\",\"PACW\",\"3167545600\",\"26.97\",\"United States\"\n\"2871\",\"PB Fintech\",\"POLICYBZR.NS\",\"3167383907\",\"7.05\",\"India\"\n\"2872\",\"Sumitomo Dainippon Pharma\",\"4506.T\",\"3161312987\",\"7.96\",\"Japan\"\n\"2873\",\"Innovative Industrial\",\"IIPR\",\"3160747776\",\"113\",\"United States\"\n\"2874\",\"Santen Pharmaceutical\",\"4536.T\",\"3159438398\",\"7.95\",\"Japan\"\n\"2875\",\"1&1\",\"1U1.DE\",\"3153722562\",\"17.89\",\"Germany\"\n\"2876\",\"Taylor Morrison\",\"TMHC\",\"3152487680\",\"26.35\",\"United States\"\n\"2877\",\"Varta\",\"VAR1.F\",\"3148353384\",\"77.33\",\"Germany\"\n\"2878\",\"Union Bank of India\",\"UNIONBANK.NS\",\"3146247377\",\"0.46\",\"India\"\n\"2879\",\"TTEC\",\"TTEC\",\"3145270784\",\"66.87\",\"United States\"\n\"2880\",\"ACI Worldwide\",\"ACIW\",\"3143327232\",\"27.38\",\"United States\"\n\"2881\",\"Buzzi Unicem\",\"BZU.MI\",\"3141379990\",\"16.97\",\"Italy\"\n\"2882\",\"Kadokawa\",\"9468.T\",\"3139657710\",\"22.55\",\"Japan\"\n\"2883\",\"Verbio\",\"VBK.F\",\"3134493345\",\"49.25\",\"Germany\"\n\"2884\",\"BTS Group\",\"BTS.BK\",\"3129251640\",\"0.24\",\"Thailand\"\n\"2885\",\"Cornerstone Building Brands\",\"CNR\",\"3129087744\",\"24.57\",\"United States\"\n\"2886\",\"Makkah Construction &amp; Development\",\"4100.SR\",\"3126638252\",\"18.97\",\"Saudi Arabia\"\n\"2887\",\"AbCellera\",\"ABCL\",\"3124205056\",\"10.98\",\"Canada\"\n\"2888\",\"Opendoor\",\"OPEN\",\"3123760128\",\"5\",\"United States\"\n\"2889\",\"Harmony Biosciences\",\"HRMY\",\"3118925824\",\"52.82\",\"United States\"\n\"2890\",\"Bausch Health\",\"BHC\",\"3114150144\",\"8.62\",\"Canada\"\n\"2891\",\"Hysan Development\",\"0014.HK\",\"3112282913\",\"3.03\",\"Hong Kong\"\n\"2892\",\"Deepak Nitrite\",\"DEEPAKNTR.NS\",\"3106616513\",\"22.78\",\"India\"\n\"2893\",\"Renewable Energy Group\",\"REGI\",\"3106199040\",\"61.5\",\"United States\"\n\"2894\",\"SeaWorld Entertainment\",\"SEAS\",\"3105603584\",\"42.75\",\"United States\"\n\"2895\",\"Equity Commonwealth\",\"EQC\",\"3105386496\",\"27.6\",\"United States\"\n\"2896\",\"CNX Resources\",\"CNX\",\"3104909568\",\"15.92\",\"United States\"\n\"2897\",\"Atul\",\"ATUL.NS\",\"3104205113\",\"105.18\",\"India\"\n\"2898\",\"SiTime\",\"SITM\",\"3104101120\",\"147.52\",\"United States\"\n\"2899\",\"Comfort Systems\",\"FIX\",\"3102581248\",\"86.56\",\"United States\"\n\"2900\",\"Lexington Realty Trust\",\"LXP\",\"3100881664\",\"10.79\",\"United States\"\n\"2901\",\"Papa John's Pizza\",\"PZZA\",\"3098764544\",\"86.57\",\"United States\"\n\"2902\",\"TransAlta\",\"TAC\",\"3098672640\",\"11.44\",\"Canada\"\n\"2903\",\"SNC-Lavalin Group\",\"SNC.TO\",\"3098545592\",\"17.3\",\"Canada\"\n\"2904\",\"Ipca Laboratories\",\"IPCALAB.NS\",\"3095822295\",\"12.19\",\"India\"\n\"2905\",\"Carter's\",\"CRI\",\"3094797824\",\"76.81\",\"United States\"\n\"2906\",\"Relaxo Footwear\",\"RELAXO.NS\",\"3094509646\",\"12.43\",\"India\"\n\"2907\",\"Mayr-Melnhof\",\"MYM.F\",\"3091903903\",\"153.24\",\"Austria\"\n\"2908\",\"Hannon Armstrong\",\"HASI\",\"3090100992\",\"35.63\",\"United States\"\n\"2909\",\"Goodyear\",\"GT\",\"3087342336\",\"10.93\",\"United States\"\n\"2910\",\"Avista\",\"AVA\",\"3086664448\",\"42.61\",\"United States\"\n\"2911\",\"Vermilion Energy\",\"VET\",\"3085936128\",\"18.68\",\"Canada\"\n\"2912\",\"IHS Towers\",\"IHS\",\"3084698368\",\"9.3\",\"United Kingdom\"\n\"2913\",\"Rural Electrification Corp\",\"RECLTD.NS\",\"3083794146\",\"1.56\",\"India\"\n\"2914\",\"Hayward\",\"HAYW\",\"3079517952\",\"14.1\",\"United States\"\n\"2915\",\"CA Immo\",\"BZY.F\",\"3078669128\",\"30.37\",\"Austria\"\n\"2916\",\"PTC Therapeutics\",\"PTCT\",\"3074680832\",\"43.1\",\"United States\"\n\"2917\",\"Insight Enterprises\",\"NSIT\",\"3074621952\",\"87.66\",\"United States\"\n\"2918\",\"BancFirst\",\"BANF\",\"3073833984\",\"93.91\",\"United States\"\n\"2919\",\"Royal Mail\",\"RMG.L\",\"3073311205\",\"321.41\",\"United Kingdom\"\n\"2920\",\"Meritage Homes\",\"MTH\",\"3072839168\",\"83.74\",\"United States\"\n\"2921\",\"Visteon\",\"VC\",\"3071429888\",\"109.26\",\"United States\"\n\"2922\",\"TMBThanachart Bank (ttb)\",\"TTB.BK\",\"3070755399\",\"0.03\",\"Thailand\"\n\"2923\",\"Brighthouse Financial\",\"BHF\",\"3070699520\",\"40.93\",\"United States\"\n\"2924\",\"Marks &amp; Spencer\",\"MKS.L\",\"3069911930\",\"156.31\",\"United Kingdom\"\n\"2925\",\"Roivant Sciences\",\"ROIV\",\"3069355264\",\"4.38\",\"United Kingdom\"\n\"2926\",\"American States Water\",\"AWR\",\"3065853184\",\"82.96\",\"United States\"\n\"2927\",\"Pennon Group\",\"PNN.L\",\"3065754962\",\"1163.09\",\"United Kingdom\"\n\"2928\",\"Softcat\",\"SCT.L\",\"3063753616\",\"1536.93\",\"United Kingdom\"\n\"2929\",\"Shapir Civil and Marine Engineering\",\"SPEN.TA\",\"3060842867\",\"8.56\",\"Israel\"\n\"2930\",\"Peloton\",\"PTON\",\"3059827712\",\"9.07\",\"United States\"\n\"2931\",\"Amicus Therapeutics\",\"FOLD\",\"3059379968\",\"10.92\",\"United States\"\n\"2932\",\"NewMarket Corp\",\"NEU\",\"3058259200\",\"298.23\",\"United States\"\n\"2933\",\"Fabrinet\",\"FN\",\"3057953536\",\"83.13\",\"Cayman Islands\"\n\"2934\",\"VIAVI Solutions\",\"VIAV\",\"3054074624\",\"13.41\",\"United States\"\n\"2935\",\"Sumitomo Chemical\r\n India\",\"SUMICHEM.NS\",\"3053900993\",\"6.12\",\"India\"\n\"2936\",\"Aritzia\",\"ATZ.TO\",\"3053622010\",\"27.77\",\"Canada\"\n\"2937\",\"LCI Industries\",\"LCII\",\"3048680448\",\"119.96\",\"United States\"\n\"2938\",\"Gap Inc.\",\"GPS\",\"3046775040\",\"8.28\",\"United States\"\n\"2939\",\"Blackbaud\",\"BLKB\",\"3045810688\",\"57.53\",\"United States\"\n\"2940\",\"Supreme Industries\",\"SUPREMEIND.NS\",\"3042030485\",\"23.95\",\"India\"\n\"2941\",\"Shift4 Payments\",\"FOUR\",\"3040574464\",\"32.52\",\"United States\"\n\"2942\",\"Denbury\",\"DEN\",\"3038761984\",\"60.33\",\"United States\"\n\"2943\",\"Strauss Group\",\"STRS.TA\",\"3031815850\",\"26.07\",\"Israel\"\n\"2944\",\"Finning\",\"FTT.TO\",\"3028512994\",\"19.39\",\"Canada\"\n\"2945\",\"CVR Energy\",\"CVI\",\"3027993856\",\"30.12\",\"United States\"\n\"2946\",\"BRF\",\"BRFS\",\"3027550208\",\"2.81\",\"Brazil\"\n\"2947\",\"California Resources Corporation\",\"CRC\",\"3025272320\",\"38.97\",\"United States\"\n\"2948\",\"Federated Hermes\",\"FHI\",\"3023438080\",\"32.98\",\"United States\"\n\"2949\",\"Mueller Industries\",\"MLI\",\"3022392320\",\"53.12\",\"United States\"\n\"2950\",\"Bank of Hawaii\",\"BOH\",\"3020383744\",\"74.97\",\"United States\"\n\"2951\",\"California Water Service\",\"CWT\",\"3014245632\",\"56.06\",\"United States\"\n\"2952\",\"MultiChoice Group\",\"MCG.JO\",\"3011053618\",\"7.07\",\"South Africa\"\n\"2953\",\"Metro AG\",\"B4B.F\",\"3010847276\",\"8.34\",\"Germany\"\n\"2954\",\"Sunoco\",\"SUN\",\"3005781248\",\"35.89\",\"United States\"\n\"2955\",\"Vopak\",\"VPK.AS\",\"3003586349\",\"23.96\",\"Netherlands\"\n\"2956\",\"CRISIL\",\"CRISIL.NS\",\"2998097966\",\"41.04\",\"India\"\n\"2957\",\"Amot Investment\",\"AMOT.TA\",\"2996610746\",\"6.38\",\"Israel\"\n\"2958\",\"Bayer Crop Science\",\"BAYERCROP.NS\",\"2994811193\",\"66.61\",\"India\"\n\"2959\",\"Arcadis\",\"ARCAD.AS\",\"2994759047\",\"33.65\",\"Netherlands\"\n\"2960\",\"Arconic\",\"ARNC\",\"2993687040\",\"28.3\",\"United States\"\n\"2961\",\"Paramount Resources\",\"POU.TO\",\"2992553562\",\"20.15\",\"Canada\"\n\"2962\",\"Greif\",\"GEF\",\"2989234432\",\"62.58\",\"United States\"\n\"2963\",\"Commvault\",\"CVLT\",\"2988761344\",\"66.66\",\"United States\"\n\"2964\",\"Merit Medical\",\"MMSI\",\"2987629056\",\"52.71\",\"United States\"\n\"2965\",\"Matson\",\"MATX\",\"2984252416\",\"73.61\",\"United States\"\n\"2966\",\"Cathay General Bancorp\",\"CATY\",\"2982707200\",\"39.69\",\"United States\"\n\"2967\",\"Ultra Electronics\",\"ULE.L\",\"2980291391\",\"4146.01\",\"United Kingdom\"\n\"2968\",\"Main Street Capital\",\"MAIN\",\"2977547264\",\"40.8\",\"United States\"\n\"2969\",\"Taiwan Business Bank\",\"2834.TW\",\"2971068004\",\"0.38\",\"Taiwan\"\n\"2970\",\"Joby Aviation\",\"JOBY\",\"2965579520\",\"4.89\",\"United States\"\n\"2971\",\"SL Green Realty\",\"SLG\",\"2964583424\",\"45.74\",\"United States\"\n\"2972\",\"KnowBe4\",\"KNBE\",\"2964002816\",\"16.93\",\"United States\"\n\"2973\",\"Hostess Brands\",\"TWNK\",\"2962107648\",\"21.42\",\"United States\"\n\"2974\",\"Freedom Holding\",\"FRHC\",\"2960438272\",\"49.72\",\"Kazakhstan\"\n\"2975\",\"Kinaxis\",\"KXS.TO\",\"2958943656\",\"107.24\",\"Canada\"\n\"2976\",\"BİM Birleşik Mağazalar\",\"BIMAS.IS\",\"2948440886\",\"4.93\",\"Turkey\"\n\"2977\",\"Tata Teleservices\",\"TTML.NS\",\"2944398887\",\"1.51\",\"India\"\n\"2978\",\"Corporate Office Properties Trust\",\"OFC\",\"2941994240\",\"25.79\",\"United States\"\n\"2979\",\"Meitetsu\",\"9048.T\",\"2936319654\",\"14.94\",\"Japan\"\n\"2980\",\"Diodes Incorporated\",\"DIOD\",\"2936097280\",\"64.89\",\"United States\"\n\"2981\",\"First Hawaiian Bank\",\"FHB\",\"2935181056\",\"22.92\",\"United States\"\n\"2982\",\"Aaon\",\"AAON\",\"2934306816\",\"55.29\",\"United States\"\n\"2983\",\"Prestige Consumer Healthcare\",\"PBH\",\"2932794112\",\"58.75\",\"United States\"\n\"2984\",\"Leslie's\",\"LESL\",\"2932737792\",\"16.04\",\"United States\"\n\"2985\",\"Resideo Technologies\",\"REZI\",\"2928355840\",\"20.14\",\"United States\"\n\"2986\",\"OVH Groupe\",\"OVH.PA\",\"2925190886\",\"15.37\",\"France\"\n\"2987\",\"Aselsan\",\"ASELS.IS\",\"2921630985\",\"1.28\",\"Turkey\"\n\"2988\",\"ABM Industries\",\"ABM\",\"2919641856\",\"43.72\",\"United States\"\n\"2989\",\"Independent Bank Group\",\"IBTX\",\"2918139648\",\"69.03\",\"United States\"\n\"2990\",\"Axonics Modulation Tech\",\"AXNX\",\"2916934144\",\"61.97\",\"United States\"\n\"2991\",\"Bata India\",\"BATAINDIA.NS\",\"2914216002\",\"22.66\",\"India\"\n\"2992\",\"Enovis\",\"ENOV\",\"2913346048\",\"53.92\",\"United States\"\n\"2993\",\"Peabody Energy\",\"BTU\",\"2910511872\",\"20.24\",\"United States\"\n\"2994\",\"Sprouts Farmers Market\",\"SFM\",\"2910490624\",\"26.55\",\"United States\"\n\"2995\",\"JB Hi-Fi\",\"JBH.AX\",\"2907590996\",\"26.59\",\"Australia\"\n\"2996\",\"JBG SMITH\",\"JBGS\",\"2907084544\",\"23.53\",\"United States\"\n\"2997\",\"Cogent Communications\",\"CCOI\",\"2902488320\",\"60.55\",\"United States\"\n\"2998\",\"Nordic Semiconductor\",\"NOD.OL\",\"2898215150\",\"15.18\",\"Norway\"\n\"2999\",\"Essential Properties Realty Trust\",\"EPRT\",\"2897531904\",\"22\",\"United States\"\n\"3000\",\"Bloom Energy\",\"BE\",\"2895843840\",\"17.25\",\"United States\"\n\"3001\",\"Covetrus\",\"CVET\",\"2894998528\",\"20.75\",\"United States\"\n\"3002\",\"Valaris\",\"VAL\",\"2894742784\",\"38.6\",\"United Kingdom\"\n\"3003\",\"Patterson Companies\",\"PDCO\",\"2894460928\",\"29.92\",\"United States\"\n\"3004\",\"Lightspeed POS\",\"LSPD\",\"2894228224\",\"19.38\",\"Canada\"\n\"3005\",\"Comgás\",\"CGAS5.SA\",\"2894170993\",\"22.16\",\"Brazil\"\n\"3006\",\"Vishay Intertechnology\",\"VSH\",\"2892903680\",\"18.53\",\"United States\"\n\"3007\",\"Enerplus\",\"ERF\",\"2892312576\",\"11.85\",\"Canada\"\n\"3008\",\"Dixon Technologies\",\"DIXON.NS\",\"2890219258\",\"48.7\",\"India\"\n\"3009\",\"Metsä Board\",\"METSA.HE\",\"2888388923\",\"8.67\",\"Finland\"\n\"3010\",\"Big Yellow Group\",\"BYG.L\",\"2883545184\",\"1566.64\",\"United Kingdom\"\n\"3011\",\"Syngene International\",\"SYNGENE.NS\",\"2882207774\",\"7.18\",\"India\"\n\"3012\",\"Grand Canyon Education\",\"LOPE\",\"2881436160\",\"89.16\",\"United States\"\n\"3013\",\"Evolution Mining\",\"EVN.AX\",\"2874726673\",\"1.57\",\"Australia\"\n\"3014\",\"TietoEVRY\",\"TIETO.HE\",\"2874298498\",\"24.27\",\"Finland\"\n\"3015\",\"CIE Automotive\",\"CIE.MC\",\"2873319546\",\"23.45\",\"Spain\"\n\"3016\",\"NexPoint Residential\",\"NXRT\",\"2872577536\",\"58.01\",\"United States\"\n\"3017\",\"RLX Technology\",\"RLX\",\"2871336192\",\"1.86\",\"China\"\n\"3018\",\"Pacific Premier Bancorp\",\"PPBI\",\"2868796672\",\"30.22\",\"United States\"\n\"3019\",\"BankUnited\",\"BKU\",\"2868276992\",\"35.07\",\"United States\"\n\"3020\",\"Dycom Industries\",\"DY\",\"2867726080\",\"97.04\",\"United States\"\n\"3021\",\"Evolent Health\",\"EVH\",\"2867368960\",\"31.31\",\"United States\"\n\"3022\",\"Lanxess\",\"LXS.F\",\"2866122972\",\"33.07\",\"Germany\"\n\"3023\",\"Air France-KLM\",\"AF.PA\",\"2861269655\",\"1.11\",\"France\"\n\"3024\",\"Thai Oil\",\"TOP.BK\",\"2860935117\",\"1.4\",\"Thailand\"\n\"3025\",\"Harmonic Drive Systems\",\"6324.T\",\"2860807194\",\"29.79\",\"Japan\"\n\"3026\",\"Hankook Tire\",\"161390.KS\",\"2854700498\",\"23.4\",\"South Korea\"\n\"3027\",\"SITE Centers\",\"SITC\",\"2852180224\",\"13.33\",\"United States\"\n\"3028\",\"Prospect Capital\",\"PSEC\",\"2850937856\",\"7.27\",\"United States\"\n\"3029\",\"Tricon Residential\",\"TCN\",\"2850095872\",\"10.42\",\"Canada\"\n\"3030\",\"Hillenbrand\",\"HI\",\"2849153280\",\"39.73\",\"United States\"\n\"3031\",\"Lithium Americas\",\"LAC\",\"2844914432\",\"20.39\",\"Canada\"\n\"3032\",\"Südzucker\",\"SZU.F\",\"2843138832\",\"13.87\",\"Germany\"\n\"3033\",\"Mayora\",\"D7V.F\",\"2842795439\",\"0.12\",\"Indonesia\"\n\"3034\",\"Mapletree North Asia Commercial Trust\",\"RW0U.SI\",\"2840643118\",\"0.85\",\"Singapore\"\n\"3035\",\"Port of Tauranga\",\"POT.NZ\",\"2838820069\",\"4.04\",\"New Zealand\"\n\"3036\",\"Linamar\",\"LNR.TO\",\"2838463561\",\"41.42\",\"Canada\"\n\"3037\",\"Envestnet\",\"ENV\",\"2836627200\",\"51.4\",\"United States\"\n\"3038\",\"ALSOK\",\"2331.T\",\"2834583102\",\"28\",\"Japan\"\n\"3039\",\"Aditya Birla Capital\",\"ABCAPITAL.NS\",\"2832666514\",\"1.17\",\"India\"\n\"3040\",\"Keppel REIT\",\"K71U.SI\",\"2832649924\",\"0.76\",\"Singapore\"\n\"3041\",\"Dermapharm\",\"DMP.F\",\"2831858357\",\"52.09\",\"Germany\"\n\"3042\",\"Innergex Renewable Energy\",\"INE.TO\",\"2829682670\",\"13.86\",\"Canada\"\n\"3043\",\"Ameris Bancorp\",\"ABCB\",\"2829508864\",\"40.75\",\"United States\"\n\"3044\",\"Patterson-UTI Energy\",\"PTEN\",\"2829243392\",\"13.08\",\"United States\"\n\"3045\",\"Exxaro Resources\",\"EXX.JO\",\"2827844024\",\"11.45\",\"South Africa\"\n\"3046\",\"Black Stone Minerals\",\"BSM\",\"2826873088\",\"13.5\",\"United States\"\n\"3047\",\"Advanced Energy\",\"AEIS\",\"2826713088\",\"75.26\",\"United States\"\n\"3048\",\"Permata Bank\",\"BNLI.JK\",\"2824966327\",\"0.08\",\"Indonesia\"\n\"3049\",\"Summit Materials\",\"SUM\",\"2819637504\",\"23.88\",\"United States\"\n\"3050\",\"Solaria Energía\",\"SLR.MC\",\"2816894262\",\"22.54\",\"Spain\"\n\"3051\",\"De' Longhi\",\"DLG.MI\",\"2816006693\",\"18.77\",\"Italy\"\n\"3052\",\"Darktrace\",\"DARK.L\",\"2815490002\",\"402.36\",\"United Kingdom\"\n\"3053\",\"Alumina Limited\",\"AWC.AX\",\"2814784636\",\"0.97\",\"Australia\"\n\"3054\",\"African Rainbow Minerals\",\"ARI.JO\",\"2811003682\",\"12.52\",\"South Africa\"\n\"3055\",\"Upwork\",\"UPWK\",\"2810833664\",\"21.68\",\"United States\"\n\"3056\",\"H&amp;R REIT\",\"HR-UN.TO\",\"2809162007\",\"9.73\",\"Canada\"\n\"3057\",\"Otter Tail\",\"OTTR\",\"2805076480\",\"67.38\",\"United States\"\n\"3058\",\"Shangri-La\",\"0069.HK\",\"2804556157\",\"0.78\",\"Hong Kong\"\n\"3059\",\"PrairieSky Royalty\",\"PSK.TO\",\"2804505621\",\"11.74\",\"Canada\"\n\"3060\",\"Freenet\",\"FNTN.F\",\"2803364489\",\"23.44\",\"Germany\"\n\"3061\",\"National Health Investors\",\"NHI\",\"2801954560\",\"61.11\",\"United States\"\n\"3062\",\"Fonterra\",\"FCG.NZ\",\"2801797153\",\"1.74\",\"New Zealand\"\n\"3063\",\"Group 1 Automotive\",\"GPI\",\"2800642560\",\"168.75\",\"United States\"\n\"3064\",\"The AZEK Company\",\"AZEK\",\"2798996480\",\"18.04\",\"United States\"\n\"3065\",\"Silicon Motion\",\"SIMO\",\"2794110976\",\"81.14\",\"Hong Kong\"\n\"3066\",\"Rush Enterprises\",\"RUSHA\",\"2789970176\",\"49.41\",\"United States\"\n\"3067\",\"Agiliti\",\"AGTI\",\"2786787072\",\"20.99\",\"United States\"\n\"3068\",\"Sprinklr\",\"CXM\",\"2785438464\",\"10.79\",\"United States\"\n\"3069\",\"MGE Energy\",\"MGEE\",\"2785304832\",\"77.02\",\"United States\"\n\"3070\",\"EngageSmart\",\"ESMT\",\"2783951872\",\"17.12\",\"United States\"\n\"3071\",\"ReNew Power\",\"RNW\",\"2777537024\",\"6.93\",\"India\"\n\"3072\",\"Altarea\",\"ALTA.PA\",\"2777423670\",\"137.36\",\"France\"\n\"3073\",\"Comstock Resources\",\"CRK\",\"2776239616\",\"11.92\",\"United States\"\n\"3074\",\"Evergrande\",\"3333.HK\",\"2775510976\",\"0.21\",\"China\"\n\"3075\",\"Vienna Airport\",\"FLW1.F\",\"2775156352\",\"32.78\",\"Austria\"\n\"3076\",\"Brink's\",\"BCO\",\"2774833152\",\"59.01\",\"United States\"\n\"3077\",\"Mr. Cooper Group\",\"COOP\",\"2774434816\",\"37.54\",\"United States\"\n\"3078\",\"Alamos Gold\",\"AGI\",\"2774426880\",\"7.05\",\"Canada\"\n\"3079\",\"Verint Systems\",\"VRNT\",\"2772034816\",\"42.86\",\"United States\"\n\"3080\",\"Games Workshop Group\",\"GAW.L\",\"2769570731\",\"8433.48\",\"United Kingdom\"\n\"3081\",\"Phoenix Mills\",\"PHOENIXLTD.NS\",\"2767408914\",\"15.5\",\"India\"\n\"3082\",\"Corcept Therapeutics\",\"CORT\",\"2766776064\",\"26.04\",\"United States\"\n\"3083\",\"FormFactor\",\"FORM\",\"2766584576\",\"35.44\",\"United States\"\n\"3084\",\"Vienna Insurance Group\",\"WSV2.F\",\"2760389953\",\"21.42\",\"Austria\"\n\"3085\",\"Faurecia\",\"EO.PA\",\"2759651169\",\"16.51\",\"France\"\n\"3086\",\"Equitrans Midstream\",\"ETRN\",\"2758864128\",\"6.38\",\"United States\"\n\"3087\",\"Associated Banc-Corp\",\"ASB\",\"2757808640\",\"18.38\",\"United States\"\n\"3088\",\"Türkiye Is Bankasi\",\"ISCTR.IS\",\"2756371192\",\"0.26\",\"Turkey\"\n\"3089\",\"Moelis &amp; Company\",\"MC\",\"2755783936\",\"40.06\",\"United States\"\n\"3090\",\"CONMED\",\"CNMD\",\"2754185216\",\"93.28\",\"United States\"\n\"3091\",\"SunPower\",\"SPWR\",\"2753974016\",\"15.84\",\"United States\"\n\"3092\",\"Adient\",\"ADNT\",\"2748582400\",\"28.99\",\"Ireland\"\n\"3093\",\"Allegheny Technologies\",\"ATI\",\"2746442752\",\"22.13\",\"United States\"\n\"3094\",\"Indian Bank\",\"INDIANB.NS\",\"2742825084\",\"2.2\",\"India\"\n\"3095\",\"Progyny\",\"PGNY\",\"2738098432\",\"29.78\",\"United States\"\n\"3096\",\"LondonMetric Property\",\"LMP.L\",\"2737865060\",\"279.33\",\"United Kingdom\"\n\"3097\",\"Texas Capital Bancshares\",\"TCBI\",\"2737531136\",\"53.97\",\"United States\"\n\"3098\",\"Aurubis\",\"NDA.F\",\"2734464837\",\"62.34\",\"Germany\"\n\"3099\",\"Methanex\",\"MEOH\",\"2732780032\",\"36.86\",\"Canada\"\n\"3100\",\"Beijing Airport\",\"0694.HK\",\"2730091209\",\"0.6\",\"China\"\n\"3101\",\"Indah Kiat Pulp &amp; Paper\",\"INKP.JK\",\"2729100800\",\"0.5\",\"Indonesia\"\n\"3102\",\"The Navigator Company\",\"NVG.LS\",\"2728883033\",\"3.84\",\"Portugal\"\n\"3103\",\"Outfront Media\",\"OUT\",\"2727486208\",\"16.63\",\"United States\"\n\"3104\",\"Graham Holdings\",\"GHC\",\"2727011072\",\"558.61\",\"United States\"\n\"3105\",\"Tohoku Electric Power\",\"9506.T\",\"2725666025\",\"5.45\",\"Japan\"\n\"3106\",\"Herc Holdings\",\"HRI\",\"2722793216\",\"91.1\",\"United States\"\n\"3107\",\"Gibson Energy\",\"GEI.TO\",\"2719440294\",\"18.45\",\"Canada\"\n\"3108\",\"Polymetal\",\"PM6.F\",\"2713645820\",\"5.73\",\"Cyprus\"\n\"3109\",\"TechnipFMC\",\"FTI\",\"2713272064\",\"6\",\"United Kingdom\"\n\"3110\",\"Simmons First National\",\"SFNC\",\"2713030144\",\"20.77\",\"United States\"\n\"3111\",\"TripAdvisor\",\"TRIP\",\"2710010112\",\"17.78\",\"United States\"\n\"3112\",\"MakeMyTrip\",\"MMYT\",\"2708395520\",\"25.86\",\"India\"\n\"3113\",\"APL Apollo\",\"APLAPOLLO.NS\",\"2707916870\",\"10.81\",\"India\"\n\"3114\",\"Land and Houses\",\"LH.BK\",\"2707735571\",\"0.23\",\"Thailand\"\n\"3115\",\"Installed Building Products\",\"IBP\",\"2702519040\",\"92.25\",\"United States\"\n\"3116\",\"Zain Saudi Arabia\",\"7030.SR\",\"2701072015\",\"3.01\",\"Saudi Arabia\"\n\"3117\",\"Fate Therapeutics\",\"FATE\",\"2697401600\",\"27.92\",\"United States\"\n\"3118\",\"National Shipping Company of Saudi Arabia (Bahri)\",\"4030.SR\",\"2697187500\",\"5.48\",\"Saudi Arabia\"\n\"3119\",\"KB Home\",\"KBH\",\"2696035072\",\"30.93\",\"United States\"\n\"3120\",\"CarGurus\",\"CARG\",\"2695580928\",\"22.77\",\"United States\"\n\"3121\",\"Coforge\",\"COFORGE.NS\",\"2695351298\",\"44.25\",\"India\"\n\"3122\",\"Britvic\",\"BVIC.L\",\"2694470825\",\"1012.73\",\"United Kingdom\"\n\"3123\",\"Safestore\",\"SAFE.L\",\"2691627496\",\"1261.16\",\"United Kingdom\"\n\"3124\",\"Aixtron\",\"AIXA.F\",\"2690961054\",\"23.98\",\"Germany\"\n\"3125\",\"Spirit Airlines\",\"SAVE\",\"2690492672\",\"24.77\",\"United States\"\n\"3126\",\"Westports\",\"5246.KL\",\"2689213752\",\"0.79\",\"Malaysia\"\n\"3127\",\"Intercorp Financial Services\",\"IFS\",\"2688085248\",\"23.29\",\"Peru\"\n\"3128\",\"Wingstop Restaurants\",\"WING\",\"2688015616\",\"89.97\",\"United States\"\n\"3129\",\"Surgery Partners\",\"SGRY\",\"2685441536\",\"29.87\",\"United States\"\n\"3130\",\"Tata Chemicals\",\"TATACHEM.NS\",\"2675630039\",\"10.5\",\"India\"\n\"3131\",\"Insmed\",\"INSM\",\"2674790400\",\"22.38\",\"United States\"\n\"3132\",\"PJT Partners\",\"PJT\",\"2673664512\",\"67.9\",\"United States\"\n\"3133\",\"Endurance Technologies\",\"ENDURANCE.NS\",\"2671266770\",\"18.99\",\"India\"\n\"3134\",\"Whiting Petroleum\",\"WLL\",\"2669619712\",\"68.03\",\"United States\"\n\"3135\",\"Nerolac Paints\",\"KANSAINER.NS\",\"2667893860\",\"4.95\",\"India\"\n\"3136\",\"Steve Madden\",\"SHOO\",\"2667477760\",\"33.4\",\"United States\"\n\"3137\",\"Zee Entertainment\",\"ZEEL.NS\",\"2667437009\",\"2.78\",\"India\"\n\"3138\",\"Ryman Healthcare\",\"RYM.NZ\",\"2666298439\",\"5.33\",\"New Zealand\"\n\"3139\",\"NetLink Trust\",\"CJLU.SI\",\"2660993721\",\"0.68\",\"Singapore\"\n\"3140\",\"Mr Price Group\",\"MRP.JO\",\"2660669101\",\"10.26\",\"South Africa\"\n\"3141\",\"IDFC FIRST Bank\",\"IDFCFIRSTB.NS\",\"2659468798\",\"0.43\",\"India\"\n\"3142\",\"Cvent\",\"CVT\",\"2659315200\",\"5.53\",\"United States\"\n\"3143\",\"Vector Limited\",\"VCT.NZ\",\"2657093687\",\"2.66\",\"New Zealand\"\n\"3144\",\"Americanas\",\"AMER3.SA\",\"2656848906\",\"2.95\",\"Brazil\"\n\"3145\",\"Fisker\",\"FSR\",\"2655580416\",\"8.94\",\"United States\"\n\"3146\",\"TUI\",\"TUI1.F\",\"2654030126\",\"1.49\",\"Germany\"\n\"3147\",\"Jetblue Airways\",\"JBLU\",\"2651321088\",\"8.27\",\"United States\"\n\"3148\",\"GMR Group\",\"GMRINFRA.NS\",\"2649477625\",\"0.44\",\"India\"\n\"3149\",\"Tsuruha Holdings\",\"3391.T\",\"2648350218\",\"54.54\",\"Japan\"\n\"3150\",\"Champion REIT\",\"2778.HK\",\"2647617162\",\"0.44\",\"Hong Kong\"\n\"3151\",\"Atlas Corp\",\"ATCO\",\"2646108416\",\"10.51\",\"Canada\"\n\"3152\",\"Wizz Air\",\"WIZZ.L\",\"2643301558\",\"2114.02\",\"Jersey\"\n\"3153\",\"TAL Education Group\",\"TAL\",\"2641192704\",\"4.07\",\"China\"\n\"3154\",\"CorVel Corporation\",\"CRVL\",\"2637213696\",\"150.29\",\"United States\"\n\"3155\",\"Evertec\",\"EVTC\",\"2635385600\",\"36.84\",\"United States\"\n\"3156\",\"Whirlpool India\",\"WHIRLPOOL.NS\",\"2628778576\",\"20.72\",\"India\"\n\"3157\",\"Trupanion\",\"TRUP\",\"2626472192\",\"64.5\",\"United States\"\n\"3158\",\"Future plc\",\"FUTR.L\",\"2624565836\",\"2171.66\",\"United Kingdom\"\n\"3159\",\"Calix\",\"CALX\",\"2622916096\",\"40.6\",\"United States\"\n\"3160\",\"Escorts Limited\",\"ESCORTS.NS\",\"2622706391\",\"19.88\",\"India\"\n\"3161\",\"Emami\",\"EMAMILTD.NS\",\"2611123347\",\"5.92\",\"India\"\n\"3162\",\"John Wiley &amp; Sons\",\"WLY\",\"2609082368\",\"46.99\",\"United States\"\n\"3163\",\"Federal Bank\",\"FEDERALBNK.NS\",\"2604823870\",\"1.24\",\"India\"\n\"3164\",\"Farfetch\",\"FTCH\",\"2604388352\",\"6.83\",\"United Kingdom\"\n\"3165\",\"PennyMac\",\"PFSI\",\"2600641792\",\"47.77\",\"United States\"\n\"3166\",\"Kennedy Wilson\",\"KW\",\"2600116480\",\"18.87\",\"United States\"\n\"3167\",\"Werner Enterprises\",\"WERN\",\"2599709696\",\"39.96\",\"United States\"\n\"3168\",\"Growthpoint Properties\",\"GRT.JO\",\"2597198628\",\"0.76\",\"South Africa\"\n\"3169\",\"MaxLinear\",\"MXL\",\"2594291456\",\"33.43\",\"United States\"\n\"3170\",\"J&amp;J Snack Foods\",\"JJSF\",\"2593501184\",\"135.26\",\"United States\"\n\"3171\",\"Copa Holdings\",\"CPA\",\"2592221952\",\"62.34\",\"Panama\"\n\"3172\",\"QinetiQ\",\"QQ.L\",\"2590781833\",\"447.65\",\"United Kingdom\"\n\"3173\",\"Alignment Healthcare\",\"ALHC\",\"2589764096\",\"13.83\",\"United States\"\n\"3174\",\"Bottomline Technologies\",\"EPAY\",\"2586582528\",\"56.99\",\"United States\"\n\"3175\",\"Life Time Group\",\"LTH\",\"2586349056\",\"13.35\",\"United States\"\n\"3176\",\"Nova Measuring Instruments\",\"NVMI\",\"2584241152\",\"90.01\",\"Israel\"\n\"3177\",\"Chindata\",\"CD\",\"2579166464\",\"7.03\",\"China\"\n\"3178\",\"Razer\",\"RAZFF\",\"2575805440\",\"0.27\",\"United States\"\n\"3179\",\"Semen Indonesia\",\"SMS2.F\",\"2575544825\",\"0.41\",\"Indonesia\"\n\"3180\",\"Cal-Maine Foods\",\"CALM\",\"2575238656\",\"52.62\",\"United States\"\n\"3181\",\"AdaptHealth\",\"AHCO\",\"2574319872\",\"19.17\",\"United States\"\n\"3182\",\"Meritor\",\"MTOR\",\"2573829632\",\"36.33\",\"United States\"\n\"3183\",\"United Industrial Corporation\",\"U06.SI\",\"2567983726\",\"1.79\",\"Singapore\"\n\"3184\",\"General Insurance Corporation of India\",\"GICRE.NS\",\"2564062314\",\"1.46\",\"India\"\n\"3185\",\"Pacira Biosciences\",\"PCRX\",\"2562181120\",\"56.39\",\"United States\"\n\"3186\",\"Ermenegildo Zegna\",\"ZGN\",\"2561575936\",\"10.57\",\"Italy\"\n\"3187\",\"Multiplan Empreendimentos Imobiliários\",\"MULT3.SA\",\"2560122332\",\"4.35\",\"Brazil\"\n\"3188\",\"Atlantic Union Bankshares\",\"AUB\",\"2556480512\",\"34.08\",\"United States\"\n\"3189\",\"Mercury General\",\"MCY\",\"2554822400\",\"46.14\",\"United States\"\n\"3190\",\"Signet Jewelers\",\"SIG\",\"2554105600\",\"54.91\",\"Bermuda\"\n\"3191\",\"Mitra Keluarga\",\"MIKA.JK\",\"2553967266\",\"0.18\",\"Indonesia\"\n\"3192\",\"Banco del Bajío\",\"BBAJIOO.MX\",\"2552924623\",\"2.15\",\"Mexico\"\n\"3193\",\"Cano Health\",\"CANO\",\"2548312320\",\"5.26\",\"United States\"\n\"3194\",\"Grainger plc\",\"GRI.L\",\"2548307632\",\"343.76\",\"United Kingdom\"\n\"3195\",\"Arvinas\",\"ARVN\",\"2546651392\",\"47.9\",\"United States\"\n\"3196\",\"Cyfrowy Polsat\",\"CP9.F\",\"2545686138\",\"4.42\",\"Poland\"\n\"3197\",\"NuVasive\",\"NUVA\",\"2543243520\",\"48.87\",\"United States\"\n\"3198\",\"WSFS Financial\",\"WSFS\",\"2543079936\",\"39.32\",\"United States\"\n\"3199\",\"Belden\",\"BDC\",\"2542518784\",\"57.45\",\"United States\"\n\"3200\",\"Arçelik\",\"ARCLK.IS\",\"2539105212\",\"4.1\",\"Turkey\"\n\"3201\",\"Dream Industrial REIT\",\"DIR-UN.TO\",\"2538780319\",\"9.3\",\"Canada\"\n\"3202\",\"Viscofan\",\"VIS.MC\",\"2538700388\",\"54.85\",\"Spain\"\n\"3203\",\"MDC Holdings\",\"MDC\",\"2537999872\",\"35.67\",\"United States\"\n\"3204\",\"First Capital REIT\",\"FCR-UN.TO\",\"2535901267\",\"11.54\",\"Canada\"\n\"3205\",\"GoodRx\",\"GDRX\",\"2535348736\",\"6.4\",\"United States\"\n\"3206\",\"Hensoldt\",\"HAG.F\",\"2533936652\",\"24.13\",\"Germany\"\n\"3207\",\"nternational Bancshares Corp\",\"IBOC\",\"2533837056\",\"40.11\",\"United States\"\n\"3208\",\"Maple Leaf Foods\",\"MFI.TO\",\"2533414885\",\"19.98\",\"Canada\"\n\"3209\",\"Sanmina\",\"SANM\",\"2532331264\",\"41.62\",\"United States\"\n\"3210\",\"Verra Mobility\",\"VRRM\",\"2530063616\",\"16.2\",\"United States\"\n\"3211\",\"Hang Lung Group\",\"0010.HK\",\"2529753637\",\"1.86\",\"Hong Kong\"\n\"3212\",\"Fletcher Building\",\"FLQ.F\",\"2529624422\",\"3.04\",\"New Zealand\"\n\"3213\",\"Tianjin FAW\",\"000927.SZ\",\"2519292174\",\"0.42\",\"China\"\n\"3214\",\"Quaker Chemical Corporation\",\"KWR\",\"2518083072\",\"140.58\",\"United States\"\n\"3215\",\"Mercari\",\"4385.T\",\"2516815263\",\"15.68\",\"Japan\"\n\"3216\",\"Sonos\",\"SONO\",\"2504066560\",\"19.58\",\"United States\"\n\"3217\",\"Oil India\",\"OIL.NS\",\"2502075208\",\"2.31\",\"India\"\n\"3218\",\"Newmark\",\"NMRK\",\"2501079040\",\"10.33\",\"United States\"\n\"3219\",\"Boise Cascade\",\"BCC\",\"2498203904\",\"63.33\",\"United States\"\n\"3220\",\"BGF Retail\",\"282330.KS\",\"2490278197\",\"144.16\",\"South Korea\"\n\"3221\",\"Alliance Resource Partners\",\"ARLP\",\"2489206016\",\"19.57\",\"United States\"\n\"3222\",\"Albany International\",\"AIN\",\"2488499968\",\"79\",\"United States\"\n\"3223\",\"StoneCo\",\"STNE\",\"2484148224\",\"7.97\",\"Brazil\"\n\"3224\",\"SPX Corporation\",\"SPXC\",\"2483635712\",\"54.33\",\"United States\"\n\"3225\",\"LIC Housing Finance\",\"LICHSGFIN.NS\",\"2483336271\",\"4.51\",\"India\"\n\"3226\",\"Artisan Partners\",\"APAM\",\"2482961664\",\"36.84\",\"United States\"\n\"3227\",\"Kulicke and Soffa Industries\",\"KLIC\",\"2482873088\",\"41.99\",\"Singapore\"\n\"3228\",\"Tronox\",\"TROX\",\"2477569792\",\"15.9\",\"United States\"\n\"3229\",\"Ambu\",\"AMBU-B.CO\",\"2476900761\",\"9.76\",\"Denmark\"\n\"3230\",\"Plains GP\",\"PAGP\",\"2473470720\",\"10.26\",\"United States\"\n\"3231\",\"BIC\",\"BB.PA\",\"2472211692\",\"55.05\",\"France\"\n\"3232\",\"Neogen\",\"NEOG\",\"2471646976\",\"22.92\",\"United States\"\n\"3233\",\"Devyani International\",\"DEVYANI.NS\",\"2471362524\",\"2.05\",\"India\"\n\"3234\",\"ESAB\",\"ESAB\",\"2471011840\",\"41.16\",\"United States\"\n\"3235\",\"ACADIA Pharmaceuticals\",\"ACAD\",\"2469056512\",\"15.3\",\"United States\"\n\"3236\",\"Rotork\",\"ROR.L\",\"2468822385\",\"283.37\",\"United Kingdom\"\n\"3237\",\"Hub Group\",\"HUBG\",\"2467106048\",\"71.18\",\"United States\"\n\"3238\",\"Hatsun Agro Products\",\"HATSUN.NS\",\"2465325165\",\"11.43\",\"India\"\n\"3239\",\"Ingevity\",\"NGVT\",\"2462206720\",\"63.54\",\"United States\"\n\"3240\",\"Stagwell\",\"STGW\",\"2461396224\",\"5.15\",\"United States\"\n\"3241\",\"Baytex Energy\",\"BTE.TO\",\"2452717293\",\"4.31\",\"Canada\"\n\"3242\",\"Definitive Healthcare\",\"DH\",\"2452260352\",\"25.11\",\"United States\"\n\"3243\",\"U.S. Cellular\",\"USM\",\"2442678016\",\"28.55\",\"United States\"\n\"3244\",\"Travis Perkins\",\"TPK.L\",\"2442426046\",\"1129.46\",\"United Kingdom\"\n\"3245\",\"Eutelsat\",\"ETL.PA\",\"2441694279\",\"10.38\",\"France\"\n\"3246\",\"Ambarella\",\"AMBA\",\"2437780480\",\"63.95\",\"United States\"\n\"3247\",\"Forward Air\",\"FWRD\",\"2434744576\",\"90.64\",\"United States\"\n\"3248\",\"Groupe Lagardère\",\"MMB.PA\",\"2430159477\",\"17.29\",\"France\"\n\"3249\",\"Akbank\",\"AKBNK.IS\",\"2428227700\",\"0.47\",\"Turkey\"\n\"3250\",\"HUTCHMED\",\"HCM\",\"2427726592\",\"14.04\",\"Hong Kong\"\n\"3251\",\"Fulton Financial\",\"FULT\",\"2417537280\",\"14.48\",\"United States\"\n\"3252\",\"Frontier Airlines\",\"ULCC\",\"2417424896\",\"11.11\",\"United States\"\n\"3253\",\"Safehold\",\"SAFE\",\"2417278720\",\"39.03\",\"United States\"\n\"3254\",\"Ebro Foods\",\"EBRO.MC\",\"2416662910\",\"15.71\",\"Spain\"\n\"3255\",\"Ozon\",\"OZON.ME\",\"2416535296\",\"11.6\",\"United States\"\n\"3256\",\"Ultrapar Participacoes\",\"UGP\",\"2411359744\",\"2.22\",\"Brazil\"\n\"3257\",\"Krones\",\"KRN.F\",\"2407003383\",\"75.01\",\"Germany\"\n\"3258\",\"Entra\",\"ENTRA.OL\",\"2406614405\",\"13.22\",\"Norway\"\n\"3259\",\"Curevac\",\"CVAC\",\"2406375936\",\"12.86\",\"Germany\"\n\"3260\",\"Timken India\",\"TIMKEN.NS\",\"2405579864\",\"31.96\",\"India\"\n\"3261\",\"Fortis Healthcare\",\"FORTIS.NS\",\"2403786873\",\"3.18\",\"India\"\n\"3262\",\"Bank of India\",\"BANKINDIA.NS\",\"2399959585\",\"0.58\",\"India\"\n\"3263\",\"NETSCOUT\",\"NTCT\",\"2399931136\",\"32.38\",\"United States\"\n\"3264\",\"Covivio Hotels\",\"COVH.PA\",\"2390651045\",\"16.14\",\"France\"\n\"3265\",\"EnerSys\",\"ENS\",\"2387527168\",\"58.73\",\"United States\"\n\"3266\",\"Foot Locker\",\"FL\",\"2387500544\",\"25.26\",\"United States\"\n\"3267\",\"TreeHouse Foods\",\"THS\",\"2384155904\",\"42.56\",\"United States\"\n\"3268\",\"Herbalife\",\"HLF\",\"2381123072\",\"21.98\",\"United States\"\n\"3269\",\"Jungheinrich\",\"JUN3.F\",\"2380859463\",\"22.85\",\"Germany\"\n\"3270\",\"Tootsie Roll Industries\",\"TR\",\"2378635520\",\"35.06\",\"United States\"\n\"3271\",\"Owens &amp; Minor\",\"OMI\",\"2373468416\",\"31.19\",\"United States\"\n\"3272\",\"HighPeak Energy\",\"HPK\",\"2370694400\",\"21.83\",\"United States\"\n\"3273\",\"Grupo Aeroportuario Centro Norte\",\"OMAB\",\"2370115840\",\"49.1\",\"Mexico\"\n\"3274\",\"Shaftesbury\",\"SHB.L\",\"2369749085\",\"609.78\",\"United Kingdom\"\n\"3275\",\"Badger Meter\",\"BMI\",\"2369301248\",\"80.95\",\"United States\"\n\"3276\",\"Altra Industrial Motion\",\"AIMC\",\"2368801792\",\"36.41\",\"United States\"\n\"3277\",\"Victoria's Secret &amp; Co\",\"VSCO\",\"2364425216\",\"28.46\",\"United States\"\n\"3278\",\"Glaukos\",\"GKOS\",\"2362893312\",\"49.92\",\"United States\"\n\"3279\",\"Melco Resorts &amp; Entertainment\",\"MLCO\",\"2362139904\",\"5\",\"Hong Kong\"\n\"3280\",\"Assura Plc\",\"AGR.L\",\"2358249032\",\"79.28\",\"United Kingdom\"\n\"3281\",\"Grindwell Norton\",\"GRINDWELL.NS\",\"2358168311\",\"21.3\",\"India\"\n\"3282\",\"Millicom\",\"TIGO\",\"2357964800\",\"13.8\",\"Luxembourg\"\n\"3283\",\"Claros Mortgage Trust\",\"CMTG\",\"2354910464\",\"16.87\",\"United States\"\n\"3284\",\"Delek Group\",\"DLEKG.TA\",\"2352419044\",\"123.72\",\"Israel\"\n\"3285\",\"Blue Dart Express\",\"BLUEDART.NS\",\"2352153206\",\"99.13\",\"India\"\n\"3286\",\"Mandarin Oriental\",\"M04.SI\",\"2350519040\",\"1.86\",\"Hong Kong\"\n\"3287\",\"Focus Financial Partners\",\"FOCS\",\"2347817216\",\"35.92\",\"United States\"\n\"3288\",\"GCP Applied Technologies\",\"GCP\",\"2345051136\",\"31.69\",\"United States\"\n\"3289\",\"National Vision Holdings\",\"EYE\",\"2344136704\",\"28.79\",\"United States\"\n\"3290\",\"Krispy Kreme\",\"DNUT\",\"2338811904\",\"13.98\",\"United States\"\n\"3291\",\"Wienerberger\",\"WIB.F\",\"2335295324\",\"20.73\",\"Austria\"\n\"3292\",\"The a2 Milk Company\",\"ACOPY\",\"2335251200\",\"3.01\",\"New Zealand\"\n\"3293\",\"Cedar Fair\",\"FUN\",\"2334998016\",\"40.94\",\"United States\"\n\"3294\",\"Rambus\",\"RMBS\",\"2334798592\",\"21.18\",\"United States\"\n\"3295\",\"LGI Homes\",\"LGIH\",\"2333260544\",\"98.59\",\"United States\"\n\"3296\",\"SKF India\",\"SKFINDIA.NS\",\"2331995084\",\"47.17\",\"India\"\n\"3297\",\"Vicor\",\"VICR\",\"2329339904\",\"52.98\",\"United States\"\n\"3298\",\"EFG International\",\"EFGN.SW\",\"2328046407\",\"7.55\",\"Switzerland\"\n\"3299\",\"Ströer\",\"SAX.F\",\"2325405410\",\"40.24\",\"Germany\"\n\"3300\",\"PagerDuty\",\"PD\",\"2323756800\",\"26.46\",\"United States\"\n\"3301\",\"St. Joe Company\",\"JOE\",\"2322919936\",\"39.43\",\"United States\"\n\"3302\",\"Crestwood Equity Partners\",\"CEQP\",\"2321994752\",\"23.7\",\"United States\"\n\"3303\",\"WD-40 Company\",\"WDFC\",\"2314818304\",\"169.87\",\"United States\"\n\"3304\",\"Pebblebrook Hotel Trust\",\"PEB\",\"2313478400\",\"17.6\",\"United States\"\n\"3305\",\"Kosmos Energy\",\"KOS\",\"2311347968\",\"5.08\",\"United States\"\n\"3306\",\"Greggs\",\"GRG.L\",\"2309495865\",\"2263.19\",\"United Kingdom\"\n\"3307\",\"Flywire\",\"FLYW\",\"2308338944\",\"21.53\",\"United States\"\n\"3308\",\"Oatly\",\"OTLY\",\"2307930368\",\"3.9\",\"Sweden\"\n\"3309\",\"Euronav\",\"EURN\",\"2307400192\",\"11.44\",\"Belgium\"\n\"3310\",\"Golub Capital\",\"GBDC\",\"2305387008\",\"13.49\",\"United States\"\n\"3311\",\"Rubis\",\"RUI.PA\",\"2304122015\",\"22.39\",\"France\"\n\"3312\",\"IronSource\",\"IS\",\"2303054080\",\"2.26\",\"Israel\"\n\"3313\",\"Sembcorp Marine\",\"S51.SI\",\"2299649511\",\"0.07\",\"Singapore\"\n\"3314\",\"Columbia Bank\",\"COLB\",\"2297843200\",\"29.22\",\"United States\"\n\"3315\",\"Hays plc\",\"HAS.L\",\"2292624555\",\"138.6\",\"United Kingdom\"\n\"3316\",\"SJM Holdings\",\"0880.HK\",\"2287120833\",\"0.4\",\"Hong Kong\"\n\"3317\",\"Freshpet\",\"FRPT\",\"2285848832\",\"47.81\",\"United States\"\n\"3318\",\"Winpak\",\"WPK.TO\",\"2284590688\",\"35.15\",\"Canada\"\n\"3319\",\"Ameresco\",\"AMRC\",\"2283740928\",\"44.08\",\"United States\"\n\"3320\",\"Rajesh Exports\",\"RAJESHEXPO.NS\",\"2283671270\",\"7.73\",\"India\"\n\"3321\",\"Innospec\",\"IOSP\",\"2282998272\",\"92\",\"United States\"\n\"3322\",\"Korea Gas\",\"036460.KS\",\"2280852481\",\"26.57\",\"South Korea\"\n\"3323\",\"The Foschini Group\",\"TFG.JO\",\"2278977090\",\"7.07\",\"South Africa\"\n\"3324\",\"AEON REIT Investment\",\"3292.T\",\"2274842690\",\"1112.68\",\"Japan\"\n\"3325\",\"United Natural Foods\",\"UNFI\",\"2274561792\",\"39.02\",\"United States\"\n\"3326\",\"Cactus Wellhead\",\"WHD\",\"2274192896\",\"37.62\",\"United States\"\n\"3327\",\"Central Garden &amp; Pet\",\"CENT\",\"2269378048\",\"43.2\",\"United States\"\n\"3328\",\"Nordic Entertainment Group (NENT Group)\",\"NENT-B.ST\",\"2266194097\",\"29.27\",\"Sweden\"\n\"3329\",\"American Assets Trust\",\"AAT\",\"2265057280\",\"29.53\",\"United States\"\n\"3330\",\"OPC Energy\",\"OPCE.TA\",\"2265057076\",\"10.7\",\"Israel\"\n\"3331\",\"Interparfums\",\"IPAR\",\"2264649984\",\"71.12\",\"United States\"\n\"3332\",\"Virgin Money UK\",\"VMUK.L\",\"2260902452\",\"156.96\",\"United Kingdom\"\n\"3333\",\"Weber\",\"WEBR\",\"2260098816\",\"7.87\",\"United States\"\n\"3334\",\"Golar LNG\",\"GLNG\",\"2256949248\",\"20.9\",\"Bermuda\"\n\"3335\",\"Integer Holdings\",\"ITGR\",\"2252962816\",\"68.06\",\"United States\"\n\"3336\",\"Sanoma\",\"SAA1V.HE\",\"2251183686\",\"13.8\",\"Finland\"\n\"3337\",\"Globalstar\",\"GSAT\",\"2249999872\",\"1.25\",\"United States\"\n\"3338\",\"Chegg\",\"CHGG\",\"2249743872\",\"17.87\",\"United States\"\n\"3339\",\"Toho Gas\",\"9533.T\",\"2247322818\",\"21.38\",\"Japan\"\n\"3340\",\"Q2\",\"QTWO\",\"2245664000\",\"39.26\",\"United States\"\n\"3341\",\"Turkcell\",\"TKC\",\"2245541888\",\"2.57\",\"Turkey\"\n\"3342\",\"Sportradar\",\"SRAD\",\"2241889536\",\"7.55\",\"Switzerland\"\n\"3343\",\"Star Bulk Carriers\",\"SBLK\",\"2240695808\",\"21.82\",\"Greece\"\n\"3344\",\"Aurora Innovation\",\"AUR\",\"2240185344\",\"1.97\",\"United States\"\n\"3345\",\"Distell Group\",\"DGH.JO\",\"2236354550\",\"10.04\",\"South Africa\"\n\"3346\",\"UNITI\",\"UNIT\",\"2235909632\",\"9.43\",\"United States\"\n\"3347\",\"Kenon Holdings\",\"KEN\",\"2234580480\",\"41.47\",\"Singapore\"\n\"3348\",\"Alfen\",\"ALFEN.AS\",\"2233813012\",\"102.97\",\"Netherlands\"\n\"3349\",\"Jfrog\",\"FROG\",\"2232880128\",\"22.6\",\"United States\"\n\"3350\",\"Upstart\",\"UPST\",\"2230395904\",\"26.31\",\"United States\"\n\"3351\",\"Arbor Realty Trust\",\"ABR\",\"2230011904\",\"13.92\",\"United States\"\n\"3352\",\"AMP Limited\",\"AMP.AX\",\"2229953994\",\"0.68\",\"Australia\"\n\"3353\",\"Coursera\",\"COUR\",\"2227028480\",\"15.46\",\"United States\"\n\"3354\",\"Sunnova\",\"NOVA\",\"2226744064\",\"19.43\",\"United States\"\n\"3355\",\"Stepan Company\",\"SCL\",\"2226559744\",\"99.56\",\"United States\"\n\"3356\",\"Brady\",\"BRC\",\"2225751808\",\"44.32\",\"United States\"\n\"3357\",\"Chesapeake Utilities\",\"CPK\",\"2225485312\",\"125.54\",\"United States\"\n\"3358\",\"Four Corners Property Trust\",\"FCPT\",\"2224420352\",\"27.64\",\"United States\"\n\"3359\",\"Bavarian Nordic\",\"BAVA.CO\",\"2216915986\",\"31.52\",\"Denmark\"\n\"3360\",\"Plexus\",\"PLXS\",\"2208152832\",\"79.65\",\"United States\"\n\"3361\",\"Navient\",\"NAVI\",\"2207997696\",\"14.93\",\"United States\"\n\"3362\",\"Doosan Bobcat\",\"241560.KS\",\"2207232160\",\"22.02\",\"South Korea\"\n\"3363\",\"Kyndryl\",\"KD\",\"2205694720\",\"9.77\",\"United States\"\n\"3364\",\"Primary Health Properties\",\"PHP.L\",\"2205205282\",\"164.35\",\"United Kingdom\"\n\"3365\",\"LifeStance Health Group\",\"LFST\",\"2204762368\",\"5.89\",\"United States\"\n\"3366\",\"Grayscale Bitcoin Trust\",\"GBTC\",\"2203905024\",\"12.54\",\"United States\"\n\"3367\",\"MicroStrategy\",\"MSTR\",\"2203127552\",\"195.01\",\"United States\"\n\"3368\",\"MGP Ingredients\",\"MGPI\",\"2200768512\",\"100.1\",\"United States\"\n\"3369\",\"EVO Payments\",\"EVOP\",\"2197505024\",\"25.1\",\"United States\"\n\"3370\",\"Xerox\",\"XRX\",\"2195168768\",\"14.18\",\"United States\"\n\"3371\",\"Burford Capital\",\"BUR\",\"2194859264\",\"10.02\",\"Guernsey\"\n\"3372\",\"Ninety One Group\",\"N91.L\",\"2191659913\",\"232.5\",\"South Africa\"\n\"3373\",\"Harel Group\",\"HARL.TA\",\"2190735041\",\"10.13\",\"Israel\"\n\"3374\",\"ComfortDelGro\",\"C52.SI\",\"2188854263\",\"1.01\",\"Singapore\"\n\"3375\",\"Global Blood Therapeutics\",\"GBT\",\"2187624960\",\"33.61\",\"United States\"\n\"3376\",\"Vistry Group\",\"VTY.L\",\"2186404897\",\"999.06\",\"United Kingdom\"\n\"3377\",\"Jackson Financial\",\"JXN\",\"2184766976\",\"25.13\",\"United States\"\n\"3378\",\"SSP Group\",\"SSPG.L\",\"2184285638\",\"274.46\",\"United Kingdom\"\n\"3379\",\"Prestige Group\",\"PRESTIGE.NS\",\"2178806091\",\"5.44\",\"India\"\n\"3380\",\"Dr Lal PathLabs\",\"LALPATHLAB.NS\",\"2178620424\",\"26.14\",\"India\"\n\"3381\",\"Schrödinger\",\"SDGR\",\"2178251776\",\"30.62\",\"United States\"\n\"3382\",\"Electra\",\"ELTR.TA\",\"2176608320\",\"565.7\",\"Israel\"\n\"3383\",\"Liberty Oilfield Services\",\"LBRT\",\"2174207744\",\"11.64\",\"United States\"\n\"3384\",\"MVV Energie\",\"MVV1.F\",\"2173637695\",\"32.88\",\"Germany\"\n\"3385\",\"EQRx\",\"EQRX\",\"2172984064\",\"4.46\",\"United States\"\n\"3386\",\"Primo Water\",\"PRMW\",\"2171989504\",\"13.14\",\"United States\"\n\"3387\",\"CD Projekt\",\"CDR.WA\",\"2171712642\",\"21.56\",\"Poland\"\n\"3388\",\"Federal Signal\",\"FSS\",\"2171114752\",\"35.82\",\"United States\"\n\"3389\",\"Arcosa\",\"ACA\",\"2169617408\",\"44.9\",\"United States\"\n\"3390\",\"Sabancı Holding\",\"SAHOL.IS\",\"2167839522\",\"1.08\",\"Turkey\"\n\"3391\",\"Chimera Investment Corporation\",\"CIM\",\"2167804160\",\"9.15\",\"United States\"\n\"3392\",\"Axos Financial\",\"AX\",\"2164588032\",\"36.28\",\"United States\"\n\"3393\",\"Shutterstock\",\"SSTK\",\"2161164800\",\"59.07\",\"United States\"\n\"3394\",\"Nikola\",\"NKLA\",\"2160438016\",\"5.13\",\"United States\"\n\"3395\",\"Frontdoor\",\"FTDR\",\"2160094976\",\"26.26\",\"United States\"\n\"3396\",\"Alpha Metallurgical Resources\",\"AMR\",\"2159246848\",\"115.39\",\"United States\"\n\"3397\",\"Pan Ocean\",\"028670.KS\",\"2158524361\",\"4.04\",\"South Korea\"\n\"3398\",\"Green Thumb Industries\",\"GTII.CN\",\"2155667905\",\"8.96\",\"United States\"\n\"3399\",\"Hudson Pacific Properties\",\"HPP\",\"2155048704\",\"14.76\",\"United States\"\n\"3400\",\"Acer\",\"2353.TW\",\"2152198391\",\"0.72\",\"Taiwan\"\n\"3401\",\"Cyxtera Technologies\",\"CYXT\",\"2151720448\",\"12.05\",\"United States\"\n\"3402\",\"First Merchants Corporation\",\"FRME\",\"2148369408\",\"36.13\",\"United States\"\n\"3403\",\"Hanmi Pharmaceutical\",\"008930.KS\",\"2145326346\",\"31.89\",\"South Korea\"\n\"3404\",\"InMode\",\"INMD\",\"2143500800\",\"25.8\",\"Israel\"\n\"3405\",\"Super Group\",\"SGHC\",\"2142160768\",\"4.37\",\"Guernsey\"\n\"3406\",\"Twist Bioscience\",\"TWST\",\"2141407872\",\"38.06\",\"United States\"\n\"3407\",\"360 DigiTech\",\"QFIN\",\"2141021696\",\"13.79\",\"China\"\n\"3408\",\"CBIZ\",\"CBZ\",\"2140732672\",\"41.07\",\"United States\"\n\"3409\",\"Delek Logistics Partners\",\"DKL\",\"2139345664\",\"49.21\",\"United States\"\n\"3410\",\"Sun TV Network\",\"SUNTV.NS\",\"2137262304\",\"5.42\",\"India\"\n\"3411\",\"Nu Skin\",\"NUS\",\"2136931328\",\"42.56\",\"United States\"\n\"3412\",\"WH Smith\",\"SMWH.L\",\"2136474110\",\"1632.02\",\"United Kingdom\"\n\"3413\",\"Shimao Property\",\"0813.HK\",\"2136456868\",\"0.56\",\"Hong Kong\"\n\"3414\",\"Callon Petroleum\",\"CPE\",\"2133233408\",\"34.58\",\"United States\"\n\"3415\",\"JK Cement\",\"JKCEMENT.NS\",\"2133165068\",\"27.61\",\"India\"\n\"3416\",\"Excelerate Energy\",\"EE\",\"2131954560\",\"19.69\",\"United States\"\n\"3417\",\"MINISO Group\",\"MNSO\",\"2126360448\",\"6.94\",\"China\"\n\"3418\",\"Worthington Industries\",\"WOR\",\"2122914432\",\"43.88\",\"United States\"\n\"3419\",\"Compañía Cervecerías Unidas\",\"CCU\",\"2120941440\",\"11.48\",\"Chile\"\n\"3420\",\"CASIO\",\"6952.T\",\"2118268364\",\"8.86\",\"Japan\"\n\"3421\",\"Supermicro\",\"SMCI\",\"2116763264\",\"40.78\",\"United States\"\n\"3422\",\"Allegiant Air\",\"ALGT\",\"2110925568\",\"116.52\",\"United States\"\n\"3423\",\"Arch Resources\",\"ARCH\",\"2103378560\",\"135.9\",\"United States\"\n\"3424\",\"Kadant\",\"KAI\",\"2101723392\",\"180.26\",\"United States\"\n\"3425\",\"eXp World Holdings\",\"EXPI\",\"2100503168\",\"14.05\",\"United States\"\n\"3426\",\"HPH Trust (Hutchison Port)\",\"NS8U.SI\",\"2090664064\",\"0.24\",\"Singapore\"\n\"3427\",\"Itron\",\"ITRI\",\"2090412288\",\"46.39\",\"United States\"\n\"3428\",\"MillerKnoll\",\"MLKN\",\"2090365440\",\"27.58\",\"United States\"\n\"3429\",\"Revolve\",\"RVLV\",\"2089283712\",\"28.5\",\"United States\"\n\"3430\",\"Robertet\",\"CBE.PA\",\"2088357390\",\"790.35\",\"France\"\n\"3431\",\"Trulieve Cannabis\",\"TRUL.CN\",\"2085647695\",\"11.32\",\"United States\"\n\"3432\",\"Sunstone Hotel Investors\",\"SHO\",\"2084237952\",\"9.75\",\"United States\"\n\"3433\",\"Uniqa Insurance Group\",\"UN9.F\",\"2083586317\",\"6.55\",\"Austria\"\n\"3434\",\"Voltalia\",\"VLTSA.PA\",\"2081465211\",\"21.87\",\"France\"\n\"3435\",\"Keywords Studios\",\"KWS.L\",\"2079965691\",\"2702.99\",\"Ireland\"\n\"3436\",\"CompuGroup Medical\",\"COP.DE\",\"2077441931\",\"39.7\",\"Germany\"\n\"3437\",\"Yapı Kredi\",\"YKBNK.IS\",\"2077075347\",\"0.25\",\"Turkey\"\n\"3438\",\"Air Transport Services Group\",\"ATSG\",\"2074978816\",\"27.9\",\"United States\"\n\"3439\",\"Sage Therapeutics\",\"SAGE\",\"2064803200\",\"34.96\",\"United States\"\n\"3440\",\"CNO Financial Group\",\"CNO\",\"2063982976\",\"17.81\",\"United States\"\n\"3441\",\"Coca-Cola İçecek\",\"CCOLA.IS\",\"2059979058\",\"8.1\",\"Turkey\"\n\"3442\",\"Redrow\",\"RDW.L\",\"2059664220\",\"584.82\",\"United Kingdom\"\n\"3443\",\"Sabre\",\"SABR\",\"2059527296\",\"6.31\",\"United States\"\n\"3444\",\"Helios Technologies\",\"HLIO\",\"2059524992\",\"63.37\",\"United States\"\n\"3445\",\"CI Financial\",\"CIXX\",\"2056531456\",\"10.69\",\"Canada\"\n\"3446\",\"Luminar Technologies\",\"LAZR\",\"2053847296\",\"5.76\",\"United States\"\n\"3447\",\"Cracker Barrel\",\"CBRL\",\"2053480704\",\"90.11\",\"United States\"\n\"3448\",\"Lenzing\",\"LEN.F\",\"2052003974\",\"75.31\",\"Austria\"\n\"3449\",\"PowerSchool\",\"PWSC\",\"2049637120\",\"12.96\",\"United States\"\n\"3450\",\"Weis Markets\",\"WMK\",\"2049523584\",\"76.2\",\"United States\"\n\"3451\",\"Diversey\",\"DSEY\",\"2048887168\",\"6.32\",\"United Kingdom\"\n\"3452\",\"Siltronic\",\"WAF.F\",\"2048265524\",\"68.28\",\"Germany\"\n\"3453\",\"BioCryst Pharmaceuticals\",\"BCRX\",\"2045117184\",\"11.02\",\"United States\"\n\"3454\",\"Rosseti\",\"RSTI.ME\",\"2039412697\",\"0.01\",\"Russia\"\n\"3455\",\"Dana\",\"DAN\",\"2036126976\",\"14.06\",\"United States\"\n\"3456\",\"Software AG\",\"SOW.F\",\"2035284304\",\"27.51\",\"Germany\"\n\"3457\",\"Harmony Gold\",\"HMY\",\"2033890304\",\"3.15\",\"South Africa\"\n\"3458\",\"Seacoast Banking\",\"SBCF\",\"2031452800\",\"33.08\",\"United States\"\n\"3459\",\"Medifast\",\"MED\",\"2030567552\",\"176.36\",\"United States\"\n\"3460\",\"Apollo Medical Holdings\",\"AMEH\",\"2030304896\",\"45\",\"United States\"\n\"3461\",\"Macerich\",\"MAC\",\"2030076672\",\"9.04\",\"United States\"\n\"3462\",\"Golden Ocean Group\",\"GOGL\",\"2029748224\",\"10.05\",\"Bermuda\"\n\"3463\",\"Chorus\",\"CNU.NZ\",\"2026644674\",\"4.44\",\"New Zealand\"\n\"3464\",\"Energizer Holdings\",\"ENR\",\"2024933632\",\"28.42\",\"United States\"\n\"3465\",\"Gentherm\",\"THRM\",\"2023352960\",\"61.07\",\"United States\"\n\"3466\",\"Relay Therapeutics\",\"RLAY\",\"2022144000\",\"18.61\",\"United States\"\n\"3467\",\"Trainline\",\"TRN.L\",\"2022049605\",\"420.66\",\"United Kingdom\"\n\"3468\",\"Bachoco\",\"IBA\",\"2020499968\",\"40.41\",\"Mexico\"\n\"3469\",\"Ansell\",\"ANN.AX\",\"2019901781\",\"15.83\",\"Australia\"\n\"3470\",\"Jet2\",\"JET2.L\",\"2018407046\",\"940.46\",\"United Kingdom\"\n\"3471\",\"Empire State Realty Trust\",\"ESRT\",\"2018306304\",\"7.04\",\"United States\"\n\"3472\",\"Patria Investments\",\"PAX\",\"2018015872\",\"13.71\",\"Cayman Islands\"\n\"3473\",\"ams AG\",\"DQW1.F\",\"2017612967\",\"7.6\",\"Austria\"\n\"3474\",\"Hain Celestial\",\"HAIN\",\"2016851840\",\"22.46\",\"United States\"\n\"3475\",\"Minerals Technologies\",\"MTX\",\"2016517888\",\"61.17\",\"United States\"\n\"3476\",\"Kajaria Ceramics\",\"KAJARIACER.NS\",\"2011167658\",\"12.61\",\"India\"\n\"3477\",\"Olink Holding\",\"OLK\",\"2010374144\",\"16.88\",\"Sweden\"\n\"3478\",\"Red Rock Resorts\",\"RRR\",\"2008290176\",\"32.67\",\"United States\"\n\"3479\",\"Immofinanz\",\"IMO1.F\",\"2007386096\",\"14.26\",\"Austria\"\n\"3480\",\"Encore Wire\",\"WIRE\",\"2007096192\",\"101.74\",\"United States\"\n\"3481\",\"American Eagle Outfitters\",\"AEO\",\"2006566784\",\"11.85\",\"United States\"\n\"3482\",\"AeroVironment\",\"AVAV\",\"2005980288\",\"80.41\",\"United States\"\n\"3483\",\"TowneBank\",\"TOWN\",\"2003554560\",\"27.55\",\"United States\"\n\"3484\",\"Bowlero\",\"BOWL\",\"2003198336\",\"11.69\",\"United States\"\n\"3485\",\"Cavco Industries\",\"CVCO\",\"1997415040\",\"224.6\",\"United States\"\n\"3486\",\"TPG Capital\",\"TPG\",\"1997323392\",\"25.26\",\"United States\"\n\"3487\",\"Holly Energy Partners\",\"HEP\",\"1996487552\",\"15.79\",\"United States\"\n\"3488\",\"Yelp\",\"YELP\",\"1993977856\",\"28.14\",\"United States\"\n\"3489\",\"Formosa Sumco Technology\",\"3532.TW\",\"1988564145\",\"5.13\",\"Taiwan\"\n\"3490\",\"Boot Barn Holdings\",\"BOOT\",\"1987343872\",\"66.83\",\"United States\"\n\"3491\",\"Laureate Education\",\"LAUR\",\"1983807360\",\"11.5\",\"United States\"\n\"3492\",\"Aavas Financiers\",\"AAVAS.NS\",\"1982064155\",\"25.1\",\"India\"\n\"3493\",\"WaFd Bank\",\"WAFD\",\"1981762048\",\"30.35\",\"United States\"\n\"3494\",\"C3 AI\",\"AI\",\"1977988864\",\"18.46\",\"United States\"\n\"3495\",\"E2open\",\"ETWO\",\"1976555392\",\"6.56\",\"United States\"\n\"3496\",\"ContourGlobal\",\"GLO.L\",\"1975356816\",\"300.74\",\"United Kingdom\"\n\"3497\",\"Cranswick\",\"CWK.L\",\"1972416570\",\"3639.65\",\"United Kingdom\"\n\"3498\",\"Mednax\",\"MD\",\"1970364800\",\"22.58\",\"United States\"\n\"3499\",\"Kronos Worldwide\",\"KRO\",\"1969781632\",\"17.06\",\"United States\"\n\"3500\",\"Bread Financial\",\"BFH\",\"1969126784\",\"39.56\",\"United States\"\n\"3501\",\"Genus\",\"GNS.L\",\"1968006885\",\"2900.31\",\"United Kingdom\"\n\"3502\",\"Ballard Power Systems\",\"BLDP\",\"1967829632\",\"6.6\",\"Canada\"\n\"3503\",\"Retail Opportunity Investments\",\"ROIC\",\"1963649536\",\"15.81\",\"United States\"\n\"3504\",\"Fine Organics\",\"FINEORG.NS\",\"1962987062\",\"64.02\",\"India\"\n\"3505\",\"TRI Pointe Group\",\"TPH\",\"1962275712\",\"18.97\",\"United States\"\n\"3506\",\"Vtech\",\"0303.HK\",\"1961167102\",\"7.76\",\"Hong Kong\"\n\"3507\",\"PriceSmart\",\"PSMT\",\"1960492672\",\"63.5\",\"United States\"\n\"3508\",\"Park National Corp\",\"PRK\",\"1959828096\",\"120.61\",\"United States\"\n\"3509\",\"CSG International\",\"CSGS\",\"1956978560\",\"60.33\",\"United States\"\n\"3510\",\"Progress Software\",\"PRGS\",\"1956150912\",\"45.01\",\"United States\"\n\"3511\",\"Balfour Beatty\",\"BBY.L\",\"1955878615\",\"315.71\",\"United Kingdom\"\n\"3512\",\"Banner Bank\",\"BANR\",\"1955278464\",\"56.88\",\"United States\"\n\"3513\",\"ANGI Homeservices\",\"ANGI\",\"1954106496\",\"3.89\",\"United States\"\n\"3514\",\"LegalZoom\",\"LZ\",\"1953226496\",\"9.86\",\"United States\"\n\"3515\",\"Terex\",\"TEX\",\"1951488000\",\"28.16\",\"United States\"\n\"3516\",\"Kontoor Brands\",\"KTB\",\"1950199040\",\"34.81\",\"United States\"\n\"3517\",\"One Medical\",\"ONEM\",\"1948241920\",\"10.04\",\"United States\"\n\"3518\",\"mBank\",\"MBK.WA\",\"1944550463\",\"45.88\",\"Poland\"\n\"3519\",\"Toyo Tire\",\"5105.T\",\"1942732508\",\"12.62\",\"Japan\"\n\"3520\",\"ViaSat\",\"VSAT\",\"1942061312\",\"26.09\",\"United States\"\n\"3521\",\"GMS\",\"GMS\",\"1941713280\",\"45.53\",\"United States\"\n\"3522\",\"O-I Glass\",\"OI\",\"1940202752\",\"12.42\",\"United States\"\n\"3523\",\"Genworth Financial\",\"GNW\",\"1937366528\",\"3.8\",\"United States\"\n\"3524\",\"TeamViewer\",\"TMV.DE\",\"1937317647\",\"9.63\",\"Germany\"\n\"3525\",\"LiveRamp\",\"RAMP\",\"1937099648\",\"27.96\",\"United States\"\n\"3526\",\"NexTier Oilfield\",\"NEX\",\"1932765184\",\"7.92\",\"United States\"\n\"3527\",\"TuSimple\",\"TSP\",\"1932626048\",\"8.65\",\"United States\"\n\"3528\",\"AtriCure\",\"ATRC\",\"1931593984\",\"41.73\",\"United States\"\n\"3529\",\"Duck Creek Technologies\",\"DCT\",\"1926256640\",\"14.53\",\"United States\"\n\"3530\",\"Edgewell Personal Care\",\"EPC\",\"1925439488\",\"36.47\",\"United States\"\n\"3531\",\"Canada Goose\",\"GOOS\",\"1924352896\",\"17.4\",\"Canada\"\n\"3532\",\"NOS\",\"PMV.F\",\"1923965619\",\"3.74\",\"Portugal\"\n\"3533\",\"ZipRecruiter\",\"ZIP\",\"1922280192\",\"16.31\",\"United States\"\n\"3534\",\"Piper Sandler\",\"PIPR\",\"1920263424\",\"107.82\",\"United States\"\n\"3535\",\"Doosan Fuel Cell\",\"336260.KS\",\"1920080814\",\"22.29\",\"South Korea\"\n\"3536\",\"Arcus Biosciences\",\"RCUS\",\"1919189760\",\"26.76\",\"United States\"\n\"3537\",\"First Advantage\",\"FA\",\"1918164736\",\"12.54\",\"United States\"\n\"3538\",\"EverCommerce\",\"EVCM\",\"1916899584\",\"9.8\",\"United States\"\n\"3539\",\"Cargojet\",\"CJT.TO\",\"1916505891\",\"102.7\",\"Canada\"\n\"3540\",\"Dunelm Group\",\"DNLM.L\",\"1915723444\",\"939.03\",\"United Kingdom\"\n\"3541\",\"Fortress Transportation\",\"FTAI\",\"1915526272\",\"19.28\",\"United States\"\n\"3542\",\"InterDigital\",\"IDCC\",\"1912705152\",\"61.96\",\"United States\"\n\"3543\",\"Ramco Cements\",\"RAMCOCEM.NS\",\"1912138099\",\"8.09\",\"India\"\n\"3544\",\"Beyond Meat\",\"BYND\",\"1907333248\",\"30.02\",\"United States\"\n\"3545\",\"Playtech\",\"PTEC.L\",\"1906533899\",\"637.12\",\"Isle of Man\"\n\"3546\",\"Hecla Mining\",\"HL\",\"1905674880\",\"3.52\",\"United States\"\n\"3547\",\"Transocean\",\"RIG\",\"1903551616\",\"2.8\",\"Switzerland\"\n\"3548\",\"Goosehead Insurance\",\"GSHD\",\"1900541312\",\"51.19\",\"United States\"\n\"3549\",\"Silvergate Capital\",\"SI\",\"1898660736\",\"60.02\",\"United States\"\n\"3550\",\"Kennametal\",\"KMT\",\"1898204032\",\"22.97\",\"United States\"\n\"3551\",\"DCM Shriram\",\"DCMSHRIRAM.NS\",\"1895379057\",\"12.13\",\"India\"\n\"3552\",\"TechTarget\",\"TTGT\",\"1895362688\",\"64.14\",\"United States\"\n\"3553\",\"WesBanco\",\"WSBC\",\"1892013440\",\"31.39\",\"United States\"\n\"3554\",\"Cinemark Theatres\",\"CNK\",\"1889844736\",\"15.69\",\"United States\"\n\"3555\",\"Jumbo S.A.\",\"5JB.F\",\"1888941241\",\"13.57\",\"Greece\"\n\"3556\",\"SJW Group\",\"SJW\",\"1888911616\",\"62.47\",\"United States\"\n\"3557\",\"Babcock International Group\",\"BAB.L\",\"1888273637\",\"373.47\",\"United Kingdom\"\n\"3558\",\"RLJ Lodging Trust\",\"RLJ\",\"1883992704\",\"11.24\",\"United States\"\n\"3559\",\"The Beauty Health Company\",\"SKIN\",\"1883653120\",\"12.51\",\"United States\"\n\"3560\",\"Sanofi India Limited\",\"SANOFI.NS\",\"1882909512\",\"81.68\",\"India\"\n\"3561\",\"Flagstar Bank\",\"FBC\",\"1882235392\",\"35.35\",\"United States\"\n\"3562\",\"Maxar Technologies\",\"MAXR\",\"1881847040\",\"25.53\",\"United States\"\n\"3563\",\"ArcBest\",\"ARCB\",\"1881365888\",\"76.84\",\"United States\"\n\"3564\",\"Elkem\",\"ELK.OL\",\"1879287223\",\"2.92\",\"Norway\"\n\"3565\",\"Boral\",\"BLD.AX\",\"1879123239\",\"1.7\",\"Australia\"\n\"3566\",\"Plus500\",\"P55.F\",\"1878608571\",\"18.9\",\"Israel\"\n\"3567\",\"KAR Auction Services\",\"KAR\",\"1876469504\",\"15.44\",\"United States\"\n\"3568\",\"FB Financial\",\"FBK\",\"1876402304\",\"39.73\",\"United States\"\n\"3569\",\"BayWa\",\"BYW.F\",\"1873804935\",\"54.5\",\"Germany\"\n\"3570\",\"Victrex\",\"VCT.L\",\"1872514068\",\"2152.65\",\"United Kingdom\"\n\"3571\",\"Qt Group\",\"QTCOM.HE\",\"1869140690\",\"75.01\",\"Finland\"\n\"3572\",\"Trustmark\",\"TRMK\",\"1868493440\",\"30.4\",\"United States\"\n\"3573\",\"Carborundum Universal\",\"CARBORUNIV.NS\",\"1865410277\",\"9.82\",\"India\"\n\"3574\",\"First Financial Bank\",\"FFBC\",\"1863350400\",\"19.73\",\"United States\"\n\"3575\",\"ProSiebenSat.1 Media\",\"PSM.F\",\"1860502331\",\"8.22\",\"Germany\"\n\"3576\",\"McGrath RentCorp\",\"MGRC\",\"1860475392\",\"76.42\",\"United States\"\n\"3577\",\"WABCO India\",\"WABCOINDIA.NS\",\"1857603686\",\"97.94\",\"India\"\n\"3578\",\"Usiminas\",\"USIM5.SA\",\"1854462336\",\"1.54\",\"Brazil\"\n\"3579\",\"Mueller Water Products\",\"MWA\",\"1853680128\",\"11.81\",\"United States\"\n\"3580\",\"Trinity Industries\",\"TRN\",\"1851861376\",\"22.22\",\"United States\"\n\"3581\",\"Top Glove\",\"BVA.SI\",\"1851011287\",\"0.23\",\"Malaysia\"\n\"3582\",\"Masonite\",\"DOOR\",\"1850329984\",\"82\",\"United States\"\n\"3583\",\"TaskUs\",\"TASK\",\"1847597696\",\"18.9\",\"United States\"\n\"3584\",\"Shoals Technologies\",\"SHLS\",\"1847343232\",\"16.44\",\"United States\"\n\"3585\",\"Tofaş Türk Otomobil Fabrikası\",\"TOASO.IS\",\"1847087691\",\"3.69\",\"Turkey\"\n\"3586\",\"Rocket Lab\",\"RKLB\",\"1846496512\",\"3.98\",\"United States\"\n\"3587\",\"OPKO Health\",\"OPK\",\"1844672000\",\"2.71\",\"United States\"\n\"3588\",\"Indian Energy Exchange\",\"IEX.NS\",\"1842370716\",\"2.05\",\"India\"\n\"3589\",\"Scorpio Tankers\",\"STNG\",\"1841431040\",\"31\",\"Monaco\"\n\"3590\",\"CareTrust REIT\",\"CTRE\",\"1840634496\",\"18.97\",\"United States\"\n\"3591\",\"Gerresheimer\",\"GXI.F\",\"1840351051\",\"58.27\",\"Germany\"\n\"3592\",\"Close Brothers Group\",\"CBG.L\",\"1834643845\",\"1204.1\",\"United Kingdom\"\n\"3593\",\"Ironwood Pharmaceuticals\",\"IRWD\",\"1833364352\",\"11.92\",\"United States\"\n\"3594\",\"Canadian Solar\",\"CSIQ\",\"1829996288\",\"28.47\",\"Canada\"\n\"3595\",\"ForgeRock\",\"FORG\",\"1829740416\",\"21.71\",\"United States\"\n\"3596\",\"Nutex Health\",\"NUTX\",\"1825698944\",\"2.82\",\"United States\"\n\"3597\",\"KWS\",\"KWS.F\",\"1825037772\",\"55.3\",\"Germany\"\n\"3598\",\"JOYY\",\"YY\",\"1824529792\",\"25.46\",\"China\"\n\"3599\",\"Urban Edge Properties\",\"UE\",\"1824221824\",\"14.9\",\"United States\"\n\"3600\",\"ICF\",\"ICFI\",\"1819210880\",\"96.8\",\"United States\"\n\"3601\",\"Six Flags\",\"SIX\",\"1816167424\",\"21.01\",\"United States\"\n\"3602\",\"Constellium\",\"CSTM\",\"1814882304\",\"12.81\",\"France\"\n\"3603\",\"Stock Yards Bancorp\",\"SYBT\",\"1812795648\",\"62.03\",\"United States\"\n\"3604\",\"Österreichische Post\",\"POST.VI\",\"1810233018\",\"26.8\",\"Austria\"\n\"3605\",\"NV5 Global\",\"NVEE\",\"1809099648\",\"116.75\",\"United States\"\n\"3606\",\"Osisko Gold Royalties\",\"OR\",\"1808365184\",\"9.78\",\"Canada\"\n\"3607\",\"Sinch\",\"SINCH.ST\",\"1807343123\",\"2.16\",\"Sweden\"\n\"3608\",\"Urban Outfitters\",\"URBN\",\"1806961664\",\"19.5\",\"United States\"\n\"3609\",\"Paradox Interactive\",\"PDX.ST\",\"1806844178\",\"16.81\",\"Sweden\"\n\"3610\",\"Alembic Pharmaceuticals\",\"APLLTD.NS\",\"1803129525\",\"9.17\",\"India\"\n\"3611\",\"Xencor\",\"XNCR\",\"1799981824\",\"30.23\",\"United States\"\n\"3612\",\"NW Natural\",\"NWN\",\"1799291136\",\"52.53\",\"United States\"\n\"3613\",\"GrafTech\",\"EAF\",\"1795545600\",\"6.9\",\"United States\"\n\"3614\",\"Philip Morris ČR\",\"TBK.F\",\"1794372601\",\"653.59\",\"Czech Republic\"\n\"3615\",\"NexGen Energy\",\"NXE\",\"1794371712\",\"3.59\",\"Canada\"\n\"3616\",\"Kemira\",\"KEMIRA.HE\",\"1793194023\",\"11.49\",\"Finland\"\n\"3617\",\"Orange Polska\",\"TPA1.F\",\"1792699656\",\"1.32\",\"Poland\"\n\"3618\",\"Washington Real Estate Investment Trust\",\"WRE\",\"1791354624\",\"20.49\",\"United States\"\n\"3619\",\"Rattler Midstream\",\"RTLR\",\"1790941440\",\"12.27\",\"United States\"\n\"3620\",\"Iovance Biotherapeutics\",\"IOVA\",\"1788571904\",\"11.38\",\"United States\"\n\"3621\",\"Verano Holdings\",\"VRNOF\",\"1787499136\",\"5.86\",\"United States\"\n\"3622\",\"Spirent\",\"SPT.L\",\"1785874550\",\"291.93\",\"United Kingdom\"\n\"3623\",\"Compass\",\"COMP\",\"1784717824\",\"4.18\",\"United States\"\n\"3624\",\"IIFL Wealth Management\",\"IIFLWAM.NS\",\"1784458796\",\"20.07\",\"India\"\n\"3625\",\"secunet\",\"YSN.F\",\"1782446399\",\"275.52\",\"Germany\"\n\"3626\",\"SIGNA Sports United\",\"SSU\",\"1780395008\",\"5.28\",\"Germany\"\n\"3627\",\"Telecom Argentina\",\"TEO\",\"1778517248\",\"4.13\",\"Argentina\"\n\"3628\",\"Hexaware Technologies\",\"HEXAWARE.NS\",\"1778195381\",\"5.92\",\"India\"\n\"3629\",\"MONETA Money Bank\",\"MM0.F\",\"1777379169\",\"3.42\",\"Czech Republic\"\n\"3630\",\"Northern Oil and Gas\",\"NOG\",\"1773795712\",\"22.27\",\"United States\"\n\"3631\",\"Diamondrock Hospitality Company\",\"DRH\",\"1773283328\",\"8.38\",\"United States\"\n\"3632\",\"Shufersal\",\"SAE.TA\",\"1772469974\",\"6.63\",\"Israel\"\n\"3633\",\"First Majestic Silver\",\"AG\",\"1771575168\",\"6.74\",\"Canada\"\n\"3634\",\"InvenTrust Properties\",\"IVT\",\"1768953472\",\"26.25\",\"United States\"\n\"3635\",\"Cannae Holdings\",\"CNNE\",\"1768800256\",\"20.83\",\"United States\"\n\"3636\",\"Triple Flag Precious Metals\",\"TFPM.TO\",\"1768764865\",\"11.34\",\"Canada\"\n\"3637\",\"SolarWinds\",\"SWI\",\"1767248128\",\"11.01\",\"United States\"\n\"3638\",\"Konecranes\",\"KCR.HE\",\"1765626208\",\"22.3\",\"Finland\"\n\"3639\",\"Heartland Financial USA\",\"HTLF\",\"1765354368\",\"41.67\",\"United States\"\n\"3640\",\"Goodman Property Trust\",\"GMT.NZ\",\"1765256829\",\"1.26\",\"New Zealand\"\n\"3641\",\"Fever-Tree Drinks\",\"FEVR.L\",\"1764259592\",\"1513.58\",\"United Kingdom\"\n\"3642\",\"K12\",\"LRN\",\"1762274560\",\"41.22\",\"United States\"\n\"3643\",\"Dynavax Technologies\",\"DVAX\",\"1762052352\",\"13.95\",\"United States\"\n\"3644\",\"Bukalapak.com\",\"BUKA.JK\",\"1760685549\",\"0.02\",\"Indonesia\"\n\"3645\",\"Türk Telekom\",\"TTKOM.IS\",\"1759639644\",\"0.5\",\"Turkey\"\n\"3646\",\"Krystal Biotech\",\"KRYS\",\"1758057728\",\"68.58\",\"United States\"\n\"3647\",\"Centerra Gold\",\"CGAU\",\"1757953152\",\"5.91\",\"Canada\"\n\"3648\",\"Sandy Spring Bank\",\"SASR\",\"1754851840\",\"38.79\",\"United States\"\n\"3649\",\"Minera Valparaíso\",\"MINERA.SN\",\"1754824538\",\"14.04\",\"Chile\"\n\"3650\",\"Genesis Energy\",\"GNE.NZ\",\"1752510555\",\"1.67\",\"New Zealand\"\n\"3651\",\"Itaú CorpBanca\",\"ITCB\",\"1752267392\",\"2.7\",\"Chile\"\n\"3652\",\"Amphastar Pharmaceuticals\",\"AMPH\",\"1748688000\",\"35.81\",\"United States\"\n\"3653\",\"Lakeland Financial Corp\",\"LKFN\",\"1748120576\",\"68.97\",\"United States\"\n\"3654\",\"Veracyte\",\"VCYT\",\"1747551872\",\"24.46\",\"United States\"\n\"3655\",\"Telephone and Data Systems\",\"TDS\",\"1747497472\",\"15.25\",\"United States\"\n\"3656\",\"Ashmore Group\",\"ASHM.L\",\"1743895285\",\"237.97\",\"United Kingdom\"\n\"3657\",\"Hercules Capital\",\"HTGC\",\"1740499968\",\"14.05\",\"United States\"\n\"3658\",\"Great Portland Estates\",\"GPE.L\",\"1738139857\",\"684.66\",\"United Kingdom\"\n\"3659\",\"Plantronics\",\"POLY\",\"1736634112\",\"39.74\",\"United States\"\n\"3660\",\"Cargotec\",\"CGCBV.HE\",\"1735708831\",\"25.6\",\"Finland\"\n\"3661\",\"Immunocore\",\"IMCR\",\"1734374400\",\"39.51\",\"United Kingdom\"\n\"3662\",\"Jasa Marga\",\"JSMR.JK\",\"1733945566\",\"0.24\",\"Indonesia\"\n\"3663\",\"ESCO Technologies\",\"ESE\",\"1732785792\",\"67.03\",\"United States\"\n\"3664\",\"CONSOL Energy\",\"CEIX\",\"1732021376\",\"49.75\",\"United States\"\n\"3665\",\"Aareal Bank\",\"ARL.F\",\"1723741442\",\"28.56\",\"Germany\"\n\"3666\",\"Axcelis Technologies\",\"ACLS\",\"1723334656\",\"52.19\",\"United States\"\n\"3667\",\"Manchester United\",\"MANU\",\"1722941696\",\"10.57\",\"United Kingdom\"\n\"3668\",\"Asahi India Glass\",\"ASAHIINDIA.NS\",\"1722860745\",\"7.09\",\"India\"\n\"3669\",\"Virgin Galactic\",\"SPCE\",\"1720916480\",\"6.66\",\"United States\"\n\"3670\",\"Paramount Group\",\"PGRE\",\"1719552384\",\"7.17\",\"United States\"\n\"3671\",\"Pets at Home\",\"PETS.L\",\"1718229405\",\"343.02\",\"United Kingdom\"\n\"3672\",\"Kainos Group\",\"KNOS.L\",\"1716757836\",\"1383.59\",\"United Kingdom\"\n\"3673\",\"Fulgent Genetics\",\"FLGT\",\"1716216192\",\"56.59\",\"United States\"\n\"3674\",\"Olav Thon\",\"OLT.OL\",\"1715824302\",\"16.56\",\"Norway\"\n\"3675\",\"Xenon Pharmaceuticals\",\"XENE\",\"1714251904\",\"32.28\",\"Canada\"\n\"3676\",\"Gogo Inflight Internet\",\"GOGO\",\"1711390592\",\"15.28\",\"United States\"\n\"3677\",\"Adtalem Global Education\",\"ATGE\",\"1711390080\",\"37.91\",\"United States\"\n\"3678\",\"Olo\",\"OLO\",\"1710647552\",\"10.68\",\"United States\"\n\"3679\",\"Hilltop Holdings\",\"HTH\",\"1707892480\",\"26.45\",\"United States\"\n\"3680\",\"Pigeon\",\"7956.T\",\"1705981319\",\"14.26\",\"Japan\"\n\"3681\",\"New India Assurance\",\"NIACL.NS\",\"1705871114\",\"1.04\",\"India\"\n\"3682\",\"Ingles Markets\",\"IMKTA\",\"1705507200\",\"89.79\",\"United States\"\n\"3683\",\"Atlas Air Worldwide Holdings\",\"AAWW\",\"1705237376\",\"60.49\",\"United States\"\n\"3684\",\"CryoPort\",\"CYRX\",\"1698054400\",\"34.39\",\"United States\"\n\"3685\",\"Provident Financial Services\",\"PFS\",\"1697094784\",\"22.5\",\"United States\"\n\"3686\",\"Xenia Hotels &amp; Resorts\",\"XHR\",\"1696998528\",\"14.84\",\"United States\"\n\"3687\",\"Madison Square Garden\",\"MSGE\",\"1696793728\",\"49.6\",\"United States\"\n\"3688\",\"KPIT Technologies\",\"KPITTECH.NS\",\"1695211664\",\"6.18\",\"India\"\n\"3689\",\"Semrush\",\"SEMR\",\"1691741056\",\"11.99\",\"United States\"\n\"3690\",\"Shake Shack\",\"SHAK\",\"1691114240\",\"40.14\",\"United States\"\n\"3691\",\"Vertex\",\"VERX\",\"1689601024\",\"11.31\",\"United States\"\n\"3692\",\"Quilter\",\"QLT.L\",\"1689024275\",\"120.29\",\"United Kingdom\"\n\"3693\",\"Ping Identity Holding\",\"PING\",\"1686947328\",\"19.78\",\"United States\"\n\"3694\",\"Shop Apotheke Europe\",\"SAE.F\",\"1685226377\",\"91.8\",\"Netherlands\"\n\"3695\",\"Perimeter Solutions\",\"PRM\",\"1683769088\",\"10.32\",\"United States\"\n\"3696\",\"Corbion\",\"CRBN.AS\",\"1683447505\",\"28.56\",\"Netherlands\"\n\"3697\",\"TANLA\",\"TANLA.NS\",\"1682294747\",\"12.39\",\"India\"\n\"3698\",\"Allscripts\",\"MDRX\",\"1682290048\",\"14.5\",\"United States\"\n\"3699\",\"N-Able\",\"NABL\",\"1682261376\",\"9.35\",\"United States\"\n\"3700\",\"XL Axiata\",\"E5F.F\",\"1682148070\",\"0.13\",\"Indonesia\"\n\"3701\",\"Hope Bancorp\",\"HOPE\",\"1681932160\",\"13.97\",\"United States\"\n\"3702\",\"CSW Industrials\",\"CSWI\",\"1678828416\",\"107.09\",\"United States\"\n\"3703\",\"Winnebago Industries\",\"WGO\",\"1674070912\",\"52.72\",\"United States\"\n\"3704\",\"National Aluminum &amp; Alloy\",\"NATIONALUM.NS\",\"1673590464\",\"0.91\",\"India\"\n\"3705\",\"Strategic Education\",\"STRA\",\"1672085504\",\"67\",\"United States\"\n\"3706\",\"Faraday Future\",\"FFIE\",\"1671591808\",\"5.53\",\"United States\"\n\"3707\",\"B&amp;G Foods\",\"BGS\",\"1671357568\",\"23.34\",\"United States\"\n\"3708\",\"Xometry\",\"XMTR\",\"1667821952\",\"35.5\",\"United States\"\n\"3709\",\"Array Technologies\",\"ARRY\",\"1666942592\",\"11.1\",\"United States\"\n\"3710\",\"Kratos Defense &amp; Security Solutions\",\"KTOS\",\"1666223360\",\"13.33\",\"United States\"\n\"3711\",\"Amplitude\",\"AMPL\",\"1666108800\",\"14.94\",\"United States\"\n\"3712\",\"Nevro\",\"NVRO\",\"1664305024\",\"47.2\",\"United States\"\n\"3713\",\"Fortune REIT\",\"0778.HK\",\"1663040541\",\"0.84\",\"Hong Kong\"\n\"3714\",\"ImmunityBio\",\"IBRX\",\"1661470464\",\"4.18\",\"United States\"\n\"3715\",\"Birchcliff Energy\",\"BIR.TO\",\"1661247185\",\"6.28\",\"Canada\"\n\"3716\",\"e.l.f. Cosmetics\",\"ELF\",\"1660706816\",\"31.77\",\"United States\"\n\"3717\",\"Two Harbors Investment\",\"TWO\",\"1660489984\",\"4.83\",\"United States\"\n\"3718\",\"RWS Holdings\",\"RWS.L\",\"1659980268\",\"426.25\",\"United Kingdom\"\n\"3719\",\"Diagnosticos da America\",\"DASA3.SA\",\"1657927055\",\"2.96\",\"Brazil\"\n\"3720\",\"EVgo\",\"EVGO\",\"1657673088\",\"6.26\",\"United States\"\n\"3721\",\"Outokumpu\",\"OUT1V.HE\",\"1657433066\",\"3.66\",\"Finland\"\n\"3722\",\"Alvotech\",\"ALVO\",\"1656820096\",\"6.8\",\"Iceland\"\n\"3723\",\"Wolverine World Wide\",\"WWW\",\"1656661760\",\"20.52\",\"United States\"\n\"3724\",\"Tokai Carbon\",\"5301.T\",\"1656434850\",\"7.36\",\"Japan\"\n\"3725\",\"Great Eagle\",\"0041.HK\",\"1655518803\",\"2.21\",\"Hong Kong\"\n\"3726\",\"Kindred Group\",\"KIND-SDB.ST\",\"1654362148\",\"7.43\",\"Malta\"\n\"3727\",\"Impinj\",\"PI\",\"1653559168\",\"65.15\",\"United States\"\n\"3728\",\"PageGroup\",\"PAGE.L\",\"1650731538\",\"502.32\",\"United Kingdom\"\n\"3729\",\"Pactiv Evergreen\",\"PTVE\",\"1650535680\",\"9.29\",\"United States\"\n\"3730\",\"Apollo Tyres\",\"APOLLOTYRE.NS\",\"1649099365\",\"2.6\",\"India\"\n\"3731\",\"Axsome Therapeutics\",\"AXSM\",\"1648380160\",\"42.36\",\"United States\"\n\"3732\",\"Guaranty Trust Bank\",\"9JO.F\",\"1648136000\",\"2.8\",\"Nigeria\"\n\"3733\",\"Frontline\",\"FRO\",\"1646565888\",\"8.09\",\"Bermuda\"\n\"3734\",\"USA Compression Partners\",\"USAC\",\"1643730432\",\"16.88\",\"United States\"\n\"3735\",\"AUTO1\",\"AG1.F\",\"1643065790\",\"7.63\",\"Germany\"\n\"3736\",\"Noble Corporation\",\"NE\",\"1641848960\",\"25.25\",\"United Kingdom\"\n\"3737\",\"Victory Capital\",\"VCTR\",\"1641802112\",\"23.94\",\"United States\"\n\"3738\",\"NBT Bancorp\",\"NBTB\",\"1638419456\",\"38.26\",\"United States\"\n\"3739\",\"Hillman Solutions\",\"HLMN\",\"1636996480\",\"8.43\",\"United States\"\n\"3740\",\"Century Communities\",\"CCS\",\"1634851072\",\"49.66\",\"United States\"\n\"3741\",\"Tellurian\",\"TELL\",\"1633641088\",\"2.88\",\"United States\"\n\"3742\",\"Sterling Check\",\"STER\",\"1633064448\",\"16.97\",\"United States\"\n\"3743\",\"Credo Technology\",\"CRDO\",\"1632490368\",\"11.24\",\"United States\"\n\"3744\",\"DeNA\",\"2432.T\",\"1632241623\",\"13.77\",\"Japan\"\n\"3745\",\"Renasant Corp\",\"RNST\",\"1631723904\",\"29.19\",\"United States\"\n\"3746\",\"IIFL Finance\",\"IIFL.NS\",\"1630341264\",\"4.29\",\"India\"\n\"3747\",\"Paymentus\",\"PAY\",\"1626424960\",\"13.4\",\"United States\"\n\"3748\",\"EnPro Industries\",\"NPO\",\"1624911744\",\"78.12\",\"United States\"\n\"3749\",\"DSME (Daewoo Shipbuilding)\",\"042660.KS\",\"1624344363\",\"15.14\",\"South Korea\"\n\"3750\",\"Preferred Apartment Communities\",\"APTS\",\"1624227456\",\"25\",\"United States\"\n\"3751\",\"Northwest Bank\",\"NWBI\",\"1623788544\",\"12.82\",\"United States\"\n\"3752\",\"Compass Diversified Holdings\",\"CODI\",\"1623433856\",\"23.14\",\"United States\"\n\"3753\",\"Tivity Health\",\"TVTY\",\"1622802944\",\"32.5\",\"United States\"\n\"3754\",\"Aurinia Pharmaceuticals\",\"AUPH\",\"1621528448\",\"11.44\",\"Canada\"\n\"3755\",\"Exide Industries\",\"EXIDEIND.NS\",\"1617510174\",\"1.9\",\"India\"\n\"3756\",\"Tanger Factory Outlet Centers\",\"SKT\",\"1615508864\",\"14.8\",\"United States\"\n\"3757\",\"Knowles\",\"KN\",\"1613961600\",\"17.59\",\"United States\"\n\"3758\",\"Albioma\",\"ABIO.PA\",\"1612676312\",\"50.16\",\"France\"\n\"3759\",\"TODA corp\",\"1860.T\",\"1608687770\",\"5.22\",\"Japan\"\n\"3760\",\"Vector Group\",\"VGR\",\"1608256512\",\"10.38\",\"United States\"\n\"3761\",\"Bharat Dynamics\",\"BDL.NS\",\"1604642198\",\"8.76\",\"India\"\n\"3762\",\"Helios Towers\",\"HTWS.L\",\"1603223545\",\"152.98\",\"United Kingdom\"\n\"3763\",\"Acadia Realty Trust\",\"AKR\",\"1602992000\",\"16\",\"United States\"\n\"3764\",\"Liberty Latin America\",\"LILA\",\"1599785472\",\"7.07\",\"United States\"\n\"3765\",\"Sheela Foam\",\"SFL.NS\",\"1599448787\",\"32.71\",\"India\"\n\"3766\",\"Bank of N. T. Butterfield & Son\",\"NTB\",\"1597959296\",\"32.22\",\"Bermuda\"\n\"3767\",\"StoneX Group\",\"SNEX\",\"1597886720\",\"79.15\",\"United States\"\n\"3768\",\"Tenneco\",\"TEN\",\"1596728832\",\"19.15\",\"United States\"\n\"3769\",\"Everi Holdings\",\"EVRI\",\"1596550656\",\"17.32\",\"United States\"\n\"3770\",\"StepStone Group\",\"STEP\",\"1593342208\",\"26.06\",\"United States\"\n\"3771\",\"Digital Turbine\",\"APPS\",\"1591032576\",\"16.17\",\"United States\"\n\"3772\",\"Life Healthcare Group\",\"LHC.JO\",\"1589892726\",\"1.09\",\"South Africa\"\n\"3773\",\"Sparkassen Immobilien\",\"T1L.F\",\"1588436625\",\"22.47\",\"Austria\"\n\"3774\",\"WideOpenWest\",\"WOW\",\"1587429504\",\"18.08\",\"United States\"\n\"3775\",\"Gray Television\",\"GTN\",\"1586759808\",\"16.63\",\"United States\"\n\"3776\",\"Piedmont Office Realty Trust\",\"PDM\",\"1584803456\",\"12.85\",\"United States\"\n\"3777\",\"Delek US\",\"DK\",\"1582568064\",\"22.37\",\"United States\"\n\"3778\",\"Brandywine Realty Trust\",\"BDN\",\"1582319872\",\"9.18\",\"United States\"\n\"3779\",\"Expensify\",\"EXFY\",\"1581635200\",\"19.38\",\"United States\"\n\"3780\",\"Triumph Bancorp\",\"TBK\",\"1581038208\",\"64.62\",\"United States\"\n\"3781\",\"Wallbox\",\"WBX\",\"1580429440\",\"8.54\",\"Spain\"\n\"3782\",\"Xperi\",\"XPER\",\"1580055168\",\"15.2\",\"United States\"\n\"3783\",\"Vivid Seats\",\"SEAT\",\"1577331712\",\"7.88\",\"United States\"\n\"3784\",\"Chambal Fertilisers\",\"CHAMBLFERT.NS\",\"1576991057\",\"3.79\",\"India\"\n\"3785\",\"EchoStar\",\"SATS\",\"1574981120\",\"18.82\",\"United States\"\n\"3786\",\"ChemoCentryx\",\"CCXI\",\"1574798080\",\"22.12\",\"United States\"\n\"3787\",\"KCC Corp\",\"002380.KS\",\"1574744654\",\"214.13\",\"South Korea\"\n\"3788\",\"Archaea Energy\",\"LFG\",\"1574673280\",\"13.59\",\"United States\"\n\"3789\",\"SMA Solar Technology\",\"S92.F\",\"1573144454\",\"45.05\",\"Germany\"\n\"3790\",\"Wüstenrot &amp; Württembergische\",\"WUW.F\",\"1572936849\",\"16.79\",\"Germany\"\n\"3791\",\"Emergent BioSolutions\",\"EBS\",\"1572875904\",\"31.31\",\"United States\"\n\"3792\",\"Embraer\",\"ERJ\",\"1571674112\",\"8.05\",\"Brazil\"\n\"3793\",\"Supernus Pharmaceuticals\",\"SUPN\",\"1570882176\",\"29.41\",\"United States\"\n\"3794\",\"Middlesex Water Company\",\"MSEX\",\"1569265792\",\"89.37\",\"United States\"\n\"3795\",\"NuStar Energy\",\"NS\",\"1568508672\",\"14.22\",\"United States\"\n\"3796\",\"Shinsegae\",\"004170.KS\",\"1568415485\",\"159.45\",\"South Korea\"\n\"3797\",\"FIGS\",\"FIGS\",\"1568127360\",\"9.52\",\"United States\"\n\"3798\",\"Hipgnosis Songs Fund\",\"SONG.L\",\"1567457823\",\"129.41\",\"United Kingdom\"\n\"3799\",\"Revolution Medicines\",\"RVMD\",\"1566571776\",\"21.1\",\"United States\"\n\"3800\",\"Bajaj Electricals\",\"BAJAJELEC.NS\",\"1565152078\",\"13.62\",\"India\"\n\"3801\",\"Office Depot\",\"ODP\",\"1563474304\",\"31.78\",\"United States\"\n\"3802\",\"Maytronics\",\"MTRN.TA\",\"1560759877\",\"14.28\",\"Israel\"\n\"3803\",\"Barnes Group\",\"B\",\"1560518272\",\"30.78\",\"United States\"\n\"3804\",\"Integral Ad Science\",\"IAS\",\"1560457088\",\"10.06\",\"United States\"\n\"3805\",\"Bank Danamon\",\"BDMN.JK\",\"1558811052\",\"0.16\",\"Indonesia\"\n\"3806\",\"TriCo Bancshares\",\"TCBK\",\"1557778688\",\"46.32\",\"United States\"\n\"3807\",\"Resolute Forest Products\",\"RFP\",\"1557057024\",\"20.28\",\"Canada\"\n\"3808\",\"Vaisala\",\"VAIAS.HE\",\"1555499375\",\"42.94\",\"Finland\"\n\"3809\",\"HiteJinro\",\"000080.KS\",\"1554355130\",\"22.41\",\"South Korea\"\n\"3810\",\"Hornbach Baumarkt\",\"HBM.F\",\"1550917374\",\"48.77\",\"Germany\"\n\"3811\",\"Nordex\",\"NDX1.F\",\"1549524497\",\"9.68\",\"Germany\"\n\"3812\",\"Myriad Genetics\",\"MYGN\",\"1549016960\",\"19.28\",\"United States\"\n\"3813\",\"Enterprise Financial Services Corp\",\"EFSC\",\"1548886528\",\"41.59\",\"United States\"\n\"3814\",\"Horace Mann Educators\",\"HMN\",\"1548694528\",\"37.38\",\"United States\"\n\"3815\",\"Veritex Holdings\",\"VBTX\",\"1548195584\",\"28.69\",\"United States\"\n\"3816\",\"Biotest\",\"BIO.F\",\"1547843958\",\"42.53\",\"Germany\"\n\"3817\",\"Happiest Minds Technologies\",\"HAPPSTMNDS.NS\",\"1547194858\",\"10.52\",\"India\"\n\"3818\",\"Zentalis Pharmaceuticals\",\"ZNTL\",\"1546743424\",\"27.16\",\"United States\"\n\"3819\",\"Enel Chile\",\"ENIC\",\"1545179648\",\"1.12\",\"Chile\"\n\"3820\",\"Sigma Lithium\",\"SGML\",\"1544602752\",\"14.46\",\"Canada\"\n\"3821\",\"Centennial Resource Development\",\"CDEV\",\"1543236992\",\"5.42\",\"United States\"\n\"3822\",\"Swissquote\",\"SQN.SW\",\"1542868372\",\"102.96\",\"Switzerland\"\n\"3823\",\"Ligand Pharmaceuticals\",\"LGND\",\"1542303104\",\"91.47\",\"United States\"\n\"3824\",\"Veritiv\",\"VRTV\",\"1542103552\",\"105\",\"United States\"\n\"3825\",\"Ascential\",\"ASCL.L\",\"1541431659\",\"350.18\",\"United Kingdom\"\n\"3826\",\"Buenaventura Mining Company\",\"BVN\",\"1540431232\",\"6.07\",\"Peru\"\n\"3827\",\"Payoneer\",\"PAYO\",\"1539955200\",\"4.48\",\"United States\"\n\"3828\",\"VIZIO\",\"VZIO\",\"1537107584\",\"7.98\",\"United States\"\n\"3829\",\"Allogene Therapeutics\",\"ALLO\",\"1535801984\",\"10.7\",\"United States\"\n\"3830\",\"Santam\",\"SNT.JO\",\"1533786289\",\"14.58\",\"South Africa\"\n\"3831\",\"Formula Systems\",\"FORTY\",\"1532535936\",\"100.05\",\"Israel\"\n\"3832\",\"Dave & Buster's\",\"PLAY\",\"1532148608\",\"31.31\",\"United States\"\n\"3833\",\"Bonheur ASA\",\"BONHR.OL\",\"1531447435\",\"36.01\",\"Norway\"\n\"3834\",\"Vista Outdoor\",\"VSTO\",\"1529401344\",\"27.06\",\"United States\"\n\"3835\",\"OSI Systems\",\"OSIS\",\"1526962944\",\"89.59\",\"United States\"\n\"3836\",\"Radico Khaitan\",\"RADICO.NS\",\"1524684374\",\"11.4\",\"India\"\n\"3837\",\"Eve Air Mobility\",\"EVEX\",\"1522552320\",\"5.76\",\"United States\"\n\"3838\",\"PRA Group\",\"PRAA\",\"1520758528\",\"38.22\",\"United States\"\n\"3839\",\"Sweetgreen\",\"SG\",\"1520609536\",\"13.88\",\"United States\"\n\"3840\",\"Tabcorp\",\"TAH.AX\",\"1519656356\",\"0.68\",\"Australia\"\n\"3841\",\"Lundin Gold\",\"LUG.TO\",\"1517269847\",\"6.45\",\"Canada\"\n\"3842\",\"First National of Nebraska\",\"FINN\",\"1517103616\",\"14100\",\"United States\"\n\"3843\",\"FuelCell Energy\",\"FCEL\",\"1515507328\",\"3.92\",\"United States\"\n\"3844\",\"SES AI\",\"SES\",\"1513199744\",\"4.35\",\"United States\"\n\"3845\",\"US Ecology\",\"ECOL\",\"1512275328\",\"47.99\",\"United States\"\n\"3846\",\"Tilray\",\"TLRY\",\"1511920896\",\"3.15\",\"Canada\"\n\"3847\",\"The Chefs' Warehouse\",\"CHEF\",\"1511697280\",\"39.54\",\"United States\"\n\"3848\",\"Apollo Commercial Real Estate\",\"ARI\",\"1511353344\",\"10.75\",\"United States\"\n\"3849\",\"Griffon Corporation\",\"GFF\",\"1510780288\",\"26.49\",\"United States\"\n\"3850\",\"U.S. Physical Therapy\",\"USPH\",\"1510380160\",\"116.26\",\"United States\"\n\"3851\",\"KIOCL\",\"KIOCL.NS\",\"1508905182\",\"2.48\",\"India\"\n\"3852\",\"BRP Group\",\"BRP\",\"1506571136\",\"25.49\",\"United States\"\n\"3853\",\"Getnet\",\"GET\",\"1502711296\",\"1.61\",\"Brazil\"\n\"3854\",\"Borregaard\",\"BRG.OL\",\"1501250876\",\"15.05\",\"Norway\"\n\"3855\",\"CenturyPly\",\"CENTURYPLY.NS\",\"1500045318\",\"6.73\",\"India\"\n\"3856\",\"Gogoro\",\"GGR\",\"1499984640\",\"6.27\",\"Taiwan\"\n\"3857\",\"Global Net Lease\",\"GNL\",\"1498513280\",\"14.12\",\"United States\"\n\"3858\",\"Westamerica Bancorporation\",\"WABC\",\"1497774464\",\"55.71\",\"United States\"\n\"3859\",\"Tiger Brands\",\"TBS.JO\",\"1495834019\",\"8.82\",\"South Africa\"\n\"3860\",\"Fiskars\",\"FSKRS.HE\",\"1493281721\",\"18.42\",\"Finland\"\n\"3861\",\"Sinclair Broadcast\",\"SBGI\",\"1492016512\",\"21.24\",\"United States\"\n\"3862\",\"Udemy\",\"UDMY\",\"1491515520\",\"10.68\",\"United States\"\n\"3863\",\"Eagle Bancorp\",\"EGBN\",\"1489483648\",\"46.43\",\"United States\"\n\"3864\",\"Hongkong and Shanghai Hotels\",\"0045.HK\",\"1489397053\",\"0.9\",\"Hong Kong\"\n\"3865\",\"Bloomin' Brands\",\"BLMN\",\"1489321728\",\"16.79\",\"United States\"\n\"3866\",\"CI&amp;T\",\"CINT\",\"1489270912\",\"11.21\",\"Brazil\"\n\"3867\",\"Travere Therapeutics\",\"TVTX\",\"1488137728\",\"23.43\",\"United States\"\n\"3868\",\"Magellan Financial Group\",\"MFG.AX\",\"1487668557\",\"8.04\",\"Australia\"\n\"3869\",\"MYR Group\",\"MYRG\",\"1485172992\",\"87.34\",\"United States\"\n\"3870\",\"Palomar Holdings\",\"PLMR\",\"1484738688\",\"58.97\",\"United States\"\n\"3871\",\"Elgi Equipments\",\"ELGIEQUIP.NS\",\"1482342076\",\"4.69\",\"India\"\n\"3872\",\"IndiaMART\",\"INDIAMART.NS\",\"1481713056\",\"48.4\",\"India\"\n\"3873\",\"Evraz\",\"EVZ.F\",\"1481424764\",\"1.02\",\"Russia\"\n\"3874\",\"NovaGold Resources\",\"NG\",\"1480808704\",\"4.43\",\"Canada\"\n\"3875\",\"Pfeiffer Vacuum\",\"PFV.F\",\"1480156477\",\"148.62\",\"Germany\"\n\"3876\",\"CDSL\",\"CDSL.NS\",\"1480004861\",\"14.16\",\"India\"\n\"3877\",\"Materion\",\"MTRN\",\"1479897600\",\"72.15\",\"United States\"\n\"3878\",\"AAR\",\"AIR\",\"1473333888\",\"41.86\",\"United States\"\n\"3879\",\"PeptiDream\",\"4587.T\",\"1473071297\",\"11.35\",\"Japan\"\n\"3880\",\"Brigham Minerals\",\"MNRL\",\"1469804288\",\"23.36\",\"United States\"\n\"3881\",\"Monro\",\"MNRO\",\"1469242880\",\"44.46\",\"United States\"\n\"3882\",\"Lindsay Corporation\",\"LNN\",\"1466079232\",\"133.53\",\"United States\"\n\"3883\",\"Formosa Taffeta\",\"1434.TW\",\"1465909961\",\"0.87\",\"Taiwan\"\n\"3884\",\"Ratnamani Metals &amp; Tubes\",\"RATNAMANI.NS\",\"1464598960\",\"20.9\",\"India\"\n\"3885\",\"XPEL\",\"XPEL\",\"1464020096\",\"53.02\",\"United States\"\n\"3886\",\"Korian\",\"KORI.PA\",\"1462954538\",\"14.15\",\"France\"\n\"3887\",\"Green Plains\",\"GPRE\",\"1462873856\",\"27.18\",\"United States\"\n\"3888\",\"NMI Holdings\",\"NMIH\",\"1459899776\",\"16.96\",\"United States\"\n\"3889\",\"Natco Pharma\",\"NATCOPHARM.NS\",\"1458930460\",\"7.99\",\"India\"\n\"3890\",\"Trinseo\",\"TSE\",\"1456897408\",\"40.3\",\"United States\"\n\"3891\",\"Warrior Met Coal\",\"HCC\",\"1455070592\",\"28.17\",\"United States\"\n\"3892\",\"Koza Gold\",\"KOZAL.IS\",\"1455057780\",\"9.54\",\"Turkey\"\n\"3893\",\"HNI Corporation\",\"HNI\",\"1454239744\",\"34.31\",\"United States\"\n\"3894\",\"Dürr\",\"DUE.F\",\"1454131741\",\"20.98\",\"Germany\"\n\"3895\",\"Coface\",\"COFA.PA\",\"1453489231\",\"9.73\",\"France\"\n\"3896\",\"PVR Cinemas\",\"PVR.NS\",\"1449155143\",\"23.75\",\"India\"\n\"3897\",\"The Cheesecake Factory\",\"CAKE\",\"1447297536\",\"27.42\",\"United States\"\n\"3898\",\"Nextdoor\",\"KIND\",\"1447157888\",\"3.75\",\"United States\"\n\"3899\",\"Fresh Del Monte Produce\",\"FDP\",\"1446999936\",\"30.26\",\"Cayman Islands\"\n\"3900\",\"GAG Immobilien\",\"GWK3.HM\",\"1446425355\",\"90.5\",\"Germany\"\n\"3901\",\"BASF India\",\"BASF.NS\",\"1445811494\",\"33.38\",\"India\"\n\"3902\",\"Sovos Brands\",\"SOVO\",\"1443807488\",\"14.31\",\"United States\"\n\"3903\",\"Iveco Group\",\"IVG.MI\",\"1443216024\",\"5.09\",\"Italy\"\n\"3904\",\"Türkiye Kalkınma\",\"KLNMA.IS\",\"1443037229\",\"0.72\",\"Turkey\"\n\"3905\",\"Yanlord\",\"Z25.SI\",\"1442575478\",\"0.75\",\"Singapore\"\n\"3906\",\"Remitly\",\"RELY\",\"1442253440\",\"8.68\",\"United States\"\n\"3907\",\"Cricut\",\"CRCT\",\"1441810432\",\"6.5\",\"United States\"\n\"3908\",\"VakıfBank\",\"VAKBN.IS\",\"1440778876\",\"0.2\",\"Turkey\"\n\"3909\",\"Meridian Bioscience\",\"VIVO\",\"1437204480\",\"32.86\",\"United States\"\n\"3910\",\"Sixth Street Specialty Lending\",\"TSLX\",\"1435774464\",\"18.82\",\"United States\"\n\"3911\",\"Orpea\",\"ORP.PA\",\"1435024410\",\"22.22\",\"France\"\n\"3912\",\"Casino Guichard-Perrachon\",\"CO.PA\",\"1434782697\",\"13.28\",\"France\"\n\"3913\",\"Montauk Renewables\",\"MNTK\",\"1434603904\",\"9.99\",\"United States\"\n\"3914\",\"Safety Insurance\",\"SAFT\",\"1432452992\",\"97.17\",\"United States\"\n\"3915\",\"Marcus &amp; Millichap\",\"MMI\",\"1431911424\",\"36.82\",\"United States\"\n\"3916\",\"Rackspace Technology\",\"RXT\",\"1431739392\",\"6.79\",\"United States\"\n\"3917\",\"CS Disco\",\"LAW\",\"1430691584\",\"24.4\",\"United States\"\n\"3918\",\"GlobalData\",\"DATA.L\",\"1429988784\",\"1202.91\",\"United Kingdom\"\n\"3919\",\"Sonic Automotive\",\"SAH\",\"1429687552\",\"36.14\",\"United States\"\n\"3920\",\"Addus HomeCare\",\"ADUS\",\"1423604608\",\"88.58\",\"United States\"\n\"3921\",\"Flex Lng\",\"FLNG\",\"1423368832\",\"26.79\",\"Bermuda\"\n\"3922\",\"Ready Capital\",\"RC\",\"1422579712\",\"12.25\",\"United States\"\n\"3923\",\"Sana Biotechnology\",\"SANA\",\"1418716672\",\"7.48\",\"United States\"\n\"3924\",\"Live Oak Bank\",\"LOB\",\"1418011264\",\"32.19\",\"United States\"\n\"3925\",\"Exclusive Networks\",\"EXN.PA\",\"1416773245\",\"15.3\",\"France\"\n\"3926\",\"YTL Corporation Berhad\",\"1773.T\",\"1415781086\",\"0.12\",\"Malaysia\"\n\"3927\",\"Nokian Tyres\",\"TYRES.HE\",\"1414902347\",\"10.24\",\"Finland\"\n\"3928\",\"Summerset Holdings\",\"SUM.NZ\",\"1413866667\",\"6.12\",\"New Zealand\"\n\"3929\",\"Green Dot\",\"GDOT\",\"1409524992\",\"26\",\"United States\"\n\"3930\",\"TF1\",\"TFI.PA\",\"1407969882\",\"6.45\",\"France\"\n\"3931\",\"PIERER Mobility\",\"PMAG.F\",\"1405790858\",\"61.34\",\"Austria\"\n\"3932\",\"Fastly\",\"FSLY\",\"1404857984\",\"11.62\",\"United States\"\n\"3933\",\"Sapiens\",\"SPNS\",\"1404685056\",\"25.49\",\"Israel\"\n\"3934\",\"Galaxy Digital Holdings\",\"7LX.F\",\"1404680623\",\"4.18\",\"United States\"\n\"3935\",\"Silk Road Medical\",\"SILK\",\"1401495552\",\"39.91\",\"United States\"\n\"3936\",\"Banco de Brasília\",\"BSLI3.SA\",\"1400369349\",\"3.69\",\"Brazil\"\n\"3937\",\"Deutsche EuroShop\",\"DEQ.F\",\"1397817404\",\"22.6\",\"Germany\"\n\"3938\",\"Prothena\",\"PRTA\",\"1397165056\",\"29.85\",\"Ireland\"\n\"3939\",\"P10\",\"PX\",\"1396940544\",\"11.92\",\"United States\"\n\"3940\",\"Aris Water Solutions\",\"ARIS\",\"1396896128\",\"16.38\",\"United States\"\n\"3941\",\"Ceres Power\",\"CWR.L\",\"1394593845\",\"710.1\",\"United Kingdom\"\n\"3942\",\"AJ Bell\",\"AJB.L\",\"1394514272\",\"339.24\",\"United Kingdom\"\n\"3943\",\"Taro Pharmaceutical\",\"TARO\",\"1394399744\",\"37.1\",\"Israel\"\n\"3944\",\"ePlus\",\"PLUS\",\"1392958080\",\"51.94\",\"United States\"\n\"3945\",\"Marten Transport\",\"MRTN\",\"1392270976\",\"16.99\",\"United States\"\n\"3946\",\"LTC Properties\",\"LTC\",\"1391066880\",\"39.14\",\"United States\"\n\"3947\",\"Partner Communications\",\"PTNR\",\"1390326400\",\"7.51\",\"Israel\"\n\"3948\",\"Buckle\",\"BKE\",\"1390133504\",\"27.75\",\"United States\"\n\"3949\",\"TAG Immobilien\",\"TEG.F\",\"1389616780\",\"8.97\",\"Germany\"\n\"3950\",\"Oxford Industries\",\"OXM\",\"1387061120\",\"87.08\",\"United States\"\n\"3951\",\"Jeld-Wen\",\"JELD\",\"1384575104\",\"15.9\",\"United States\"\n\"3952\",\"ITM Power\",\"ITM.L\",\"1383958445\",\"225.71\",\"United Kingdom\"\n\"3953\",\"City Union Bank\",\"CUB.NS\",\"1380419641\",\"1.87\",\"India\"\n\"3954\",\"Stewart Information Services\",\"STC\",\"1379488000\",\"51.06\",\"United States\"\n\"3955\",\"TDCX\",\"TDCX\",\"1377460352\",\"9.45\",\"Singapore\"\n\"3956\",\"Janus International Group\",\"JBI\",\"1376217216\",\"9.39\",\"United States\"\n\"3957\",\"Bank of Maharashtra\",\"MAHABANK.NS\",\"1375592720\",\"0.2\",\"India\"\n\"3958\",\"Ladder Cap\",\"LADR\",\"1375269888\",\"10.81\",\"United States\"\n\"3959\",\"Marshalls plc\",\"MSLH.L\",\"1374161528\",\"543.21\",\"United Kingdom\"\n\"3960\",\"Embecta\",\"EMBC\",\"1373860864\",\"23.77\",\"United States\"\n\"3961\",\"Bank Islam Malaysia\",\"BIMB.KL\",\"1373345372\",\"0.77\",\"Malaysia\"\n\"3962\",\"AvidXchange\",\"AVDX\",\"1372614144\",\"6.94\",\"United States\"\n\"3963\",\"SJVN\",\"SJVN.NS\",\"1371584505\",\"0.35\",\"India\"\n\"3964\",\"PROCEPT BioRobotics\",\"PRCT\",\"1364955008\",\"30.9\",\"United States\"\n\"3965\",\"Radius Global Infrastructure\",\"RADI\",\"1360396032\",\"14.67\",\"United States\"\n\"3966\",\"GasLog\",\"GLOG-PA\",\"1359752320\",\"24.85\",\"Greece\"\n\"3967\",\"PennyMac Mortgage Investment Trust\",\"PMT\",\"1359535360\",\"14.79\",\"United States\"\n\"3968\",\"Kforce\",\"KFRC\",\"1359299328\",\"63.57\",\"United States\"\n\"3969\",\"BigCommerce\",\"BIGC\",\"1357537152\",\"18.68\",\"United States\"\n\"3970\",\"Criteo\",\"CRTO\",\"1357390720\",\"22.49\",\"France\"\n\"3971\",\"Seadrill\",\"SDRL.OL\",\"1356999706\",\"27.14\",\"Bermuda\"\n\"3972\",\"Recursion Pharmaceuticals\",\"RXRX\",\"1355415296\",\"7.88\",\"United States\"\n\"3973\",\"Indian Telephone Industries\",\"ITI.NS\",\"1355368142\",\"1.44\",\"India\"\n\"3974\",\"BGC Partners\",\"BGCP\",\"1352702464\",\"3.7\",\"United States\"\n\"3975\",\"Mallplaza\",\"MALLPLAZA.SN\",\"1352130213\",\"0.69\",\"Chile\"\n\"3976\",\"THG (The Hut Group)\",\"THG.L\",\"1351916376\",\"90.9\",\"United Kingdom\"\n\"3977\",\"Arcos Dorados Holdings\",\"ARCO\",\"1351268736\",\"6.42\",\"Uruguay\"\n\"3978\",\"World Fuel Services\",\"INT\",\"1350558592\",\"21.43\",\"United States\"\n\"3979\",\"Lyell Immunopharma\",\"LYEL\",\"1350050560\",\"5.49\",\"United States\"\n\"3980\",\"BridgeBio Pharma\",\"BBIO\",\"1349923200\",\"9.14\",\"United States\"\n\"3981\",\"Costamare\",\"CMRE\",\"1348965760\",\"10.87\",\"Monaco\"\n\"3982\",\"Glenmark Pharmaceuticals\",\"GLENMARK.NS\",\"1347881922\",\"4.78\",\"India\"\n\"3983\",\"Precinct Properties\",\"PCT.NZ\",\"1347757212\",\"0.85\",\"New Zealand\"\n\"3984\",\"Ecovyst\",\"ECVT\",\"1346747776\",\"9.71\",\"United States\"\n\"3985\",\"Sally Beauty Holdings\",\"SBH\",\"1346072576\",\"12.58\",\"United States\"\n\"3986\",\"CoreCivic\",\"CXW\",\"1345924736\",\"11.33\",\"United States\"\n\"3987\",\"Sierra Oncology\",\"SRRA\",\"1342822784\",\"54.99\",\"Canada\"\n\"3988\",\"Momentive Global\",\"MNTV\",\"1342786432\",\"8.95\",\"United States\"\n\"3989\",\"Universal Corporation\",\"UVV\",\"1342356992\",\"54.58\",\"United States\"\n\"3990\",\"Huron Consulting\",\"HURN\",\"1341838464\",\"63.11\",\"United States\"\n\"3991\",\"Methode Electronics\",\"MEI\",\"1341782016\",\"35.03\",\"United States\"\n\"3992\",\"Paysafe\",\"PSFE\",\"1340694656\",\"1.85\",\"United States\"\n\"3993\",\"Galaxy Surfactants\",\"GALAXYSURF.NS\",\"1340300912\",\"37.79\",\"India\"\n\"3994\",\"Trustpower\",\"TPW.NZ\",\"1336635392\",\"4.27\",\"New Zealand\"\n\"3995\",\"Secure Energy Services\",\"SES.TO\",\"1334918365\",\"4.31\",\"Canada\"\n\"3996\",\"SpringWorks Therapeutics\",\"SWTX\",\"1334666752\",\"27.01\",\"United States\"\n\"3997\",\"UCT (Ultra Clean Holdings)\",\"UCTT\",\"1332705024\",\"29.55\",\"United States\"\n\"3998\",\"Terveystalo\",\"TTALO.HE\",\"1331017878\",\"10.54\",\"Finland\"\n\"3999\",\"Halkbank\",\"HALKB.IS\",\"1330867997\",\"0.27\",\"Turkey\"\n\"4000\",\"Adaptive Biotechnologies\",\"ADPT\",\"1328409600\",\"9.34\",\"United States\"\n\"4001\",\"Healthcare Services Group\",\"HCSG\",\"1327465472\",\"17.93\",\"United States\"\n\"4002\",\"Atos\",\"ATO.PA\",\"1326919304\",\"10.95\",\"France\"\n\"4003\",\"JYP Entertainment\",\"035900.KQ\",\"1326233496\",\"40.07\",\"South Korea\"\n\"4004\",\"Algoma Steel\",\"ASTL\",\"1325952000\",\"9\",\"Canada\"\n\"4005\",\"Gibraltar Industries\",\"ROCK\",\"1323537664\",\"40.36\",\"United States\"\n\"4006\",\"KEC International\",\"KEC.NS\",\"1322495667\",\"5.14\",\"India\"\n\"4007\",\"Braves Group\",\"BATRK\",\"1322490112\",\"24.77\",\"United States\"\n\"4008\",\"SpareBank 1\",\"SPOL.OL\",\"1320775534\",\"11.4\",\"Norway\"\n\"4009\",\"RPC\",\"RES\",\"1316174080\",\"6.08\",\"United States\"\n\"4010\",\"Vaxcyte\",\"PCVX\",\"1316142464\",\"22.57\",\"United States\"\n\"4011\",\"Synthomer\",\"SYNT.L\",\"1314480686\",\"276\",\"United Kingdom\"\n\"4012\",\"Warby Parker\",\"WRBY\",\"1313798528\",\"11.43\",\"United States\"\n\"4013\",\"Centerspace\",\"CSR\",\"1313729024\",\"80.29\",\"United States\"\n\"4014\",\"Enovix\",\"ENVX\",\"1312626304\",\"8.37\",\"United States\"\n\"4015\",\"Granite Construction\",\"GVA\",\"1311484800\",\"28.91\",\"United States\"\n\"4016\",\"Holley\",\"HLLY\",\"1310678656\",\"11.11\",\"United States\"\n\"4017\",\"Fiverr\",\"FVRR\",\"1308727552\",\"35.25\",\"Israel\"\n\"4018\",\"Kinetik\",\"KNTK\",\"1307154048\",\"34.36\",\"United States\"\n\"4019\",\"Day One Biopharmaceuticals\",\"DAWN\",\"1304481920\",\"18.14\",\"United States\"\n\"4020\",\"Franchise Group\",\"FRG\",\"1304456064\",\"32.33\",\"United States\"\n\"4021\",\"NaaS Technology\",\"NAAS\",\"1304320128\",\"6.09\",\"China\"\n\"4022\",\"Avid Technology\",\"AVID\",\"1302383232\",\"28.96\",\"United States\"\n\"4023\",\"GB Group (GBG)\",\"GBG.L\",\"1299213617\",\"515.64\",\"United Kingdom\"\n\"4024\",\"Textainer Group\",\"TGH\",\"1297929216\",\"27.03\",\"Bermuda\"\n\"4025\",\"Sylvamo\",\"SLVM\",\"1296869248\",\"29.4\",\"United States\"\n\"4026\",\"Mirion Technologies\",\"MIR\",\"1295696384\",\"6.23\",\"United States\"\n\"4027\",\"RSA Insurance Group\",\"RSAB.L\",\"1294629115\",\"126.89\",\"United Kingdom\"\n\"4028\",\"AssetMark\",\"AMK\",\"1293782528\",\"17.58\",\"United States\"\n\"4029\",\"Skycity Entertainment Group\",\"SKC.NZ\",\"1292813903\",\"1.6\",\"New Zealand\"\n\"4030\",\"Redington India\",\"REDINGTON.NS\",\"1291498920\",\"1.65\",\"India\"\n\"4031\",\"First Commonwealth Financial Corp\",\"FCF\",\"1291196928\",\"13.69\",\"United States\"\n\"4032\",\"IVERIC bio\",\"ISEE\",\"1291086720\",\"11.09\",\"United States\"\n\"4033\",\"First Busey\",\"BUSE\",\"1290715648\",\"23.35\",\"United States\"\n\"4034\",\"Asseco\",\"SFB1.F\",\"1287777432\",\"15.52\",\"Poland\"\n\"4035\",\"CommScope\",\"COMM\",\"1286054400\",\"6.21\",\"United States\"\n\"4036\",\"AVI Limited\",\"AVI.JO\",\"1283981483\",\"3.89\",\"South Africa\"\n\"4037\",\"Jastrzebska Spólka Weglowa\",\"JSW.WA\",\"1283758035\",\"10.93\",\"Poland\"\n\"4038\",\"Alexander &amp; Baldwin\",\"ALEX\",\"1283535872\",\"17.66\",\"United States\"\n\"4039\",\"CareDx\",\"CDNA\",\"1283160704\",\"24.11\",\"United States\"\n\"4040\",\"Sri Trang Gloves\",\"STGT.BK\",\"1281773296\",\"0.45\",\"Thailand\"\n\"4041\",\"Tamarack Valley Energy\",\"TVE.TO\",\"1280839805\",\"2.9\",\"Canada\"\n\"4042\",\"Gamma Communications\",\"GAMA.L\",\"1280630803\",\"1328.91\",\"United Kingdom\"\n\"4043\",\"ProAssurance\",\"PRA\",\"1279313792\",\"23.67\",\"United States\"\n\"4044\",\"Protolabs\",\"PRLB\",\"1278843520\",\"46.51\",\"United States\"\n\"4045\",\"Newegg\",\"NEGG\",\"1278099712\",\"3.48\",\"United States\"\n\"4046\",\"Wacker Neuson\",\"WAC.F\",\"1278064105\",\"17.73\",\"Germany\"\n\"4047\",\"Avanos Medical\",\"AVNS\",\"1275879296\",\"26.96\",\"United States\"\n\"4048\",\"Weatherford International\",\"WFRD\",\"1275755776\",\"18.09\",\"United States\"\n\"4049\",\"USANA\",\"USNA\",\"1274857472\",\"66.44\",\"United States\"\n\"4050\",\"National Express Group\",\"NEX.L\",\"1273955873\",\"204.8\",\"United Kingdom\"\n\"4051\",\"Cohu\",\"COHU\",\"1272273280\",\"26.16\",\"United States\"\n\"4052\",\"3D Systems\",\"DDD\",\"1272098944\",\"9.76\",\"United States\"\n\"4053\",\"Exscientia\",\"EXAI\",\"1268661376\",\"10.45\",\"United Kingdom\"\n\"4054\",\"LendingClub\",\"LC\",\"1268227584\",\"12.41\",\"United States\"\n\"4055\",\"Carpenter Technology\",\"CRS\",\"1267313280\",\"26.25\",\"United States\"\n\"4056\",\"Getty Realty\",\"GTY\",\"1266464256\",\"27.1\",\"United States\"\n\"4057\",\"Global Industrial Company\",\"GIC\",\"1266035200\",\"33.39\",\"United States\"\n\"4058\",\"Agios Pharmaceuticals\",\"AGIO\",\"1265075712\",\"23.09\",\"United States\"\n\"4059\",\"SFL Corp\",\"SFL\",\"1264970752\",\"9.13\",\"Bermuda\"\n\"4060\",\"Capitol Federal Savings Bank\",\"CFFN\",\"1264969088\",\"9.11\",\"United States\"\n\"4061\",\"PostNL\",\"PNL.AS\",\"1264238817\",\"2.45\",\"Netherlands\"\n\"4062\",\"Advantage Energy\",\"AAV.TO\",\"1263933785\",\"6.66\",\"Canada\"\n\"4063\",\"KKR Real Estate Finance Trust\",\"KREF\",\"1263635072\",\"17.87\",\"United States\"\n\"4064\",\"Equinox Gold\",\"EQX\",\"1263464448\",\"4.14\",\"Canada\"\n\"4065\",\"Yatsen Holding\",\"YSG\",\"1263439104\",\"2\",\"China\"\n\"4066\",\"Veris Residential\",\"VRE\",\"1261654144\",\"12.65\",\"United States\"\n\"4067\",\"Fila\",\"081660.KS\",\"1261551315\",\"20.99\",\"South Korea\"\n\"4068\",\"Jack in the Box\",\"JACK\",\"1261286784\",\"59.93\",\"United States\"\n\"4069\",\"Advantage Solutions\",\"ADV\",\"1260899584\",\"3.96\",\"United States\"\n\"4070\",\"Patrick Industries\",\"PATK\",\"1260433024\",\"54.79\",\"United States\"\n\"4071\",\"23andMe\",\"ME\",\"1259930240\",\"2.81\",\"United States\"\n\"4072\",\"Zydus Wellness\",\"ZYDUSWELL.NS\",\"1258304052\",\"19.74\",\"India\"\n\"4073\",\"Arcutis Biotherapeutics\",\"ARQT\",\"1257170176\",\"24.45\",\"United States\"\n\"4074\",\"East India Distilleries Parry\",\"EIDPARRY.NS\",\"1256684260\",\"7.08\",\"India\"\n\"4075\",\"Nexters\",\"GDEV\",\"1253816832\",\"6.38\",\"Cyprus\"\n\"4076\",\"Virtus Investment Partners\",\"VRTS\",\"1253245568\",\"167.7\",\"United States\"\n\"4077\",\"Budimex\",\"BDX.WA\",\"1253033963\",\"49.08\",\"Poland\"\n\"4078\",\"OFG Bancorp\",\"OFG\",\"1249058560\",\"25.7\",\"United States\"\n\"4079\",\"Establishment Labs\",\"ESTA\",\"1248606464\",\"51.6\",\"Costa Rica\"\n\"4080\",\"Phreesia\",\"PHR\",\"1248080512\",\"23.89\",\"United States\"\n\"4081\",\"Vericel\",\"VCEL\",\"1245039744\",\"26.42\",\"United States\"\n\"4082\",\"Nongshim\",\"004370.KS\",\"1244862845\",\"215.28\",\"South Korea\"\n\"4083\",\"John Wood Group\",\"WG.L\",\"1243062136\",\"174.43\",\"United Kingdom\"\n\"4084\",\"Amylyx Pharmaceuticals\",\"AMLX\",\"1241143808\",\"21.2\",\"United States\"\n\"4085\",\"Open Lending\",\"LPRO\",\"1238198656\",\"9.81\",\"United States\"\n\"4086\",\"PROS\",\"PRO\",\"1238136064\",\"27.41\",\"United States\"\n\"4087\",\"First Bancorp\",\"FBNC\",\"1238103680\",\"34.73\",\"United States\"\n\"4088\",\"Custom Truck One Source\",\"CTOS\",\"1237949952\",\"5\",\"United States\"\n\"4089\",\"M/I Homes\",\"MHO\",\"1237776512\",\"43.76\",\"United States\"\n\"4090\",\"Agilysys\",\"AGYS\",\"1236602624\",\"49.99\",\"United States\"\n\"4091\",\"Punjab &amp; Sind Bank\",\"PSB.NS\",\"1236076293\",\"0.18\",\"India\"\n\"4092\",\"AMC Networks\",\"AMCX\",\"1234562176\",\"28.77\",\"United States\"\n\"4093\",\"Corsair Gaming\",\"CRSR\",\"1234121856\",\"12.94\",\"United States\"\n\"4094\",\"Membership Collective\",\"MCG\",\"1233339136\",\"6.12\",\"United Kingdom\"\n\"4095\",\"Rent-A-Center\",\"RCII\",\"1233131520\",\"20.85\",\"United States\"\n\"4096\",\"Veidekke\",\"VEI.OL\",\"1232361306\",\"9.13\",\"Norway\"\n\"4097\",\"Compañía de Acero del Pacífico\",\"CAP.SN\",\"1231499893\",\"8.24\",\"Chile\"\n\"4098\",\"Siam City Cement (INSEE)\",\"SCCC.BK\",\"1231098709\",\"4.13\",\"Thailand\"\n\"4099\",\"Russel Metals\",\"RUS.TO\",\"1228208735\",\"19.14\",\"Canada\"\n\"4100\",\"Repay Holdings\",\"RPAY\",\"1228093824\",\"13.45\",\"United States\"\n\"4101\",\"Extreme Networks\",\"EXTR\",\"1227241728\",\"9.38\",\"United States\"\n\"4102\",\"Archrock\",\"AROC\",\"1226974720\",\"7.91\",\"United States\"\n\"4103\",\"Z Energy\",\"ZEL.NZ\",\"1224995800\",\"2.35\",\"New Zealand\"\n\"4104\",\"B. Riley Financial\",\"RILY\",\"1224930816\",\"43.86\",\"United States\"\n\"4105\",\"City Holding Company\",\"CHCO\",\"1224753152\",\"81.85\",\"United States\"\n\"4106\",\"Alkami Technology\",\"ALKT\",\"1223149056\",\"13.52\",\"United States\"\n\"4107\",\"Danaos\",\"DAC\",\"1221341312\",\"58.96\",\"Greece\"\n\"4108\",\"Jenoptik\",\"JEN.F\",\"1221309587\",\"21.34\",\"Germany\"\n\"4109\",\"Zuora\",\"ZUO\",\"1220940032\",\"9.45\",\"United States\"\n\"4110\",\"tuya\",\"TUYA\",\"1220019584\",\"2.18\",\"China\"\n\"4111\",\"Bilfinger\",\"GBF.F\",\"1218448282\",\"29.92\",\"Germany\"\n\"4112\",\"Miramar Hotel and Investment\",\"0071.HK\",\"1216478881\",\"1.76\",\"Hong Kong\"\n\"4113\",\"Lemonade\",\"LMND\",\"1215212544\",\"19.67\",\"United States\"\n\"4114\",\"Infinera\",\"INFN\",\"1214775808\",\"5.65\",\"United States\"\n\"4115\",\"Momentum Metropolitan\",\"MTM.JO\",\"1213576869\",\"0.85\",\"South Africa\"\n\"4116\",\"Forge Global\",\"FRGE\",\"1211745408\",\"7.16\",\"United States\"\n\"4117\",\"Valneva SE\",\"VALN\",\"1209576192\",\"20.64\",\"France\"\n\"4118\",\"Steelcase\",\"SCS\",\"1209372544\",\"10.73\",\"United States\"\n\"4119\",\"Planet Labs\",\"PL\",\"1209091584\",\"4.5\",\"United States\"\n\"4120\",\"Anywhere Real Estate\",\"HOUS\",\"1207574784\",\"10.22\",\"United States\"\n\"4121\",\"ModivCare\",\"MODV\",\"1206496768\",\"85.89\",\"United States\"\n\"4122\",\"Mechel PAO\",\"MTL\",\"1206171008\",\"2.25\",\"Russia\"\n\"4123\",\"TTM Technologies\",\"TTMI\",\"1206083200\",\"11.94\",\"United States\"\n\"4124\",\"Bytes Technology\",\"BYIT.L\",\"1205005152\",\"493.77\",\"United Kingdom\"\n\"4125\",\"Astra Agro Lestari\",\"AALI.JK\",\"1204135416\",\"0.63\",\"Indonesia\"\n\"4126\",\"V-Guard Industries\",\"VGUARD.NS\",\"1201954226\",\"2.79\",\"India\"\n\"4127\",\"NLC India\",\"NLCINDIA.NS\",\"1201633689\",\"0.87\",\"India\"\n\"4128\",\"Celestica\",\"CLS\",\"1201379456\",\"9.71\",\"Canada\"\n\"4129\",\"Southside Bancshares\",\"SBSI\",\"1200395392\",\"37.37\",\"United States\"\n\"4130\",\"CropEnergies\",\"CE2.F\",\"1198221579\",\"13.66\",\"Germany\"\n\"4131\",\"Dime Community Bancshares\",\"DCOM\",\"1197129088\",\"30.51\",\"United States\"\n\"4132\",\"AST SpaceMobile\",\"ASTS\",\"1196864384\",\"6.59\",\"United States\"\n\"4133\",\"ASOS\",\"ASC.L\",\"1196440096\",\"1110.2\",\"United Kingdom\"\n\"4134\",\"SM Entertainment\",\"041510.KQ\",\"1196343692\",\"51.24\",\"South Korea\"\n\"4135\",\"Salzgitter\",\"SZG.F\",\"1194325848\",\"22.08\",\"Germany\"\n\"4136\",\"Valhi\",\"VHI\",\"1193576320\",\"42.21\",\"United States\"\n\"4137\",\"Argo Group\",\"ARGO\",\"1191725056\",\"34.09\",\"Bermuda\"\n\"4138\",\"Kornit Digital\",\"KRNT\",\"1190352128\",\"23.91\",\"Israel\"\n\"4139\",\"Hornbach Holding\",\"HBH.F\",\"1189915543\",\"74.41\",\"Germany\"\n\"4140\",\"Revenio\",\"REG1V.HE\",\"1188698096\",\"44.75\",\"Finland\"\n\"4141\",\"Meta Financial Group\",\"CASH\",\"1188401536\",\"40.47\",\"United States\"\n\"4142\",\"Utz Brands\",\"UTZ\",\"1186714752\",\"14.7\",\"United States\"\n\"4143\",\"Mixi\",\"2121.T\",\"1186504024\",\"16.35\",\"Japan\"\n\"4144\",\"Hypoport\",\"HYQ.F\",\"1184694379\",\"188.03\",\"Germany\"\n\"4145\",\"Scholastic\",\"SCHL\",\"1182316672\",\"34.35\",\"United States\"\n\"4146\",\"stem\",\"STEM\",\"1181263872\",\"7.66\",\"United States\"\n\"4147\",\"Earthstone Energy\",\"ESTE\",\"1180981632\",\"11.32\",\"United States\"\n\"4148\",\"Rush Street Interactive\",\"RSI\",\"1180546048\",\"5.37\",\"United States\"\n\"4149\",\"Berkshire Hills Bancorp\",\"BHLB\",\"1180245632\",\"24.94\",\"United States\"\n\"4150\",\"American Well\",\"AMWL\",\"1180002688\",\"4.35\",\"United States\"\n\"4151\",\"Bodycote\",\"BOY.L\",\"1176559160\",\"614.53\",\"United Kingdom\"\n\"4152\",\"Kaiser Aluminum\",\"KALU\",\"1174532480\",\"73.85\",\"United States\"\n\"4153\",\"Cancom\",\"COK.F\",\"1172913488\",\"30.43\",\"Germany\"\n\"4154\",\"Kymera Therapeutics\",\"KYMR\",\"1172070400\",\"22.66\",\"United States\"\n\"4155\",\"Inter Cars\",\"CAR.WA\",\"1171321748\",\"82.67\",\"Poland\"\n\"4156\",\"Veru\",\"VERU\",\"1171085824\",\"14.63\",\"United States\"\n\"4157\",\"3R Petroleum\",\"RRRP3.SA\",\"1168244594\",\"5.77\",\"Brazil\"\n\"4158\",\"Malibu Boats\",\"MBUU\",\"1167856512\",\"56.96\",\"United States\"\n\"4159\",\"Pampa Energía\",\"PAM\",\"1165738752\",\"20.94\",\"Argentina\"\n\"4160\",\"Celldex Therapeutics\",\"CLDX\",\"1165117184\",\"24.92\",\"United States\"\n\"4161\",\"iStar\",\"STAR\",\"1163183104\",\"14.04\",\"United States\"\n\"4162\",\"Clover Health Investments\",\"CLOV\",\"1163052928\",\"2.46\",\"United States\"\n\"4163\",\"AMAG Austria Metall\",\"AM8.F\",\"1162766544\",\"31.67\",\"Austria\"\n\"4164\",\"Myovant Sciences\",\"MYOV\",\"1162574848\",\"12.2\",\"United Kingdom\"\n\"4165\",\"Yacimientos Petrolíferos Fiscales\",\"YPF\",\"1162239872\",\"2.96\",\"Argentina\"\n\"4166\",\"PC Connection\",\"CNXN\",\"1160738688\",\"44.19\",\"United States\"\n\"4167\",\"HireRight\",\"HRT\",\"1160724096\",\"14.62\",\"United States\"\n\"4168\",\"Virgin Orbit\",\"VORB\",\"1158823168\",\"3.46\",\"United States\"\n\"4169\",\"Tauron Polska\",\"1T5.F\",\"1157939869\",\"0.64\",\"Poland\"\n\"4170\",\"Primoris Services Corporation\",\"PRIM\",\"1156738560\",\"21.69\",\"United States\"\n\"4171\",\"Reata Pharmaceuticals\",\"RETA\",\"1156241664\",\"31.71\",\"United States\"\n\"4172\",\"Ottogi\",\"007310.KS\",\"1155984838\",\"339.93\",\"South Korea\"\n\"4173\",\"REGENXBIO\",\"RGNX\",\"1154263168\",\"26.76\",\"United States\"\n\"4174\",\"Employers Holdings\",\"EIG\",\"1153640064\",\"41.59\",\"United States\"\n\"4175\",\"The Bancorp\",\"TBBK\",\"1150680576\",\"20.34\",\"United States\"\n\"4176\",\"MFA Financial\",\"MFA\",\"1150569600\",\"11.23\",\"United States\"\n\"4177\",\"Camtek\",\"CAMT\",\"1150358784\",\"26.22\",\"Israel\"\n\"4178\",\"Grenke\",\"GLJ.F\",\"1150314828\",\"24.43\",\"Germany\"\n\"4179\",\"Franklin BSP Realty Trust\",\"FBRT\",\"1149501312\",\"13.74\",\"United States\"\n\"4180\",\"Stratasys\",\"SSYS\",\"1149024384\",\"17.3\",\"United States\"\n\"4181\",\"Kura Oncology\",\"KURA\",\"1148806400\",\"17.24\",\"United States\"\n\"4182\",\"Colbún\",\"COLBUN.SN\",\"1146530664\",\"0.07\",\"Chile\"\n\"4183\",\"Canoo\",\"GOEV\",\"1145743232\",\"4.51\",\"United States\"\n\"4184\",\"Photronics\",\"PLAB\",\"1143936128\",\"18.57\",\"United States\"\n\"4185\",\"LSB Industries\",\"LXU\",\"1143734912\",\"12.77\",\"United States\"\n\"4186\",\"OceanFirst Financial\",\"OCFC\",\"1142073472\",\"19.23\",\"United States\"\n\"4187\",\"Armada Hoffler Properties\",\"AHH\",\"1141205504\",\"12.92\",\"United States\"\n\"4188\",\"Blue Star\",\"BLUESTARCO.NS\",\"1140205540\",\"11.84\",\"India\"\n\"4189\",\"Mahindra CIE\",\"MAHINDCIE.NS\",\"1137526047\",\"3\",\"India\"\n\"4190\",\"TriMas\",\"TRS\",\"1136743936\",\"26.75\",\"United States\"\n\"4191\",\"National Bank Holdings\",\"NBHC\",\"1135559296\",\"37.79\",\"United States\"\n\"4192\",\"Sturm, Ruger &amp; Co\",\"RGR\",\"1134885632\",\"64.36\",\"United States\"\n\"4193\",\"BrightView\",\"BV\",\"1134599936\",\"12.2\",\"United States\"\n\"4194\",\"Golden Entertainment\",\"GDEN\",\"1134296704\",\"39.14\",\"United States\"\n\"4195\",\"Telia Lietuva\",\"ZWS.F\",\"1133591039\",\"1.9\",\"Lithuania\"\n\"4196\",\"Customers Bancorp\",\"CUBI\",\"1133069056\",\"34.36\",\"United States\"\n\"4197\",\"Bright Health\",\"BHG\",\"1132642816\",\"1.8\",\"United States\"\n\"4198\",\"Dah Sing Banking Group\",\"2356.HK\",\"1131797754\",\"0.81\",\"Hong Kong\"\n\"4199\",\"Bpost\",\"13B.F\",\"1131730952\",\"5.57\",\"Belgium\"\n\"4200\",\"Grid Dynamics\",\"GDYN\",\"1128682112\",\"16.83\",\"United States\"\n\"4201\",\"Funko\",\"FNKO\",\"1128004096\",\"24.27\",\"United States\"\n\"4202\",\"Dream Finders Homes\",\"DFH\",\"1127954304\",\"12.16\",\"United States\"\n\"4203\",\"Citycon\",\"CTY1S.HE\",\"1125972819\",\"6.7\",\"Finland\"\n\"4204\",\"Heartland Express\",\"HTLD\",\"1125195648\",\"14.26\",\"United States\"\n\"4205\",\"Madrigal Pharmaceuticals\",\"MDGL\",\"1122838272\",\"65.65\",\"United States\"\n\"4206\",\"Simulations Plus\",\"SLP\",\"1122064000\",\"55.45\",\"United States\"\n\"4207\",\"Enerpac Tool Group\",\"EPAC\",\"1121559296\",\"19.29\",\"United States\"\n\"4208\",\"Diversified Energy\",\"DEC.L\",\"1121555554\",\"131.83\",\"United States\"\n\"4209\",\"1st Source\",\"SRCE\",\"1120753152\",\"45.32\",\"United States\"\n\"4210\",\"Banc of California\",\"BANC\",\"1117917312\",\"18.21\",\"United States\"\n\"4211\",\"BSE\",\"BSE.NS\",\"1117340414\",\"8.27\",\"India\"\n\"4212\",\"Sun Country Airlines\",\"SNCY\",\"1115727616\",\"19.24\",\"United States\"\n\"4213\",\"Energy Recovery\",\"ERII\",\"1114852736\",\"19.71\",\"United States\"\n\"4214\",\"Talos Energy\",\"TALO\",\"1114225152\",\"13.5\",\"United States\"\n\"4215\",\"STRATEC\",\"SBS.F\",\"1114224233\",\"91.3\",\"Germany\"\n\"4216\",\"Atrion\",\"ATRI\",\"1113033728\",\"620.04\",\"United States\"\n\"4217\",\"Polenergia\",\"PEP.WA\",\"1112671904\",\"21.73\",\"Poland\"\n\"4218\",\"Micro Focus\",\"MFGP\",\"1110446976\",\"3.31\",\"United Kingdom\"\n\"4219\",\"Himax\",\"HIMX\",\"1110284672\",\"6.37\",\"Taiwan\"\n\"4220\",\"La-Z-Boy\",\"LZB\",\"1109660160\",\"25.75\",\"United States\"\n\"4221\",\"GungHo Online Entertainment\",\"3765.T\",\"1109175744\",\"17.92\",\"Japan\"\n\"4222\",\"PGT Innovations\",\"PGTI\",\"1106097280\",\"18.46\",\"United States\"\n\"4223\",\"Prometheus Biosciences\",\"RXDX\",\"1105772672\",\"28.21\",\"United States\"\n\"4224\",\"Overstock.com\",\"OSTK\",\"1105598720\",\"25.88\",\"United States\"\n\"4225\",\"NOW Inc.\",\"DNOW\",\"1103768704\",\"9.97\",\"United States\"\n\"4226\",\"First Foundation\",\"FFWM\",\"1102592000\",\"19.51\",\"United States\"\n\"4227\",\"Grupa Kety\",\"KTY.WA\",\"1100773692\",\"114.07\",\"Poland\"\n\"4228\",\"Avid Bioservices\",\"CDMO\",\"1100657664\",\"17.8\",\"United States\"\n\"4229\",\"Fnac Darty\",\"FNAC.PA\",\"1100004199\",\"41.25\",\"France\"\n\"4230\",\"S&amp;T Bancorp\",\"STBA\",\"1098750848\",\"27.95\",\"United States\"\n\"4231\",\"SpartanNash\",\"SPTN\",\"1098603776\",\"30.41\",\"United States\"\n\"4232\",\"ImmunoGen\",\"IMGN\",\"1098269312\",\"4.98\",\"United States\"\n\"4233\",\"Chinook Therapeutics\",\"KDNY\",\"1097815296\",\"17.82\",\"United States\"\n\"4234\",\"Grendene\",\"GRND3.SA\",\"1095841282\",\"1.21\",\"Brazil\"\n\"4235\",\"Matterport\",\"MTTR\",\"1095736448\",\"3.89\",\"United States\"\n\"4236\",\"Hindustan Copper\",\"HINDCOPPER.NS\",\"1095242169\",\"1.13\",\"India\"\n\"4237\",\"CTS Corporation\",\"CTS\",\"1095225216\",\"34.13\",\"United States\"\n\"4238\",\"Revance Therapeutics\",\"RVNC\",\"1095161472\",\"15.05\",\"United States\"\n\"4239\",\"Cronos Group\",\"CRON\",\"1094812800\",\"2.92\",\"Canada\"\n\"4240\",\"Sandstorm Gold\",\"SAND\",\"1093225088\",\"5.61\",\"Canada\"\n\"4241\",\"VIP Industries\",\"VIPIND.NS\",\"1092229774\",\"7.72\",\"India\"\n\"4242\",\"Hims &amp; Hers Health\",\"HIMS\",\"1090073344\",\"5.29\",\"United States\"\n\"4243\",\"Tennant Company\",\"TNC\",\"1088590464\",\"58.59\",\"United States\"\n\"4244\",\"Compass Minerals\",\"CMP\",\"1087455744\",\"31.85\",\"United States\"\n\"4245\",\"Playa Hotels &amp; Resorts\",\"PLYA\",\"1085845888\",\"6.55\",\"United States\"\n\"4246\",\"Cellebrite\",\"CLBT\",\"1085473920\",\"5.73\",\"Israel\"\n\"4247\",\"Vacasa\",\"VCSA\",\"1083962496\",\"2.5\",\"United States\"\n\"4248\",\"SkyWest\",\"SKYW\",\"1083692672\",\"21.45\",\"United States\"\n\"4249\",\"Clean Energy Fuels\",\"CLNE\",\"1082701056\",\"4.86\",\"United States\"\n\"4250\",\"Ferroglobe\",\"GSM\",\"1079859328\",\"5.77\",\"United Kingdom\"\n\"4251\",\"MAG Silver\",\"MAG\",\"1079819776\",\"10.76\",\"Canada\"\n\"4252\",\"Omega Flex\",\"OFLX\",\"1078979712\",\"106.89\",\"United States\"\n\"4253\",\"Monarch Casino &amp; Resort\",\"MCRI\",\"1077956992\",\"57.11\",\"United States\"\n\"4254\",\"Everbridge\",\"EVBG\",\"1077876736\",\"27.26\",\"United States\"\n\"4255\",\"Norway Royal Salmon\",\"NRS.OL\",\"1077319266\",\"24.84\",\"Norway\"\n\"4256\",\"National Healthcare\",\"NHC\",\"1077118848\",\"69.62\",\"United States\"\n\"4257\",\"New York Mortgage Trust\",\"NYMT\",\"1075122176\",\"2.82\",\"United States\"\n\"4258\",\"Bally's Corporation\",\"BALY\",\"1074990208\",\"20.46\",\"United States\"\n\"4259\",\"Pacific Biosciences\",\"PACB\",\"1074794624\",\"4.79\",\"United States\"\n\"4260\",\"A10 Networks\",\"ATEN\",\"1073674880\",\"14.16\",\"United States\"\n\"4261\",\"Netstreit\",\"NTST\",\"1073492800\",\"20.6\",\"United States\"\n\"4262\",\"RHI Magnesita\",\"RHF.F\",\"1072480660\",\"22.12\",\"Austria\"\n\"4263\",\"Cyient\",\"CYIENT.NS\",\"1070742414\",\"9.7\",\"India\"\n\"4264\",\"Laredo Petroleum\",\"LPI\",\"1070567552\",\"61.87\",\"United States\"\n\"4265\",\"LivePerson\",\"LPSN\",\"1069842112\",\"14.37\",\"United States\"\n\"4266\",\"PAR Technology\",\"PAR\",\"1066799744\",\"39.42\",\"United States\"\n\"4267\",\"IDFC\",\"IDFC.NS\",\"1065230114\",\"0.67\",\"India\"\n\"4268\",\"PureCycle Technologies\",\"PCT\",\"1065088832\",\"6.53\",\"United States\"\n\"4269\",\"ACV Auctions\",\"ACVA\",\"1064242688\",\"6.77\",\"United States\"\n\"4270\",\"S&amp;T AG\",\"SANT.F\",\"1062721577\",\"16.08\",\"Austria\"\n\"4271\",\"Pegasus Airlines\",\"PGSUS.IS\",\"1059931027\",\"10.36\",\"Turkey\"\n\"4272\",\"Grupa Zywiec\",\"ZWC.WA\",\"1059838768\",\"103.18\",\"Poland\"\n\"4273\",\"NeoGenomics\",\"NEO\",\"1059195392\",\"8.49\",\"United States\"\n\"4274\",\"Finolex Industries\",\"FINPIPE.NS\",\"1057045842\",\"1.7\",\"India\"\n\"4275\",\"Singapore Post\",\"S08.SI\",\"1056065825\",\"0.47\",\"Singapore\"\n\"4276\",\"TAV Airports Holding\",\"TAVHL.IS\",\"1055058735\",\"2.92\",\"Turkey\"\n\"4277\",\"Tompkins Financial\",\"TMP\",\"1053411200\",\"72.53\",\"United States\"\n\"4278\",\"Accel Entertainment\",\"ACEL\",\"1053270784\",\"10.98\",\"United States\"\n\"4279\",\"iRobot\",\"IRBT\",\"1052774848\",\"38.83\",\"United States\"\n\"4280\",\"Shinpoong Pharm\",\"019170.KS\",\"1052226337\",\"19.88\",\"South Korea\"\n\"4281\",\"Expro Group\",\"XPRO\",\"1052006464\",\"9.6\",\"United States\"\n\"4282\",\"EaseMyTrip\",\"EASEMYTRIP.NS\",\"1051896220\",\"4.84\",\"India\"\n\"4283\",\"Domo\",\"DOMO\",\"1050970688\",\"31.16\",\"United States\"\n\"4284\",\"Digital World Acquisition\",\"DWAC\",\"1050135552\",\"28.22\",\"United States\"\n\"4285\",\"EIH Limited\",\"EIHOTEL.NS\",\"1049637722\",\"1.68\",\"India\"\n\"4286\",\"Quess\",\"QUESS.NS\",\"1049199932\",\"7.08\",\"India\"\n\"4287\",\"CSI\",\"CSVI\",\"1049010240\",\"38.2\",\"United States\"\n\"4288\",\"Li-Cycle\",\"LICY\",\"1046708928\",\"6\",\"Canada\"\n\"4289\",\"Efes Beverage Group\",\"AEFES.IS\",\"1045821878\",\"1.77\",\"Turkey\"\n\"4290\",\"Montrose Environmental\",\"MEG\",\"1045283840\",\"35.22\",\"United States\"\n\"4291\",\"Borosil\",\"BORORENEW.NS\",\"1045007493\",\"8.01\",\"India\"\n\"4292\",\"Nicolet Bankshares\",\"NCBS\",\"1044725568\",\"78.01\",\"United States\"\n\"4293\",\"Construction Partners\",\"ROAD\",\"1044594560\",\"19.88\",\"United States\"\n\"4294\",\"FibroGen\",\"FGEN\",\"1043999040\",\"11.19\",\"United States\"\n\"4295\",\"Rhön-Klinikum\",\"RHK.DE\",\"1043284819\",\"15.59\",\"Germany\"\n\"4296\",\"Federal Agricultural Mortgage\",\"AGM\",\"1042982784\",\"97\",\"United States\"\n\"4297\",\"Gree\",\"3632.T\",\"1042328129\",\"6.02\",\"Japan\"\n\"4298\",\"BELLUS Health\",\"BLU\",\"1040793024\",\"9.75\",\"Canada\"\n\"4299\",\"E. W. Scripps Company\",\"SSP\",\"1040298304\",\"12.49\",\"United States\"\n\"4300\",\"Volaris\",\"VLRS\",\"1039764224\",\"8.99\",\"Mexico\"\n\"4301\",\"Energy Vault\",\"NRGV\",\"1039299648\",\"7.77\",\"United States\"\n\"4302\",\"Magnite\",\"MGNI\",\"1037472128\",\"7.87\",\"United States\"\n\"4303\",\"Shentel\",\"SHEN\",\"1036665920\",\"20.71\",\"United States\"\n\"4304\",\"AZZ\",\"AZZ\",\"1036304384\",\"41.9\",\"United States\"\n\"4305\",\"Canopy Growth\",\"CGC\",\"1035503616\",\"2.27\",\"Canada\"\n\"4306\",\"Metrovacesa\",\"MVC.MC\",\"1034019009\",\"6.83\",\"Spain\"\n\"4307\",\"Nabors Industries\",\"NBR\",\"1033582208\",\"109.82\",\"Bermuda\"\n\"4308\",\"Solid Power\",\"SLDP\",\"1031330944\",\"5.94\",\"United States\"\n\"4309\",\"Amber Enterprises India\",\"AMBER.NS\",\"1030923411\",\"30.6\",\"India\"\n\"4310\",\"Syndax Pharmaceuticals\",\"SNDX\",\"1030738048\",\"18.33\",\"United States\"\n\"4311\",\"Green Brick Partners\",\"GRBK\",\"1028644672\",\"21.24\",\"United States\"\n\"4312\",\"TriState Capital Holdings\",\"TSC\",\"1028616384\",\"30.58\",\"United States\"\n\"4313\",\"Merus\",\"MRUS\",\"1027782400\",\"23.6\",\"Netherlands\"\n\"4314\",\"Mission Produce\",\"AVO\",\"1027335360\",\"14.54\",\"United States\"\n\"4315\",\"flatexDEGIRO AG\",\"FTK.DE\",\"1024784024\",\"9.33\",\"Germany\"\n\"4316\",\"PBF Logistics\",\"PBFX\",\"1022899712\",\"16.34\",\"United States\"\n\"4317\",\"The Andersons\",\"ANDE\",\"1022680896\",\"30.23\",\"United States\"\n\"4318\",\"Brookline Bancorp\",\"BRKL\",\"1022517376\",\"13.23\",\"United States\"\n\"4319\",\"H&amp;E Equipment Services\",\"HEES\",\"1022288448\",\"28.27\",\"United States\"\n\"4320\",\"Aimco\",\"AIV\",\"1021953152\",\"6.69\",\"United States\"\n\"4321\",\"Mesa Laboratories\",\"MLAB\",\"1021551168\",\"193.92\",\"United States\"\n\"4322\",\"MTY Food Group\",\"MTY.TO\",\"1020463812\",\"41.8\",\"Canada\"\n\"4323\",\"TORM\",\"TRMD\",\"1019755968\",\"12.49\",\"United Kingdom\"\n\"4324\",\"UMH Properties\",\"UMH\",\"1018739904\",\"18.78\",\"United States\"\n\"4325\",\"Kayne Anderson Capital Advisors\",\"KYN\",\"1017906432\",\"8.05\",\"United States\"\n\"4326\",\"Atoss\",\"AOF.F\",\"1017234148\",\"127.9\",\"Germany\"\n\"4327\",\"Docebo\",\"DCBO\",\"1016668992\",\"28.59\",\"Canada\"\n\"4328\",\"uniQure\",\"QURE\",\"1015051776\",\"21.76\",\"Netherlands\"\n\"4329\",\"Proterra\",\"PTRA\",\"1014650048\",\"4.55\",\"United States\"\n\"4330\",\"Freightways\",\"FRE.NZ\",\"1012358802\",\"6.11\",\"New Zealand\"\n\"4331\",\"Oceaneering International\",\"OII\",\"1011562880\",\"10.09\",\"United States\"\n\"4332\",\"LeMaitre Vascular\",\"LMAT\",\"1010889600\",\"46.05\",\"United States\"\n\"4333\",\"Hartalega\",\"5168.KL\",\"1009474433\",\"0.62\",\"Malaysia\"\n\"4334\",\"Graphite India\",\"GRAPHITE.NS\",\"1007006621\",\"5.15\",\"India\"\n\"4335\",\"Hamburger Hafen\",\"HHFA.F\",\"1004378675\",\"13.33\",\"Germany\"\n\"4336\",\"Eventbrite\",\"EB\",\"1004197632\",\"10.28\",\"United States\"\n\"4337\",\"MannKind Corp\",\"MNKD\",\"1003945792\",\"3.98\",\"United States\"\n\"4338\",\"Eldorado Gold\",\"EGO\",\"1002834112\",\"5.43\",\"Canada\"\n\"4339\",\"Amara Raja Batteries\",\"AMARAJABAT.NS\",\"1001675969\",\"5.86\",\"India\"\n\"4340\",\"BrightSpire Capital\",\"BRSP\",\"1001481728\",\"7.64\",\"United States\"\n\"4341\",\"Target Hospitality\",\"TH\",\"1001201984\",\"10.33\",\"United States\"\n\"4342\",\"DHT Holdings\",\"DHT\",\"1000794048\",\"6\",\"Bermuda\"\n\"4343\",\"Cerus\",\"CERS\",\"1000358208\",\"5.66\",\"United States\"\n\"4344\",\"iHeartMedia\",\"IHRT\",\"999138752\",\"7.03\",\"United States\"\n\"4345\",\"Standex\",\"SXI\",\"998526336\",\"82.73\",\"United States\"\n\"4346\",\"Verve Therapeutics\",\"VERV\",\"998370624\",\"20.52\",\"United States\"\n\"4347\",\"Lightwave Logic\",\"LWLG\",\"998105856\",\"8.94\",\"United States\"\n\"4348\",\"Rocket Pharmaceuticals\",\"RCKT\",\"998102528\",\"15.16\",\"United States\"\n\"4349\",\"OdontoPrev\",\"ODPV3.SA\",\"997859620\",\"1.78\",\"Brazil\"\n\"4350\",\"MapmyIndia\",\"MAPMYINDIA.NS\",\"996120400\",\"18.71\",\"India\"\n\"4351\",\"Enanta Pharmaceuticals\",\"ENTA\",\"994416704\",\"48.01\",\"United States\"\n\"4352\",\"Amneal Pharmaceuticals\",\"AMRX\",\"993348416\",\"3.28\",\"United States\"\n\"4353\",\"Uponor\",\"UPONOR.HE\",\"992258960\",\"13.66\",\"Finland\"\n\"4354\",\"Procaps Group\",\"PROC\",\"991722944\",\"8.79\",\"Luxembourg\"\n\"4355\",\"Melco International Development\",\"0200.HK\",\"991126703\",\"0.65\",\"Hong Kong\"\n\"4356\",\"Oscar Health\",\"OSCR\",\"989622848\",\"4.69\",\"United States\"\n\"4357\",\"Heska Corporation\",\"HSKA\",\"989497984\",\"91.7\",\"United States\"\n\"4358\",\"Vimeo\",\"VMEO\",\"986087808\",\"5.93\",\"United States\"\n\"4359\",\"Republic Bank\",\"RBCAA\",\"985755648\",\"49.29\",\"United States\"\n\"4360\",\"Merchants Bancorp\",\"MBIN\",\"985424128\",\"22.78\",\"United States\"\n\"4361\",\"Patrizia Immobilien\",\"P1Z.VI\",\"985297279\",\"11.04\",\"Germany\"\n\"4362\",\"Caleres\",\"CAL\",\"985296064\",\"26.82\",\"United States\"\n\"4363\",\"Intapp\",\"INTA\",\"985290112\",\"15.84\",\"United States\"\n\"4364\",\"BrainChip\",\"BRN.AX\",\"984267997\",\"0.54\",\"Australia\"\n\"4365\",\"Service Properties Trust\",\"SVC\",\"983942400\",\"5.96\",\"United States\"\n\"4366\",\"Mahanagar Gas\",\"MGL.NS\",\"982833277\",\"9.95\",\"India\"\n\"4367\",\"ADTRAN\",\"ADTN\",\"982403968\",\"20\",\"United States\"\n\"4368\",\"Innoviva\",\"INVA\",\"982053312\",\"14.09\",\"United States\"\n\"4369\",\"Brinker International\",\"EAT\",\"981602176\",\"22.39\",\"United States\"\n\"4370\",\"G-III Apparel Group\",\"GIII\",\"980904640\",\"20.34\",\"United States\"\n\"4371\",\"RadNet\",\"RDNT\",\"979343680\",\"17.42\",\"United States\"\n\"4372\",\"KRUK Spólka Akcyjna\",\"KRU.WA\",\"978132554\",\"51.45\",\"Poland\"\n\"4373\",\"Allego\",\"ALLG\",\"976465920\",\"3.68\",\"Netherlands\"\n\"4374\",\"Clearfield\",\"CLFD\",\"974600960\",\"70.77\",\"United States\"\n\"4375\",\"Genesis Energy  L.P.\",\"GEL\",\"974503040\",\"7.95\",\"United States\"\n\"4376\",\"Replimune\",\"REPL\",\"974039488\",\"19.85\",\"United States\"\n\"4377\",\"Belite Bio\",\"BLTE\",\"972727232\",\"40.37\",\"United States\"\n\"4378\",\"Fortress REIT\",\"FFA.JO\",\"971411472\",\"0.64\",\"South Africa\"\n\"4379\",\"Donnelley Financial Solutions\",\"DFIN\",\"971172224\",\"30.55\",\"United States\"\n\"4380\",\"Kiwi Property\",\"KWIPF\",\"971040128\",\"0.6\",\"New Zealand\"\n\"4381\",\"Amerant Bancorp\",\"AMTB\",\"970445568\",\"28.38\",\"United States\"\n\"4382\",\"The Greenbrier Companies\",\"GBX\",\"970135872\",\"29.77\",\"United States\"\n\"4383\",\"Cerence\",\"CRNC\",\"969271168\",\"24.66\",\"United States\"\n\"4384\",\"Radware\",\"RDWR\",\"968561280\",\"21.6\",\"Israel\"\n\"4385\",\"ConnectOne Bancorp\",\"CNOB\",\"967952576\",\"24.49\",\"United States\"\n\"4386\",\"The Necessity Retail REIT\",\"RTL\",\"967799680\",\"7.27\",\"United States\"\n\"4387\",\"AMERISAFE\",\"AMSF\",\"965633600\",\"49.98\",\"United States\"\n\"4388\",\"Office Properties Income Trust\",\"OPI\",\"965110272\",\"19.93\",\"United States\"\n\"4389\",\"ContextLogic (wish.com)\",\"WISH\",\"962853568\",\"1.45\",\"United States\"\n\"4390\",\"Astec Industries\",\"ASTE\",\"961542464\",\"42.1\",\"United States\"\n\"4391\",\"Model N\",\"MODN\",\"960004288\",\"26.07\",\"United States\"\n\"4392\",\"MoneyGram\",\"MGI\",\"957969088\",\"9.95\",\"United States\"\n\"4393\",\"TomTom\",\"TOM2.AS\",\"957390641\",\"7.54\",\"Netherlands\"\n\"4394\",\"Redwood Trust\",\"RWT\",\"956609920\",\"7.95\",\"United States\"\n\"4395\",\"Antares Pharma\",\"ATRS\",\"955062720\",\"5.59\",\"United States\"\n\"4396\",\"Intersect ENT\",\"XENT\",\"954898880\",\"28.24\",\"United States\"\n\"4397\",\"QCR Holdings\",\"QCRH\",\"953881664\",\"54.04\",\"United States\"\n\"4398\",\"Orion Engineered Carbons\",\"OEC\",\"953156480\",\"15.69\",\"United States\"\n\"4399\",\"Lakeland Bancorp\",\"LBAI\",\"952261568\",\"14.7\",\"United States\"\n\"4400\",\"Hollysys Automation Technologie\",\"HOLI\",\"951119808\",\"15.35\",\"China\"\n\"4401\",\"Harmonic\",\"HLIT\",\"950849920\",\"9.1\",\"United States\"\n\"4402\",\"Zhihu\",\"ZH\",\"950702400\",\"1.46\",\"China\"\n\"4403\",\"AdvanSix\",\"ASIX\",\"950453568\",\"33.82\",\"United States\"\n\"4404\",\"Momo\",\"MOMO\",\"950125248\",\"4.79\",\"China\"\n\"4405\",\"Guess\",\"GES\",\"949955328\",\"17.45\",\"United States\"\n\"4406\",\"Camping World\",\"CWH\",\"948649920\",\"22.75\",\"United States\"\n\"4407\",\"Gateway Real Estate\",\"GTY.F\",\"948374266\",\"5.08\",\"Germany\"\n\"4408\",\"Hudbay Minerals\",\"HBM\",\"947506944\",\"3.34\",\"Canada\"\n\"4409\",\"Zeta Global\",\"ZETA\",\"945644480\",\"4.66\",\"United States\"\n\"4410\",\"Cross Country Healthcare\",\"CCRN\",\"944647552\",\"24.72\",\"United States\"\n\"4411\",\"Imax Corp\",\"IMAX\",\"941615744\",\"16.09\",\"Canada\"\n\"4412\",\"Bluerock Residential\",\"BRG\",\"938679872\",\"26.19\",\"United States\"\n\"4413\",\"Arrival\",\"ARVL\",\"938268672\",\"1.47\",\"United Kingdom\"\n\"4414\",\"Origin Bancorp\",\"OBNK\",\"938150592\",\"39.47\",\"United States\"\n\"4415\",\"Magic Software\",\"MGIC\",\"937532608\",\"18.9\",\"Israel\"\n\"4416\",\"Sorrento Therapeutics\",\"SRNE\",\"937359872\",\"2.41\",\"United States\"\n\"4417\",\"IntegraFin\",\"IHP.L\",\"937306242\",\"282.9\",\"United Kingdom\"\n\"4418\",\"Enova International\",\"ENVA\",\"935471744\",\"28.73\",\"United States\"\n\"4419\",\"Sierra Wireless\",\"SWIR\",\"934175232\",\"24.37\",\"Canada\"\n\"4420\",\"Schnitzer Steel\",\"SCHN\",\"933472448\",\"34.01\",\"United States\"\n\"4421\",\"Sunteck Realty\",\"SUNTECK.NS\",\"933317570\",\"6.37\",\"India\"\n\"4422\",\"ACM Research\",\"ACMR\",\"933272640\",\"15.78\",\"United States\"\n\"4423\",\"Unitil Corporation\",\"UTL\",\"932362944\",\"58.16\",\"United States\"\n\"4424\",\"Ellington Financial\",\"EFC\",\"931313472\",\"15.51\",\"United States\"\n\"4425\",\"Kingsoft Cloud\",\"KC\",\"929124160\",\"3.82\",\"China\"\n\"4426\",\"Tejas Networks\",\"TEJASNET.NS\",\"928681880\",\"6.13\",\"India\"\n\"4427\",\"Mercer International\",\"MERC\",\"927838976\",\"14.03\",\"Canada\"\n\"4428\",\"Veeco\",\"VECO\",\"926985856\",\"18.09\",\"United States\"\n\"4429\",\"Designer Brands\",\"DBI\",\"925849344\",\"13.16\",\"United States\"\n\"4430\",\"Editas Medicine\",\"EDIT\",\"925282048\",\"13.48\",\"United States\"\n\"4431\",\"MYT Netherlands Parent (Mytheresa)\",\"MYTE\",\"925185216\",\"10.95\",\"Germany\"\n\"4432\",\"Kahoot!\",\"KAHOT.OL\",\"924735908\",\"1.89\",\"Norway\"\n\"4433\",\"Cassava Sciences\",\"SAVA\",\"918717760\",\"22.92\",\"United States\"\n\"4434\",\"IonQ\",\"IONQ\",\"917388224\",\"4.63\",\"United States\"\n\"4435\",\"Anavex Life Sciences\",\"AVXL\",\"915748480\",\"11.83\",\"United States\"\n\"4436\",\"International Seaways\",\"INSW\",\"914751936\",\"18.42\",\"United States\"\n\"4437\",\"Galicia Financial Group\",\"GGAL\",\"914307712\",\"6.2\",\"Argentina\"\n\"4438\",\"Network18\",\"NETWORK18.NS\",\"912564635\",\"0.87\",\"India\"\n\"4439\",\"Dah Sing Financial\",\"0440.HK\",\"911936145\",\"2.85\",\"Hong Kong\"\n\"4440\",\"Uranium Energy\",\"UEC\",\"911824128\",\"3.19\",\"United States\"\n\"4441\",\"Sumo Logic\",\"SUMO\",\"910810816\",\"7.87\",\"United States\"\n\"4442\",\"Qurate Retail Group\",\"QRTEA\",\"910115456\",\"2.31\",\"United States\"\n\"4443\",\"Jupiter Fund Management\",\"JUP.L\",\"907864446\",\"164.15\",\"United Kingdom\"\n\"4444\",\"Par Pacific Holdings\",\"PARR\",\"907816576\",\"15.1\",\"United States\"\n\"4445\",\"Hudco\",\"HUDCO.NS\",\"906429496\",\"0.45\",\"India\"\n\"4446\",\"Cellcom Israel\",\"CEL.TA\",\"904950699\",\"5.51\",\"Israel\"\n\"4447\",\"FREYR Battery\",\"FREY\",\"904449920\",\"7.74\",\"Luxembourg\"\n\"4448\",\"Morphic Therapeutic\",\"MORF\",\"904305920\",\"23.63\",\"United States\"\n\"4449\",\"Enerjisa Enerji\",\"ENJSA.IS\",\"903975533\",\"0.77\",\"Turkey\"\n\"4450\",\"Redfin\",\"RDFN\",\"902405120\",\"8.42\",\"United States\"\n\"4451\",\"Deluxe\",\"DLX\",\"901942784\",\"20.98\",\"United States\"\n\"4452\",\"Heritage Financial\",\"HFWA\",\"901780672\",\"25.69\",\"United States\"\n\"4453\",\"Alpha &amp; Omega Semiconductor\",\"AOSL\",\"901651776\",\"33.31\",\"United States\"\n\"4454\",\"SIGA Technologies\",\"SIGA\",\"900073280\",\"12.43\",\"United States\"\n\"4455\",\"Broadmark Realty Capital\",\"BRMK\",\"897734784\",\"6.76\",\"United States\"\n\"4456\",\"ProPetro\",\"PUMP\",\"894908992\",\"8.59\",\"United States\"\n\"4457\",\"SmartRent\",\"SMRT\",\"894620544\",\"4.58\",\"United States\"\n\"4458\",\"Boohoo Group\",\"BOO.L\",\"894146922\",\"66.18\",\"United Kingdom\"\n\"4459\",\"Titan International\",\"TWI\",\"891607680\",\"14.23\",\"United States\"\n\"4460\",\"Corporación América Airports\",\"CAAP\",\"891197632\",\"5.46\",\"Luxembourg\"\n\"4461\",\"Seabridge Gold\",\"SA\",\"888699136\",\"11.08\",\"Canada\"\n\"4462\",\"Praj Industries\",\"PRAJIND.NS\",\"886739353\",\"4.83\",\"India\"\n\"4463\",\"Cowen\",\"COWN\",\"886223680\",\"31.91\",\"United States\"\n\"4464\",\"2U\",\"TWOU\",\"885936960\",\"11.5\",\"United States\"\n\"4465\",\"Forrester Research\",\"FORR\",\"885284416\",\"46.9\",\"United States\"\n\"4466\",\"Community Healthcare Trust\",\"CHCT\",\"884303552\",\"35.27\",\"United States\"\n\"4467\",\"Juventus Turin\",\"JUVE.MI\",\"883410888\",\"0.35\",\"Italy\"\n\"4468\",\"Brooge Energy\",\"BROG\",\"881087488\",\"8.04\",\"United Arab Emirates\"\n\"4469\",\"Health Catalyst\",\"HCAT\",\"880506240\",\"16.25\",\"United States\"\n\"4470\",\"Nürnberger Versicherung\",\"NBG6.F\",\"880361991\",\"75.41\",\"Germany\"\n\"4471\",\"Ace Hardware Indonesia\",\"ACES.JK\",\"879726924\",\"0.05\",\"Indonesia\"\n\"4472\",\"Prosegur\",\"PSG.MC\",\"878084891\",\"1.66\",\"Spain\"\n\"4473\",\"Allcargo Logistics\",\"ALLCARGO.NS\",\"877463645\",\"3.57\",\"India\"\n\"4474\",\"MRC Global\",\"MRC\",\"877411648\",\"10.51\",\"United States\"\n\"4475\",\"GoPro\",\"GPRO\",\"875235456\",\"5.57\",\"United States\"\n\"4476\",\"United Fire Group\",\"UFCS\",\"872772480\",\"34.74\",\"United States\"\n\"4477\",\"Drägerwerk\",\"DRW8.F\",\"872446456\",\"41.68\",\"Germany\"\n\"4478\",\"Polyplex\",\"POLYPLEX.NS\",\"872267967\",\"27.79\",\"India\"\n\"4479\",\"Conduent\",\"CNDT\",\"872118208\",\"4.05\",\"United States\"\n\"4480\",\"James River Group\",\"JRVR\",\"871094016\",\"23.26\",\"Bermuda\"\n\"4481\",\"Secureworks\",\"SCWX\",\"871083840\",\"10.27\",\"United States\"\n\"4482\",\"Unisys\",\"UIS\",\"870499840\",\"12.87\",\"United States\"\n\"4483\",\"Steel Partners\",\"SPLP\",\"870042624\",\"42\",\"United States\"\n\"4484\",\"OYAK Çimento\",\"OYAKC.IS\",\"867604691\",\"0.75\",\"Turkey\"\n\"4485\",\"Pushpay Holdings\",\"PPH.NZ\",\"866940167\",\"0.75\",\"New Zealand\"\n\"4486\",\"Paya\",\"PAYA\",\"865731968\",\"6.56\",\"United States\"\n\"4487\",\"Palfinger\",\"PFI.F\",\"865647332\",\"22.47\",\"Austria\"\n\"4488\",\"Matthews International Corporation\",\"MATW\",\"864051136\",\"27.6\",\"United States\"\n\"4489\",\"Cresco Labs\",\"CRLBF\",\"863426688\",\"2.95\",\"United States\"\n\"4490\",\"NAPCO Security Technologies\",\"NSSC\",\"863277696\",\"23.5\",\"United States\"\n\"4491\",\"Multi Commodity Exchange\",\"MCX.NS\",\"856686858\",\"16.8\",\"India\"\n\"4492\",\"Alector\",\"ALEC\",\"856199680\",\"10.4\",\"United States\"\n\"4493\",\"Global Blue Group\",\"GB\",\"856041536\",\"4.55\",\"Switzerland\"\n\"4494\",\"RPT Realty\",\"RPT\",\"854917952\",\"9.85\",\"United States\"\n\"4495\",\"Restaurant Brands New Zealand\",\"RBD.NZ\",\"852856711\",\"6.84\",\"New Zealand\"\n\"4496\",\"Knr Constructions\",\"KNRCON.NS\",\"851932524\",\"3.03\",\"India\"\n\"4497\",\"AvePoint\",\"AVPT\",\"851899264\",\"4.66\",\"United States\"\n\"4498\",\"International Money Express\",\"IMXI\",\"851879168\",\"22.16\",\"United States\"\n\"4499\",\"Nuvalent\",\"NUVL\",\"851292736\",\"17.62\",\"United States\"\n\"4500\",\"I-Mab Biopharma\",\"IMAB\",\"851254784\",\"10.3\",\"China\"\n\"4501\",\"Blucora\",\"BCOR\",\"850927488\",\"18.01\",\"United States\"\n\"4502\",\"American Axle &amp; Manufacturing\",\"AXL\",\"850630976\",\"7.43\",\"United States\"\n\"4503\",\"Abercrombie &amp; Fitch\",\"ANF\",\"849777984\",\"16.85\",\"United States\"\n\"4504\",\"SMART Global Holdings\",\"SGH\",\"847355968\",\"16.95\",\"United States\"\n\"4505\",\"Arcellx\",\"ACLX\",\"847270720\",\"19.35\",\"United States\"\n\"4506\",\"Tecnoglass\",\"TGLS\",\"846704448\",\"17.76\",\"Colombia\"\n\"4507\",\"Triumph Group\",\"TGI\",\"843324160\",\"13.04\",\"United States\"\n\"4508\",\"NeoPhotonics\",\"NPTN\",\"840071808\",\"15.71\",\"United States\"\n\"4509\",\"Nano Dimension\",\"NNDM\",\"839166336\",\"3.26\",\"United States\"\n\"4510\",\"Dril-Quip\",\"DRQ\",\"838809216\",\"24.3\",\"United States\"\n\"4511\",\"MarineMax\",\"HZO\",\"838431488\",\"38.94\",\"United States\"\n\"4512\",\"Washington Trust Bancorp\",\"WASH\",\"838198208\",\"48.3\",\"United States\"\n\"4513\",\"Avidity Biosciences\",\"RNA\",\"837518016\",\"16.83\",\"United States\"\n\"4514\",\"Westlake Chemical Partners\",\"WLKP\",\"837046336\",\"23.77\",\"United States\"\n\"4515\",\"Denison Mines\",\"DNN\",\"836744576\",\"0.98\",\"Canada\"\n\"4516\",\"Energy Fuels\",\"UUUU\",\"835610112\",\"5.09\",\"United States\"\n\"4517\",\"PropertyGuru\",\"PGRU\",\"835073024\",\"5.18\",\"Singapore\"\n\"4518\",\"GPA\",\"CBD\",\"834600512\",\"3.1\",\"Brazil\"\n\"4519\",\"Nuvation Bio\",\"NUVB\",\"834343424\",\"3.83\",\"United States\"\n\"4520\",\"OneConnect\",\"OCFT\",\"834333632\",\"2.09\",\"China\"\n\"4521\",\"Varex Imaging\",\"VREX\",\"833611008\",\"20.95\",\"United States\"\n\"4522\",\"Digi International\",\"DGII\",\"833264000\",\"23.75\",\"United States\"\n\"4523\",\"Suzlon\",\"SUZLON.NS\",\"832296474\",\"0.08\",\"India\"\n\"4524\",\"Dole PLC\",\"DOLE\",\"832077440\",\"8.77\",\"Ireland\"\n\"4525\",\"AerSale\",\"ASLE\",\"831661568\",\"16.09\",\"United States\"\n\"4526\",\"PubMatic\",\"PUBM\",\"831299648\",\"15.97\",\"United States\"\n\"4527\",\"OrthoPediatrics\",\"KIDS\",\"831054464\",\"41.08\",\"United States\"\n\"4528\",\"Doosan\",\"000150.KS\",\"828651758\",\"50.47\",\"South Korea\"\n\"4529\",\"Huya\",\"HUYA\",\"827939584\",\"3.48\",\"China\"\n\"4530\",\"Perion Network\",\"PERI\",\"827089920\",\"18.16\",\"Israel\"\n\"4531\",\"Adecoagro\",\"AGRO\",\"826625280\",\"7.43\",\"Luxembourg\"\n\"4532\",\"Afya\",\"AFYA\",\"824131968\",\"9.07\",\"Brazil\"\n\"4533\",\"Lion Electric\",\"LEV\",\"824122496\",\"4.34\",\"Canada\"\n\"4534\",\"Norwegian Air Shuttle\",\"NAS.OL\",\"824089121\",\"0.89\",\"Norway\"\n\"4535\",\"Deciphera Pharmaceuticals\",\"DCPH\",\"823733248\",\"12.44\",\"United States\"\n\"4536\",\"Prince Pipes And Fittings\",\"PRINCEPIPE.NS\",\"822303394\",\"7.43\",\"India\"\n\"4537\",\"Gladstone Land\",\"LAND\",\"822169536\",\"23.89\",\"United States\"\n\"4538\",\"Perdoceo Education\",\"PRDO\",\"820537024\",\"11.93\",\"United States\"\n\"4539\",\"Associated Capital Group\",\"AC\",\"820466560\",\"37.22\",\"United States\"\n\"4540\",\"Kaman\",\"KAMN\",\"819460992\",\"29.29\",\"United States\"\n\"4541\",\"Bombay Burmah\",\"BBTC.NS\",\"819452144\",\"11.74\",\"India\"\n\"4542\",\"Mahindra Lifespaces\",\"MAHLIFE.NS\",\"817375295\",\"5.28\",\"India\"\n\"4543\",\"Outset Medical\",\"OM\",\"817282560\",\"17.1\",\"United States\"\n\"4544\",\"UserTesting\",\"USER\",\"817187712\",\"5.72\",\"United States\"\n\"4545\",\"Riverstone Holdings\",\"AP4.SI\",\"817043693\",\"0.55\",\"Singapore\"\n\"4546\",\"PDF Solutions\",\"PDFS\",\"816366912\",\"22.09\",\"United States\"\n\"4547\",\"Ivanhoe Electric\",\"IE\",\"816020224\",\"8.79\",\"Canada\"\n\"4548\",\"Materialise NV\",\"MTLS\",\"815371648\",\"13.81\",\"Belgium\"\n\"4549\",\"Mensch und Maschine\",\"MUM.F\",\"813098667\",\"47.56\",\"Germany\"\n\"4550\",\"Chalet Hotels\",\"CHALET.NS\",\"811230986\",\"3.95\",\"India\"\n\"4551\",\"Arco Platform\",\"ARCE\",\"810700992\",\"14.26\",\"Brazil\"\n\"4552\",\"Marathon Digital Holdings\",\"MARA\",\"809543040\",\"7.62\",\"United States\"\n\"4553\",\"SLR Investment\",\"SLRC\",\"809381632\",\"14.78\",\"United States\"\n\"4554\",\"Ryerson\",\"RYI\",\"807876352\",\"20.82\",\"United States\"\n\"4555\",\"Calumet Specialty Products Partners\",\"CLMT\",\"806935232\",\"10.2\",\"United States\"\n\"4556\",\"Cosmo Pharmaceuticals\",\"C43.F\",\"806705617\",\"47.66\",\"Ireland\"\n\"4557\",\"iTeos Therapeutics\",\"ITOS\",\"803930688\",\"22.62\",\"United States\"\n\"4558\",\"Clarus\",\"CLAR\",\"802619328\",\"21.2\",\"United States\"\n\"4559\",\"Asiana Airlines\",\"020560.KS\",\"802378669\",\"10.78\",\"South Korea\"\n\"4560\",\"Great Lakes Dredge &amp; Dock Corp.\",\"GLDD\",\"802033984\",\"12.14\",\"United States\"\n\"4561\",\"Geo Group\",\"GEO\",\"800419200\",\"6.45\",\"United States\"\n\"4562\",\"CEVA\",\"CEVA\",\"800163584\",\"34.48\",\"United States\"\n\"4563\",\"TimkenSteel\",\"TMST\",\"800102144\",\"17.16\",\"United States\"\n\"4564\",\"Vivint Smart Home\",\"VVNT\",\"797133696\",\"3.75\",\"United States\"\n\"4565\",\"CBL Properties\",\"CBL\",\"796627584\",\"25.04\",\"United States\"\n\"4566\",\"AngioDynamics\",\"ANGO\",\"796543296\",\"20.54\",\"United States\"\n\"4567\",\"Phibro Animal Health\",\"PAHC\",\"796300800\",\"19.66\",\"United States\"\n\"4568\",\"Poshmark\",\"POSH\",\"795300288\",\"10.18\",\"United States\"\n\"4569\",\"Property For Industry\",\"PFI.NZ\",\"794273932\",\"1.57\",\"New Zealand\"\n\"4570\",\"Allegiance Bancshares\",\"ABTX\",\"793319424\",\"38.93\",\"United States\"\n\"4571\",\"Benchmark Electronics\",\"BHE\",\"793303168\",\"22.58\",\"United States\"\n\"4572\",\"Finolex Cables\",\"FINCABLES.NS\",\"793279226\",\"5.19\",\"India\"\n\"4573\",\"IGM Biosciences\",\"IGMS\",\"793121088\",\"18.65\",\"United States\"\n\"4574\",\"Aliansce Sonae Shopping Centers\",\"ALSO3.SA\",\"792636798\",\"2.99\",\"Brazil\"\n\"4575\",\"Summit Hotel Properties\",\"INN\",\"790540288\",\"7.4\",\"United States\"\n\"4576\",\"Myers Industries\",\"MYE\",\"790483456\",\"21.75\",\"United States\"\n\"4577\",\"ChipMOS Technologies\",\"IMOS\",\"789602560\",\"21.62\",\"Taiwan\"\n\"4578\",\"Vertex Energy\",\"VTNR\",\"789516416\",\"10.51\",\"United States\"\n\"4579\",\"WalkMe\",\"WKME\",\"788867264\",\"9.34\",\"Israel\"\n\"4580\",\"Consolidated Communications\",\"CNSL\",\"788154688\",\"6.83\",\"United States\"\n\"4581\",\"Columbus McKinnon\",\"CMCO\",\"787711040\",\"27.59\",\"United States\"\n\"4582\",\"Core Laboratories\",\"CLB\",\"786595072\",\"16.98\",\"Netherlands\"\n\"4583\",\"SilverCrest Metals\",\"SILV\",\"785044288\",\"5.38\",\"Canada\"\n\"4584\",\"Cimpress\",\"CMPR\",\"783174016\",\"30\",\"Ireland\"\n\"4585\",\"Sunlight REIT\",\"0435.HK\",\"781965504\",\"0.46\",\"Hong Kong\"\n\"4586\",\"Microvision\",\"MVIS\",\"781443328\",\"4.73\",\"United States\"\n\"4587\",\"ScanSource\",\"SCSC\",\"780933504\",\"30.95\",\"United States\"\n\"4588\",\"Mastek\",\"MASTEK.NS\",\"779510839\",\"25.95\",\"India\"\n\"4589\",\"Codexis\",\"CDXS\",\"779077952\",\"11.93\",\"United States\"\n\"4590\",\"Tidewater\",\"TDW\",\"778586048\",\"18.62\",\"United States\"\n\"4591\",\"VEON\",\"VEON\",\"776650304\",\"0.44\",\"Netherlands\"\n\"4592\",\"Interface\",\"TILE\",\"776644288\",\"13.06\",\"United States\"\n\"4593\",\"Latham Group\",\"SWIM\",\"774971072\",\"6.48\",\"United States\"\n\"4594\",\"CrossAmerica Partners\",\"CAPL\",\"772660800\",\"20.38\",\"United States\"\n\"4595\",\"RE/MAX Holdings\",\"RMAX\",\"772414592\",\"24.27\",\"United States\"\n\"4596\",\"Quanex Building Products\",\"NX\",\"771987328\",\"23.17\",\"United States\"\n\"4597\",\"Brookdale Senior Living\",\"BKD\",\"771605952\",\"4.12\",\"United States\"\n\"4598\",\"Fortuna Silver Mines\",\"FSM\",\"771132224\",\"2.56\",\"Canada\"\n\"4599\",\"Symphony Limited\",\"SYMPHONY.NS\",\"771121324\",\"11.02\",\"India\"\n\"4600\",\"Badger Infrastructure Solutions\",\"BDGI.TO\",\"770259176\",\"22.34\",\"Canada\"\n\"4601\",\"Cadre\",\"CDRE\",\"766568640\",\"20.7\",\"United States\"\n\"4602\",\"System1\",\"SST\",\"766099456\",\"8.46\",\"United States\"\n\"4603\",\"CinCor Pharma\",\"CINC\",\"765510912\",\"20.3\",\"United States\"\n\"4604\",\"Zensar\",\"ZENSARTECH.NS\",\"763979083\",\"3.21\",\"India\"\n\"4605\",\"Calavo Growers\",\"CVGW\",\"763265152\",\"43.02\",\"United States\"\n\"4606\",\"Pacific Century Regional Developments\",\"P15.SI\",\"762857057\",\"0.29\",\"Singapore\"\n\"4607\",\"Mirum Pharmaceuticals\",\"MIRM\",\"761788096\",\"23.85\",\"United States\"\n\"4608\",\"Hyzon Motors\",\"HYZN\",\"761056000\",\"3.07\",\"United States\"\n\"4609\",\"Erasca\",\"ERAS\",\"760393920\",\"6.24\",\"United States\"\n\"4610\",\"Alabama Power\",\"ALP-PQ\",\"760383744\",\"24.9\",\"United States\"\n\"4611\",\"Snap One\",\"SNPO\",\"758784000\",\"10\",\"United States\"\n\"4612\",\"Kearny Financial\",\"KRNY\",\"756445056\",\"11.16\",\"United States\"\n\"4613\",\"Univest\",\"UVSP\",\"756399616\",\"25.56\",\"United States\"\n\"4614\",\"Gladstone Commercial\",\"GOOD\",\"754732992\",\"19.18\",\"United States\"\n\"4615\",\"Hawaiian Airlines\",\"HA\",\"753995072\",\"14.69\",\"United States\"\n\"4616\",\"Coeur Mining\",\"CDE\",\"753627200\",\"2.68\",\"United States\"\n\"4617\",\"ReconAfrica\",\"0XD.F\",\"752993110\",\"3.77\",\"Canada\"\n\"4618\",\"Eurowag\",\"WPS.L\",\"752275881\",\"108.05\",\"United Kingdom\"\n\"4619\",\"Perella Weinberg Partners\",\"PWP\",\"751882944\",\"5.59\",\"United States\"\n\"4620\",\"Zeal Network\",\"TIMA.F\",\"751153810\",\"32.78\",\"Germany\"\n\"4621\",\"Couchbase\",\"BASE\",\"749795008\",\"16.83\",\"United States\"\n\"4622\",\"Evolus\",\"EOLS\",\"749655360\",\"13.38\",\"United States\"\n\"4623\",\"Azul\",\"AZUL\",\"749646528\",\"6.47\",\"Brazil\"\n\"4624\",\"Chase Corporation\",\"CCF\",\"747568832\",\"78.95\",\"United States\"\n\"4625\",\"Thryv\",\"THRY\",\"747428608\",\"21.83\",\"United States\"\n\"4626\",\"Horizon Bancorp\",\"HBNC\",\"746402048\",\"17.13\",\"United States\"\n\"4627\",\"Artivion\",\"AORT\",\"746141696\",\"18.56\",\"United States\"\n\"4628\",\"Olvi plc\",\"OLVAS.HE\",\"745988891\",\"35.5\",\"Finland\"\n\"4629\",\"Transportadora de Gas del Sur\",\"TGS\",\"745232384\",\"4.95\",\"Argentina\"\n\"4630\",\"Eckert &amp; Ziegler\",\"EUZ.F\",\"744837277\",\"35.33\",\"Germany\"\n\"4631\",\"Origin Materials\",\"ORGN\",\"744661568\",\"5.27\",\"United States\"\n\"4632\",\"Anterix\",\"ATEX\",\"743622656\",\"39.25\",\"United States\"\n\"4633\",\"Forestar Group\",\"FOR\",\"743587584\",\"14.95\",\"United States\"\n\"4634\",\"Morphosys\",\"MOR\",\"743076864\",\"5.44\",\"Germany\"\n\"4635\",\"Precision Drilling Corporation\",\"PDS\",\"742817920\",\"54.21\",\"Canada\"\n\"4636\",\"TPG Real Estate Finance Trust\",\"TRTX\",\"742527360\",\"9.62\",\"United States\"\n\"4637\",\"Pharvaris\",\"PHVS\",\"742448000\",\"22.4\",\"Netherlands\"\n\"4638\",\"Sundial Growers\",\"SNDL\",\"742277376\",\"0.31\",\"Canada\"\n\"4639\",\"U.S. Silica\",\"SLCA\",\"741941824\",\"9.83\",\"United States\"\n\"4640\",\"American Woodmark\",\"AMWD\",\"741733952\",\"44.7\",\"United States\"\n\"4641\",\"MMTC\",\"MMTC.NS\",\"741434804\",\"0.49\",\"India\"\n\"4642\",\"Y-mAbs Therapeutics\",\"YMAB\",\"740586304\",\"16.94\",\"United States\"\n\"4643\",\"Adler Real Estate\",\"ADL.DE\",\"739348658\",\"6.76\",\"Germany\"\n\"4644\",\"First Mid-Illinois Bancshares\",\"FMBH\",\"738815168\",\"36.13\",\"United States\"\n\"4645\",\"SP Plus Corporation\",\"SP\",\"738791616\",\"31.76\",\"United States\"\n\"4646\",\"Ichor Systems\",\"ICHR\",\"738523776\",\"25.8\",\"United States\"\n\"4647\",\"Kelly Services\",\"KELYA\",\"737820544\",\"19.48\",\"United States\"\n\"4648\",\"Biolife Solutions\",\"BLFS\",\"737716736\",\"17.4\",\"United States\"\n\"4649\",\"Seritage Growth Properties\",\"SRG\",\"737701248\",\"10.66\",\"United States\"\n\"4650\",\"sterling &amp; wilson solar\",\"SWSOLAR.NS\",\"737582221\",\"3.89\",\"India\"\n\"4651\",\"Select Energy Services\",\"WTTR\",\"737441408\",\"6.45\",\"United States\"\n\"4652\",\"Global Medical REIT\",\"GMRE\",\"736734528\",\"10.96\",\"United States\"\n\"4653\",\"AudioCodes\",\"AUDC\",\"735303872\",\"22.62\",\"Israel\"\n\"4654\",\"WisdomTree Investments\",\"WETF\",\"734045568\",\"5.01\",\"United States\"\n\"4655\",\"Archer Aviation\",\"ACHR\",\"731985024\",\"3.03\",\"United States\"\n\"4656\",\"Schweitzer-Mauduit International\",\"SWM\",\"731768512\",\"23.41\",\"United States\"\n\"4657\",\"Blink Charging\",\"BLNK\",\"731763648\",\"17.12\",\"United States\"\n\"4658\",\"Arqit Quantum\",\"ARQQ\",\"731555968\",\"6\",\"United Kingdom\"\n\"4659\",\"Rover\",\"ROVR\",\"731394816\",\"4.02\",\"United States\"\n\"4660\",\"ARMOUR Residential REIT\",\"ARR\",\"730980096\",\"7.09\",\"United States\"\n\"4661\",\"Orient Electric\",\"ORIENTELEC.NS\",\"730566918\",\"3.44\",\"India\"\n\"4662\",\"Desktop Metal\",\"DM\",\"729987968\",\"2.33\",\"United States\"\n\"4663\",\"TG Therapeutics\",\"TGTX\",\"729396800\",\"5.05\",\"United States\"\n\"4664\",\"Sleep Number\",\"SNBR\",\"728542656\",\"32.77\",\"United States\"\n\"4665\",\"Jubilant Pharmova\",\"JUBLPHARMA.NS\",\"728311614\",\"4.57\",\"India\"\n\"4666\",\"Community Trust Bancorp\",\"CTBI\",\"728155648\",\"40.69\",\"United States\"\n\"4667\",\"Lilium\",\"LILM\",\"727947520\",\"2.5\",\"Germany\"\n\"4668\",\"Movado\",\"MOV\",\"727647488\",\"31.78\",\"United States\"\n\"4669\",\"SiriusPoint\",\"SPNT\",\"727458048\",\"4.49\",\"Bermuda\"\n\"4670\",\"Aeva Technologies\",\"AEVA\",\"727038592\",\"3.36\",\"United States\"\n\"4671\",\"VRL Logistics\",\"VRLLOG.NS\",\"726954970\",\"8.23\",\"India\"\n\"4672\",\"Metropolitan Bank Holding\",\"MCB\",\"726430784\",\"64.84\",\"United States\"\n\"4673\",\"Butterfly Network\",\"BFLY\",\"726193024\",\"3.65\",\"United States\"\n\"4674\",\"SPARC\",\"SPARC.NS\",\"724595757\",\"2.67\",\"India\"\n\"4675\",\"Similarweb\",\"SMWB\",\"723962048\",\"9.54\",\"Israel\"\n\"4676\",\"ATN International\",\"ATNI\",\"723626368\",\"45.96\",\"United States\"\n\"4677\",\"Sterlite Technologies\",\"STLTECH.NS\",\"722774998\",\"1.82\",\"India\"\n\"4678\",\"BrightSphere Investment Group\",\"BSIG\",\"722046464\",\"17.43\",\"United States\"\n\"4679\",\"Wemade\",\"112040.KQ\",\"719881403\",\"43.9\",\"South Korea\"\n\"4680\",\"Plymouth Industrial REIT\",\"PLYM\",\"719602112\",\"17.72\",\"United States\"\n\"4681\",\"New Work\",\"NWO.F\",\"718873742\",\"127.9\",\"Germany\"\n\"4682\",\"Air New Zealand\",\"ANZFF\",\"718426240\",\"0.39\",\"New Zealand\"\n\"4683\",\"HarborOne Bancorp\",\"HONE\",\"717607808\",\"14\",\"United States\"\n\"4684\",\"NEUCA\",\"NEU.WA\",\"716828666\",\"166.39\",\"Poland\"\n\"4685\",\"Greenpanel Industries\",\"GREENPANEL.NS\",\"716504627\",\"5.84\",\"India\"\n\"4686\",\"Via S.A.\",\"VIIA3.SA\",\"716297671\",\"0.45\",\"Brazil\"\n\"4687\",\"National Western Life\",\"NWLI\",\"716295936\",\"197\",\"United States\"\n\"4688\",\"Novonix\",\"NVX\",\"715564288\",\"5.89\",\"Australia\"\n\"4689\",\"Allbirds\",\"BIRD\",\"715157888\",\"4.82\",\"United States\"\n\"4690\",\"Agenus\",\"AGEN\",\"714219008\",\"2.53\",\"United States\"\n\"4691\",\"Transport Corporation of India\",\"TCI.NS\",\"711442378\",\"9.2\",\"India\"\n\"4692\",\"PMV Pharmaceuticals\",\"PMVP\",\"710955968\",\"15.6\",\"United States\"\n\"4693\",\"Terran Orbital\",\"LLAP\",\"710898368\",\"5.16\",\"United States\"\n\"4694\",\"Gorman-Rupp\",\"GRC\",\"710655488\",\"27.25\",\"United States\"\n\"4695\",\"Kura Sushi USA\",\"KRUS\",\"710278720\",\"72.92\",\"United States\"\n\"4696\",\"NBCC India\",\"NBCC.NS\",\"709739901\",\"0.39\",\"India\"\n\"4697\",\"Enfusion\",\"ENFN\",\"709611264\",\"10.82\",\"United States\"\n\"4698\",\"Universal Health Realty Income Trust\",\"UHT\",\"709443008\",\"51.46\",\"United States\"\n\"4699\",\"Azure Power\",\"AZRE\",\"708336512\",\"11.04\",\"India\"\n\"4700\",\"Farmland Partners\",\"FPI\",\"708131264\",\"13.88\",\"United States\"\n\"4701\",\"Slam Corp\",\"SLAM\",\"706531264\",\"9.83\",\"United States\"\n\"4702\",\"Wabash National\",\"WNC\",\"705579136\",\"14.39\",\"United States\"\n\"4703\",\"Kiniksa Pharmaceuticals\",\"KNSA\",\"705226624\",\"10.18\",\"Bermuda\"\n\"4704\",\"YG Entertainment\",\"122870.KQ\",\"704179015\",\"38.7\",\"South Korea\"\n\"4705\",\"Insteel Industries\",\"IIIN\",\"704087872\",\"36.22\",\"United States\"\n\"4706\",\"Riskified\",\"RSKD\",\"701870400\",\"4.2\",\"Israel\"\n\"4707\",\"CTI BioPharma\",\"CTIC\",\"701747456\",\"6.44\",\"United States\"\n\"4708\",\"Canaan\",\"CAN\",\"701036288\",\"3.75\",\"China\"\n\"4709\",\"RITES\",\"RITES.NS\",\"700885807\",\"2.92\",\"India\"\n\"4710\",\"Genesco\",\"GCO\",\"699756928\",\"50.97\",\"United States\"\n\"4711\",\"Instil Bio\",\"TIL\",\"699480512\",\"5.41\",\"United States\"\n\"4712\",\"Cutera\",\"CUTR\",\"699109312\",\"38.49\",\"United States\"\n\"4713\",\"Com2uS\",\"078340.KQ\",\"699071235\",\"56.21\",\"South Korea\"\n\"4714\",\"ADC Therapeutics\",\"ADCT\",\"698975552\",\"9.1\",\"Switzerland\"\n\"4715\",\"Renren\",\"RENN\",\"698210752\",\"28.02\",\"China\"\n\"4716\",\"Universal Logistics Holdings\",\"ULH\",\"698060864\",\"26.4\",\"United States\"\n\"4717\",\"Jindal Stainless\",\"JSL.NS\",\"696300706\",\"1.32\",\"India\"\n\"4718\",\"Iamgold\",\"IAG\",\"695490432\",\"1.42\",\"Canada\"\n\"4719\",\"Accolade\",\"ACCD\",\"694291648\",\"9.75\",\"United States\"\n\"4720\",\"Bluelinx\",\"BXC\",\"692572288\",\"71.71\",\"United States\"\n\"4721\",\"Cera Sanitaryware\",\"CERA.NS\",\"692363791\",\"53.22\",\"India\"\n\"4722\",\"BEML\",\"BEML.NS\",\"690749150\",\"16.55\",\"India\"\n\"4723\",\"Arhaus\",\"ARHS\",\"690510592\",\"4.93\",\"United States\"\n\"4724\",\"Magnachip\",\"MX\",\"690475904\",\"15.38\",\"Luxembourg\"\n\"4725\",\"Nexa Resources\",\"NEXA\",\"688682752\",\"5.2\",\"Luxembourg\"\n\"4726\",\"TCG BDC\",\"CGBD\",\"688621568\",\"13.12\",\"United States\"\n\"4727\",\"Winmark\",\"WINA\",\"688309440\",\"197.86\",\"United States\"\n\"4728\",\"Hanmi Financial\",\"HAFC\",\"687030848\",\"22.55\",\"United States\"\n\"4729\",\"Ares Commercial Real Estate\",\"ACRE\",\"683746304\",\"12.56\",\"United States\"\n\"4730\",\"New Found Gold\",\"NFGC\",\"682602304\",\"4.13\",\"Canada\"\n\"4731\",\"Genco Shipping &amp; Trading\",\"GNK\",\"681846720\",\"16.2\",\"United States\"\n\"4732\",\"Ponsse\",\"PON1V.HE\",\"681596911\",\"23.63\",\"Finland\"\n\"4733\",\"Taboola.com\",\"TBLA\",\"681560384\",\"2.85\",\"United States\"\n\"4734\",\"VIB Vermögen\",\"VIH1.F\",\"681256414\",\"24.59\",\"Germany\"\n\"4735\",\"Big Lots\",\"BIG\",\"681071936\",\"23.46\",\"United States\"\n\"4736\",\"YIT\",\"YIT.HE\",\"680884448\",\"3.25\",\"Finland\"\n\"4737\",\"Cars.com\",\"CARS\",\"678936896\",\"9.77\",\"United States\"\n\"4738\",\"Tremor International\",\"TRMR\",\"678206272\",\"9.03\",\"Israel\"\n\"4739\",\"Geopark\",\"GPRK\",\"678183040\",\"11.3\",\"Chile\"\n\"4740\",\"Tokmanni\",\"TOKMAN.HE\",\"677870367\",\"11.43\",\"Finland\"\n\"4741\",\"indie Semiconductor\",\"INDI\",\"677343232\",\"5.71\",\"United States\"\n\"4742\",\"Banco Macro\",\"BMA\",\"677131968\",\"10.59\",\"Argentina\"\n\"4743\",\"ESAB India\",\"ESABINDIA.NS\",\"675904628\",\"43.86\",\"India\"\n\"4744\",\"Heritage-Crystal Clean\",\"HCCI\",\"674976128\",\"27.8\",\"United States\"\n\"4745\",\"Locaweb\",\"LWSA3.SA\",\"674069725\",\"1.14\",\"Brazil\"\n\"4746\",\"Delegat\",\"DGL.NZ\",\"673951733\",\"6.66\",\"New Zealand\"\n\"4747\",\"MBIA\",\"MBI\",\"673100352\",\"12.27\",\"United States\"\n\"4748\",\"Frontier Developments\",\"FDEV.L\",\"672917296\",\"1706.9\",\"United Kingdom\"\n\"4749\",\"TerrAscend\",\"TRSSF\",\"672387520\",\"2.24\",\"Canada\"\n\"4750\",\"Norma Group\",\"NOEJ.F\",\"672075616\",\"21\",\"Germany\"\n\"4751\",\"The Shyft Group\",\"SHYF\",\"672036544\",\"19.18\",\"United States\"\n\"4752\",\"JBM Auto\",\"JBMA.NS\",\"670465172\",\"5.66\",\"India\"\n\"4753\",\"UB Properties\",\"UBA\",\"670067136\",\"16.35\",\"United States\"\n\"4754\",\"HealthStream\",\"HSTM\",\"669838336\",\"21.89\",\"United States\"\n\"4755\",\"Team17\",\"TM17.L\",\"669739167\",\"460.01\",\"United Kingdom\"\n\"4756\",\"Standard Lithium\",\"SLI\",\"668411840\",\"4.03\",\"Canada\"\n\"4757\",\"Kalpataru Power Transmission\",\"KALPATPOWR.NS\",\"667217088\",\"4.47\",\"India\"\n\"4758\",\"Bristow Group\",\"VTOL\",\"666168192\",\"23.52\",\"United States\"\n\"4759\",\"Douglas Dynamics\",\"PLOW\",\"665555008\",\"29.08\",\"United States\"\n\"4760\",\"Dynex Capital\",\"DX\",\"664630080\",\"16.24\",\"United States\"\n\"4761\",\"MediaAlpha\",\"MAX\",\"662801984\",\"11.01\",\"United States\"\n\"4762\",\"UP Fintech (Tiger Brokers)\",\"TIGR\",\"662531008\",\"4.34\",\"China\"\n\"4763\",\"Camden National Bank\",\"CAC\",\"662473792\",\"45.2\",\"United States\"\n\"4764\",\"Theravance Biopharma\",\"TBPH\",\"662203968\",\"8.7\",\"Cayman Islands\"\n\"4765\",\"Gujarat Alkalies and Chemicals\",\"GUJALKALI.NS\",\"661096425\",\"9\",\"India\"\n\"4766\",\"Microvast\",\"MVST\",\"661047744\",\"2.19\",\"United States\"\n\"4767\",\"Baozun\",\"BZUN\",\"660828288\",\"9.62\",\"China\"\n\"4768\",\"Geron\",\"GERN\",\"660532288\",\"1.75\",\"United States\"\n\"4769\",\"Quanterix\",\"QTRX\",\"660321664\",\"17.89\",\"United States\"\n\"4770\",\"CRA International\",\"CRAI\",\"659241792\",\"89.42\",\"United States\"\n\"4771\",\"Heritage Commerce\",\"HTBK\",\"658240640\",\"10.89\",\"United States\"\n\"4772\",\"ProFrac\",\"PFHC\",\"658142528\",\"15.96\",\"United States\"\n\"4773\",\"Sterling Construction\",\"STRL\",\"657926336\",\"21.74\",\"United States\"\n\"4774\",\"HomeStreet Bank\",\"HMST\",\"656402880\",\"35.1\",\"United States\"\n\"4775\",\"Adicet Bio\",\"ACET\",\"654071936\",\"16.35\",\"United States\"\n\"4776\",\"Keros Therapeutics\",\"KROS\",\"652066816\",\"27.13\",\"United States\"\n\"4777\",\"Xponential Fitness\",\"XPOF\",\"651480960\",\"13.35\",\"United States\"\n\"4778\",\"Al Moammar Information Systems\",\"7200.SR\",\"651444084\",\"21.71\",\"Saudi Arabia\"\n\"4779\",\"Atea Pharmaceuticals\",\"AVIR\",\"651424128\",\"7.82\",\"United States\"\n\"4780\",\"Blend Labs\",\"BLND\",\"651302400\",\"2.8\",\"United States\"\n\"4781\",\"Hinduja Global Solutions\",\"HGS.NS\",\"650940913\",\"15.57\",\"India\"\n\"4782\",\"World Acceptance Corporation\",\"WRLD\",\"650685056\",\"103.64\",\"United States\"\n\"4783\",\"REV Group\",\"REVG\",\"650281280\",\"10.67\",\"United States\"\n\"4784\",\"Ocugen\",\"OCGN\",\"649889280\",\"2.68\",\"United States\"\n\"4785\",\"Cathay Real Estate Development\",\"2501.TW\",\"648927684\",\"0.56\",\"Taiwan\"\n\"4786\",\"Edelweiss Financial Services\",\"EDELWEISS.NS\",\"648835627\",\"0.69\",\"India\"\n\"4787\",\"IDT Corporation\",\"IDT\",\"648415104\",\"24.71\",\"United States\"\n\"4788\",\"Orla Mining\",\"ORLA\",\"648317696\",\"2.57\",\"Canada\"\n\"4789\",\"Acco Brands\",\"ACCO\",\"647868480\",\"6.68\",\"United States\"\n\"4790\",\"Riot Blockchain\",\"RIOT\",\"646963456\",\"4.78\",\"United States\"\n\"4791\",\"Atai Life Sciences\",\"ATAI\",\"646146624\",\"4.02\",\"Germany\"\n\"4792\",\"The Vita Coco Company\",\"COCO\",\"646022016\",\"11.62\",\"United States\"\n\"4793\",\"Northfield Bancorp\",\"NFBK\",\"645922752\",\"13.21\",\"United States\"\n\"4794\",\"Sunway\",\"5211.KL\",\"645853719\",\"0.36\",\"Malaysia\"\n\"4795\",\"OneSpaWorld\",\"OSW\",\"645838336\",\"7.01\",\"Bahamas\"\n\"4796\",\"Flushing Financial Corp\",\"FFIC\",\"644572416\",\"21.24\",\"United States\"\n\"4797\",\"Karooooo\",\"KARO\",\"644401920\",\"20.82\",\"Singapore\"\n\"4798\",\"Nektar Therapeutics\",\"NKTR\",\"643576640\",\"3.46\",\"United States\"\n\"4799\",\"Luther Burbank\",\"LBC\",\"643157504\",\"12.58\",\"United States\"\n\"4800\",\"Johnson Outdoors\",\"JOUT\",\"642820992\",\"63.22\",\"United States\"\n\"4801\",\"Old Second Bancorp\",\"OSBC\",\"641572224\",\"14.43\",\"United States\"\n\"4802\",\"Boston Omaha\",\"BOC\",\"641188480\",\"21.59\",\"United States\"\n\"4803\",\"NanoString Technologies\",\"NSTG\",\"639609728\",\"13.78\",\"United States\"\n\"4804\",\"Rain Industries\",\"RAIN.NS\",\"639204608\",\"1.9\",\"India\"\n\"4805\",\"Portillo's\",\"PTLO\",\"639155584\",\"17.83\",\"United States\"\n\"4806\",\"Organogenesis\",\"ORGO\",\"637902208\",\"4.94\",\"United States\"\n\"4807\",\"Zealand Pharma\",\"ZEAL\",\"637865216\",\"14.76\",\"Denmark\"\n\"4808\",\"1-800-Flowers\",\"FLWS\",\"636522112\",\"9.86\",\"United States\"\n\"4809\",\"Amyris\",\"AMRS\",\"636230848\",\"1.99\",\"United States\"\n\"4810\",\"KSB ltd\",\"KSB.NS\",\"635736598\",\"18.26\",\"India\"\n\"4811\",\"IES Holdings\",\"IESC\",\"635070336\",\"30.55\",\"United States\"\n\"4812\",\"Seer\",\"SEER\",\"635034112\",\"10.17\",\"United States\"\n\"4813\",\"PureTech Health\",\"PRTC\",\"634846784\",\"22.2\",\"United States\"\n\"4814\",\"Vaibhav Global\",\"VAIBHAVGBL.NS\",\"634546611\",\"3.86\",\"India\"\n\"4815\",\"RBL Bank\",\"RBLBANK.NS\",\"634517092\",\"1.06\",\"India\"\n\"4816\",\"Aktia Bank\",\"AKTIA.HE\",\"633529919\",\"8.81\",\"Finland\"\n\"4817\",\"Jindal Stainless (Hisar)\",\"JSLHISAR.NS\",\"632806012\",\"2.68\",\"India\"\n\"4818\",\"Century Aluminum\",\"CENX\",\"632234944\",\"6.93\",\"United States\"\n\"4819\",\"Vertical Aerospace\",\"EVTL\",\"630981248\",\"3.02\",\"United Kingdom\"\n\"4820\",\"Nkarta\",\"NKTX\",\"630708032\",\"13.03\",\"United States\"\n\"4821\",\"Aston Martin\",\"A5SA.F\",\"629551493\",\"5.41\",\"United Kingdom\"\n\"4822\",\"Sangamo Therapeutics\",\"SGMO\",\"629287232\",\"4.29\",\"United States\"\n\"4823\",\"Hingham Institution for Savings\",\"HIFS\",\"627615360\",\"292.54\",\"United States\"\n\"4824\",\"Nano-X Imaging\",\"NNOX\",\"626006400\",\"12.02\",\"Israel\"\n\"4825\",\"Vanda Pharmaceuticals\",\"VNDA\",\"625905856\",\"11.08\",\"United States\"\n\"4826\",\"Wirtualna Polska (WP Holding)\",\"WPL.WA\",\"625820327\",\"21.39\",\"Poland\"\n\"4827\",\"Amalgamated Financial\",\"AMAL\",\"625719168\",\"20.28\",\"United States\"\n\"4828\",\"Ranger Oil\",\"ROCC\",\"625378432\",\"29.55\",\"United States\"\n\"4829\",\"Coherus BioSciences\",\"CHRS\",\"622480896\",\"8.04\",\"United States\"\n\"4830\",\"DICE Therapeutics\",\"DICE\",\"621608448\",\"16.26\",\"United States\"\n\"4831\",\"G8 Education\",\"GEM.AX\",\"621522461\",\"0.73\",\"Australia\"\n\"4832\",\"HCI Group\",\"HCI\",\"621187840\",\"68.45\",\"United States\"\n\"4833\",\"Navios Maritime Partners\",\"NMM\",\"620852352\",\"20.56\",\"Monaco\"\n\"4834\",\"Electrica\",\"ECEA.F\",\"620565430\",\"6.99\",\"Romania\"\n\"4835\",\"The Hackett Group\",\"HCKT\",\"618460544\",\"19.54\",\"United States\"\n\"4836\",\"Smith &amp; Wesson\",\"SWBI\",\"618263552\",\"13.51\",\"United States\"\n\"4837\",\"Indus Holding\",\"INH.F\",\"617838238\",\"22.67\",\"Germany\"\n\"4838\",\"Heidrick &amp; Struggles\",\"HSII\",\"617758656\",\"31.33\",\"United States\"\n\"4839\",\"Chico's\",\"CHS\",\"616954944\",\"4.93\",\"United States\"\n\"4840\",\"Skillsoft\",\"SKIL\",\"616436928\",\"3.76\",\"United States\"\n\"4841\",\"NextDecade Corp\",\"NEXT\",\"615470464\",\"4.81\",\"United States\"\n\"4842\",\"CEWE\",\"CWC.F\",\"613957888\",\"84.57\",\"Germany\"\n\"4843\",\"CEAT\",\"CEATLTD.NS\",\"612490248\",\"15.14\",\"India\"\n\"4844\",\"COLOPL\",\"3668.T\",\"611898832\",\"4.77\",\"Japan\"\n\"4845\",\"Caverion\",\"CAV1V.HE\",\"611349623\",\"4.48\",\"Finland\"\n\"4846\",\"Inogen\",\"INGN\",\"610857664\",\"26.75\",\"United States\"\n\"4847\",\"Invitae\",\"NVTA\",\"608762240\",\"2.66\",\"United States\"\n\"4848\",\"Varroc\",\"VARROC.NS\",\"607820969\",\"3.98\",\"India\"\n\"4849\",\"TrueBlue\",\"TBI\",\"607206720\",\"18.25\",\"United States\"\n\"4850\",\"Piedmont Lithium\",\"PLL\",\"606808768\",\"33.83\",\"Australia\"\n\"4851\",\"Suprajit Engineering\",\"SUPRAJIT.NS\",\"605728304\",\"4.37\",\"India\"\n\"4852\",\"Yalla Group\",\"YALA\",\"604957888\",\"4.08\",\"United Arab Emirates\"\n\"4853\",\"Delta Corp\",\"DELTACORP.NS\",\"604465730\",\"2.26\",\"India\"\n\"4854\",\"INDUS Realty Trust\",\"INDT\",\"602558720\",\"59.16\",\"United States\"\n\"4855\",\"Sema4\",\"SMFR\",\"601712128\",\"1.6\",\"United States\"\n\"4856\",\"Central Pacific Financial\",\"CPF\",\"601042560\",\"21.82\",\"United States\"\n\"4857\",\"TrustCo Bank\",\"TRST\",\"599903104\",\"31.25\",\"United States\"\n\"4858\",\"Maverix Metals\",\"MMX\",\"599706368\",\"4.07\",\"Canada\"\n\"4859\",\"UFP Technologies\",\"UFPT\",\"596678016\",\"78.91\",\"United States\"\n\"4860\",\"SilverBow Resources\",\"SBOW\",\"595583552\",\"26.7\",\"United States\"\n\"4861\",\"Olectra Greentech\",\"OLECTRA.NS\",\"594999358\",\"7.25\",\"India\"\n\"4862\",\"Eagle Bulk Shipping\",\"EGLE\",\"594682624\",\"43.43\",\"United States\"\n\"4863\",\"Collegium Pharmaceutical\",\"COLL\",\"593853248\",\"17.48\",\"United States\"\n\"4864\",\"Sohu.com\",\"SOHU\",\"593569024\",\"15.53\",\"China\"\n\"4865\",\"Hibbett Sports\",\"HIBB\",\"593069760\",\"45.85\",\"United States\"\n\"4866\",\"Hyliion\",\"HYLN\",\"592425984\",\"3.41\",\"United States\"\n\"4867\",\"Eagle Pharmaceuticals\",\"EGRX\",\"592146240\",\"44.81\",\"United States\"\n\"4868\",\"NerdWallet\",\"NRDS\",\"592106624\",\"8.71\",\"United States\"\n\"4869\",\"Yext\",\"YEXT\",\"591986496\",\"4.79\",\"United States\"\n\"4870\",\"Shoe Carnival\",\"SCVL\",\"591198016\",\"21.43\",\"United States\"\n\"4871\",\"Pulmonx\",\"LUNG\",\"590896256\",\"15.92\",\"United States\"\n\"4872\",\"PDS Multinational\",\"PDSMFL.NS\",\"590788155\",\"22.65\",\"India\"\n\"4873\",\"Jindal Worldwide\",\"JINDWORLD.NS\",\"590145906\",\"2.9\",\"India\"\n\"4874\",\"Ingersoll Rand India\",\"INGERRAND.NS\",\"589071059\",\"18.66\",\"India\"\n\"4875\",\"Finnair\",\"FIA1S.HE\",\"588945890\",\"0.41\",\"Finland\"\n\"4876\",\"Carriage Services\",\"CSV\",\"588417216\",\"39.52\",\"United States\"\n\"4877\",\"Cardiovascular Systems\",\"CSII\",\"588121152\",\"14.42\",\"United States\"\n\"4878\",\"Kezar Life Sciences\",\"KZR\",\"587843776\",\"9.73\",\"United States\"\n\"4879\",\"Orion Office REIT\",\"ONL\",\"587774784\",\"10.38\",\"United States\"\n\"4880\",\"Savencia Fromage &amp; Dairy\",\"SAVE.PA\",\"587244243\",\"59.93\",\"France\"\n\"4881\",\"Gujarat Mineral Development\",\"GMDCLTD.NS\",\"586140988\",\"1.84\",\"India\"\n\"4882\",\"8x8\",\"EGHT\",\"586101376\",\"4.94\",\"United States\"\n\"4883\",\"Swvl Holdings\",\"SWVL\",\"586093184\",\"4.93\",\"United Arab Emirates\"\n\"4884\",\"Voltamp Transformers\",\"VOLTAMP.NS\",\"583980063\",\"40.23\",\"India\"\n\"4885\",\"Samyang Foods\",\"003230.KS\",\"583953568\",\"78\",\"South Korea\"\n\"4886\",\"York Water\",\"YORW\",\"582107904\",\"40.86\",\"United States\"\n\"4887\",\"Janux Therapeutics\",\"JANX\",\"581146432\",\"13.96\",\"United States\"\n\"4888\",\"QuinStreet\",\"QNST\",\"580955264\",\"10.6\",\"United States\"\n\"4889\",\"Tunas Ridean\",\"TURI.JK\",\"580900923\",\"0.1\",\"Indonesia\"\n\"4890\",\"Rashtriya Chemicals and Fertilizers\",\"RCF.NS\",\"579397487\",\"1.05\",\"India\"\n\"4891\",\"The First Bancshares\",\"FBMS\",\"578988288\",\"28.2\",\"United States\"\n\"4892\",\"Endeavour Silver\",\"EXK\",\"578356224\",\"3.05\",\"Canada\"\n\"4893\",\"RAPT Therapeutics\",\"RAPT\",\"577964416\",\"19.5\",\"United States\"\n\"4894\",\"American Software\",\"AMSWA\",\"576065792\",\"17.12\",\"United States\"\n\"4895\",\"DXP Enterprises\",\"DXPE\",\"576056320\",\"30.9\",\"United States\"\n\"4896\",\"Titan Machinery\",\"TITN\",\"575242240\",\"25.49\",\"United States\"\n\"4897\",\"FRP Holdings\",\"FRPH\",\"574408192\",\"60.9\",\"United States\"\n\"4898\",\"Dorian LPG\",\"LPG\",\"574331840\",\"14.31\",\"United States\"\n\"4899\",\"Celularity\",\"CELU\",\"572307264\",\"4.02\",\"United States\"\n\"4900\",\"Maxeon Solar Technologies\",\"MAXN\",\"569669696\",\"12.77\",\"Singapore\"\n\"4901\",\"LendingTree\",\"TREE\",\"569222592\",\"44.59\",\"United States\"\n\"4902\",\"Focus Universal\",\"FCUV\",\"569019584\",\"13.02\",\"United States\"\n\"4903\",\"Atlanticus\",\"ATLC\",\"566410944\",\"37.98\",\"United States\"\n\"4904\",\"Fluence Energy\",\"FLNC\",\"566045248\",\"10.26\",\"United States\"\n\"4905\",\"Jumia\",\"JMIA\",\"565803776\",\"5.67\",\"Germany\"\n\"4906\",\"Modine Manufacturing\",\"MOD\",\"565466240\",\"10.88\",\"United States\"\n\"4907\",\"VTEX\",\"VTEX\",\"565445824\",\"2.96\",\"United Kingdom\"\n\"4908\",\"Inhibrx\",\"INBX\",\"564088960\",\"14.45\",\"United States\"\n\"4909\",\"Phillips Carbon Black\",\"PHILIPCARB.NS\",\"563545169\",\"3.24\",\"India\"\n\"4910\",\"City Office REIT\",\"CIO\",\"562722880\",\"12.92\",\"Canada\"\n\"4911\",\"Indiabulls Housing Finance\",\"IBULHSGFIN.NS\",\"562597129\",\"1.19\",\"India\"\n\"4912\",\"Vinci Partners\",\"VINP\",\"561994304\",\"10.1\",\"Brazil\"\n\"4913\",\"SandRidge Energy\",\"SD\",\"561174784\",\"15.28\",\"United States\"\n\"4914\",\"Ebix\",\"EBIX\",\"560922112\",\"18.15\",\"United States\"\n\"4915\",\"WM Technology\",\"MAPS\",\"560243648\",\"3.21\",\"United States\"\n\"4916\",\"PREOS Real Estate\",\"PAG.F\",\"560015252\",\"4.68\",\"Germany\"\n\"4917\",\"GAMCO Investors\",\"GBL\",\"558138432\",\"21.06\",\"United States\"\n\"4918\",\"Denny's\",\"DENN\",\"557881024\",\"9.04\",\"United States\"\n\"4919\",\"Amarin Corporation\",\"AMRN\",\"557796224\",\"1.41\",\"Ireland\"\n\"4920\",\"Mullen Automotive\",\"MULN\",\"556300288\",\"1.17\",\"United States\"\n\"4921\",\"Stitch Fix\",\"SFIX\",\"555998912\",\"5.14\",\"United States\"\n\"4922\",\"Jindal Poly Films\",\"JINDALPOLY.NS\",\"554626961\",\"12.67\",\"India\"\n\"4923\",\"Loma Negra\",\"LOMA\",\"554303552\",\"4.73\",\"Argentina\"\n\"4924\",\"Youdao\",\"DAO\",\"554263616\",\"4.4\",\"China\"\n\"4925\",\"Bangkok Airways\",\"BA.BK\",\"554189264\",\"0.26\",\"Thailand\"\n\"4926\",\"Telesat\",\"TSAT\",\"554082304\",\"11.21\",\"Canada\"\n\"4927\",\"National Energy Services Reunited\",\"NESR\",\"553648896\",\"6.06\",\"United States\"\n\"4928\",\"SunCoke Energy\",\"SXC\",\"553648512\",\"6.64\",\"United States\"\n\"4929\",\"IDEAYA Biosciences\",\"IDYA\",\"553323328\",\"14.32\",\"United States\"\n\"4930\",\"Tricida\",\"TCDA\",\"553140480\",\"9.98\",\"United States\"\n\"4931\",\"Starry Group\",\"STRY\",\"550545792\",\"3.31\",\"United States\"\n\"4932\",\"Vista Oil &amp; Gas\",\"VIST\",\"550133568\",\"6.37\",\"Mexico\"\n\"4933\",\"Obsidian Energy\",\"OBE\",\"549982208\",\"6.7\",\"Canada\"\n\"4934\",\"5E Advanced Materials\",\"FEAM\",\"548730112\",\"12.83\",\"United States\"\n\"4935\",\"First Financial\",\"THFF\",\"548422464\",\"44.15\",\"United States\"\n\"4936\",\"Viad\",\"VVI\",\"547915904\",\"26.61\",\"United States\"\n\"4937\",\"Borr Drilling\",\"BORR\",\"547633792\",\"3.58\",\"Bermuda\"\n\"4938\",\"BLS International\",\"BLS.NS\",\"546216117\",\"2.67\",\"India\"\n\"4939\",\"Barrett Business Services\",\"BBSI\",\"546009984\",\"74.59\",\"United States\"\n\"4940\",\"Jeju Air\",\"089590.KS\",\"545302654\",\"10.97\",\"South Korea\"\n\"4941\",\"Offerpad\",\"OPAD\",\"544457216\",\"2.22\",\"United States\"\n\"4942\",\"NETGEAR\",\"NTGR\",\"543773760\",\"18.9\",\"United States\"\n\"4943\",\"One Liberty Properties\",\"OLP\",\"543474048\",\"25.73\",\"United States\"\n\"4944\",\"Arlo Technologies\",\"ARLO\",\"542881920\",\"6.25\",\"United States\"\n\"4945\",\"Hyster-Yale Materials Handling\",\"HY\",\"541860032\",\"32.04\",\"United States\"\n\"4946\",\"Chatham Lodging Trust\",\"CLDT\",\"540272448\",\"11.07\",\"United States\"\n\"4947\",\"Ruth's Hospitality Group\",\"RUTH\",\"540237696\",\"15.74\",\"United States\"\n\"4948\",\"Diamond Hill Investment Group\",\"DHIL\",\"539569280\",\"170.18\",\"United States\"\n\"4949\",\"Ethan Allen\",\"ETD\",\"539354304\",\"21.3\",\"United States\"\n\"4950\",\"Opera\",\"OPRA\",\"538831808\",\"4.68\",\"Norway\"\n\"4951\",\"Trinity Capital\",\"TRIN\",\"538743744\",\"14.11\",\"United States\"\n\"4952\",\"The Children's Place\",\"PLCE\",\"538417280\",\"40.87\",\"United States\"\n\"4953\",\"Gossamer Bio\",\"GOSS\",\"538274624\",\"6.98\",\"United States\"\n\"4954\",\"LiveChat Software\",\"LVC.WA\",\"537821234\",\"20.8\",\"Poland\"\n\"4955\",\"Neenah\",\"NP\",\"537219200\",\"32\",\"United States\"\n\"4956\",\"Gevo\",\"GEVO\",\"537034432\",\"2.29\",\"United States\"\n\"4957\",\"Teekay Tankers\",\"TNK\",\"535129984\",\"15.83\",\"Canada\"\n\"4958\",\"Bioceres Crop Solutions\",\"BIOX\",\"534833696\",\"11.66\",\"Argentina\"\n\"4959\",\"Columbia Care\",\"CCHWF\",\"533111104\",\"1.41\",\"United States\"\n\"4960\",\"Waterdrop Inc.\",\"WDH\",\"530961760\",\"1.35\",\"China\"\n\"4961\",\"PetIQ\",\"PETQ\",\"530673792\",\"17.52\",\"United States\"\n\"4962\",\"Immatics\",\"IMTX\",\"530472928\",\"8.43\",\"Germany\"\n\"4963\",\"Greenlam Industries\",\"GREENLAM.NS\",\"530416113\",\"4.4\",\"India\"\n\"4964\",\"W&amp;T Offshore\",\"WTI\",\"529144416\",\"3.7\",\"United States\"\n\"4965\",\"Rigetti Computing\",\"RGTI\",\"528337600\",\"4.6\",\"United States\"\n\"4966\",\"ANI Pharmaceuticals\",\"ANIP\",\"527407136\",\"30.58\",\"United States\"\n\"4967\",\"Rimini Street\",\"RMNI\",\"527079424\",\"6.06\",\"United States\"\n\"4968\",\"OneWater Marine\",\"ONEW\",\"526499712\",\"33.83\",\"United States\"\n\"4969\",\"Intrepid Potash\",\"IPI\",\"525954176\",\"38.62\",\"United States\"\n\"4970\",\"Vaxart\",\"VXRT\",\"524839424\",\"4.15\",\"United States\"\n\"4971\",\"Faro Technologies\",\"FARO\",\"524741344\",\"28.74\",\"United States\"\n\"4972\",\"AnaptysBio\",\"ANAB\",\"522570304\",\"18.54\",\"United States\"\n\"4973\",\"Donegal Group\",\"DGICA\",\"522023808\",\"16.75\",\"United States\"\n\"4974\",\"Barbeque Nation Hospitality\",\"BARBEQUE.NS\",\"521901103\",\"13.4\",\"India\"\n\"4975\",\"JCI Hitachi India\",\"JCHAC.NS\",\"521884463\",\"19.12\",\"India\"\n\"4976\",\"Ambac\",\"AMBC\",\"521787232\",\"11.59\",\"United States\"\n\"4977\",\"NIU\",\"NIU\",\"521542688\",\"6.78\",\"China\"\n\"4978\",\"trivago\",\"TRVG\",\"521520064\",\"1.45\",\"Germany\"\n\"4979\",\"Babcock &amp; Wilcox\",\"BW\",\"521480320\",\"6.04\",\"United States\"\n\"4980\",\"MetroCity Bankshares\",\"MCBS\",\"521017984\",\"20.46\",\"United States\"\n\"4981\",\"Jin Air\",\"272450.KS\",\"520214969\",\"10.09\",\"South Korea\"\n\"4982\",\"Cazoo\",\"CZOO\",\"519827744\",\"0.68\",\"United Kingdom\"\n\"4983\",\"Centessa Pharmaceuticals\",\"CNTA\",\"519106304\",\"5.52\",\"United Kingdom\"\n\"4984\",\"TravelCenters of America\",\"TA\",\"518839424\",\"34.97\",\"United States\"\n\"4985\",\"HEG\",\"HEG.NS\",\"518729572\",\"13.44\",\"India\"\n\"4986\",\"Enento Group\",\"ENENTO.HE\",\"518399807\",\"21.57\",\"Finland\"\n\"4987\",\"Bank of Marin Bancorp\",\"BMRC\",\"517349440\",\"32.34\",\"United States\"\n\"4988\",\"New Gold\",\"NGD\",\"517337216\",\"0.71\",\"Canada\"\n\"4989\",\"loanDepot\",\"LDI\",\"517318912\",\"1.52\",\"United States\"\n\"4990\",\"Granite Point Mortgage Trust\",\"GPMT\",\"517013792\",\"9.6\",\"United States\"\n\"4991\",\"Cardlytics\",\"CDLX\",\"516843744\",\"15.15\",\"United States\"\n\"4992\",\"COMPASS Pathways\",\"CMPS\",\"514600480\",\"12.11\",\"United Kingdom\"\n\"4993\",\"Skillz\",\"SKLZ\",\"513955136\",\"1.26\",\"United States\"\n\"4994\",\"AMMO\",\"POWW\",\"513570176\",\"4.41\",\"United States\"\n\"4995\",\"FDC India\",\"FDC.NS\",\"513017232\",\"3.09\",\"India\"\n\"4996\",\"CatchMark Timber Trust\",\"CTT\",\"512911104\",\"10.41\",\"United States\"\n\"4997\",\"Simona\",\"SIM0.F\",\"512820513\",\"85.47\",\"Germany\"\n\"4998\",\"Whitestone REIT\",\"WSR\",\"512649664\",\"10.27\",\"United States\"\n\"4999\",\"Despegar\",\"DESP\",\"511355040\",\"7.72\",\"Argentina\"\n\"5000\",\"HBT Financial\",\"HBT\",\"510727200\",\"17.66\",\"United States\"\n\"5001\",\"Argan\",\"AGX\",\"510018944\",\"35.91\",\"United States\"\n\"5002\",\"Altimmune\",\"ALT\",\"509643168\",\"11.79\",\"United States\"\n\"5003\",\"Senseonics Holdings\",\"SENS\",\"509589312\",\"1.1\",\"United States\"\n\"5004\",\"ViewRay\",\"VRAY\",\"507989280\",\"2.82\",\"United States\"\n\"5005\",\"Cara Therapeutics\",\"CARA\",\"506972768\",\"9.46\",\"United States\"\n\"5006\",\"Liquidity Services\",\"LQDT\",\"506351840\",\"15.73\",\"United States\"\n\"5007\",\"Cerberus Cyber Sentinel\",\"CISO\",\"506302304\",\"4.06\",\"United States\"\n\"5008\",\"Chennai Petroleum\",\"CHENNPETRO.NS\",\"505778191\",\"3.4\",\"India\"\n\"5009\",\"PennantPark Floating Rate\",\"PFLT\",\"505259200\",\"12.23\",\"United States\"\n\"5010\",\"Orchid Island Capital\",\"ORC\",\"504783424\",\"2.85\",\"United States\"\n\"5011\",\"Appen\",\"APX.AX\",\"504668446\",\"4.06\",\"Australia\"\n\"5012\",\"Innoviz\",\"INVZ\",\"504488608\",\"3.74\",\"Israel\"\n\"5013\",\"Community Health Systems\",\"CYH\",\"503082080\",\"3.74\",\"United States\"\n\"5014\",\"Arrow Financial\",\"AROW\",\"502943200\",\"31.4\",\"United States\"\n\"5015\",\"MaxCyte\",\"MXCT\",\"502622976\",\"4.95\",\"United States\"\n\"5016\",\"Ducommun\",\"DCO\",\"502029280\",\"41.72\",\"United States\"\n\"5017\",\"Eagle Point Credit Company\",\"ECC\",\"501808608\",\"12.16\",\"United States\"\n\"5018\",\"REX American Resources\",\"REX\",\"501622816\",\"84.25\",\"United States\"\n\"5019\",\"Core Scientific\",\"CORZ\",\"501123680\",\"1.54\",\"United States\"\n\"5020\",\"Turning Point Brands\",\"TPB\",\"501108704\",\"27.63\",\"United States\"\n\"5021\",\"LoveSac\",\"LOVE\",\"500644096\",\"33.1\",\"United States\"\n\"5022\",\"Iguatemi\",\"IGTI3.SA\",\"499404959\",\"0.45\",\"Brazil\"\n\"5023\",\"Telos\",\"TLS\",\"498946688\",\"7.35\",\"United States\"\n\"5024\",\"Heidelbergcement India\",\"HEIDELBERG.NS\",\"498928719\",\"2.2\",\"India\"\n\"5025\",\"Playstudios\",\"MYPS\",\"498924128\",\"3.95\",\"United States\"\n\"5026\",\"Religare\",\"RELIGARE.NS\",\"498249573\",\"1.56\",\"India\"\n\"5027\",\"Ranpak\",\"PACK\",\"498145984\",\"6.08\",\"United States\"\n\"5028\",\"Ituran\",\"ITRN\",\"497223008\",\"24.24\",\"Israel\"\n\"5029\",\"Traeger\",\"COOK\",\"496490368\",\"4.2\",\"United States\"\n\"5030\",\"Pearl Abyss\",\"263750.KQ\",\"496365111\",\"38.12\",\"South Korea\"\n\"5031\",\"Zumiez\",\"ZUMZ\",\"496317088\",\"25.51\",\"United States\"\n\"5032\",\"Imago BioSciences\",\"IMGO\",\"496253632\",\"14.71\",\"United States\"\n\"5033\",\"Tata Coffee\",\"TATACOFFEE.NS\",\"495538603\",\"2.65\",\"India\"\n\"5034\",\"SurModics\",\"SRDX\",\"495385888\",\"35.41\",\"United States\"\n\"5035\",\"Bluegreen Vacations\",\"BVH\",\"494611040\",\"24.58\",\"United States\"\n\"5036\",\"Tattooed Chef\",\"TTCF\",\"493521920\",\"5.99\",\"United States\"\n\"5037\",\"PORR\",\"ABS2.F\",\"493001524\",\"11.93\",\"Austria\"\n\"5038\",\"Akoya Biosciences\",\"AKYA\",\"492423776\",\"13.1\",\"United States\"\n\"5039\",\"Harsco\",\"HSC\",\"492189984\",\"6.2\",\"United States\"\n\"5040\",\"Reliance Power\",\"RPOWER.NS\",\"491793227\",\"0.14\",\"India\"\n\"5041\",\"Newtek\",\"NEWT\",\"491081600\",\"20.33\",\"United States\"\n\"5042\",\"Godawari Power &amp; Ispat\",\"GPIL.NS\",\"490708540\",\"3.48\",\"India\"\n\"5043\",\"IFB Industries\",\"IFBIND.NS\",\"490354877\",\"12.08\",\"India\"\n\"5044\",\"Aarti Drugs\",\"AARTIDRUGS.NS\",\"490095850\",\"5.29\",\"India\"\n\"5045\",\"BJ's Restaurants\",\"BJRI\",\"487882784\",\"20.82\",\"United States\"\n\"5046\",\"Weight Watchers\",\"WW\",\"487395200\",\"6.93\",\"United States\"\n\"5047\",\"Astec Lifesciences\",\"ASTEC.NS\",\"487180771\",\"24.85\",\"India\"\n\"5048\",\"RCI Hospitality Holdings\",\"RICK\",\"485753760\",\"51.59\",\"United States\"\n\"5049\",\"Nacon\",\"NACON.PA\",\"485629522\",\"5.63\",\"France\"\n\"5050\",\"Tufin\",\"TUFN\",\"485358112\",\"12.65\",\"Israel\"\n\"5051\",\"Banco Latinoamericano de Comercio Exterior\",\"BLX\",\"484953280\",\"13.39\",\"Panama\"\n\"5052\",\"Mersana Therapeutics\",\"MRSN\",\"484471520\",\"5\",\"United States\"\n\"5053\",\"Tetra Technologies\",\"TTI\",\"483994368\",\"3.79\",\"United States\"\n\"5054\",\"Nazara Technologies\",\"NAZARA.NS\",\"483639195\",\"7.37\",\"India\"\n\"5055\",\"DoubleDown Interactive\",\"DDI\",\"481659072\",\"9.72\",\"United States\"\n\"5056\",\"Gladstone Investment\",\"GAIN\",\"481635200\",\"14.5\",\"United States\"\n\"5057\",\"Immunovant\",\"IMVT\",\"481211104\",\"4.13\",\"United States\"\n\"5058\",\"Rovio Entertainment\",\"ROVIO.HE\",\"479290980\",\"6.34\",\"Finland\"\n\"5059\",\"Genius Sports\",\"GENI\",\"479113216\",\"2.33\",\"United Kingdom\"\n\"5060\",\"HilleVax\",\"HLVX\",\"479011776\",\"14.33\",\"United States\"\n\"5061\",\"Ramaco Resources\",\"METC\",\"478152736\",\"10.8\",\"United States\"\n\"5062\",\"Marcus Corporation\",\"MCS\",\"476191072\",\"15.07\",\"United States\"\n\"5063\",\"Orthofix Medical\",\"OFIX\",\"475896800\",\"23.9\",\"United States\"\n\"5064\",\"DRDGOLD\",\"DRD\",\"475747712\",\"5.55\",\"South Africa\"\n\"5065\",\"Kimball Electronics\",\"KE\",\"475048864\",\"19.12\",\"United States\"\n\"5066\",\"Wheels Up\",\"UP\",\"474608224\",\"1.93\",\"United States\"\n\"5067\",\"Garrett Motion\",\"GTX\",\"474366016\",\"7.32\",\"Switzerland\"\n\"5068\",\"Cue Health\",\"HLTH\",\"473324096\",\"3.21\",\"United States\"\n\"5069\",\"Equity BancShares\",\"EQBK\",\"472992160\",\"29.06\",\"United States\"\n\"5070\",\"National Presto Industries\",\"NPK\",\"472247200\",\"66.95\",\"United States\"\n\"5071\",\"Computer Programs and Systems\",\"CPSI\",\"471998688\",\"31.97\",\"United States\"\n\"5072\",\"Capital City Bank Group\",\"CCBG\",\"471990656\",\"27.85\",\"United States\"\n\"5073\",\"Karur Vysya Bank\",\"KARURVYSYA.NS\",\"471969449\",\"0.59\",\"India\"\n\"5074\",\"Hippo\",\"HIPO\",\"471412704\",\"0.83\",\"United States\"\n\"5075\",\"RADA Electronic Industries\",\"RADA\",\"470328512\",\"9.46\",\"Israel\"\n\"5076\",\"CION Investment\",\"CION\",\"469337216\",\"8.24\",\"United States\"\n\"5077\",\"fuboTV\",\"FUBO\",\"469182880\",\"2.54\",\"United States\"\n\"5078\",\"Gateway Distriparks\",\"GDL.NS\",\"469048583\",\"3.76\",\"India\"\n\"5079\",\"1-800-PetMeds\",\"PETS\",\"468545440\",\"22.32\",\"United States\"\n\"5080\",\"Central Puerto\",\"CEPU\",\"468100000\",\"3.1\",\"Argentina\"\n\"5081\",\"Riley Permian\",\"REPX\",\"466567232\",\"23.88\",\"United States\"\n\"5082\",\"Aaron's\",\"AAN\",\"466466656\",\"15.19\",\"United States\"\n\"5083\",\"ON24\",\"ONTF\",\"466267680\",\"9.95\",\"United States\"\n\"5084\",\"EHang Holdings\",\"EH\",\"465643840\",\"8.12\",\"China\"\n\"5085\",\"Artesian Resources\",\"ARTNA\",\"464161664\",\"49.78\",\"United States\"\n\"5086\",\"The RMR Group\",\"RMR\",\"463857184\",\"28.11\",\"United States\"\n\"5087\",\"Infibeam Avenues\",\"INFIBEAM.NS\",\"463253987\",\"0.17\",\"India\"\n\"5088\",\"Torrid\",\"CURV\",\"462386048\",\"4.46\",\"United States\"\n\"5089\",\"Gaotu Techedu\",\"GOTU\",\"462079520\",\"1.79\",\"China\"\n\"5090\",\"JSW Holdings\",\"JSWHL.NS\",\"461515551\",\"41.7\",\"India\"\n\"5091\",\"nLIGHT\",\"LASR\",\"461104928\",\"10.35\",\"United States\"\n\"5092\",\"Clear Channel Outdoor\",\"CCO\",\"460937216\",\"0.97\",\"United States\"\n\"5093\",\"PlayWay\",\"6P5.F\",\"460631618\",\"67.97\",\"Poland\"\n\"5094\",\"Navitas Semiconductor\",\"NVTS\",\"460130528\",\"3.72\",\"Ireland\"\n\"5095\",\"Koppers\",\"KOP\",\"459650976\",\"21.74\",\"United States\"\n\"5096\",\"MidWestOne Financial Group\",\"MOFG\",\"458889824\",\"29.27\",\"United States\"\n\"5097\",\"Arcturus Therapeutics\",\"ARCT\",\"457444992\",\"17.32\",\"United States\"\n\"5098\",\"Aveanna Healthcare\",\"AVAH\",\"457211680\",\"2.48\",\"United States\"\n\"5099\",\"Amryt Pharma\",\"AMYT\",\"456035424\",\"7.11\",\"United Kingdom\"\n\"5100\",\"Bridgewater Bancshares\",\"BWB\",\"455159776\",\"16.27\",\"United States\"\n\"5101\",\"Cass Information Systems\",\"CASS\",\"454774784\",\"33.31\",\"United States\"\n\"5102\",\"Tutor Perini\",\"TPC\",\"454145760\",\"8.87\",\"United States\"\n\"5103\",\"Seneca Foods\",\"SENEA\",\"454014880\",\"55.34\",\"United States\"\n\"5104\",\"Mail.ru Group\",\"RL9A.F\",\"453626948\",\"2.01\",\"Cyprus\"\n\"5105\",\"C4 Therapeutics\",\"CCCC\",\"452838016\",\"9.28\",\"United States\"\n\"5106\",\"Stoneridge\",\"SRI\",\"452066528\",\"16.55\",\"United States\"\n\"5107\",\"BBVA Argentina\",\"BBAR\",\"451363776\",\"2.21\",\"Argentina\"\n\"5108\",\"Bandwidth\",\"BAND\",\"449681408\",\"17.79\",\"United States\"\n\"5109\",\"SI-BONE\",\"SIBN\",\"449008128\",\"13.24\",\"United States\"\n\"5110\",\"ESS Tech\",\"GWH\",\"447279168\",\"2.93\",\"United States\"\n\"5111\",\"Synlait Milk\",\"SML.NZ\",\"446660540\",\"2.04\",\"New Zealand\"\n\"5112\",\"Workhorse Group\",\"WKHS\",\"446387776\",\"2.73\",\"United States\"\n\"5113\",\"Kodiak Sciences\",\"KOD\",\"446281440\",\"8.59\",\"United States\"\n\"5114\",\"Sportsman's Warehouse\",\"SPWH\",\"446061280\",\"10.11\",\"United States\"\n\"5115\",\"CareMax\",\"CMAX\",\"445576800\",\"5.1\",\"United States\"\n\"5116\",\"Mahindra Logistics\",\"MAHLOG.NS\",\"444056396\",\"6.17\",\"India\"\n\"5117\",\"The Tinplate Company Of India\",\"TINPLATE.NS\",\"443973505\",\"4.24\",\"India\"\n\"5118\",\"Indoco Remedies\",\"INDOCO.NS\",\"441118391\",\"4.79\",\"India\"\n\"5119\",\"Largo\",\"LGO\",\"439810528\",\"6.68\",\"Canada\"\n\"5120\",\"Vuzix\",\"VUZI\",\"439626848\",\"6.91\",\"United States\"\n\"5121\",\"VSE Corporation\",\"VSEC\",\"439238272\",\"34.37\",\"United States\"\n\"5122\",\"ADMA Biologics\",\"ADMA\",\"438532576\",\"2.23\",\"United States\"\n\"5123\",\"Sight Sciences\",\"SGHT\",\"436878976\",\"9.18\",\"United States\"\n\"5124\",\"Upland Software\",\"UPLD\",\"434422272\",\"13.87\",\"United States\"\n\"5125\",\"Protagonist Therapeutics\",\"PTGX\",\"434256608\",\"8.93\",\"United States\"\n\"5126\",\"TPI Composites\",\"TPIC\",\"434054528\",\"11.65\",\"United States\"\n\"5127\",\"Greene County Bancorp\",\"GCBC\",\"434013632\",\"50.98\",\"United States\"\n\"5128\",\"ChannelAdvisor\",\"ECOM\",\"433975392\",\"14.24\",\"United States\"\n\"5129\",\"Webzen\",\"069080.KQ\",\"432236790\",\"13.8\",\"South Korea\"\n\"5130\",\"Guaranty Bancshares\",\"GNTY\",\"432017984\",\"36\",\"United States\"\n\"5131\",\"Engineers India\",\"ENGINERSIN.NS\",\"430502035\",\"0.77\",\"India\"\n\"5132\",\"Bank Mayapada Internasional\",\"MAYA.JK\",\"430340874\",\"0.04\",\"Indonesia\"\n\"5133\",\"AppHarvest\",\"APPH\",\"430339040\",\"4.23\",\"United States\"\n\"5134\",\"CapStar Financial\",\"CSTR\",\"429626944\",\"19.47\",\"United States\"\n\"5135\",\"QNB Finansleasing\",\"QNBFL.IS\",\"429476732\",\"3.73\",\"Turkey\"\n\"5136\",\"Inovio Pharmaceuticals\",\"INO\",\"428535712\",\"1.87\",\"United States\"\n\"5137\",\"Bionano Genomics\",\"BNGO\",\"428519808\",\"1.48\",\"United States\"\n\"5138\",\"Mitek Systems\",\"MITK\",\"425730272\",\"9.6\",\"United States\"\n\"5139\",\"Farmers &amp; Merchants Bancorp\",\"FMAO\",\"424903072\",\"32.52\",\"United States\"\n\"5140\",\"Lulu's Fashion Lounge\",\"LVLU\",\"424440320\",\"10.93\",\"United States\"\n\"5141\",\"Oppenheimer Holdings\",\"OPY\",\"424215072\",\"35.46\",\"United States\"\n\"5142\",\"Affimed\",\"AFMD\",\"424065984\",\"2.84\",\"Germany\"\n\"5143\",\"TCNS Clothing\",\"TCNSBRANDS.NS\",\"423107851\",\"6.87\",\"India\"\n\"5144\",\"Intercept Pharmaceuticals\",\"ICPT\",\"422817408\",\"14.23\",\"United States\"\n\"5145\",\"Brasil Agro\",\"LND\",\"421565600\",\"4.25\",\"Brazil\"\n\"5146\",\"ZimVie\",\"ZIMV\",\"420931200\",\"16.14\",\"United States\"\n\"5147\",\"Covenant Logistics\",\"CVLG\",\"420828640\",\"26.98\",\"United States\"\n\"5148\",\"Cenntro Electric Group\",\"CENN\",\"420622176\",\"1.61\",\"United States\"\n\"5149\",\"Babylon Holdings\",\"BBLN\",\"420528192\",\"1.01\",\"United Kingdom\"\n\"5150\",\"Aura Biosciences\",\"AURA\",\"419881024\",\"14.35\",\"United States\"\n\"5151\",\"CSB Bank\",\"CSBBANK.NS\",\"419819661\",\"2.42\",\"India\"\n\"5152\",\"PennantPark Investment\",\"PNNT\",\"418613664\",\"6.33\",\"United States\"\n\"5153\",\"Helix Energy Solutions\",\"HLX\",\"418556768\",\"2.76\",\"United States\"\n\"5154\",\"Beazer Homes USA\",\"BZH\",\"418071488\",\"13.29\",\"United States\"\n\"5155\",\"Southern Missouri Bancorp\",\"SMBC\",\"416549568\",\"44.75\",\"United States\"\n\"5156\",\"Silvercorp Metals\",\"SVM\",\"416220384\",\"2.3\",\"Canada\"\n\"5157\",\"Havertys\",\"HVT\",\"415196800\",\"24.86\",\"United States\"\n\"5158\",\"Aurora Cannabis\",\"ACB\",\"414518752\",\"1.25\",\"Canada\"\n\"5159\",\"Akero Therapeutics\",\"AKRO\",\"414156640\",\"11.03\",\"United States\"\n\"5160\",\"Icelandair\",\"ICEAIR.IC\",\"413847182\",\"0.01\",\"Iceland\"\n\"5161\",\"Tejon Ranch\",\"TRC\",\"410438464\",\"15.5\",\"United States\"\n\"5162\",\"EZCorp\",\"EZPW\",\"410185792\",\"7.24\",\"United States\"\n\"5163\",\"CNB Financial Corp\",\"CCNE\",\"409351104\",\"24.28\",\"United States\"\n\"5164\",\"Daseke\",\"DSKE\",\"408645696\",\"6.44\",\"United States\"\n\"5165\",\"Tiptree\",\"TIPT\",\"406923488\",\"11.66\",\"United States\"\n\"5166\",\"CarParts.com\",\"PRTS\",\"406075488\",\"7.51\",\"United States\"\n\"5167\",\"Paisalo Digital\",\"PAISALO.NS\",\"405939843\",\"0.92\",\"India\"\n\"5168\",\"22nd Century Group\",\"XXII\",\"403758656\",\"2.05\",\"United States\"\n\"5169\",\"Vicarious Surgical\",\"RBOT\",\"402533376\",\"3.32\",\"United States\"\n\"5170\",\"Borussia Dortmund\",\"BVB.F\",\"401672527\",\"3.59\",\"Germany\"\n\"5171\",\"The Restaurant Group plc\",\"RTN.L\",\"401237338\",\"52.25\",\"United Kingdom\"\n\"5172\",\"Lexicon Pharmaceuticals\",\"LXRX\",\"400911936\",\"2.68\",\"United States\"\n\"5173\",\"AGC Networks\",\"AGCNET.NS\",\"400679230\",\"12.11\",\"India\"\n\"5174\",\"Neowiz Games\",\"095660.KQ\",\"399782156\",\"18.89\",\"South Korea\"\n\"5175\",\"Sudarshan Chemical\",\"SUDARSCHEM.NS\",\"398386368\",\"5.75\",\"India\"\n\"5176\",\"Scholar Rock Holding\",\"SRRK\",\"397950176\",\"7.71\",\"United States\"\n\"5177\",\"GreenTree Hospitality\",\"GHG\",\"397772992\",\"3.86\",\"China\"\n\"5178\",\"Bar Harbor Bankshares\",\"BHB\",\"397233376\",\"26.46\",\"United States\"\n\"5179\",\"Mirza International\",\"MIRZAINT.NS\",\"396818531\",\"3.3\",\"India\"\n\"5180\",\"Safe Bulkers\",\"SB\",\"396595296\",\"3.26\",\"Monaco\"\n\"5181\",\"Mishra Dhatu Nigam\",\"MIDHANI.NS\",\"396438749\",\"2.11\",\"India\"\n\"5182\",\"HomeTrust Bancshares\",\"HTBI\",\"394898976\",\"25.12\",\"United States\"\n\"5183\",\"McPhy Energy\",\"MCPHY.PA\",\"394683077\",\"13.68\",\"France\"\n\"5184\",\"LexinFintech Holdings\",\"LX\",\"394592448\",\"2.14\",\"China\"\n\"5185\",\"Financial Institutions\",\"FISI\",\"394080352\",\"25.76\",\"United States\"\n\"5186\",\"Esperion Therapeutics\",\"ESPR\",\"393676352\",\"6.12\",\"United States\"\n\"5187\",\"SmileDirectClub\",\"SDC\",\"391991104\",\"1.01\",\"United States\"\n\"5188\",\"Heliogen\",\"HLGN\",\"391492896\",\"2.07\",\"United States\"\n\"5189\",\"Chuy's\",\"CHUY\",\"391271488\",\"20.66\",\"United States\"\n\"5190\",\"Bed Bath &amp; Beyond\",\"BBBY\",\"390193088\",\"4.88\",\"United States\"\n\"5191\",\"Gran Tierra Energy\",\"GTE\",\"389237280\",\"1.03\",\"Canada\"\n\"5192\",\"Centrus Energy\",\"LEU\",\"388461120\",\"26.81\",\"United States\"\n\"5193\",\"Valens Semiconductor\",\"VLN\",\"388371872\",\"3.96\",\"Israel\"\n\"5194\",\"The Beachbody Company\",\"BODY\",\"387327520\",\"1.25\",\"United States\"\n\"5195\",\"Strides Pharma\",\"STAR.NS\",\"387077111\",\"4.31\",\"India\"\n\"5196\",\"MasterCraft Boat\",\"MCFT\",\"386867648\",\"21.44\",\"United States\"\n\"5197\",\"New Pacific Metals\",\"NEWP\",\"386555328\",\"2.45\",\"Canada\"\n\"5198\",\"DouYu\",\"DOYU\",\"385743072\",\"1.22\",\"China\"\n\"5199\",\"Hersha Hospitality Trust\",\"HT\",\"385133056\",\"9.35\",\"United States\"\n\"5200\",\"Hikal\",\"HIKAL.NS\",\"383512817\",\"3.11\",\"India\"\n\"5201\",\"Franklin Street Properties\",\"FSP\",\"383209664\",\"3.72\",\"United States\"\n\"5202\",\"Vishay Precision Group\",\"VPG\",\"382984256\",\"28.07\",\"United States\"\n\"5203\",\"Penseco Financial Services\",\"PFIS\",\"382982688\",\"53.4\",\"United States\"\n\"5204\",\"Spandana Sphoorty Financial\",\"SPANDANA.NS\",\"381964839\",\"5.38\",\"India\"\n\"5205\",\"Sunlight Financial\",\"SUNL\",\"381922080\",\"2.89\",\"United States\"\n\"5206\",\"Digital Bros\",\"DIB.MI\",\"380869888\",\"26.65\",\"Italy\"\n\"5207\",\"Eastman Kodak Company\",\"KODK\",\"380457536\",\"4.82\",\"United States\"\n\"5208\",\"a.k.a. Brands\",\"AKA\",\"380175520\",\"2.96\",\"United States\"\n\"5209\",\"Enterprise Bancorp\",\"EBTC\",\"380062464\",\"31.4\",\"United States\"\n\"5210\",\"Nordic American Tankers\",\"NAT\",\"377128512\",\"1.87\",\"Bermuda\"\n\"5211\",\"Tallink Grupp\",\"T5N.F\",\"377104314\",\"0.5\",\"Estonia\"\n\"5212\",\"Arbutus Biopharma\",\"ABUS\",\"377025504\",\"2.54\",\"United States\"\n\"5213\",\"Entravision Communications\",\"EVC\",\"376964736\",\"4.4\",\"United States\"\n\"5214\",\"Casa Systems\",\"CASA\",\"376720800\",\"4\",\"United States\"\n\"5215\",\"Arbe Robotics\",\"ARBE\",\"375682656\",\"5.95\",\"Israel\"\n\"5216\",\"Nilkamal\",\"NILKAMAL.NS\",\"375613072\",\"25.13\",\"India\"\n\"5217\",\"Quantum-Si\",\"QSI\",\"375033376\",\"2.7\",\"United States\"\n\"5218\",\"Dynamic Materials Corporation\",\"BOOM\",\"374843424\",\"19.23\",\"United States\"\n\"5219\",\"Citizens &amp; Northern Corp\",\"CZNC\",\"374522400\",\"24\",\"United States\"\n\"5220\",\"MOIL\",\"MOIL.NS\",\"373914047\",\"1.84\",\"India\"\n\"5221\",\"Haynes International\",\"HAYN\",\"373769984\",\"30\",\"United States\"\n\"5222\",\"Vera Therapeutics\",\"VERA\",\"373681920\",\"13.8\",\"United States\"\n\"5223\",\"Allied Motion Technologies\",\"AMOT\",\"373196224\",\"24.08\",\"United States\"\n\"5224\",\"Generation Bio\",\"GBIO\",\"372213760\",\"6.52\",\"United States\"\n\"5225\",\"Rite Aid\",\"RAD\",\"372143296\",\"6.69\",\"United States\"\n\"5226\",\"Hathway\",\"HATHWAY.NS\",\"371794902\",\"0.21\",\"India\"\n\"5227\",\"Shore Bancshares\",\"SHBI\",\"371783008\",\"18.73\",\"United States\"\n\"5228\",\"Gannett\",\"GCI\",\"371608224\",\"2.54\",\"United States\"\n\"5229\",\"Braemar Hotels &amp; Resorts\",\"BHR\",\"369904000\",\"4.52\",\"United States\"\n\"5230\",\"Sify\",\"SIFY\",\"369138848\",\"2.02\",\"India\"\n\"5231\",\"American National Bank &amp; Trust Company\",\"AMNB\",\"367885568\",\"34.36\",\"United States\"\n\"5232\",\"Karyopharm Therapeutics\",\"KPTI\",\"367873984\",\"4.63\",\"United States\"\n\"5233\",\"Automotive Axles\",\"AUTOAXLES.NS\",\"367802348\",\"24.34\",\"India\"\n\"5234\",\"MeiraGTx\",\"MGTX\",\"367521952\",\"8.22\",\"United States\"\n\"5235\",\"The Manitowoc Company\",\"MTW\",\"366966496\",\"10.39\",\"United States\"\n\"5236\",\"Phathom Pharmaceuticals\",\"PHAT\",\"366886080\",\"9.39\",\"United States\"\n\"5237\",\"Lands' End\",\"LE\",\"366885696\",\"10.98\",\"United States\"\n\"5238\",\"Gladstone Capital\",\"GLAD\",\"366714016\",\"10.69\",\"United States\"\n\"5239\",\"NI Holdings\",\"NODK\",\"364396032\",\"17.16\",\"United States\"\n\"5240\",\"Macquarie Infrastructure\",\"MIC\",\"363060416\",\"4.08\",\"United States\"\n\"5241\",\"Nautilus Biotechnology\",\"NAUT\",\"362184416\",\"2.91\",\"United States\"\n\"5242\",\"Satellogic\",\"SATL\",\"362050624\",\"3.99\",\"United States\"\n\"5243\",\"Entrada Therapeutics\",\"TRDA\",\"361331712\",\"11.52\",\"United States\"\n\"5244\",\"Vital Farms\",\"VITL\",\"360192064\",\"8.87\",\"United States\"\n\"5245\",\"Clovis Oncology\",\"CLVS\",\"359697536\",\"2.5\",\"United States\"\n\"5246\",\"ShotSpotter\",\"SSTI\",\"359634208\",\"29.62\",\"United States\"\n\"5247\",\"Willdan Group\",\"WLDN\",\"359324352\",\"27.21\",\"United States\"\n\"5248\",\"Daily Journal\",\"DJCO\",\"359008832\",\"260.01\",\"United States\"\n\"5249\",\"Lordstown Motors\",\"RIDE\",\"358217280\",\"1.74\",\"United States\"\n\"5250\",\"AirSculpt Technologies\",\"AIRS\",\"357766464\",\"6.43\",\"United States\"\n\"5251\",\"Kaveri Seed\",\"KSCL.NS\",\"357156937\",\"6.12\",\"India\"\n\"5252\",\"Vaalco Energy\",\"EGY\",\"356946720\",\"6.06\",\"United States\"\n\"5253\",\"Humacyte\",\"HUMA\",\"356397312\",\"3.46\",\"United States\"\n\"5254\",\"Kirloskar Ferrous Industries\",\"KIRLFER.NS\",\"355108860\",\"2.56\",\"India\"\n\"5255\",\"First Internet Bancorp\",\"INBK\",\"354645760\",\"36.73\",\"United States\"\n\"5256\",\"Hailiang Education\",\"HLG\",\"353675552\",\"13.72\",\"China\"\n\"5257\",\"Radiant Logistics\",\"RLGT\",\"353118688\",\"7.14\",\"United States\"\n\"5258\",\"Regional Management\",\"RM\",\"353027264\",\"36.5\",\"United States\"\n\"5259\",\"Southern First Bancshares\",\"SFST\",\"352541216\",\"44.16\",\"United States\"\n\"5260\",\"Transcontinental Realty Investors\",\"TCI\",\"350842784\",\"40.61\",\"United States\"\n\"5261\",\"Mesoblast\",\"MESO\",\"350637760\",\"2.67\",\"Australia\"\n\"5262\",\"SelectQuote\",\"SLQT\",\"350176288\",\"2.13\",\"United States\"\n\"5263\",\"Summit Financial Group\",\"SMMF\",\"349476608\",\"27.37\",\"United States\"\n\"5264\",\"Markforged\",\"MKFG\",\"348610144\",\"1.86\",\"United States\"\n\"5265\",\"Civeo\",\"CVEO\",\"347738464\",\"24.55\",\"United States\"\n\"5266\",\"Rupa Company\",\"RUPA.NS\",\"347472263\",\"4.37\",\"India\"\n\"5267\",\"Axogen\",\"AXGN\",\"347175392\",\"8.27\",\"United States\"\n\"5268\",\"Tata Steel Long Products\",\"TATASTLLP.NS\",\"347093254\",\"7.7\",\"India\"\n\"5269\",\"Gilat Telecom\",\"GILT\",\"346350976\",\"6.12\",\"Israel\"\n\"5270\",\"Ideanomics\",\"IDEX\",\"345291072\",\"0.69\",\"United States\"\n\"5271\",\"Meta Materials\",\"MMAT\",\"344732928\",\"0.96\",\"Canada\"\n\"5272\",\"Gravity Co.\",\"GRVY\",\"343935808\",\"49.5\",\"South Korea\"\n\"5273\",\"Cosmo Films\",\"COSMOFILMS.NS\",\"343138668\",\"12.59\",\"India\"\n\"5274\",\"Avon Protection\",\"AVON.L\",\"342580257\",\"1132.19\",\"United Kingdom\"\n\"5275\",\"Clipper Realty\",\"CLPR\",\"342011424\",\"8.07\",\"United States\"\n\"5276\",\"F45 Training\",\"FXLV\",\"340603360\",\"3.56\",\"United States\"\n\"5277\",\"Astra Space\",\"ASTR\",\"340466784\",\"1.29\",\"United States\"\n\"5278\",\"Ayr Wellness\",\"AYRWF\",\"340403104\",\"4.95\",\"United States\"\n\"5279\",\"bluebird bio\",\"BLUE\",\"339755168\",\"4.75\",\"United States\"\n\"5280\",\"Reliance Infrastructure\",\"RELINFRA.NS\",\"339371783\",\"1.29\",\"India\"\n\"5281\",\"El Pollo Loco\",\"LOCO\",\"338858048\",\"9.22\",\"United States\"\n\"5282\",\"The Container Store\",\"TCS\",\"338689280\",\"6.69\",\"United States\"\n\"5283\",\"IRSA Propiedades Comerciales\",\"IRCP\",\"338058496\",\"2.5\",\"Argentina\"\n\"5284\",\"Civista Bancshares\",\"CIVB\",\"337325024\",\"21.54\",\"United States\"\n\"5285\",\"Qiwi\",\"QIWI.ME\",\"336599714\",\"5.37\",\"Cyprus\"\n\"5286\",\"Zymeworks\",\"ZYME\",\"335072960\",\"5.8\",\"Canada\"\n\"5287\",\"Gold Royalty Corp\",\"GROY\",\"334705344\",\"2.49\",\"Canada\"\n\"5288\",\"HBL Power Systems\",\"HBLPOWER.NS\",\"334169382\",\"1.21\",\"India\"\n\"5289\",\"Tredegar\",\"TG\",\"333791552\",\"9.86\",\"United States\"\n\"5290\",\"Bushiroad\",\"7803.T\",\"333117428\",\"10.38\",\"Japan\"\n\"5291\",\"SciPlay\",\"SCPL\",\"332008384\",\"13.46\",\"United States\"\n\"5292\",\"Angel Oak REIT\",\"AOMR\",\"331782368\",\"13.31\",\"United States\"\n\"5293\",\"Information Services Group\",\"III\",\"331519936\",\"6.89\",\"United States\"\n\"5294\",\"Bakhu Holdings\",\"BKUH\",\"331374976\",\"1.1\",\"United States\"\n\"5295\",\"ATI Physical Therapy\",\"ATIP\",\"328851744\",\"1.59\",\"United States\"\n\"5296\",\"Blade Air Mobility\",\"BLDE\",\"328687552\",\"4.62\",\"United States\"\n\"5297\",\"Berkeley Lights\",\"BLI\",\"328280768\",\"4.84\",\"United States\"\n\"5298\",\"India Glycols\",\"INDIAGLYCO.NS\",\"327944707\",\"10.59\",\"India\"\n\"5299\",\"First Bancorp\",\"FNLC\",\"327293248\",\"29.68\",\"United States\"\n\"5300\",\"Action Construction Equipment\",\"ACE.NS\",\"327183185\",\"2.75\",\"India\"\n\"5301\",\"Ramkrishna Forgings\",\"RKFORGE.NS\",\"326981445\",\"2.04\",\"India\"\n\"5302\",\"Velo3D\",\"VLD\",\"326349728\",\"1.78\",\"United States\"\n\"5303\",\"Time Technoplast\",\"TIMETECHNO.NS\",\"323969205\",\"1.43\",\"India\"\n\"5304\",\"Ocular Therapeutix\",\"OCUL\",\"323541728\",\"4.22\",\"United States\"\n\"5305\",\"People Can Fly\",\"PCF.WA\",\"323457260\",\"10.8\",\"Poland\"\n\"5306\",\"Sequent Scientific\",\"SEQUENT.NS\",\"322972535\",\"1.29\",\"India\"\n\"5307\",\"Heron Therapeutics\",\"HRTX\",\"322299584\",\"3.15\",\"United States\"\n\"5308\",\"JOANN\",\"JOAN\",\"321679136\",\"7.91\",\"United States\"\n\"5309\",\"OrganiGram Holdings\",\"OGI\",\"321532224\",\"1.03\",\"Canada\"\n\"5310\",\"Bafang Yunji\",\"2753.TW\",\"320918361\",\"4.86\",\"Taiwan\"\n\"5311\",\"Schneider Electric Infrastructure\",\"SCHNEIDER.NS\",\"320878350\",\"1.34\",\"India\"\n\"5312\",\"Somany Ceramics\",\"SOMANYCERA.NS\",\"320607886\",\"7.55\",\"India\"\n\"5313\",\"Sierra Bancorp\",\"BSRR\",\"320577504\",\"21.25\",\"United States\"\n\"5314\",\"North American Construction Group\",\"NOA\",\"320430368\",\"11.25\",\"Canada\"\n\"5315\",\"Duluth Holdings\",\"DLTH\",\"319919520\",\"9.59\",\"United States\"\n\"5316\",\"Burning Rock Biotech\",\"BNR\",\"319245600\",\"3.04\",\"China\"\n\"5317\",\"Hyderabad Industries Limited\",\"HIL.NS\",\"317184980\",\"42.2\",\"India\"\n\"5318\",\"OPTiM\",\"3694.T\",\"317155720\",\"5.76\",\"Japan\"\n\"5319\",\"ReneSola\",\"SOL\",\"316882976\",\"4.72\",\"United States\"\n\"5320\",\"India Tourism Development Corp\",\"ITDC.NS\",\"316235447\",\"3.69\",\"India\"\n\"5321\",\"Global Cord Blood\",\"CO\",\"315935360\",\"2.6\",\"Hong Kong\"\n\"5322\",\"Astronics Corporation\",\"ATRO\",\"314817728\",\"9.97\",\"United States\"\n\"5323\",\"Hemisphere Media Group\",\"HMTV\",\"313913440\",\"7.77\",\"United States\"\n\"5324\",\"AO World\",\"AO.L\",\"313618029\",\"54.7\",\"United Kingdom\"\n\"5325\",\"Priority Technology Holdings\",\"PRTH\",\"313130784\",\"4.07\",\"United States\"\n\"5326\",\"eGain\",\"EGAN\",\"313116672\",\"9.84\",\"United States\"\n\"5327\",\"Precigen\",\"PGEN\",\"312577952\",\"1.51\",\"United States\"\n\"5328\",\"Caesarstone\",\"CSTE\",\"310628768\",\"9.01\",\"Israel\"\n\"5329\",\"Aeroporto G. Marconi Bologna\",\"ADB.MI\",\"310325510\",\"8.49\",\"Italy\"\n\"5330\",\"Arizona Metals\",\"AMC.V\",\"309666055\",\"2.78\",\"Canada\"\n\"5331\",\"Ellomay Capital\",\"ELLO\",\"308640192\",\"24.02\",\"Israel\"\n\"5332\",\"AEye\",\"LIDR\",\"305268736\",\"1.94\",\"United States\"\n\"5333\",\"Marine Products Corporation\",\"MPX\",\"303868224\",\"8.9\",\"United States\"\n\"5334\",\"Siyaram Silk Mills\",\"SIYSIL.NS\",\"303829165\",\"6.48\",\"India\"\n\"5335\",\"Pizza Pizza\",\"PZA.TO\",\"303251677\",\"9.42\",\"Canada\"\n\"5336\",\"Glatfelter\",\"GLT\",\"302086304\",\"6.76\",\"United States\"\n\"5337\",\"Marvelous\",\"7844.T\",\"300155312\",\"4.97\",\"Japan\"\n\"5338\",\"Digimarc\",\"DMRC\",\"299911136\",\"15.04\",\"United States\"\n\"5339\",\"Tupperware Brands\",\"TUP\",\"299346880\",\"6.53\",\"United States\"\n\"5340\",\"Mind Medicine\",\"MNMD\",\"298941824\",\"0.65\",\"United States\"\n\"5341\",\"FutureFuel\",\"FF\",\"298902656\",\"6.83\",\"United States\"\n\"5342\",\"PTC India\",\"PTC.NS\",\"298210972\",\"1.01\",\"India\"\n\"5343\",\"EverQuote\",\"EVER\",\"298059648\",\"9.5\",\"United States\"\n\"5344\",\"Macatawa Bank\",\"MCBC\",\"298009792\",\"8.7\",\"United States\"\n\"5345\",\"Trean Insurance Group\",\"TIG\",\"297938624\",\"5.82\",\"United States\"\n\"5346\",\"Lumber Liquidators\",\"LL\",\"297787008\",\"10\",\"United States\"\n\"5347\",\"Doma\",\"DOMA\",\"297369440\",\"0.92\",\"United States\"\n\"5348\",\"Taseko Mines\",\"TGB\",\"296937920\",\"1.04\",\"Canada\"\n\"5349\",\"Preformed Line Products\",\"PLPC\",\"296405408\",\"60\",\"United States\"\n\"5350\",\"BCB Bancorp\",\"BCBP\",\"296158368\",\"17.43\",\"United States\"\n\"5351\",\"Oil States International\",\"OIS\",\"295217984\",\"4.62\",\"United States\"\n\"5352\",\"Home Bancorp\",\"HBCP\",\"294379840\",\"35.28\",\"United States\"\n\"5353\",\"Groupon\",\"GRPN\",\"294207200\",\"9.82\",\"United States\"\n\"5354\",\"Orient Cement\",\"ORIENTCEM.NS\",\"294002511\",\"1.44\",\"India\"\n\"5355\",\"SpiceJet\",\"SPICEJET.NS\",\"292536677\",\"0.49\",\"India\"\n\"5356\",\"Huttig Building Products\",\"HBP\",\"292397824\",\"10.7\",\"United States\"\n\"5357\",\"Revlon\",\"REV\",\"292392864\",\"5.36\",\"United States\"\n\"5358\",\"SkyWater Technology\",\"SKYT\",\"292249664\",\"7.25\",\"United States\"\n\"5359\",\"Vesuvius India\",\"VESUVIUS.NS\",\"291430327\",\"14.36\",\"India\"\n\"5360\",\"Landec\",\"LNDC\",\"290992256\",\"9.87\",\"United States\"\n\"5361\",\"PCSB Financial\",\"PCSB\",\"290289664\",\"18.93\",\"United States\"\n\"5362\",\"Green Plains Partners\",\"GPP\",\"289881696\",\"12.48\",\"United States\"\n\"5363\",\"Northwest Pipe Company\",\"NWPX\",\"288555008\",\"29.1\",\"United States\"\n\"5364\",\"CIRCOR International\",\"CIR\",\"288473920\",\"14.24\",\"United States\"\n\"5365\",\"Arvind\",\"ARVIND.NS\",\"288361393\",\"1.1\",\"India\"\n\"5366\",\"Rockley Photonics\",\"RKLY\",\"287681152\",\"2.23\",\"United Kingdom\"\n\"5367\",\"NACCO Industries\",\"NC\",\"287634592\",\"39.25\",\"United States\"\n\"5368\",\"Third Coast Bancshares\",\"TCBX\",\"287443680\",\"21.36\",\"United States\"\n\"5369\",\"Unity Bancorp\",\"UNTY\",\"286820160\",\"27.33\",\"United States\"\n\"5370\",\"Purple Innovation\",\"PRPL\",\"286780576\",\"3.47\",\"United States\"\n\"5371\",\"Northeast Bank\",\"NBN\",\"286693504\",\"37.5\",\"United States\"\n\"5372\",\"Kyokuyo\",\"1301.T\",\"285840285\",\"26.46\",\"Japan\"\n\"5373\",\"Ouster\",\"OUST\",\"284808960\",\"1.64\",\"United States\"\n\"5374\",\"Ooma\",\"OOMA\",\"284796000\",\"11.72\",\"United States\"\n\"5375\",\"Kimball International\",\"KBAL\",\"284586912\",\"7.73\",\"United States\"\n\"5376\",\"Grindrod Shipping\",\"GRIN\",\"283042944\",\"14.93\",\"Singapore\"\n\"5377\",\"Zynex\",\"ZYXI\",\"282975008\",\"7.35\",\"United States\"\n\"5378\",\"Vst Tillers Tractors\",\"VSTTILLERS.NS\",\"282664121\",\"32.7\",\"India\"\n\"5379\",\"CompX International\",\"CIX\",\"281537120\",\"22.74\",\"United States\"\n\"5380\",\"Hindustan Oil Exploration Company\",\"HINDOILEXP.NS\",\"281325070\",\"2.12\",\"India\"\n\"5381\",\"Investors Title Company\",\"ITIC\",\"281287744\",\"148.26\",\"United States\"\n\"5382\",\"Blue Bird Corporation\",\"BLBD\",\"281200000\",\"8.79\",\"United States\"\n\"5383\",\"PyroGenesis Canada\",\"PYR\",\"280970240\",\"1.65\",\"Canada\"\n\"5384\",\"PLBY Group (Playboy)\",\"PLBY\",\"280876896\",\"6.16\",\"United States\"\n\"5385\",\"West Coast Paper Mills\",\"WSTCSTPAPR.NS\",\"280326622\",\"4.24\",\"India\"\n\"5386\",\"Solo Brands\",\"DTC\",\"280231552\",\"4.42\",\"United States\"\n\"5387\",\"Avadel Pharmaceuticals\",\"AVDL\",\"280136256\",\"4.75\",\"Ireland\"\n\"5388\",\"Focus Home Interactive\",\"ALFOC.PA\",\"279716746\",\"45.25\",\"France\"\n\"5389\",\"Greenply\",\"GREENPLY.NS\",\"279131458\",\"2.27\",\"India\"\n\"5390\",\"Qudian\",\"QD\",\"278984896\",\"1.11\",\"China\"\n\"5391\",\"Inox Wind\",\"INOXWIND.NS\",\"278642048\",\"1\",\"India\"\n\"5392\",\"Cognyte Software\",\"CGNT\",\"277345696\",\"4.11\",\"Israel\"\n\"5393\",\"Argonaut Gold\",\"AR.TO\",\"276831190\",\"0.35\",\"United States\"\n\"5394\",\"REE Automotive\",\"REE\",\"276596192\",\"1.16\",\"Israel\"\n\"5395\",\"Jain Irrigation Systems\",\"JISLDVREQS.NS\",\"276461444\",\"0.25\",\"India\"\n\"5396\",\"Safari Industries India\",\"SAFARI.NS\",\"276060127\",\"12.33\",\"India\"\n\"5397\",\"Karnataka Bank\",\"KTKBANK.NS\",\"275650620\",\"0.89\",\"India\"\n\"5398\",\"PolyMet\",\"PLM\",\"275643008\",\"2.7\",\"Canada\"\n\"5399\",\"Dish TV\",\"DISHTV.NS\",\"275582232\",\"0.15\",\"India\"\n\"5400\",\"MBM Resources\",\"5983.KL\",\"275551574\",\"0.71\",\"Malaysia\"\n\"5401\",\"Provident Bancorp\",\"PVBC\",\"274295552\",\"15.4\",\"United States\"\n\"5402\",\"EyePoint Pharmaceuticals\",\"EYPT\",\"274079168\",\"8.05\",\"United States\"\n\"5403\",\"Bitfarms\",\"BITF\",\"273781984\",\"1.17\",\"Canada\"\n\"5404\",\"Newpark Resources\",\"NR\",\"273365184\",\"2.96\",\"United States\"\n\"5405\",\"Marathon Gold\",\"MOZ.TO\",\"273205217\",\"1.07\",\"Canada\"\n\"5406\",\"First Guaranty Bancshares\",\"FGBI\",\"272742560\",\"25.45\",\"United States\"\n\"5407\",\"Olympic Steel\",\"ZEUS\",\"272628640\",\"24.5\",\"United States\"\n\"5408\",\"Sutro Biopharma\",\"STRO\",\"272452448\",\"5.81\",\"United States\"\n\"5409\",\"Adaptimmune Therapeutics\",\"ADAP\",\"272191936\",\"1.68\",\"United Kingdom\"\n\"5410\",\"GasLog Partners\",\"GLOP\",\"272078016\",\"5.05\",\"Greece\"\n\"5411\",\"AC Immune\",\"ACIU\",\"271928032\",\"3.26\",\"Switzerland\"\n\"5412\",\"Tidewater Renewables\",\"LCFS.TO\",\"271416624\",\"7.82\",\"Canada\"\n\"5413\",\"Quotient Technology\",\"QUOT\",\"271371296\",\"2.85\",\"United States\"\n\"5414\",\"Alico\",\"ALCO\",\"271122080\",\"35.84\",\"United States\"\n\"5415\",\"National Fertilizers\",\"NFL.NS\",\"270880239\",\"0.55\",\"India\"\n\"5416\",\"HF Foods Group\",\"HFFG\",\"270680256\",\"5.04\",\"United States\"\n\"5417\",\"Vidhi Specialty Food\",\"VIDHIING.NS\",\"270366848\",\"5.41\",\"India\"\n\"5418\",\"A.S. Roma\",\"ASR.MI\",\"270333876\",\"0.43\",\"Italy\"\n\"5419\",\"ACNB Corporation\",\"ACNB\",\"270266208\",\"31.04\",\"United States\"\n\"5420\",\"CymaBay Therapeutics\",\"CBAY\",\"270122528\",\"3.19\",\"United States\"\n\"5421\",\"Inotiv\",\"NOTV\",\"269695648\",\"10.57\",\"United States\"\n\"5422\",\"Benefitfocus\",\"BNFT\",\"269528064\",\"7.94\",\"United States\"\n\"5423\",\"Electrosteel Castings\",\"ELECTCAST.NS\",\"268856272\",\"0.45\",\"India\"\n\"5424\",\"Talkspace\",\"TALK\",\"268131424\",\"1.71\",\"United States\"\n\"5425\",\"Powell Industries\",\"POWL\",\"267773040\",\"22.73\",\"United States\"\n\"5426\",\"First Western Financial\",\"MYFW\",\"267430880\",\"28.25\",\"United States\"\n\"5427\",\"Planet13\",\"PLTH.CN\",\"267045646\",\"1.21\",\"United States\"\n\"5428\",\"Ashoka Buildcon\",\"ASHOKA.NS\",\"266924803\",\"0.95\",\"India\"\n\"5429\",\"Filatex India\",\"FILATEX.NS\",\"266620184\",\"1.2\",\"India\"\n\"5430\",\"Liquidia Technologies\",\"LQDA\",\"266386224\",\"4.14\",\"United States\"\n\"5431\",\"Ashford Hospitality Trust\",\"AHT\",\"266305936\",\"7.35\",\"United States\"\n\"5432\",\"Ocwen\",\"OCN\",\"266136896\",\"28.77\",\"United States\"\n\"5433\",\"G1 Therapeutics\",\"GTHX\",\"266055264\",\"6.23\",\"United States\"\n\"5434\",\"Teekay\",\"TK\",\"265927200\",\"2.62\",\"Canada\"\n\"5435\",\"Aldeyra Therapeutics\",\"ALDX\",\"265854832\",\"4.56\",\"United States\"\n\"5436\",\"Orrstown Financial Services\",\"ORRF\",\"265204656\",\"23.99\",\"United States\"\n\"5437\",\"MM Forgings\",\"MMFL.NS\",\"264884453\",\"10.97\",\"India\"\n\"5438\",\"HIVE Blockchain Technologies\",\"HIVE\",\"264848752\",\"3.21\",\"Canada\"\n\"5439\",\"BlackSky Technology\",\"BKSY\",\"263914576\",\"2.19\",\"United States\"\n\"5440\",\"Big 5 Sporting Goods\",\"BGFV\",\"263902768\",\"11.82\",\"United States\"\n\"5441\",\"First Business Financial Services\",\"FBIZ\",\"263353552\",\"31.1\",\"United States\"\n\"5442\",\"Puravankara\",\"PURVA.NS\",\"263230428\",\"1.11\",\"India\"\n\"5443\",\"Lineage Cell Therapeutics\",\"LCTX\",\"263076848\",\"1.55\",\"United States\"\n\"5444\",\"Prime Focus\",\"PFOCUS.NS\",\"262976605\",\"0.88\",\"India\"\n\"5445\",\"AXT Inc\",\"AXTI\",\"262831280\",\"6.12\",\"United States\"\n\"5446\",\"Viking Therapeutics\",\"VKTX\",\"262683696\",\"3.4\",\"United States\"\n\"5447\",\"Root Insurance\",\"ROOT\",\"261880512\",\"1.03\",\"United States\"\n\"5448\",\"Chicago Atlantic Real Estate Finance\",\"REFI\",\"261513504\",\"14.81\",\"United States\"\n\"5449\",\"Alaunos Therapeutics\",\"TCRT\",\"261300720\",\"1.21\",\"United States\"\n\"5450\",\"Zomedica Pharmaceuticals\",\"ZOM\",\"261241360\",\"0.27\",\"United States\"\n\"5451\",\"Identiv\",\"INVE\",\"261096144\",\"11.69\",\"United States\"\n\"5452\",\"Motorcar Parts of America\",\"MPAA\",\"260970240\",\"13.65\",\"United States\"\n\"5453\",\"RattanIndia Power\",\"RTNPOWER.NS\",\"260035741\",\"0.05\",\"India\"\n\"5454\",\"GreenLight Biosciences\",\"GRNA\",\"259949872\",\"2.11\",\"United States\"\n\"5455\",\"Volta\",\"VLTA\",\"259644976\",\"1.55\",\"United States\"\n\"5456\",\"SRA Holdings\",\"3817.T\",\"258751370\",\"20.93\",\"Japan\"\n\"5457\",\"Hut 8 Mining\",\"HUT\",\"258281328\",\"1.48\",\"Canada\"\n\"5458\",\"Veritone\",\"VERI\",\"256803440\",\"7.12\",\"United States\"\n\"5459\",\"JTEKT India\",\"JTEKTINDIA.NS\",\"256606910\",\"1.05\",\"India\"\n\"5460\",\"Redbox\",\"RDBX\",\"256510000\",\"5.65\",\"United States\"\n\"5461\",\"Brightcove\",\"BCOV\",\"256376464\",\"6.17\",\"United States\"\n\"5462\",\"Miller Industries\",\"MLR\",\"255562832\",\"22.39\",\"United States\"\n\"5463\",\"Surya Roshni\",\"SURYAROSNI.NS\",\"255457029\",\"4.7\",\"India\"\n\"5464\",\"Outlook Therapeutics\",\"OTLK\",\"255315600\",\"1.13\",\"United States\"\n\"5465\",\"Voyager Therapeutics\",\"VYGR\",\"254579376\",\"6.62\",\"United States\"\n\"5466\",\"Hovnanian Enterprises\",\"HOV\",\"254579184\",\"45.18\",\"United States\"\n\"5467\",\"GrowGeneration\",\"GRWG\",\"254548560\",\"4.19\",\"United States\"\n\"5468\",\"Subros\",\"SUBROS.NS\",\"254476045\",\"3.9\",\"India\"\n\"5469\",\"LianBio\",\"LIAN\",\"254446240\",\"2.35\",\"United States\"\n\"5470\",\"Cepton\",\"CPTN\",\"254179200\",\"1.65\",\"United States\"\n\"5471\",\"Stratus Properties\",\"STRS\",\"253989392\",\"30.7\",\"United States\"\n\"5472\",\"Gulf Oil Lubricants\",\"GULFOILLUB.NS\",\"253753548\",\"5.18\",\"India\"\n\"5473\",\"Ring Energy\",\"REI\",\"252881360\",\"2.37\",\"United States\"\n\"5474\",\"Greenlight Reinsurance\",\"GLRE\",\"252770336\",\"7.28\",\"Cayman Islands\"\n\"5475\",\"Parke Bancorp\",\"PKBK\",\"251970528\",\"21.15\",\"United States\"\n\"5476\",\"Republic First Bancorp\",\"FRBK\",\"251827120\",\"3.95\",\"United States\"\n\"5477\",\"Unifi\",\"UFI\",\"251113312\",\"13.59\",\"United States\"\n\"5478\",\"CyberOptics\",\"CYBE\",\"250836688\",\"33.88\",\"United States\"\n\"5479\",\"Marksans Pharma\",\"MARKSANS.NS\",\"250711762\",\"0.61\",\"India\"\n\"5480\",\"Vinco Ventures\",\"BBIG\",\"249460880\",\"1.07\",\"United States\"\n\"5481\",\"Hester Biosciences\",\"HESTERBIO.NS\",\"249241962\",\"29.3\",\"India\"\n\"5482\",\"Epizyme\",\"EPZM\",\"247443616\",\"1.47\",\"United States\"\n\"5483\",\"RumbleON\",\"RMBL\",\"246827600\",\"14.91\",\"United States\"\n\"5484\",\"Weyco Group\",\"WEYS\",\"246763376\",\"25.61\",\"United States\"\n\"5485\",\"11 bit studios\",\"11B.WA\",\"246589856\",\"103.6\",\"Poland\"\n\"5486\",\"Whole Earth Brands\",\"FREE\",\"246444912\",\"5.88\",\"United States\"\n\"5487\",\"UBM Development\",\"UBS.VI\",\"246442940\",\"32.98\",\"Austria\"\n\"5488\",\"Science 37\",\"SNCE\",\"245667712\",\"2.12\",\"United States\"\n\"5489\",\"Park Aerospace\",\"PKE\",\"245498400\",\"12\",\"United States\"\n\"5490\",\"Bankwell Financial Group\",\"BWFG\",\"245406304\",\"31.62\",\"United States\"\n\"5491\",\"Rent the Runway\",\"RENT\",\"245403408\",\"3.83\",\"United States\"\n\"5492\",\"Limoneira\",\"LMNR\",\"245365296\",\"13.34\",\"United States\"\n\"5493\",\"AdTheorent\",\"ADTH\",\"245227824\",\"2.86\",\"United States\"\n\"5494\",\"Comtech Telecommunications\",\"CMTL\",\"244313664\",\"9.21\",\"United States\"\n\"5495\",\"Hindustan Sanitaryware &amp; Industries\",\"HSIL.NS\",\"244026295\",\"3.76\",\"India\"\n\"5496\",\"Village Farms International\",\"VFF\",\"243554080\",\"2.75\",\"Canada\"\n\"5497\",\"Selecta Biosciences\",\"SELB\",\"242894384\",\"1.6\",\"United States\"\n\"5498\",\"Gabriel India\",\"GABRIEL.NS\",\"242724903\",\"1.69\",\"India\"\n\"5499\",\"Absa Bank\",\"ABSP.JO\",\"242177620\",\"54.02\",\"South Africa\"\n\"5500\",\"Cato Fashion\",\"CATO\",\"241983568\",\"11.53\",\"United States\"\n\"5501\",\"Kewal Kiran Clothing\",\"KKCL.NS\",\"241476701\",\"3.92\",\"India\"\n\"5502\",\"Acacia Research\",\"ACTG\",\"240500928\",\"5.25\",\"United States\"\n\"5503\",\"DHI Group\",\"DHX\",\"240458240\",\"5.08\",\"United States\"\n\"5504\",\"Hindustan Construction Company\",\"HCC.NS\",\"239776852\",\"0.16\",\"India\"\n\"5505\",\"Emerald Holding\",\"EEX\",\"239144992\",\"3.41\",\"United States\"\n\"5506\",\"IronNet\",\"IRNT\",\"238704544\",\"2.36\",\"United States\"\n\"5507\",\"Sono\",\"SEV\",\"237888896\",\"2.82\",\"Germany\"\n\"5508\",\"The RealReal\",\"REAL\",\"237820464\",\"2.52\",\"United States\"\n\"5509\",\"Cian\",\"CIAN\",\"237563120\",\"3.4\",\"Russia\"\n\"5510\",\"Build-A-Bear\",\"BBW\",\"237075232\",\"15.21\",\"United States\"\n\"5511\",\"AVEO Oncology\",\"AVEO\",\"236517024\",\"6.86\",\"United States\"\n\"5512\",\"I.g. Petrochemicals\",\"IGPL.NS\",\"236438072\",\"7.68\",\"India\"\n\"5513\",\"Stellus Capital\",\"SCM\",\"236294288\",\"12.09\",\"United States\"\n\"5514\",\"ThredUp\",\"TDUP\",\"235738528\",\"2.38\",\"United States\"\n\"5515\",\"Oriental Aromatics\",\"OAL.NS\",\"235572641\",\"7\",\"India\"\n\"5516\",\"TrueCar\",\"TRUE\",\"235549056\",\"2.61\",\"United States\"\n\"5517\",\"Porch Group\",\"PRCH\",\"234954432\",\"2.37\",\"United States\"\n\"5518\",\"Apollo Pipes\",\"APOLLOPIPE.NS\",\"234891718\",\"5.97\",\"India\"\n\"5519\",\"Arteris\",\"AIP\",\"234753120\",\"7.35\",\"United States\"\n\"5520\",\"Genie Energy\",\"GNE\",\"233926720\",\"8.93\",\"United States\"\n\"5521\",\"Alembic Limited\",\"ALEMBICLTD.NS\",\"233825731\",\"0.91\",\"India\"\n\"5522\",\"Silicom\",\"SILC\",\"232778704\",\"35\",\"Israel\"\n\"5523\",\"Troops\",\"TROO\",\"232659424\",\"2.29\",\"Hong Kong\"\n\"5524\",\"Trecora Resources\",\"TREC\",\"232631408\",\"9.81\",\"United States\"\n\"5525\",\"Northrim BanCorp\",\"NRIM\",\"232313392\",\"39.94\",\"United States\"\n\"5526\",\"Loop Industries\",\"LOOP\",\"231789424\",\"4.89\",\"Canada\"\n\"5527\",\"Jaypee Group\",\"JPASSOCIAT.NS\",\"231542712\",\"0.09\",\"India\"\n\"5528\",\"Lifetime Brands\",\"LCUT\",\"231384848\",\"10.44\",\"United States\"\n\"5529\",\"Pollux Properti Indonesia\",\"POLL.JK\",\"230939540\",\"0.03\",\"Indonesia\"\n\"5530\",\"T’way Air\",\"091810.KS\",\"230828236\",\"1.44\",\"South Korea\"\n\"5531\",\"Gallantt Ispat\",\"GALLISPAT.NS\",\"230482830\",\"0.82\",\"India\"\n\"5532\",\"Portman Ridge\",\"PTMN\",\"230226304\",\"23.7\",\"United States\"\n\"5533\",\"Investar Holding\",\"ISTR\",\"229728288\",\"22.31\",\"United States\"\n\"5534\",\"Astra Microwave\",\"ASTRAMICRO.NS\",\"229634065\",\"2.65\",\"India\"\n\"5535\",\"Tillys\",\"TLYS\",\"229522400\",\"7.64\",\"United States\"\n\"5536\",\"Buzzfeed\",\"BZFD\",\"229511568\",\"1.69\",\"United States\"\n\"5537\",\"The Original BARK Company\",\"BARK\",\"228778224\",\"1.31\",\"United States\"\n\"5538\",\"Urban One\",\"UONE\",\"228769808\",\"5.65\",\"United States\"\n\"5539\",\"Embark Technology\",\"EMBK\",\"228693808\",\"0.51\",\"United States\"\n\"5540\",\"Ardmore Shipping\",\"ASC\",\"228185104\",\"6.6\",\"Bermuda\"\n\"5541\",\"eHealth\",\"EHTH\",\"228109408\",\"8.5\",\"United States\"\n\"5542\",\"Weave Communications\",\"WEAV\",\"227253248\",\"3.5\",\"United States\"\n\"5543\",\"Diebold Nixdorf\",\"DBD\",\"227035024\",\"2.88\",\"United States\"\n\"5544\",\"AeroClean Technologies\",\"AERC\",\"226281392\",\"14.72\",\"United States\"\n\"5545\",\"Bel Fuse\",\"BELFB\",\"225694416\",\"17.07\",\"United States\"\n\"5546\",\"NVE Corporation\",\"NVEC\",\"225599760\",\"46.7\",\"United States\"\n\"5547\",\"Destination XL\",\"DXLG\",\"225515872\",\"3.6\",\"United States\"\n\"5548\",\"Lightning eMotors\",\"ZEV\",\"225231760\",\"2.98\",\"United States\"\n\"5549\",\"Amplify Energy\",\"AMPY\",\"225171712\",\"5.88\",\"United States\"\n\"5550\",\"Ceragon Networks\",\"CRNT\",\"225124544\",\"2.68\",\"Israel\"\n\"5551\",\"Cantabil Retail India\",\"CANTABIL.NS\",\"224141341\",\"13.66\",\"India\"\n\"5552\",\"Anant Raj\",\"ANANTRAJ.NS\",\"224001344\",\"0.76\",\"India\"\n\"5553\",\"Concert Pharmaceuticals\",\"CNCE\",\"223886336\",\"4.82\",\"United States\"\n\"5554\",\"Gati\",\"GATI.NS\",\"223719186\",\"1.82\",\"India\"\n\"5555\",\"SOPHiA GENETICS\",\"SOPH\",\"223703200\",\"3.5\",\"Switzerland\"\n\"5556\",\"Oil-Dri Corporation Of America\",\"ODC\",\"223193216\",\"31.03\",\"United States\"\n\"5557\",\"NextNav\",\"NN\",\"222373120\",\"2.3\",\"United States\"\n\"5558\",\"Tide Water Oil\",\"TIDEWATER.NS\",\"222150087\",\"12.75\",\"India\"\n\"5559\",\"OraSure Technologies\",\"OSUR\",\"221713840\",\"3.06\",\"United States\"\n\"5560\",\"Maruzen\",\"5982.T\",\"221105870\",\"13.65\",\"Japan\"\n\"5561\",\"GTPL Hathway\",\"GTPL.NS\",\"220942790\",\"1.96\",\"India\"\n\"5562\",\"Turtle Beach Corp\",\"HEAR\",\"220583184\",\"13.32\",\"United States\"\n\"5563\",\"Molecular Partners\",\"MOLN\",\"220461280\",\"6.82\",\"Switzerland\"\n\"5564\",\"Conn's\",\"CONN\",\"220418672\",\"9.27\",\"United States\"\n\"5565\",\"Xeris Pharmaceuticals\",\"XERS\",\"220237888\",\"1.63\",\"United States\"\n\"5566\",\"Humanigen\",\"HGEN\",\"220023968\",\"3.12\",\"United States\"\n\"5567\",\"Consolidated Water\",\"CWCO\",\"219652640\",\"14.37\",\"Cayman Islands\"\n\"5568\",\"The Joint Corp.\",\"JYNT\",\"218582544\",\"15.12\",\"United States\"\n\"5569\",\"Innate Pharma\",\"IPH.PA\",\"217327815\",\"2.72\",\"France\"\n\"5570\",\"KORE\",\"KORE\",\"215759200\",\"2.83\",\"United States\"\n\"5571\",\"Zevia\",\"ZVIA\",\"215530192\",\"3.34\",\"United States\"\n\"5572\",\"Pear Therapeutics\",\"PEAR\",\"215439120\",\"1.56\",\"United States\"\n\"5573\",\"Kamada\",\"KMDA\",\"215158880\",\"4.63\",\"Israel\"\n\"5574\",\"Eneti\",\"NETI\",\"215100352\",\"5.28\",\"Monaco\"\n\"5575\",\"Genius Brands\",\"GNUS\",\"214967712\",\"0.68\",\"United States\"\n\"5576\",\"Dave Inc.\",\"DAVE\",\"214640544\",\"0.57\",\"United States\"\n\"5577\",\"Indorama Synthetics\",\"INDORAMA.NS\",\"214616549\",\"0.82\",\"India\"\n\"5578\",\"Vaxxinity\",\"VAXX\",\"212717360\",\"1.69\",\"United States\"\n\"5579\",\"Codorus Valley Bancorp\",\"CVLY\",\"212667632\",\"22.32\",\"United States\"\n\"5580\",\"Savara Pharmaceuticals\",\"SVRA\",\"212116256\",\"1.86\",\"United States\"\n\"5581\",\"Nerdy\",\"NRDY\",\"211696576\",\"2.32\",\"United States\"\n\"5582\",\"CECO Environmental\",\"CECE\",\"211243696\",\"6.01\",\"United States\"\n\"5583\",\"Citizens Inc\",\"CIA\",\"210873408\",\"4.18\",\"United States\"\n\"5584\",\"SeaSpine\",\"SPNE\",\"210865152\",\"5.73\",\"United States\"\n\"5585\",\"Addiko Bank\",\"ZYE1.F\",\"210714787\",\"10.56\",\"Austria\"\n\"5586\",\"Shankara Building\",\"SHANKARA.NS\",\"209258413\",\"9.16\",\"India\"\n\"5587\",\"Verastem Oncology\",\"VSTM\",\"208724304\",\"1.12\",\"United States\"\n\"5588\",\"Sonder Holdings\",\"SOND\",\"208660096\",\"0.96\",\"United States\"\n\"5589\",\"Century Casinos\",\"CNTY\",\"208101728\",\"6.98\",\"United States\"\n\"5590\",\"Timberland Bancorp\",\"TSBK\",\"207811872\",\"25.02\",\"United States\"\n\"5591\",\"Rigel Pharmaceuticals\",\"RIGL\",\"207322672\",\"1.21\",\"United States\"\n\"5592\",\"Wheels India\",\"WHEELS.NS\",\"206675501\",\"8.52\",\"India\"\n\"5593\",\"South Indian Bank\",\"SOUTHBANK.NS\",\"206620816\",\"0.1\",\"India\"\n\"5594\",\"Wendt India\",\"WENDT.NS\",\"206578598\",\"103.22\",\"India\"\n\"5595\",\"Western Copper and Gold\",\"WRN\",\"206064480\",\"1.36\",\"Canada\"\n\"5596\",\"Owlet\",\"OWLT\",\"205395168\",\"1.81\",\"United States\"\n\"5597\",\"Co-Diagnostics\",\"CODX\",\"205285712\",\"6.04\",\"United States\"\n\"5598\",\"Redwire\",\"RDW\",\"204060256\",\"3.23\",\"United States\"\n\"5599\",\"MSTC Limited\",\"MSTCLTD.NS\",\"203963204\",\"2.89\",\"India\"\n\"5600\",\"VBI Vaccines\",\"VBIV\",\"203738944\",\"0.79\",\"United States\"\n\"5601\",\"Sundaram Finance\",\"SUNDARMHLD.NS\",\"203505001\",\"0.92\",\"India\"\n\"5602\",\"EMX Royalty\",\"EMX\",\"202369488\",\"1.85\",\"Canada\"\n\"5603\",\"Air Busan\",\"298690.KS\",\"202316715\",\"1.04\",\"South Korea\"\n\"5604\",\"Nature's Sunshine Products\",\"NATR\",\"202148432\",\"10.38\",\"United States\"\n\"5605\",\"Hycroft Mining\",\"HYMC\",\"202012112\",\"1.03\",\"United States\"\n\"5606\",\"Community Financial Corporation\",\"TCFC\",\"201599696\",\"35.65\",\"United States\"\n\"5607\",\"Inseego\",\"INSG\",\"201258752\",\"1.87\",\"United States\"\n\"5608\",\"Federal-Mogul Goetze\",\"FMGOETZE.NS\",\"201236741\",\"3.61\",\"India\"\n\"5609\",\"Neuland Laboratories\",\"NEULANDLAB.NS\",\"200860256\",\"15.66\",\"India\"\n\"5610\",\"Bassett Furniture\",\"BSET\",\"200853744\",\"21.72\",\"United States\"\n\"5611\",\"Velodyne Lidar\",\"VLDR\",\"200117008\",\"0.96\",\"United States\"\n\"5612\",\"Omaxe\",\"OMAXE.NS\",\"199108246\",\"1.08\",\"India\"\n\"5613\",\"Mahanagar Telephone Nigam\",\"MTNL.NS\",\"199002379\",\"0.32\",\"India\"\n\"5614\",\"Shriram Pistons &amp; Rings\",\"SHRIPISTON.NS\",\"198638155\",\"8.88\",\"India\"\n\"5615\",\"Semler Scientific\",\"SMLR\",\"198484144\",\"29.22\",\"United States\"\n\"5616\",\"Vadilal Industries\",\"VADILALIND.NS\",\"196546752\",\"27.33\",\"India\"\n\"5617\",\"Commercial Vehicle Group (CVG)\",\"CVGI\",\"196358160\",\"5.96\",\"United States\"\n\"5618\",\"Aehr Test Systems\",\"AEHR\",\"195997984\",\"7.28\",\"United States\"\n\"5619\",\"Hallador Energy Company\",\"HNRG\",\"195865200\",\"6\",\"United States\"\n\"5620\",\"Hooker Furniture\",\"HOFT\",\"195034128\",\"16.25\",\"United States\"\n\"5621\",\"Allakos\",\"ALLK\",\"195029488\",\"3.54\",\"United States\"\n\"5622\",\"Vroom\",\"VRM\",\"194663472\",\"1.41\",\"United States\"\n\"5623\",\"Iris Energy\",\"IREN\",\"194477328\",\"3.54\",\"Australia\"\n\"5624\",\"Accuray\",\"ARAY\",\"194420608\",\"2.1\",\"United States\"\n\"5625\",\"Kitex Garments\",\"KITEX.NS\",\"193834262\",\"2.91\",\"India\"\n\"5626\",\"Akoustis Technologies\",\"AKTS\",\"193631296\",\"3.46\",\"United States\"\n\"5627\",\"Indian Metals &amp; Ferro Alloys\",\"IMFA.NS\",\"193300625\",\"3.58\",\"India\"\n\"5628\",\"Sandhar\",\"SANDHAR.NS\",\"193018017\",\"3.19\",\"India\"\n\"5629\",\"Avaya Holdings\",\"AVYA\",\"192703152\",\"2.25\",\"United States\"\n\"5630\",\"Cel-Sci\",\"CVM\",\"192342096\",\"4.44\",\"United States\"\n\"5631\",\"VA Tech Wabag\",\"WABAG.NS\",\"192262870\",\"3.09\",\"India\"\n\"5632\",\"Venator Materials\",\"VNTR\",\"192067344\",\"1.78\",\"United Kingdom\"\n\"5633\",\"RGC Resources\",\"RGCO\",\"192009760\",\"19.61\",\"United States\"\n\"5634\",\"Gatos Silver\",\"GATO\",\"191848240\",\"2.78\",\"United States\"\n\"5635\",\"GEOX\",\"GEO.MI\",\"190670464\",\"0.75\",\"Italy\"\n\"5636\",\"Full House Resorts\",\"FLL\",\"190618640\",\"5.55\",\"United States\"\n\"5637\",\"GTL Infrastructure\",\"GTLINFRA.NS\",\"190521202\",\"0.02\",\"India\"\n\"5638\",\"Territorial Bancorp\",\"TBNK\",\"190511280\",\"20.62\",\"United States\"\n\"5639\",\"Excel Industries\",\"EXCELINDUS.NS\",\"190382455\",\"15.14\",\"India\"\n\"5640\",\"NACL Industries\",\"NACLIND.NS\",\"189636761\",\"0.96\",\"India\"\n\"5641\",\"Dhampur Sugar Mills\",\"DHAMPURSUG.NS\",\"189541790\",\"2.85\",\"India\"\n\"5642\",\"Marinus Pharmaceuticals\",\"MRNS\",\"189357776\",\"5.1\",\"United States\"\n\"5643\",\"Blueknight Energy Partners\",\"BKEP\",\"189180176\",\"4.52\",\"United States\"\n\"5644\",\"Ashiana Housing\",\"ASHIANA.NS\",\"188463195\",\"1.84\",\"India\"\n\"5645\",\"Delta Apparel\",\"DLA\",\"188318544\",\"27.1\",\"United States\"\n\"5646\",\"VistaGen Therapeutics\",\"VTGN\",\"188063968\",\"0.91\",\"United States\"\n\"5647\",\"INEOS Styrolution\",\"INEOSSTYRO.NS\",\"187630451\",\"10.66\",\"India\"\n\"5648\",\"Kossan Rubber Industries\",\"7153.KL\",\"187311781\",\"0.29\",\"Malaysia\"\n\"5649\",\"Nelco\",\"NELCO.NS\",\"187089229\",\"8.17\",\"India\"\n\"5650\",\"Latch\",\"LTCH\",\"186817792\",\"1.29\",\"United States\"\n\"5651\",\"Luna Innovations\",\"LUNA\",\"186442032\",\"5.75\",\"United States\"\n\"5652\",\"AFC Energy\",\"AFC.L\",\"186323289\",\"25.37\",\"United Kingdom\"\n\"5653\",\"Marrone Bio Innovations\",\"MBII\",\"186025552\",\"1.02\",\"United States\"\n\"5654\",\"The Arena Group\",\"AREN\",\"185919696\",\"10.44\",\"United States\"\n\"5655\",\"Honda Siel Power Products\",\"HONDAPOWER.NS\",\"185854229\",\"18.24\",\"India\"\n\"5656\",\"PlayAGS\",\"AGS\",\"185536000\",\"5\",\"United States\"\n\"5657\",\"Lundin Energy\",\"LUNE.ST\",\"185521361\",\"0.65\",\"Sweden\"\n\"5658\",\"Westport Fuel Systems\",\"WPRT\",\"185444640\",\"1.08\",\"Canada\"\n\"5659\",\"Compugen\",\"CGEN\",\"185366720\",\"2.04\",\"Israel\"\n\"5660\",\"Milestone Pharmaceuticals\",\"MIST\",\"183729680\",\"6.14\",\"Canada\"\n\"5661\",\"NGL Energy Partners\",\"NGL\",\"183627872\",\"1.41\",\"United States\"\n\"5662\",\"Immersion Corporation\",\"IMMR\",\"183196832\",\"5.45\",\"United States\"\n\"5663\",\"Oxford Square Capital\",\"OXSQ\",\"182975488\",\"3.68\",\"United States\"\n\"5664\",\"Allot\",\"ALLT\",\"182936992\",\"5\",\"Israel\"\n\"5665\",\"Graphite Bio\",\"GRPH\",\"182605824\",\"3.15\",\"United States\"\n\"5666\",\"Evans Bancorp\",\"EVBN\",\"182276816\",\"33\",\"United States\"\n\"5667\",\"GoHealth\",\"GOCO\",\"182014016\",\"0.56\",\"United States\"\n\"5668\",\"Altisource Portfolio\",\"ASPS\",\"181604672\",\"11.31\",\"Luxembourg\"\n\"5669\",\"Mister Spex\",\"MRX.F\",\"180741647\",\"5.31\",\"Germany\"\n\"5670\",\"Overseas Shipholding Group\",\"OSG\",\"179951024\",\"2.05\",\"United States\"\n\"5671\",\"Lantronix\",\"LTRX\",\"177817792\",\"5.11\",\"United States\"\n\"5672\",\"Fiesta Restaurant Group\",\"FRGI\",\"177542400\",\"6.85\",\"United States\"\n\"5673\",\"Comscore\",\"SCOR\",\"176857184\",\"1.95\",\"United States\"\n\"5674\",\"Jagran Prakashan\",\"JAGRAN.NS\",\"176249058\",\"0.67\",\"India\"\n\"5675\",\"AG Mortgage Investment Trust\",\"MITT\",\"176080640\",\"7.36\",\"United States\"\n\"5676\",\"Bakkt Holdings\",\"BKKT\",\"176050448\",\"2.34\",\"United States\"\n\"5677\",\"Matinas BioPharma\",\"MTNB\",\"175660640\",\"0.81\",\"United States\"\n\"5678\",\"Immutep\",\"IMMP\",\"175445280\",\"1.96\",\"Australia\"\n\"5679\",\"Mangalore Chemicals and Fertilizers\",\"MANGCHEFER.NS\",\"175444159\",\"1.48\",\"India\"\n\"5680\",\"Confidence Petroleum\",\"CONFIPET.NS\",\"175391007\",\"0.62\",\"India\"\n\"5681\",\"Texmaco Rail &amp; Engineering\",\"TEXRAIL.NS\",\"175290175\",\"0.54\",\"India\"\n\"5682\",\"Voxx International\",\"VOXX\",\"175246912\",\"7.34\",\"United States\"\n\"5683\",\"CleanSpark\",\"CLSK\",\"175070016\",\"4.24\",\"United States\"\n\"5684\",\"Méliuz\",\"CASH3.SA\",\"174607866\",\"0.22\",\"Brazil\"\n\"5685\",\"ESSA Bancorp\",\"ESSA\",\"174543616\",\"16.64\",\"United States\"\n\"5686\",\"Central Valley Community Bancorp\",\"CVCY\",\"174294576\",\"14.95\",\"United States\"\n\"5687\",\"MISTRAS Group\",\"MG\",\"174062960\",\"5.84\",\"United States\"\n\"5688\",\"Yellow Corporation\",\"YELL\",\"173614640\",\"3.37\",\"United States\"\n\"5689\",\"KCP Limited\",\"KCP.NS\",\"173578722\",\"1.34\",\"India\"\n\"5690\",\"KULR Technology\",\"KULR\",\"172842144\",\"1.62\",\"United States\"\n\"5691\",\"Rayonier Advanced Materials\",\"RYAM\",\"172392576\",\"2.7\",\"United States\"\n\"5692\",\"CSI Compressco\",\"CCLP\",\"172281088\",\"1.22\",\"United States\"\n\"5693\",\"Sangoma Technologies\",\"SANG\",\"171728800\",\"8.01\",\"Canada\"\n\"5694\",\"USD Partners\",\"USDP\",\"171570112\",\"5.14\",\"United States\"\n\"5695\",\"Lumax Industries\",\"LUMAXIND.NS\",\"171510669\",\"18.31\",\"India\"\n\"5696\",\"Precision BioSciences\",\"DTIL\",\"171504464\",\"1.55\",\"United States\"\n\"5697\",\"Cigniti Technologies\",\"CIGNITITEC.NS\",\"171448990\",\"6.3\",\"India\"\n\"5698\",\"Allied Tecnologia\",\"ALLD3.SA\",\"171438603\",\"1.84\",\"Brazil\"\n\"5699\",\"Tamil Nadu Newsprint and Papers Limited\",\"TNPL.NS\",\"170303127\",\"2.46\",\"India\"\n\"5700\",\"Jounce Therapeutics\",\"JNCE\",\"170008448\",\"3.29\",\"United States\"\n\"5701\",\"LCNB\",\"LCNB\",\"169999344\",\"14.91\",\"United States\"\n\"5702\",\"J.Jill\",\"JILL\",\"169565264\",\"16.78\",\"United States\"\n\"5703\",\"Escalade Sports\",\"ESCA\",\"168591088\",\"12.41\",\"United States\"\n\"5704\",\"Sachem Capital\",\"SACH\",\"168011312\",\"4.59\",\"United States\"\n\"5705\",\"Hinduja Ventures\",\"NXTDIGITAL.NS\",\"167717266\",\"4.97\",\"India\"\n\"5706\",\"Aemetis\",\"AMTX\",\"167712512\",\"4.85\",\"United States\"\n\"5707\",\"Power Mech Projects\",\"POWERMECH.NS\",\"167510465\",\"11.39\",\"India\"\n\"5708\",\"ORIC Pharmaceuticals\",\"ORIC\",\"167387552\",\"4.24\",\"United States\"\n\"5709\",\"MPS Limited\",\"MPSLTD.NS\",\"167200436\",\"9.77\",\"India\"\n\"5710\",\"Western New England Bancorp\",\"WNEB\",\"167195536\",\"7.41\",\"United States\"\n\"5711\",\"LSI Industries\",\"LYTS\",\"167126848\",\"6.27\",\"United States\"\n\"5712\",\"Huhtamaki India\",\"HUHTAMAKI.NS\",\"166704471\",\"2.21\",\"India\"\n\"5713\",\"Spire Global\",\"SPIR\",\"166335200\",\"1.19\",\"United States\"\n\"5714\",\"C&amp;F Financial Corporation\",\"CFFI\",\"166188240\",\"47\",\"United States\"\n\"5715\",\"Accelya\",\"ACCELYA.NS\",\"165880653\",\"11.11\",\"India\"\n\"5716\",\"XL Fleet\",\"XL\",\"165559312\",\"1.17\",\"United States\"\n\"5717\",\"Force Motors\",\"FORCEMOT.NS\",\"165499222\",\"12.56\",\"India\"\n\"5718\",\"Nam Tai Property\",\"NTP\",\"165472480\",\"4.22\",\"China\"\n\"5719\",\"Silvercrest Asset Management Group\",\"SAMG\",\"165158384\",\"16.73\",\"United States\"\n\"5720\",\"Mainz Biomed\",\"MYNZ\",\"164820000\",\"12\",\"Germany\"\n\"5721\",\"XBiotech\",\"XBIT\",\"164372224\",\"5.4\",\"United States\"\n\"5722\",\"LATAM Airlines\",\"LTMAQ\",\"163851456\",\"0.27\",\"Chile\"\n\"5723\",\"Progenity\",\"PROG\",\"162924032\",\"0.88\",\"United States\"\n\"5724\",\"Hydrofarm\",\"HYFM\",\"162503024\",\"3.34\",\"United States\"\n\"5725\",\"Maiden Holdings\",\"MHLD\",\"162364656\",\"1.87\",\"Bermuda\"\n\"5726\",\"First Northwest Bancorp\",\"FNWB\",\"162158352\",\"16.21\",\"United States\"\n\"5727\",\"Adverum Biotechnologies\",\"ADVM\",\"162138592\",\"1.56\",\"United States\"\n\"5728\",\"Aterian\",\"ATER\",\"161353344\",\"2.34\",\"United States\"\n\"5729\",\"Electra Meccanica\",\"SOLO\",\"161310960\",\"1.36\",\"Canada\"\n\"5730\",\"Sesen Bio\",\"SESN\",\"161047232\",\"0.81\",\"United States\"\n\"5731\",\"Mynaric\",\"MYNA\",\"160643984\",\"7.66\",\"Germany\"\n\"5732\",\"Hurco Companies\",\"HURC\",\"160628576\",\"24.46\",\"United States\"\n\"5733\",\"Nuvectis Pharma\",\"NVCT\",\"158336608\",\"12.45\",\"United States\"\n\"5734\",\"Backblaze\",\"BLZE\",\"157696000\",\"5.12\",\"United States\"\n\"5735\",\"Ten Square Games\",\"1HQ.F\",\"155506984\",\"21.3\",\"Poland\"\n\"5736\",\"Camber Energy\",\"CEI\",\"155441600\",\"0.38\",\"United States\"\n\"5737\",\"CARE's Ratings\",\"CARERATING.NS\",\"154736764\",\"5.22\",\"India\"\n\"5738\",\"Geojit Financial Services\",\"GEOJITFSL.NS\",\"154700368\",\"0.65\",\"India\"\n\"5739\",\"AN2 Therapeutics\",\"ANTX\",\"154251456\",\"7.95\",\"United States\"\n\"5740\",\"Sasken Technologies\",\"SASKEN.NS\",\"154100017\",\"10.24\",\"India\"\n\"5741\",\"KVH Industries\",\"KVHI\",\"153987728\",\"8.15\",\"United States\"\n\"5742\",\"Peoples Bancorp of North Carolina\",\"PEBK\",\"153561216\",\"27.15\",\"United States\"\n\"5743\",\"Praxis Precision Medicines\",\"PRAX\",\"152464528\",\"3.35\",\"United States\"\n\"5744\",\"Potbelly Corporation\",\"PBPB\",\"151506592\",\"5.25\",\"United States\"\n\"5745\",\"Cormedix\",\"CRMD\",\"151407168\",\"3.87\",\"United States\"\n\"5746\",\"Momentus\",\"MNTS\",\"150442640\",\"1.84\",\"United States\"\n\"5747\",\"Party City\",\"PRTY\",\"149626944\",\"1.33\",\"United States\"\n\"5748\",\"Greenhill\",\"GHL\",\"149299728\",\"8.24\",\"United States\"\n\"5749\",\"Ovid Therapeutics\",\"OVID\",\"149284656\",\"2.12\",\"United States\"\n\"5750\",\"Quad\",\"QUAD\",\"147843872\",\"2.66\",\"United States\"\n\"5751\",\"Sonida Senior Living\",\"SNDA\",\"147414608\",\"21.82\",\"United States\"\n\"5752\",\"Martin Midstream Partners\",\"MMLP\",\"147166832\",\"3.79\",\"United States\"\n\"5753\",\"Shalby\",\"SHALBY.NS\",\"147063076\",\"1.36\",\"India\"\n\"5754\",\"Barnes &amp; Noble Education\",\"BNED\",\"147029952\",\"2.83\",\"United States\"\n\"5755\",\"Middlefield Banc\",\"MBCN\",\"146704672\",\"25.11\",\"United States\"\n\"5756\",\"ServiceSource\",\"SREV\",\"146351856\",\"1.46\",\"United States\"\n\"5757\",\"Retractable Technologies\",\"RVP\",\"146235840\",\"4.44\",\"United States\"\n\"5758\",\"Pexip\",\"PEXIP.OL\",\"145842939\",\"1.44\",\"Norway\"\n\"5759\",\"Longeveron\",\"LGVN\",\"145725008\",\"6.96\",\"United States\"\n\"5760\",\"TeraWulf\",\"WULF\",\"145570528\",\"1.39\",\"United States\"\n\"5761\",\"Hanover Bancorp\",\"HNVR\",\"143654704\",\"19.69\",\"United States\"\n\"5762\",\"Daktronics\",\"DAKT\",\"143207488\",\"3.18\",\"United States\"\n\"5763\",\"Riverview Bancorp\",\"RVSB\",\"142952688\",\"6.46\",\"United States\"\n\"5764\",\"CalAmp\",\"CAMP\",\"142460560\",\"3.94\",\"United States\"\n\"5765\",\"SEACOR Marine\",\"SMHI\",\"142305136\",\"5.34\",\"United States\"\n\"5766\",\"Pieris Pharmaceuticals\",\"PIRS\",\"142274480\",\"1.92\",\"United States\"\n\"5767\",\"L.B. Foster\",\"FSTR\",\"142218176\",\"13.06\",\"United States\"\n\"5768\",\"Northern Dynasty Minerals\",\"NAK\",\"141927792\",\"0.27\",\"Canada\"\n\"5769\",\"Benessere Capital Acquisition\",\"BENE\",\"141760656\",\"10.33\",\"United States\"\n\"5770\",\"Spectrum Pharmaceuticals\",\"SPPI\",\"141026144\",\"0.78\",\"United States\"\n\"5771\",\"Kingfa Science & Technology\",\"KINGFA.NS\",\"140223431\",\"11.41\",\"India\"\n\"5772\",\"gumi\",\"3903.T\",\"140064678\",\"4.8\",\"Japan\"\n\"5773\",\"U.S. Xpress Enterprises\",\"USX\",\"139601824\",\"2.73\",\"United States\"\n\"5774\",\"Blue Apron Holdings\",\"APRN\",\"139537728\",\"4.06\",\"United States\"\n\"5775\",\"Gencor Industries\",\"GENC\",\"139248144\",\"9.5\",\"United States\"\n\"5776\",\"Smith Micro Software\",\"SMSI\",\"138737712\",\"2.52\",\"United States\"\n\"5777\",\"Yatra\",\"YTRA\",\"138495616\",\"2.21\",\"India\"\n\"5778\",\"Ohio Valley Banc Corp\",\"OVBC\",\"138381328\",\"29\",\"United States\"\n\"5779\",\"Himatsingka Seide\",\"HIMATSEIDE.NS\",\"138197699\",\"1.4\",\"India\"\n\"5780\",\"Velan\",\"VLN.TO\",\"137610397\",\"6.38\",\"Canada\"\n\"5781\",\"Nucleus Software Exports\",\"NUCLEUS.NS\",\"137237233\",\"5.13\",\"India\"\n\"5782\",\"Assertio Therapeutics\",\"ASRT\",\"137209168\",\"3.02\",\"United States\"\n\"5783\",\"High Tide\",\"HITI\",\"136898640\",\"2.2\",\"Canada\"\n\"5784\",\"IO Biotech\",\"IOBT\",\"136872672\",\"4.75\",\"Denmark\"\n\"5785\",\"KAP AG\",\"IUR.F\",\"136684066\",\"17.6\",\"Germany\"\n\"5786\",\"INNOVATE Corp.\",\"VATE\",\"136598032\",\"1.74\",\"United States\"\n\"5787\",\"Tactile Medical\",\"TCMD\",\"135498160\",\"6.8\",\"United States\"\n\"5788\",\"Bodal Chemicals\",\"BODALCHEM.NS\",\"135180076\",\"1.1\",\"India\"\n\"5789\",\"Avita Medical\",\"RCEL\",\"134510688\",\"5.39\",\"United States\"\n\"5790\",\"Atossa Therapeutics\",\"ATOS\",\"132955192\",\"1.05\",\"United States\"\n\"5791\",\"Sterling Tools\",\"STERTOOLS.NS\",\"132573839\",\"3.68\",\"India\"\n\"5792\",\"Summit Midstream\",\"SMLP\",\"132158000\",\"13\",\"United States\"\n\"5793\",\"Vera Bradley\",\"VRA\",\"131967576\",\"4.2\",\"United States\"\n\"5794\",\"Exterran\",\"EXTN\",\"131927400\",\"3.96\",\"United States\"\n\"5795\",\"Southern Petrochemical Industries Corp\",\"SPIC.NS\",\"131659326\",\"0.65\",\"India\"\n\"5796\",\"Paratek Pharmaceuticals\",\"PRTK\",\"131020792\",\"2.41\",\"United States\"\n\"5797\",\"BBX Capital Corporation\",\"BBXIA\",\"130719424\",\"8.1\",\"United States\"\n\"5798\",\"Citius Pharmaceuticals\",\"CTXR\",\"130201824\",\"0.89\",\"United States\"\n\"5799\",\"KLab\",\"3656.T\",\"130163120\",\"3.43\",\"Japan\"\n\"5800\",\"Metromile\",\"MILE\",\"130106992\",\"1\",\"United States\"\n\"5801\",\"Advent Technologies\",\"ADN\",\"129546624\",\"2.51\",\"United States\"\n\"5802\",\"Jakks Pacific\",\"JAKK\",\"129435432\",\"13.5\",\"United States\"\n\"5803\",\"Quantum\",\"QMCO\",\"128660232\",\"1.42\",\"United States\"\n\"5804\",\"Platinum Group Metals\",\"PLG\",\"128635000\",\"1.3\",\"Canada\"\n\"5805\",\"Bird Global\",\"BRDS\",\"128263456\",\"0.46\",\"United States\"\n\"5806\",\"Phunware\",\"PHUN\",\"128153808\",\"1.31\",\"United States\"\n\"5807\",\"Foseco India\",\"FOSECOIND.NS\",\"127696265\",\"19.99\",\"India\"\n\"5808\",\"Drive Shack\",\"DS\",\"127491296\",\"1.38\",\"United States\"\n\"5809\",\"Spok Holdings\",\"SPOK\",\"127024360\",\"6.45\",\"United States\"\n\"5810\",\"Sylogist\",\"SYZ.TO\",\"126565390\",\"5.29\",\"Canada\"\n\"5811\",\"Old Point Financial\",\"OPOF\",\"126510024\",\"24.82\",\"United States\"\n\"5812\",\"BG Staffing\",\"BGSF\",\"126300032\",\"12.07\",\"United States\"\n\"5813\",\"Supermax Corporation Berhad\",\"7106.KL\",\"126294203\",\"0.19\",\"Malaysia\"\n\"5814\",\"Sierra Metals\",\"SMTS\",\"125933632\",\"0.75\",\"Canada\"\n\"5815\",\"Drecom\",\"3793.T\",\"125725050\",\"4.42\",\"Japan\"\n\"5816\",\"Bit Digital\",\"BTBT\",\"125700112\",\"1.53\",\"United States\"\n\"5817\",\"GAN\",\"GAN\",\"125580808\",\"2.97\",\"United Kingdom\"\n\"5818\",\"PTC Financial Services\",\"PFS.NS\",\"125138042\",\"0.19\",\"India\"\n\"5819\",\"Matrix Service\",\"MTRX\",\"125111640\",\"4.67\",\"United States\"\n\"5820\",\"Genius Group\",\"GNS\",\"124841792\",\"5.81\",\"Singapore\"\n\"5821\",\"Srikalahasthi Pipes\",\"SRIPIPES.NS\",\"124125405\",\"2.65\",\"India\"\n\"5822\",\"Lument Finance Trust\",\"LFT\",\"123773720\",\"2.37\",\"United States\"\n\"5823\",\"Seanergy Maritime\",\"SHIP\",\"123715632\",\"0.69\",\"Greece\"\n\"5824\",\"MediciNova\",\"MNOV\",\"123596424\",\"2.52\",\"United States\"\n\"5825\",\"Coffee Day Enterprises\",\"COFFEEDAY.NS\",\"123284364\",\"0.58\",\"India\"\n\"5826\",\"BankFinancial\",\"BFIN\",\"123218984\",\"9.35\",\"United States\"\n\"5827\",\"Red Robin\",\"RRGB\",\"122660328\",\"7.77\",\"United States\"\n\"5828\",\"Express\",\"EXPR\",\"122525824\",\"1.8\",\"United States\"\n\"5829\",\"Quick Heal\",\"QUICKHEAL.NS\",\"122216987\",\"2.1\",\"India\"\n\"5830\",\"Immunic\",\"IMUX\",\"122161600\",\"4\",\"United States\"\n\"5831\",\"India Motor Parts and Accessories\",\"IMPAL.NS\",\"121326351\",\"9.72\",\"India\"\n\"5832\",\"RPG Life Sciences\",\"RPGLIFE.NS\",\"121304997\",\"7.33\",\"India\"\n\"5833\",\"Athira Pharma\",\"ATHA\",\"121187920\",\"3.22\",\"United States\"\n\"5834\",\"Oconee Federal Financial\",\"OFED\",\"121163904\",\"21.6\",\"United States\"\n\"5835\",\"Union Bankshares\",\"UNB\",\"121158312\",\"26.95\",\"United States\"\n\"5836\",\"Intevac\",\"IVAC\",\"121035936\",\"4.83\",\"United States\"\n\"5837\",\"Vigil Neuroscience\",\"VIGL\",\"120981912\",\"4.28\",\"United States\"\n\"5838\",\"Malvern Bancorp\",\"MLVF\",\"120705488\",\"15.83\",\"United States\"\n\"5839\",\"Iteris\",\"ITI\",\"120500064\",\"2.84\",\"United States\"\n\"5840\",\"Modiv\",\"MDV\",\"120485936\",\"16.13\",\"United States\"\n\"5841\",\"PDS Biotechnology\",\"PDSB\",\"119681560\",\"4.21\",\"United States\"\n\"5842\",\"Grupo Supervielle\",\"SUPV\",\"119670424\",\"1.31\",\"Argentina\"\n\"5843\",\"Actinium Pharmaceuticals\",\"ATNM\",\"119636040\",\"5.03\",\"United States\"\n\"5844\",\"Audacy\",\"AUD\",\"119580032\",\"0.83\",\"United States\"\n\"5845\",\"EMCORE Corporation\",\"EMKR\",\"119504384\",\"3.19\",\"United States\"\n\"5846\",\"Talaris Therapeutics\",\"TALS\",\"119410856\",\"2.88\",\"United States\"\n\"5847\",\"Prakash Industries\",\"PRAKASH.NS\",\"119375988\",\"0.67\",\"India\"\n\"5848\",\"Navkar Corp\",\"NAVKARCORP.NS\",\"119361860\",\"0.79\",\"India\"\n\"5849\",\"Sanghi Industries\",\"SANGHIIND.NS\",\"119331967\",\"0.47\",\"India\"\n\"5850\",\"Aptech\",\"APTECHT.NS\",\"119004938\",\"2.88\",\"India\"\n\"5851\",\"FinWise Bancorp\",\"FINW\",\"118680064\",\"9.28\",\"United States\"\n\"5852\",\"Oyster Point Pharma\",\"OYST\",\"118411696\",\"4.44\",\"United States\"\n\"5853\",\"Lakeland Industries\",\"LAKE\",\"117744328\",\"15.35\",\"United States\"\n\"5854\",\"Prudential Bancorp\",\"PBIP\",\"117655272\",\"15.13\",\"United States\"\n\"5855\",\"Endo International\",\"ENDP\",\"117604016\",\"0.5\",\"Ireland\"\n\"5856\",\"Arcimoto\",\"FUV\",\"116339400\",\"3\",\"United States\"\n\"5857\",\"India Nippon Electricals\",\"INDNIPPON.NS\",\"115713181\",\"5.12\",\"India\"\n\"5858\",\"Americas Gold and Silver Corp\",\"USAS\",\"115453568\",\"0.62\",\"Canada\"\n\"5859\",\"Rane Holdings\",\"RANEHOLDIN.NS\",\"115189602\",\"8.07\",\"India\"\n\"5860\",\"MDxHealth\",\"MDXH\",\"115105120\",\"7.38\",\"Belgium\"\n\"5861\",\"Apex Frozen Foods\",\"APEX.NS\",\"115023795\",\"3.68\",\"India\"\n\"5862\",\"Knights Group\",\"KGH.L\",\"114493704\",\"132.3\",\"United Kingdom\"\n\"5863\",\"Zion Oil &amp; Gas\",\"ZNOG\",\"113972592\",\"0.24\",\"United States\"\n\"5864\",\"Pzena Investment Management\",\"PZN\",\"113670752\",\"6.71\",\"United States\"\n\"5865\",\"AquaBounty\",\"AQB\",\"113064416\",\"1.59\",\"United States\"\n\"5866\",\"Kopin Corporation\",\"KOPN\",\"113054592\",\"1.23\",\"United States\"\n\"5867\",\"Xunlei\",\"XNET\",\"113038376\",\"1.68\",\"China\"\n\"5868\",\"Wejo Group\",\"WEJO\",\"112671712\",\"1.19\",\"United Kingdom\"\n\"5869\",\"Igarashi Motors India\",\"IGARASHI.NS\",\"112638708\",\"3.56\",\"India\"\n\"5870\",\"NN, Inc.\",\"NNBR\",\"112578624\",\"2.57\",\"United States\"\n\"5871\",\"ContraFect\",\"CFRX\",\"112491520\",\"2.86\",\"United States\"\n\"5872\",\"Twin Disc\",\"TWIN\",\"112216152\",\"8.22\",\"United States\"\n\"5873\",\"SML Isuzu\",\"SMLISUZU.NS\",\"112212548\",\"7.74\",\"India\"\n\"5874\",\"Cellectis\",\"CLLS\",\"111907368\",\"2.46\",\"France\"\n\"5875\",\"Greenidge Generation Holdings\",\"GREE\",\"111272392\",\"2.69\",\"United States\"\n\"5876\",\"Asure Software\",\"ASUR\",\"110996504\",\"5.53\",\"United States\"\n\"5877\",\"ARC Document Solutions\",\"ARC\",\"110782976\",\"2.56\",\"United States\"\n\"5878\",\"Cadiz\",\"CDZI\",\"110679256\",\"2.18\",\"United States\"\n\"5879\",\"O2Micro\",\"OIIM\",\"108389272\",\"3.72\",\"Cayman Islands\"\n\"5880\",\"Lee Enterprises\",\"LEE\",\"108367656\",\"18.19\",\"United States\"\n\"5881\",\"Galectin Therapeutics\",\"GALT\",\"108087072\",\"1.82\",\"United States\"\n\"5882\",\"Red Cat Holdings\",\"RCAT\",\"107879912\",\"2.01\",\"United States\"\n\"5883\",\"OncoCyte\",\"OCX\",\"107846832\",\"0.91\",\"United States\"\n\"5884\",\"Provident Financial Holdings\",\"PROV\",\"107674960\",\"14.78\",\"United States\"\n\"5885\",\"Carrols Restaurant Group\",\"TAST\",\"107576512\",\"2.02\",\"United States\"\n\"5886\",\"Enzo Biochem\",\"ENZ\",\"107185104\",\"2.2\",\"United States\"\n\"5887\",\"Nok Air\",\"NOK.BK\",\"107172467\",\"0.03\",\"Thailand\"\n\"5888\",\"Surface Oncology\",\"SURF\",\"106925792\",\"1.96\",\"United States\"\n\"5889\",\"Reading International\",\"RDI\",\"106846248\",\"3.61\",\"United States\"\n\"5890\",\"GE Power India\",\"GEPIL.NS\",\"106747095\",\"1.59\",\"India\"\n\"5891\",\"StarTek\",\"SRT\",\"106582920\",\"2.65\",\"United States\"\n\"5892\",\"Superior Industries International\",\"SUP\",\"106070536\",\"3.95\",\"United States\"\n\"5893\",\"Leap Therapeutics\",\"LPTX\",\"105982200\",\"1.2\",\"United States\"\n\"5894\",\"CBAK Energy\",\"CBAT\",\"105879304\",\"1.19\",\"China\"\n\"5895\",\"Westwood Holdings Group\",\"WHG\",\"105852768\",\"12.34\",\"United States\"\n\"5896\",\"Hill International\",\"HIL\",\"105733976\",\"1.85\",\"United States\"\n\"5897\",\"Capricor Therapeutics\",\"CAPR\",\"105567032\",\"4.34\",\"United States\"\n\"5898\",\"Nusantara Pelabuhan Handal\",\"PORT.JK\",\"105158921\",\"0.04\",\"Indonesia\"\n\"5899\",\"Onion Global\",\"OG\",\"105118000\",\"1\",\"China\"\n\"5900\",\"Repco Home Finance\",\"REPCOHOME.NS\",\"104927334\",\"1.68\",\"India\"\n\"5901\",\"Mammoth Energy Services\",\"TUSK\",\"103805024\",\"2.2\",\"United States\"\n\"5902\",\"Forum Energy Technologies\",\"FET\",\"103492168\",\"18.09\",\"United States\"\n\"5903\",\"Dare Bioscience\",\"DARE\",\"103288488\",\"1.22\",\"United States\"\n\"5904\",\"Asensus Surgical\",\"ASXC\",\"103215224\",\"0.44\",\"United States\"\n\"5905\",\"Cheetah Mobile\",\"CMCM\",\"103211536\",\"0.73\",\"China\"\n\"5906\",\"Mangalam Cement\",\"MANGLMCEM.NS\",\"103147029\",\"3.75\",\"India\"\n\"5907\",\"Clearside Biomedical\",\"CLSD\",\"102255680\",\"1.7\",\"United States\"\n\"5908\",\"BitNile\",\"NILE\",\"101762432\",\"0.31\",\"United States\"\n\"5909\",\"Radio City\",\"RADIOCITY.NS\",\"101744335\",\"0.29\",\"India\"\n\"5910\",\"Ellington Residential Mortgage REIT\",\"EARN\",\"101734136\",\"7.76\",\"United States\"\n\"5911\",\"Pkp Cargo\",\"PKP.WA\",\"101706393\",\"2.27\",\"Poland\"\n\"5912\",\"Synchronoss\",\"SNCR\",\"101546488\",\"1.15\",\"United States\"\n\"5913\",\"BrainStorm Cell Therapeutics\",\"BCLI\",\"101427992\",\"2.78\",\"United States\"\n\"5914\",\"Xchanging Solution\",\"XCHANGING.NS\",\"100869444\",\"0.9\",\"India\"\n\"5915\",\"Pixelworks\",\"PXLW\",\"100706272\",\"1.87\",\"United States\"\n\"5916\",\"HEXO\",\"HEXO\",\"100593880\",\"0.2\",\"Canada\"\n\"5917\",\"Fonar Corporation\",\"FONR\",\"100163328\",\"14.99\",\"United States\"\n\"5918\",\"Enochian Biosciences\",\"ENOB\",\"100075496\",\"1.89\",\"United States\"\n\"5919\",\"Capacit'e Infraprojects\",\"CAPACITE.NS\",\"99945174\",\"1.47\",\"India\"\n\"5920\",\"Flexsteel Industries\",\"FLXS\",\"99742264\",\"17.93\",\"United States\"\n\"5921\",\"Cytosorbents\",\"CTSO\",\"98885968\",\"2.27\",\"United States\"\n\"5922\",\"Bliss GVS Pharma\",\"BLISSGVS.NS\",\"98705596\",\"0.95\",\"India\"\n\"5923\",\"Fortress Biotech\",\"FBIO\",\"98282896\",\"0.92\",\"United States\"\n\"5924\",\"Applied Blockchain\",\"APLD\",\"97923752\",\"1.04\",\"United States\"\n\"5925\",\"Xebec Adsorption\",\"XBC.TO\",\"97445935\",\"0.63\",\"Canada\"\n\"5926\",\"İşbir Holding\",\"ISBIR.IS\",\"97116679\",\"3\",\"Turkey\"\n\"5927\",\"Curis\",\"CRIS\",\"96685896\",\"1.06\",\"United States\"\n\"5928\",\"Ardelyx\",\"ARDX\",\"96490912\",\"0.67\",\"United States\"\n\"5929\",\"Fluent\",\"FLNT\",\"96416920\",\"1.21\",\"United States\"\n\"5930\",\"Trilogy Metals\",\"TMQ\",\"96262976\",\"0.66\",\"Canada\"\n\"5931\",\"Paysign\",\"PAYS\",\"95683496\",\"1.84\",\"United States\"\n\"5932\",\"Summit Therapeutics\",\"SMMT\",\"95178728\",\"0.97\",\"United Kingdom\"\n\"5933\",\"So-Young International\",\"SY\",\"95120872\",\"0.9\",\"China\"\n\"5934\",\"Great Elm Capital\",\"GECC\",\"94948480\",\"12.49\",\"United States\"\n\"5935\",\"Hour Loop\",\"HOUR\",\"94938888\",\"2.71\",\"United States\"\n\"5936\",\"Anup Engineering\",\"ANUP.NS\",\"94840894\",\"9.68\",\"India\"\n\"5937\",\"Quicklogic\",\"QUIK\",\"94454472\",\"7.62\",\"United States\"\n\"5938\",\"Seelos Therapeutics\",\"SEEL\",\"93434344\",\"0.88\",\"United States\"\n\"5939\",\"PEDEVCO\",\"PED\",\"93154784\",\"1.09\",\"United States\"\n\"5940\",\"Tanzanian Gold Corporation\",\"TRX\",\"93112688\",\"0.34\",\"Canada\"\n\"5941\",\"Accelerate Diagnostics\",\"AXDX\",\"92145872\",\"1.16\",\"United States\"\n\"5942\",\"Missfresh\",\"MF\",\"92084888\",\"0.39\",\"China\"\n\"5943\",\"3i Infotech\",\"3IINFOLTD.NS\",\"92023303\",\"0.55\",\"India\"\n\"5944\",\"Anixa Biosciences\",\"ANIX\",\"91565360\",\"3.01\",\"United States\"\n\"5945\",\"Falcon Minerals\",\"FLMN\",\"91525936\",\"7.77\",\"United States\"\n\"5946\",\"PAVmed\",\"PAVM\",\"90173448\",\"1.03\",\"United States\"\n\"5947\",\"DIRTT Environmental Solutions\",\"DRTT\",\"90160656\",\"1.05\",\"Canada\"\n\"5948\",\"AgroFresh\",\"AGFS\",\"88980528\",\"1.69\",\"United States\"\n\"5949\",\"Parag Milk Foods\",\"PARAGMILK.NS\",\"88408664\",\"0.93\",\"India\"\n\"5950\",\"aTyr Pharma\",\"LIFE\",\"88365808\",\"3.15\",\"United States\"\n\"5951\",\"Tiziana Life Sciences\",\"TLSA\",\"87965008\",\"0.86\",\"United Kingdom\"\n\"5952\",\"Advanced Emissions Solutions\",\"ADES\",\"87550352\",\"4.58\",\"United States\"\n\"5953\",\"Shift Technologies\",\"SFT\",\"87288480\",\"1.03\",\"United States\"\n\"5954\",\"Harte Hanks\",\"HHS\",\"86013600\",\"12.25\",\"United States\"\n\"5955\",\"Compleo Charging Solutions\",\"C0M.F\",\"85235515\",\"16.81\",\"Germany\"\n\"5956\",\"Farmer Brothers\",\"FARM\",\"85045744\",\"4.61\",\"United States\"\n\"5957\",\"Gaia\",\"GAIA\",\"84762816\",\"4.08\",\"United States\"\n\"5958\",\"UpHealth\",\"UPH\",\"84635456\",\"0.59\",\"United States\"\n\"5959\",\"Park City Group\",\"PCYG\",\"84427200\",\"4.54\",\"United States\"\n\"5960\",\"CytomX Therapeutics\",\"CTMX\",\"84363936\",\"1.29\",\"United States\"\n\"5961\",\"Rekor Systems\",\"REKR\",\"84338120\",\"1.69\",\"United States\"\n\"5962\",\"Liberty TripAdvisor Holdings\",\"LTRPA\",\"84153600\",\"0.72\",\"United States\"\n\"5963\",\"AirAsia\",\"2630.TW\",\"84014403\",\"0.56\",\"Malaysia\"\n\"5964\",\"Kuantum Papers\",\"KUANTUM.NS\",\"83798339\",\"0.96\",\"India\"\n\"5965\",\"Harpoon Therapeutics\",\"HARP\",\"83537352\",\"2.53\",\"United States\"\n\"5966\",\"Jay Bharat Maruti\",\"JAYBARMARU.NS\",\"83240644\",\"1.92\",\"India\"\n\"5967\",\"Spencer's Retail\",\"SPENCERS.NS\",\"81734124\",\"0.91\",\"India\"\n\"5968\",\"Ebixcash India\",\"EBIXFOREX.NS\",\"81507586\",\"7.31\",\"India\"\n\"5969\",\"Cortexyme\",\"CRTX\",\"80074016\",\"2.22\",\"United States\"\n\"5970\",\"Reliance Communications\",\"RCOM.NS\",\"79684997\",\"0.03\",\"India\"\n\"5971\",\"Smart Sand\",\"SND\",\"79218544\",\"1.78\",\"United States\"\n\"5972\",\"Aptose Biosciences\",\"APTO\",\"79156680\",\"0.85\",\"Canada\"\n\"5973\",\"Merrimack Pharmaceuticals\",\"MACK\",\"79120184\",\"5.9\",\"United States\"\n\"5974\",\"MICT\",\"MICT\",\"79022304\",\"0.61\",\"United States\"\n\"5975\",\"geechs\",\"7060.T\",\"79009331\",\"7.37\",\"Japan\"\n\"5976\",\"Xilio Therapeutics\",\"XLO\",\"78854480\",\"2.87\",\"United States\"\n\"5977\",\"GreenPower Motor Company\",\"GP\",\"78714760\",\"3.4\",\"Canada\"\n\"5978\",\"Orchard Therapeutics\",\"ORTX\",\"78690624\",\"0.63\",\"United Kingdom\"\n\"5979\",\"Wrap Technologies\",\"WRAP\",\"78658880\",\"1.92\",\"United States\"\n\"5980\",\"Rubius Therapeutics\",\"RUBY\",\"78592520\",\"0.87\",\"United States\"\n\"5981\",\"Nine Energy Service\",\"NINE\",\"77872176\",\"2.38\",\"United States\"\n\"5982\",\"Rico Auto Industries\",\"RICOAUTO.NS\",\"77589615\",\"0.57\",\"India\"\n\"5983\",\"Imperial Petroleum\",\"IMPP\",\"77071896\",\"0.41\",\"Greece\"\n\"5984\",\"PowerFleet\",\"PWFL\",\"76950512\",\"2.13\",\"United States\"\n\"5985\",\"XpresSpa\",\"XSPA\",\"76326392\",\"0.8\",\"United States\"\n\"5986\",\"Cooper Standard\",\"CPS\",\"76271160\",\"4.47\",\"United States\"\n\"5987\",\"Romeo Power\",\"RMO\",\"76145312\",\"0.5\",\"United States\"\n\"5988\",\"Mesa Air\",\"MESA\",\"75876568\",\"2.1\",\"United States\"\n\"5989\",\"Synlogic\",\"SYBX\",\"75870760\",\"1.08\",\"United States\"\n\"5990\",\"Akebia Therapeutics\",\"AKBA\",\"75817480\",\"0.41\",\"United States\"\n\"5991\",\"ACRES Commercial Realty\",\"ACR\",\"75170544\",\"8.26\",\"United States\"\n\"5992\",\"Sotherly Hotels\",\"SOHO\",\"74760736\",\"2.02\",\"United States\"\n\"5993\",\"Frequency Therapeutics\",\"FREQ\",\"74149960\",\"2.12\",\"United States\"\n\"5994\",\"Lifeway Foods\",\"LWAY\",\"73778824\",\"4.78\",\"United States\"\n\"5995\",\"Energous\",\"WATT\",\"73220216\",\"0.95\",\"United States\"\n\"5996\",\"Kokuyo Camlin\",\"KOKUYOCMLN.NS\",\"73170392\",\"0.73\",\"India\"\n\"5997\",\"Graham Corporation\",\"GHM\",\"73157944\",\"6.9\",\"United States\"\n\"5998\",\"Skipper Limited\",\"SKIPPER.NS\",\"73088512\",\"0.71\",\"India\"\n\"5999\",\"Elevate Credit\",\"ELVT\",\"73034776\",\"2.33\",\"United States\"\n\"6000\",\"Stabilis Solutions\",\"SLNG\",\"72571200\",\"3.97\",\"United States\"\n\"6001\",\"Flotek Industries\",\"FTK\",\"72481768\",\"0.95\",\"United States\"\n\"6002\",\"Solid Biosciences\",\"SLDB\",\"72278648\",\"0.64\",\"United States\"\n\"6003\",\"NCS Multistage\",\"NCSM\",\"71454264\",\"29.67\",\"United States\"\n\"6004\",\"Heritage Insurance\",\"HRTG\",\"71203496\",\"2.69\",\"United States\"\n\"6005\",\"TherapeuticsMD\",\"TXMD\",\"71011248\",\"8.06\",\"United States\"\n\"6006\",\"orion-group-holdings\",\"ORN\",\"70934152\",\"2.32\",\"United States\"\n\"6007\",\"Lipocine\",\"LPCN\",\"70816984\",\"0.8\",\"United States\"\n\"6008\",\"CI Games\",\"CI7.F\",\"70182886\",\"0.35\",\"Poland\"\n\"6009\",\"Biodesix\",\"BDSX\",\"69816600\",\"1.75\",\"United States\"\n\"6010\",\"Asian Granito India\",\"ASIANTILES.NS\",\"69583179\",\"0.55\",\"India\"\n\"6011\",\"Rane Brake Lining\",\"RBL.NS\",\"69513219\",\"8.99\",\"India\"\n\"6012\",\"Genprex\",\"GNPX\",\"69471840\",\"1.45\",\"United States\"\n\"6013\",\"Alkaline Water Company\",\"WTER\",\"69422576\",\"0.57\",\"United States\"\n\"6014\",\"Mogo\",\"MOGO\",\"69355568\",\"0.9\",\"Canada\"\n\"6015\",\"Vista Gold\",\"VGZ\",\"68658632\",\"0.58\",\"United States\"\n\"6016\",\"Nectar Lifesciences\",\"NECLIFE.NS\",\"68258739\",\"0.3\",\"India\"\n\"6017\",\"Palatin Technologies\",\"PTN\",\"67260816\",\"0.29\",\"United States\"\n\"6018\",\"S.S. Lazio\",\"SSL.MI\",\"67159932\",\"0.99\",\"Italy\"\n\"6019\",\"Minerva Surgical\",\"UTRS\",\"66607924\",\"2.31\",\"United States\"\n\"6020\",\"Orient Paper Mills\",\"ORIENTPPR.NS\",\"66051256\",\"0.31\",\"India\"\n\"6021\",\"Augmedix\",\"AUGX\",\"65839312\",\"1.76\",\"United States\"\n\"6022\",\"Charlotte's Web\",\"CWEB.TO\",\"65778060\",\"0.45\",\"United States\"\n\"6023\",\"Petropavlovsk\",\"POG.L\",\"65172200\",\"1.43\",\"United Kingdom\"\n\"6024\",\"Avino Silver &amp; Gold Mines\",\"ASM\",\"64551300\",\"0.55\",\"Canada\"\n\"6025\",\"Tabula Rasa HealthCare\",\"TRHC\",\"64364756\",\"2.49\",\"United States\"\n\"6026\",\"Lumos Pharma\",\"LUMO\",\"64275684\",\"7.68\",\"United States\"\n\"6027\",\"Koss\",\"KOSS\",\"64034600\",\"7\",\"United States\"\n\"6028\",\"ReWalk Robotics\",\"RWLK\",\"63760096\",\"1.02\",\"Israel\"\n\"6029\",\"Conformis\",\"CFMS\",\"63323664\",\"0.34\",\"United States\"\n\"6030\",\"Journey Medical\",\"DERM\",\"62928076\",\"3.61\",\"United States\"\n\"6031\",\"U.S. Well Services\",\"USWS\",\"62881448\",\"0.82\",\"United States\"\n\"6032\",\"Orion Energy Systems\",\"OESX\",\"62322000\",\"2\",\"United States\"\n\"6033\",\"Titan Medical\",\"TMDI\",\"62273680\",\"0.56\",\"Canada\"\n\"6034\",\"Natural Health Trends\",\"NHTC\",\"62252624\",\"5.45\",\"United States\"\n\"6035\",\"LMP Automotive Holdings\",\"LMPX\",\"62071072\",\"5.69\",\"United States\"\n\"6036\",\"Phoenix Motor\",\"PEV\",\"61936000\",\"3.16\",\"United States\"\n\"6037\",\"InflaRx\",\"IFRX\",\"61443280\",\"1.39\",\"Germany\"\n\"6038\",\"Pulse Biosciences\",\"PLSE\",\"61432604\",\"1.66\",\"United States\"\n\"6039\",\"SCYNEXIS\",\"SCYX\",\"61249460\",\"1.88\",\"United States\"\n\"6040\",\"BeyondSpring\",\"BYSI\",\"61118376\",\"1.57\",\"United States\"\n\"6041\",\"Athersys\",\"ATHX\",\"60810392\",\"0.23\",\"United States\"\n\"6042\",\"Manhattan Bridge Capital\",\"LOAN\",\"60808020\",\"5.29\",\"United States\"\n\"6043\",\"Iterum Therapeutics\",\"ITRM\",\"59956428\",\"0.33\",\"Ireland\"\n\"6044\",\"Inuvo\",\"INUV\",\"59938440\",\"0.5\",\"United States\"\n\"6045\",\"Waitr Holdings\",\"WTRH\",\"59825436\",\"0.38\",\"United States\"\n\"6046\",\"Allied Esports\",\"AESE\",\"59445956\",\"1.52\",\"United States\"\n\"6047\",\"Trevena\",\"TRVN\",\"59421680\",\"0.36\",\"United States\"\n\"6048\",\"IZEA Worldwide\",\"IZEA\",\"59325696\",\"0.95\",\"United States\"\n\"6049\",\"Nautilus\",\"NLS\",\"59159276\",\"1.88\",\"United States\"\n\"6050\",\"United Insurance Holdings\",\"UIHC\",\"58796484\",\"1.36\",\"United States\"\n\"6051\",\"FreightCar America\",\"RAIL\",\"58700316\",\"3.55\",\"United States\"\n\"6052\",\"N.B.I. Industrial Finance\",\"NBIFIN.NS\",\"58589791\",\"23.85\",\"India\"\n\"6053\",\"Starbreeze\",\"STAR-B.ST\",\"58501815\",\"0.08\",\"Sweden\"\n\"6054\",\"ProQR\",\"PRQR\",\"57803296\",\"0.81\",\"Netherlands\"\n\"6055\",\"Vapotherm\",\"VAPO\",\"57788892\",\"2.18\",\"United States\"\n\"6056\",\"Unitech Group\",\"UNITECH.NS\",\"57585715\",\"0.02\",\"India\"\n\"6057\",\"Athenex\",\"ATNX\",\"56641896\",\"0.51\",\"United States\"\n\"6058\",\"Salem Media Group\",\"SALM\",\"56606780\",\"2.08\",\"United States\"\n\"6059\",\"iBio\",\"IBIO\",\"56265012\",\"0.26\",\"United States\"\n\"6060\",\"Oncolytics Biotech\",\"ONCY\",\"56061152\",\"0.97\",\"Canada\"\n\"6061\",\"eMagin\",\"EMAN\",\"55800040\",\"0.76\",\"United States\"\n\"6062\",\"Geospace Technologies\",\"GEOS\",\"55722180\",\"4.28\",\"United States\"\n\"6063\",\"Luby's\",\"LUB\",\"55327916\",\"1.78\",\"United States\"\n\"6064\",\"Rafael Holdings\",\"RFL\",\"55267620\",\"2.3\",\"United States\"\n\"6065\",\"AgEagle Aerial Systems\",\"UAVS\",\"55124804\",\"0.67\",\"United States\"\n\"6066\",\"Bionomics\",\"BNOX\",\"54810740\",\"7.29\",\"Australia\"\n\"6067\",\"Verb Technology\",\"VERB\",\"54778144\",\"0.54\",\"United States\"\n\"6068\",\"FingerMotion\",\"FNGR\",\"54327172\",\"1.27\",\"United States\"\n\"6069\",\"IMV\",\"IMV\",\"54176484\",\"0.6\",\"Canada\"\n\"6070\",\"Regis Corporation\",\"RGS\",\"54151072\",\"1.19\",\"United States\"\n\"6071\",\"Aptorum Group\",\"APM\",\"53554952\",\"1.5\",\"Hong Kong\"\n\"6072\",\"Golden Minerals\",\"AUMN\",\"53374956\",\"0.33\",\"United States\"\n\"6073\",\"Sidus Space\",\"SIDU\",\"53318468\",\"3.16\",\"United States\"\n\"6074\",\"Sientra\",\"SIEN\",\"53031024\",\"0.85\",\"United States\"\n\"6075\",\"Indonesia Energy\",\"INDO\",\"52995164\",\"6.93\",\"Indonesia\"\n\"6076\",\"NantHealth\",\"NH\",\"52956564\",\"0.46\",\"United States\"\n\"6077\",\"Redhill Biopharma\",\"RDHL\",\"52780760\",\"0.99\",\"Israel\"\n\"6078\",\"Gulf Island Fabrication\",\"GIFI\",\"52295120\",\"3.32\",\"United States\"\n\"6079\",\"Culp\",\"CULP\",\"52095544\",\"4.26\",\"United States\"\n\"6080\",\"Protalix BioTherapeutics\",\"PLX\",\"52004948\",\"1.11\",\"Israel\"\n\"6081\",\"Syros Pharmaceuticals\",\"SYRS\",\"51657280\",\"0.82\",\"United States\"\n\"6082\",\"CarLotz\",\"LOTZ\",\"51444236\",\"0.45\",\"United States\"\n\"6083\",\"Corvus Pharmaceuticals\",\"CRVS\",\"51208852\",\"1.1\",\"United States\"\n\"6084\",\"Sunworks\",\"SUNW\",\"51069584\",\"1.55\",\"United States\"\n\"6085\",\"vTv Therapeutics\",\"VTVT\",\"51037144\",\"0.66\",\"United States\"\n\"6086\",\"Westwater Resources\",\"WWR\",\"50969200\",\"1.08\",\"United States\"\n\"6087\",\"Achieve Life Sciences\",\"ACHV\",\"50829764\",\"5.25\",\"Canada\"\n\"6088\",\"BIT Mining (500.com)\",\"BTCM\",\"50741056\",\"0.7\",\"China\"\n\"6089\",\"Sellas Life Sciences\",\"SLS\",\"50517576\",\"2.46\",\"United States\"\n\"6090\",\"Future Retail\",\"FRETAIL.NS\",\"50130647\",\"0.09\",\"India\"\n\"6091\",\"Balaji Telefilms\",\"BALAJITELE.NS\",\"50113985\",\"0.49\",\"India\"\n\"6092\",\"Trinity Biotech\",\"TRIB\",\"49928576\",\"1.31\",\"Ireland\"\n\"6093\",\"Kirkland's\",\"KIRK\",\"49383088\",\"3.88\",\"United States\"\n\"6094\",\"Voyager Digital\",\"VOYG.TO\",\"49130968\",\"0.26\",\"United States\"\n\"6095\",\"Zynerba Pharmaceuticals\",\"ZYNE\",\"48827520\",\"1.12\",\"United States\"\n\"6096\",\"Tyme Technologies\",\"TYME\",\"48493492\",\"0.28\",\"United States\"\n\"6097\",\"Cryo-Cell\",\"CCEL\",\"48308772\",\"5.71\",\"United States\"\n\"6098\",\"Hepion Pharmaceuticals\",\"HEPA\",\"48138992\",\"0.63\",\"United States\"\n\"6099\",\"SigmaTron International\",\"SGMA\",\"47932652\",\"7.96\",\"United States\"\n\"6100\",\"Hindustan Media Ventures\",\"HMVL.NS\",\"47858556\",\"0.65\",\"India\"\n\"6101\",\"Logan Ridge Finance\",\"LRFC\",\"47850384\",\"17.65\",\"United States\"\n\"6102\",\"Field Trip Health\",\"FTRP\",\"47644260\",\"0.82\",\"Canada\"\n\"6103\",\"Horizon Global\",\"HZN\",\"47490060\",\"1.72\",\"United States\"\n\"6104\",\"Society Pass\",\"SOPA\",\"47338916\",\"1.99\",\"Singapore\"\n\"6105\",\"Boxlight\",\"BOXL\",\"47219676\",\"0.72\",\"United States\"\n\"6106\",\"Tonix Pharmaceuticals\",\"TNXP\",\"47217912\",\"1.49\",\"United States\"\n\"6107\",\"Agrify\",\"AGFY\",\"47066776\",\"1.77\",\"United States\"\n\"6108\",\"Aptinyx\",\"APTX\",\"47048868\",\"0.69\",\"United States\"\n\"6109\",\"Sonendo\",\"SONX\",\"47040592\",\"1.78\",\"United States\"\n\"6110\",\"PhaseBio Pharmaceuticals\",\"PHAS\",\"46986428\",\"0.97\",\"United States\"\n\"6111\",\"ATARI\",\"ATA.PA\",\"46838616\",\"0.15\",\"France\"\n\"6112\",\"NewAge\",\"NBEV\",\"46833344\",\"0.32\",\"United States\"\n\"6113\",\"KLX Energy Services\",\"KLXE\",\"46816048\",\"4.01\",\"United States\"\n\"6114\",\"SPI Energy\",\"SPI\",\"46691704\",\"1.7\",\"United States\"\n\"6115\",\"Navios Maritime Holdings\",\"NM\",\"46493096\",\"2.04\",\"Monaco\"\n\"6116\",\"Triterras\",\"TRIRF\",\"45914460\",\"0.6\",\"Singapore\"\n\"6117\",\"BioLargo\",\"BLGO\",\"45838360\",\"0.17\",\"United States\"\n\"6118\",\"Great Panther Mining\",\"GPL\",\"45640296\",\"0.1\",\"Canada\"\n\"6119\",\"NuCana\",\"NCNA\",\"44888560\",\"0.86\",\"United Kingdom\"\n\"6120\",\"Remark Holdings\",\"MARK\",\"44818340\",\"0.43\",\"United States\"\n\"6121\",\"AVROBIO\",\"AVRO\",\"44570428\",\"1.02\",\"United States\"\n\"6122\",\"Hallmark Financial Services\",\"HALL\",\"43838864\",\"2.41\",\"United States\"\n\"6123\",\"Exela Technologies\",\"XELA\",\"43622048\",\"0.1\",\"United States\"\n\"6124\",\"Okyo Pharma\",\"OKYO\",\"43322100\",\"1.99\",\"United Kingdom\"\n\"6125\",\"Comstock Mining\",\"LODE\",\"43313048\",\"0.59\",\"United States\"\n\"6126\",\"Foresight Autonomous Holdings\",\"FRSX\",\"43259576\",\"0.67\",\"Israel\"\n\"6127\",\"ATA Creativity Global\",\"AACG\",\"42885620\",\"1.36\",\"China\"\n\"6128\",\"Isoray\",\"ISR\",\"42754040\",\"0.3\",\"United States\"\n\"6129\",\"Avalon GloboCare\",\"AVCO\",\"42665476\",\"0.48\",\"United States\"\n\"6130\",\"The9\",\"NCTY\",\"42662060\",\"1.81\",\"China\"\n\"6131\",\"enish\",\"3667.T\",\"42617665\",\"2.75\",\"Japan\"\n\"6132\",\"Kaival Brands Innovations\",\"KAVL\",\"42386860\",\"1.36\",\"United States\"\n\"6133\",\"Cyngn\",\"CYN\",\"41972484\",\"1.25\",\"United States\"\n\"6134\",\"Intellicheck\",\"IDN\",\"41887184\",\"2.22\",\"United States\"\n\"6135\",\"Aquestive Therapeutics\",\"AQST\",\"41670124\",\"0.85\",\"United States\"\n\"6136\",\"AcelRx Pharmaceuticals\",\"ACRX\",\"41589692\",\"0.28\",\"United States\"\n\"6137\",\"Sphere 3D\",\"ANY\",\"41580820\",\"0.64\",\"Canada\"\n\"6138\",\"Unity Biotechnology\",\"UBX\",\"41466752\",\"0.6\",\"United States\"\n\"6139\",\"Document Security Systems\",\"DSS\",\"41413152\",\"0.35\",\"United States\"\n\"6140\",\"Oragenics\",\"OGEN\",\"41366784\",\"0.36\",\"United States\"\n\"6141\",\"Cocrystal Pharma\",\"COCP\",\"40936980\",\"0.42\",\"United States\"\n\"6142\",\"Evofem Biosciences\",\"EVFM\",\"40699196\",\"1.15\",\"United States\"\n\"6143\",\"Quotient\",\"QTNT\",\"40512256\",\"0.3\",\"Switzerland\"\n\"6144\",\"electroCore\",\"ECOR\",\"39354808\",\"0.56\",\"United States\"\n\"6145\",\"MEP Infrastructure\",\"MEP.NS\",\"39338861\",\"0.21\",\"India\"\n\"6146\",\"NRx Pharmaceuticals\",\"NRXP\",\"39331696\",\"0.59\",\"United States\"\n\"6147\",\"Real Good Food plc\",\"RGF\",\"39055340\",\"6.33\",\"United Kingdom\"\n\"6148\",\"Acasti Pharma\",\"ACST\",\"38884824\",\"0.88\",\"Canada\"\n\"6149\",\"Ampio Pharmaceuticals\",\"AMPE\",\"38468792\",\"0.17\",\"United States\"\n\"6150\",\"Trinity Place Holdings\",\"TPHS\",\"38324416\",\"1.04\",\"United States\"\n\"6151\",\"Biomerica\",\"BMRA\",\"38298664\",\"2.98\",\"United States\"\n\"6152\",\"Digital Ally\",\"DGLY\",\"38273920\",\"0.79\",\"United States\"\n\"6153\",\"Quanergy Systems\",\"QNGY\",\"38004992\",\"0.41\",\"United States\"\n\"6154\",\"AIM ImmunoTech\",\"AIM\",\"37953748\",\"0.79\",\"United States\"\n\"6155\",\"Kingstone Companies\",\"KINS\",\"37787620\",\"3.55\",\"United States\"\n\"6156\",\"Stronghold Digital Mining\",\"SDIG\",\"37665612\",\"1.88\",\"United States\"\n\"6157\",\"Beasley Broadcast Group\",\"BBGI\",\"37624064\",\"1.28\",\"United States\"\n\"6158\",\"Houston American Energy\",\"HUSA\",\"37529124\",\"3.78\",\"United States\"\n\"6159\",\"Capstone Green Energy\",\"CGRN\",\"37400964\",\"2.45\",\"United States\"\n\"6160\",\"Orphazyme\",\"ORPH\",\"37272452\",\"0.87\",\"Denmark\"\n\"6161\",\"SOS Limited\",\"SOS\",\"37080700\",\"6.51\",\"China\"\n\"6162\",\"WonderPlanet\",\"4199.T\",\"37048301\",\"17.22\",\"Japan\"\n\"6163\",\"Corbus Pharmaceuticals\",\"CRBP\",\"37038200\",\"0.3\",\"United States\"\n\"6164\",\"Brooklyn ImmunoTherapeutics\",\"BTX\",\"36894844\",\"0.64\",\"United States\"\n\"6165\",\"Super League Gaming\",\"SLGG\",\"36684164\",\"0.99\",\"United States\"\n\"6166\",\"Dolphin Entertainment\",\"DLPN\",\"36586180\",\"4.02\",\"United States\"\n\"6167\",\"Nymox Pharmaceutical\",\"NYMX\",\"36211308\",\"0.4\",\"Bahamas\"\n\"6168\",\"DAVIDsTEA\",\"DTEA\",\"36208084\",\"1.37\",\"Canada\"\n\"6169\",\"Polar Power\",\"POLA\",\"35998784\",\"2.82\",\"United States\"\n\"6170\",\"Silver One Resources\",\"SVE.V\",\"35855231\",\"0.17\",\"Canada\"\n\"6171\",\"Psychemedics\",\"PMD\",\"35557584\",\"6.32\",\"United States\"\n\"6172\",\"LightPath Technologies\",\"LPTH\",\"35434012\",\"1.31\",\"United States\"\n\"6173\",\"CorEnergy Infrastructure Trust\",\"CORR\",\"35356344\",\"2.26\",\"United States\"\n\"6174\",\"Biofrontera\",\"BFRI\",\"35066196\",\"1.85\",\"United States\"\n\"6175\",\"GlycoMimetics\",\"GLYC\",\"34846184\",\"0.67\",\"United States\"\n\"6176\",\"180 Life Sciences\",\"ATNF\",\"34830092\",\"1.02\",\"United States\"\n\"6177\",\"Microbot Medical\",\"MBOT\",\"34687676\",\"4.88\",\"United States\"\n\"6178\",\"Solitario Zinc\",\"XPL\",\"34651364\",\"0.54\",\"United States\"\n\"6179\",\"Adial Pharmaceuticals\",\"ADIL\",\"34632900\",\"1.35\",\"United States\"\n\"6180\",\"X4 Pharmaceuticals\",\"XFOR\",\"34368316\",\"1.12\",\"United States\"\n\"6181\",\"Almaden Minerals\",\"AAU\",\"33958580\",\"0.23\",\"Canada\"\n\"6182\",\"Ocean Power Technologies\",\"OPTT\",\"33944548\",\"0.61\",\"United States\"\n\"6183\",\"Zovio\",\"ZVO\",\"33891424\",\"0.99\",\"United States\"\n\"6184\",\"Eargo\",\"EAR\",\"33450874\",\"0.85\",\"United States\"\n\"6185\",\"IMTE\",\"IMTE\",\"32604794\",\"2.21\",\"Australia\"\n\"6186\",\"Cyclerion Therapeutics\",\"CYCN\",\"32586300\",\"0.75\",\"United States\"\n\"6187\",\"Actelis Networks\",\"ASNS\",\"32454790\",\"1.87\",\"United States\"\n\"6188\",\"Broadwind\",\"BWEN\",\"32365992\",\"1.61\",\"United States\"\n\"6189\",\"Regulus Therapeutics\",\"RGLS\",\"32115820\",\"2.2\",\"United States\"\n\"6190\",\"Akanda\",\"AKAN\",\"32041358\",\"1.04\",\"United Kingdom\"\n\"6191\",\"U.S. Gold Corp\",\"USAU\",\"31859648\",\"3.82\",\"United States\"\n\"6192\",\"Team Inc\",\"TISI\",\"31784932\",\"0.74\",\"United States\"\n\"6193\",\"ZK International Group\",\"ZKIN\",\"31304686\",\"1.03\",\"China\"\n\"6194\",\"BioSig Technologies\",\"BSGM\",\"31206772\",\"0.71\",\"United States\"\n\"6195\",\"Abeona Therapeutics\",\"ABEO\",\"31065124\",\"5.29\",\"United States\"\n\"6196\",\"Context Therapeutics\",\"CNTX\",\"30971042\",\"1.94\",\"United States\"\n\"6197\",\"Cielo Waste Solutions\",\"CMC.V\",\"30523526\",\"0.05\",\"Canada\"\n\"6198\",\"Pioneer Power Solutions\",\"PPSI\",\"29994518\",\"3.11\",\"United States\"\n\"6199\",\"Appirits\",\"4174.T\",\"29801072\",\"7.48\",\"Japan\"\n\"6200\",\"Nexstim\",\"NXTMH.HE\",\"29550441\",\"4.42\",\"Finland\"\n\"6201\",\"Soligenix\",\"SNGX\",\"29274136\",\"0.68\",\"United States\"\n\"6202\",\"VivoPower\",\"VVPR\",\"28553166\",\"1.38\",\"United Kingdom\"\n\"6203\",\"India Globalization Capital\",\"IGC\",\"28459420\",\"0.55\",\"United States\"\n\"6204\",\"OpGen\",\"OPGN\",\"28431070\",\"0.61\",\"United States\"\n\"6205\",\"VYNE Therapeutics\",\"VYNE\",\"28407848\",\"0.49\",\"United States\"\n\"6206\",\"Aeterna Zentaris\",\"AEZS\",\"28261696\",\"0.23\",\"United States\"\n\"6207\",\"Onconova Therapeutics\",\"ONTX\",\"28240404\",\"1.35\",\"United States\"\n\"6208\",\"Fresh Vine Wine\",\"VINE\",\"28116256\",\"2.24\",\"United States\"\n\"6209\",\"Organovo\",\"ONVO\",\"27881280\",\"3.15\",\"United States\"\n\"6210\",\"Vislink Technologies\",\"VISL\",\"27747098\",\"0.61\",\"United States\"\n\"6211\",\"FGI Industries\",\"FGI\",\"27715000\",\"2.3\",\"United States\"\n\"6212\",\"Biolase\",\"BIOL\",\"27606852\",\"4.47\",\"United States\"\n\"6213\",\"Inpixon\",\"INPX\",\"27491422\",\"0.18\",\"United States\"\n\"6214\",\"RealNetworks\",\"RNWK\",\"27436694\",\"0.58\",\"United States\"\n\"6215\",\"PREIT\",\"PEI\",\"27348068\",\"4.27\",\"United States\"\n\"6216\",\"T2 Biosystems\",\"TTOO\",\"27304272\",\"0.16\",\"United States\"\n\"6217\",\"Lannett Company\",\"LCI\",\"27110096\",\"0.63\",\"United States\"\n\"6218\",\"SeaChange\",\"SEAC\",\"27105816\",\"0.55\",\"United States\"\n\"6219\",\"Marin Software\",\"MRIN\",\"27086232\",\"1.74\",\"United States\"\n\"6220\",\"American Virtual Cloud\",\"AVCT\",\"26845272\",\"0.29\",\"United States\"\n\"6221\",\"Precipio\",\"PRPO\",\"26798536\",\"1.18\",\"United States\"\n\"6222\",\"Agile Therapeutics\",\"AGRX\",\"26140150\",\"0.67\",\"United States\"\n\"6223\",\"Summer Infant\",\"SUMR\",\"25984368\",\"11.99\",\"United States\"\n\"6224\",\"Jaguar Health\",\"JAGX\",\"25975934\",\"0.33\",\"United States\"\n\"6225\",\"Rand Merchant Investment\",\"RMI.JO\",\"25707222\",\"1.67\",\"South Africa\"\n\"6226\",\"Tempest Therapeutics\",\"TPST\",\"25497810\",\"2.47\",\"United States\"\n\"6227\",\"Srei Infrastructure Finance\",\"SREINFRA.NS\",\"25373245\",\"0.05\",\"India\"\n\"6228\",\"Can Fite Biopharma\",\"CANF\",\"25285376\",\"0.93\",\"Israel\"\n\"6229\",\"Aileron Therapeutics\",\"ALRN\",\"25040066\",\"0.28\",\"United States\"\n\"6230\",\"Zee Learn\",\"ZEELEARN.NS\",\"24894727\",\"0.08\",\"India\"\n\"6231\",\"Chembio Diagnostics\",\"CEMI\",\"24818224\",\"0.82\",\"United States\"\n\"6232\",\"Pick n Pay Stores\",\"PIK.JO\",\"24672680\",\"3.37\",\"South Africa\"\n\"6233\",\"Alony Hetz\",\"ALHE.TA\",\"24632518\",\"13.96\",\"Israel\"\n\"6234\",\"Aytu BioScience\",\"AYTU\",\"24302186\",\"0.63\",\"United States\"\n\"6235\",\"Spero Therapeutics\",\"SPRO\",\"24291194\",\"0.74\",\"United States\"\n\"6236\",\"NanoViricides\",\"NNVC\",\"24266868\",\"2.1\",\"United States\"\n\"6237\",\"Wheeler Real Estate Investment Trust\",\"WHLR\",\"24016032\",\"2.47\",\"United States\"\n\"6238\",\"cbdMD\",\"YCBD\",\"23958456\",\"0.4\",\"United States\"\n\"6239\",\"Stryve Foods\",\"SNAX\",\"23886236\",\"0.95\",\"United States\"\n\"6240\",\"Farmmi\",\"FAMI\",\"23868152\",\"1.07\",\"China\"\n\"6241\",\"Astrotech\",\"ASTC\",\"23793930\",\"0.47\",\"United States\"\n\"6242\",\"Ontrak\",\"OTRK\",\"23749982\",\"1.14\",\"United States\"\n\"6243\",\"AgeX Therapeutics\",\"AGE\",\"23725820\",\"0.63\",\"United States\"\n\"6244\",\"Inspira Technologies\",\"IINN\",\"23431100\",\"2.2\",\"Israel\"\n\"6245\",\"Greenlane\",\"GNLN\",\"23240646\",\"0.21\",\"United States\"\n\"6246\",\"Enjoy Technology\",\"ENJY\",\"23175936\",\"0.19\",\"United States\"\n\"6247\",\"Kala Pharmaceuticals\",\"KALA\",\"23142968\",\"0.32\",\"United States\"\n\"6248\",\"BiondVax\",\"BVXV\",\"22910226\",\"1.23\",\"Israel\"\n\"6249\",\"Cryptyde\",\"TYDE\",\"22742160\",\"1.12\",\"United States\"\n\"6250\",\"Ekso Bionics\",\"EKSO\",\"22477876\",\"1.75\",\"United States\"\n\"6251\",\"Austin Gold\",\"AUST\",\"22031188\",\"1.66\",\"United States\"\n\"6252\",\"Rave Restaurant Group\",\"RAVE\",\"21987584\",\"1.22\",\"United States\"\n\"6253\",\"Arcadia Biosciences\",\"RKDA\",\"21967012\",\"0.99\",\"United States\"\n\"6254\",\"Air Industries Group\",\"AIRI\",\"21928300\",\"0.68\",\"United States\"\n\"6255\",\"Carver Bancorp\",\"CARV\",\"21876450\",\"5.75\",\"United States\"\n\"6256\",\"iSpecimen\",\"ISPC\",\"21780242\",\"2.46\",\"United States\"\n\"6257\",\"Aprea Therapeutics\",\"APRE\",\"21637730\",\"0.92\",\"United States\"\n\"6258\",\"G Medical Innovations\",\"GMVD\",\"21487122\",\"0.88\",\"Israel\"\n\"6259\",\"Ensysce Biosciences\",\"ENSC\",\"21472748\",\"0.62\",\"United States\"\n\"6260\",\"Allena Pharmaceuticals\",\"ALNA\",\"21297232\",\"0.2\",\"United States\"\n\"6261\",\"Genetic Technologies\",\"GENE\",\"20622466\",\"1.34\",\"Australia\"\n\"6262\",\"Shikun &amp; Binui\",\"SKBN.TA\",\"19892179\",\"4.32\",\"Israel\"\n\"6263\",\"Cimbeton\",\"CMBTN.IS\",\"19830623\",\"11.2\",\"Turkey\"\n\"6264\",\"SG Blocks\",\"SGBX\",\"19811384\",\"1.65\",\"United States\"\n\"6265\",\"Marpai\",\"MRAI\",\"19487712\",\"0.96\",\"United States\"\n\"6266\",\"FC Porto\",\"FCP.LS\",\"19230685\",\"0.85\",\"Portugal\"\n\"6267\",\"Energix Renewable Energies\",\"ENRG.TA\",\"19195410\",\"3.69\",\"Israel\"\n\"6268\",\"Tivic Health Systems\",\"TIVC\",\"18954316\",\"1.97\",\"United States\"\n\"6269\",\"NuZee\",\"NUZE\",\"18877268\",\"0.97\",\"United States\"\n\"6270\",\"Blackboxstocks\",\"BLBX\",\"18855550\",\"1.43\",\"United States\"\n\"6271\",\"Titan Pharmaceuticals\",\"TTNP\",\"18432792\",\"1.26\",\"United States\"\n\"6272\",\"Blue Hat\",\"BHAT\",\"18370942\",\"2.97\",\"China\"\n\"6273\",\"Guardforce AI\",\"GFAI\",\"18165426\",\"0.44\",\"Singapore\"\n\"6274\",\"Future Supply Chain Solutions\",\"FSC.NS\",\"18113131\",\"0.41\",\"India\"\n\"6275\",\"Advanced Human Imaging\",\"AHI\",\"17784470\",\"0.63\",\"Australia\"\n\"6276\",\"Esports Entertainment\",\"GMBL\",\"17772816\",\"0.43\",\"Malta\"\n\"6277\",\"HTG Molecular Diagnostics\",\"HTGM\",\"17663658\",\"1.6\",\"United States\"\n\"6278\",\"Cingulate\",\"CING\",\"17642664\",\"1.56\",\"United States\"\n\"6279\",\"Top Ships\",\"TOPS\",\"17642028\",\"0.37\",\"Greece\"\n\"6280\",\"Biocept\",\"BIOC\",\"17599816\",\"1.04\",\"United States\"\n\"6281\",\"HyreCar\",\"HYRE\",\"17488682\",\"0.8\",\"United States\"\n\"6282\",\"Petros Pharmaceuticals\",\"PTPI\",\"17375148\",\"0.84\",\"United States\"\n\"6283\",\"Neovasc\",\"NVCN\",\"17242438\",\"6.27\",\"Canada\"\n\"6284\",\"Winc\",\"WBEV\",\"16934294\",\"1.28\",\"United States\"\n\"6285\",\"Stealth BioTherapeutics\",\"MITO\",\"16644048\",\"0.23\",\"Cayman Islands\"\n\"6286\",\"Minerva Neurosciences\",\"NERV\",\"16394948\",\"3.07\",\"United States\"\n\"6287\",\"Aethlon Medical\",\"AEMD\",\"15988502\",\"1.01\",\"United States\"\n\"6288\",\"Galmed Pharmaceuticals\",\"GLMD\",\"15853360\",\"0.63\",\"Israel\"\n\"6289\",\"Kaspien\",\"KSPN\",\"15509734\",\"6.2\",\"United States\"\n\"6290\",\"Pulmatrix\",\"PULM\",\"15479367\",\"4.57\",\"United States\"\n\"6291\",\"Diffusion Pharmaceuticals\",\"DFFN\",\"15309811\",\"7.51\",\"United States\"\n\"6292\",\"Expion360\",\"XPON\",\"15278760\",\"2.25\",\"United States\"\n\"6293\",\"Celsion Corporation\",\"CLSN\",\"14907353\",\"2.1\",\"United States\"\n\"6294\",\"BIO-key International\",\"BKYI\",\"14392763\",\"1.71\",\"United States\"\n\"6295\",\"OLB Group\",\"OLB\",\"14036763\",\"0.95\",\"United States\"\n\"6296\",\"Calithera Biosciences\",\"CALA\",\"13710445\",\"2.82\",\"United States\"\n\"6297\",\"Rail Vision\",\"RVSN\",\"13670646\",\"0.86\",\"Israel\"\n\"6298\",\"Impac Mortgage Holdings\",\"IMH\",\"13524084\",\"0.63\",\"United States\"\n\"6299\",\"Heart Test Laboratories\",\"HSCS\",\"13350268\",\"1.66\",\"United States\"\n\"6300\",\"Nabriva Therapeutics\",\"NBRV\",\"12950663\",\"0.2\",\"Ireland\"\n\"6301\",\"Versus Systems\",\"VS\",\"12229940\",\"0.59\",\"Canada\"\n\"6302\",\"Rockwell Medical\",\"RMTI\",\"11918404\",\"1.27\",\"United States\"\n\"6303\",\"SINTX Technologies\",\"SINT\",\"11861088\",\"0.48\",\"United States\"\n\"6304\",\"Hillstream BioPharma\",\"HILS\",\"11838260\",\"1.02\",\"United States\"\n\"6305\",\"Kidpik\",\"PIK\",\"11773136\",\"1.53\",\"United States\"\n\"6306\",\"Yield10 Bioscience\",\"YTEN\",\"11763000\",\"2.4\",\"United States\"\n\"6307\",\"Jump Networks\",\"JUMPNET.NS\",\"11669324\",\"0.12\",\"India\"\n\"6308\",\"Bellerophon Therapeutics\",\"BLPH\",\"11584358\",\"1.21\",\"United States\"\n\"6309\",\"Sonim Technologies\",\"SONM\",\"11370066\",\"0.59\",\"United States\"\n\"6310\",\"Ra Medical Systems\",\"RMED\",\"11300324\",\"0.35\",\"United States\"\n\"6311\",\"Calyxt\",\"CLXT\",\"11295081\",\"0.26\",\"United States\"\n\"6312\",\"Evoke Pharma\",\"EVOK\",\"11065528\",\"3.31\",\"United States\"\n\"6313\",\"Trillium Gold Mines\",\"TGM.V\",\"10834748\",\"0.18\",\"Canada\"\n\"6314\",\"Acorda Therapeutics\",\"ACOR\",\"10796338\",\"0.44\",\"United States\"\n\"6315\",\"Edible Garden\",\"EDBL\",\"10732126\",\"1.24\",\"United States\"\n\"6316\",\"SaverOne 2014\",\"SVRE\",\"10666321\",\"2.35\",\"Israel\"\n\"6317\",\"Phio Pharmaceuticals\",\"PHIO\",\"10244025\",\"0.75\",\"United States\"\n\"6318\",\"ION Geophysical\",\"IO\",\"10205100\",\"0.35\",\"United States\"\n\"6319\",\"Akerna\",\"KERN\",\"10178391\",\"0.15\",\"United States\"\n\"6320\",\"SOBR Safe\",\"SOBR\",\"10156100\",\"1\",\"United States\"\n\"6321\",\"Eastside Distilling\",\"EAST\",\"10090156\",\"0.66\",\"United States\"\n\"6322\",\"Neptune Wellness Solutions\",\"NEPT\",\"9582251\",\"1.38\",\"Canada\"\n\"6323\",\"Benitec Biopharma\",\"BNTC\",\"9560877\",\"1.17\",\"United States\"\n\"6324\",\"ShiftPixy\",\"PIXY\",\"9543063\",\"0.28\",\"United States\"\n\"6325\",\"AppTech Payments\",\"APCX\",\"9441742\",\"0.58\",\"United States\"\n\"6326\",\"Pintec Technology\",\"PT\",\"8851519\",\"1.02\",\"China\"\n\"6327\",\"Grom Social Enterprises\",\"GROM\",\"8498461\",\"0.45\",\"United States\"\n\"6328\",\"Avinger\",\"AVGR\",\"8352907\",\"1.47\",\"United States\"\n\"6329\",\"Liquid Media Group\",\"YVR\",\"8299771\",\"0.43\",\"Canada\"\n\"6330\",\"PainReform\",\"PRFX\",\"8176037\",\"0.78\",\"Israel\"\n\"6331\",\"Altamira Therapeutics\",\"CYTO\",\"7937793\",\"0.51\",\"Bermuda\"\n\"6332\",\"JanOne\",\"JAN\",\"7916748\",\"2.8\",\"United States\"\n\"6333\",\"Connexa Sports Technologies\",\"CNXA\",\"7863532\",\"0.94\",\"United States\"\n\"6334\",\"Cemtrex\",\"CETX\",\"7776563\",\"0.3\",\"United States\"\n\"6335\",\"Advaxis\",\"ADXS\",\"7737040\",\"4.25\",\"United States\"\n\"6336\",\"Armstrong Flooring\",\"AFI\",\"7648996\",\"0.35\",\"United States\"\n\"6337\",\"Allied Healthcare Products\",\"AHPI\",\"7283371\",\"1.81\",\"United States\"\n\"6338\",\"Energy Focus\",\"EFOI\",\"7167840\",\"0.92\",\"United States\"\n\"6339\",\"Viveve Medical\",\"VIVE\",\"7129135\",\"0.67\",\"United States\"\n\"6340\",\"PolarityTE\",\"PTE\",\"7098269\",\"1.59\",\"United States\"\n\"6341\",\"Staffing 360 Solutions\",\"STAF\",\"6665355\",\"3.78\",\"United States\"\n\"6342\",\"FedNat Holding Company\",\"FNHC\",\"6550429\",\"0.37\",\"United States\"\n\"6343\",\"VIP Gloves\",\"VIP.AX\",\"6382324\",\"0.01\",\"Malaysia\"\n\"6344\",\"Wolverine Energy and Infrastructure\",\"WEII.V\",\"6356629\",\"0.06\",\"Canada\"\n\"6345\",\"Performance Shipping\",\"PSHG\",\"6226605\",\"0.6\",\"Greece\"\n\"6346\",\"Applied DNA Sciences\",\"APDN\",\"6175740\",\"0.75\",\"United States\"\n\"6347\",\"Baudax Bio\",\"BXRX\",\"5651386\",\"0.88\",\"United States\"\n\"6348\",\"Helius Medical Technologies\",\"HSDT\",\"5392663\",\"1.42\",\"United States\"\n\"6349\",\"Quoin Pharmaceuticals\",\"QNRX\",\"5216989\",\"0.52\",\"United States\"\n\"6350\",\"ToughBuilt Industries\",\"TBLT\",\"5004087\",\"2.35\",\"United States\"\n\"6351\",\"B Communications\",\"BCOM.TA\",\"4863381\",\"4.4\",\"Israel\"\n\"6352\",\"Afristrat Investment\",\"ATI.JO\",\"4067586\",\"0.01\",\"South Africa\"\n\"6353\",\"Direct Digital Holdings\",\"DRCT\",\"3961440\",\"1.41\",\"United States\"\n\"6354\",\"Youngevity International\",\"YGYI\",\"3915083\",\"0.12\",\"United States\"\n\"6355\",\"Zosano Pharma\",\"ZSAN\",\"2733500\",\"0.56\",\"United States\"\n\"6356\",\"Mallinckrodt Pharmaceuticals\",\"MNKKQ\",\"1695660\",\"0.02\",\"United Kingdom\"\n\"6357\",\"Genocea Biosciences\",\"GNCA\",\"881752\",\"0.02\",\"United States\"\n\"6358\",\"iFresh\",\"IFMK\",\"725468\",\"0.02\",\"United States\"\n\"6359\",\"Trulite\",\"TRUL\",\"212013\",\"0\",\"United States\"\n\"6360\",\"Pareteum Corporation\",\"TEUM\",\"142697\",\"0\",\"United States\"\n\"6361\",\"Intensity Therapeutics\",\"INTS\",\"0\",\"0\",\"United States\"\n\"6362\",\"Justworks\",\"JW\",\"0\",\"0\",\"United States\"\n\"6363\",\"Verdant Earth Technologies\",\"VDNT\",\"0\",\"0\",\"Australia\"\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/application/CurrentApplication.kt",
    "content": "package com.istudio.app.application\n\nimport android.app.Application\nimport dagger.hilt.android.HiltAndroidApp\n\n@HiltAndroidApp\nclass CurrentApplication : Application() {  }"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/data/mock/FlowMockApi.kt",
    "content": "package com.istudio.app.data.mock\n\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\n\ninterface FlowMockApi {\n\n    @GET(\"current-stock-prices\")\n    suspend fun getCurrentStockPrices(): List<Stock>\n}\n\nfun createFlowMockApi(interceptor: MockNetworkInterceptor): FlowMockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .build()\n\n    return retrofit.create(FlowMockApi::class.java)\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/data/mock/FlowMockData.kt",
    "content": "package com.istudio.app.data.mock\n\nimport android.content.Context\nimport androidx.compose.runtime.Immutable\nimport com.opencsv.CSVReader\nimport java.io.InputStreamReader\nimport java.util.UUID\nimport kotlin.random.Random\n\n@Immutable\ndata class Stock(\n    val id : String = UUID.randomUUID().toString(),\n    val rank: Int,\n    val name: String,\n    val symbol: String,\n    val marketCap: Float,\n    val country: String,\n    val currentPrice: Float,\n    val currency: Currency = Currency.DOLLAR,\n    val priceTrend: PriceTrend = PriceTrend.UNKNOWN\n)\n\nenum class Currency {\n    DOLLAR, EURO\n}\n\nenum class PriceTrend {\n    UP, DOWN, NEUTRAL, UNKNOWN\n}\n\nvar initialStockData: List<Stock>? = null\n\nfun readAndParseStockData(context: Context) {\n    if (initialStockData == null) {\n        val stream = context.assets.open(\"stockdata.csv\")\n        val csvReader = CSVReader(InputStreamReader(stream))\n        val stockData = csvReader\n            .readAll()\n            .drop(1)\n            .mapNotNull { line ->\n                val id = UUID.randomUUID().toString()\n                val rank = line[0].toInt()\n                val name = line[1]\n                val symbol = line[2]\n                val marketCap = line[3].toFloat()\n                val priceUsd = line[4].toFloat()\n                val country = line[5]\n                Stock(id,rank, name, symbol, marketCap, country, priceUsd)\n            }.also {\n                csvReader.close()\n            }\n        initialStockData = stockData\n    }\n}\n\nfun fakeCurrentStockPrices(context: Context): List<Stock> {\n    readAndParseStockData(context)\n\n    return initialStockData!!.map { stock ->\n        val currentPrice = stock.currentPrice\n        if (stock.currentPrice == 0f) {\n            return@map stock\n        }\n        val randomRangeInPercent = 0.03\n        val randomLowerBound = (currentPrice * (1 - randomRangeInPercent))\n        val randomUpperBound = (currentPrice * (1 + randomRangeInPercent))\n        val randomPrice = Random.nextDouble(randomLowerBound, randomUpperBound).toFloat()\n        stock.copy(currentPrice = randomPrice)\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/data/mock/MockNetworkInterceptor.kt",
    "content": "package com.istudio.app.data.mock\n\nimport okhttp3.*\nimport kotlin.random.Random\n\nclass MockNetworkInterceptor : Interceptor {\n\n    private val mockResponses = mutableListOf<MockResponse>()\n\n    override fun intercept(chain: Interceptor.Chain): Response {\n        val request = chain.request()\n\n        val mockResponse = findMockResponseInList(request)\n            ?: throw RuntimeException(\"No mock response found for url ${request.url()}. Please define a mock response in your MockApi!\")\n\n        removeResponseIfItShouldNotBePersisted(mockResponse)\n        simulateNetworkDelay(mockResponse)\n\n        return if (mockResponse.status < 400) {\n\n            if (mockResponse.errorFrequencyInPercent == 0) {\n                createSuccessResponse(mockResponse, request)\n            } else {\n                maybeReturnErrorResponse(mockResponse, request)\n            }\n        } else {\n            createErrorResponse(request, mockResponse.body())\n        }\n    }\n\n    private fun maybeReturnErrorResponse(\n        mockResponse: MockResponse,\n        request: Request\n    ) = when (Random.nextInt(0, 101)) {\n        in 0..mockResponse.errorFrequencyInPercent -> createErrorResponse(request)\n        else -> createSuccessResponse(mockResponse, request)\n    }\n\n    private fun findMockResponseInList(request: Request): MockResponse? {\n        return mockResponses.find { mockResponse ->\n            mockResponse.path.contains(request.url().encodedPath())\n        }\n    }\n\n    private fun removeResponseIfItShouldNotBePersisted(mockResponse: MockResponse) {\n        if (!mockResponse.persist) {\n            mockResponses.remove(mockResponse)\n        }\n    }\n\n    private fun simulateNetworkDelay(mockResponse: MockResponse) {\n        Thread.sleep(mockResponse.delayInMs)\n    }\n\n    private fun createErrorResponse(request: Request, errorBody: String = \"Error\"): Response {\n        return Response.Builder()\n            .code(500)\n            .request(request)\n            .protocol(Protocol.HTTP_1_1)\n            .message(\"Internal Server Error: $errorBody\")\n            .body(\n                ResponseBody.create(\n                    MediaType.get(\"text/plain\"),\n                    errorBody\n                )\n            )\n            .build()\n    }\n\n    private fun createSuccessResponse(\n        mockResponse: MockResponse,\n        request: Request\n    ): Response {\n        return Response.Builder()\n            .code(mockResponse.status)\n            .request(request)\n            .protocol(Protocol.HTTP_1_1)\n            .message(\"OK\")\n            .body(\n                ResponseBody.create(\n                    MediaType.get(\"application/json\"),\n                    mockResponse.body.invoke()\n                )\n            )\n            .build()\n    }\n\n    fun mock(\n        path: String,\n        body: () -> String,\n        status: Int,\n        delayInMs: Long = 250,\n        persist: Boolean = true,\n        errorFrequencyInPercent:Int = 0\n    ) = apply {\n        val mockResponse =\n            MockResponse(\n                path,\n                body,\n                status,\n                delayInMs,\n                persist,\n                errorFrequencyInPercent\n            )\n        mockResponses.add(mockResponse)\n    }\n\n    companion object {\n        const val INTERNAL_SERVER_ERROR_HTTP_CODE = 500\n    }\n}\n\ndata class MockResponse(\n    val path: String,\n    val body: () -> String,\n    val status: Int,\n    val delayInMs: Long,\n    val persist: Boolean,\n    val errorFrequencyInPercent: Int\n)\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/main/MainActivity.kt",
    "content": "package com.istudio.app.main\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.ui.Modifier\nimport androidx.navigation.compose.NavHost\nimport androidx.navigation.compose.composable\nimport androidx.navigation.compose.rememberNavController\nimport com.istudio.app.modules.module_demos.basic_fundamentals.ui.KotlinBasicsDemo\nimport com.istudio.app.modules.module_demos.channels.ChannelsDemo\nimport com.istudio.app.modules.module_demos.coroutines.CoroutinesDemo\nimport com.istudio.app.modules.module_demos.coroutines.compare_join_and_async.CompareJoinAsyncDemo\nimport com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.CoroutinesCancellationSelection\nimport com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.ensure_active_demo.EnsureActiveDemo\nimport com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.is_active_demo.IsActiveDemo\nimport com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.non_cancellable_job.NonCancellableDemo\nimport com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.root_children_cencel_demo.RootChildrenCancelDemo\nimport com.istudio.app.modules.module_demos.coroutines.dispatchers.DispatchersDemo\nimport com.istudio.app.modules.module_demos.coroutines.exception_handeling.ExceptionHandlingSelectionDemo\nimport com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_async.UsingAsyncExceptionHandleDemo\nimport com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_launch.UsingLaunchExceptionHandleDemo\nimport com.istudio.app.modules.module_demos.coroutines.job.JobDemoSelection\nimport com.istudio.app.modules.module_demos.coroutines.launch_and_withcontext.LaunchAndWithContextDemo\nimport com.istudio.app.modules.module_demos.coroutines.simple_structured_concurrency.SimpleStructuredConcurrencyDemo\nimport com.istudio.app.modules.module_demos.coroutines.suspend_and_launch_demo.SuspendAndLaunchDemo\nimport com.istudio.app.modules.module_demos.coroutines.using_async_await.UsingAsyncAwaitDemo\nimport com.istudio.app.modules.module_demos.coroutines.using_join.UsingJoinDemo\nimport com.istudio.app.modules.module_demos.flows.FlowsDemo\nimport com.istudio.app.modules.module_demos.flows.modules.collect_as_state_with_lifecycle.CollectAsStateWithLifeCycleDemo\nimport com.istudio.app.modules.module_demos.flows.modules.compose_and_flatten_flows.ComposeAndFlattenFlows\nimport com.istudio.app.modules.module_demos.flows.modules.flatten_flows.FlattenFlowsDemo\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.chapters.display_data_from_server.DisplayDataFromServerDemo\nimport com.istudio.app.modules.module_demos.flows.modules.intermediate_operators.IntermediateOperators\nimport com.istudio.app.modules.module_demos.flows.modules.terminal_operators.TerminalOperators\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.ui.FlowBasics\nimport com.istudio.app.modules.module_demos.flows.modules.mutable_state_of_flow.MutableStateOfFlowDemo\nimport com.istudio.app.modules.module_demos.flows.modules.state_and_shared_flows.StateAndSharedFlowDemo\nimport com.istudio.app.modules.module_demos.higher_order_functions.ui.HigherOrderFunctionDemo\nimport com.istudio.app.modules.module_demos.kotlin_annotations.ui.KotlinAnnotationsDemo\nimport com.istudio.app.modules.module_demos.nested_vs_inner.ui.NestedVsInner\nimport com.istudio.app.modules.module_demos.sealed_class.ui.SealedClassDemo\nimport com.istudio.app.modules.module_demos.type_alias.ui.TypeAlias\nimport com.istudio.app.modules.module_exercises.ExerciseSelection\nimport com.istudio.app.modules.module_exercises.exercise_1.Exercise1\nimport com.istudio.app.modules.module_exercises.exercise_2.Exercise2\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.modules.module_selection.ModuleSelectionScreen\nimport com.istudio.app.ui.theme.KotlinConceptsTheme\nimport dagger.hilt.android.AndroidEntryPoint\n\n@AndroidEntryPoint\nclass MainActivity : ComponentActivity() {\n\n    private val viewModel: MainViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContent {\n            KotlinConceptsTheme {\n                Surface(\n                    modifier = Modifier.fillMaxSize(),\n                    color = MaterialTheme.colorScheme.background\n                ) {\n\n                    val navController = rememberNavController()\n\n                    NavHost(\n                        navController = navController,\n                        startDestination = ModuleDemo.DemoSelection.rout\n                    ) {\n                        // Selection Screen\n                        composable(ModuleDemo.DemoSelection.rout) {\n                            ModuleSelectionScreen(navController = navController)\n                        }\n                        // Kotlin basics Screen\n                        composable(ModuleDemo.KotlinBasicsDemo.rout) {\n                            KotlinBasicsDemo(navController = navController)\n                        }\n                        // Channel demo\n                        composable(ModuleDemo.ChannelsDemo.rout) {\n                            ChannelsDemo(navController = navController)\n                        }\n                        // Sealed Class demo\n                        composable(ModuleDemo.SealedClassDemo.rout) {\n                            SealedClassDemo(navController = navController)\n                        }\n                        // Higher Order functions demo\n                        composable(ModuleDemo.HigherOrderFunctions.rout) {\n                            HigherOrderFunctionDemo(navController = navController)\n                        }\n                        // Kotlin Annotations demo\n                        composable(ModuleDemo.AnnotationsInKotlin.rout) {\n                            KotlinAnnotationsDemo(navController = navController)\n                        }\n                        // Type Alias\n                        composable(ModuleDemo.TypeAlias.rout) {\n                            TypeAlias(navController = navController)\n                        }\n                        // Kotlin Flow Selection\n                        composable(ModuleDemo.FlowsSelection.rout) {\n                            FlowsDemo(navController = navController)\n                        }\n                        // Flow Basics\n                        composable(ModuleDemo.FlowBasics.rout) {\n                            FlowBasics(navController = navController)\n                        }\n                        // Display data from server\n                        composable(ModuleDemo.DisplayDataFromServer.rout) {\n                            DisplayDataFromServerDemo(navController = navController)\n                        }\n                        // Terminal Operators\n                        composable(ModuleDemo.TerminalOperators.rout) {\n                            TerminalOperators(navController = navController)\n                        }\n                        // Intermediate Operators\n                        composable(ModuleDemo.IntermediateOperators.rout) {\n                            IntermediateOperators(navController = navController)\n                        }\n                        // NestedVsInner Demo\n                        composable(ModuleDemo.NestedVsInner.rout) {\n                            NestedVsInner(navController = navController)\n                        }\n                        // Coroutines Demo\n                        composable(ModuleDemo.CoroutinesDemo.rout) {\n                            CoroutinesDemo(navController = navController)\n                        }\n                        // Simple structured concurrency\n                        composable(ModuleDemo.SimpleStructuredConcurrencyDemo.rout) {\n                            SimpleStructuredConcurrencyDemo(navController = navController)\n                        }\n                        // Dispatchers Demo\n                        composable(ModuleDemo.DispatchersDemo.rout) {\n                            DispatchersDemo(navController = navController)\n                        }\n                        // Exercises\n                        composable(ModuleDemo.Exercises.rout) {\n                            ExerciseSelection(navController = navController)\n                        }\n                        // Exercise-1\n                        composable(ModuleDemo.Exercise1.rout) {\n                            Exercise1(navController = navController)\n                        }\n                        // Exercise-2\n                        composable(ModuleDemo.Exercise2.rout) {\n                            Exercise2(navController = navController)\n                        }\n                        // Coroutine cancellation demo\n                        composable(ModuleDemo.CoroutinesCancellationSelection.rout) {\n                            CoroutinesCancellationSelection(navController = navController)\n                        }\n                        // CoRoutine cancellation selection\n                        composable(ModuleDemo.RootChildrenCancelDemo.rout) {\n                            RootChildrenCancelDemo(navController = navController)\n                        }\n                        // CoRoutine isActive Demo\n                        composable(ModuleDemo.CoroutinesCancellationIsActiveDemo.rout) {\n                            IsActiveDemo(navController = navController)\n                        }\n                        // CoRoutine EnsureActive Demo\n                        composable(ModuleDemo.EnsureActiveDemo.rout) {\n                            EnsureActiveDemo(navController = navController)\n                        }\n                        // CoRoutine NonCancellable Demo\n                        composable(ModuleDemo.NonCancellableDemo.rout) {\n                            NonCancellableDemo(navController = navController)\n                        }\n                        // Suspend and Launch demo\n                        composable(ModuleDemo.SuspendAndLaunchDemo.rout) {\n                            SuspendAndLaunchDemo(navController = navController)\n                        }\n                        // Launch And WithContext demo\n                        composable(ModuleDemo.LaunchAndWithContextDemo.rout) {\n                            LaunchAndWithContextDemo(navController = navController)\n                        }\n                        // Job Demo\n                        composable(ModuleDemo.JobDemoSelection.rout) {\n                            JobDemoSelection(navController = navController)\n                        }\n                        // Using Join Demo\n                        composable(ModuleDemo.UsingJoinDemo.rout) {\n                            UsingJoinDemo(navController = navController)\n                        }\n                        // Using Async Await Demo\n                        composable(ModuleDemo.UsingAsyncAwaitDemo.rout) {\n                            UsingAsyncAwaitDemo(navController = navController)\n                        }\n                        // Exception Handling Selection Demo\n                        composable(ModuleDemo.ExceptionHandlingSelectionDemo.rout) {\n                            ExceptionHandlingSelectionDemo(navController = navController)\n                        }\n\n                        // Using Launch Exception Handle Demo\n                        composable(ModuleDemo.UsingLaunchExceptionHandleDemo.rout) {\n                            UsingLaunchExceptionHandleDemo(navController = navController)\n                        }\n\n                        // Using Async Exception Handle Demo\n                        composable(ModuleDemo.UsingAsyncExceptionHandleDemo.rout) {\n                            UsingAsyncExceptionHandleDemo(navController = navController)\n                        }\n\n                        // Compose And Flatten Flows\n                        composable(ModuleDemo.ComposingAndFlatteningTheFlows.rout) {\n                            ComposeAndFlattenFlows(navController = navController)\n                        }\n\n                        // State And Shared Flows\n                        composable(ModuleDemo.StateAndSharedFlowDemo.rout) {\n                            StateAndSharedFlowDemo(navController = navController)\n                        }\n\n                        // Mutable state of flow demo\n                        composable(ModuleDemo.MutableStateOfFlowDemo.rout) {\n                            MutableStateOfFlowDemo(navController = navController)\n                        }\n\n                        // Flatten Flows\n                        composable(ModuleDemo.FlattenFlowsDemo.rout) {\n                            FlattenFlowsDemo(navController = navController)\n                        }\n                        // Compare Join Async Demo\n                        composable(ModuleDemo.CompareJoinAsyncDemo.rout) {\n                            CompareJoinAsyncDemo(navController = navController)\n                        }\n                        // Collect As Life Cycle Demo\n                        composable(ModuleDemo.CollectAsStateWithLifeCycle.rout) {\n                            CollectAsStateWithLifeCycleDemo(navController = navController)\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/main/MainViewModel.kt",
    "content": "package com.istudio.app.main\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MainViewModel @Inject constructor( ) : ViewModel() {\n\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/basic_fundamentals/ui/KotlinBasicsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.basic_fundamentals.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun KotlinBasicsDemo(navController: NavHostController) {\n\n    val viewModel: KotlinBasicsDemoVm = hiltViewModel()\n\n    val scrollState = rememberScrollState()\n\n    Column(\n        modifier = Modifier\n            .verticalScroll(state = scrollState)\n            .fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Strings in kotlin\", onClick = {\n            viewModel.stringsInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Comparison operators\", onClick = {\n            viewModel.comparisionOperators()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Large tree in conditions\", onClick = {\n            viewModel.largeTreeConditions()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Defining & using nullable\", onClick = {\n            viewModel.definingAndUsingNullable()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Pairs & Triplets\", onClick = {\n            viewModel.storingPairsAndTriplets()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Arrays in kotlin\", onClick = {\n            viewModel.arraysInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"List in kotlin\", onClick = {\n            viewModel.listInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Map in kotlin\", onClick = {\n            viewModel.mapInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Set in kotlin\", onClick = {\n            viewModel.setInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Custom Accessors\", onClick = {\n            viewModel.customAccessors()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Enum in kotlin\", onClick = {\n            viewModel.enumInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Members are private by default\", onClick = {\n            viewModel.membersPrivateDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Init block significance\", onClick = {\n            viewModel.initBlockSignificanceDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Constructors Demo\")\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Primary Constructor\", onClick = {\n            viewModel.primaryConstructorDemo()\n        })\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Secondary Constructor\", onClick = {\n            viewModel.secondaryConstructorDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Multiple Inheritance\")\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Multiple Inheritance In Kotlin\", onClick = {\n            viewModel.multipleInheritanceInKotlin()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/basic_fundamentals/ui/KotlinBasicsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.basic_fundamentals.ui\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.modules.module_demos.basic_fundamentals.utils.Student\nimport com.istudio.app.modules.module_demos.basic_fundamentals.utils.multipleInheritance.in_kotlin.KotlinImplementation\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n\n@HiltViewModel\nclass KotlinBasicsDemoVm  @Inject constructor( ) : ViewModel() {\n\n        /**\n     * Concatenating of strings\n     */\n    fun stringsInKotlin() {\n        // Assigning explicitly the data type and then setting a value to it\n        // This will always accept only the integer\n        var age : Int = 21\n        var firstName : String = \"Tony\"\n        // Kotlin can infer the values so that we need not have to explicitly mention them, Meaning datatype , we need not have to add\n        var lastName : String = \"Stark\"\n        println(\"My name is $firstName $lastName and I am $age years old scientist\")\n        // Appending the variables in the string is reformatting it is called string interpolation\n    }\n\n    /**\n     * Comparison Operators\n     */\n    fun comparisionOperators() {\n        val conditionCheck = 25 > 21\n        println(\"Condition Check Result:-> $conditionCheck\")\n\n        var firstValue = Student(\"Mahesh\",22)\n        var secondValue = Student(\"Mahesh\",22)\n\n        // DoubleEqual => Check if both variables are equal by value\n        val resultValueOne =  firstValue==secondValue\n        println(\"DoubleEqual:-> $resultValueOne\")// Result: true\n\n        // TripleEqual => Check if both variables are equal by reference\n        val resultValueTwo =  firstValue===secondValue\n        println(\"TripleEqual:-> $resultValueTwo\")// Result: false\n    }\n\n    /**\n     * Large tree conditions\n     */\n    fun largeTreeConditions() {\n        val input = \"Hello\"\n\n        // We explicitly specify that the output will be string\n        // if we does not specify and there can be possibility that value returned will be the value of input\n        val finalOutput : String = if( input == \"a\" ) {\n            \"a\"\n        } else if( input == \"b\" ){\n            \"b\"\n        } else if( input == \"c\" ){\n            \"c\"\n        } else{\n            \"Hello\"\n        }\n\n        println(\"Result:-> $finalOutput\")\n    }\n\n    /**\n     * Defining and using nullable values\n     */\n    fun definingAndUsingNullable() {\n        // If we need to assign a null value to a variable, We explicitly need to mention it\n        var name : String ? = null\n        println(name)   // This will print null\n        //name.length   // This will throw a compiler error referring, null check is needed\n        name = \"hello\"\n        println(name)   // We can re-assign a different value to a null variable\n        println(\"<-------------------------------------------->\")\n        // For forcing-ly to use a null value\n        var city : String ? = null\n        println(city!!.length) // This will crash since city is null here\n    }\n\n    /**\n     * Storing pairs and triplets\n     */\n    fun storingPairsAndTriplets() {\n        // Demo: Pair\n        val details : Pair<String,String> = Pair(\"Mahesh\",\"USA\")\n        val (name,city) = details;\n        println(\"Name:-> $name\")\n        println(\"City:-> $city\")\n        println(\"<-------------------------------------------->\")\n        // Demo: Triplets\n        val fullDetails : Triple<String,String,Int> = Triple(\"Mahesh\",\"USA\",21)\n        val (nameX,cityX,ageX) = fullDetails\n        println(\"Name:-> $nameX\")\n        println(\"City:-> $cityX\")\n        println(\"Age:-> $ageX\")\n        println(\"<-------------------------------------------->\")\n    }\n\n    /**\n     * Arrays in kotlin\n     */\n    fun arraysInKotlin() {\n        // Declaring the array\n        var listOfCities = listOf(\"Bangalore\",\"NewYork\",\"Tokyo\")\n        // This will print the address of the array\n        println(listOfCities)\n        // This will print the size of the array\n        println(listOfCities.size)\n        // This will access the element from a index\n        println(listOfCities[1])\n        // Check if the array has a particular element\n        println(listOfCities.contains(\"Bangalore\"))\n        // Another way to check if the element is present in the arrays\n        println(\"Bangalore\" in listOfCities)\n        // Getting the first element in the array\n        println(listOfCities.first())\n        // Getting the last element in the array\n        println(listOfCities.last())\n        // This will throw the error Index out of bound\n        println(listOfCities[-1])\n    }\n\n    /**\n     * List in kotlin\n     */\n    fun listInKotlin() {\n        // List of cities\n        var cityList = listOf(\"Bangalore\",\"Delhi\",\"Chennai\",\"Calcutta\")\n        // Not possible since its just a list and not a mutable list\n        // cityList.add()\n        // we can convert one list to another list\n        var mutableCityList = cityList.toMutableList()\n        // Since now its a mutable list, we can modify the list\n        mutableCityList.add(\"Texas\")\n        // We can directly add a element at a position also\n        mutableCityList.add(1,\"Colombo\")\n        // We can remove a element at a position from th elist\n        mutableCityList.removeAt(2)\n    }\n\n    /**\n     * Map in kotlin\n     */\n    fun mapInKotlin() {\n        val listOfCities = mapOf(\n            1 to \"Bangalore\",\n            2 to \"Mumbai\",\n            3 to \"Chennai\",\n        )\n        //listOfCities[1] = \"Shanghai\" // Not possible\n        println(listOfCities[1])\n        val listOfNames = mutableMapOf(\n            1 to \"Manish\",\n            2 to \"John\",\n            3 to \"Sam\",\n        )\n        listOfNames[4] = \"Anudeep\"\n        println(listOfNames[4])\n    }\n\n    /**\n     * Set in kotlin\n     */\n    fun setInKotlin() {\n        var students = setOf(\"Mahesh\",\"Suresh\",\"Venkatesh\",\"Mahesh\")\n        // students.add // Not possible\n        println(students)\n        var cities = mutableSetOf(\"bangalore\",\"Hassan\",\"Mumbai\")\n        cities.add(\"Colombo\")\n        println(students.contains(\"Colombo\"))\n    }\n\n    enum class DaysOfTheWeek { MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY }\n    enum class DaysOfTheWeekWithValues(val isWeekend: Boolean = false) {\n        MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY(isWeekend = true), SUNDAY(isWeekend = true);\n    }\n\n    /**\n     * Enum in kotlin\n     */\n    fun enumInKotlin() {\n        // Looping the enum values, And accessing the position\n        for(week in DaysOfTheWeek.values()){\n            println(\"$week at position ${week.ordinal}\")\n        }\n        // Looping the enum values, And accessing the position with default values\n        for (week in DaysOfTheWeekWithValues.values()){\n            // Ordinal helps in printing the position of the current enum class\n            println(\"Week-Name: $week -- at position -- ${week.ordinal} -- is weekend ${week.isWeekend}\")\n        }\n    }\n\n\n    // backing field\n    private var myProperty: Int = 0\n    // custom getter\n    private val customProperty: Int\n        get() {\n            println(\"Getting customProperty value\")\n            return myProperty\n        }\n\n    // custom setter\n    private var anotherProperty: String\n        get() {\n            println(\"Getting anotherProperty value\")\n            return \"Getter value\"\n        }\n        set(value) {\n            println(\"Setting anotherProperty value to $value\")\n        }\n    /**\n     * Having custom accessors\n     */\n    fun customAccessors() {\n        // Using the custom getter\n        println(customProperty) // Output: Getting customProperty value\n\n        // Using the custom setter\n        anotherProperty = \"New Value\"\n        println(anotherProperty) // Output: Setting anotherProperty value to New Value\n    }\n\n    /**\n     * Members are private by default\n     */\n    fun membersPrivateDemo() {\n        val person = Person(\"Donald\")\n        //person.name // Unresolved reference: name\n\n        val student = Student(\"Einstein\")\n        student.name // We can access the name variable\n    }\n\n    class Person(name: String)\n    class Student(val name: String)\n\n\n    /**\n     * Init block significance\n     */\n    fun initBlockSignificanceDemo() {\n        println(\"Before City Class construction\")\n        val demo = City(\"New York\")\n        println(\"After City Class construction\")\n        demo.demo()\n    }\n\n    class City(val name: String){\n        init {\n            println(\"City is created with Name:-> $name\")\n        }\n\n        fun demo(){\n            println(\"City construction is in progress\")\n        }\n    }\n\n\n    /**\n     * Primary constructor demo\n     */\n    fun primaryConstructorDemo() {\n        val science = Science()\n        val history = History()\n        // val maths = Maths() // Cannot access '<init>': it is private in 'Maths'\n    }\n\n    // Class with default constructor(way 1)\n    class Science()\n    // Class with default constructor(way 2)\n    class History constructor()\n    // Class with private constructor\n    class Maths private constructor()\n    // Class with protected constructor constructor\n    class Computers protected constructor()\n\n    /**\n     * Secondary constructor demo\n     */\n    fun secondaryConstructorDemo(){\n        val mechanical = Mechanical(name = \"CustomName\", noOfPages = 10)\n    }\n\n    class Mechanical(val name:String){\n        constructor(name: String, noOfPages:Int) : this(name)\n    }\n\n    /**\n     * Multiple Inheritance Alternatively using delegation\n     */\n    fun multipleInheritanceInKotlin(){\n        val kotlinImplementation = KotlinImplementation()\n        kotlinImplementation.methodA()\n        kotlinImplementation.methodB()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/basic_fundamentals/utils/Student.kt",
    "content": "package com.istudio.app.modules.module_demos.basic_fundamentals.utils\n\ndata class Student(val name : String , val age : Int)\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/basic_fundamentals/utils/multipleInheritance/in_java/InJava.java",
    "content": "package com.istudio.app.modules.module_demos.basic_fundamentals.utils.multipleInheritance.in_java;\n\n\npublic class InJava implements Sony,Samsung{\n    @Override\n    public void content() {\n        System.out.println(\"Television content\");\n    }\n\n    @Override\n    public void methodSonyName() {\n        System.out.println(\"Sony name\");\n    }\n\n    @Override\n    public void methodSamsungName() {\n        System.out.println(\"Samsung name\");\n    }\n}\n\n\ninterface Telivision{\n    void content();\n}\n\ninterface Sony extends Telivision{\n    void methodSonyName();\n}\n\ninterface Samsung extends Telivision{\n    void methodSamsungName();\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/basic_fundamentals/utils/multipleInheritance/in_kotlin/InKotlin.kt",
    "content": "package com.istudio.app.modules.module_demos.basic_fundamentals.utils.multipleInheritance.in_kotlin\n\nclass KotlinImplementation : KotlinInterfaceA, KotlinInterfaceB {\n\n    private val implementationA = ClassA()\n    private val implementationB = ClassB()\n\n    override fun methodA() {\n        implementationA.methodA()\n    }\n\n    override fun methodB() {\n        implementationB.methodB()\n    }\n\n}\n\ninterface KotlinInterfaceA {\n    fun methodA()\n}\n\ninterface KotlinInterfaceB {\n    fun methodB()\n}\n\nclass ClassA : KotlinInterfaceA {\n    override fun methodA() {\n        println(\"Implementation of methodA from ClassA\")\n    }\n\n}\n\nclass ClassB : KotlinInterfaceB {\n    override fun methodB() {\n        println(\"Implementation of methodB from ClassB\")\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/channels/ChannelsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.channels\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun ChannelsDemo(navController: NavHostController) {\n\n    val viewModel: ChannelsDemoVm = hiltViewModel()\n\n    val scrollState = rememberScrollState()\n\n    Column(\n        modifier = Modifier\n            .verticalScroll(state = scrollState)\n            .fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        // <! ------------------- COMMUNICATING BETWEEN COROUTINES ------------------->\n        AppText(text = \"Basics\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Simple Communication\", onClick = {\n            viewModel.simpleCommunication()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Sending/Receiving multiple values\", onClick = {\n            viewModel.sendingMultipleValues()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Canceling a channel\", onClick = {\n            viewModel.cancellingChannel()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Closing a channel\", onClick = {\n            viewModel.closingChannel()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Using Produce\", onClick = {\n            viewModel.usingProduce()\n        })\n        Spacer(modifier = Modifier.height(20.dp))\n        // <! ------------------- COMMUNICATING BETWEEN COROUTINES ------------------->\n\n        // <! ------------------- USING CHANNELS - BUFFERED -------------------------->\n        AppText(text = \"Channel Types\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Channel - Buffered\", onClick = {\n            viewModel.usingBuffered()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Channel - Conflated\", onClick = {\n            viewModel.usingConflated()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Channel - Rendezvous\", onClick = {\n            viewModel.usingRendezvous()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"Channel - Unlimited\", onClick = {\n            viewModel.usingUnlimited()\n        })\n        // <! ------------------- USING CHANNELS - BUFFERED -------------------------->\n        AppText(text = \"Types of communication\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"1-1 --> Communication\", onClick = {\n\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"1-n --> Communication\", onClick = {\n            viewModel.usingOneToMany()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"n-1 --> Communication\", onClick = {\n            viewModel.usingManyToOne()\n        })\n        Spacer(modifier = Modifier.height(16.dp))\n        AppButton(text = \"n-n --> Communication\", onClick = {\n\n        })\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/channels/ChannelsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.channels\n\nimport android.widget.TextView.BufferType\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.channels.Channel.Factory.CONFLATED\nimport kotlinx.coroutines.channels.Channel.Factory.UNLIMITED\nimport kotlinx.coroutines.channels.ReceiveChannel\nimport kotlinx.coroutines.channels.consumeEach\nimport kotlinx.coroutines.channels.produce\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.launch\nimport java.lang.Exception\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ChannelsDemoVm @Inject constructor( ) : ViewModel() {\n\n    // <! ------------------- COMMUNICATING BETWEEN COROUTINES ------------------->\n    // A channel of languages\n    private var languageChannel = Channel<Languages>()\n\n    /**\n     * Sending and receiving only one value\n     */\n    fun simpleCommunication() {\n\n        // Co-Routine - 1\n        viewModelScope.launch {\n            languageChannel.send(Languages.English)\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            println(languageChannel.receive())\n        }\n\n    }\n\n    /**\n     * Sending and receiving multiple values\n     */\n    fun sendingMultipleValues() {\n\n        // Co-Routine - 1\n        viewModelScope.launch {\n            languageChannel.send(Languages.English)\n            languageChannel.send(Languages.Hindi)\n            languageChannel.send(Languages.French)\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            languageChannel.consumeEach {\n                println(languageChannel.receive())\n            }\n        }\n\n    }\n\n\n    /**\n     * Canceling a channel\n     */\n    fun cancellingChannel() {\n\n        // Co-Routine - 1\n        viewModelScope.launch {\n            println(\"Sending value - 1\")\n            languageChannel.send(Languages.English)\n            println(\"Sending value - 2\")\n            languageChannel.send(Languages.Hindi)\n            println(\"Sending value - 3\")\n            languageChannel.send(Languages.French)\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            try {\n                println(languageChannel.receive())\n                languageChannel.cancel(CancellationException(\"Custom Exception\"))\n                println(languageChannel.receive())\n                println(languageChannel.receive())\n            }catch (ex : Exception){\n                println(ex.message)\n                println(\"Is it closed for Send: -> \"+languageChannel.isClosedForSend)\n                println(\"Is it closed for Receive: -> \"+languageChannel.isClosedForReceive)\n            }\n        }\n\n    }\n\n\n    /**\n     * Closing a channel\n     */\n    fun closingChannel() {\n\n        // Co-Routine - 1\n        viewModelScope.launch {\n            languageChannel.send(Languages.English)\n            languageChannel.close()\n            languageChannel.send(Languages.Hindi)\n            languageChannel.send(Languages.French)\n\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            languageChannel.consumeEach {\n                println(languageChannel.receive())\n            }\n        }\n\n    }\n\n    enum class Languages { English , Hindi , French }\n\n    // <! ------------------- COMMUNICATING BETWEEN COROUTINES ------------------->\n\n\n    // <! ------------------- USING PRODUCE IN CHANNELS -------------------------->\n\n    private var receiveChannel : ReceiveChannel<Superheroes> = Channel()\n\n    fun usingProduce() {\n\n        // Co-Routine - 1\n        viewModelScope.launch {\n            receiveChannel = produce {\n                send(Superheroes.Batman)\n                send(Superheroes.Superman)\n                send(Superheroes.Spiderman)\n            }\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            println(\"Is closed to receive -->\"+ receiveChannel.isClosedForReceive)\n            receiveChannel.consumeEach { superHero ->\n                println(superHero)\n            }\n            println(\"Is closed to receive -->\"+ receiveChannel.isClosedForReceive)\n        }\n\n    }\n\n    enum class Superheroes { Batman , Superman , Spiderman }\n    // <! ------------------- USING PRODUCE IN CHANNELS -------------------------->\n\n\n    // <! ------------------- USING CHANNELS - BUFFERED -------------------------->\n    private var receiveBufferChannel : ReceiveChannel<Countries> = Channel()\n\n    fun usingBuffered() {\n        // Co-Routine - 1\n        viewModelScope.launch {\n\n            // We are limiting the buffer capacity to 2\n            receiveBufferChannel = produce(capacity = 2) {\n                    println(\"Send Action : ----> USA\")\n                    send(Countries.USA)\n                    println(\"Send Action : ----> Russia\")\n                    send(Countries.Russia)\n                    println(\"Send Action : ----> India\")\n                    send(Countries.India)\n                    println(\"Send Action : ----> France\")\n                    send(Countries.France)\n                    println(\"Send Action : ----> Spain\")\n                    send(Countries.Spain)\n                    println(\"Send Action : ----> Germany\")\n                    send(Countries.Germany)\n                    println(\"Send Action : ----> Italy\")\n                    send(Countries.Italy)\n            }\n\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            receiveBufferChannel.consumeEach { countries ->\n                println(\"Receive Action : ----> $countries\")\n                println(\"---------------------------------\")\n            }\n        }\n    }\n\n    enum class Countries { USA , Russia , India , France , Spain , Germany , Italy }\n\n    // <! ------------------- USING CHANNELS - BUFFERED -------------------------->\n\n    // <! ------------------- USING CHANNELS - CONFLATED-------------------------->\n    private var receiveConflatedChannel : ReceiveChannel<Birds> = Channel()\n\n    fun usingConflated() {\n        // Co-Routine - 1\n        viewModelScope.launch {\n\n            receiveConflatedChannel = produce(capacity = CONFLATED) {\n                send(Birds.Eagle)\n                send(Birds.Peacock)\n                send(Birds.Robin)\n                send(Birds.Ostrich)\n                send(Birds.Pigeon)\n                send(Birds.Kingfisher)\n                send(Birds.Dodo)\n            }\n\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            receiveConflatedChannel.consumeEach { birds ->\n                println(\"BIRD : ----> $birds\")\n            }\n        }\n    }\n\n    enum class Birds { Eagle , Peacock , Robin , Ostrich , Pigeon , Kingfisher , Dodo }\n\n    // <! ------------------- USING CHANNELS - CONFLATED-------------------------->\n\n    // <! ------------------- USING CHANNELS - RENDEZVOUS-------------------------->\n    private var receiveRendezvousChannel : ReceiveChannel<Cars> = Channel()\n\n    fun usingRendezvous() {\n        // Co-Routine - 1\n        viewModelScope.launch {\n\n            receiveRendezvousChannel = produce {\n                println(\"SENT : ----> ${Cars.Maruthi}\")\n                send(Cars.Maruthi)\n                println(\"SENT : ----> ${Cars.BMW}\")\n                send(Cars.BMW)\n                println(\"SENT : ----> ${Cars.Tesla}\")\n                send(Cars.Tesla)\n                println(\"SENT : ----> ${Cars.Byd}\")\n                send(Cars.Byd)\n                println(\"SENT : ----> ${Cars.TATA}\")\n                send(Cars.TATA)\n                println(\"SENT : ----> ${Cars.Ferrari}\")\n                send(Cars.Ferrari)\n                println(\"SENT : ----> ${Cars.Porshe}\")\n                send(Cars.Porshe)\n            }\n\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            println(\"CAR : ----> ${receiveRendezvousChannel.receive()}\")\n            println(\"CAR : ----> ${receiveRendezvousChannel.receive()}\")\n            println(\"CAR : ----> ${receiveRendezvousChannel.receive()}\")\n        }\n    }\n\n    enum class Cars { Maruthi , BMW , Tesla , Byd , TATA , Ferrari , Porshe }\n\n    // <! ------------------- USING CHANNELS - RENDEZVOUS-------------------------->\n\n    // <! ------------------- USING CHANNELS - RENDEZVOUS-------------------------->\n    private var receiveUnlimitedChannel : ReceiveChannel<Cars> = Channel()\n\n    fun usingUnlimited() {\n        // Co-Routine - 1\n        viewModelScope.launch {\n\n            receiveUnlimitedChannel = produce(capacity = UNLIMITED) {\n                println(\"SENT : ----> ${Cars.Maruthi}\")\n                send(Cars.Maruthi)\n                println(\"SENT : ----> ${Cars.BMW}\")\n                send(Cars.BMW)\n                println(\"SENT : ----> ${Cars.Tesla}\")\n                send(Cars.Tesla)\n                println(\"SENT : ----> ${Cars.Byd}\")\n                send(Cars.Byd)\n                println(\"SENT : ----> ${Cars.TATA}\")\n                send(Cars.TATA)\n                println(\"SENT : ----> ${Cars.Ferrari}\")\n                send(Cars.Ferrari)\n                println(\"SENT : ----> ${Cars.Porshe}\")\n                send(Cars.Porshe)\n            }\n\n        }\n\n        // Co-Routine - 2\n        viewModelScope.launch {\n            println(\"CAR : ----> ${receiveUnlimitedChannel.receive()}\")\n            println(\"CAR : ----> ${receiveUnlimitedChannel.receive()}\")\n            println(\"CAR : ----> ${receiveUnlimitedChannel.receive()}\")\n        }\n    }\n    // <! ------------------- USING CHANNELS - UNLIMITED-------------------------->\n\n    // <! ------------------- 1-N - COMMUNICATION--------------------------------->\n    private var one_to_n_channel : ReceiveChannel<Int> = Channel()\n\n    fun usingOneToMany() {\n       viewModelScope.launch {\n           // Producer -1\n           one_to_n_channel = produce(capacity = UNLIMITED){\n               repeat(10){ currentValue -> send(currentValue) }\n           }\n       }\n\n      viewModelScope.launch {\n          // Coroutine - 1\n          viewModelScope.launch {\n              // Consumer - 1\n              one_to_n_channel.consumeEach {\n                  println(\"Consumer-1 <-> (1-n) : ----> $it\")\n                  delay(300)\n              }\n          }\n\n          // Coroutine - 2\n          viewModelScope.launch {\n              // Consumer - 2\n              one_to_n_channel.consumeEach {\n                  println(\"Consumer-2 <-> (1-n) : ----> $it\")\n                  delay(100)\n              }\n          }\n          // Coroutine - 3\n          viewModelScope.launch {\n              // Consumer - 3\n              one_to_n_channel.consumeEach {\n                  println(\"Consumer-3 <-> (1-n) : ----> $it\")\n                  delay(150)\n              }\n          }\n      }\n    }\n    // <! ------------------- 1-N - COMMUNICATION--------------------------------->\n\n    // <! ------------------- N-1 - COMMUNICATION--------------------------------->\n    private var n_to_one_channel : Channel<String> = Channel()\n\n    fun usingManyToOne() {\n        viewModelScope.launch {\n            // Producer -1\n            val firstProducer = viewModelScope.async {\n                repeat(3){ currentValue ->\n                    n_to_one_channel.send(\"FromProducer-1 $currentValue\")\n                    delay(150)\n                }\n            }\n            // Producer -2\n            val secondProducer = viewModelScope.async {\n                repeat(3){ currentValue ->\n                    n_to_one_channel.send(\"FromProducer-2 $currentValue\")\n                    delay(100)\n                }\n            }\n            awaitAll(secondProducer,firstProducer)\n        }\n\n\n        // Consumer-1\n        viewModelScope.launch {\n            n_to_one_channel.consumeEach {\n                println(\"Consumer <-> (N-1) : ----> $it\")\n            }\n        }\n    }\n    // <! ------------------- N-1 - COMMUNICATION--------------------------------->\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/CoroutinesDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun CoroutinesDemo(navController: NavController){\n\n    val viewModel: CoroutinesDemoVm = hiltViewModel()\n    val scrollState = rememberScrollState()\n\n    Column(\n        modifier = Modifier.fillMaxSize() .verticalScroll(state = scrollState),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Create a Coroutine scope\", onClick = {\n            viewModel.createCoroutineScopeDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Wait for coroutine to finish\", onClick = {\n            viewModel.waitForCoRoutineToFinish()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Sequential coroutines\", onClick = {\n            viewModel.sequentialCoroutiens()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Scope and context relationship\", onClick = {\n            viewModel.scopeAndContextRelationshipDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Simple structured concurrency\", onClick = {\n            navController.navigate(ModuleDemo.SimpleStructuredConcurrencyDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Dispatchers Demo\", onClick = {\n            navController.navigate(ModuleDemo.DispatchersDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Coroutine Cancellation Demos\", onClick = {\n            navController.navigate(ModuleDemo.CoroutinesCancellationSelection.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Suspend And Launch Demo\", onClick = {\n            navController.navigate(ModuleDemo.SuspendAndLaunchDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Launch and with context demo\", onClick = {\n            navController.navigate(ModuleDemo.LaunchAndWithContextDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Job Demos\", onClick = {\n            navController.navigate(ModuleDemo.JobDemoSelection.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Using Join Demo\", onClick = {\n            navController.navigate(ModuleDemo.UsingJoinDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Using Async Await Demo\", onClick = {\n            navController.navigate(ModuleDemo.UsingAsyncAwaitDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Compare Join Async Demo\", onClick = {\n            navController.navigate(ModuleDemo.CompareJoinAsyncDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Exception Handling Selection\", onClick = {\n            navController.navigate(ModuleDemo.ExceptionHandlingSelectionDemo.rout)\n        })\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/CoroutinesDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines\n\nimport android.app.Application\nimport androidx.lifecycle.AndroidViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.EmptyCoroutineContext\n\n@HiltViewModel\nclass CoroutinesDemoVm @Inject constructor(val context: Application) : AndroidViewModel(context) {\n\n\n    /**\n     *  **************** DEMO: Create a coroutine scope ****************\n     */\n    fun createCoroutineScopeDemo() {\n        println(\"Before the scope\")\n        CoroutineScope(context = prepareContext()).launch {\n\n            val name = coroutineContext[CoroutineName]?.name\n\n            println(\"$name:-> Before the delay\")\n            delay(1000)\n            println(\"$name:-> After the delay\")\n        }\n        println(\"After the scope\")\n    }\n\n    private fun prepareContext(): CoroutineContext {\n        val context = EmptyCoroutineContext\n        val name = \"MyCoroutine\"\n        val job = Job()\n        val exceptionHandler = CoroutineExceptionHandler{ _ , throwable ->\n            println(\"Error in coroutine: $throwable\")\n        }\n        val dispatcher = Dispatchers.Default\n\n      return (context + job + CoroutineName(name) + dispatcher + exceptionHandler)\n    }\n    /**\n     * **************** DEMO: Create a coroutine scope ****************\n     */\n\n\n    /**\n     *  **************** DEMO: Wait for coroutine to finish ****************\n     */\n    fun waitForCoRoutineToFinish() {\n        //println(\"Before the view model scope\")\n        viewModelScope.launch {\n            println(\"Before the coroutine scope\") // - 1\n            CoroutineScope(EmptyCoroutineContext).launch {\n                println(\"Before the delay\") // - 2\n                delay(1000)\n                println(\"After the delay\") // - 3\n            }.join()\n            println(\"After the coroutine scope\") // - 4\n        }\n        //println(\"After the view model scope\")\n    }\n    /**\n     * ****************  DEMO: Wait for coroutine to finish ****************\n     */\n\n    /**\n     * ****************  DEMO: Sequential coroutines ***********************\n     */\n    fun sequentialCoroutiens() {\n        viewModelScope.launch {\n            println(\"JOB-1: Before the coroutine scope\")\n            CoroutineScope(EmptyCoroutineContext).launch {\n                println(\"JOB-1: ----> Before the delay\")\n                delay(1000)\n                println(\"JOB-1: ----> After the delay\")\n            }.join()\n            println(\"JOB-1: After the coroutine scope\")\n            println(\"---------------------------------\")\n            println(\"JOB-2: Before the coroutine scope\")\n            CoroutineScope(EmptyCoroutineContext).launch {\n                println(\"JOB-2: ----> Before the delay\")\n                delay(1000)\n                println(\"JOB-2: ----> After the delay\")\n            }.join()\n            println(\"JOB-2: After the coroutine scope\")\n        }\n    }\n    /**\n     * ****************  DEMO: Sequential coroutines ***********************\n     */\n\n    /**\n     * ****************  DEMO: Scope And Context Relationship **************\n     */\n    fun scopeAndContextRelationshipDemo() {\n\n        viewModelScope.launch(CoroutineName(\"Pikachuu\")) {\n\n            val name = coroutineContext[CoroutineName]?.name\n            println(\"OuterMostCoroutine:-> $name\")\n\n            launch {\n\n                val name = coroutineContext[CoroutineName]?.name\n                println(\"InnerCoroutine1:-> $name\")\n\n                launch {\n\n                    val name = coroutineContext[CoroutineName]?.name\n                    println(\"InnermostCoroutine1:-> $name\")\n\n                }.join()\n\n            }.join()\n\n            launch {\n\n                val name = coroutineContext[CoroutineName]?.name\n                println(\"InnerCoroutine2:-> $name\")\n\n                launch(CoroutineName(\"Goku \")) {\n\n                    val name = coroutineContext[CoroutineName]?.name\n                    println(\"InnermostCoroutine2:-> $name\")\n\n                }.join()\n\n            }.join()\n\n        }\n\n    }\n    /**\n     * ****************  DEMO: Scope And Context Relationship **************\n     */\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/compare_join_and_async/CompareJoinAsyncDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.compare_join_and_async\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun CompareJoinAsyncDemo(navController: NavHostController) {\n\n    val viewModel: CompareJoinAsyncDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Join Demo\") {\n            viewModel.joinDemo()\n        }\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Async Demo\") {\n            viewModel.asyncDemo()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Cancel-Root\") {\n            viewModel.rootCancel()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/compare_join_and_async/CompareJoinAsyncDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.compare_join_and_async\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\nclass CompareJoinAsyncDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    fun joinDemo() {\n        try {\n            ourScope.launch(CoroutineName(\"GrandParent\")) {\n                try {\n\n                    println(\"Before calling Join\")\n\n                    parent1Block().join()\n\n                    println(\"After calling Join\")\n                }catch (ex:Exception){\n                    println(\"Exception caught inside GrandParent scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"GrandParent invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside GrandParent scope\")\n        }\n    }\n\n    fun asyncDemo() {\n        try {\n            ourScope.launch(CoroutineName(\"GrandParent\")) {\n                try {\n\n                    println(\"Before calling Async\")\n\n                    parent2Block().await()\n\n                    println(\"After calling Async\")\n                }catch (ex:Exception){\n                    println(\"Exception caught inside GrandParent scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"GrandParent invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside GrandParent scope\")\n        }\n    }\n\n\n    private suspend fun parent1Block() = ourScope.launch(CoroutineName(\"Parent-1\")) {\n        try {\n            repeat(10){\n                println(\"Parent-1 ----- tick ----->$it\")\n                delay(1000)\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught inside Parent-1 coroutine\")\n        }\n    }\n\n\n    private suspend fun parent2Block() = ourScope.async (CoroutineName(\"Parent-2\")) {\n        try {\n            repeat(10){\n                println(\"Parent-1 ----- tick ----->$it\")\n                delay(1000)\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught inside Parent-1 coroutine\")\n        }\n    }\n\n\n    fun rootCancel() {\n        scopeJob?.cancel()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/CoroutinesCancellationSelection.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.navigation.NavController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun CoroutinesCancellationSelection(navController: NavController){\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Root Children Cancel Demo\", onClick = {\n            navController.navigate(ModuleDemo.RootChildrenCancelDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Is Active Demo\", onClick = {\n            navController.navigate(ModuleDemo.CoroutinesCancellationIsActiveDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Ensure Active Demo\", onClick = {\n            navController.navigate(ModuleDemo.EnsureActiveDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Non Cancellable Job\", onClick = {\n            navController.navigate(ModuleDemo.NonCancellableDemo.rout)\n        })\n\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/ensure_active_demo/EnsureActiveDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.ensure_active_demo\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun EnsureActiveDemo(navController: NavHostController){\n\n    val viewModel: EnsureActiveDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start \\n with Thread-Sleep\") {\n            viewModel.startWithThreadSleep()\n        }\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        Button(\n            modifier = Modifier\n                .background(\n                    color = MaterialTheme.colorScheme.primary,\n                    shape = RectangleShape\n                ),\n            onClick = {\n                viewModel.cancel()\n            }\n        ) {\n            Text(text = \"Cancel\")\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/ensure_active_demo/EnsureActiveDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.ensure_active_demo\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.currentCoroutineContext\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.ensureActive\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.cancellation.CancellationException\n\nclass EnsureActiveDemoVm @Inject constructor( ) : ViewModel() {\n\n    private var job: Job? = null\n\n\n    fun startWithThreadSleep() {\n        job = CoroutineScope(Dispatchers.Default).launch {\n            startSuspendWithThreadSleep()\n        }\n    }\n\n    private suspend fun startSuspendWithThreadSleep() {\n        try {\n\n            repeat(10) { index ->\n                currentCoroutineContext().ensureActive()\n                // Simulate some work\n                Thread.sleep(500)\n\n                // Check if the coroutine has been canceled\n                if (!currentCoroutineContext().isActive) {\n                    println(\"Coroutine canceled at index $index\")\n                }\n                // Continue with the main logic\n                println(\"Working at index $index\")\n            }\n            // Additional logic after the loop\n            println(\"Coroutine completed\")\n        } catch (e: CancellationException) {\n            // Handle cancellation-specific tasks\n            println(\"Coroutine canceled\")\n        }\n    }\n\n    fun cancel(){\n        job?.cancel()\n    }\n\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/is_active_demo/IsActiveDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.is_active_demo\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun IsActiveDemo(navController: NavHostController){\n\n    val viewModel: IsActiveDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start \\n with Thread-Sleep\") {\n            viewModel.startWithTreadSleep()\n        }\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Start \\n with Thread-Delay\") {\n            viewModel.startWithDelay()\n        }\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        Button(\n            modifier = Modifier\n                .background(\n                    color = MaterialTheme.colorScheme.primary,\n                    shape = RectangleShape\n                ),\n            onClick = {\n                viewModel.cancel()\n            }\n        ) {\n            Text(text = \"Cancel\")\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/is_active_demo/IsActiveDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.is_active_demo\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.cancelChildren\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\nimport kotlin.coroutines.cancellation.CancellationException\n\nclass IsActiveDemoVm @Inject constructor( ) : ViewModel() {\n\n    private var job: Job? = null\n\n\n    fun startWithTreadSleep() {\n\n        // Start a coroutine\n        job = CoroutineScope(Dispatchers.Default).launch {\n            try {\n                repeat(5000) { index ->\n                    // Simulate some work\n                    Thread.sleep(500)\n\n                    // Check if the coroutine has been canceled\n                    if (!isActive) {\n                        println(\"Coroutine canceled at index $index\")\n                        return@launch\n                    }\n                    // Continue with the main logic\n                    println(\"Working at index $index\")\n                }\n                // Additional logic after the loop\n                println(\"Coroutine completed\")\n            } catch (e: CancellationException) {\n                // Handle cancellation-specific tasks\n                println(\"Coroutine canceled\")\n            }\n        }\n    }\n\n\n    fun startWithDelay() {\n\n        // Start a coroutine\n        job = CoroutineScope(Dispatchers.Default).launch {\n            try {\n                repeat(5000) { index ->\n                    // Simulate some work\n                    delay(500)\n\n                    // Check if the coroutine has been canceled\n                    if (!isActive) {\n                        println(\"Coroutine canceled at index $index\")\n                        return@launch\n                    }\n                    // Continue with the main logic\n                    println(\"Working at index $index\")\n                }\n                // Additional logic after the loop\n                println(\"Coroutine completed\")\n            } catch (e: CancellationException) {\n                // Handle cancellation-specific tasks\n                println(\"Coroutine canceled\")\n            }\n        }\n    }\n\n    fun cancel(){\n        job?.cancel()\n    }\n\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/non_cancellable_job/NonCancellableDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.non_cancellable_job\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun NonCancellableDemo(navController: NavHostController){\n\n    val viewModel: NonCancellableDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start \\n with Thread-Sleep\") {\n            viewModel.startWithTreadSleep()\n        }\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        Button(\n            modifier = Modifier\n                .background(\n                    color = MaterialTheme.colorScheme.primary,\n                    shape = RectangleShape\n                ),\n            onClick = {\n                viewModel.cancel()\n            }\n        ) {\n            Text(text = \"Cancel\")\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/non_cancellable_job/NonCancellableDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.non_cancellable_job\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.NonCancellable\nimport kotlinx.coroutines.ensureActive\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\nimport kotlin.coroutines.cancellation.CancellationException\nimport kotlin.coroutines.coroutineContext\n\nclass NonCancellableDemoVm @Inject constructor( ) : ViewModel() {\n\n    private var job: Job? = null\n\n\n    fun startWithTreadSleep() {\n\n        // Start a coroutine\n        job = CoroutineScope(Dispatchers.Default ).launch {\n            coRoutineOne(1)\n            coRoutineOne(2)\n        }\n    }\n\n    private suspend fun coRoutineOne(coroutineNo: Int) {\n        withContext(NonCancellable){\n            try {\n                repeat(100) { index ->\n                    //coroutineContext.ensureActive()\n\n                    // Simulate some work\n                    Thread.sleep(500)\n\n                    // Check if the coroutine has been canceled\n                    if (!kotlin.coroutines.coroutineContext.isActive) {\n                        println(\"Coroutine-No:$coroutineNo canceled at index $index\")\n                    }else{\n                        // Continue with the main logic\n                        println(\"Coroutine-No:$coroutineNo Working at index $index\")\n                    }\n                }\n                // Additional logic after the loop\n                println(\"Coroutine-No:$coroutineNo completed\")\n            }\n            catch (e: CancellationException) {\n                // Handle cancellation-specific tasks\n                println(\"Coroutine-No:$coroutineNo canceled\")\n            }\n        }\n    }\n\n    fun cancel(){\n        job?.cancel()\n    }\n\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/root_children_cencel_demo/RootChildrenCancelDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.root_children_cencel_demo\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun RootChildrenCancelDemo(navController: NavHostController){\n\n    val viewModel: RootChildrenCancelDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        AppText(text = \"CoRoutine Functionalities\")\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start\") {\n            viewModel.start()\n        }\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 5.dp),\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.SpaceEvenly\n        ) {\n            Button(\n                modifier = Modifier\n                    .weight(1f)\n                    .background(\n                        color = MaterialTheme.colorScheme.primary,\n                        shape = RectangleShape\n                    ),\n                onClick = {\n                    viewModel.cancelRoot()\n                }\n            ) {\n                Text(text = \"Cancel-Root\")\n            }\n            Spacer(modifier = Modifier.width(5.dp))\n            Button(\n                modifier = Modifier\n                    .weight(1f)\n                    .background(\n                        color = MaterialTheme.colorScheme.primary,\n                        shape = RectangleShape\n                    ),\n                onClick = {\n                    viewModel.cancelChildren()\n                }\n            ) {\n                Text(text = \"Cancel-Children\")\n            }\n        }\n\n\n\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/coroutine_cancellation/root_children_cencel_demo/RootChildrenCancelDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.coroutine_cancellation.root_children_cencel_demo\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.cancelChildren\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\n\nclass RootChildrenCancelDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val rootScope =  CoroutineScope(Dispatchers.Default)\n\n    fun start() {\n        rootScope.launch {\n            longRunningOperation()\n        }.invokeOnCompletion {\n            it?.let {\n                val message = it?.message\n                println(\"Exception thrown:-> $message\")\n            }?:run {\n                println(\"Scope completed without exception\")\n            }\n        }\n    }\n\n    fun cancelRoot(){\n        rootScope.cancel()\n    }\n\n    fun cancelChildren(){\n        rootScope.coroutineContext.cancelChildren()\n    }\n\n    private suspend fun longRunningOperation() = withContext(Dispatchers.Default){\n\n        for (i in 1..30){\n            println(\"Current count $i\")\n            delay(1000)\n        }\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/dispatchers/DispatchersDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.dispatchers\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun DispatchersDemo(navController: NavHostController) {\n\n    val viewModel: DispatchersDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/dispatchers/DispatchersDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.dispatchers\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport java.util.concurrent.CancellationException\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\n\nclass DispatchersDemoVm @Inject constructor( ) : ViewModel() {\n\n    // Create a root co-routine scope\n    private val rootScope =  CoroutineScope(EmptyCoroutineContext)\n\n\n    fun demo() {\n\n        rootScope.launch() {\n            println(\"Empty co-routine-context Executes on thread -> ${Thread.currentThread().name}\")\n        }\n\n        viewModelScope.launch {\n            println(\"View-model-scope executes onExecutes on thread -> ${Thread.currentThread().name}\")\n        }\n\n        viewModelScope.launch(Dispatchers.Main) {\n            println(\"View-model-scope + Main, executes onExecutes on thread -> ${Thread.currentThread().name}\")\n        }\n\n        viewModelScope.launch(Dispatchers.Default) {\n            println(\"View-model-scope + Default, executes onExecutes on thread -> ${Thread.currentThread().name}\")\n        }\n\n        viewModelScope.launch(Dispatchers.IO) {\n            println(\"View-model-scope + IO, executes onExecutes on thread -> ${Thread.currentThread().name}\")\n        }\n\n        rootScope.launch {\n            viewModelScope.launch(Dispatchers.Unconfined) {\n                println(\"View-model-scope + Unconfined, executes onExecutes on thread -> ${Thread.currentThread().name}\")\n            }\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/exception_handeling/ExceptionHandlingSelectionDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.exception_handeling\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun ExceptionHandlingSelectionDemo(navController: NavHostController) {\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Using Launch\") {\n            navController.navigate(ModuleDemo.UsingLaunchExceptionHandleDemo.rout)\n\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Using Async\") {\n            navController.navigate(ModuleDemo.UsingAsyncExceptionHandleDemo.rout)\n\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/exception_handeling/using_async/UsingAsyncExceptionHandleDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_async\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun UsingAsyncExceptionHandleDemo(navController: NavHostController) {\n\n    val viewModel: UsingAsyncExceptionHandleDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/exception_handeling/using_async/UsingAsyncExceptionHandleDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_async\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\nclass UsingAsyncExceptionHandleDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    // <----------------------->   Using Exception Handler   <------------------->\n    fun demo() {\n\n        val handler = CoroutineExceptionHandler { _, exception ->\n            println(\"Caught an exception: $exception\")\n        }\n        viewModelScope.launch {\n            val deferredResult = async(handler) {\n                // Call the function that performs the asynchronous task\n                performAsyncTask()\n            }\n\n            try {\n                // Wait for the result of the async task\n                val result = deferredResult.await()\n                println(\"Async task result: $result\")\n            } catch (e: Exception) {\n                // Exception will be caught by the exception handler\n                println(\"Exception caught in main: $e\")\n            }\n        }\n    }\n\n    private suspend fun performAsyncTask(): String {\n        // Simulate some asynchronous work\n        delay(1000)\n\n        // Simulate an exception\n        throw RuntimeException(\"Simulated exception in async task\")\n    }\n    // <----------------------->   Using Exception Handler   <------------------->\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/exception_handeling/using_launch/UsingLaunchExceptionHandleDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_launch\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun UsingLaunchExceptionHandleDemo(navController: NavHostController) {\n\n    val viewModel: UsingLaunchExceptionHandleDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"No Exception Handler\") {\n            viewModel.demo1()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Catch locally using try catch\") {\n            viewModel.demo2()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Try to catch on external catch\") {\n            viewModel.demo3()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Using Exception Handler\") {\n            viewModel.demo4()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/exception_handeling/using_launch/UsingLaunchExceptionHandleDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.exception_handeling.using_launch\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\nclass UsingLaunchExceptionHandleDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    // <----------------------->   No Exception Handler   <----------------------->\n    fun demo1() {\n\n        ourScope.launch(CoroutineName(\"Parent\")) {\n            try {\n                ourScope.launch(CoroutineName(\"Child-1\")) {\n                    try {\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-1 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }\n                }.invokeOnCompletion { throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-1 is complete\")\n                    }\n                }\n\n                ourScope.launch(CoroutineName(\"Child-2\")) {\n                    /*try {\n                        throw RuntimeException(\"Child-2 throws exception\")\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-2 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }*/\n                    throw RuntimeException(\"Child-2 throws exception\")\n                }.invokeOnCompletion{ throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-2 is complete\")\n                    }\n                }\n            }catch (ex : Exception){\n                println(\"Parent throws exception(Normal catch) ${ex.localizedMessage}\")\n            }\n\n            // Outer delay\n            delay(15000)\n        }.invokeOnCompletion{ throwable ->\n            if(throwable!=null){\n                // Exception thrown\n                println(\"Parent throws exception ${throwable.localizedMessage}\")\n            }else{\n                // Normal completion of coroutine\n                println(\"Parent is complete\")\n            }\n        }\n\n    }\n    // <----------------------->   No Exception Handler   <----------------------->\n\n    // <----------------------->   Catch locally using try catch   <------------->\n    fun demo2() {\n\n        ourScope.launch(CoroutineName(\"Parent\")) {\n            try {\n                ourScope.launch(CoroutineName(\"Child-1\")) {\n                    try {\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-1 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }\n                }.invokeOnCompletion { throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-1 is complete\")\n                    }\n                }\n\n                ourScope.launch(CoroutineName(\"Child-2\")) {\n                    try {\n                        throw RuntimeException(\"Child-2 throws exception\")\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-2 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }\n                }.invokeOnCompletion{ throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-2 is complete\")\n                    }\n                }\n            }catch (ex : Exception){\n                println(\"Parent throws exception(Normal catch) ${ex.localizedMessage}\")\n            }\n\n            // Outer delay\n            delay(15000)\n        }.invokeOnCompletion{ throwable ->\n            if(throwable!=null){\n                // Exception thrown\n                println(\"Parent throws exception ${throwable.localizedMessage}\")\n            }else{\n                // Normal completion of coroutine\n                println(\"Parent is complete\")\n            }\n        }\n\n    }\n    // <----------------------->   Catch locally using try catch   <------------->\n\n\n    // <----------------------->   Try to catch on external catch   <------------>\n    fun demo3() {\n\n        ourScope.launch(CoroutineName(\"Parent\")) {\n            try {\n                ourScope.launch(CoroutineName(\"Child-1\")) {\n                    try {\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-1 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }\n                }.invokeOnCompletion { throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-1 is complete\")\n                    }\n                }\n                try {\n                    ourScope.launch(CoroutineName(\"Child-2\")) {\n                        throw RuntimeException(\"Child-2 throws exception\")\n                        delay(10000)\n                    }.invokeOnCompletion{ throwable ->\n                        if(throwable!=null){\n                            // Exception thrown\n                            println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                        }else{\n                            // Normal completion of coroutine\n                            println(\"Child-2 is complete\")\n                        }\n                    }\n                }catch (ex : Exception){\n                    println(\"Child-2 throws exception(Outer normal catch) ${ex.localizedMessage}\")\n                }\n            }catch (ex : Exception){\n                println(\"Parent throws exception(Normal catch) ${ex.localizedMessage}\")\n            }\n\n            // Outer delay\n            delay(15000)\n        }.invokeOnCompletion{ throwable ->\n            if(throwable!=null){\n                // Exception thrown\n                println(\"Parent throws exception ${throwable.localizedMessage}\")\n            }else{\n                // Normal completion of coroutine\n                println(\"Parent is complete\")\n            }\n        }\n\n    }\n    // <----------------------->   Try to catch on external catch   <------------>\n\n    // <----------------------->   Using Exception Handler   <------------------->\n    fun demo4() {\n\n        val handler = CoroutineExceptionHandler { _, exception ->\n            println(\"Caught an exception: $exception\")\n        }\n\n        ourScope.launch(CoroutineName(\"Parent\")) {\n            try {\n                ourScope.launch(CoroutineName(\"Child-1\")) {\n                    try {\n                        delay(10000)\n                    }catch (ex : Exception){\n                        println(\"Child-1 throws exception(Normal catch) ${ex.localizedMessage}\")\n                    }\n                }.invokeOnCompletion { throwable ->\n                    if(throwable!=null){\n                        // Exception thrown\n                        println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                    }else{\n                        // Normal completion of coroutine\n                        println(\"Child-1 is complete\")\n                    }\n                }\n                try {\n                    ourScope.launch(CoroutineName(\"Child-2\") + handler) {\n                        throw RuntimeException(\"Child-2 throws exception\")\n                        delay(10000)\n                    }.invokeOnCompletion{ throwable ->\n                        if(throwable!=null){\n                            // Exception thrown\n                            println(\"Child-1 throws exception ${throwable.localizedMessage}\")\n                        }else{\n                            // Normal completion of coroutine\n                            println(\"Child-2 is complete\")\n                        }\n                    }\n                }catch (ex : Exception){\n                    println(\"Child-2 throws exception(Outer normal catch) ${ex.localizedMessage}\")\n                }\n            }catch (ex : Exception){\n                println(\"Parent throws exception(Normal catch) ${ex.localizedMessage}\")\n            }\n\n            // Outer delay\n            delay(15000)\n        }.invokeOnCompletion{ throwable ->\n            if(throwable!=null){\n                // Exception thrown\n                println(\"Parent throws exception ${throwable.localizedMessage}\")\n            }else{\n                // Normal completion of coroutine\n                println(\"Parent is complete\")\n            }\n        }\n\n    }\n    // <----------------------->   Using Exception Handler   <------------------->\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/job/JobDemoSelection.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.job\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun JobDemoSelection(navController: NavHostController) {\n\n    val viewModel: JobDemoSelectionVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Cancel-Root\") {\n            viewModel.rootCancel()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/job/JobDemoSelectionVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.job\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\n\nclass JobDemoSelectionVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    fun demo() {\n        try {\n            ourScope.launch(CoroutineName(\"GrandParent\")) {\n                try {\n                    parent1Block()\n                    parent2Block()\n                }catch (ex:Exception){\n                    println(\"Exception caught inside GrandParent scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"GrandParent invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside GrandParent scope\")\n        }\n    }\n\n\n    private fun parent1Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-1\")) {\n                try {\n                    parent1Child1Block()\n                    parent1Child2Block()\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-1 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-1 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-1 scope\")\n        }\n    }\n    private fun parent2Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-2\")) {\n                try {\n                    parent2Child1Block()\n                    parent2Child2Block()\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-2 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-2 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-2 scope\")\n        }\n    }\n    private fun parent1Child1Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-1-child-1\")) {\n                try {\n                    repeat(10){\n                        println(\"Parent-1-child-1 ------------------>$it\")\n                        delay(1000)\n                    }\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-1-child-1 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-1-child-1 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-1-child-1 scope\")\n        }\n    }\n    private fun parent1Child2Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-1-child-2\")) {\n                try {\n                    repeat(10){\n                        println(\"Parent-1-child-2 ------------------>$it\")\n                        delay(1000)\n                    }\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-1-child-2 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-1-child-2 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-1-child-2 scope\")\n        }\n    }\n    private fun parent2Child1Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-2-child-1\")) {\n                try {\n                    repeat(10){\n                        println(\"Parent-2-child-1 ------------------>$it\")\n                        delay(1000)\n                    }\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-2-child-1 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-2-child-1 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-2-child-1 scope\")\n        }\n    }\n    private fun parent2Child2Block(){\n        try {\n            ourScope.launch(CoroutineName(\"Parent-2-child-2\")) {\n                try {\n                    repeat(10){\n                        println(\"Parent-2-child-2 ------------------>$it\")\n                        delay(1000)\n                    }\n                }catch (ex:Exception){\n                    println(\"Exception caught inside Parent-2-child-2 scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"Parent-2-child-2 invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside Parent-2-child-2 scope\")\n        }\n    }\n\n    fun rootCancel() {\n        scopeJob?.cancel()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/launch_and_withcontext/LaunchAndWithContextDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.launch_and_withcontext\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun LaunchAndWithContextDemo(navController: NavHostController) {\n\n    val viewModel: LaunchAndWithContextDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/launch_and_withcontext/LaunchAndWithContextDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.launch_and_withcontext\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.utils.extensions.printCoroutineScopeInfo\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.concurrent.CancellationException\nimport javax.inject.Inject\n\nclass LaunchAndWithContextDemoVm @Inject constructor( ) : ViewModel() {\n\n    // Create a root co-routine scope\n    private val rootScope =  CoroutineScope(\n        Dispatchers.Main + CoroutineName(\"Root-Coroutine\")\n    )\n\n    private val childScope =  CoroutineScope(\n        Dispatchers.Main + CoroutineName(\"Child-Coroutine\")\n    )\n\n    fun demo() = rootScope.launch {\n        printCoroutineScopeInfo()\n        childScope.launch {\n            printCoroutineScopeInfo()\n            val result = withContext(Dispatchers.Main + CoroutineName(\"Child-nested-Coroutine\")){\n                printCoroutineScopeInfo()\n                100\n            }\n            println(\"Returned value $result\")\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/simple_structured_concurrency/SimpleStructuredConcurrencyDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.simple_structured_concurrency\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Shapes\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun SimpleStructuredConcurrencyDemo(navController: NavHostController) {\n\n    val viewModel: SimpleStructuredConcurrencyDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        AppText(text = \"Co-Routines\")\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Start nested \\n Independent Co-routines\") {\n            viewModel.startNestedIndependentCoroutines()\n        }\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Start nested \\n Linked Co-routines\") {\n            viewModel.startNestedLinkedCoroutines()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Start nested \\n Linked Co-routines \\n with join\") {\n            viewModel.startNestedChildrenCoroutines()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"CANCEL\") {\n            viewModel.cancel()\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/simple_structured_concurrency/SimpleStructuredConcurrencyDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.simple_structured_concurrency\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.cancelChildren\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.util.concurrent.CancellationException\nimport javax.inject.Inject\n\nclass SimpleStructuredConcurrencyDemoVm @Inject constructor( ) : ViewModel() {\n\n    // Create a root co-routine scope\n    private val rootScope =  CoroutineScope(Dispatchers.Default)\n\n    fun startNestedIndependentCoroutines() {\n        // Launch a co-routine within the scope\n        rootScope.launch {\n            println(\"Start outer coroutine\")\n\n            // Create a nested co-routine scope\n            val nestedScope =  CoroutineScope(Dispatchers.Default)\n\n            // Launch a new co-routine within the nested scope\n            nestedScope.launch {\n                println(\"Start inner coroutine\")\n                delay(10000) // Observe we keep delay longer here than the outer delay\n                println(\"End inner coroutine\")\n            }\n\n            delay(5000) // Observe we have kept outer delay lesser than inner delay\n\n            println(\"End outer coroutine\")\n        }\n    }\n\n    fun startNestedLinkedCoroutines() {\n        // Launch a co-routine within the scope\n        rootScope.launch {\n            println(\"Start outer coroutine\")\n\n            // Launch a new co-routine within the nested scope\n            launch {\n                println(\"Start inner coroutine\")\n                delay(10000) // Observe we keep delay longer here than the outer delay\n                println(\"End inner coroutine\")\n            }\n\n            delay(5000) // Observe we have kept outer delay lesser than inner delay\n\n            println(\"End outer coroutine\")\n        }\n    }\n\n    fun startNestedChildrenCoroutines() {\n        // Launch a co-routine within the scope\n        rootScope.launch {\n            println(\"Start outer coroutine\")\n\n            // Launch a new co-routine within the nested scope\n            launch {\n                println(\"Start inner coroutine-1\")\n                delay(10000) // Observe we keep delay longer here than the outer delay\n                println(\"End inner coroutine-1\")\n            }.join()\n\n            launch {\n                println(\"Start inner coroutine-2\")\n                delay(10000) // Observe we keep delay longer here than the outer delay\n                println(\"End inner coroutine-2\")\n            }.join()\n\n            println(\"End outer coroutine\")\n        }\n    }\n\n    fun cancel() {\n        println(\"User invokes cancel\")\n        rootScope.cancel(cause = CancellationException(\"Cancelled explicitly by user\"))\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/suspend_and_launch_demo/NonCancellableDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.suspend_and_launch_demo\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.NonCancellable\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.ensureActive\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\nimport kotlin.coroutines.cancellation.CancellationException\nimport kotlin.coroutines.coroutineContext\n\nclass NonCancellableDemoVm @Inject constructor() : ViewModel() {\n\n    private var job: Job? = null\n\n\n    fun startTwoCoroutines() {\n\n        // Start a root coroutine\n        job = CoroutineScope(Dispatchers.IO).launch {\n            // Start a coroutine-1\n            launch {\n                coRoutineOne(1)\n            }\n            // Start a coroutine-2\n            launch {\n                coRoutineOne(2)\n            }\n        }\n    }\n\n    fun startTwoSuspendFunctions() {\n\n        // Start a coroutine\n        job = CoroutineScope(Dispatchers.IO).launch {\n            // Start a suspend function-1\n            coRoutineOne(1)\n            // Start a suspend function-2\n            coRoutineOne(2)\n        }\n    }\n\n    private suspend fun coRoutineOne(coroutineNo: Int) {\n        try {\n            repeat(10) { index ->\n\n                delay(500)\n\n                // Check if the coroutine has been canceled\n                if (!coroutineContext.isActive) {\n                    println(\"Coroutine-No:$coroutineNo canceled at index $index\")\n                } else {\n                    // Continue with the main logic\n                    println(\"Coroutine-No:$coroutineNo Working at index $index\")\n                }\n            }\n            // Additional logic after the loop\n            println(\"Coroutine-No:$coroutineNo completed\")\n        } catch (e: CancellationException) {\n            // Handle cancellation-specific tasks\n            println(\"Coroutine-No:$coroutineNo canceled\")\n        }\n    }\n\n    fun cancel() {\n        job?.cancel()\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/suspend_and_launch_demo/SuspendAndLaunchDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.suspend_and_launch_demo\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun SuspendAndLaunchDemo(navController: NavHostController){\n\n    val viewModel: NonCancellableDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start \\n 2 co-routines\") {\n            viewModel.startTwoCoroutines()\n        }\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        AppButton(text = \"Start \\n 2 suspend-functions\") {\n            viewModel.startTwoSuspendFunctions()\n        }\n\n        Spacer(modifier = Modifier.height(100.dp))\n\n        Button(\n            modifier = Modifier\n                .background(\n                    color = MaterialTheme.colorScheme.primary,\n                    shape = RectangleShape\n                ),\n            onClick = {\n                viewModel.cancel()\n            }\n        ) {\n            Text(text = \"Cancel\")\n        }\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/using_async_await/UsingAsyncAwaitDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.using_async_await\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun UsingAsyncAwaitDemo(navController: NavHostController) {\n\n    val viewModel: UsingAsyncAwaitDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier\n            .fillMaxSize()\n            .verticalScroll(rememberScrollState()),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center,\n\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Cancel-Root\") {\n            viewModel.rootCancel()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/using_async_await/UsingAsyncAwaitDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.using_async_await\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Deferred\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\nclass UsingAsyncAwaitDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    fun demo() {\n        try {\n            ourScope.launch(CoroutineName(\"GrandParent\")) {\n\n                val endResult = (1..15).toList().map { inputValue ->\n                    async {\n                        delay(100)\n                        inputValue\n                    }\n                }.awaitAll().sum()\n                println(\"Final Result:-> $endResult\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside GrandParent scope\")\n        }\n    }\n\n    fun rootCancel() {\n        scopeJob?.cancel()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/using_join/UsingJoinDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.using_join\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun UsingJoinDemo(navController: NavHostController) {\n\n    val viewModel: UsingJoinDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Demo\") {\n            viewModel.demo()\n        }\n\n        Spacer(modifier = Modifier.height(20.dp))\n\n        AppButton(text = \"Cancel-Root\") {\n            viewModel.rootCancel()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/coroutines/using_join/UsingJoinDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.coroutines.using_join\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\nclass UsingJoinDemoVm @Inject constructor( ) : ViewModel() {\n\n    private val scopeJob = Job()\n\n    private val ourScope =  CoroutineScope(scopeJob + Dispatchers.Default)\n\n    fun demo() {\n        try {\n            ourScope.launch(CoroutineName(\"GrandParent\")) {\n                try {\n                    parent1Block().join()\n                    parent2Block().join()\n                    println(\"Both parent code blocks are completed\")\n                }catch (ex:Exception){\n                    println(\"Exception caught inside GrandParent scope\")\n                }\n            }.invokeOnCompletion {\n                println(\"GrandParent invokeOnCompletion triggered\")\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught outside GrandParent scope\")\n        }\n    }\n\n\n    private suspend fun parent1Block() = ourScope.launch(CoroutineName(\"Parent-1\")) {\n        try {\n            repeat(10){\n                println(\"Parent-1 ----- tick ----->$it\")\n                delay(1000)\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught inside Parent-1 coroutine\")\n        }\n    }\n\n    private suspend fun parent2Block() = ourScope.launch(CoroutineName(\"Parent-2\")) {\n        try {\n            parent2Child1Block().join()\n            println(\"Parent-2-Child-1 block is completed\")\n            repeat(10){\n                println(\"Parent-2-Child-1 ----- tick ----->$it\")\n                delay(1000)\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught inside Parent-2 coroutine\")\n        }\n    }\n\n    private suspend fun parent2Child1Block() = ourScope.launch(CoroutineName(\"Parent-2-Child-1\")) {\n        try {\n            repeat(10){\n                println(\"Parent-2-Child-1 ----- tick ----->$it\")\n                delay(1000)\n            }\n        }catch (ex:Exception){\n            println(\"Exception caught inside Parent-2-Child-1 coroutine\")\n        }\n    }\n\n\n    fun rootCancel() {\n        scopeJob?.cancel()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/FlowsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\n\n\n@Composable\nfun FlowsDemo (navController: NavHostController) {\n\n    val viewModel: FlowsDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Flow basics\", onClick = {\n            navController.navigate(ModuleDemo.FlowBasics.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Terminal Operators\", onClick = {\n            // New composable is launched\n            navController.navigate(ModuleDemo.TerminalOperators.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Intermediate Operators\", onClick = {\n            // New composable is launched\n            navController.navigate(ModuleDemo.IntermediateOperators.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Composing and Flattening the flows\", onClick = {\n            navController.navigate(ModuleDemo.ComposingAndFlatteningTheFlows.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"State And Shared Flow\", onClick = {\n            navController.navigate(ModuleDemo.StateAndSharedFlowDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Mutable State of Flow Demo\", onClick = {\n            navController.navigate(ModuleDemo.MutableStateOfFlowDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Flatten Flows\", onClick = {\n            navController.navigate(ModuleDemo.FlattenFlowsDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Collect As State With Life Cycle\", onClick = {\n            navController.navigate(ModuleDemo.CollectAsStateWithLifeCycle.rout)\n        })\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/FlowsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport javax.inject.Inject\n\n@HiltViewModel\nclass FlowsDemoVm @Inject constructor( ) : ViewModel() {\n\n\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/collect_as_state_with_lifecycle/CollectAsStateWithLifeCycleDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.collect_as_state_with_lifecycle\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.lifecycle.compose.collectAsStateWithLifecycle\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport kotlinx.coroutines.launch\n\n@Composable\nfun CollectAsStateWithLifeCycleDemo(navController: NavHostController){\n\n    val viewModel: CollectAsStateWithLifeCycleVm = hiltViewModel()\n    //val time = viewModel.data.collectAsStateWithLifecycle()\n    //val time = viewModel.newTimer.collectAsStateWithLifecycle()\n    val time: Int by viewModel.data.collectAsStateWithLifecycle()\n    \n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        Text(\n            text = time.toString(),\n            fontSize = 30.sp\n        )\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/collect_as_state_with_lifecycle/CollectAsStateWithLifeCycleVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.collect_as_state_with_lifecycle\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass CollectAsStateWithLifeCycleVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    companion object {\n        const val INITIAL_VALUE = 0\n    }\n\n    private var currentTime = INITIAL_VALUE\n\n    private val _data = MutableStateFlow(0)\n    val data = _data.asStateFlow()\n\n\n    init {\n        initiate()\n    }\n\n    private fun initiate() {\n        viewModelScope.launch {\n            while(true){\n                delay(1000L)\n                println(\"Flow is active current time ---> $currentTime\")\n                _data.emit(currentTime++)\n            }\n        }\n    }\n\n    val newTimer = flow {\n        while(true){\n            delay(1000L)\n            println(\"Flow is active current time ---> $currentTime\")\n            emit(currentTime++)\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L),0)\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/compose_and_flatten_flows/ComposeAndFlattenFlows.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.compose_and_flatten_flows\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun ComposeAndFlattenFlows(navController: NavHostController){\n\n    val viewModel: ComposeAndFlattenFlowsVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Buffering\", onClick = { viewModel.buffering() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Conflating\", onClick = { viewModel.conflating() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Collect Latest\", onClick = { viewModel.collectLatest() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Zipping\", onClick = { viewModel.zipping() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Combining\", onClick = { viewModel.combining() })\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/compose_and_flatten_flows/ComposeAndFlattenFlowsVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.compose_and_flatten_flows\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.buffer\nimport kotlinx.coroutines.flow.collectLatest\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.conflate\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.lastOrNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.singleOrNull\nimport kotlinx.coroutines.flow.take\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.flow.toSet\nimport kotlinx.coroutines.flow.zip\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\nimport kotlin.system.measureTimeMillis\n\n@HiltViewModel\nclass ComposeAndFlattenFlowsVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    /** *********************** Buffering *********************** **/\n\n    private val bufferDemoFlow = flow {\n        // Make 10 emissions in iteration\n        repeat(10){\n            // Give some delay\n            delay(50)\n            println(\"Emission -> $it\")\n            emit(it)\n        }\n    }.flowOn(Dispatchers.Default)\n\n    fun buffering() = viewModelScope.launch{\n        // It will show the time taken to execute this block of code\n        val time = measureTimeMillis {\n            bufferDemoFlow.buffer(5).collect {\n                delay(100)\n                println(\"Collection -> $it\")\n            }\n        }\n        println(\"Time Taken:-> $time\")\n    }\n    /** *********************** Buffering *********************** **/\n\n    /** *********************** Conflating *********************** **/\n    private val conflatingDemoFlow = flow {\n        // Make 10 emissions in iteration\n        repeat(10){\n            // Give some delay\n            println(\"Emission -> $it\")\n            emit(it)\n        }\n    }.flowOn(Dispatchers.Default)\n\n    fun conflating() = viewModelScope.launch{\n        // It will show the time taken to execute this block of code\n        val time = measureTimeMillis {\n            conflatingDemoFlow.take(5).conflate().collect {\n                delay(100)\n                println(\"Collection -> $it\")\n            }\n        }\n        println(\"Time Taken:-> $time\")\n    }\n    /** *********************** Conflating *********************** **/\n\n    /** *********************** Collect Latest ******************* **/\n    private val collectLatestDemoFlow = flow {\n        // Make 10 emissions in iteration\n        repeat(3){\n            // Give some delay\n            println(\"Emission -> $it\")\n            emit(it)\n        }\n    }.flowOn(Dispatchers.Default)\n\n    fun collectLatest() = viewModelScope.launch{\n        // It will show the time taken to execute this block of code\n        val time = measureTimeMillis {\n            collectLatestDemoFlow.collectLatest {\n                println(\"Processing emission -> $it\")\n                delay(1000)\n                println(\"Processed emission -> $it\")\n            }\n        }\n        println(\"Time Taken:-> $time\")\n    }\n    /** *********************** Collect Latest ******************* **/\n\n    /** *********************** Zipping ************************** **/\n    private val flowOne = flow {\n        emit(\"x\")\n        emit(\"y\")\n        emit(\"z\")\n    }.flowOn(Dispatchers.Default)\n\n    private val flowTwo = flow {\n        emit(\"x\")\n        emit(\"y\")\n        emit(\"z\")\n    }.flowOn(Dispatchers.Default)\n\n    fun zipping() = viewModelScope.launch{\n        // It will show the time taken to execute this block of code\n        val time = measureTimeMillis {\n            flowOne.zip(flowTwo){ one , two ->\n                one+two\n            }.collect{\n                println(\"Result:-> $it\")\n            }\n        }\n        println(\"Time Taken:-> $time\")\n    }\n\n    /** *********************** Zipping ************************** **/\n\n    /** *********************** Combining ************************ **/\n    private val flowCombineOne = flow {\n        emit(\"x\")\n        delay(5000)\n        emit(\"y\")\n        emit(\"z\")\n    }.flowOn(Dispatchers.Default)\n\n    private val flowCombineTwo = flow {\n        emit(\"x\")\n        emit(\"y\")\n        emit(\"z\")\n    }.flowOn(Dispatchers.Default)\n\n    fun combining() = viewModelScope.launch{\n        // It will show the time taken to execute this block of code\n        val time = measureTimeMillis {\n            flowCombineOne.combine(flowCombineTwo){ one , two ->\n                one+two\n            }.collect{\n                println(\"Result:-> $it\")\n            }\n        }\n        println(\"Time Taken:-> $time\")\n    }\n    /** *********************** Combining ************************ **/\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flatten_flows/FlattenFlowsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flatten_flows\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun FlattenFlowsDemo(navController: NavHostController){\n\n    val viewModel: FlattenFlowsDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Flattening\")\n\n        AppButton(text = \"FlatMapConcat\", onClick = { viewModel.flatMapConcat() })\n        Spacer(modifier = Modifier.height(10.dp))\n        AppButton(text = \"FlatMapMerge\", onClick = { viewModel.flatMapMerge() })\n        Spacer(modifier = Modifier.height(10.dp))\n        AppButton(text = \"FlatMapLatest\", onClick = { viewModel.flatMaplatest() })\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flatten_flows/FlattenFlowsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flatten_flows\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.flatMapConcat\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flatMapMerge\nimport kotlinx.coroutines.flow.flattenConcat\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.lastOrNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.singleOrNull\nimport kotlinx.coroutines.flow.take\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.flow.toSet\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\n\n@HiltViewModel\nclass FlattenFlowsDemoVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    private val rootScope = CoroutineScope(context = Dispatchers.IO)\n\n    /**\n     * Flow of integers\n     */\n    fun generateIntegers() = flow {\n        repeat(100){\n            delay(1000)\n            emit(it)\n        }\n    }\n\n\n    /**\n     * Generate a flow of strings\n     */\n    fun generateFlowOfStrings(value : Int) = flow {\n        val content = \"Current string no -->$value at the thread${Thread.currentThread().name}\"\n        println(\"<Emitted> -->$value\")\n        emit(content)\n    }\n\n\n    fun flatMapConcat() = rootScope.launch(CoroutineName(\"FlatMapConcatDemo\")){\n\n       // Way-1\n       /* val result : Flow<Flow<String>> = generateIntegers()\n           .take(5)\n           .map {\n               generateFlowOfStrings(it)\n           }\n\n        result.flattenConcat().collect{\n            println(it)\n        }*/\n\n\n        //Way-2\n        generateIntegers()\n            .take(5)\n            .flatMapConcat {\n                generateFlowOfStrings(it)\n            }.collect{\n                println(it)\n            }\n\n    }\n\n\n\n    fun flatMapMerge() = rootScope.launch(CoroutineName(\"flatMapMerge\")){\n\n        generateIntegers()\n            .take(5)\n            .flatMapMerge() {\n                generateFlowOfStrings(it)\n            }.collect{\n                println(it)\n            }\n\n    }\n\n    fun flatMaplatest() = rootScope.launch(CoroutineName(\"flatMapLatest\")){\n        generateIntegers()\n            .take(5)\n            .flatMapLatest {\n                generateFlowOfStrings(it)\n            }.collect{\n                delay(2000)\n                println(\"collected: ---> $it\")\n            }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/chapters/display_data_from_server/DisplayDataFromServerDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.chapters.display_data_from_server\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.grid.rememberLazyGridState\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.chapters.display_data_from_server.composables.StockItem\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.state.UiState\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.ui.FlowBasicsVm\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun DisplayDataFromServerDemo(navController: NavHostController){\n\n    // <!------------ MAIN-COMPOSE-CONTROL-PARTS ----------------->\n    // View model reference\n    val viewModel: DisplayDataFromServerVm = hiltViewModel()\n    // View state reference from view model\n    val stockList = viewModel.viewState.value.stockList\n    val isLoading = viewModel.viewState.value.isLoading\n    val error = viewModel.viewState.value.error\n    // <!------------ MAIN-COMPOSE-CONTROL-PARTS ----------------->\n\n    // LaunchedEffect will run the provided block when the composition is first committed\n    LaunchedEffect(true){\n        // This is called only once\n        viewModel.getDataFromServerUsingCollect()\n    }\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n        if(isLoading){\n            // Display a loading indicator\n            CircularProgressIndicator(\n                modifier = Modifier.width(64.dp),\n                color = MaterialTheme.colorScheme.secondary,\n                trackColor = MaterialTheme.colorScheme.surfaceVariant,\n            )\n        }else{\n            // Either data is there or, there can be error\n            if(!error.isError){\n                // Error is not there ---> Display the data\n                LazyColumn(\n                    modifier = Modifier.background(color = MaterialTheme.colorScheme.background),\n                    state = rememberLazyListState(),\n                    contentPadding = PaddingValues(16.dp),\n                    verticalArrangement = Arrangement.spacedBy(16.dp)\n                ){\n                    items(\n                        count = stockList.size,\n                        key = {\n                            stockList[it].id\n                        },\n                        itemContent = {\n                            StockItem(data = stockList[it])\n                        }\n                    )\n                }\n            }else{\n                // Error is there\n                Text(text = error.errorMessage)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/chapters/display_data_from_server/DisplayDataFromServerVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.chapters.display_data_from_server\n\nimport android.content.Context\nimport android.util.Log\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.data.StockData\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.state.UiError\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.state.UiState\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onCompletion\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.onStart\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass DisplayDataFromServerVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    var viewState: MutableState<UiState> = mutableStateOf(UiState())\n\n    fun getDataFromServerUsingCollect() {\n        viewModelScope.launch {\n            StockData.getData(context)\n                .map { stockList ->\n                    // We converted data from one form to another - Here UiState\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        stockList = stockList\n                    )\n                }.onStart {\n                    // We indicate the UI will start loading\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        isLoading = true\n                    )\n                }.catch { error ->\n                    // Emit the error if the error is found\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  error.localizedMessage, isError = true)\n                    )\n                }.onCompletion {\n                    // This indicates flow is completed\n                    Log.d(\"Flow\",\"Flow has completed.\")\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        isLoading = false\n                    )\n                }.collect()\n        }\n    }\n\n\n\n    fun getDataFromServerUsingLaunchIn() {\n        viewModelScope.launch {\n            StockData.getData(context)\n                .onEach { stockList ->\n                    // We converted data from one form to another - Here UiState\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        stockList = stockList\n                    )\n                }.onStart {\n                    // We indicate the UI will start loading\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        isLoading = true\n                    )\n                }.catch { error ->\n                    // Emit the error if the error is found\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  error.localizedMessage, isError = true)\n                    )\n                }.onCompletion {\n                    // This indicates flow is completed\n                    Log.d(\"Flow\",\"Flow has completed.\")\n                    viewState.value = viewState.value.copy(\n                        error = UiError(errorMessage =  \"\", isError = false),\n                        isLoading = false\n                    )\n                }.launchIn(viewModelScope)\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/chapters/display_data_from_server/composables/StockItem.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.chapters.display_data_from_server.composables\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.CornerSize\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.CardElevation\nimport androidx.compose.material3.MaterialTheme.typography\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport com.istudio.app.R\nimport com.istudio.app.data.mock.Stock\n\n@Composable\nfun StockItem(data : Stock){\n    Card(\n        modifier = Modifier\n            .padding(horizontal = 8.dp, vertical = 8.dp)\n            .fillMaxWidth(),\n        elevation = CardDefaults.cardElevation(2.dp),\n        shape = RoundedCornerShape(corner = CornerSize(16.dp))\n\n    ) {\n        Row(\n            modifier = Modifier.fillMaxSize().padding(10.dp),\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.Center\n        ) {\n            Image(\n                painter = painterResource(id = R.mipmap.ic_launcher),\n                contentDescription = \"Data Image\")\n            Column(\n                modifier = Modifier\n                    .padding(16.dp)\n                    .fillMaxWidth()\n                    .align(Alignment.CenterVertically)) {\n                Text(text = data.name, style = typography.bodyLarge)\n                Text(text = data.country, style = typography.bodyMedium)\n                Text(text = data.currentPrice.toString(), style = typography.bodySmall)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/data/StockData.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.data\n\nimport android.content.Context\nimport com.istudio.app.data.mock.Stock\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.data.api.mockApi\nimport kotlinx.coroutines.flow.Flow\n\nobject StockData {\n    suspend fun getData(context : Context): Flow<List<Stock>> {\n        return NetworkStockPriceDataSource(mockApi(context)).getLatestStockList()\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/data/StockPriceDataSource.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.data\n\nimport android.util.Log\nimport com.istudio.app.data.mock.FlowMockApi\nimport com.istudio.app.data.mock.Stock\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.flow\n\ninterface StockPriceDataSource {\n    suspend fun getLatestStockList() : Flow<List<Stock>>\n}\n\nclass NetworkStockPriceDataSource(val mockApi: FlowMockApi) : StockPriceDataSource {\n    override suspend fun getLatestStockList(): Flow<List<Stock>>  = flow {\n        emit(mockApi.getCurrentStockPrices())\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/data/api/MockApiBehavior.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.data.api\n\nimport android.content.Context\nimport com.google.gson.Gson\nimport com.istudio.app.data.mock.MockNetworkInterceptor\nimport com.istudio.app.data.mock.createFlowMockApi\nimport com.istudio.app.data.mock.fakeCurrentStockPrices\n\nfun mockApi(context: Context) =\n    createFlowMockApi(\n        MockNetworkInterceptor()\n            .mock(\n                path = \"/current-stock-prices\",\n                body = { Gson().toJson(fakeCurrentStockPrices(context)) },\n                status = 200,\n                delayInMs = 1500,\n            )\n    )"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/state/UiState.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.state\n\nimport com.istudio.app.data.mock.Stock\n\ndata class UiState(\n    val isLoading: Boolean = false,\n    val stockList: List<Stock> = emptyList(),\n    val error: UiError = UiError()\n)\n\ndata class UiError(\n    val errorMessage: String = \"\",\n    val isError: Boolean = false\n)"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/ui/FlowBasics.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun FlowBasics(navController: NavHostController){\n\n    val viewModel: FlowBasicsVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Flow Builders\", onClick = {\n            viewModel.flowBuilders()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Flow into Mutable State Flow \", onClick = {\n            // New composable is launched\n            navController.navigate(ModuleDemo.DisplayDataFromServer.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Stopping Flow - Demo\")\n\n        AppButton(text = \"Start\", onClick = {\n            viewModel.stoppingFlowDemoStart()\n        })\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Cancel\", onClick = {\n            viewModel.invokeCancel()\n        })\n\n        Spacer(modifier = Modifier.height(5.dp))\n\n        AppButton(text = \"Flow Context\", onClick = {\n            viewModel.flowContextDemo()\n        })\n\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/flow_basics/ui/FlowBasicsVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.flow_basics.ui\n\nimport android.content.Context\nimport android.util.Log\nimport androidx.compose.runtime.MutableState\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.asLiveData\nimport androidx.lifecycle.viewModelScope\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.data.StockData\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.data.StockPriceDataSource\nimport com.istudio.app.modules.module_demos.flows.modules.flow_basics.state.UiState\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onCompletion\nimport kotlinx.coroutines.flow.onStart\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\n\n@HiltViewModel\nclass FlowBasicsVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    /**\n     * FLOW builders in kotlin\n     */\n    fun flowBuilders() {\n        viewModelScope.launch {\n\n            // Builder: FlowOf ---> Just one value\n            val demo1 = flowOf(10)\n            // Builder: FlowOf ---> Multiple values\n            val demo2 = flowOf(\"x\",\"y\",\"z\")\n            // Builder: AsFlow ---> Collections are converted to flow\n            val demo3 = listOf(\"A\",\"B\",\"C\").asFlow()\n            // Builder: Emit\n            val demo4 = flow<String> {\n                emit(\"USA\")\n                delay(500)\n                emit(\"INDIA\")\n            }\n\n            println(\"<-------- Builder: FlowOf ---> Just one value -------->\")\n            demo1.collect{\n                println(it)\n            }\n            println(\"<-------- Builder: FlowOf ---> Just one value -------->\")\n            println(\"<----------------------------------------------------->\")\n            println(\"<-------- Builder: FlowOf ---> Multiple one value ---->\")\n            demo2.collect{\n                println(it)\n            }\n            println(\"<-------- Builder: FlowOf ---> Multiple one value ---->\")\n            println(\"<----------------------------------------------------->\")\n            println(\"<---------------- Builder: asFlow -------------------->\")\n            demo3.collect{\n                println(it)\n            }\n            println(\"<---------------- Builder: asFlow -------------------->\")\n            println(\"<----------------------------------------------------->\")\n            println(\"<---------------- Builder: emit ---------------------->\")\n            demo4.collect{\n                println(it)\n            }\n            println(\"<---------------- Builder: emit ---------------------->\")\n\n        }\n    }\n\n\n    /**\n     * **************************** Cancelling the flow ****************************\n     */\n    private val input = listOf(1,2,3,4,5,6,7,8,9).asFlow()\n    private var jobIp : Job? = null\n    fun stoppingFlowDemoStart() {\n        jobIp = viewModelScope.launch {\n            input.collect{\n                println(\"CurrentElement -> $it\")\n                delay(1500)\n            }\n        }\n    }\n\n    fun invokeCancel(){\n        jobIp?.let {\n            it.cancel(cause = CancellationException(\"Cancelled by the user\"))\n        }\n    }\n    /**\n     * **************************** Cancelling the flow ****************************\n     */\n\n    /**\n     * **************************** Flow Context ****************************\n     */\n    private fun generateIntegers() = flow {\n        var currentValue = 0\n        repeat(15){\n            // Increment value\n            currentValue ++\n            // keep a delay\n            delay(1000)\n            // Emit a value\n            println(\"Value on emission: $currentValue\")\n            emit(currentValue)\n        }\n    }.flowOn(Dispatchers.IO)\n\n    fun flowContextDemo() = viewModelScope.launch {\n        generateIntegers().collect{\n            println(\"Value on received: $it\")\n        }\n    }\n    /**\n     * **************************** Flow Context ****************************\n     */\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/intermediate_operators/IntermediateOperators.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.intermediate_operators\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun IntermediateOperators(navController: NavHostController) {\n\n    val viewModel: IntermediateOperatorsVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        verticalArrangement = Arrangement.Center,\n        horizontalAlignment = Alignment.CenterHorizontally,\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Intermediate Operators\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Map Operator\", onClick = { viewModel.mapOperator() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Filter Operator\", onClick = { viewModel.filterOperator() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Take Operator\", onClick = { viewModel.takeOperator() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Drop Operator\", onClick = { viewModel.dropOperator() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Transform Operator\", onClick = { viewModel.transformOperator() })\n\n        \n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/intermediate_operators/IntermediateOperatorsVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.intermediate_operators\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.drop\nimport kotlinx.coroutines.flow.dropWhile\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.filterIsInstance\nimport kotlinx.coroutines.flow.filterNot\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapLatest\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.take\nimport kotlinx.coroutines.flow.takeWhile\nimport kotlinx.coroutines.flow.transform\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\n\n@HiltViewModel\nclass IntermediateOperatorsVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    private val flowOfIntegers = flowOf(1, 2, 3, 4, 5)\n\n    /**\n     * ****************************************\n     * OPERATOR: Map Operator\n     * DESCRIPTION: Using the map operator, We shall transform Integers into Strings\n     * ****************************************\n     * Types of map Operators:-\n     * ****************************************\n     * (1) flowOfIntegers.map {  }\n     *\n     * (2) flowOfIntegers.mapNotNull {  }\n     *\n     * (3) flowOfIntegers.mapLatest {  }\n     * ****************************************\n     */\n    fun mapOperator() {\n        viewModelScope.launch {\n\n            flowOfIntegers.map {\n                it.toString()\n            }.collect {\n                if(it is String){\n                    // Use smart cast to check if it is string\n                    println(\"Received value: -->$it\")\n                }\n            }\n        }\n    }\n\n    /**\n     * OPERATOR: Filter Operator\n     * DESCRIPTION: Using the filter operator, We can con apply a filter to remove emissions that does not meet the criteria\n     * ****************************************\n     * Useful Filter Operators:-\n     * ****************************************\n     * (1) flowOfIntegers.filter {  }\n     *\n     * (2) flowOfIntegers.filterNot {  }\n     *\n     * (3) flowOfIntegers.filterIsInstance<Int>{ }\n     * ****************************************\n     */\n    fun filterOperator() {\n        viewModelScope.launch {\n            flowOfIntegers.filter {\n                // We use modulus function to check if the number is divisible by 2\n                it%2 == 0\n            }.collect{\n                println(\"Received value: -->$it\")\n            }\n        }\n    }\n\n    /**\n     * OPERATOR: Take Operator\n     * DESCRIPTION: They are called sizing operators that limit the size of emission based on a predicate condition\n     * ****************************************\n     * useful take Operators:-\n     * ****************************************\n     * (1) flowOfIntegers.take{ }\n     *\n     * (2) flowOfIntegers.takeIf {  }\n     *\n     * (3) flowOfIntegers.takeWhile {  }\n     *\n     * (4) flowOfIntegers.takeUnless {  }\n     * ****************************************\n     */\n    fun takeOperator() {\n        val scope = CoroutineScope(EmptyCoroutineContext)\n        scope.launch {\n            flowOfIntegers.take(2).collect{\n                println(\"Received value: -->$it\")\n            }\n        }\n    }\n\n    /**\n     * OPERATOR: Drop Operator\n     * DESCRIPTION: We basically drop the mentioned initial emissions specified\n     * ****************************************\n     * Useful drop Operators:-\n     * ****************************************\n     * (1) flowOfIntegers.drop{ }\n     *\n     * (2) flowOfIntegers.dropWhile {  }\n     * ****************************************\n     */\n    fun dropOperator() {\n        val scope = CoroutineScope(EmptyCoroutineContext)\n        scope.launch {\n            flowOfIntegers.drop(1).collect{\n                println(\"Received value: -->$it\")\n            }\n        }\n    }\n\n    /**\n     * OPERATOR: Transform Operator\n     * DESCRIPTION:\n     * We can transform the data apply some predicate conditions and emit the new value,\n     * We can also emit multiple emissions\n     * This is basically applying a collection of operators together and emitting the emission downstream\n     */\n    fun transformOperator() {\n        val scope = CoroutineScope(EmptyCoroutineContext)\n        scope.launch {\n            flowOfIntegers.transform {\n                if((it%2)==0){\n                    // Elements that are divisible by 2\n                    emit(it)\n                }\n            }.collect{\n                println(\"Received value: -->$it\")\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/mutable_state_of_flow/MutableStateOfFlowDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.mutable_state_of_flow\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\nimport kotlinx.coroutines.launch\n\n@Composable\nfun MutableStateOfFlowDemo(navController: NavHostController){\n\n    val viewModel: MutableStateOfFlowDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        val coroutineScope = rememberCoroutineScope()\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Start producing emissions\", onClick = {\n            coroutineScope.launch {\n                repeat(100){\n                    viewModel.produce(it)\n                }\n            }\n        })\n\n        Spacer(modifier = Modifier.height(10.dp))\n\n        LaunchedEffect(key1 = true){\n            coroutineScope.launch {\n                viewModel.data.collect{\n                    println(\"Consumed -> $it\")\n                }\n            }\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/mutable_state_of_flow/MutableStateOfFlowDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.mutable_state_of_flow\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MutableStateOfFlowDemoVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    private val _data = MutableSharedFlow<Int>(0)\n    val data = _data.asSharedFlow()\n\n    suspend fun produce(value : Int) {\n        println(\"Emitted value -> $value\")\n        _data.emit(value)\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/state_and_shared_flows/StateAndSharedFlowsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.state_and_shared_flows\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun StateAndSharedFlowDemo(navController: NavHostController){\n\n    val viewModel: StateAndSharedFlowsDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Using Shared-In\\nto convert into Hot-Flow\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"First subscription\", onClick = { viewModel.demo() })\n        Spacer(modifier = Modifier.height(10.dp))\n        AppButton(text = \"Add second subscription\", onClick = { viewModel.addNewSubscriber() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Using State-In\\nto convert into Hot-Flow\")\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"First subscription\", onClick = { viewModel.demoTwo() })\n        Spacer(modifier = Modifier.height(10.dp))\n        AppButton(text = \"Add second subscription\", onClick = { viewModel.addNewSubscriberDemoTwo() })\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/state_and_shared_flows/StateAndSharedFlowsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.state_and_shared_flows\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.lastOrNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.singleOrNull\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.flow.toSet\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\n\n@HiltViewModel\nclass StateAndSharedFlowsDemoVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n\n    /**\n     * ********************************* SharedIn *********************************\n     */\n    // Cold Flow\n    private fun generateDemoFlow() = flow {\n        repeat(1000){\n            emit(\"Emitting value => $it\")\n            delay(2000)\n        }\n    }.shareIn(\n        scope = viewModelScope,\n        started = SharingStarted.WhileSubscribed(),\n        replay = 5\n    )\n\n    fun demo()  = viewModelScope.launch{\n        // Give a delay of 1 second before subscribing\n        delay(1000)\n\n        generateDemoFlow().collect{\n            println(\"Collected value (A) => $it\")\n        }\n    }\n\n    fun addNewSubscriber() = viewModelScope.launch{\n        generateDemoFlow().collect{\n            println(\"Collected value (B) => $it\")\n        }\n    }\n    /**\n     * ********************************* SharedIn *********************************\n     */\n\n\n    /**\n     * ********************************* StateIn *********************************\n     */\n    private suspend fun generateDemoFlowTwo() = flow {\n        repeat(1000){\n            emit(\"Emitting value => $it\")\n            delay(2000)\n        }\n    }.stateIn(\n        scope = viewModelScope\n    )\n\n    fun demoTwo() = viewModelScope.launch {\n\n        println(\"Before second subscriber subscription -> ${generateDemoFlowTwo().value}\")\n\n        // Give a delay of 1 second before subscribing\n        delay(1000)\n\n        generateDemoFlowTwo().collect{\n            println(\"Collected value (A) => $it\")\n        }\n    }\n\n    fun addNewSubscriberDemoTwo() = viewModelScope.launch{\n        generateDemoFlow().collect{\n            println(\"Collected value (B) => $it\")\n        }\n    }\n    /**\n     * ********************************* StateIn *********************************\n     */\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/terminal_operators/TerminalOperators.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.terminal_operators\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.ui.composables.AppText\n\n@Composable\nfun TerminalOperators(navController: NavHostController){\n\n    val viewModel: TerminalOperatorsVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppText(text = \"Terminal Operators\")\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"First\", onClick = { viewModel.demoFirst() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Last\", onClick = { viewModel.demoLast() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Single\", onClick = { viewModel.single() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"ToList And ToSet\", onClick = { viewModel.toListAndToSet() })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"LaunchIn\", onClick = { viewModel.launchIn() })\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/flows/modules/terminal_operators/TerminalOperatorsVm.kt",
    "content": "package com.istudio.app.modules.module_demos.flows.modules.terminal_operators\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.firstOrNull\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.lastOrNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.single\nimport kotlinx.coroutines.flow.singleOrNull\nimport kotlinx.coroutines.flow.toList\nimport kotlinx.coroutines.flow.toSet\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.coroutines.EmptyCoroutineContext\n\n@HiltViewModel\nclass TerminalOperatorsVm @Inject constructor(\n    @ApplicationContext private val context: Context,\n) : ViewModel() {\n    companion object {\n        const val emissionDelay : Long = 100\n    }\n\n    private val terminalOperatorDemo = flow <Int>{\n        delay(emissionDelay)\n        println(\"Emitting first value\")\n        emit(1)\n        delay(emissionDelay)\n        println(\"Emitting second value\")\n        emit(2)\n    }\n\n    /** *********************** DEMO's *********************** **/\n    /**\n     * Terminal Operator: First\n     */\n    fun demoFirst() {\n        viewModelScope.launch {\n            val result = terminalOperatorDemo.firstOrNull()\n            println(\"Result:-> $result\")\n        }\n    }\n\n    /**\n     * Terminal Operator: Last\n     */\n    fun demoLast() {\n        viewModelScope.launch {\n            val result = terminalOperatorDemo.lastOrNull()\n            println(\"Result:-> $result\")\n        }\n    }\n\n    /**\n     * Terminal Operator: Single\n     */\n    fun single() {\n        viewModelScope.launch {\n            val result = terminalOperatorDemo.singleOrNull()\n            println(\"Result:-> $result\")\n        }\n    }\n\n    /**\n     * Terminal Operator: ToListAndToSet\n     */\n    fun toListAndToSet() {\n        viewModelScope.launch {\n            val resultList = terminalOperatorDemo.toList()\n            val resultSet = terminalOperatorDemo.toSet()\n            println(\"Result List:-> $resultList\")\n            println(\"Result Set:-> $resultSet\")\n        }\n    }\n\n    /**\n     * Terminal Operator: LaunchIn\n     */\n    fun launchIn() {\n\n        val scope = CoroutineScope(EmptyCoroutineContext)\n\n        viewModelScope.launch {\n            terminalOperatorDemo\n                .onEach { println(\"Result Collect <1>:-> $it\") }\n                .launchIn(scope)\n\n            terminalOperatorDemo\n                .onEach { println(\"Result Collect <2>:-> $it\") }\n                .launchIn(scope)\n        }\n\n    }\n\n    fun launch() {\n\n        val scope = CoroutineScope(EmptyCoroutineContext)\n\n        scope.launch {\n\n            // Collect -> Starting first collection\n            terminalOperatorDemo.collect{\n                println(\"Result Collect <1>:-> $it\")\n            }\n\n            // <--- Until first collection is complete, collection is suspended --->\n\n            // Collect -> Starting second collection\n            terminalOperatorDemo.collect{\n                println(\"Result Collect <2>:-> $it\")\n            }\n\n        }\n\n    }\n    /** *********************** DEMO's *********************** **/\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/higher_order_functions/ui/HigherOrderFunctionDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.higher_order_functions.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun HigherOrderFunctionDemo(navController: NavHostController) {\n\n    val viewModel: HigherOrderFunctionDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Passing Functions as parameter\", onClick = {\n            // Here will will calculate the square of a number\n            val input = 5\n            // Call the functionality\n            val result = viewModel.performOperation(input) { input ->\n                input * input\n            }\n            println(result)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Returning Function\", onClick = {\n            // We pass a operation here\n            val addFunction = viewModel.createCalculator(\"add\")\n            // We use the operation passed above to pass values for it\n            val resultAdd = addFunction(5, 3) // Result is 8\n            println(\"Result (Add): $resultAdd\")\n        })\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/higher_order_functions/ui/HigherOrderFunctionDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.higher_order_functions.ui\n\nimport androidx.lifecycle.ViewModel\nimport javax.inject.Inject\n\nclass HigherOrderFunctionDemoVm @Inject constructor( ) : ViewModel() {\n\n    // <-------------- Passing Functions as Parameters -------------->\n    fun performOperation(input: Int, operation: (Int) -> Int): Int {\n        return operation(input)\n    }\n    // <-------------- Passing Functions as Parameters -------------->\n\n\n    // <-------------- Returning Functions as Parameters ------------>\n    fun createCalculator(operator: String): (Int, Int) -> Int {\n        return when (operator) {\n            \"add\" -> { a, b -> a + b }\n            \"subtract\" -> { a, b -> a - b }\n            \"multiply\" -> { a, b -> a * b }\n            \"divide\" -> { a, b -> if (b != 0) a / b else 0 }\n            else -> throw IllegalArgumentException(\"Unknown operator: $operator\")\n        }\n    }\n\n    // <-------------- Returning Functions as Parameters ------------>\n\n\n\n    // 1- With Parameters and Return Value\n    fun type1() {\n        val add1:(Int,Int) -> Int = { a:Int , b:Int -> a+b }\n        println(add1(1,2))\n    }\n\n    // 2- With Parameters and no return value\n    fun type2() {\n        val add2 : (Int,Int) -> Unit = { a,b -> println(a+b) }\n        add2(1,2)\n    }\n\n    // 3- No Parameters but with return value\n    fun type3() {\n        val add3 : () -> String = { \"Hello world\" }\n        println(add3())\n    }\n\n\n    // 4- No Parameters and no return value\n    fun type4() {\n        val add4 : () -> Unit = { println(\"Hello World\") }\n        add4.invoke()\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/ui/KotlinAnnotationsDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.ui\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.init.JavaInstanceJf\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.init.KotlinInstanceJf\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.init.JavaInstanceJo\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.init.KotlinInstanceJo\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.init.JavaInstanceJs\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.init.KotlinInstanceJs\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.nullableAndNotNull.SuperHero\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringDef.UserManager\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringDef.UserStatus\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.init.JavaInstanceSr\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.init.KotlinInstanceSr\nimport javax.inject.Inject\n\nclass KotlinAnnotationsDemoVm  @Inject constructor( ) : ViewModel() {\n\n    fun jvmFieldDemo() {\n        // Creating instance in JAVA\n        JavaInstanceJf().initilize()\n        // Creating instance in KOTLIN\n        KotlinInstanceJf().initilize()\n    }\n\n    fun jvmOverloadsDemo() {\n        // Creating instance in JAVA\n        JavaInstanceJo().initilize()\n        // Creating instance in KOTLIN\n        KotlinInstanceJo().initilize()\n    }\n\n    fun jvmStaticDemo() {\n        // Creating instance in JAVA\n        JavaInstanceJs().initilize()\n        // Creating instance in KOTLIN\n        KotlinInstanceJs().initilize()\n    }\n\n    fun stringResDemo() {\n        // Creating instance in JAVA\n        JavaInstanceSr().initilize()\n        // Creating instance in KOTLIN\n        KotlinInstanceSr().initilize()\n    }\n\n    fun nullableNotNull() {\n        val superHero = SuperHero()\n        val heroName : String? = superHero.name\n        println(heroName)\n        //superHero.setName(null)\n    }\n\n    fun stringDef() {\n        val userManager = UserManager()\n        userManager.modifyUserStatus(UserStatus.ACTIVE)\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/ui/kotlinAnnotationsDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun KotlinAnnotationsDemo(navController: NavHostController) {\n\n    val viewModel: KotlinAnnotationsDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@JvmField\", onClick = {\n            viewModel.jvmFieldDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@JvmOverloads\", onClick = {\n            viewModel.jvmOverloadsDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@JvmStatic\", onClick = {\n            viewModel.jvmStaticDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@StringRes\", onClick = {\n            viewModel.stringResDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@Nullable And @NotNull\", onClick = {\n            viewModel.nullableNotNull()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"@StringDef\", onClick = {\n            viewModel.stringDef()\n        })\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmField/JavaPerson.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField;\n\npublic class JavaPerson {\n    private String name;\n    private int age;\n\n    public JavaPerson(String name, int age) {\n        this.name = name;\n        this.age = age;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public int getAge() {\n        return age;\n    }\n\n    public void setAge(int age) {\n        this.age = age;\n    }\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmField/KotlinPerson.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField\n\ndata class KotlinPerson(@JvmField val name : String, val age : Int)\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmField/init/JavaInstanceJf.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.init;\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.KotlinPerson;\n\npublic class JavaInstanceJf {\n\n    public void initilize() {\n        KotlinPerson person = new KotlinPerson(\"Suresh\",21);\n        // We are able to access the variable without getter method even if its a kotlin class\n        System.out.println(person);\n        System.out.println(person.getAge()+\"\");\n    }\n\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmField/init/KotlinInstanceJf.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.init\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmField.KotlinPerson\n\nclass KotlinInstanceJf {\n\n    fun initilize() {\n        val (name, age) = KotlinPerson(\"Suresh\", 21)\n        println(name)\n        println(age)\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmOverloads/Student1.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads\n\ndata class Student1(val name: String,val age : Int =  27)\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmOverloads/Student2.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads\n\ndata class Student2 @JvmOverloads constructor(val name: String,val age : Int =  27)\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmOverloads/init/JavaInstanceJo.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.init;\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.Student1;\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.Student2;\n\npublic class JavaInstanceJo {\n\n    public void initilize() {\n        Student1 stud1 = new Student1(\"Student1\",20);\n        Student2 stud2 = new Student2(\"Student1\");// Observe we did not pass age, Default value is taken from kotlin class\n    }\n\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmOverloads/init/KotlinInstanceJo.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.init\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.Student1\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmOverloads.Student2\n\nclass KotlinInstanceJo {\n\n    fun initilize() {\n        val (name, age) = Student1(\"Student1\", 20)\n        val (name1, age1) = Student2(\"Student1\") // Observe we did not pass age, Default value is taken from kotlin class\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmstatic/Cinema.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic\n\nobject Cinema {\n    fun getActorName(): String{ return \"John\" }\n    @JvmStatic\n    fun getActressName(): String{ return \"Sarah\" }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmstatic/init/JavaInstanceJs.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.init;\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.Cinema;\n\npublic class JavaInstanceJs {\n\n    public void initilize() {\n        System.out.println(Cinema.getActressName());\n        System.out.println(Cinema.INSTANCE.getActorName());\n        //System.out.println(Cinema.getActorName());// Not possible\n    }\n\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/jvmstatic/init/KotlinInstanceJs.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.init\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.jvmstatic.Cinema\n\nclass KotlinInstanceJs {\n\n    fun initilize() {\n        println(Cinema.getActorName())\n        println(Cinema.getActressName())\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/nullableAndNotNull/SuperHero.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.nullableAndNotNull;\n\nimport org.jetbrains.annotations.NotNull;\nimport org.jetbrains.annotations.Nullable;\n\npublic class SuperHero {\n\n    private String name;\n\n    public @Nullable String getName() {\n        return name;\n    }\n\n    public void setName(@NotNull String name) {\n        this.name = name;\n    }\n\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/stringDef/UserManager.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringDef\n\nimport android.util.Log\n\nclass UserManager {\n\n    fun modifyUserStatus(@UserStatus.Status status: String) {\n        when(status){\n            UserStatus.ACTIVE -> {\n                Log.d(\"UserStatus\",\"Logically Active\")\n            }\n            UserStatus.IN_ACTIVE -> {\n                Log.d(\"UserStatus\",\"Logically InActive\")\n            }\n            UserStatus.BANNED -> {\n                Log.d(\"UserStatus\",\"Logically Banned\")\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/stringDef/UserStatus.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringDef\n\nimport androidx.annotation.StringDef\n\nobject UserStatus {\n\n    const val ACTIVE = \"active\"\n    const val IN_ACTIVE = \"inactive\"\n    const val BANNED = \"banned\"\n\n    @Retention(AnnotationRetention.SOURCE)\n    @StringDef(ACTIVE, IN_ACTIVE, BANNED)\n    annotation class Status\n}\n\n\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/stringRes/HomeNavItem.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes\n\nimport androidx.annotation.StringRes\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.material.icons.filled.Create\nimport androidx.compose.material.icons.filled.MoreVert\nimport androidx.compose.material.icons.outlined.Add\nimport androidx.compose.material.icons.outlined.Create\nimport androidx.compose.material.icons.outlined.MoreVert\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport com.istudio.app.R\n\nsealed class HomeNavItem(\n    val route: String,\n    val iconSelected: ImageVector,\n    val iconUnSelected: ImageVector,\n    @StringRes val title: Int\n) {\n    // <--------- MyBooks Screen --------->\n    object MyBooks : HomeNavItem(\n        route = \"myBooks\",\n        title = R.string.app_books,\n        iconSelected = Icons.Filled.Add,\n        iconUnSelected = Icons.Outlined.Add,\n    )\n\n    // <--------- BookReviews Screen --------->\n    object BookReviews : HomeNavItem(\n        route = \"bookReviews\",\n        title = R.string.app_reviews,\n        iconSelected = Icons.Filled.Create,\n        iconUnSelected = Icons.Outlined.Create,\n    )\n\n    // <--------- ReadingList Screen --------->\n    object ReadingList : HomeNavItem(\n        route = \"readingList\",\n        title = R.string.app_reading_list,\n        iconSelected = Icons.Filled.MoreVert,\n        iconUnSelected = Icons.Outlined.MoreVert,\n    )\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/stringRes/init/JavaInstanceSr.java",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.init;\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.HomeNavItem;\n\npublic class JavaInstanceSr {\n\n    public void initilize() {\n        System.out.println(HomeNavItem.BookReviews.INSTANCE.getTitle());\n    }\n\n}\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/kotlin_annotations/utils/stringRes/init/KotlinInstanceSr.kt",
    "content": "package com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.init\n\nimport com.istudio.app.modules.module_demos.kotlin_annotations.utils.stringRes.HomeNavItem\n\nclass KotlinInstanceSr {\n\n    fun initilize() {\n        println(HomeNavItem.BookReviews.title)\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/nested_vs_inner/ui/NestedVsInner.kt",
    "content": "package com.istudio.app.modules.module_demos.nested_vs_inner.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun NestedVsInner(navController: NavHostController){\n\n    val viewModel: NestedVsInnerVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Nested class Demo\", onClick = {\n            viewModel.nestedClassDemo()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Inner class Demo\", onClick = {\n            viewModel.innerClassDemo()\n        })\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/nested_vs_inner/ui/NestedVsInnerVm.kt",
    "content": "package com.istudio.app.modules.module_demos.nested_vs_inner.ui\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.modules.module_demos.nested_vs_inner.utils.OuterClass\nimport javax.inject.Inject\n\nclass NestedVsInnerVm @Inject constructor( ) : ViewModel() {\n\n    fun nestedClassDemo() {\n        val innerClassInstance = OuterClass.NestedClass()\n        println(innerClassInstance.nestedClassMember)\n        println(innerClassInstance.nestedClassFunction())\n    }\n\n    fun innerClassDemo() {\n        //Constructor of inner class InnerClass can be called only with receiver of containing class\n        //val innerClassInstance = OuterClass.InnerClass()\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/nested_vs_inner/utils/OuterClass.kt",
    "content": "package com.istudio.app.modules.module_demos.nested_vs_inner.utils\n\nclass OuterClass {\n\n    val outerClassMember = \"outerClassMember\"\n    fun outerClassFunction() { }\n\n    class NestedClass {\n        val nestedClassMember = \"nestedClassMember\"\n        fun nestedClassFunction() {\n            // This is not possible\n            // val nestedClassVariable = outerClassMember\n            // This is not possible\n            // outerClassFunction()\n        }\n    }\n\n    inner class InnerClass {\n        val innerClassMember = \"innerClassMember\"\n        fun innerClassFunction() {\n            // This is possible\n            val nestedClassVariable = outerClassMember\n            // This is possible\n            outerClassFunction()\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/ui/SealedClassDemo.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_demos.sealed_class.utils.payment.Payment\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun SealedClassDemo(navController: NavHostController) {\n\n    val viewModel: SealedClassDemoVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Create Sealed class Object\", onClick = {\n            viewModel.createSealedClassObject()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Access public members of sealed class\", onClick = {\n            viewModel.accessPublicMembers()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Access public function of sealed class\", onClick = {\n            viewModel.accessPublicFunction()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Replicating Enum function using sealed class\", onClick = {\n            viewModel.replicatingEnumFunction()\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Suggesting all possible options of state\", onClick = {\n            viewModel.suggestAllPossibleOptions(\n                Payment.BankTransfer(amount = 10, orderId = 20)\n            )\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Using Abstract variable\", onClick = {\n            viewModel.usingAbstractVariable()\n        })\n\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/ui/SealedClassDemoVm.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.ui\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.modules.module_demos.sealed_class.utils.Student.Student\nimport com.istudio.app.modules.module_demos.sealed_class.utils.animals.Tiger\nimport com.istudio.app.modules.module_demos.sealed_class.utils.payment.Payment\nimport com.istudio.app.modules.module_demos.sealed_class.utils.superHero.Hero\nimport javax.inject.Inject\n\nclass SealedClassDemoVm @Inject constructor( ) : ViewModel() {\n\n    fun createSealedClassObject() {\n        val tigerInstance = Tiger()\n        tigerInstance.printName()\n    }\n\n    fun accessPublicMembers() {\n        val tigerInstance = Tiger()\n        println(tigerInstance.publicCharacteristics)\n    }\n\n\n    fun accessPublicFunction() {\n        val tigerInstance = Tiger()\n        tigerInstance.publicCharacteristicsFunctionalities()\n    }\n\n    fun suggestAllPossibleOptions(payment: Payment) {\n        when (payment) {\n            is Payment.BankTransfer -> {\n                println(\"Bank Transfer\")\n            }\n            is Payment.CardPayment -> {\n                println(\"Card Payment\")\n            }\n            is Payment.CashPayment -> {\n                println(\"Cash Payment\")\n            }\n        }\n    }\n\n    fun usingAbstractVariable() {\n        val instance = Hero(\"DC\")\n        instance.printCompany()\n    }\n\n    fun replicatingEnumFunction() {\n        println(Student.Mahesh)\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/Student/Student.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.Student\n\nsealed class Student {\n    object Mahesh\n    object Suresh\n    object Smitha\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/animals/Animal.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.animals\n\nsealed class Animal {\n\n    // using companion object\n    companion object {\n        const val color : String = \"Red\"\n        const val age : Int =  50\n    }\n    \n    // -----------> This is not possible\n    //const val height : Int =  50\n\n    // Private member variable\n    private val privateCharacteristics : String = \"They are super powers\"\n\n    // Public member variable\n    val publicCharacteristics : String = \"They are alive\"\n\n    // Public member function\n    fun publicCharacteristicsFunctionalities() {\n        println(\"We are printing public characteristics\")\n    }\n\n    // Private data object\n    private data object Cat : Animal()\n\n    data class Dog(val name:String): Animal()\n}\n\ndata object Camel : Animal()\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/animals/Monkey.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.animals\n\nsealed class Monkey : Animal() {\n    init {\n\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/animals/Tiger.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.animals\n\nimport android.util.Log\n\nclass Tiger : Animal() {\n    fun printName() {\n        Log.d(\"DEMO\",\"Tiger class\")\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/payment/Payment.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.payment\n\nsealed class Payment {\n    data class CashPayment(val amount: Int, val pointId: Int): Payment()\n    data class CardPayment(val amount: Int, val orderId: Int): Payment()\n    data class BankTransfer(val amount: Int, val orderId: Int): Payment()\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/superHero/Hero.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.superHero\n\nclass Hero(override val comicCompany: String) : SuperHero() {\n   fun printCompany(){\n       println(comicCompany)\n   }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/sealed_class/utils/superHero/Payment.kt",
    "content": "package com.istudio.app.modules.module_demos.sealed_class.utils.superHero\n\nsealed class SuperHero {\n    abstract val comicCompany : String\n    data class Superman(val superPower: String, override val comicCompany: String): SuperHero()\n    data class WonderWoman(val superPower: String, override val comicCompany: String): SuperHero()\n    data class Batman(val superPower: String, override val comicCompany: String): SuperHero()\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/type_alias/ui/TypeAlias.kt",
    "content": "package com.istudio.app.modules.module_demos.type_alias.ui\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_demos.kotlin_annotations.ui.KotlinAnnotationsDemoVm\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun TypeAlias(navController: NavHostController) {\n\n    val viewModel: TypeAliasVm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n\n        AppButton(text = \"Demo\", onClick = {\n            viewModel.demo()\n        })\n\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/type_alias/ui/TypeAliasVm.kt",
    "content": "package com.istudio.app.modules.module_demos.type_alias.ui\n\nimport androidx.lifecycle.ViewModel\nimport com.istudio.app.modules.module_demos.type_alias.utils.AuthToken\nimport javax.inject.Inject\n\n\nclass TypeAliasVm @Inject constructor( ) : ViewModel() {\n\n    data class Student(val name : String, val age : Int, val authTolken : AuthToken)\n    data class Teacher(val name : String, val age : Int, val authTolken : AuthToken)\n\n\n    fun demo() {\n        val dataOne = Student(name = \"Mahesh\", age = 20 , authTolken = \"282828fhisb\")\n        val dataTwo = Teacher(name = \"Suresh\", age = 40 , authTolken = \"282828fhisb\")\n\n        println(dataOne.authTolken)\n        println(dataTwo.authTolken)\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_demos/type_alias/utils/TypeAliasReferences.kt",
    "content": "package com.istudio.app.modules.module_demos.type_alias.utils\n\ntypealias AuthToken = String"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_exercises/ExerciseSelection.kt",
    "content": "package com.istudio.app.modules.module_exercises\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.navigation.NavHostController\nimport com.istudio.app.modules.module_selection.ModuleDemo\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun ExerciseSelection(navController: NavHostController){\n\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Exercise-1\", onClick = {\n            navController.navigate(ModuleDemo.Exercise1.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Exercise-2\", onClick = {\n            navController.navigate(ModuleDemo.Exercise2.rout)\n        })\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_exercises/exercise_1/Exercise1.kt",
    "content": "package com.istudio.app.modules.module_exercises.exercise_1\n\nimport android.util.Log\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.material3.OutlinedTextField\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalSoftwareKeyboardController\nimport androidx.compose.ui.text.input.ImeAction\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.utils.endpoints.EndPointSimulation\nimport com.istudio.app.utils.log.ThreadInfoLogger.logThreadInfo\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun Exercise1(navController: NavHostController){\n\n    val viewModel: Exercise1vm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        var currentValue by remember { mutableStateOf(\"\") }\n        var isActionButtonEnabled by remember { mutableStateOf(false) }\n\n        val keyboardController = LocalSoftwareKeyboardController.current\n\n        OutlinedTextField(\n            value = currentValue,\n            onValueChange = {\n                currentValue = it\n                // Enable it if there are data entered in the input field\n                if(!currentValue.isNullOrBlank()){ isActionButtonEnabled = true }\n            },\n            label = { Text(text = \"Enter a value\")},\n            keyboardOptions = KeyboardOptions.Default.copy(\n                imeAction = ImeAction.Done\n            ),\n            keyboardActions = KeyboardActions(\n                onDone = { keyboardController?.hide() }\n            ),\n\n        )\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(\n            text = \"ACTION\",\n            isEnabled = isActionButtonEnabled,\n            onClick = {\n                logThreadInfo(\"button callback\")\n                isActionButtonEnabled = false\n\n                CoroutineScope(Dispatchers.Default).launch {\n                    // -------> Observe here since the long running operation is performed on separate task, UI is not blocked\n                    val repo = EndPointSimulation.endPointCall(\"12\")\n                    Log.d(\"endpoint\",\"Reputation:->$repo\")\n                }\n\n                isActionButtonEnabled = true\n            }\n        )\n\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_exercises/exercise_1/Exercise1vm.kt",
    "content": "package com.istudio.app.modules.module_exercises.exercise_1\n\nimport androidx.lifecycle.ViewModel\nimport javax.inject.Inject\n\nclass Exercise1vm @Inject constructor( ) : ViewModel() {\n\n    fun demo() {\n\n    }\n\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_exercises/exercise_2/Exercise2.kt",
    "content": "package com.istudio.app.modules.module_exercises.exercise_2\n\nimport android.util.Log\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.material3.OutlinedTextField\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalSoftwareKeyboardController\nimport androidx.compose.ui.text.input.ImeAction\nimport androidx.compose.ui.unit.dp\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\nimport com.istudio.app.utils.endpoints.EndPointSimulation\nimport com.istudio.app.utils.log.ThreadInfoLogger.logThreadInfo\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun Exercise2(navController: NavHostController){\n\n    val viewModel: Exercise2vm = hiltViewModel()\n\n    Column(\n        modifier = Modifier.fillMaxSize(),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center\n    ) {\n\n        AppButton(text = \"Blocking Type - Demo\") {\n            viewModel.blockingTypeDemo()\n        }\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Suspending Type - Demo\") {\n            viewModel.suspendingTypeDemo()\n        }\n\n\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_exercises/exercise_2/Exercise2vm.kt",
    "content": "package com.istudio.app.modules.module_exercises.exercise_2\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\nimport kotlin.concurrent.thread\n\nclass Exercise2vm @Inject constructor( ) : ViewModel() {\n\n    fun blockingTypeDemo() {\n        val beforeThreadName = Thread.currentThread().name\n        println(\"Before calling threads, Execute in -> $beforeThreadName\")\n        // Call thread 1\n        initiateNewThread(1)\n        // Call thread 2\n        initiateNewThread(2)\n        val threadNameLater = Thread.currentThread().name\n        Thread.sleep(600)\n        println(\"After calling threads, Execute in -> $threadNameLater\")\n    }\n\n    private fun initiateNewThread(threadNo : Int) {\n        thread {\n            val threadName = Thread.currentThread().name\n            for (i in 1..4){\n                println(\"Task $threadNo with count$i is running on -> $threadName\")\n                Thread.sleep(100)\n            }\n        }\n    }\n\n\n    fun suspendingTypeDemo() {\n        val beforeThreadName = Thread.currentThread().name\n        println(\"Before calling threads, Execute in -> $beforeThreadName\")\n        CoroutineScope(Dispatchers.Main.immediate).launch {\n            joinAll(\n                // Call thread 1\n                launch { initiateNewCoroutine(1) },\n                // Call thread 2\n                launch { initiateNewCoroutine(2) }\n            )\n        }\n        val threadNameLater = Thread.currentThread().name\n        println(\"After calling threads, Execute in -> $threadNameLater\")\n    }\n\n\n    private suspend fun initiateNewCoroutine(threadNo : Int) {\n        val threadName = Thread.currentThread().name\n        for (i in 1..4){\n            println(\"Task $threadNo with count$i is running on -> $threadName\")\n            delay(100)\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_selection/ModuleDemo.kt",
    "content": "package com.istudio.app.modules.module_selection\nsealed class ModuleDemo(val rout: String) {\n\n    data object DemoSelection : ModuleDemo(\"DemoSelection\")\n    data object KotlinBasicsDemo : ModuleDemo(\"KotlinBasicsDemo\")\n    data object SealedClassDemo : ModuleDemo(\"SealedClassDemo\")\n    data object HigherOrderFunctions : ModuleDemo(\"HigherOrderFunctions\")\n    data object AnnotationsInKotlin : ModuleDemo(\"AnnotationsInKotlin\")\n    data object TypeAlias : ModuleDemo(\"TypeAlias\")\n    data object ChannelsDemo : ModuleDemo(\"ChannelsDemo\")\n    data object FlowsSelection : ModuleDemo(\"FlowsSelection\")\n    data object FlowBasics : ModuleDemo(\"FlowBasics\")\n    data object DisplayDataFromServer : ModuleDemo(\"DisplayDataFromServer\")\n    data object TerminalOperators : ModuleDemo(\"TerminalOperators\")\n    data object IntermediateOperators : ModuleDemo(\"IntermediateOperators\")\n    data object NestedVsInner : ModuleDemo(\"NestedVsInner\")\n    data object CoroutinesDemo : ModuleDemo(\"CoroutinesDemo\")\n    data object Exercises : ModuleDemo(\"Exercises\")\n    data object Exercise1 : ModuleDemo(\"Exercise1\")\n    data object Exercise2 : ModuleDemo(\"Exercise2\")\n    data object SimpleStructuredConcurrencyDemo : ModuleDemo(\"SimpleStructuredConcurrencyDemo\")\n    data object DispatchersDemo : ModuleDemo(\"DispatchersDemo\")\n    data object CoroutinesCancellationSelection : ModuleDemo(\"CoroutinesCancellationSelection\")\n    data object RootChildrenCancelDemo : ModuleDemo(\"RootChildrenCancelDemo\")\n    data object CoroutinesCancellationIsActiveDemo : ModuleDemo(\"CoroutinesCancellationIsActiveDemo\")\n    data object EnsureActiveDemo : ModuleDemo(\"EnsureActiveDemo\")\n    data object NonCancellableDemo : ModuleDemo(\"NonCancellableDemo\")\n    data object SuspendAndLaunchDemo : ModuleDemo(\"SuspendAndLaunchDemo\")\n    data object LaunchAndWithContextDemo : ModuleDemo(\"LaunchAndWithContextDemo\")\n    data object JobDemoSelection : ModuleDemo(\"JobDemoSelection\")\n    data object UsingJoinDemo : ModuleDemo(\"UsingJoinDemo\")\n    data object UsingAsyncAwaitDemo : ModuleDemo(\"UsingAsyncAwaitDemo\")\n    data object ExceptionHandlingSelectionDemo : ModuleDemo(\"ExceptionHandlingSelectionDemo\")\n    data object UsingLaunchExceptionHandleDemo : ModuleDemo(\"UsingLaunchExceptionHandleDemo\")\n    data object UsingAsyncExceptionHandleDemo : ModuleDemo(\"UsingAsyncExceptionHandleDemo\")\n    data object ComposingAndFlatteningTheFlows : ModuleDemo(\"ComposingAndFlatteningTheFlows\")\n    data object StateAndSharedFlowDemo : ModuleDemo(\"StateAndSharedFlowDemo\")\n    data object MutableStateOfFlowDemo : ModuleDemo(\"MutableStateOfFlowDemo\")\n    data object FlattenFlowsDemo : ModuleDemo(\"FlattenFlowsDemo\")\n    data object CompareJoinAsyncDemo : ModuleDemo(\"CompareJoinAsyncDemo\")\n    data object CollectAsStateWithLifeCycle : ModuleDemo(\"CollectAsStateWithLifeCycle\")\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/modules/module_selection/ModuleSelectionScreen.kt",
    "content": "package com.istudio.app.modules.module_selection\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.navigation.NavHostController\nimport com.istudio.app.ui.composables.AppButton\n\n@Composable\nfun ModuleSelectionScreen(navController: NavHostController) {\n    Column(\n        modifier = Modifier.fillMaxSize().padding(10.dp),\n        horizontalAlignment = Alignment.CenterHorizontally,\n        verticalArrangement = Arrangement.Center,\n    ) {\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Kotlin Basics\", onClick = {\n            navController.navigate(ModuleDemo.KotlinBasicsDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Sealed Class\", onClick = {\n            navController.navigate(ModuleDemo.SealedClassDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Annotations in kotlin\", onClick = {\n            navController.navigate(ModuleDemo.AnnotationsInKotlin.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Type Alias\", onClick = {\n            navController.navigate(ModuleDemo.TypeAlias.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Higher Order Functions\", onClick = {\n            navController.navigate(ModuleDemo.HigherOrderFunctions.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"NestedVsInner\", onClick = {\n            navController.navigate(ModuleDemo.NestedVsInner.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Channels\", onClick = {\n            navController.navigate(ModuleDemo.ChannelsDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Flows\", onClick = {\n            navController.navigate(ModuleDemo.FlowsSelection.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Coroutines\", onClick = {\n            navController.navigate(ModuleDemo.CoroutinesDemo.rout)\n        })\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        AppButton(text = \"Exercises\", onClick = {\n            navController.navigate(ModuleDemo.Exercises.rout)\n        })\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/composables/Buttons.kt",
    "content": "package com.istudio.app.ui.composables\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.ButtonDefaults\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\n\n@Composable\nfun AppButton(\n    modifier: Modifier = Modifier,\n    text: String,\n    isEnabled : Boolean =  true,\n    onClick: () -> Unit\n) {\n\n    val gradientColor = listOf(Color(0xFFff00cc), Color(0xFF333399))\n\n    Button(\n        modifier = Modifier\n            .fillMaxWidth()\n            .padding(start = 32.dp, end = 32.dp),\n        onClick = onClick,\n        enabled = isEnabled,\n        contentPadding = PaddingValues(),\n        colors = ButtonDefaults.buttonColors(\n            containerColor = Color.Transparent\n        ),\n    ) {\n\n        Box(\n            modifier = Modifier\n                .fillMaxWidth()\n                .background(\n                    brush = Brush.horizontalGradient(colors = gradientColor),\n                )\n                .padding(horizontal = 16.dp, vertical = 8.dp),\n            contentAlignment = Alignment.Center\n        ) {\n            Text(\n                text = text,\n                fontSize = 20.sp,\n                color = Color.White,\n                textAlign = TextAlign.Center\n            )\n        }\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/composables/Text.kt",
    "content": "package com.istudio.app.ui.composables\n\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.style.TextAlign\n\n@Composable\nfun AppText(\n    modifier: Modifier = Modifier,\n    text: String\n) {\n    Text(text = text, textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth())\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/theme/Color.kt",
    "content": "package com.istudio.app.ui.theme\n\nimport androidx.compose.ui.graphics.Color\n\nval Purple80 = Color(0xFFD0BCFF)\nval PurpleGrey80 = Color(0xFFCCC2DC)\nval Pink80 = Color(0xFFEFB8C8)\n\nval Purple40 = Color(0xFF6650a4)\nval PurpleGrey40 = Color(0xFF625b71)\nval Pink40 = Color(0xFF7D5260)"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/theme/Shape.kt",
    "content": "package com.istudio.app.ui.theme\n\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Shapes\nimport androidx.compose.ui.unit.dp\n\nval Shapes = Shapes(\n    small = RoundedCornerShape(4.dp),\n    medium = RoundedCornerShape(4.dp),\n    large = RoundedCornerShape(0.dp)\n)"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/theme/Theme.kt",
    "content": "package com.istudio.app.ui.theme\n\nimport android.app.Activity\nimport android.os.Build\nimport androidx.compose.foundation.isSystemInDarkTheme\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.darkColorScheme\nimport androidx.compose.material3.dynamicDarkColorScheme\nimport androidx.compose.material3.dynamicLightColorScheme\nimport androidx.compose.material3.lightColorScheme\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.SideEffect\nimport androidx.compose.ui.graphics.toArgb\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.platform.LocalView\nimport androidx.core.view.WindowCompat\n\nprivate val DarkColorScheme = darkColorScheme(\n    primary = Purple80,\n    secondary = PurpleGrey80,\n    tertiary = Pink80\n)\n\nprivate val LightColorScheme = lightColorScheme(\n    primary = Purple40,\n    secondary = PurpleGrey40,\n    tertiary = Pink40\n\n    /* Other default colors to override\n    background = Color(0xFFFFFBFE),\n    surface = Color(0xFFFFFBFE),\n    onPrimary = Color.White,\n    onSecondary = Color.White,\n    onTertiary = Color.White,\n    onBackground = Color(0xFF1C1B1F),\n    onSurface = Color(0xFF1C1B1F),\n    */\n)\n\n@Composable\nfun KotlinConceptsTheme(\n    darkTheme: Boolean = isSystemInDarkTheme(),\n    // Dynamic color is available on Android 12+\n    dynamicColor: Boolean = true,\n    content: @Composable () -> Unit\n) {\n    val colorScheme = when {\n        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n            val context = LocalContext.current\n            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)\n        }\n\n        darkTheme -> DarkColorScheme\n        else -> LightColorScheme\n    }\n    val view = LocalView.current\n    if (!view.isInEditMode) {\n        SideEffect {\n            val window = (view.context as Activity).window\n            window.statusBarColor = colorScheme.primary.toArgb()\n            WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme\n        }\n    }\n\n    MaterialTheme(\n        colorScheme = colorScheme,\n        typography = Typography,\n        content = content\n    )\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/ui/theme/Type.kt",
    "content": "package com.istudio.app.ui.theme\n\nimport androidx.compose.material3.Typography\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.Font\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\nimport com.istudio.app.R\n\n// Set of Material typography styles to start with\nval jostFontFamily = FontFamily(\n    Font(R.font.jost_book, FontWeight.Normal),\n    Font(R.font.jost_book, FontWeight.Light),\n    Font(R.font.jost_book, FontWeight.Medium),\n    Font(R.font.jost_medium, FontWeight.SemiBold),\n    Font(R.font.jost_medium, FontWeight.Bold),\n)\n\n// Set of Material typography styles to start with\nval Typography = Typography(\n\n    displayLarge = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Light,\n        fontSize = 57.sp,\n        lineHeight = 64.sp,\n        letterSpacing = 0.sp\n    ),\n    displayMedium = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Light,\n        fontSize = 45.sp,\n        lineHeight = 52.sp,\n        letterSpacing = 0.sp\n    ),\n    displaySmall = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Normal,\n        fontSize = 36.sp,\n        lineHeight = 44.sp,\n        letterSpacing = 0.sp\n    ),\n    headlineLarge = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 32.sp,\n        lineHeight = 40.sp,\n        letterSpacing = 0.sp\n    ),\n    headlineMedium = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 28.sp,\n        lineHeight = 36.sp,\n        letterSpacing = 0.sp\n    ),\n    headlineSmall = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 24.sp,\n        lineHeight = 32.sp,\n        letterSpacing = 0.sp\n    ),\n    titleLarge = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 22.sp,\n        lineHeight = 28.sp,\n        letterSpacing = 0.sp\n    ),\n    titleMedium = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 16.sp,\n        lineHeight = 24.sp,\n        letterSpacing = 0.15.sp\n    ),\n    titleSmall = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Bold,\n        fontSize = 14.sp,\n        lineHeight = 20.sp,\n        letterSpacing = 0.1.sp\n    ),\n    bodyLarge = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Normal,\n        fontSize = 16.sp,\n        lineHeight = 24.sp,\n        letterSpacing = 0.15.sp\n    ),\n    bodyMedium = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Medium,\n        fontSize = 14.sp,\n        lineHeight = 20.sp,\n        letterSpacing = 0.25.sp\n    ),\n    bodySmall = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.Bold,\n        fontSize = 12.sp,\n        lineHeight = 16.sp,\n        letterSpacing = 0.4.sp\n    ),\n    labelLarge = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 14.sp,\n        lineHeight = 20.sp,\n        letterSpacing = 0.1.sp\n    ),\n    labelMedium = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 12.sp,\n        lineHeight = 16.sp,\n        letterSpacing = 0.5.sp\n    ),\n    labelSmall = TextStyle(\n        fontFamily = jostFontFamily,\n        fontWeight = FontWeight.SemiBold,\n        fontSize = 11.sp,\n        lineHeight = 16.sp,\n        letterSpacing = 0.5.sp\n    )\n)"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/utils/base/BaseViewModel.kt",
    "content": "package com.istudio.app.utils.base\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\n\nopen class BaseViewModel<T> : ViewModel() {\n\n    fun uiState(): LiveData<T> = uiState\n    protected val uiState: MutableLiveData<T> = MutableLiveData()\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/utils/endpoints/EndPointSimulation.kt",
    "content": "package com.istudio.app.utils.endpoints\n\nimport com.istudio.app.utils.log.ThreadInfoLogger\nimport kotlin.random.Random\n\nobject EndPointSimulation {\n    fun endPointCall(userId: String): Int {\n        ThreadInfoLogger.logThreadInfo(\"EndPointSimulation#endPointCall(): called\")\n        Thread.sleep(10000)\n        ThreadInfoLogger.logThreadInfo(\"EndPointSimulation#endPointCall(): return data\")\n        return Random.nextInt(0, 100)\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/utils/extensions/Activity.kt",
    "content": "package com.istudio.app.utils.extensions\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\n\n\n/** ************************* Launching activity ************************* **/\n\n/** SAMPLE ->\nopenActivity(MyActivity::class.java) {\nputString(\"string.key\", \"string.value\")\nputInt(\"string.key\", 43)\n...\n}\n */\nfun <T> Context.openActivity(it: Class<T>, extras: Bundle.() -> Unit = {}) {\n    val intent = Intent(this, it)\n    intent.putExtras(Bundle().apply(extras))\n    startActivity(intent)\n}\n/** ************************* Launching activity ************************* **/"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/utils/extensions/Coroutine.kt",
    "content": "package com.istudio.app.utils.extensions\n\nimport kotlinx.coroutines.CoroutineName\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\n\nfun CoroutineScope.printCoroutineScopeInfo() {\n    println(\"<--------------------------------------------->\")\n    println(\"Scope: $this\")\n    println(\"Name: ${this.coroutineContext[CoroutineName]?.name}\")\n    println(\"Context: ${this.coroutineContext}\")\n    println(\"Job: ${this.coroutineContext[Job]}\")\n    println(\"<--------------------------------------------->\")\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/java/com/istudio/app/utils/log/ThreadInfoLogger.kt",
    "content": "package com.istudio.app.utils.log\n\nimport android.util.Log\n\nobject ThreadInfoLogger {\n\n    private const val TAG = \"ThreadInfoLogger\"\n\n    fun logThreadInfo(message: String) {\n        Log.i(TAG, \"$message; thread name: ${Thread.currentThread().name}; thread ID: ${Thread.currentThread().id}\")\n    }\n\n}"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/drawable/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purple_500\">#FF6200EE</color>\n    <color name=\"purple_700\">#FF3700B3</color>\n    <color name=\"teal_200\">#FF03DAC5</color>\n    <color name=\"teal_700\">#FF018786</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n</resources>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">KotlinConcepts</string>\n    <string name=\"app_books\">Books</string>\n    <string name=\"app_reviews\">Reviews</string>\n    <string name=\"app_reading_list\">ReadingList</string>\n</resources>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.KotlinConcepts\" parent=\"android:Theme.Material.Light.NoActionBar\" />\n</resources>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/xml/backup_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See https://developer.android.com/guide/topics/data/autobackup\n   for details.\n   Note: This file is ignored for devices older that API 31\n   See https://developer.android.com/about/versions/12/backup-restore\n-->\n<full-backup-content>\n    <!--\n   <include domain=\"sharedpref\" path=\".\"/>\n   <exclude domain=\"sharedpref\" path=\"device.xml\"/>\n-->\n</full-backup-content>"
  },
  {
    "path": "application/KotlinConcepts/app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <!-- TODO: Use <include> and <exclude> to control what is backed up.\n        <include .../>\n        <exclude .../>\n        -->\n    </cloud-backup>\n    <!--\n    <device-transfer>\n        <include .../>\n        <exclude .../>\n    </device-transfer>\n    -->\n</data-extraction-rules>"
  },
  {
    "path": "application/KotlinConcepts/app/src/test/java/com/istudio/app/ExampleUnitTest.kt",
    "content": "package com.istudio.app\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}"
  },
  {
    "path": "application/KotlinConcepts/build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nplugins {\n    id(\"com.android.application\") version \"8.5.2\" apply false\n    id(\"org.jetbrains.kotlin.android\") version \"1.9.0\" apply false\n    id(\"com.google.dagger.hilt.android\") version \"2.44\" apply false\n    id(\"org.jetbrains.kotlin.jvm\") version \"1.9.24\" apply false\n}"
  },
  {
    "path": "application/KotlinConcepts/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Dec 21 10:35:24 IST 2023\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.9-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "application/KotlinConcepts/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\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# 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# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Enables namespacing of each library's R class so that its R class includes only the\n# resources declared in the library itself and none from the library's dependencies,\n# thereby reducing the size of the R class for that library\nandroid.nonTransitiveRClass=true"
  },
  {
    "path": "application/KotlinConcepts/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\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\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=`expr $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\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "application/KotlinConcepts/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 Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\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 execute\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 execute\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:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\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 %*\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": "application/KotlinConcepts/settings.gradle.kts",
    "content": "pluginManagement {\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.name = \"KotlinAlchemy\"\ninclude(\":app\")\n"
  },
  {
    "path": "application/Sample-Coroutines/.idea/.name",
    "content": "My Application"
  },
  {
    "path": "application/Sample-Coroutines/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <bytecodeTargetLevel target=\"17\" />\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/deploymentTargetDropDown.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetDropDown\">\n    <value>\n      <entry key=\"app\">\n        <State />\n      </entry>\n    </value>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/deploymentTargetSelector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetSelector\">\n    <selectionStates>\n      <SelectionState runConfigName=\"app\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n    </selectionStates>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"gradleJvm\" value=\"#GRADLE_LOCAL_JAVA_HOME\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/buildSrc\" />\n          </set>\n        </option>\n        <option name=\"resolveExternalAnnotations\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/kotlinc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"KotlinJpsPluginSettings\">\n    <option name=\"version\" value=\"1.6.21\" />\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/material_theme_project_new.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MaterialThemeProjectNewConfig\">\n    <option name=\"metadata\">\n      <MTProjectMetadataState>\n        <option name=\"userId\" value=\"313bedf3:1906d0556e1:-7f72\" />\n      </MTProjectMetadataState>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/migrations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectMigrations\">\n    <option name=\"MigrateToGradleLocalJavaHome\">\n      <set>\n        <option value=\"$PROJECT_DIR$\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/misc.xml",
    "content": "<project version=\"4\">\n  <component name=\"ExternalStorageConfigurationManager\" enabled=\"true\" />\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_17\" default=\"true\" project-jdk-name=\"jbr-17\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/Sample-Coroutines.iml\" filepath=\"$PROJECT_DIR$/.idea/Sample-Coroutines.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/other.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"direct_access_persist.xml\">\n    <option name=\"deviceSelectionList\">\n      <list>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"27\" />\n          <option name=\"brand\" value=\"DOCOMO\" />\n          <option name=\"codename\" value=\"F01L\" />\n          <option name=\"id\" value=\"F01L\" />\n          <option name=\"manufacturer\" value=\"FUJITSU\" />\n          <option name=\"name\" value=\"F-01L\" />\n          <option name=\"screenDensity\" value=\"360\" />\n          <option name=\"screenX\" value=\"720\" />\n          <option name=\"screenY\" value=\"1280\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"28\" />\n          <option name=\"brand\" value=\"DOCOMO\" />\n          <option name=\"codename\" value=\"SH-01L\" />\n          <option name=\"id\" value=\"SH-01L\" />\n          <option name=\"manufacturer\" value=\"SHARP\" />\n          <option name=\"name\" value=\"AQUOS sense2 SH-01L\" />\n          <option name=\"screenDensity\" value=\"480\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2160\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"a51\" />\n          <option name=\"id\" value=\"a51\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy A51\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"akita\" />\n          <option name=\"id\" value=\"akita\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"b0q\" />\n          <option name=\"id\" value=\"b0q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S22 Ultra\" />\n          <option name=\"screenDensity\" value=\"600\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3088\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"32\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"bluejay\" />\n          <option name=\"id\" value=\"bluejay\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 6a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"29\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"crownqlteue\" />\n          <option name=\"id\" value=\"crownqlteue\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Note9\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2220\" />\n          <option name=\"screenY\" value=\"1080\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"dm3q\" />\n          <option name=\"id\" value=\"dm3q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S23 Ultra\" />\n          <option name=\"screenDensity\" value=\"600\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3088\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"felix\" />\n          <option name=\"id\" value=\"felix\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Fold\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2208\" />\n          <option name=\"screenY\" value=\"1840\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"felix_camera\" />\n          <option name=\"id\" value=\"felix_camera\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Fold (Camera-enabled)\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"2208\" />\n          <option name=\"screenY\" value=\"1840\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"gts8uwifi\" />\n          <option name=\"id\" value=\"gts8uwifi\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Tab S8 Ultra\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"1848\" />\n          <option name=\"screenY\" value=\"2960\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"husky\" />\n          <option name=\"id\" value=\"husky\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8 Pro\" />\n          <option name=\"screenDensity\" value=\"390\" />\n          <option name=\"screenX\" value=\"1008\" />\n          <option name=\"screenY\" value=\"2244\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"motorola\" />\n          <option name=\"codename\" value=\"java\" />\n          <option name=\"id\" value=\"java\" />\n          <option name=\"manufacturer\" value=\"Motorola\" />\n          <option name=\"name\" value=\"G20\" />\n          <option name=\"screenDensity\" value=\"280\" />\n          <option name=\"screenX\" value=\"720\" />\n          <option name=\"screenY\" value=\"1600\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"lynx\" />\n          <option name=\"id\" value=\"lynx\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 7a\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"oriole\" />\n          <option name=\"id\" value=\"oriole\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 6\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"panther\" />\n          <option name=\"id\" value=\"panther\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 7\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"31\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"q2q\" />\n          <option name=\"id\" value=\"q2q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Z Fold3\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1768\" />\n          <option name=\"screenY\" value=\"2208\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"q5q\" />\n          <option name=\"id\" value=\"q5q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy Z Fold5\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1812\" />\n          <option name=\"screenY\" value=\"2176\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"r11\" />\n          <option name=\"id\" value=\"r11\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Watch\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"384\" />\n          <option name=\"screenY\" value=\"384\" />\n          <option name=\"type\" value=\"WEAR_OS\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"30\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"redfin\" />\n          <option name=\"id\" value=\"redfin\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 5\" />\n          <option name=\"screenDensity\" value=\"440\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2340\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"34\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"shiba\" />\n          <option name=\"id\" value=\"shiba\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel 8\" />\n          <option name=\"screenDensity\" value=\"420\" />\n          <option name=\"screenX\" value=\"1080\" />\n          <option name=\"screenY\" value=\"2400\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"33\" />\n          <option name=\"brand\" value=\"google\" />\n          <option name=\"codename\" value=\"tangorpro\" />\n          <option name=\"id\" value=\"tangorpro\" />\n          <option name=\"manufacturer\" value=\"Google\" />\n          <option name=\"name\" value=\"Pixel Tablet\" />\n          <option name=\"screenDensity\" value=\"320\" />\n          <option name=\"screenX\" value=\"1600\" />\n          <option name=\"screenY\" value=\"2560\" />\n        </PersistentDeviceSelectionData>\n        <PersistentDeviceSelectionData>\n          <option name=\"api\" value=\"29\" />\n          <option name=\"brand\" value=\"samsung\" />\n          <option name=\"codename\" value=\"x1q\" />\n          <option name=\"id\" value=\"x1q\" />\n          <option name=\"manufacturer\" value=\"Samsung\" />\n          <option name=\"name\" value=\"Galaxy S20\" />\n          <option name=\"screenDensity\" value=\"480\" />\n          <option name=\"screenX\" value=\"1440\" />\n          <option name=\"screenY\" value=\"3200\" />\n        </PersistentDeviceSelectionData>\n      </list>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AutoImportSettings\">\n    <option name=\"autoReloadType\" value=\"NONE\" />\n  </component>\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"61d7ac74-4b73-41c0-b134-e882ebc70049\" name=\"Changes\" comment=\"\">\n      <change beforePath=\"$PROJECT_DIR$/.idea/misc.xml\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/.idea/misc.xml\" afterDir=\"false\" />\n    </list>\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"ClangdSettings\">\n    <option name=\"formatViaClangd\" value=\"false\" />\n  </component>\n  <component name=\"ExecutionTargetManager\" SELECTED_TARGET=\"device_and_snapshot_combo_box_target[741e15a5]\" />\n  <component name=\"ExternalProjectsData\">\n    <projectState path=\"$PROJECT_DIR$\">\n      <ProjectState />\n    </projectState>\n  </component>\n  <component name=\"ExternalProjectsManager\">\n    <system id=\"GRADLE\">\n      <state>\n        <projects_view>\n          <tree_state>\n            <expand />\n            <select />\n          </tree_state>\n        </projects_view>\n      </state>\n    </system>\n  </component>\n  <component name=\"Git.Settings\">\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$/../..\" />\n  </component>\n  <component name=\"GitHubPullRequestSearchHistory\"><![CDATA[{\n  \"lastFilter\": {\n    \"state\": \"OPEN\",\n    \"assignee\": \"devrath-teg\"\n  }\n}]]></component>\n  <component name=\"GithubPullRequestsUISettings\"><![CDATA[{\n  \"selectedUrlAndAccountId\": {\n    \"url\": \"https://github.com/devrath/KotlinAlchemy.git\",\n    \"accountId\": \"d05ec870-8e6d-405e-a146-f6bbe30d691b\"\n  }\n}]]></component>\n  <component name=\"MarkdownSettingsMigration\">\n    <option name=\"stateVersion\" value=\"1\" />\n  </component>\n  <component name=\"ProjectColorInfo\"><![CDATA[{\n  \"associatedIndex\": 3\n}]]></component>\n  <component name=\"ProjectId\" id=\"2ZzcwQgk81cCPbv0jGNMs5KF6LR\" />\n  <component name=\"ProjectViewState\">\n    <option name=\"showLibraryContents\" value=\"true\" />\n  </component>\n  <component name=\"PropertiesComponent\"><![CDATA[{\n  \"keyToString\": {\n    \"RunOnceActivity.OpenProjectViewOnStart\": \"true\",\n    \"RunOnceActivity.ShowReadmeOnStart\": \"true\",\n    \"RunOnceActivity.cidr.known.project.marker\": \"true\",\n    \"RunOnceActivity.readMode.enableVisualFormatting\": \"true\",\n    \"android.gradle.sync.needed\": \"true\",\n    \"cf.first.check.clang-format\": \"false\",\n    \"cidr.known.project.marker\": \"true\",\n    \"git-widget-placeholder\": \"main\",\n    \"kotlin-language-version-configured\": \"true\",\n    \"last_opened_file_path\": \"/Users/devrathad/Documents/Personal/github/KotlinAlchemy/application/Sample-Coroutines\"\n  }\n}]]></component>\n  <component name=\"RunManager\">\n    <configuration name=\"app\" type=\"AndroidRunConfigurationType\" factoryName=\"Android App\">\n      <module name=\"My_Application.app.main\" />\n      <option name=\"DEPLOY\" value=\"true\" />\n      <option name=\"DEPLOY_APK_FROM_BUNDLE\" value=\"false\" />\n      <option name=\"DEPLOY_AS_INSTANT\" value=\"false\" />\n      <option name=\"ARTIFACT_NAME\" value=\"\" />\n      <option name=\"PM_INSTALL_OPTIONS\" value=\"\" />\n      <option name=\"ALL_USERS\" value=\"false\" />\n      <option name=\"ALWAYS_INSTALL_WITH_PM\" value=\"false\" />\n      <option name=\"CLEAR_APP_STORAGE\" value=\"false\" />\n      <option name=\"DYNAMIC_FEATURES_DISABLED_LIST\" value=\"\" />\n      <option name=\"ACTIVITY_EXTRA_FLAGS\" value=\"\" />\n      <option name=\"MODE\" value=\"default_activity\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"false\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"false\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"DEVICE_AND_SNAPSHOT_COMBO_BOX\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_CONFIGURATION_ID\" value=\"-1\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_PROJECT_ID\" value=\"\" />\n      <option name=\"DEBUGGER_TYPE\" value=\"Auto\" />\n      <Auto>\n        <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"false\" />\n        <option name=\"SHOW_STATIC_VARS\" value=\"true\" />\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n        <option name=\"SHOW_OPTIMIZED_WARNING\" value=\"true\" />\n        <option name=\"ATTACH_ON_WAIT_FOR_DEBUGGER\" value=\"false\" />\n        <option name=\"DEBUG_SANDBOX_SDK\" value=\"false\" />\n      </Auto>\n      <Hybrid>\n        <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"false\" />\n        <option name=\"SHOW_STATIC_VARS\" value=\"true\" />\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n        <option name=\"SHOW_OPTIMIZED_WARNING\" value=\"true\" />\n        <option name=\"ATTACH_ON_WAIT_FOR_DEBUGGER\" value=\"false\" />\n        <option name=\"DEBUG_SANDBOX_SDK\" value=\"false\" />\n      </Hybrid>\n      <Java>\n        <option name=\"ATTACH_ON_WAIT_FOR_DEBUGGER\" value=\"false\" />\n        <option name=\"DEBUG_SANDBOX_SDK\" value=\"false\" />\n      </Java>\n      <Native>\n        <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"false\" />\n        <option name=\"SHOW_STATIC_VARS\" value=\"true\" />\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n        <option name=\"SHOW_OPTIMIZED_WARNING\" value=\"true\" />\n        <option name=\"ATTACH_ON_WAIT_FOR_DEBUGGER\" value=\"false\" />\n        <option name=\"DEBUG_SANDBOX_SDK\" value=\"false\" />\n      </Native>\n      <Profilers>\n        <option name=\"ADVANCED_PROFILING_ENABLED\" value=\"false\" />\n        <option name=\"STARTUP_PROFILING_ENABLED\" value=\"false\" />\n        <option name=\"STARTUP_CPU_PROFILING_ENABLED\" value=\"false\" />\n        <option name=\"STARTUP_CPU_PROFILING_CONFIGURATION_NAME\" value=\"Java/Kotlin Method Sample (legacy)\" />\n        <option name=\"STARTUP_NATIVE_MEMORY_PROFILING_ENABLED\" value=\"false\" />\n        <option name=\"NATIVE_MEMORY_SAMPLE_RATE_BYTES\" value=\"2048\" />\n      </Profilers>\n      <option name=\"DEEP_LINK\" value=\"\" />\n      <option name=\"ACTIVITY_CLASS\" value=\"\" />\n      <option name=\"SEARCH_ACTIVITY_IN_GLOBAL_SCOPE\" value=\"false\" />\n      <option name=\"SKIP_ACTIVITY_VALIDATION\" value=\"false\" />\n      <method v=\"2\">\n        <option name=\"Android.Gradle.BeforeRunTask\" enabled=\"true\" />\n      </method>\n    </configuration>\n  </component>\n  <component name=\"SpellCheckerSettings\" RuntimeDictionaries=\"0\" Folders=\"0\" CustomDictionaries=\"0\" DefaultDictionary=\"application-level\" UseSingleDictionary=\"true\" transferred=\"true\" />\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"61d7ac74-4b73-41c0-b134-e882ebc70049\" name=\"Changes\" comment=\"\" />\n      <created>1703428587072</created>\n      <option name=\"number\" value=\"Default\" />\n      <option name=\"presentableId\" value=\"Default\" />\n      <updated>1703428587072</updated>\n    </task>\n    <servers />\n  </component>\n</project>"
  },
  {
    "path": "application/Sample-Coroutines/README.md",
    "content": "# DroidCoroutinesUsecases\n![Banner](https://github.com/devrath/solid-kotlin-basics/blob/main/assets/kotlin_banner.png)\n\n<p align=\"center\">\n<a><img src=\"https://img.shields.io/badge/Built%20Using-Kotlin-silver?style=for-the-badge&logo=kotlin\"></a>\n<a><img src=\"https://img.shields.io/badge/Built%20By-intellij-red?style=for-the-badge&logo=IntelliJ%20IDEA\"></a>  \n<a><img src=\"https://img.shields.io/badge/Built%20By-Android%20Studio-red?style=for-the-badge&logo=android%20studio\"></a>  \n</p>\n\n* **`Check wiki tab above to access the documentation and some use cases`**  \n* **`This repository demonstrates how we can use coroutines in android development`** \n\n<p align=\"center\">\n<a><img src=\"https://forthebadge.com/images/badges/built-for-android.svg\"></a>\n</p>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "application/Sample-Coroutines/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\napply plugin: 'kotlin-kapt'\napply plugin: 'dagger.hilt.android.plugin'\napply plugin: 'kotlin-kapt'\n\nandroid {\n    compileSdkVersion 31\n    buildToolsVersion \"29.0.3\"\n\n    defaultConfig {\n        applicationId \"com.demo.code\"\n        minSdkVersion 21\n        targetSdkVersion 31\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    viewBinding {\n        enabled = true\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_1_8.toString()\n    }\n\n}\n\ndependencies {\n\n    def lifecycle_version = \"2.3.1\"\n    def coroutines_version = \"1.5.0\"\n\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.21\"\n\n    implementation \"org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version\"\n    implementation \"org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version\"\n\n    implementation 'androidx.appcompat:appcompat:1.3.1'\n    implementation 'com.google.android.material:material:1.4.0'\n\n    implementation 'androidx.core:core-ktx:1.6.0'\n    implementation \"androidx.activity:activity-ktx:1.3.1\"\n\n    implementation 'androidx.constraintlayout:constraintlayout:2.1.1'\n    implementation 'androidx.recyclerview:recyclerview:1.2.1'\n    implementation 'androidx.cardview:cardview:1.0.0'\n\n    implementation \"androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version\"\n    implementation \"androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version\"\n\n    implementation 'com.squareup.retrofit2:retrofit:2.9.0'\n    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'\n    implementation 'com.google.code.gson:gson:2.8.6'\n    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'\n\n    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'\n    implementation 'io.reactivex.rxjava2:rxjava:2.2.19'\n    implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'\n\n    implementation \"androidx.lifecycle:lifecycle-common-java8:$lifecycle_version\"\n\n    def work_manager_version = \"2.6.0\"\n    implementation \"androidx.work:work-runtime:$work_manager_version\"\n    implementation \"androidx.work:work-runtime-ktx:$work_manager_version\"\n\n    implementation 'com.jakewharton.timber:timber:4.7.1'\n\n    def room_version = \"2.3.0\"\n    implementation \"androidx.room:room-runtime:$room_version\"\n    implementation \"androidx.room:room-ktx:$room_version\"\n    kapt \"androidx.room:room-compiler:$room_version\"\n\n    testImplementation 'junit:junit:4.13.2'\n    testImplementation 'androidx.arch.core:core-testing:2.1.0'\n    testImplementation \"org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version\"\n    testImplementation 'com.squareup.retrofit2:retrofit-mock:2.7.1'\n\n    androidTestImplementation 'androidx.test.ext:junit:1.1.3'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'\n\n\n    implementation \"com.google.dagger:hilt-android:2.38.1\"\n    kapt \"com.google.dagger:hilt-compiler:2.38.1\"\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\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# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/androidTest/java/com/demo/code/ExampleInstrumentedTest.kt",
    "content": "package com.demo.code\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getInstrumentation().targetContext\n        assertEquals(\"com.lukaslechner.coroutineusecasesonandroid\", appContext.packageName)\n    }\n}\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.demo.code\">\n\n    <application\n        android:name=\"com.demo.code.CoroutineUsecasesOnAndroidApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <activity android:name=\".activities.SelectionActivity\"\n            android:exported=\"true\">\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\n        <activity android:name=\"com.demo.code.base.UseCaseActivity\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase1.PerformSingleNetworkRequestActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.activities.MainActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase2.Perform2SequentialNetworkRequestsActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase2.callbacks.SequentialNetworkRequestsCallbacksActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase2.rx.SequentialNetworkRequestsRxActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase3.PerformNetworkRequestsConcurrentlyActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase4.VariableAmountOfNetworkRequestsActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase5.NetworkRequestWithTimeoutActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase6.RetryNetworkRequestActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase7.TimeoutAndRetryActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase7.callbacks.TimeoutAndRetryCallbackActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase7.rx.TimeoutAndRetryRxActivity\"\n            android:exported=\"true\" />\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase8.RoomAndCoroutinesActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase9.DebuggingCoroutinesActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase10.CalculationInBackgroundActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase11.CooperativeCancellationActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase12.CalculationInSeveralCoroutinesActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase13.ExceptionHandlingActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase14.ContinueCoroutineWhenUserLeavesScreenActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase15.WorkManagerActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase16.PerformanceAnalysisActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.coroutines.usecase17.PerformCalculationOnMainThreadActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.channels.usecase1.ChannelUseCase1Activity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.usecases.flow.usecase1.FlowUseCase1Activity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.activities.JobsActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.activities.SuspendingFuncActivity\"\n            android:exported=\"true\" />\n\n        <activity\n            android:name=\"com.demo.code.modules.observabletypes.ObservableTypesActivity\"\n            android:exported=\"true\" />\n\n    </application>\n\n</manifest>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/CoroutineUsecasesOnAndroidApplication.kt",
    "content": "package com.demo.code\n\nimport android.app.Application\nimport com.demo.code.usecases.coroutines.usecase14.AndroidVersionDatabase\nimport com.demo.code.usecases.coroutines.usecase14.AndroidVersionRepository\nimport dagger.hilt.android.HiltAndroidApp\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.SupervisorJob\nimport timber.log.Timber\n\n@HiltAndroidApp\nclass CoroutineUsecasesOnAndroidApplication : Application() {\n\n    private val applicationScope = CoroutineScope(SupervisorJob())\n\n    val androidVersionRepository by lazy {\n        val database = AndroidVersionDatabase.getInstance(applicationContext).androidVersionDao()\n        AndroidVersionRepository(\n            database,\n            applicationScope\n        )\n    }\n\n    override fun onCreate() {\n        super.onCreate()\n\n        Timber.plant(Timber.DebugTree())\n\n        // Enable Debugging for Kotlin Coroutines in debug builds\n        // Prints Coroutine name when logging Thread.currentThread().name\n        System.setProperty(\"kotlinx.coroutines.debug\", if (BuildConfig.DEBUG) \"on\" else \"off\")\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/activities/JobsActivity.kt",
    "content": "package com.demo.code.activities\n\nimport android.os.Bundle\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivityJobsBinding\nimport kotlinx.coroutines.*\n\n@DelicateCoroutinesApi\nclass JobsActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = \"Jobs in Coroutine\"\n\n    private lateinit var binding: ActivityJobsBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityJobsBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        hideUpButton()\n        setOnClickListeners()\n    }\n\n    private fun setOnClickListeners() {\n        binding.apply {\n            retryDemoId.setOnClickListener {\n                retryDemo()\n            }\n            simpleDemoOneId.setOnClickListener {\n                simpleJobOneDemo()\n            }\n            simpleDemoTwoId.setOnClickListener {\n                simpleJobTwoDemo()\n            }\n        }\n    }\n\n    private fun simpleJobTwoDemo() {\n\n       val rootJob = GlobalScope.launch(start = CoroutineStart.DEFAULT){\n\n           val parentJob = launch {\n               delay(10)\n               println(\"Parent job started\")\n               delay(10)\n           }\n\n           val childOneJob = launch() {\n               delay(10)\n               println(\"Child one job started\")\n               delay(10)\n           }\n\n           val childTwoJob = launch() {\n               delay(10)\n               println(\"Child two job started\")\n               delay(10)\n           }\n\n           if(parentJob.children.iterator().hasNext()){\n               val childCnt = parentJob.children\n               println(\"Parent has $childCnt children\")\n           }else{\n               println(\"Parent has no children\")\n           }\n\n           Thread.sleep(1000)\n       }\n\n        /**\n         * OUTPUT:->\n         * Parent has kotlin.sequences.SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1@85caa11 children\n         * Parent job started\n         * Child two job started\n         * Child one job started\n         */\n\n    }\n\n    private fun simpleJobOneDemo() {\n\n        /**\n         * This since executed by Lazy, It will start only when invoked\n         */\n        val job1 = GlobalScope.launch(start=CoroutineStart.LAZY) {\n            delay(200)\n            println(\"Two\")\n            delay(200)\n        }\n\n        GlobalScope.launch {\n            delay(200)\n            println(\"One\")\n            // Job is invoked here so it is executed here\n            job1.join()\n            println(\"Three\")\n        }\n\n        /**\n         * 2021-10-09 12:08:38.108 18586-18711/com.demo.code I/System.out: One\n         * 2021-10-09 12:08:38.311 18586-18711/com.demo.code I/System.out: Two\n         * 2021-10-09 12:08:38.519 18586-18711/com.demo.code I/System.out: Three\n         */\n    }\n\n    private fun retryDemo(){\n        GlobalScope.launch {\n            repeat(3){\n                delay(200)\n                println(\"Execution happened\")\n            }\n        }\n\n        /** Output:\n         * Execution happened\n         * Execution happened\n         * Execution happened\n         */\n    }\n\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/activities/MainActivity.kt",
    "content": "package com.demo.code.activities\n\nimport android.os.Bundle\nimport androidx.core.content.ContextCompat\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.demo.code.R\nimport com.demo.code.base.*\nimport com.demo.code.databinding.ActivityMainBinding\n\nclass MainActivity : BaseActivity() {\n\n    private lateinit var binding: ActivityMainBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityMainBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        hideUpButton()\n        initRecyclerView()\n    }\n\n    private val onUseCaseCategoryClickListener: (UseCaseCategory) -> Unit =\n        { clickedUseCaseCategory ->\n            val intent = UseCaseActivity.newIntent(applicationContext, clickedUseCaseCategory)\n            startActivity(intent)\n        }\n\n    private fun initRecyclerView() {\n        binding.recyclerView.apply {\n            adapter =\n                UseCaseCategoryAdapter(\n                    useCaseCategories,\n                    onUseCaseCategoryClickListener\n                )\n            hasFixedSize()\n            layoutManager = LinearLayoutManager(this@MainActivity)\n            addItemDecoration(initItemDecoration())\n        }\n    }\n\n    private fun initItemDecoration(): DividerItemDecoration {\n        val itemDecorator =\n            DividerItemDecoration(applicationContext, DividerItemDecoration.VERTICAL)\n        itemDecorator.setDrawable(\n            ContextCompat.getDrawable(\n                applicationContext,\n                R.drawable.recyclerview_divider\n            )!!\n        )\n        return itemDecorator\n    }\n\n    override fun getToolbarTitle() = \"Coroutine Usecases on Android\"\n}\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/activities/SelectionActivity.kt",
    "content": "package com.demo.code.activities\n\nimport android.content.Intent\nimport android.os.Bundle\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivitySelectionBinding\nimport com.demo.code.modules.observabletypes.ObservableTypesActivity\n\nclass SelectionActivity : BaseActivity() {\n\n    private lateinit var binding: ActivitySelectionBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivitySelectionBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        hideUpButton()\n        setOnClickListeners()\n    }\n\n    private fun setOnClickListeners() {\n        binding.apply {\n            btnUseCasesId.setOnClickListener {\n                startActivity(Intent(this@SelectionActivity, MainActivity::class.java))\n            }\n            jobsId.setOnClickListener {\n                startActivity(Intent(this@SelectionActivity, JobsActivity::class.java))\n            }\n            suspendingFunctionsId.setOnClickListener {\n                startActivity(Intent(this@SelectionActivity, SuspendingFuncActivity::class.java))\n            }\n            typesOfObservablesId.setOnClickListener {\n                startActivity(Intent(this@SelectionActivity, ObservableTypesActivity::class.java))\n            }\n        }\n    }\n\n    override fun getToolbarTitle() = \"Selection Screen\"\n\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/activities/SuspendingFuncActivity.kt",
    "content": "package com.demo.code.activities\n\nimport android.os.Bundle\nimport androidx.lifecycle.lifecycleScope\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivitySuspendingFuncBinding\nimport com.demo.code.modules.legacycode.LegacyCallbackSampleOne\nimport com.demo.code.modules.legacycode.LegacyCallbackSampleTwo\nimport com.demo.code.modules.legacycode.User\nimport kotlinx.coroutines.launch\nimport kotlin.concurrent.thread\nimport kotlin.coroutines.suspendCoroutine\n\nclass SuspendingFuncActivity  : BaseActivity() {\n\n    override fun getToolbarTitle() = \"Suspending Functions\"\n\n    private lateinit var binding: ActivitySuspendingFuncBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivitySuspendingFuncBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        hideUpButton()\n        setOnClickListeners()\n    }\n\n    private fun setOnClickListeners() {\n        binding.apply {\n            btnLaunchId.setOnClickListener {\n                simpleDemo()\n            }\n        }\n    }\n\n    private fun simpleDemo() {\n        lifecycleScope.launch {\n            LegacyCallbackSampleTwo(this.coroutineContext).initiateDemo()\n        }\n    }\n}\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/BaseActivity.kt",
    "content": "package com.demo.code.base\n\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.demo.code.R\nimport com.demo.code.utils.setGone\n\nabstract class BaseActivity : AppCompatActivity() {\n\n    abstract fun getToolbarTitle(): String\n\n    override fun onStart() {\n        super.onStart()\n        setToolbarTitle(getToolbarTitle())\n        getUpButton().setOnClickListener {\n            finish()\n        }\n    }\n\n    private fun getUpButton(): ImageView = findViewById(R.id.btnToolbarBack)\n    private fun getToolbar(): TextView = findViewById(R.id.toolbarTitle)\n\n    fun hideUpButton() {\n        getUpButton().setGone()\n    }\n\n    private fun setToolbarTitle(toolbarTitle: String) {\n        getToolbar().text = toolbarTitle\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/BaseViewModel.kt",
    "content": "package com.demo.code.base\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\n\nopen class BaseViewModel<T> : ViewModel() {\n\n    fun uiState(): LiveData<T> = uiState\n    protected val uiState: MutableLiveData<T> = MutableLiveData()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/UseCase.kt",
    "content": "package com.demo.code.base\n\nimport android.os.Parcelable\nimport androidx.appcompat.app.AppCompatActivity\nimport com.demo.code.usecases.channels.usecase1.ChannelUseCase1Activity\nimport com.demo.code.usecases.coroutines.usecase1.PerformSingleNetworkRequestActivity\nimport com.demo.code.usecases.coroutines.usecase10.CalculationInBackgroundActivity\nimport com.demo.code.usecases.coroutines.usecase11.CooperativeCancellationActivity\nimport com.demo.code.usecases.coroutines.usecase12.CalculationInSeveralCoroutinesActivity\nimport com.demo.code.usecases.coroutines.usecase13.ExceptionHandlingActivity\nimport com.demo.code.usecases.coroutines.usecase14.ContinueCoroutineWhenUserLeavesScreenActivity\nimport com.demo.code.usecases.coroutines.usecase15.WorkManagerActivity\nimport com.demo.code.usecases.coroutines.usecase16.PerformanceAnalysisActivity\nimport com.demo.code.usecases.coroutines.usecase17.PerformCalculationOnMainThreadActivity\nimport com.demo.code.usecases.coroutines.usecase2.Perform2SequentialNetworkRequestsActivity\nimport com.demo.code.usecases.coroutines.usecase2.callbacks.SequentialNetworkRequestsCallbacksActivity\nimport com.demo.code.usecases.coroutines.usecase2.rx.SequentialNetworkRequestsRxActivity\nimport com.demo.code.usecases.coroutines.usecase3.PerformNetworkRequestsConcurrentlyActivity\nimport com.demo.code.usecases.coroutines.usecase4.VariableAmountOfNetworkRequestsActivity\nimport com.demo.code.usecases.coroutines.usecase5.NetworkRequestWithTimeoutActivity\nimport com.demo.code.usecases.coroutines.usecase6.RetryNetworkRequestActivity\nimport com.demo.code.usecases.coroutines.usecase7.TimeoutAndRetryActivity\nimport com.demo.code.usecases.coroutines.usecase7.callbacks.TimeoutAndRetryCallbackActivity\nimport com.demo.code.usecases.coroutines.usecase7.rx.TimeoutAndRetryRxActivity\nimport com.demo.code.usecases.coroutines.usecase8.RoomAndCoroutinesActivity\nimport com.demo.code.usecases.coroutines.usecase9.DebuggingCoroutinesActivity\nimport com.demo.code.usecases.flow.usecase1.FlowUseCase1Activity\nimport kotlinx.android.parcel.Parcelize\n\n@Parcelize\ndata class UseCase(\n    val description: String,\n    val targetActivity: Class<out AppCompatActivity>\n) : Parcelable\n\n@Parcelize\ndata class UseCaseCategory(val categoryName: String, val useCases: List<UseCase>) : Parcelable\n\nconst val useCase1Description = \"#1 Perform single network request\"\nconst val useCase2Description = \"#2 Perform two sequential network requests\"\nconst val useCase2UsingCallbacksDescription = \"#2 using Callbacks\"\nconst val useCase2UsingRxDescription = \"#2 using RxJava\"\nconst val useCase3Description = \"#3 Perform several network requests concurrently\"\nconst val useCase4Description = \"#4 Perform variable amount of network requests\"\nconst val useCase5Description = \"#5 Network request with TimeOut\"\nconst val useCase6Description = \"#6 Retry Network request\"\nconst val useCase7Description = \"#7 Network requests with timeout and retry\"\nconst val useCase7UsingCallbacksDescription = \"#7 Using callbacks\"\nconst val useCase7UsingRxDescription = \"#7 Using RxJava\"\nconst val useCase8Description = \"#8 Room and Coroutines\"\nconst val useCase9Description = \"#9 Debugging Coroutines\"\nconst val useCase10Description = \"#10 Offload expensive calculation to background thread\"\nconst val useCase11Description = \"#11 Cooperative Cancellation\"\nconst val useCase12Description = \"#12 Offload expensive calculation to several coroutines\"\nconst val useCase13Description = \"#13 Exception Handling\"\nconst val useCase14Description = \"#14 Continue Coroutine when User leaves screen\"\nconst val useCase15Description = \"#15 Using WorkManager with Coroutines\"\nconst val useCase16Description =\n    \"#16 Performance Analysis of dispatchers, number of coroutines and yielding\"\nconst val useCase17Description =\n    \"#17 Perform heavy calculation on Main Thread without freezing the UI\"\n\nprivate val coroutinesUseCases =\n    UseCaseCategory(\n        \"Coroutine Use Cases\", listOf(\n            UseCase(\n                useCase1Description,\n                PerformSingleNetworkRequestActivity::class.java\n            ),\n            UseCase(\n                useCase2Description,\n                Perform2SequentialNetworkRequestsActivity::class.java\n            ),\n            UseCase(\n                useCase2UsingCallbacksDescription,\n                SequentialNetworkRequestsCallbacksActivity::class.java\n            ), UseCase(\n                useCase2UsingRxDescription,\n                SequentialNetworkRequestsRxActivity::class.java\n            ),\n            UseCase(\n                useCase3Description,\n                PerformNetworkRequestsConcurrentlyActivity::class.java\n            ),\n            UseCase(\n                useCase4Description,\n                VariableAmountOfNetworkRequestsActivity::class.java\n            ),\n            UseCase(\n                useCase5Description,\n                NetworkRequestWithTimeoutActivity::class.java\n            ),\n            UseCase(\n                useCase6Description,\n                RetryNetworkRequestActivity::class.java\n            ),\n            UseCase(\n                useCase7Description,\n                TimeoutAndRetryActivity::class.java\n            ),\n            UseCase(\n                useCase7UsingCallbacksDescription,\n                TimeoutAndRetryCallbackActivity::class.java\n            ), UseCase(\n                useCase7UsingRxDescription,\n                TimeoutAndRetryRxActivity::class.java\n            ),\n            UseCase(\n                useCase8Description,\n                RoomAndCoroutinesActivity::class.java\n            ),\n            UseCase(\n                useCase9Description,\n                DebuggingCoroutinesActivity::class.java\n            ),\n            UseCase(\n                useCase10Description,\n                CalculationInBackgroundActivity::class.java\n            ),\n            UseCase(\n                useCase11Description,\n                CooperativeCancellationActivity::class.java\n            ),\n            UseCase(\n                useCase12Description,\n                CalculationInSeveralCoroutinesActivity::class.java\n            ),\n            UseCase(\n                useCase13Description,\n                ExceptionHandlingActivity::class.java\n            ),\n            UseCase(\n                useCase14Description,\n                ContinueCoroutineWhenUserLeavesScreenActivity::class.java\n            ),\n            UseCase(\n                useCase15Description,\n                WorkManagerActivity::class.java\n            ),\n            UseCase(\n                useCase16Description,\n                PerformanceAnalysisActivity::class.java\n            ),\n            UseCase(\n                useCase17Description,\n                PerformCalculationOnMainThreadActivity::class.java\n            )\n        )\n    )\n\nprivate val channelsUseCases =\n    UseCaseCategory(\n        \"Channels Use Cases\",\n        listOf(\n            UseCase(\n                \"Channels Use Case 1\",\n                ChannelUseCase1Activity::class.java\n            )\n        )\n    )\n\nprivate val flowUseCases =\n    UseCaseCategory(\n        \"Flow Use Cases\",\n        listOf(\n            UseCase(\n                \"Flow Use Case 1\",\n                FlowUseCase1Activity::class.java\n            )\n        )\n    )\n\nval useCaseCategories = listOf(\n    coroutinesUseCases /*,\n    channelsUseCases,\n    flowUseCases */\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/UseCaseActivity.kt",
    "content": "package com.demo.code.base\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.core.content.ContextCompat\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.demo.code.R\nimport com.demo.code.databinding.ActivityUsecasesBinding\n\nclass UseCaseActivity : BaseActivity() {\n\n    private val useCaseCategory by lazy {\n        intent.getParcelableExtra<UseCaseCategory>(\n            EXTRA_USE_CASE_CATEGORY\n        )!!\n    }\n\n    private lateinit var binding: ActivityUsecasesBinding\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityUsecasesBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n\n        initRecyclerView()\n    }\n\n    private val onUseCaseClickListener: (UseCase) -> Unit = { clickedUseCase ->\n        startActivity(Intent(applicationContext, clickedUseCase.targetActivity))\n    }\n\n    private fun initRecyclerView() {\n        binding.recyclerView.apply {\n            adapter =\n                UseCaseAdapter(\n                    useCaseCategory,\n                    onUseCaseClickListener\n                )\n            hasFixedSize()\n            layoutManager = LinearLayoutManager(this@UseCaseActivity)\n            addItemDecoration(initItemDecoration())\n        }\n    }\n\n    private fun initItemDecoration(): DividerItemDecoration {\n        val itemDecorator =\n            DividerItemDecoration(applicationContext, DividerItemDecoration.VERTICAL)\n        itemDecorator.setDrawable(\n            ContextCompat.getDrawable(\n                applicationContext,\n                R.drawable.recyclerview_divider\n            )!!\n        )\n        return itemDecorator\n    }\n\n    override fun getToolbarTitle() = useCaseCategory.categoryName\n\n    companion object {\n\n        private const val EXTRA_USE_CASE_CATEGORY = \"EXTRA_USE_CASES\"\n\n        fun newIntent(context: Context, useCaseCategory: UseCaseCategory) =\n            Intent(context, UseCaseActivity::class.java).apply {\n                putExtra(EXTRA_USE_CASE_CATEGORY, useCaseCategory)\n            }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/UseCaseAdapter.kt",
    "content": "package com.demo.code.base\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.demo.code.R\n\nclass UseCaseAdapter(\n    private val useCaseCategory: UseCaseCategory,\n    private val onUseCaseClick: (UseCase) -> Unit\n) : RecyclerView.Adapter<UseCaseAdapter.ViewHolder>() {\n\n    class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val textView = LayoutInflater.from(parent.context)\n            .inflate(R.layout.recyclerview_item, parent, false) as TextView\n        return ViewHolder(\n            textView\n        )\n    }\n\n    override fun getItemCount() = useCaseCategory.useCases.size\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        holder.textView.text = useCaseCategory.useCases[position].description\n        holder.textView.setOnClickListener {\n            onUseCaseClick(useCaseCategory.useCases[position])\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/base/UseCaseCategoryAdapter.kt",
    "content": "package com.demo.code.base\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.demo.code.R\n\nclass UseCaseCategoryAdapter(\n    private val useCaseCategories: List<UseCaseCategory>,\n    private val onUseCaseCategoryClick: (UseCaseCategory) -> Unit\n) : RecyclerView.Adapter<UseCaseCategoryAdapter.ViewHolder>() {\n\n    class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val textView = LayoutInflater.from(parent.context)\n            .inflate(R.layout.recyclerview_item, parent, false) as TextView\n        return ViewHolder(\n            textView\n        )\n    }\n\n    override fun getItemCount() = useCaseCategories.size\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        holder.textView.text = useCaseCategories[position].categoryName\n        holder.textView.setOnClickListener {\n            onUseCaseCategoryClick(useCaseCategories[position])\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/mock/MockAnalyticsApi.kt",
    "content": "package com.demo.code.mock\n\nimport com.demo.code.utils.MockNetworkInterceptor\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\n\ninterface MockAnalyticsApi {\n\n    @GET(\"analytics/workmanager-screen-opened\")\n    suspend fun trackScreenOpened(): Boolean\n}\n\nfun createMockAnalyticsApi(interceptor: MockNetworkInterceptor): MockAnalyticsApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .build()\n\n    return retrofit.create(MockAnalyticsApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/mock/MockApi.kt",
    "content": "package com.demo.code.mock\n\nimport com.demo.code.utils.MockNetworkInterceptor\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\ninterface MockApi {\n\n    @GET(\"recent-android-versions\")\n    suspend fun getRecentAndroidVersions(): List<AndroidVersion>\n\n    @GET(\"android-version-features/{apiLevel}\")\n    suspend fun getAndroidVersionFeatures(@Path(\"apiLevel\") apiLevel: Int): VersionFeatures\n}\n\nfun createMockApi(interceptor: MockNetworkInterceptor): MockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .build()\n\n    return retrofit.create(MockApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/mock/MockData.kt",
    "content": "package com.demo.code.mock\n\ndata class AndroidVersion(val apiLevel: Int, val name: String)\n\ndata class VersionFeatures(val androidVersion: AndroidVersion, val features: List<String>)\n\nval mockAndroidVersionOreo = AndroidVersion(27, \"Oreo\")\nval mockAndroidVersionPie = AndroidVersion(28, \"Pie\")\nval mockAndroidVersionAndroid10 = AndroidVersion(29, \"Android 10\")\n\nval mockAndroidVersions = listOf(\n    mockAndroidVersionOreo, mockAndroidVersionPie, mockAndroidVersionAndroid10\n)\n\nval featuresOfOreo = listOf(\n    \"Neural networks API.\",\n    \"Shared memory API.\",\n    \"WallpaperColors API.\",\n    \"Bluetooth battery level for connected devices, accessible in Quick Settings.\",\n    \"Android Oreo Go Edition, a lightweight distribution of Android that runs better than normal Android on devices with less than 1 GB of RAM.\",\n    \"Autofill framework updates.\",\n    \"Programmatic Safe Browsing actions.\",\n    \"Navigation buttons dim when not in use.\",\n    \"Visual changes to 'Power Off' and 'Restart', including a new screen and floating toolbar.\",\n    \"Toast messages are now white with the same existing transparency.\",\n    \"Automatic light and dark themes.\",\n    \"New Easter egg in the form of an official Oreo cookie picture.\"\n)\n\nval featuresOfPie = listOf(\n    \"New user interface for the quick settings menu.\",\n    \"The clock has moved to the left of the notification bar.\",\n    \"The \\\"dock\\\" now has a semi-transparent background.\",\n    \"Battery Saver no longer shows an orange overlay on the notification and status bars.\",\n    \"A \\\"screenshot\\\" button has been added to the power options.\",\n    \"A new \\\"Lockdown\\\" mode which disables biometric authentication once activated.\",\n    \"Rounded corners across the UI.\",\n    \"New transitions for switching between apps, or activities within apps.\",\n    \"Richer messaging notifications, where a full conversation can be seen within a notification, full-scale images, and smart replies akin to Google's new app, Reply.\",\n    \"Support for display cutouts.\",\n    \"Redesigned volume slider.\",\n    \"Battery percentage now shown in Always-On Display.\",\n    \"Lock screen security changes include the possible return of an improved NFC Unlock.\",\n    \"Experimental features (which are currently hidden within a menu called Feature Flags) such as a redesigned About Phone page in settings, and automatic Bluetooth enabling while driving.\",\n    \"DNS over TLS.\",\n    \"A new optional gesture-based system interface, allowing users to navigate the OS using swipes more often than the traditional UI.\",\n    \"Redesigned multitask app switcher with the Google search bar and app drawer built-in.\",\n    \"Android Dashboard, which tells the user how much time they are spending on their device and in apps, and allows the user to set time limits on apps.\",\n    \"\\\"Shush\\\", an enhanced version of Do Not Disturb mode activated by placing the phone face down, which mutes standard notifications.\",\n    \"\\\"Adaptive Battery\\\" prediction, which makes use of Doze to hibernate user apps the OS determines the user will not use.\",\n    \"Auto-Brightness feature modifies screen brightness based on user habits.\",\n    \"Wind Down option lets Android users set a specific bedtime that enables Do Not Disturb and turns the entire phone's interface gray to discourage further use at night.\",\n    \"Vulkan 1.1 support.\"\n)\n\nval featuresOfAndroid10 = listOf(\n    \"New permissions to access location in background and to access photo, video and audio files\",\n    \"Background apps can no longer jump into the foreground\",\n    \"Limited access to non-resettable device identifiers\",\n    \"Sharing shortcuts, which allow sharing content with a contact directly\",\n    \"Floating settings panel, that allows changing system settings directly from apps\",\n    \"Dynamic depth format for photos, which allow changing background blur after taking a photo\",\n    \"Support for the AV1 video codec, the HDR10+ video format and the Opus audio codec\",\n    \"Support for aptX Adaptive, LHDC, LLAC, CELT and AAC LATM codecs[244\",\n    \"A native MIDI API, allowing interaction with music controllers\",\n    \"Better support for biometric authentication in apps\",\n    \"Support for the WPA3 Wi-Fi security protocol\",\n    \"Support for foldable phones\",\n    \"Support for Notification Bubbles\",\n    \"New system-wide dark theme/mode\",\n    \"Project Mainline, allows core OS components to be updated via the Google Play Store, without requiring a complete system update\"\n)\n\nval mockVersionFeaturesOreo = VersionFeatures(\n    mockAndroidVersionOreo,\n    featuresOfOreo\n)\n\nval mockVersionFeaturesPie = VersionFeatures(\n    mockAndroidVersionPie,\n    featuresOfPie\n)\n\nval mockVersionFeaturesAndroid10 = VersionFeatures(\n    mockAndroidVersionAndroid10,\n    featuresOfAndroid10\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/legacycode/LegacyCallbackSampleOne.kt",
    "content": "package com.demo.code.modules.legacycode\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport kotlin.concurrent.thread\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.suspendCoroutine\n\nclass LegacyCallbackSampleOne(\n    override val coroutineContext: CoroutineContext\n    ) : CoroutineScope{\n\n\n    fun initiateDemo() {\n        launch {\n            getUser(\"111\")\n        }\n    }\n\n    private suspend fun getUser(id: String): User = suspendCoroutine {\n        getUserFromNetworkCallback(\"101\") { user, error ->\n            user?.run { println(this.userName) }\n            error?.run { println(this.message) }\n        }\n    }\n\n\n    private fun getUserFromNetworkCallback(\n        userId: String,\n        onUserResponse: (User?, Throwable?) -> Unit) {\n        thread {\n            try {\n                Thread.sleep(1000) // ---> Simulating the network delay\n                val user = User(userId, \"Test User\")\n\n                onUserResponse(user, null)\n            } catch (error: Throwable) {\n                onUserResponse(null, error)\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/legacycode/LegacyCallbackSampleTwo.kt",
    "content": "package com.demo.code.modules.legacycode\n\nimport android.os.AsyncTask\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport java.io.IOException\nimport java.net.MalformedURLException\nimport kotlin.coroutines.CoroutineContext\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n\nclass LegacyCallbackSampleTwo(\n    override val coroutineContext: CoroutineContext\n) : CoroutineScope {\n\n    fun initiateDemo() {\n        launch {\n            val user = getUser(\"111\")\n            println(user.userName)\n        }\n    }\n\n    private suspend fun getUser(id: String): User = suspendCoroutine {\n        try {\n            val result = MyTask().execute(id).get()\n            it.resume(result)\n        } catch (e: Exception) {\n            e.printStackTrace()\n            println(e.message)\n        }\n    }\n\n    class MyTask : AsyncTask<String?, Void?, User>() {\n        protected override fun doInBackground(vararg userId: String?): User? {\n            try {\n                return User(userId.toString(), \"Async User\")\n            } catch (e: MalformedURLException) {\n                e.printStackTrace()\n            } catch (e: IOException) {\n                e.printStackTrace()\n            }\n            return null\n        }\n\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/legacycode/User.kt",
    "content": "package com.demo.code.modules.legacycode\n\ndata class User(val userId: String, val userName:String)\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/observabletypes/ObservableTypesActivity.kt",
    "content": "package com.demo.code.modules.observabletypes\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.lifecycleScope\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivityObservableTypesBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.collectLatest\n\n@AndroidEntryPoint\nclass ObservableTypesActivity  : BaseActivity() {\n\n    override fun getToolbarTitle() = \"Observable Types\"\n\n    private lateinit var binding: ActivityObservableTypesBinding\n    private val viewModel: ObservableTypesViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityObservableTypesBinding.inflate(layoutInflater)\n        setContentView(binding.root)\n        hideUpButton()\n        setOnClickListeners()\n        subscribeData()\n    }\n\n    private fun setOnClickListeners() {\n        binding.apply {\n            liveDataId.setOnClickListener {\n                viewModel.liveDataDemo()\n            }\n\n            stateFlowId.setOnClickListener {\n                viewModel.stateFlowDemo()\n            }\n\n            flowId.setOnClickListener {\n                flowDemo()\n            }\n\n            sharedFlowId.setOnClickListener {\n                sharedFlowDemo()\n            }\n        }\n    }\n\n    private fun sharedFlowDemo() {\n        viewModel.sharedFlowDemo()\n    }\n\n    private fun flowDemo() {\n        lifecycleScope.launchWhenStarted {\n            viewModel.flowDemo().collectLatest {\n                binding.outputTextId.text = it\n            }\n        }\n    }\n\n    private fun subscribeData() {\n        viewModel.liveData.observe(this, {\n            binding.outputTextId.text = it\n        })\n\n        lifecycleScope.launchWhenCreated {\n            viewModel.stateFlow.collectLatest {\n                binding.outputTextId.text = it\n            }\n        }\n\n        lifecycleScope.launchWhenStarted {\n            viewModel.sharedFlow.collect {\n                binding.outputTextId.text = it\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/observabletypes/ObservableTypesViewModel.kt",
    "content": "package com.demo.code.modules.observabletypes\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\n\nclass ObservableTypesViewModel : ViewModel() {\n\n    private val _liveData = MutableLiveData(\"Default\")\n    val liveData : LiveData<String> = _liveData\n\n    private val _stateFlow = MutableStateFlow(\"Default\")\n    val stateFlow = _stateFlow.asStateFlow()\n\n    private val _sharedFlow = MutableSharedFlow<String>()\n    val sharedFlow = _sharedFlow.asSharedFlow()\n\n    fun liveDataDemo() {\n        _liveData.value = \"Live Data\"\n    }\n\n    fun stateFlowDemo() {\n        _stateFlow.value = \"State Flow\"\n    }\n\n    fun flowDemo() : Flow<String>{\n        return flow {\n            emit(\"Flow\")\n        }\n    }\n\n    fun sharedFlowDemo() {\n        viewModelScope.launch {\n            _sharedFlow.emit(\"Shared Flow\")\n        }\n    }\n\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/modules/placeholder",
    "content": ""
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/cancellation/1_cancellation.kt",
    "content": "package com.demo.code.playground.cancellation\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking {\n\n    val job = launch {\n        repeat(10) { index ->\n            println(\"operation number $index\")\n            try {\n                delay(100)\n            } catch (exception: CancellationException) {\n                println(\"CancellationException was thrown\")\n                throw CancellationException()\n            }\n        }\n    }\n\n    delay(250)\n    println(\"Cancelling Coroutine\")\n    job.cancel()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/cancellation/2_cooperative_cancellation.kt",
    "content": "package com.demo.code.playground.cancellation\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking<Unit> {\n\n    val job = launch(Dispatchers.Default) {\n        repeat(10) { index ->\n            if (isActive) {\n                println(\"operation number $index\")\n                Thread.sleep(100)\n            } else {\n                // perform some cleanup on cancellation\n                withContext(NonCancellable) {\n                    delay(100)\n                    println(\"Clean up done!\")\n                }\n                throw CancellationException()\n            }\n        }\n    }\n\n    delay(250)\n    println(\"Cancelling Coroutine\")\n    job.cancel()\n\n    val globalCoroutineJob = GlobalScope.launch {\n        repeat(10) {\n            println(\"$it\")\n            delay(100)\n        }\n    }\n    delay(250)\n    globalCoroutineJob.cancel()\n    delay(1000)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/coroutine_scope.kt",
    "content": "package com.demo.code.playground\n\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking { // this: CoroutineScope\n    launch {\n        delay(200L)\n        println(\"Task from runBlocking\")\n    }\n\n    coroutineScope { // Creates a new coroutine scope\n        launch {\n            delay(900L)\n            println(\"Task from nested launch\")\n        }\n\n        delay(100L)\n        println(\"Task from coroutine scope\") // This line will be printed before nested launch\n    }\n\n    println(\"Coroutine scope is over\") // This line is not printed until nested launch completes\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/coroutinebuilders/1_launch.kt",
    "content": "package com.demo.code.playground.coroutinebuilders\n\nimport kotlinx.coroutines.CoroutineStart\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking<Unit> {\n    val job = launch(start = CoroutineStart.LAZY) {\n        networkRequest()\n        println(\"result received\")\n    }\n    delay(200)\n    job.start()\n    println(\"end of runBlocking\")\n}\n\nsuspend fun networkRequest(): String {\n    delay(500)\n    return \"Result\"\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/coroutinebuilders/2_async.kt",
    "content": "package com.demo.code.playground.coroutinebuilders\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking<Unit> {\n\n    val startTime = System.currentTimeMillis()\n\n    val deferred1 = async {\n        val result1 = networkCall(1).also {\n            println(\"result received: $it after ${elapsedMillis(startTime)}ms\")\n        }\n        result1\n    }\n\n    val deferred2 = async {\n        val result2 = networkCall(2)\n        println(\"result received: $result2 after ${elapsedMillis(startTime)}ms\")\n        result2\n    }\n\n    val resultList = listOf(deferred1.await(), deferred2.await())\n\n    println(\"Result list: $resultList after ${elapsedMillis(startTime)}ms\")\n}\n\nsuspend fun networkCall(number: Int): String {\n    delay(500)\n    return \"Result $number\"\n}\n\nfun elapsedMillis(startTime: Long) = System.currentTimeMillis() - startTime\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/1_try_catch.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\nfun main() {\n\n    val scope = CoroutineScope(Job())\n    try {\n        scope.launch {\n            functionThatThrowsIt()\n        }\n    } catch (e: Exception) {\n        println(\"Caught: $e\")\n    }\n\n    Thread.sleep(100)\n}\n\nfun functionThatThrowsIt() {\n    throw RuntimeException()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/2_coroutine_exception_handler.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\nfun main() {\n\n    val exceptionHandler = CoroutineExceptionHandler { context, exception ->\n        println(\"Caught $exception in CoroutineExceptionHandler\")\n    }\n\n    val scope = CoroutineScope(Job())\n\n    scope.launch {\n        launch(exceptionHandler) {\n            functionThatThrowsIt()\n        }\n    }\n\n    Thread.sleep(100)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/3_try_catch_vs_exception_handler.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val exceptionHandler = CoroutineExceptionHandler { coroutineContext, throwable ->\n        println(\"Caught exception: $throwable\")\n    }\n\n    val scope = CoroutineScope(Job())\n\n    scope.launch(exceptionHandler) {\n        launch {\n            println(\"Starting coroutine 1\")\n            delay(100)\n            throw RuntimeException()\n        }\n        launch {\n            println(\"Starting coroutine 2\")\n            delay(3000)\n            println(\"Coroutine 2 completed\")\n        }\n    }\n\n    Thread.sleep(5000)\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/4_launch_and_async.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val exceptionHandler = CoroutineExceptionHandler { context, exception ->\n        println(\"Caught $exception in CoroutineExceptionHandler\")\n    }\n\n    val scope = CoroutineScope(Job() + exceptionHandler)\n\n    scope.async {\n        val deferred = async {\n            delay(200)\n            throw RuntimeException()\n        }\n    }\n\n    Thread.sleep(1000)\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/5_exception_handling_specifics_coroutineScope.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\n\nfun main() = runBlocking<Unit>() {\n\n    try {\n        doSomeThingSuspend()\n    } catch (e: Exception) {\n        println(\"Caught $e\")\n    }\n\n}\n\nprivate suspend fun doSomeThingSuspend() {\n    coroutineScope {\n        launch {\n            throw RuntimeException()\n        }\n    }\n}\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/exceptionhandling/6_exception_handling_specifics_supervisorScope.kt",
    "content": "package com.demo.code.playground.exceptionhandling\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val ceh = CoroutineExceptionHandler { coroutineContext, throwable ->\n        println(\"Caught $throwable in CoroutineExceptionHandler\")\n    }\n\n    val scope = CoroutineScope(Job())\n\n    scope.launch(ceh) {\n        try {\n            supervisorScope {\n                launch {\n                    println(\"CEH: ${coroutineContext[CoroutineExceptionHandler]}\")\n                    throw RuntimeException()\n                }\n            }\n        } catch (e: Exception) {\n            println(\"Caught $e\")\n        }\n    }\n\n    Thread.sleep(100)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/10_how_delay_works.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport android.os.Handler\nimport android.os.Looper\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking {\n    println(\"main starts\")\n    joinAll(\n        async { delayDemonstration(1, 500) },\n        async { delayDemonstration(2, 300) }\n    )\n    println(\"main ends\")\n}\n\nsuspend fun delayDemonstration(number: Int, delay: Long) {\n    println(\"Coroutine $number starts work\")\n\n    // delay(delay)\n\n    Handler(Looper.getMainLooper())\n        .postDelayed({\n            println(\"Coroutine $number has finished\")\n        }, 500)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/1_routines.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nfun main() {\n    println(\"main starts\")\n    routine(1, 500)\n    routine(2, 300)\n    println(\"main ends\")\n}\n\nfun routine(number: Int, delay: Long) {\n    println(\"Routine $number starts work\")\n    Thread.sleep(delay)\n    println(\"Routine $number has finished\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/2_coroutines.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking {\n    println(\"main starts\")\n    joinAll(\n        async { coroutine(1, 500) },\n        async { coroutine(2, 300) }\n    )\n    println(\"main ends\")\n}\n\nsuspend fun coroutine(number: Int, delay: Long) {\n    println(\"Coroutine $number starts work\")\n    delay(delay)\n    println(\"Coroutine $number has finished\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/3_routines_threads.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlin.concurrent.thread\n\nfun main() {\n    println(\"main starts\")\n    threadRoutine(1, 500)\n    threadRoutine(2, 300)\n    Thread.sleep(1000)\n    println(\"main ends\")\n}\n\nfun threadRoutine(number: Int, delay: Long) {\n    thread {\n        println(\"Routine $number starts work\")\n        Thread.sleep(delay)\n        println(\"Routine $number has finished\")\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/4_coroutines_with_thread_info.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking {\n    println(\"main starts\")\n    joinAll(\n        async { threadInfoCoroutine(1, 500) },\n        async { threadInfoCoroutine(2, 300) }\n    )\n    println(\"main ends\")\n}\n\nsuspend fun threadInfoCoroutine(number: Int, delay: Long) {\n    println(\"Coroutine $number starts work on ${Thread.currentThread().name}\")\n    delay(delay)\n    println(\"Coroutine $number has finished on ${Thread.currentThread().name}\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/5_starting_lots_of_coroutines.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking<Unit> {\n    repeat(1_000_000) {\n        launch {\n            delay(5000)\n            print(\".\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/7_starting_lots_of_threads.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlin.concurrent.thread\n\nfun main() {\n    repeat(1_000_000) {\n        thread {\n            Thread.sleep(5000)\n            print(\".\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/8_suspending_coroutines.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.joinAll\nimport kotlinx.coroutines.runBlocking\n\nfun main() = runBlocking {\n    println(\"main starts\")\n    joinAll(\n        async { suspendingCoroutine(1, 500) },\n        async { suspendingCoroutine(2, 300) },\n        async {\n            repeat(5) {\n                println(\"other tasks is working on ${Thread.currentThread().name}\")\n                delay(100)\n            }\n        }\n    )\n    println(\"main ends\")\n}\n\nsuspend fun suspendingCoroutine(number: Int, delay: Long) {\n    println(\"Coroutine $number starts work on ${Thread.currentThread().name}\")\n    delay(delay)\n    println(\"Coroutine $number has finished on ${Thread.currentThread().name}\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/fundamentals/9_coroutine_in_different_threads.kt",
    "content": "package com.demo.code.playground.fundamentals\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    println(\"main starts\")\n    joinAll(\n        async { threadSwitchingCoroutine(1, 500) },\n        async { threadSwitchingCoroutine(2, 300) }\n    )\n    println(\"main ends\")\n}\n\nsuspend fun threadSwitchingCoroutine(number: Int, delay: Long) {\n    println(\"Coroutine $number starts work on ${Thread.currentThread().name}\")\n    delay(delay)\n    withContext(Dispatchers.Default) {\n        println(\"Coroutine $number has finished on ${Thread.currentThread().name}\")\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/1_coroutines_need_to_be_started_in_scope.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nval scope = CoroutineScope(Dispatchers.Default)\n\nfun main() = runBlocking<Unit> {\n\n    val job = scope.launch {\n        delay(100)\n        println(\"Coroutine completed\")\n    }\n\n    job.invokeOnCompletion { throwable ->\n        if (throwable is CancellationException) {\n            println(\"Coroutine was cancelled\")\n        }\n    }\n\n    delay(50)\n    onDestroy()\n}\n\nfun onDestroy() {\n    println(\"life-time of scope ends\")\n    scope.cancel()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/2_job_hierarchy.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val scopeJob = Job()\n    val scope = CoroutineScope(Dispatchers.Default + scopeJob)\n\n    val passedJob = Job()\n    val coroutineJob = scope.launch(passedJob) {\n        println(\"Starting coroutine\")\n        delay(1000)\n    }\n\n    println(\"passedJob and coroutineJob are references to the same job object: ${passedJob === coroutineJob}\")\n\n    println(\"Is coroutineJob a child of scopeJob? =>${scopeJob.children.contains(coroutineJob)}\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/3_parents_wait_for_children.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking<Unit> {\n\n    val scope = CoroutineScope(Dispatchers.Default)\n\n    val parentCoroutineJob = scope.launch {\n        launch {\n            delay(1000)\n            println(\"Child Coroutine 1 has completed!\")\n        }\n        launch {\n            delay(1000)\n            println(\"Child Coroutine 2 has completed!\")\n        }\n    }\n\n    parentCoroutineJob.join()\n    println(\"Parent Coroutine has completed!\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/4_cancelling_parents_and_children.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking<Unit> {\n\n    val scope = CoroutineScope(Dispatchers.Default)\n\n    scope.coroutineContext[Job]!!.invokeOnCompletion { throwable ->\n        if (throwable is CancellationException) {\n            println(\"Parent job was cancelled\")\n        }\n    }\n\n    val childCoroutine1Job = scope.launch {\n        delay(1000)\n        println(\"Coroutine 1 completed\")\n    }\n    childCoroutine1Job.invokeOnCompletion { throwable ->\n        if (throwable is CancellationException) {\n            println(\"Coroutine 1 was cancelled!\")\n        }\n    }\n\n    scope.launch {\n        delay(1000)\n        println(\"Coroutine 2 completed\")\n    }.invokeOnCompletion { throwable ->\n        if (throwable is CancellationException) {\n            println(\"Coroutine 2 was cancelled!\")\n        }\n    }\n\n    delay(200)\n\n    childCoroutine1Job.cancelAndJoin()\n\n    // scope.coroutineContext[Job]!!.cancelAndJoin()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/5_exception_propagation.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val exceptionHandler = CoroutineExceptionHandler { context, exception ->\n        println(\"Caught exception $exception\")\n    }\n\n    val scope = CoroutineScope(SupervisorJob() + exceptionHandler)\n\n    scope.launch {\n        println(\"Coroutine 1 starts\")\n        delay(50)\n        println(\"Coroutine 1 fails\")\n        throw RuntimeException()\n    }\n\n    scope.launch {\n        println(\"Coroutine 2 starts\")\n        delay(500)\n        println(\"Coroutine 2 completed\")\n    }.invokeOnCompletion { throwable ->\n        if (throwable is CancellationException) {\n            println(\"Coroutine 2 got cancelled!\")\n        }\n    }\n\n    Thread.sleep(1000)\n\n    println(\"Scope got cancelled: ${!scope.isActive}\")\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/6_globalscope.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\nfun main() {\n\n    println(\"Job of GlobalScope: ${GlobalScope.coroutineContext[Job]}\")\n\n    GlobalScope.launch {\n\n    }\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/playground/structuredconcurrency/7_scoping_functions.kt",
    "content": "package com.demo.code.playground.structuredconcurrency\n\nimport kotlinx.coroutines.*\n\nfun main() {\n\n    val scope = CoroutineScope(Job())\n\n    scope.launch {\n\n        doSomeTasks()\n\n        launch {\n            println(\"Starting Task 3\")\n            delay(300)\n            println(\"Task 3 completed\")\n        }\n    }\n\n    Thread.sleep(1000)\n}\n\nsuspend fun doSomeTasks() = coroutineScope {\n    launch {\n        println(\"Starting Task 1\")\n        delay(100)\n        println(\"Task 1 completed\")\n    }\n\n    launch {\n        println(\"Starting Task 2\")\n        delay(200)\n        println(\"Task 2 completed\")\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/channels/usecase1/ChannelUseCase1Activity.kt",
    "content": "package com.demo.code.usecases.channels.usecase1\n\nimport android.os.Bundle\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivityChannelsUsecase1Binding\n\nclass ChannelUseCase1Activity : BaseActivity() {\n\n    private val binding by lazy { ActivityChannelsUsecase1Binding.inflate(layoutInflater) }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n    }\n\n    override fun getToolbarTitle() = \"Channel Use Case 1\"\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase1/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() =\n    createMockApi(\n        MockNetworkInterceptor()\n            .mock(\n                \"http://localhost/recent-android-versions\",\n                Gson().toJson(mockAndroidVersions),\n                200,\n                1500\n            )\n    )"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase1/PerformSingleNetworkRequestActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase1Description\nimport com.demo.code.databinding.ActivityPerformsinglenetworkrequestBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass PerformSingleNetworkRequestActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase1Description\n\n    private val binding by lazy { ActivityPerformsinglenetworkrequestBinding.inflate(layoutInflater) }\n    private val viewModel: PerformSingleNetworkRequestViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performSingleNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions</b><br>${readableVersions.joinToString(separator = \"<br>\")}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase1/PerformSingleNetworkRequestViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\n\nclass PerformSingleNetworkRequestViewModel(\n    private val mockApi: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performSingleNetworkRequest() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                val recentAndroidVersions = mockApi.getRecentAndroidVersions()\n                uiState.value = UiState.Success(recentAndroidVersions)\n            } catch (exception: Exception) {\n                Timber.e(exception)\n                uiState.value = UiState.Error(\"Network Request failed!\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase1/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val recentVersions: List<AndroidVersion>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase10/CalculationInBackgroundActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase10\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase10Description\nimport com.demo.code.databinding.ActivityCalculationinbackgroundBinding\nimport com.demo.code.utils.hideKeyboard\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass CalculationInBackgroundActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase10Description\n\n    private val binding by lazy { ActivityCalculationinbackgroundBinding.inflate(layoutInflater) }\n    private val viewModel: CalculationInBackgroundViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnCalculate.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            if (factorialOf != null) {\n                viewModel.performCalculation(factorialOf)\n            }\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        textViewCalculationDuration.text = \"\"\n        textViewStringConversionDuration.text = \"\"\n        btnCalculate.isEnabled = false\n        textViewResult.hideKeyboard()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        textViewCalculationDuration.text =\n            getString(R.string.duration_calculation, uiState.computationDuration)\n\n        textViewStringConversionDuration.text =\n            getString(R.string.duration_stringconversion, uiState.stringConversionDuration)\n\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        textViewResult.text = if (uiState.result.length <= 150) {\n            uiState.result\n        } else {\n            \"${uiState.result.substring(0, 147)}...\"\n        }\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase10/CalculationInBackgroundViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase10\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.math.BigInteger\nimport kotlin.system.measureTimeMillis\n\nclass CalculationInBackgroundViewModel(\n    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default\n) : BaseViewModel<UiState>() {\n\n    fun performCalculation(factorialOf: Int) {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                var result: BigInteger = BigInteger.ZERO\n                val computationDuration = measureTimeMillis {\n                    result = calculateFactorialOf(factorialOf)\n                }\n\n                var resultString = \"\"\n                val stringConversionDuration = measureTimeMillis {\n                    resultString = convertToString(result)\n                }\n\n                uiState.value =\n                    UiState.Success(resultString, computationDuration, stringConversionDuration)\n            } catch (exception: Exception) {\n                UiState.Error(\"Error while calculating result\")\n            }\n        }\n    }\n\n    // factorial of n (n!) = 1 * 2 * 3 * 4 * ... * n\n    private suspend fun calculateFactorialOf(number: Int): BigInteger =\n        withContext(defaultDispatcher) {\n            var factorial = BigInteger.ONE\n            for (i in 1..number) {\n                factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n            }\n            factorial\n        }\n\n    private suspend fun convertToString(number: BigInteger): String =\n        withContext(defaultDispatcher) {\n            number.toString()\n        }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase10/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase10\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val result: String,\n        val computationDuration: Long,\n        val stringConversionDuration: Long\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase11/CooperativeCancellationActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase11\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase11Description\nimport com.demo.code.databinding.ActivityCooperativecancellationBinding\nimport com.demo.code.utils.hideKeyboard\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass CooperativeCancellationActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase11Description\n\n    private val binding by lazy { ActivityCooperativecancellationBinding.inflate(layoutInflater) }\n    private val viewModel: CooperativeCancellationViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnCalculate.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            if (factorialOf != null) {\n                viewModel.performCalculation(factorialOf)\n            }\n        }\n        binding.btnCancel.setOnClickListener {\n            viewModel.cancelCalculation()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        textViewCalculationDuration.text = \"\"\n        textViewStringConversionDuration.text = \"\"\n        btnCalculate.isEnabled = false\n        btnCancel.isEnabled = true\n        textViewResult.hideKeyboard()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        textViewCalculationDuration.text =\n            getString(R.string.duration_calculation, uiState.computationDuration)\n\n        textViewStringConversionDuration.text =\n            getString(R.string.duration_stringconversion, uiState.stringConversionDuration)\n\n        binding.progressBar.setGone()\n        btnCalculate.isEnabled = true\n        btnCancel.isEnabled = false\n\n        textViewResult.text = if (uiState.result.length <= 150) {\n            uiState.result\n        } else {\n            \"${uiState.result.substring(0, 147)}...\"\n        }\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        btnCancel.isEnabled = false\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase11/CooperativeCancellationViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase11\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport kotlinx.coroutines.*\nimport java.math.BigInteger\nimport kotlin.system.measureTimeMillis\n\nclass CooperativeCancellationViewModel(\n    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default\n) : ViewModel() {\n\n    private var calculationJob: Job? = null\n\n    fun performCalculation(factorialOf: Int) {\n        uiState.value = UiState.Loading\n        calculationJob = viewModelScope.launch {\n            try {\n\n                var result: BigInteger = BigInteger.ZERO\n                val computationDuration = measureTimeMillis {\n                    result = calculateFactorialOf(factorialOf)\n                }\n\n                var resultString = \"\"\n                val stringConversionDuration = measureTimeMillis {\n                    resultString = convertToString(result)\n                }\n\n                uiState.value =\n                    UiState.Success(resultString, computationDuration, stringConversionDuration)\n            } catch (exception: Exception) {\n                uiState.value = if (exception is CancellationException) {\n                    UiState.Error(\"Calculation was cancelled\")\n                } else {\n                    UiState.Error(\"Error while calculating result\")\n                }\n            }\n        }\n    }\n\n    // factorial of n (n!) = 1 * 2 * 3 * 4 * ... * n\n    private suspend fun calculateFactorialOf(number: Int): BigInteger =\n        withContext(defaultDispatcher) {\n            var factorial = BigInteger.ONE\n            for (i in 1..number) {\n\n                // yield enables cooperative cancellations\n                // alternatives:\n                // - ensureActive()\n                // - isActive() - possible to do clean up tasks with\n                yield()\n\n                factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n            }\n            factorial\n        }\n\n    private suspend fun convertToString(number: BigInteger): String =\n        withContext(defaultDispatcher) {\n            number.toString()\n        }\n\n    fun uiState(): LiveData<UiState> = uiState\n\n    fun cancelCalculation() {\n        calculationJob?.cancel()\n    }\n\n    private val uiState: MutableLiveData<UiState> = MutableLiveData()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase11/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase11\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val result: String,\n        val computationDuration: Long,\n        val stringConversionDuration: Long\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase12/CalculationInSeveralCoroutinesActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase12\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase12Description\nimport com.demo.code.databinding.ActivityCalculationinmultiplebackgroundthreadsBinding\nimport com.demo.code.utils.hideKeyboard\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass CalculationInSeveralCoroutinesActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase12Description\n\n    private val binding by lazy {\n        ActivityCalculationinmultiplebackgroundthreadsBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: CalculationInSeveralCoroutinesViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState()\n            .observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnCalculate.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            val numberOfThreads = binding.editTextNumberOfThreads.text.toString().toIntOrNull()\n            if (factorialOf != null && numberOfThreads != null) {\n                viewModel.performCalculation(\n                    factorialOf,\n                    numberOfThreads\n                )\n            }\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        textViewDuration.text = \"\"\n        textViewStringConversionDuration.text = \"\"\n        btnCalculate.isEnabled = false\n        textViewResult.hideKeyboard()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        textViewDuration.text =\n            getString(R.string.duration_calculation, uiState.computationDuration)\n        textViewStringConversionDuration.text =\n            getString(R.string.duration_stringconversion, uiState.stringConversionDuration)\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        textViewResult.text = if (uiState.result.length <= 150) {\n            uiState.result\n        } else {\n            \"${uiState.result.substring(0, 147)}...\"\n        }\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase12/CalculationInSeveralCoroutinesViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase12\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.math.BigInteger\nimport kotlin.system.measureTimeMillis\n\nclass CalculationInSeveralCoroutinesViewModel(\n    private val factorialCalculator: FactorialCalculator = FactorialCalculator(),\n    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default\n) : BaseViewModel<UiState>() {\n\n    fun performCalculation(\n        factorialOf: Int,\n        numberOfCoroutines: Int\n    ) {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n\n            var factorialResult = BigInteger.ZERO\n            val computationDuration = measureTimeMillis {\n                factorialResult =\n                    factorialCalculator.calculateFactorial(\n                        factorialOf,\n                        numberOfCoroutines\n                    )\n            }\n\n            var resultString = \"\"\n            val stringConversionDuration = measureTimeMillis {\n                resultString = convertToString(factorialResult)\n            }\n\n            uiState.value =\n                UiState.Success(resultString, computationDuration, stringConversionDuration)\n        }\n    }\n\n    private suspend fun convertToString(\n        number: BigInteger\n    ): String =\n        withContext(defaultDispatcher) {\n            number.toString()\n        }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase12/FactorialCalculator.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase12\n\nimport com.demo.code.utils.addCoroutineDebugInfo\nimport kotlinx.coroutines.*\nimport timber.log.Timber\nimport java.math.BigInteger\n\nclass FactorialCalculator(\n    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default\n) {\n\n    suspend fun calculateFactorial(\n        factorialOf: Int,\n        numberOfCoroutines: Int\n    ): BigInteger {\n        return withContext(defaultDispatcher) {\n            val subRanges = createSubRangeList(factorialOf, numberOfCoroutines)\n            subRanges.map { subRange ->\n                async {\n                    calculateFactorialOfSubRange(subRange)\n                }\n            }.awaitAll()\n                .fold(BigInteger.ONE, { acc, element ->\n                    ensureActive()\n                    acc.multiply(element)\n                })\n        }\n    }\n\n    suspend fun calculateFactorialOfSubRange(\n        subRange: SubRange\n    ): BigInteger {\n        return withContext(defaultDispatcher) {\n            Timber.d(addCoroutineDebugInfo(\"Calculate factorial of $subRange\"))\n            var factorial = BigInteger.ONE\n            for (i in subRange.start..subRange.end) {\n                ensureActive()\n                factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n            }\n            factorial\n        }\n    }\n\n    fun createSubRangeList(\n        factorialOf: Int,\n        numberOfSubRanges: Int\n    ): List<SubRange> {\n        val quotient = factorialOf.div(numberOfSubRanges)\n        val rangesList = mutableListOf<SubRange>()\n\n        var curStartIndex = 1\n        repeat(numberOfSubRanges - 1) {\n            rangesList.add(\n                SubRange(\n                    curStartIndex,\n                    curStartIndex + (quotient - 1)\n                )\n            )\n            curStartIndex += quotient\n        }\n        rangesList.add(SubRange(curStartIndex, factorialOf))\n        return rangesList\n    }\n}\n\ndata class SubRange(val start: Int, val end: Int)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase12/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase12\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val result: String,\n        val computationDuration: Long,\n        val stringConversionDuration: Long\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase13/ExceptionHandlingActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase13\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase13Description\nimport com.demo.code.databinding.ActivityExceptionhandlingBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass ExceptionHandlingActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityExceptionhandlingBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: ExceptionHandlingViewModel by viewModels()\n    override fun getToolbarTitle() = useCase13Description\n\n    private var operationStartTime = 0L\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnExceptionTryCatch.setOnClickListener {\n            viewModel.handleExceptionWithTryCatch()\n        }\n        binding.btnCoroutineExceptionHandler.setOnClickListener {\n            viewModel.handleWithCoroutineExceptionHandler()\n        }\n        binding.btnShowResultsEvenIfChildCoroutineFailsTryCatch.setOnClickListener {\n            viewModel.showResultsEvenIfChildCoroutineFails()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        operationStartTime = System.currentTimeMillis()\n        progressBar.setVisible()\n        textViewDuration.text = \"\"\n        textViewResult.text = \"\"\n        disableButtons()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        enableButtons()\n        progressBar.setGone()\n        val duration = System.currentTimeMillis() - operationStartTime\n        textViewDuration.text = getString(R.string.duration, duration)\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.joinToString(separator = \"<br><br>\") {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        textViewDuration.setGone()\n        toast(uiState.message)\n        enableButtons()\n    }\n\n    private fun enableButtons() = with(binding) {\n        btnExceptionTryCatch.isEnabled = true\n        btnCoroutineExceptionHandler.isEnabled = true\n        btnShowResultsEvenIfChildCoroutineFailsTryCatch.isEnabled = true\n    }\n\n    private fun disableButtons() = with(binding) {\n        btnExceptionTryCatch.isEnabled = false\n        btnCoroutineExceptionHandler.isEnabled = false\n        btnShowResultsEvenIfChildCoroutineFailsTryCatch.isEnabled = false\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase13/ExceptionHandlingViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase13\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\n\nclass ExceptionHandlingViewModel(\n    private val api: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun handleExceptionWithTryCatch() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                api.getAndroidVersionFeatures(27)\n\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed: $exception\")\n            }\n        }\n    }\n\n    fun handleWithCoroutineExceptionHandler() {\n        val exceptionHandler = CoroutineExceptionHandler { _, exception ->\n            uiState.value = UiState.Error(\"Network Request failed!! $exception\")\n        }\n\n        uiState.value = UiState.Loading\n        viewModelScope.launch(exceptionHandler) {\n            api.getAndroidVersionFeatures(27)\n        }\n    }\n\n    fun showResultsEvenIfChildCoroutineFails() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n\n\n            //supervisorScope {\n            val oreoFeaturesDeferred = async { api.getAndroidVersionFeatures(27) }\n            val pieFeaturesDeferred = async { api.getAndroidVersionFeatures(28) }\n            val android10FeaturesDeferred = async { api.getAndroidVersionFeatures(29) }\n\n            val versionFeatures = listOf(\n                oreoFeaturesDeferred,\n                pieFeaturesDeferred,\n                android10FeaturesDeferred\n            ).mapNotNull {\n                try {\n                    it.await()\n                } catch (exception: Exception) {\n                    // We have to re-throw cancellation exceptions so that\n                    // our Coroutine gets cancelled immediately.\n                    // Otherwise, the CancellationException is ignored\n                    // and the Coroutine keeps running until it reaches the next\n                    // suspension point.\n                    if (exception is CancellationException) {\n                        throw exception\n                    }\n                    Timber.e(\"Error loading feature data!\")\n                    null\n                }\n            }\n            uiState.value = UiState.Success(versionFeatures)\n            //}\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase13/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase13\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.*\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            MockNetworkInterceptor.INTERNAL_SERVER_ERROR_HTTP_CODE,\n            100\n        )\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1000\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase13/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase13\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: List<VersionFeatures>\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/AndroidVersionDao.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface AndroidVersionDao {\n\n    @Query(\"SELECT * FROM androidversions\")\n    suspend fun getAndroidVersions(): List<AndroidVersionEntity>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(androidVersionEntity: AndroidVersionEntity)\n\n    @Query(\"DELETE FROM androidversions\")\n    suspend fun clear()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/AndroidVersionDatabase.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport android.content.Context\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\n\n@Database(entities = [AndroidVersionEntity::class], version = 1, exportSchema = false)\nabstract class AndroidVersionDatabase : RoomDatabase() {\n\n    abstract fun androidVersionDao(): AndroidVersionDao\n\n    companion object {\n        private var INSTANCE: AndroidVersionDatabase? = null\n\n        fun getInstance(context: Context): AndroidVersionDatabase {\n            if (INSTANCE == null) {\n                synchronized(AndroidVersionDatabase::class) {\n                    INSTANCE = buildRoomDb(context)\n                }\n            }\n            return INSTANCE!!\n        }\n\n        private fun buildRoomDb(context: Context) =\n            Room.databaseBuilder(\n                context.applicationContext,\n                AndroidVersionDatabase::class.java,\n                \"androidversions_usecase12.db\"\n            ).build()\n\n    }\n\n}\n\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/AndroidVersionEntity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport com.demo.code.mock.AndroidVersion\n\n@Entity(tableName = \"androidversions\")\ndata class AndroidVersionEntity(@PrimaryKey val apiLevel: Int, val name: String)\n\nfun AndroidVersionEntity.mapToUiModel() = AndroidVersion(this.apiLevel, this.name)\n\nfun List<AndroidVersionEntity>.mapToUiModelList() = map {\n    it.mapToUiModel()\n}\n\nfun AndroidVersion.mapToEntity() = AndroidVersionEntity(this.apiLevel, this.name)\n\nfun List<AndroidVersion>.mapToEntityList() = map {\n    it.mapToEntity()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/AndroidVersionRepository.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\n\nclass AndroidVersionRepository(\n    private var database: AndroidVersionDao,\n    private val scope: CoroutineScope,\n    private val api: MockApi = mockApi()\n) {\n\n    suspend fun getLocalAndroidVersions(): List<AndroidVersion> {\n        return database.getAndroidVersions().mapToUiModelList()\n    }\n\n    suspend fun loadAndStoreRemoteAndroidVersions(): List<AndroidVersion> {\n        return scope.async {\n            val recentVersions = api.getRecentAndroidVersions()\n                Timber.d(\"Recent Android versions loaded\")\n                for (recentVersion in recentVersions) {\n                    Timber.d(\"Insert $recentVersion to database\")\n                    database.insert(recentVersion.mapToEntity())\n                }\n                recentVersions\n            }.await()\n        }\n\n    fun clearDatabase() {\n        scope.launch {\n            database.clear()\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/ContinueCoroutineWhenUserLeavesScreenActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.CoroutineUsecasesOnAndroidApplication\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase14Description\nimport com.demo.code.databinding.ActivityQueryfromroomdatabaseBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass ContinueCoroutineWhenUserLeavesScreenActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase14Description\n\n    private val binding by lazy { ActivityQueryfromroomdatabaseBinding.inflate(layoutInflater) }\n\n    private val viewModel: ContinueCoroutineWhenUserLeavesScreenViewModel by viewModels {\n        ViewModelFactory((application as CoroutineUsecasesOnAndroidApplication).androidVersionRepository)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnLoadData.setOnClickListener {\n            viewModel.loadData()\n        }\n        binding.btnClearDatabase.setOnClickListener {\n            viewModel.clearDatabase()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad(uiState)\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad(loadingState: UiState.Loading) = with(binding) {\n        when (loadingState) {\n            UiState.Loading.LoadFromDb -> {\n                progressBarLoadFromDb.setVisible()\n                textViewLoadFromDatabase.setVisible()\n                imageViewDatabaseLoadSuccessOrError.setGone()\n            }\n            UiState.Loading.LoadFromNetwork -> {\n                progressBarLoadFromNetwork.setVisible()\n                textViewLoadFromNetwork.setVisible()\n                imageViewNetworkLoadSuccessOrError.setGone()\n            }\n        }\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        when (uiState.dataSource) {\n            DataSource.Network -> {\n                progressBarLoadFromNetwork.setGone()\n                imageViewNetworkLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_check_green_24dp))\n                imageViewNetworkLoadSuccessOrError.setVisible()\n            }\n            DataSource.Database -> {\n                progressBarLoadFromDb.setGone()\n                imageViewDatabaseLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_check_green_24dp))\n                imageViewDatabaseLoadSuccessOrError.setVisible()\n            }\n        }\n\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions [from ${uiState.dataSource.name}]</b><br>${readableVersions.joinToString(\n                separator = \"<br>\"\n            )}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        when (uiState.dataSource) {\n            is DataSource.Network -> {\n                progressBarLoadFromNetwork.setGone()\n                imageViewNetworkLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_clear_red_24dp))\n                imageViewNetworkLoadSuccessOrError.setVisible()\n            }\n            is DataSource.Database -> {\n                progressBarLoadFromDb.setGone()\n                imageViewDatabaseLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_clear_red_24dp))\n                imageViewDatabaseLoadSuccessOrError.setVisible()\n            }\n        }\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/ContinueCoroutineWhenUserLeavesScreenViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport kotlinx.coroutines.launch\n\nclass ContinueCoroutineWhenUserLeavesScreenViewModel(\n    private var repository: AndroidVersionRepository\n) : BaseViewModel<UiState>() {\n\n    // more information in this blogpost about \"Coroutines & Patterns for work that shouldn't\n    // be cancelled\" =>\n    // https://medium.com/androiddevelopers/coroutines-patterns-for-work-that-shouldnt-be-cancelled-e26c40f142ad\n\n    fun loadData() {\n        uiState.value = UiState.Loading.LoadFromDb\n\n        viewModelScope.launch {\n            val localVersions = repository.getLocalAndroidVersions()\n            if (localVersions.isNotEmpty()) {\n                uiState.value =\n                    UiState.Success(DataSource.Database, localVersions)\n            } else {\n                uiState.value =\n                    UiState.Error(DataSource.Database, \"Database empty!\")\n            }\n\n            uiState.value = UiState.Loading.LoadFromNetwork\n\n            try {\n                uiState.value = UiState.Success(\n                    DataSource.Network,\n                    repository.loadAndStoreRemoteAndroidVersions()\n                )\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(DataSource.Network, \"Network Request failed\")\n            }\n        }\n    }\n\n    fun clearDatabase() {\n        repository.clearDatabase()\n    }\n}\n\nsealed class DataSource(val name: String) {\n    object Database : DataSource(\"Database\")\n    object Network : DataSource(\"Network\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() =\n    createMockApi(\n        MockNetworkInterceptor()\n            .mock(\n                \"http://localhost/recent-android-versions\",\n                Gson().toJson(mockAndroidVersions),\n                200,\n                5000\n            )\n    )"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    sealed class Loading : UiState() {\n        object LoadFromDb : Loading()\n        object LoadFromNetwork : Loading()\n    }\n\n    data class Success(val dataSource: DataSource, val recentVersions: List<AndroidVersion>) :\n        UiState()\n\n    data class Error(val dataSource: DataSource, val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase14/ViewModelFactory.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\n\nclass ViewModelFactory(private val repository: AndroidVersionRepository?) :\n    ViewModelProvider.Factory {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return modelClass.getConstructor(AndroidVersionRepository::class.java)\n            .newInstance(repository)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase15/AnalyticsWorker.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase15\n\nimport android.content.Context\nimport androidx.work.CoroutineWorker\nimport androidx.work.WorkerParameters\nimport com.demo.code.mock.createMockAnalyticsApi\nimport com.demo.code.utils.MockNetworkInterceptor\nimport timber.log.Timber\n\nclass AnalyticsWorker(appContext: Context, workerParameters: WorkerParameters) :\n    CoroutineWorker(appContext, workerParameters) {\n\n    private val analyticsApi = createMockAnalyticsApi()\n\n    override suspend fun doWork(): Result {\n        return try {\n            analyticsApi.trackScreenOpened()\n            Timber.d(\"Successfully tracked screen open event!\")\n            Result.success()\n        } catch (exception: Exception) {\n            Timber.e(\"Tracking screen open event failed!\")\n            Result.failure()\n        }\n    }\n\n    companion object {\n        fun createMockAnalyticsApi() = createMockAnalyticsApi(\n            MockNetworkInterceptor()\n                .mock(\n                    \"http://localhost/analytics/workmanager-screen-opened\",\n                    \"true\",\n                    200,\n                    1500\n                )\n        )\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase15/ViewModelFactory.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase15\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\n\nclass ViewModelFactory(private val context: Context) :\n    ViewModelProvider.Factory {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return modelClass.getConstructor(Context::class.java)\n            .newInstance(context.applicationContext)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase15/WorkManagerActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase15\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase15Description\nimport com.demo.code.databinding.ActivityWorkmangerBinding\n\nclass WorkManagerActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase15Description\n\n    private val binding by lazy { ActivityWorkmangerBinding.inflate(layoutInflater) }\n    private val viewModel: WorkManagerViewModel by viewModels {\n        ViewModelFactory(this)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.performAnalyticsRequest()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase15/WorkManagerViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase15\n\nimport android.content.Context\nimport androidx.lifecycle.ViewModel\nimport androidx.work.Constraints\nimport androidx.work.NetworkType\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkManager\nimport java.util.concurrent.TimeUnit\n\nclass WorkManagerViewModel(private val context: Context) : ViewModel() {\n\n    fun performAnalyticsRequest() {\n        val constraints =\n            Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()\n\n        val request = OneTimeWorkRequestBuilder<AnalyticsWorker>()\n            .setConstraints(constraints)\n            // Set a delay to not slow down other UI related requests that should run fast\n            .setInitialDelay(10, TimeUnit.SECONDS)\n            .addTag(\"analyitcs-work-request\")\n            .build()\n\n        WorkManager.getInstance(context).enqueue(request)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase16/FactorialCalculator.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase16\n\nimport com.demo.code.utils.addCoroutineDebugInfo\nimport kotlinx.coroutines.*\nimport timber.log.Timber\nimport java.math.BigInteger\n\nclass FactorialCalculator {\n\n    suspend fun calculateFactorial(\n        factorialOf: Int,\n        numberOfThreads: Int,\n        dispatcher: CoroutineDispatcher,\n        yieldDuringCalculation: Boolean\n    ): BigInteger {\n\n        val subRanges = createSubRangeList(factorialOf, numberOfThreads, dispatcher)\n        return withContext(dispatcher) {\n            subRanges.map { subRange ->\n                async {\n                    calculateFactorialOfSubRange(subRange, yieldDuringCalculation)\n                }\n            }.awaitAll()\n                .fold(BigInteger.ONE, { acc, element ->\n                    if (yieldDuringCalculation) {\n                        yield()\n                    }\n                    acc.multiply(element)\n                })\n        }\n    }\n\n    private suspend fun calculateFactorialOfSubRange(\n        subRange: SubRange,\n        yieldDuringCalculation: Boolean\n    ): BigInteger {\n        Timber.d(addCoroutineDebugInfo(\"Calculate factorial of $subRange\"))\n        var factorial = BigInteger.ONE\n        for (i in subRange.start..subRange.end) {\n            if (yieldDuringCalculation) {\n                yield()\n            }\n            factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n        }\n        return factorial\n    }\n\n    private suspend fun createSubRangeList(\n        factorialOf: Int,\n        numberOfSubRanges: Int,\n        dispatcher: CoroutineDispatcher\n    ): List<SubRange> =\n        withContext(dispatcher) {\n            val quotient = factorialOf.div(numberOfSubRanges)\n            val rangesList = mutableListOf<SubRange>()\n\n            var curStartIndex = 1\n            repeat(numberOfSubRanges - 1) {\n                rangesList.add(\n                    SubRange(\n                        curStartIndex,\n                        curStartIndex + (quotient - 1)\n                    )\n                )\n                curStartIndex += quotient\n            }\n            rangesList.add(SubRange(curStartIndex, factorialOf))\n            rangesList\n        }\n}\n\ndata class SubRange(val start: Int, val end: Int)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase16/PerformanceAnalysisActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase16\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.AdapterView\nimport android.widget.ArrayAdapter\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase16Description\nimport com.demo.code.databinding.ActivityPerformanceanalysisBinding\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\n\nclass PerformanceAnalysisActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase16Description\n\n    private val binding by lazy {\n        ActivityPerformanceanalysisBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: PerformanceAnalysisViewModel by viewModels()\n    private lateinit var selectedDispatcher: CoroutineDispatcher\n    private val resultAdapter = ResultAdapter()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        val numberOfCores = Runtime.getRuntime().availableProcessors()\n        binding.textViewNumberOfCores.text = getString(R.string.device_cores, numberOfCores)\n        viewModel.uiState()\n            .observe(this@PerformanceAnalysisActivity, Observer { uiState ->\n                if (uiState != null) {\n                    render(uiState)\n                }\n            })\n        binding.btnCalculate.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            val numberOfThreads = binding.editTextNumberOfThreads.text.toString().toIntOrNull()\n            if (factorialOf != null && numberOfThreads != null) {\n                viewModel.performCalculation(\n                    factorialOf,\n                    numberOfThreads,\n                    selectedDispatcher,\n                    binding.switchYield.isChecked\n                )\n            }\n        }\n        ArrayAdapter.createFromResource(\n            this@PerformanceAnalysisActivity,\n            R.array.dispatchers,\n            android.R.layout.simple_spinner_item\n        ).also { adapter ->\n            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)\n            binding.spinnerDispatcher.adapter = adapter\n        }\n\n        binding.spinnerDispatcher.onItemSelectedListener =\n            object : AdapterView.OnItemSelectedListener {\n                override fun onNothingSelected(parent: AdapterView<*>?) {}\n\n                override fun onItemSelected(\n                    parent: AdapterView<*>?,\n                    view: View?,\n                    position: Int,\n                    id: Long\n                ) {\n                    when (parent?.getItemAtPosition(position)) {\n                        \"Default\" -> selectedDispatcher = Dispatchers.Default\n                        \"IO\" -> selectedDispatcher = Dispatchers.IO\n                        \"Main\" -> selectedDispatcher = Dispatchers.Main\n                        \"Unconfined\" -> selectedDispatcher = Dispatchers.Unconfined\n                    }\n                }\n            }\n\n        initRecyclerView()\n    }\n\n    private fun initRecyclerView() {\n        binding.recyclerViewResults.apply {\n            adapter = resultAdapter\n            hasFixedSize()\n            layoutManager = LinearLayoutManager(this@PerformanceAnalysisActivity)\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        btnCalculate.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        resultAdapter.addResult(uiState)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnCalculate.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase16/PerformanceAnalysisViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase16\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.math.BigInteger\nimport kotlin.system.measureTimeMillis\n\nclass PerformanceAnalysisViewModel(\n    private val factorialCalculator: FactorialCalculator = FactorialCalculator()\n) : BaseViewModel<UiState>() {\n\n    fun performCalculation(\n        factorialOf: Int,\n        numberOfCoroutines: Int,\n        dispatcher: CoroutineDispatcher,\n        yieldDuringCalculation: Boolean = true\n    ) {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n\n            var factorialResult = BigInteger.ZERO\n            val computationDuration = measureTimeMillis {\n                factorialResult =\n                    factorialCalculator.calculateFactorial(\n                        factorialOf,\n                        numberOfCoroutines,\n                        dispatcher,\n                        yieldDuringCalculation\n                    )\n            }\n\n            var resultString = \"\"\n            val stringConversionDuration = measureTimeMillis {\n                resultString = convertToString(factorialResult, dispatcher)\n            }\n\n            uiState.value =\n                UiState.Success(\n                    resultString,\n                    computationDuration,\n                    stringConversionDuration,\n                    factorialOf.toString(),\n                    numberOfCoroutines.toString(),\n                    dispatcher.toString(),\n                    yieldDuringCalculation\n                )\n        }\n    }\n\n    private suspend fun convertToString(\n        number: BigInteger,\n        dispatcher: CoroutineDispatcher\n    ): String =\n        withContext(dispatcher) {\n            number.toString()\n        }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase16/ResultAdapter.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase16\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport androidx.recyclerview.widget.RecyclerView\nimport com.demo.code.R\nimport com.demo.code.databinding.RecyclerviewItemCalculationResultBinding\nimport kotlinx.android.synthetic.main.recyclerview_item_calculation_result.view.*\n\nclass ResultAdapter(\n    private val results: MutableList<UiState.Success> = mutableListOf()\n) : RecyclerView.Adapter<ResultAdapter.ViewHolder>() {\n\n    class ViewHolder(\n        val layout: LinearLayout,\n        val factorialOf: TextView,\n        val numberOfCoroutines: TextView,\n        val dispatcher: TextView,\n        val yielding: TextView,\n        val calculationDuration: TextView,\n        val stringConversionDuration: TextView,\n        val computationResult: TextView\n\n    ) :\n        RecyclerView.ViewHolder(layout)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val layoutInflater = LayoutInflater.from(parent.context)\n        val binding =\n            RecyclerviewItemCalculationResultBinding.inflate(layoutInflater, parent, false)\n        val layout = binding.root.linearLayout as LinearLayout\n\n        return ViewHolder(\n            layout,\n            binding.textViewResultFactorialOf,\n            binding.textViewResultNumberCoroutines,\n            binding.textViewResultDispatcher,\n            binding.textViewResultYield,\n            binding.textViewDuration,\n            binding.textViewStringConversionDuration,\n            binding.textViewResult\n        )\n    }\n\n    fun addResult(state: UiState.Success) {\n        results.add(0, state)\n        notifyDataSetChanged()\n    }\n\n    override fun getItemCount() = results.size\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) = with(holder) {\n        val result = results[position]\n        val context = layout.context\n\n        factorialOf.text = \"Calculated factorial of ${result.factorialOf}\"\n        numberOfCoroutines.text = \"Coroutines: ${result.numberOfCoroutines}\"\n        dispatcher.text = \"Dispatcher: ${result.dispatcherName}\"\n        yielding.text = \"yield(): ${result.yieldDuringCalculation}\"\n\n        calculationDuration.text =\n            context.getString(R.string.duration_calculation, result.computationDuration)\n\n        stringConversionDuration.text =\n            context.getString(R.string.duration_stringconversion, result.stringConversionDuration)\n\n        computationResult.text = if (result.result.length <= 150) {\n            \"Result: ${result.result}\"\n        } else {\n            \"Result: ${result.result.substring(0, 147)}...\"\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase16/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase16\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val result: String,\n        val computationDuration: Long,\n        val stringConversionDuration: Long,\n        val factorialOf: String,\n        val numberOfCoroutines: String,\n        val dispatcherName: String,\n        val yieldDuringCalculation: Boolean\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase17/PerformCalculationOnMainThreadActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase17\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase17Description\nimport com.demo.code.databinding.ActivityCalculateonmainBinding\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\n\nclass PerformCalculationOnMainThreadActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase17Description\n\n    private val binding by lazy { ActivityCalculateonmainBinding.inflate(layoutInflater) }\n    private val viewModel: PerformCalculationOnMainThreadViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnCalculateOnMain.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            if (factorialOf != null) {\n                viewModel.performCalculationOnMainThread(factorialOf)\n            }\n        }\n        binding.btnCalculateOnMainUsingYield.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            if (factorialOf != null) {\n                viewModel.performCalculationOnMainThreadUsingYield(factorialOf)\n            }\n        }\n        binding.btnCalculateWithDefaultDispatcher.setOnClickListener {\n            val factorialOf = binding.editTextFactorialOf.text.toString().toIntOrNull()\n            if (factorialOf != null) {\n                viewModel.performCalculationWithDefaultDispatcher(factorialOf)\n            }\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewCalculationDuration.text = \"\"\n        btnCalculateOnMain.isEnabled = false\n        btnCalculateOnMainUsingYield.isEnabled = false\n        btnCalculateWithDefaultDispatcher.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnCalculateOnMain.isEnabled = true\n        btnCalculateOnMainUsingYield.isEnabled = true\n        btnCalculateWithDefaultDispatcher.isEnabled = true\n        textViewCalculationDuration.text =\n            \"${uiState.thread}: Calculation took ${uiState.duration}ms\"\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnCalculateOnMain.isEnabled = true\n        btnCalculateOnMainUsingYield.isEnabled = true\n        btnCalculateWithDefaultDispatcher.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase17/PerformCalculationOnMainThreadViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase17\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport kotlinx.coroutines.yield\nimport java.math.BigInteger\nimport kotlin.system.measureTimeMillis\n\nclass PerformCalculationOnMainThreadViewModel : BaseViewModel<UiState>() {\n\n    fun performCalculationOnMainThread(factorialOf: Int) {\n        uiState.value = UiState.Loading\n\n        val duration = measureTimeMillis {\n            calculateFactorialInMainThread(factorialOf)\n        }\n\n        uiState.value = UiState.Success(\"Main thread\", duration)\n    }\n\n    fun performCalculationOnMainThreadUsingYield(factorialOf: Int) {\n        uiState.value = UiState.Loading\n\n        viewModelScope.launch {\n\n            val duration = measureTimeMillis {\n                calculateFactorialInMainThreadUsingYield(factorialOf)\n            }\n\n            uiState.value = UiState.Success(\"Main thread using yield()\", duration)\n        }\n    }\n\n    fun performCalculationWithDefaultDispatcher(factorialOf: Int) {\n        uiState.value = UiState.Loading\n\n        viewModelScope.launch {\n\n            val duration = measureTimeMillis {\n                calculateFactorialOnDefaultDispatcher(factorialOf)\n            }\n\n            uiState.value = UiState.Success(\"Default Dispatcher\", duration)\n        }\n    }\n\n    private fun calculateFactorialInMainThread(number: Int): BigInteger {\n        var factorial = BigInteger.ONE\n        for (i in 1..number) {\n            factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n        }\n        return factorial\n    }\n\n    private suspend fun calculateFactorialInMainThreadUsingYield(number: Int): BigInteger {\n        var factorial = BigInteger.ONE\n        for (i in 1..number) {\n            yield()\n            factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n        }\n        return factorial\n    }\n\n    private suspend fun calculateFactorialOnDefaultDispatcher(number: Int): BigInteger =\n        withContext(Dispatchers.Default) {\n            var factorial = BigInteger.ONE\n            for (i in 1..number) {\n                factorial = factorial.multiply(BigInteger.valueOf(i.toLong()))\n            }\n            factorial\n        }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase17/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase17\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val thread: String, val duration: Long) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1500\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1500\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/Perform2SequentialNetworkRequestsActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase2Description\nimport com.demo.code.databinding.ActivityPerform2sequentialnetworkrequestsBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass Perform2SequentialNetworkRequestsActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityPerform2sequentialnetworkrequestsBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: Perform2SequentialNetworkRequestsViewModel by viewModels()\n\n    override fun getToolbarTitle() = useCase2Description\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnRequestsSequentially.setOnClickListener {\n            viewModel.perform2SequentialNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        textViewResult.text = fromHtml(\n            \"<b>Features of most recent Android Version \\\" ${uiState.versionFeatures.androidVersion.name} \\\"</b><br>\" +\n                    uiState.versionFeatures.features.joinToString(\n                        prefix = \"- \",\n                        separator = \"<br>- \"\n                    )\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnRequestsSequentially.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/Perform2SequentialNetworkRequestsViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.launch\n\nclass Perform2SequentialNetworkRequestsViewModel(\n    private val mockApi: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun perform2SequentialNetworkRequest() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                val recentVersions = mockApi.getRecentAndroidVersions()\n                val mostRecentVersion = recentVersions.last()\n\n                val featuresOfMostRecentVersion =\n                    mockApi.getAndroidVersionFeatures(mostRecentVersion.apiLevel)\n\n                uiState.value = UiState.Success(featuresOfMostRecentVersion)\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: VersionFeatures\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/callbacks/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.utils.MockNetworkInterceptor\nimport okhttp3.OkHttpClient\nimport retrofit2.Call\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\nfun mockApi(): CallbackMockApi = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1500\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1500\n        )\n)\n\ninterface CallbackMockApi {\n\n    @GET(\"recent-android-versions\")\n    fun getRecentAndroidVersions(): Call<List<AndroidVersion>>\n\n    @GET(\"android-version-features/{apiLevel}\")\n    fun getAndroidVersionFeatures(@Path(\"apiLevel\") apiLevel: Int): Call<VersionFeatures>\n}\n\nfun createMockApi(interceptor: MockNetworkInterceptor): CallbackMockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .build()\n\n    return retrofit.create(CallbackMockApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/callbacks/SequentialNetworkRequestsCallbacksActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase2Description\nimport com.demo.code.databinding.ActivityPerform2sequentialnetworkrequestsBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass SequentialNetworkRequestsCallbacksActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityPerform2sequentialnetworkrequestsBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: SequentialNetworkRequestsCallbacksViewModel by viewModels()\n\n    override fun getToolbarTitle() = useCase2Description\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnRequestsSequentially.setOnClickListener {\n            viewModel.perform2SequentialNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        textViewResult.text = fromHtml(\n            \"<b>Features of most recent Android Version \\\" ${uiState.versionFeatures.androidVersion.name} \\\"</b><br>\" +\n                    uiState.versionFeatures.features.joinToString(\n                        prefix = \"- \",\n                        separator = \"<br>- \"\n                    )\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnRequestsSequentially.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/callbacks/SequentialNetworkRequestsCallbacksViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\n\nclass SequentialNetworkRequestsCallbacksViewModel(\n    private val mockApi: CallbackMockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    private var getAndroidVersionsCall: Call<List<AndroidVersion>>? = null\n    private var getAndroidFeaturesCall: Call<VersionFeatures>? = null\n\n    fun perform2SequentialNetworkRequest() {\n\n        uiState.value = UiState.Loading\n\n        getAndroidVersionsCall = mockApi.getRecentAndroidVersions()\n        getAndroidVersionsCall!!.enqueue(object : Callback<List<AndroidVersion>> {\n            override fun onFailure(call: Call<List<AndroidVersion>>, t: Throwable) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n\n            override fun onResponse(\n                call: Call<List<AndroidVersion>>,\n                response: Response<List<AndroidVersion>>\n            ) {\n                if (response.isSuccessful) {\n                    val mostRecentVersion = response.body()!!.last()\n                    getAndroidFeaturesCall =\n                        mockApi.getAndroidVersionFeatures(mostRecentVersion.apiLevel)\n                    getAndroidFeaturesCall!!.enqueue(object : Callback<VersionFeatures> {\n                        override fun onFailure(call: Call<VersionFeatures>, t: Throwable) {\n                            uiState.value = UiState.Error(\"Network Request failed\")\n                        }\n\n                        override fun onResponse(\n                            call: Call<VersionFeatures>,\n                            response: Response<VersionFeatures>\n                        ) {\n                            if (response.isSuccessful) {\n                                val featuresOfMostRecentVersion = response.body()!!\n                                uiState.value = UiState.Success(featuresOfMostRecentVersion)\n                            } else {\n                                uiState.value = UiState.Error(\"Network Request failed\")\n                            }\n                        }\n                    })\n                } else {\n                    uiState.value = UiState.Error(\"Network Request failed\")\n                }\n            }\n        })\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n\n        getAndroidVersionsCall?.cancel()\n        getAndroidFeaturesCall?.cancel()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/callbacks/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: VersionFeatures\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/rx/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.rx\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.utils.MockNetworkInterceptor\nimport io.reactivex.Single\nimport io.reactivex.schedulers.Schedulers\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\nfun mockApi(): RxMockApi = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1500\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1500\n        )\n)\n\ninterface RxMockApi {\n\n    @GET(\"recent-android-versions\")\n    fun getRecentAndroidVersions(): Single<List<AndroidVersion>>\n\n    @GET(\"android-version-features/{apiLevel}\")\n    fun getAndroidVersionFeatures(@Path(\"apiLevel\") apiLevel: Int): Single<VersionFeatures>\n}\n\nfun createMockApi(interceptor: MockNetworkInterceptor): RxMockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))\n        .build()\n\n    return retrofit.create(RxMockApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/rx/SequentialNetworkRequestsRxActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.rx\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase2UsingRxDescription\nimport com.demo.code.databinding.ActivityPerform2sequentialnetworkrequestsBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass SequentialNetworkRequestsRxActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityPerform2sequentialnetworkrequestsBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: SequentialNetworkRequestsRxViewModel by viewModels()\n\n    override fun getToolbarTitle() = useCase2UsingRxDescription\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnRequestsSequentially.setOnClickListener {\n            viewModel.perform2SequentialNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        textViewResult.text = fromHtml(\n            \"<b>Features of most recent Android Version \\\" ${uiState.versionFeatures.androidVersion.name} \\\"</b><br>\" +\n                    uiState.versionFeatures.features.joinToString(\n                        prefix = \"- \",\n                        separator = \"<br>- \"\n                    )\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnRequestsSequentially.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/rx/SequentialNetworkRequestsRxViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.rx\n\nimport com.demo.code.base.BaseViewModel\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.disposables.CompositeDisposable\nimport io.reactivex.rxkotlin.addTo\nimport io.reactivex.rxkotlin.subscribeBy\nimport io.reactivex.schedulers.Schedulers\n\nclass SequentialNetworkRequestsRxViewModel(\n    private val mockApi: RxMockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    private val disposables = CompositeDisposable()\n\n    fun perform2SequentialNetworkRequest() {\n        uiState.value = UiState.Loading\n\n        mockApi.getRecentAndroidVersions()\n            .flatMap { androidVersions ->\n                val recentVersion = androidVersions.last()\n                mockApi.getAndroidVersionFeatures(recentVersion.apiLevel)\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribeBy(\n                onSuccess = { featureVersions ->\n                    uiState.value = UiState.Success(featureVersions)\n                },\n                onError = {\n                    uiState.value = UiState.Error(\"Network Request failed.\")\n                }\n            )\n            .addTo(disposables)\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n        disposables.clear()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase2/rx/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.rx\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: VersionFeatures\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase3/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1000\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase3/PerformNetworkRequestsConcurrentlyActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase3Description\nimport com.demo.code.databinding.ActivityPerformnetworkrequestsconcurrentlyBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass PerformNetworkRequestsConcurrentlyActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityPerformnetworkrequestsconcurrentlyBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: PerformNetworkRequestsConcurrentlyViewModel by viewModels()\n    override fun getToolbarTitle() = useCase3Description\n\n    private var operationStartTime = 0L\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnRequestsSequentially.setOnClickListener {\n            viewModel.performNetworkRequestsSequentially()\n        }\n        binding.btnRequestsConcurrently.setOnClickListener {\n            viewModel.performNetworkRequestsConcurrently()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        operationStartTime = System.currentTimeMillis()\n        progressBar.setVisible()\n        textViewDuration.text = \"\"\n        textViewResult.text = \"\"\n        disableButtons()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        enableButtons()\n        progressBar.setGone()\n        val duration = System.currentTimeMillis() - operationStartTime\n        textViewDuration.text = getString(R.string.duration, duration)\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.joinToString(separator = \"<br><br>\") {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) {\n        binding.progressBar.setGone()\n        binding.textViewDuration.setGone()\n        toast(uiState.message)\n        enableButtons()\n    }\n\n    private fun enableButtons() {\n        binding.btnRequestsSequentially.isEnabled = true\n        binding.btnRequestsConcurrently.isEnabled = true\n    }\n\n    private fun disableButtons() {\n        binding.btnRequestsSequentially.isEnabled = false\n        binding.btnRequestsConcurrently.isEnabled = false\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase3/PerformNetworkRequestsConcurrentlyViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.launch\n\nclass PerformNetworkRequestsConcurrentlyViewModel(\n    private val mockApi: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performNetworkRequestsSequentially() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                val oreoFeatures = mockApi.getAndroidVersionFeatures(27)\n                val pieFeatures = mockApi.getAndroidVersionFeatures(28)\n                val android10Features = mockApi.getAndroidVersionFeatures(29)\n\n                val versionFeatures = listOf(oreoFeatures, pieFeatures, android10Features)\n                uiState.value = UiState.Success(versionFeatures)\n\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n\n    fun performNetworkRequestsConcurrently() {\n        uiState.value = UiState.Loading\n\n        val oreoFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(27) }\n        val pieFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(28) }\n        val android10FeaturesDeferred =\n            viewModelScope.async { mockApi.getAndroidVersionFeatures(29) }\n\n        viewModelScope.launch {\n            try {\n                val versionFeatures =\n                    awaitAll(oreoFeaturesDeferred, pieFeaturesDeferred, android10FeaturesDeferred)\n                uiState.value = UiState.Success(versionFeatures)\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n\n        /*\n\n        Alternatively:\n\n        viewModelScope.launch {\n            try {\n                // we need to wrap this code with a coroutineScope block\n                // otherwise the app would crash on unsuccessful network requests\n                coroutineScope {\n                    val oreoFeaturesDeferred = async { mockApi.getAndroidVersionFeatures(27) }\n                    val pieFeaturesDeferred = async { mockApi.getAndroidVersionFeatures(28) }\n                    val android10FeaturesDeferred = async { mockApi.getAndroidVersionFeatures(29) }\n\n                    val oreoFeatures = oreoFeaturesDeferred.await()\n                    val pieFeatures = pieFeaturesDeferred.await()\n                    val android10Features = android10FeaturesDeferred.await()\n\n                    val versionFeatures = listOf(oreoFeatures, pieFeatures, android10Features)\n\n                    // other alternative: (but slightly different behavior when a deferred fails, see docs)\n                    // val versionFeatures = awaitAll(oreoFeaturesDeferred, pieFeaturesDeferred, android10FeaturesDeferred)\n\n                    uiState.value = UiState.Success(versionFeatures)\n                }\n\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }*/\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase3/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: List<VersionFeatures>\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase4/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.*\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1000\n        )\n        .mock(\n            \"http://localhost/android-version-features/29\",\n            Gson().toJson(mockVersionFeaturesAndroid10),\n            200,\n            1000\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase4/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(\n        val versionFeatures: List<VersionFeatures>\n    ) : UiState()\n\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase4/VariableAmountOfNetworkRequestsActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase4Description\nimport com.demo.code.databinding.ActivityPerformvariableamountofnetworkrequestsconcurrentlyBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass VariableAmountOfNetworkRequestsActivity : BaseActivity() {\n\n    private val binding by lazy {\n        ActivityPerformvariableamountofnetworkrequestsconcurrentlyBinding.inflate(\n            layoutInflater\n        )\n    }\n\n    private val viewModel: VariableAmountOfNetworkRequestsViewModel by viewModels()\n\n    override fun getToolbarTitle() = useCase4Description\n\n    private var operationStartTime = 0L\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n\n        binding.btnRequestsSequentially.setOnClickListener {\n            viewModel.performNetworkRequestsSequentially()\n        }\n\n        binding.btnRequestsConcurrently.setOnClickListener {\n            viewModel.performNetworkRequestsConcurrently()\n        }\n\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        operationStartTime = System.currentTimeMillis()\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        textViewDuration.text = \"\"\n        disableButtons()\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        enableButtons()\n        progressBar.setGone()\n        val duration = System.currentTimeMillis() - operationStartTime\n        textViewDuration.text = getString(R.string.duration, duration)\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.map {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }.joinToString(separator = \"<br><br>\")\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        toast(uiState.message)\n        enableButtons()\n    }\n\n    private fun enableButtons() = with(binding) {\n        btnRequestsSequentially.isEnabled = true\n        btnRequestsConcurrently.isEnabled = true\n    }\n\n    private fun disableButtons() = with(binding) {\n        btnRequestsSequentially.isEnabled = false\n        btnRequestsConcurrently.isEnabled = false\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase4/VariableAmountOfNetworkRequestsViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.launch\n\nclass VariableAmountOfNetworkRequestsViewModel(\n    private val mockApi: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performNetworkRequestsSequentially() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                val recentVersions = mockApi.getRecentAndroidVersions()\n                val versionFeatures = recentVersions.map { androidVersion ->\n                    mockApi.getAndroidVersionFeatures(androidVersion.apiLevel)\n                }\n                uiState.value = UiState.Success(versionFeatures)\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n\n    fun performNetworkRequestsConcurrently() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            try {\n                val recentVersions = mockApi.getRecentAndroidVersions()\n                val versionFeatures = recentVersions\n                    .map { androidVersion ->\n                        async { mockApi.getAndroidVersionFeatures(androidVersion.apiLevel) }\n                    }.awaitAll()\n                uiState.value = UiState.Success(versionFeatures)\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase5/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1000\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase5/NetworkRequestWithTimeoutActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase5Description\nimport com.demo.code.databinding.ActivityNetworkrequestwithtimeoutBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass NetworkRequestWithTimeoutActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase5Description\n\n    private val binding by lazy { ActivityNetworkrequestwithtimeoutBinding.inflate(layoutInflater) }\n    private val viewModel: NetworkRequestWithTimeoutViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            val timeOut = binding.editTextTimeOut.text.toString().toLongOrNull()\n            if (timeOut != null) {\n                viewModel.performNetworkRequest(timeOut)\n            }\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions</b><br>${readableVersions.joinToString(separator = \"<br>\")}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase5/NetworkRequestWithTimeoutViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.TimeoutCancellationException\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withTimeout\nimport kotlinx.coroutines.withTimeoutOrNull\n\nclass NetworkRequestWithTimeoutViewModel(\n    private val api: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performNetworkRequest(timeout: Long) {\n        uiState.value = UiState.Loading\n        // usingWithTimeout(timeout)\n        usingWithTimeoutOrNull(timeout)\n    }\n\n    private fun usingWithTimeout(timeout: Long) {\n        viewModelScope.launch {\n            try {\n                val recentVersions = withTimeout(timeout) {\n                    api.getRecentAndroidVersions()\n                }\n                uiState.value = UiState.Success(recentVersions)\n            } catch (timeoutCancellationException: TimeoutCancellationException) {\n                uiState.value = UiState.Error(\"Network Request timed out!\")\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed!\")\n            }\n        }\n    }\n\n    private fun usingWithTimeoutOrNull(timeout: Long) {\n        viewModelScope.launch {\n            try {\n                val recentVersions = withTimeoutOrNull(timeout) {\n                    api.getRecentAndroidVersions()\n                }\n\n                if (recentVersions != null) {\n                    uiState.value = UiState.Success(recentVersions)\n                } else {\n                    uiState.value = UiState.Error(\"Network Request timed out!\")\n                }\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed!\")\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase5/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val recentVersions: List<AndroidVersion>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase6/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        .mock(\n            \"http://localhost/recent-android-versions\",\n            \"something went wrong on server side\",\n            500,\n            1000,\n            persist = false\n        ).mock(\n            \"http://localhost/recent-android-versions\",\n            \"something went wrong on server side\",\n            500,\n            1000,\n            persist = false\n        ).mock(\n            \"http://localhost/recent-android-versions\",\n            Gson().toJson(mockAndroidVersions),\n            200,\n            1000\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase6/RetryNetworkRequestActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase6Description\nimport com.demo.code.databinding.ActivityRetrynetworkrequestBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass RetryNetworkRequestActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase6Description\n\n    private val binding by lazy { ActivityRetrynetworkrequestBinding.inflate(layoutInflater) }\n    private val viewModel: RetryNetworkRequestViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions</b><br>${readableVersions.joinToString(separator = \"<br>\")}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase6/RetryNetworkRequestViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport timber.log.Timber\n\nclass RetryNetworkRequestViewModel(\n    private val api: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performNetworkRequest() {\n        uiState.value = UiState.Loading\n        viewModelScope.launch {\n            val numberOfRetries = 2\n            try {\n                retry(times = numberOfRetries) {\n                    val recentVersions = api.getRecentAndroidVersions()\n                    uiState.value = UiState.Success(recentVersions)\n                }\n            } catch (e: Exception) {\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n\n    // retry with exponential backoff\n    // inspired by https://stackoverflow.com/questions/46872242/how-to-exponential-backoff-retry-on-kotlin-coroutines\n    private suspend fun <T> retry(\n        times: Int,\n        initialDelayMillis: Long = 100,\n        maxDelayMillis: Long = 1000,\n        factor: Double = 2.0,\n        block: suspend () -> T\n    ): T {\n        var currentDelay = initialDelayMillis\n        repeat(times) {\n            try {\n                return block()\n            } catch (exception: Exception) {\n                Timber.e(exception)\n            }\n            delay(currentDelay)\n            currentDelay = (currentDelay * factor).toLong().coerceAtMost(maxDelayMillis)\n        }\n        return block() // last attempt\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase6/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val recentVersions: List<AndroidVersion>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() = createMockApi(\n    MockNetworkInterceptor()\n        // timeout on first request for oreo features\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            1050,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            \"Something went wrong on servers side\",\n            500,\n            100,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            100\n        )\n        // timeout on first request for pie features\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1050,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            \"Something went wrong on servers side\",\n            500,\n            100,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            100\n        )\n)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/TimeoutAndRetryActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase7Description\nimport com.demo.code.databinding.ActivityRetrynetworkrequestBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass TimeoutAndRetryActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase7Description\n\n    private val binding by lazy { ActivityRetrynetworkrequestBinding.inflate(layoutInflater) }\n    private val viewModel: TimeoutAndRetryViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.map {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }.joinToString(separator = \"<br><br>\")\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/TimeoutAndRetryViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.*\nimport timber.log.Timber\n\nclass TimeoutAndRetryViewModel(\n    private val api: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performNetworkRequest() {\n        uiState.value = UiState.Loading\n        val numberOfRetries = 2\n        val timeout = 1000L\n\n        val oreoVersionsDeferred = viewModelScope.async {\n            retryWithTimeout(numberOfRetries, timeout) {\n                api.getAndroidVersionFeatures(27)\n            }\n        }\n\n        val pieVersionsDeferred = viewModelScope.async {\n            retryWithTimeout(numberOfRetries, timeout) {\n                api.getAndroidVersionFeatures(28)\n            }\n        }\n\n        viewModelScope.launch {\n            try {\n                val versionFeatures = listOf(\n                    oreoVersionsDeferred,\n                    pieVersionsDeferred\n                ).awaitAll()\n\n                uiState.value = UiState.Success(versionFeatures)\n\n            } catch (e: Exception) {\n                Timber.e(e)\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n        }\n    }\n\n    private suspend fun <T> retryWithTimeout(\n        numberOfRetries: Int,\n        timeout: Long,\n        block: suspend () -> T\n    ) = retry(numberOfRetries) {\n        withTimeout(timeout) {\n            block()\n        }\n    }\n\n    private suspend fun <T> retry(\n        numberOfRetries: Int,\n        delayBetweenRetries: Long = 100,\n        block: suspend () -> T\n    ): T {\n        repeat(numberOfRetries) {\n            try {\n                return block()\n            } catch (exception: Exception) {\n                Timber.e(exception)\n            }\n            delay(delayBetweenRetries)\n        }\n        return block() // last attempt\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val versionFeatures: List<VersionFeatures>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/callbacks/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.callbacks\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MockNetworkInterceptor\nimport okhttp3.OkHttpClient\nimport retrofit2.Call\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\nfun mockApi(): CallbackMockApi = createMockApi(\n    MockNetworkInterceptor()\n        // timeout on first request for oreo features\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            1200,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            \"Something went wrong on servers side\",\n            500,\n            300,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            100\n        )\n        // timeout on first request for pie features\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1200,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            \"Something went wrong on servers side\",\n            500,\n            200,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            100\n        )\n)\n\ninterface CallbackMockApi {\n\n    @GET(\"recent-android-versions\")\n    fun getRecentAndroidVersions(): Call<List<AndroidVersion>>\n\n    @GET(\"android-version-features/{apiLevel}\")\n    fun getAndroidVersionFeatures(@Path(\"apiLevel\") apiLevel: Int): Call<VersionFeatures>\n}\n\nfun createMockApi(interceptor: MockNetworkInterceptor): CallbackMockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .build()\n\n    return retrofit.create(CallbackMockApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/callbacks/TimeoutAndRetryCallbackActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.callbacks\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase7UsingCallbacksDescription\nimport com.demo.code.databinding.ActivityRetrynetworkrequestBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass TimeoutAndRetryCallbackActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase7UsingCallbacksDescription\n\n    private val binding by lazy { ActivityRetrynetworkrequestBinding.inflate(layoutInflater) }\n    private val viewModel: TimeoutAndRetryCallbackViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.map {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }.joinToString(separator = \"<br><br>\")\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/callbacks/TimeoutAndRetryCallbackViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.callbacks\n\nimport android.os.Handler\nimport android.os.Looper\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.VersionFeatures\nimport retrofit2.Call\nimport retrofit2.Callback\nimport retrofit2.Response\nimport timber.log.Timber\n\nclass TimeoutAndRetryCallbackViewModel(api: CallbackMockApi = mockApi()) :\n    BaseViewModel<UiState>() {\n\n    private val totalAttempts = 3\n\n    private var oreoFeaturesRequestAttemptNumber = 0\n    private var pieFeaturesRequestAttemptNumber = 0\n\n    private val shouldRetryOreoFeaturesRequest: Boolean\n        get() = oreoFeaturesRequestAttemptNumber < totalAttempts\n\n    private val shouldRetryPieFeaturesRequest: Boolean\n        get() = pieFeaturesRequestAttemptNumber < totalAttempts\n\n    private val timeout = 1000L\n\n    private val oreoFeaturesTimeoutHandler = Handler(Looper.getMainLooper())\n    private val pieFeaturesTimeoutHandler = Handler(Looper.getMainLooper())\n\n    private var oreoFeaturesCall = api.getAndroidVersionFeatures(27)\n    private var pieFeaturesCall = api.getAndroidVersionFeatures(28)\n\n    private var oreoFeaturesResult: VersionFeatures? = null\n    private var pieFeaturesResult: VersionFeatures? = null\n\n    private val oreoFeaturesReceived: Boolean\n        get() = oreoFeaturesResult != null\n\n    private val pieFeaturesReceived: Boolean\n        get() = pieFeaturesResult != null\n\n    fun performNetworkRequest() {\n        uiState.value = UiState.Loading\n\n        getOreoFeatures()\n        getPieFeatures()\n    }\n\n    private fun getOreoFeatures() {\n        oreoFeaturesRequestAttemptNumber++\n        Timber.d(\"Start get oreo features request\")\n        oreoFeaturesCall = oreoFeaturesCall.clone()\n        oreoFeaturesCall.enqueue(object : Callback<VersionFeatures> {\n            override fun onFailure(call: Call<VersionFeatures>, t: Throwable) {\n                Timber.e(\"Get oreo features onFailure() entered: $t\")\n                stopOreoFeaturesTimeoutHandler()\n                postErrorOrRetryGetOreoFeatures()\n            }\n\n            override fun onResponse(\n                call: Call<VersionFeatures>,\n                response: Response<VersionFeatures>\n            ) {\n                stopOreoFeaturesTimeoutHandler()\n                if (!response.isSuccessful) {\n                    Timber.e(\"Get oreo features request was unsuccessful\")\n                    postErrorOrRetryGetOreoFeatures()\n                    return\n                } else {\n                    Timber.d(\"successful oreo response received.\")\n                }\n                oreoFeaturesResult = response.body()\n                maybeNotifyView()\n            }\n        })\n        setOreoFeaturesTimeout()\n    }\n\n    private fun setOreoFeaturesTimeout() {\n        val retryRunnable = Runnable {\n            Timber.e(\"Timeout for getting oreo features\")\n            if (!oreoFeaturesReceived) {\n                oreoFeaturesCall.cancel()\n            }\n        }\n        Timber.d(\"start oreo Features Timeout Handler\")\n        oreoFeaturesTimeoutHandler.postDelayed(retryRunnable, timeout)\n    }\n\n    private fun postErrorOrRetryGetOreoFeatures() {\n        if (shouldRetryOreoFeaturesRequest) {\n            getOreoFeatures()\n        } else {\n            uiState.value = UiState.Error(\"Network Request failed.\")\n            cancelNetworkRequests()\n        }\n    }\n\n    private fun getPieFeatures() {\n        pieFeaturesRequestAttemptNumber++\n        Timber.d(\"Start get pie features request\")\n        pieFeaturesCall = pieFeaturesCall.clone()\n        pieFeaturesCall.enqueue(object : Callback<VersionFeatures> {\n            override fun onFailure(call: Call<VersionFeatures>, t: Throwable) {\n                Timber.e(\"Get pie features onFailure() entered: $t\")\n                stopPieFeaturesTimeoutHandler()\n                postErrorOrRetryGetPieFeatures()\n            }\n\n            override fun onResponse(\n                call: Call<VersionFeatures>,\n                response: Response<VersionFeatures>\n            ) {\n                stopPieFeaturesTimeoutHandler()\n\n                if (!response.isSuccessful) {\n                    Timber.e(\"Get pie features request was unsuccessful\")\n                    postErrorOrRetryGetPieFeatures()\n                    return\n                } else {\n                    Timber.d(\"successful pie response received.\")\n                }\n\n                pieFeaturesResult = response.body()\n                maybeNotifyView()\n            }\n        })\n        setPieFeaturesTimeout()\n    }\n\n    private fun stopPieFeaturesTimeoutHandler() {\n        Timber.d(\"stopping pie Features Timeout Handler\")\n        pieFeaturesTimeoutHandler.removeCallbacksAndMessages(null)\n    }\n\n    private fun setPieFeaturesTimeout() {\n        val retryRunnable = Runnable {\n            Timber.e(\"Timeout for getting pie features\")\n            if (!pieFeaturesReceived) {\n                pieFeaturesCall.cancel()\n            }\n        }\n        Timber.d(\"start pie Features Timeout Handler\")\n        pieFeaturesTimeoutHandler.postDelayed(retryRunnable, timeout)\n    }\n\n    private fun postErrorOrRetryGetPieFeatures() {\n        if (shouldRetryPieFeaturesRequest) {\n            getPieFeatures()\n        } else {\n            uiState.value = UiState.Error(\"Network Request failed.\")\n            cancelNetworkRequests()\n        }\n    }\n\n    private fun maybeNotifyView() {\n        if (oreoFeaturesReceived && pieFeaturesReceived) {\n            uiState.value = UiState.Success(listOf(oreoFeaturesResult!!, pieFeaturesResult!!))\n        }\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n        cancelNetworkRequests()\n        stopOreoFeaturesTimeoutHandler()\n        stopPieFeaturesTimeoutHandler()\n    }\n\n    private fun stopOreoFeaturesTimeoutHandler() {\n        Timber.d(\"stopping oreo Features Timeout Handler\")\n        oreoFeaturesTimeoutHandler.removeCallbacksAndMessages(null)\n    }\n\n    private fun cancelNetworkRequests() {\n        oreoFeaturesCall.cancel()\n        pieFeaturesCall.cancel()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/callbacks/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.callbacks\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val versionFeatures: List<VersionFeatures>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/rx/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.rx\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MockNetworkInterceptor\nimport io.reactivex.Single\nimport io.reactivex.schedulers.Schedulers\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\nfun mockApi(): RxMockApi = createMockApi(\n    MockNetworkInterceptor()\n        // timeout on first request for oreo features\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            1050,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            \"Something went wrong on servers side\",\n            500,\n            200,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/27\",\n            Gson().toJson(mockVersionFeaturesOreo),\n            200,\n            100\n        )\n        // timeout on first request for pie features\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            1050,\n            persist = false\n        )\n        // network error on second request\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            \"Something went wrong on servers side\",\n            500,\n            200,\n            persist = false\n        )\n        // 3rd request is successful and within timeout\n        .mock(\n            \"http://localhost/android-version-features/28\",\n            Gson().toJson(mockVersionFeaturesPie),\n            200,\n            100\n        )\n)\n\ninterface RxMockApi {\n\n    @GET(\"recent-android-versions\")\n    fun getRecentAndroidVersions(): Single<List<AndroidVersion>>\n\n    @GET(\"android-version-features/{apiLevel}\")\n    fun getAndroidVersionFeatures(@Path(\"apiLevel\") apiLevel: Int): Single<VersionFeatures>\n}\n\nfun createMockApi(interceptor: MockNetworkInterceptor): RxMockApi {\n    val okHttpClient = OkHttpClient.Builder()\n        .addInterceptor(interceptor)\n        .build()\n\n    val retrofit = Retrofit.Builder()\n        .baseUrl(\"http://localhost/\")\n        .client(okHttpClient)\n        .addConverterFactory(GsonConverterFactory.create())\n        .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))\n        .build()\n\n    return retrofit.create(RxMockApi::class.java)\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/rx/TimeoutAndRetryRxActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.rx\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase7Description\nimport com.demo.code.databinding.ActivityRetrynetworkrequestBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass TimeoutAndRetryRxActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase7Description\n\n    private val binding by lazy { ActivityRetrynetworkrequestBinding.inflate(layoutInflater) }\n    private val viewModel: TimeoutAndRetryRxViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n\n        val versionFeatures = uiState.versionFeatures\n        val versionFeaturesString = versionFeatures.map {\n            \"<b>New Features of ${it.androidVersion.name} </b> <br> ${it.features.joinToString(\n                prefix = \"- \",\n                separator = \"<br>- \"\n            )}\"\n        }.joinToString(separator = \"<br><br>\")\n\n        textViewResult.text = fromHtml(versionFeaturesString)\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/rx/TimeoutAndRetryRxViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.rx\n\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.VersionFeatures\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.disposables.CompositeDisposable\nimport io.reactivex.functions.BiFunction\nimport io.reactivex.rxkotlin.addTo\nimport io.reactivex.rxkotlin.subscribeBy\nimport io.reactivex.schedulers.Schedulers\nimport timber.log.Timber\nimport java.util.concurrent.TimeUnit\n\nclass TimeoutAndRetryRxViewModel(\n    private val api: RxMockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    private val disposables = CompositeDisposable()\n\n    fun performNetworkRequest() {\n\n        uiState.value = UiState.Loading\n\n        val timeout = 1000L\n        val numberOfRetries = 2\n\n        Single.zip(\n            api.getAndroidVersionFeatures(27)\n                .timeout(timeout, TimeUnit.MILLISECONDS)\n                .retry { x, e ->\n                    Timber.e(e)\n                    x <= numberOfRetries\n                },\n            api.getAndroidVersionFeatures(28)\n                .timeout(timeout, TimeUnit.MILLISECONDS)\n                .retry { x, e ->\n                    Timber.e(e)\n                    x <= numberOfRetries\n                },\n            BiFunction<VersionFeatures, VersionFeatures, List<VersionFeatures>> { versionFeaturesOreo, versionFeaturesPie ->\n                listOf(versionFeaturesOreo, versionFeaturesPie)\n            })\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribeBy(\n                onSuccess = { versionFeatures ->\n                    uiState.value = UiState.Success(versionFeatures)\n                },\n                onError = { error ->\n                    Timber.e(error)\n                    uiState.value = UiState.Error(\"Network Request failed\")\n                })\n            .addTo(disposables)\n    }\n\n    override fun onCleared() {\n        super.onCleared()\n        disposables.clear()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase7/rx/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase7.rx\n\nimport com.demo.code.mock.VersionFeatures\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val versionFeatures: List<VersionFeatures>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/AndroidVersionDao.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface AndroidVersionDao {\n\n    @Query(\"SELECT * FROM androidversions\")\n    suspend fun getAndroidVersions(): List<AndroidVersionEntity>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(androidVersionEntity: AndroidVersionEntity)\n\n    @Query(\"DELETE FROM androidversions\")\n    suspend fun clear()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/AndroidVersionDatabase.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport android.content.Context\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\n\n@Database(entities = [AndroidVersionEntity::class], version = 1, exportSchema = false)\nabstract class AndroidVersionDatabase : RoomDatabase() {\n\n    abstract fun androidVersionDao(): AndroidVersionDao\n\n    companion object {\n        private var INSTANCE: AndroidVersionDatabase? = null\n\n        fun getInstance(context: Context): AndroidVersionDatabase {\n            if (INSTANCE == null) {\n                synchronized(AndroidVersionDatabase::class) {\n                    INSTANCE = buildRoomDb(context)\n                }\n            }\n            return INSTANCE!!\n        }\n\n        private fun buildRoomDb(context: Context) =\n            Room.databaseBuilder(\n                context.applicationContext,\n                AndroidVersionDatabase::class.java,\n                \"androidversions.db\"\n            ).build()\n\n    }\n\n}\n\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/AndroidVersionEntity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport com.demo.code.mock.AndroidVersion\n\n@Entity(tableName = \"androidversions\")\ndata class AndroidVersionEntity(@PrimaryKey val apiLevel: Int, val name: String)\n\nfun List<AndroidVersionEntity>.mapToUiModelList() = map {\n    AndroidVersion(it.apiLevel, it.name)\n}\n\nfun AndroidVersion.mapToEntity() = AndroidVersionEntity(this.apiLevel, this.name)"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() =\n    createMockApi(\n        MockNetworkInterceptor()\n            .mock(\n                \"http://localhost/recent-android-versions\",\n                Gson().toJson(mockAndroidVersions),\n                200,\n                5000\n            )\n    )"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/RoomAndCoroutinesActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.R\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase8Description\nimport com.demo.code.databinding.ActivityQueryfromroomdatabaseBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass RoomAndCoroutinesActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase8Description\n\n    private val binding by lazy { ActivityQueryfromroomdatabaseBinding.inflate(layoutInflater) }\n\n    private val viewModel: RoomAndCoroutinesViewModel by viewModels {\n        ViewModelFactory(\n            mockApi(),\n            AndroidVersionDatabase.getInstance(applicationContext).androidVersionDao()\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnLoadData.setOnClickListener {\n            viewModel.loadData()\n        }\n        binding.btnClearDatabase.setOnClickListener {\n            viewModel.clearDatabase()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad(uiState)\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad(loadingState: UiState.Loading) = with(binding) {\n        when (loadingState) {\n            UiState.Loading.LoadFromDb -> {\n                progressBarLoadFromDb.setVisible()\n                textViewLoadFromDatabase.setVisible()\n                imageViewDatabaseLoadSuccessOrError.setGone()\n            }\n            UiState.Loading.LoadFromNetwork -> {\n                progressBarLoadFromNetwork.setVisible()\n                textViewLoadFromNetwork.setVisible()\n                imageViewNetworkLoadSuccessOrError.setGone()\n            }\n        }\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        when (uiState.dataSource) {\n            DataSource.NETWORK -> {\n                progressBarLoadFromNetwork.setGone()\n                imageViewNetworkLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_check_green_24dp))\n                imageViewNetworkLoadSuccessOrError.setVisible()\n            }\n            DataSource.DATABASE -> {\n                progressBarLoadFromDb.setGone()\n                imageViewDatabaseLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_check_green_24dp))\n                imageViewDatabaseLoadSuccessOrError.setVisible()\n            }\n        }\n\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions [from ${uiState.dataSource.name}]</b><br>${readableVersions.joinToString(\n                separator = \"<br>\"\n            )}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        when (uiState.dataSource) {\n            DataSource.NETWORK -> {\n                progressBarLoadFromNetwork.setGone()\n                imageViewNetworkLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_clear_red_24dp))\n                imageViewNetworkLoadSuccessOrError.setVisible()\n            }\n            DataSource.DATABASE -> {\n                progressBarLoadFromDb.setGone()\n                imageViewDatabaseLoadSuccessOrError.setImageDrawable(getDrawable(R.drawable.ic_clear_red_24dp))\n                imageViewDatabaseLoadSuccessOrError.setVisible()\n            }\n        }\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/RoomAndCoroutinesViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport kotlinx.coroutines.launch\n\nclass RoomAndCoroutinesViewModel(\n    private val api: MockApi,\n    private val database: AndroidVersionDao\n) : BaseViewModel<UiState>() {\n\n    fun loadData() {\n        uiState.value = UiState.Loading.LoadFromDb\n\n        viewModelScope.launch {\n            val localVersions = database.getAndroidVersions()\n            if (localVersions.isEmpty()) {\n                uiState.value =\n                    UiState.Error(DataSource.DATABASE, \"Database empty!\")\n            } else {\n                uiState.value =\n                    UiState.Success(DataSource.DATABASE, localVersions.mapToUiModelList())\n            }\n\n            uiState.value = UiState.Loading.LoadFromNetwork\n            try {\n                val recentVersions = api.getRecentAndroidVersions()\n                for (version in recentVersions) {\n                    database.insert(version.mapToEntity())\n                }\n                uiState.value = UiState.Success(DataSource.NETWORK, recentVersions)\n            } catch (exception: Exception) {\n                uiState.value = UiState.Error(DataSource.NETWORK, \"Something went wrong!\")\n            }\n        }\n    }\n\n    fun clearDatabase() {\n        viewModelScope.launch {\n            database.clear()\n        }\n    }\n}\n\nenum class DataSource(val dataSourceName: String) {\n    DATABASE(\"Database\"),\n    NETWORK(\"Network\")\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    sealed class Loading : UiState() {\n        object LoadFromDb : Loading()\n        object LoadFromNetwork : Loading()\n    }\n\n    data class Success(val dataSource: DataSource, val recentVersions: List<AndroidVersion>) :\n        UiState()\n\n    data class Error(val dataSource: DataSource, val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase8/ViewModelFactory.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase8\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport com.demo.code.mock.MockApi\n\nclass ViewModelFactory(private val api: MockApi, private val database: AndroidVersionDao) :\n    ViewModelProvider.Factory {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return modelClass.getConstructor(MockApi::class.java, AndroidVersionDao::class.java)\n            .newInstance(api, database)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase9/DebuggingCoroutinesActivity.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase9\n\nimport android.os.Bundle\nimport androidx.activity.viewModels\nimport androidx.lifecycle.Observer\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.base.useCase9Description\nimport com.demo.code.databinding.ActivityDebuggingcoroutinesBinding\nimport com.demo.code.utils.fromHtml\nimport com.demo.code.utils.setGone\nimport com.demo.code.utils.setVisible\nimport com.demo.code.utils.toast\n\nclass DebuggingCoroutinesActivity : BaseActivity() {\n\n    override fun getToolbarTitle() = useCase9Description\n\n    private val binding by lazy { ActivityDebuggingcoroutinesBinding.inflate(layoutInflater) }\n    private val viewModel: DebuggingCoroutinesViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n        viewModel.uiState().observe(this, Observer { uiState ->\n            if (uiState != null) {\n                render(uiState)\n            }\n        })\n        binding.btnPerformSingleNetworkRequest.setOnClickListener {\n            viewModel.performSingleNetworkRequest()\n        }\n    }\n\n    private fun render(uiState: UiState) {\n        when (uiState) {\n            is UiState.Loading -> {\n                onLoad()\n            }\n            is UiState.Success -> {\n                onSuccess(uiState)\n            }\n            is UiState.Error -> {\n                onError(uiState)\n            }\n        }\n    }\n\n    private fun onLoad() = with(binding) {\n        progressBar.setVisible()\n        textViewResult.text = \"\"\n        btnPerformSingleNetworkRequest.isEnabled = false\n    }\n\n    private fun onSuccess(uiState: UiState.Success) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        val readableVersions = uiState.recentVersions.map { \"API ${it.apiLevel}: ${it.name}\" }\n        textViewResult.text = fromHtml(\n            \"<b>Recent Android Versions</b><br>${readableVersions.joinToString(separator = \"<br>\")}\"\n        )\n    }\n\n    private fun onError(uiState: UiState.Error) = with(binding) {\n        progressBar.setGone()\n        btnPerformSingleNetworkRequest.isEnabled = true\n        toast(uiState.message)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase9/DebuggingCoroutinesViewModel.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase9\n\nimport androidx.lifecycle.viewModelScope\nimport com.demo.code.base.BaseViewModel\nimport com.demo.code.mock.MockApi\nimport com.demo.code.utils.addCoroutineDebugInfo\nimport kotlinx.coroutines.*\nimport timber.log.Timber\n\nclass DebuggingCoroutinesViewModel(\n    private val api: MockApi = mockApi()\n) : BaseViewModel<UiState>() {\n\n    fun performSingleNetworkRequest() {\n        uiState.value = UiState.Loading\n\n        // This property needs to be set so that the coroutine name is printed when logging Thread.currentName()\n        // System.setProperty(\"kotlinx.coroutines.debug\", if (BuildConfig.DEBUG) \"on\" else \"off\")\n        // It is set in [CoroutineUsecasesOnAndroidApplication]\n\n        viewModelScope.launch(CoroutineName(\"Initial Coroutine\")) {\n            Timber.d(addCoroutineDebugInfo(\"Initial coroutine launched\"))\n            try {\n                val recentVersions = api.getRecentAndroidVersions()\n                Timber.d(addCoroutineDebugInfo(\"Recent Android Versions returned\"))\n                uiState.value = UiState.Success(recentVersions)\n            } catch (exception: Exception) {\n                Timber.d(addCoroutineDebugInfo(\"Loading recent Android Versions failed\"))\n                uiState.value = UiState.Error(\"Network Request failed\")\n            }\n\n            // Perform two calculations in parallel\n            val calculation1Deferred =\n                async(CoroutineName(\"Calculation1\")) { performCalculation1() }\n            val calculation2Deferred =\n                async(CoroutineName(\"Calculation2\")) { performCalculation2() }\n\n            Timber.d(addCoroutineDebugInfo(\"Result of Calculation1: ${calculation1Deferred.await()}\"))\n            Timber.d(addCoroutineDebugInfo(\"Result of Calculation2: ${calculation2Deferred.await()}\"))\n        }\n    }\n\n    private suspend fun performCalculation1() = withContext(Dispatchers.Default) {\n        Timber.d(addCoroutineDebugInfo(\"Starting Calculation1\"))\n        delay(1000)\n        Timber.d(addCoroutineDebugInfo(\"Calculation1 completed\"))\n        13\n    }\n\n    private suspend fun performCalculation2() = withContext(Dispatchers.Default) {\n        Timber.d(addCoroutineDebugInfo(\"Starting Calculation2\"))\n        delay(2000)\n        Timber.d(addCoroutineDebugInfo(\"Calculation2 completed\"))\n        42\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase9/MockApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase9\n\nimport com.google.gson.Gson\nimport com.demo.code.mock.createMockApi\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MockNetworkInterceptor\n\nfun mockApi() =\n    createMockApi(\n        MockNetworkInterceptor()\n            .mock(\n                \"http://localhost/recent-android-versions\",\n                Gson().toJson(mockAndroidVersions),\n                200,\n                1500\n            )\n    )"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/coroutines/usecase9/UiState.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase9\n\nimport com.demo.code.mock.AndroidVersion\n\nsealed class UiState {\n    object Loading : UiState()\n    data class Success(val recentVersions: List<AndroidVersion>) : UiState()\n    data class Error(val message: String) : UiState()\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/usecases/flow/usecase1/FlowUseCase1Activity.kt",
    "content": "package com.demo.code.usecases.flow.usecase1\n\nimport android.os.Bundle\nimport com.demo.code.base.BaseActivity\nimport com.demo.code.databinding.ActivityFlowUsecase1Binding\n\nclass FlowUseCase1Activity : BaseActivity() {\n\n    private val binding by lazy { ActivityFlowUsecase1Binding.inflate(layoutInflater) }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(binding.root)\n    }\n\n    override fun getToolbarTitle() = \"Flow Use Case 1 Activity\"\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/utils/Extensions.kt",
    "content": "package com.demo.code.utils\n\nimport android.content.Context\nimport android.os.Build\nimport android.text.Html\nimport android.text.Spanned\nimport android.view.View\nimport android.view.inputmethod.InputMethodManager\nimport android.widget.Toast\n\n/**\n * Extension method to show toast for Context.\n */\nfun Context?.toast(text: CharSequence, duration: Int = Toast.LENGTH_LONG) =\n    this?.let { Toast.makeText(it, text, duration).show() }\n\nfun fromHtml(source: String): Spanned {\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n        Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY)\n    } else {\n        @Suppress(\"DEPRECATION\")\n        Html.fromHtml(source)\n    }\n}\n\nfun View.setVisible() {\n    this.visibility = View.VISIBLE\n}\n\nfun View.setInvisible() {\n    this.visibility = View.INVISIBLE\n}\n\nfun View.setGone() {\n    this.visibility = View.GONE\n}\n\nfun logWithThreadAndCoroutineInfo(message: String) =\n    println(\"[${Thread.currentThread().name}] $message\")\n\nfun addCoroutineDebugInfo(message: String) = \"[${Thread.currentThread().name}] $message\"\n\n/**\n * From kotlinextensions.com\n * Try to hide the keyboard and returns whether it worked\n * https://stackoverflow.com/questions/1109022/close-hide-the-android-soft-keyboard\n */\nfun View.hideKeyboard(): Boolean {\n    try {\n        val inputMethodManager =\n            context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager\n        return inputMethodManager.hideSoftInputFromWindow(windowToken, 0)\n    } catch (ignored: RuntimeException) {\n    }\n    return false\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/java/com/demo/code/utils/MockNetworkInterceptor.kt",
    "content": "package com.demo.code.utils\n\nimport com.google.gson.Gson\nimport okhttp3.*\n\nclass MockNetworkInterceptor : Interceptor {\n\n    private val mockResponses = mutableListOf<MockResponse>()\n    private val gson = Gson()\n\n    override fun intercept(chain: Interceptor.Chain): Response {\n        val request = chain.request()\n\n        val mockResponse = findMockResponseInList(request) ?: return chain.proceed(request)\n        removeResponseIfItShouldNotBePersisted(mockResponse)\n        simulateNetworkDelay(mockResponse)\n\n        return if (mockResponse.status < 400) {\n            createSuccessResponse(mockResponse, request)\n        } else {\n            createErrorResponse(request)\n        }\n    }\n\n    private fun findMockResponseInList(request: Request): MockResponse? {\n        return mockResponses.find { mockResponse ->\n            mockResponse.path == request.url().toString()\n        }\n    }\n\n    private fun removeResponseIfItShouldNotBePersisted(mockResponse: MockResponse) {\n        if (!mockResponse.persist) {\n            mockResponses.remove(mockResponse)\n        }\n    }\n\n    private fun simulateNetworkDelay(mockResponse: MockResponse) {\n        Thread.sleep(mockResponse.delayInMs)\n    }\n\n    private fun createErrorResponse(request: Request): Response {\n        return Response.Builder()\n            .code(500)\n            .request(request)\n            .protocol(Protocol.HTTP_1_1)\n            .message(\"Internal Server Error\")\n            .body(\n                ResponseBody.create(\n                    MediaType.get(\"application/json\"),\n                    gson.toJson(mapOf(\"cause\" to \"not sure\"))\n                )\n            )\n            .build()\n    }\n\n    private fun createSuccessResponse(\n        mockResponse: MockResponse,\n        request: Request\n    ): Response {\n        return Response.Builder()\n            .code(mockResponse.status)\n            .request(request)\n            .protocol(Protocol.HTTP_1_1)\n            .message(\"OK\")\n            .body(\n                ResponseBody.create(\n                    MediaType.get(\"application/json\"),\n                    mockResponse.body\n                )\n            )\n            .build()\n    }\n\n    fun mock(\n        path: String,\n        body: String,\n        status: Int,\n        delayInMs: Long = 250,\n        persist: Boolean = true\n    ) = apply {\n        val mockResponse =\n            MockResponse(\n                path,\n                body,\n                status,\n                delayInMs,\n                persist\n            )\n        mockResponses.add(mockResponse)\n    }\n\n    companion object {\n        const val INTERNAL_SERVER_ERROR_HTTP_CODE = 500\n    }\n}\n\ndata class MockResponse(\n    val path: String,\n    val body: String,\n    val status: Int,\n    val delayInMs: Long,\n    val persist: Boolean\n)\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable/ic_arrow_back_white.xml",
    "content": "<vector android:height=\"24dp\"\n    android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\"\n    android:width=\"24dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z\" />\n</vector>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable/ic_check_green_24dp.xml",
    "content": "<vector android:height=\"24dp\"\n    android:tint=\"#47F07E\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\"\n    android:width=\"24dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z\" />\n</vector>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable/ic_clear_red_24dp.xml",
    "content": "<vector android:height=\"24dp\"\n    android:tint=\"#F04248\"\n    android:viewportHeight=\"24.0\"\n    android:viewportWidth=\"24.0\"\n    android:width=\"24dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\" />\n</vector>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path\n        android:fillColor=\"#3DDC84\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeWidth=\"0.8\"\n        android:strokeColor=\"#33FFFFFF\" />\n</vector>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable/recyclerview_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <solid android:color=\"@color/colorPrimary\" />\n    <size android:height=\"0.5dp\" />\n</shape>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"108\"\n    android:viewportHeight=\"108\">\n    <path android:pathData=\"M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"85.84757\"\n                android:endY=\"92.4963\"\n                android:startX=\"42.9492\"\n                android:startY=\"49.59793\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#44000000\"\n                    android:offset=\"0.0\" />\n                <item\n                    android:color=\"#00000000\"\n                    android:offset=\"1.0\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:fillType=\"nonZero\"\n        android:pathData=\"M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z\"\n        android:strokeWidth=\"1\"\n        android:strokeColor=\"#00000000\" />\n</vector>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_calculateonmain.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/factorial_of\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextFactorialOf\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"50000\" />\n\n        </LinearLayout>\n\n        <Button\n            android:id=\"@+id/btnCalculateWithDefaultDispatcher\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"Calculate with Default Dispatcher\" />\n\n        <Button\n            android:id=\"@+id/btnCalculateOnMain\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"Calculate on Main Thread\" />\n\n        <Button\n            android:id=\"@+id/btnCalculateOnMainUsingYield\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"Calculate on Main Thread - Non Blocking\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewCalculationDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_calculationinbackground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/factorial_of\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextFactorialOf\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"50000\" />\n\n        </LinearLayout>\n\n        <Button\n            android:id=\"@+id/btnCalculate\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"@string/calculate\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewCalculationDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/textViewStringConversionDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:maxLength=\"150\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_calculationinmultiplebackgroundthreads.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/factorial_of\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextFactorialOf\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"15000\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/number_of_coroutines\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextNumberOfThreads\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"2\" />\n\n        </LinearLayout>\n\n        <Button\n            android:id=\"@+id/btnCalculate\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/calculate\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/textViewStringConversionDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_channels_usecase1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_cooperativecancellation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/factorial_of\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextFactorialOf\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"50000\" />\n\n        </LinearLayout>\n\n        <Button\n            android:id=\"@+id/btnCalculate\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"@string/calculate\" />\n\n        <Button\n            android:id=\"@+id/btnCancel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\"\n            android:enabled=\"true\"\n            android:text=\"@string/cancel\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewCalculationDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/textViewStringConversionDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:maxLength=\"150\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_debuggingcoroutines.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnPerformSingleNetworkRequest\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_recent_android_versions_and_do_some_calculations\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewResult\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:textColor=\"@color/primary_text\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_exceptionhandling.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnExceptionTryCatch\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"Handle Exception using Try/Catch\" />\n\n        <Button\n            android:id=\"@+id/btnCoroutineExceptionHandler\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"Handle Exception using CoroutineExceptionHandler\" />\n\n        <Button\n            android:id=\"@+id/btnShowResultsEvenIfChildCoroutineFailsTryCatch\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"Show Results even when Child Coroutine Fails (Try/Catch)\" />\n\n        <Button\n            android:id=\"@+id/btnShowResultsEvenIfChildCoroutineFailsRunCatching\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"Show Results even when Child Coroutine Fails (runCatching)\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"gone\" />\n\n        <TextView\n            android:id=\"@+id/textViewDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_flow_usecase1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_jobs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".activities.MainActivity\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:gravity=\"center\"\n        android:layout_margin=\"5dp\">\n\n        <Button\n            android:id=\"@+id/simpleDemoOneId\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"Simple demo one\" />\n\n        <Button\n            android:id=\"@+id/simpleDemoTwoId\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"Simple demo two\" />\n\n        <Button\n            android:id=\"@+id/retryDemoId\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"retry demo\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".activities.MainActivity\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_networkrequestwithtimeout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginRight=\"16dp\"\n                android:text=\"@string/timeout\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextTimeOut\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"1500\" />\n\n        </LinearLayout>\n\n        <Button\n            android:id=\"@+id/btnPerformSingleNetworkRequest\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/perform_single_network_request_on_background_thread\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewResult\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:textColor=\"@color/primary_text\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_observable_types.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n\n    <androidx.appcompat.widget.LinearLayoutCompat\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/outputTextId\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:textSize=\"@dimen/output_text_size\"\n            android:padding=\"@dimen/btn_margin_top_bottom\"\n            android:text=\"@string/initial_value\"/>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"@dimen/btn_margin_top_bottom\">\n\n            <Button\n                android:id=\"@+id/liveDataId\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/btn_margin_top_bottom\"\n                android:layout_marginBottom=\"@dimen/btn_margin_top_bottom\"\n                android:text=\"@string/live_data\" />\n\n            <Button\n                android:id=\"@+id/stateFlowId\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/btn_margin_top_bottom\"\n                android:layout_marginBottom=\"@dimen/btn_margin_top_bottom\"\n                android:text=\"@string/state_flow\" />\n\n            <Button\n                android:id=\"@+id/flowId\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/btn_margin_top_bottom\"\n                android:layout_marginBottom=\"@dimen/btn_margin_top_bottom\"\n                android:text=\"@string/flow\" />\n\n\n            <Button\n                android:id=\"@+id/sharedFlowId\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"@dimen/btn_margin_top_bottom\"\n                android:layout_marginBottom=\"@dimen/btn_margin_top_bottom\"\n                android:text=\"@string/shared_flow\" />\n\n        </LinearLayout>\n\n\n    </androidx.appcompat.widget.LinearLayoutCompat>\n\n\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_perform2sequentialnetworkrequests.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnRequestsSequentially\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/perform_2_network_requests_sequentially\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"gone\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_performanceanalysis.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/factorial_of\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextFactorialOf\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"15000\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/number_of_coroutines\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <EditText\n                android:id=\"@+id/editTextNumberOfThreads\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"numberDecimal\"\n                android:text=\"2\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/dispatcher\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <Spinner\n                android:id=\"@+id/spinnerDispatcher\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"16dp\"\n                android:text=\"@string/yield_during_calculation\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n            <Switch\n                android:id=\"@+id/switchYield\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:checked=\"true\" />\n\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/textViewNumberOfCores\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"@string/device_cores\" />\n\n        <Button\n            android:id=\"@+id/btnCalculate\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/calculate\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerViewResults\"\n            android:backgroundTint=\"@color/secondary_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_performnetworkrequestsconcurrently.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnRequestsSequentially\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_features_of_android_versions_sequentially\" />\n\n        <Button\n            android:id=\"@+id/btnRequestsConcurrently\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_features_of_android_versions_concurrently\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"gone\" />\n\n        <TextView\n            android:id=\"@+id/textViewDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_performsinglenetworkrequest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnPerformSingleNetworkRequest\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/perform_single_network_request_on_background_thread\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewResult\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:textColor=\"@color/primary_text\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_performvariableamountofnetworkrequestsconcurrently.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnRequestsSequentially\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_features_of_android_versions_sequentially\" />\n\n        <Button\n            android:id=\"@+id/btnRequestsConcurrently\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_features_of_android_versions_concurrently\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"gone\" />\n\n        <TextView\n            android:id=\"@+id/textViewDuration\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\" />\n\n\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\"\n                android:textSize=\"16sp\" />\n\n        </ScrollView>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_queryfromroomdatabase.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnLoadData\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/load_android_versions\" />\n\n        <Button\n            android:id=\"@+id/btnClearDatabase\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/clear_database\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"8dp\">\n\n            <ProgressBar\n                android:id=\"@+id/progressBarLoadFromDb\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\" />\n\n            <ImageView\n                android:id=\"@+id/imageViewDatabaseLoadSuccessOrError\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:visibility=\"gone\" />\n\n            <TextView\n                android:id=\"@+id/textViewLoadFromDatabase\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/loading_data_from_database\"\n                android:visibility=\"gone\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"8dp\">\n\n            <ProgressBar\n                android:id=\"@+id/progressBarLoadFromNetwork\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\" />\n\n            <ImageView\n                android:id=\"@+id/imageViewNetworkLoadSuccessOrError\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:visibility=\"gone\" />\n\n            <TextView\n                android:id=\"@+id/textViewLoadFromNetwork\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"gone\"\n                android:text=\"@string/loading_data_from_network\" />\n\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/textViewResult\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:padding=\"8dp\"\n            android:textColor=\"@color/primary_text\"\n            android:textSize=\"16sp\"\n            tools:text=\"Results\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_retrynetworkrequest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <Button\n            android:id=\"@+id/btnPerformSingleNetworkRequest\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:text=\"@string/perform_single_network_request_on_background_thread\" />\n\n        <ProgressBar\n            android:id=\"@+id/progressBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"32dp\"\n            android:visibility=\"invisible\" />\n\n        <TextView\n            android:id=\"@+id/textViewResult\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:textColor=\"@color/primary_text\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_selection.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".activities.MainActivity\">\n\n    <include layout=\"@layout/toolbar\" />\n\n   <LinearLayout\n       android:layout_width=\"match_parent\"\n       android:layout_height=\"match_parent\"\n       android:orientation=\"vertical\"\n       android:layout_margin=\"5dp\">\n\n       <Button\n           android:id=\"@+id/btnUseCasesId\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"wrap_content\"\n           android:layout_marginTop=\"16dp\"\n           android:text=\"@string/use_cases\" />\n\n       <Button\n           android:id=\"@+id/jobsId\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"wrap_content\"\n           android:layout_marginTop=\"16dp\"\n           android:text=\"@string/jobs\" />\n\n       <Button\n           android:id=\"@+id/suspendingFunctionsId\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"wrap_content\"\n           android:layout_marginTop=\"16dp\"\n           android:text=\"@string/suspending_functions\" />\n\n       <Button\n           android:id=\"@+id/typesOfObservablesId\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"wrap_content\"\n           android:layout_marginTop=\"16dp\"\n           android:text=\"@string/observable_types\" />\n\n   </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_suspending_func.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".activities.MainActivity\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:layout_margin=\"5dp\">\n\n        <Button\n            android:id=\"@+id/btnLaunchId\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:text=\"Launch\" />\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_usecases.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\".activities.MainActivity\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recyclerView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/activity_workmanger.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include layout=\"@layout/toolbar\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_margin=\"16dp\"\n        android:text=\"@string/workmanager_request\"\n        android:textColor=\"@color/primary_text\"\n        android:textSize=\"16sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/recyclerview_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/textView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:textSize=\"18sp\"\n    android:padding=\"32dp\"\n    android:gravity=\"center\"\n    android:textColor=\"@color/primary_text\"\n    tools:text=\"Offload heavy computation from the Main Thread\" />"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/recyclerview_item_calculation_result.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:card_view=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/linearLayout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:backgroundTint=\"@color/secondary_text\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"16dp\">\n\n    <androidx.cardview.widget.CardView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:elevation=\"4dp\"\n        card_view:cardBackgroundColor=\"@color/primary_light\"\n        card_view:cardCornerRadius=\"4dp\"\n        card_view:cardElevation=\"8dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"8dp\"\n            android:orientation=\"vertical\">\n\n            <TextView\n                android:id=\"@+id/textViewDuration\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primary_text\" />\n\n            <TextView\n                android:id=\"@+id/textViewStringConversionDuration\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"16dp\"\n                android:textColor=\"@color/primary_text\" />\n\n            <TextView\n                android:id=\"@+id/textViewResultFactorialOf\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/textViewResultNumberCoroutines\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/textViewResultDispatcher\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/textViewResultYield\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/textViewResult\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"16dp\" />\n\n        </LinearLayout>\n\n    </androidx.cardview.widget.CardView>\n\n</LinearLayout>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/layout/toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.appcompat.widget.Toolbar xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/toolbar\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"56dp\"\n    android:minHeight=\"56dp\"\n    app:contentInsetRight=\"0dp\"\n    app:contentInsetStart=\"0dp\"\n    app:contentInsetLeft=\"0dp\"\n    app:contentInsetEnd=\"0dp\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@color/colorPrimary\">\n\n        <ImageButton\n            android:id=\"@+id/btnToolbarBack\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:padding=\"16dp\"\n            android:background=\"@color/transparent\"\n            android:src=\"@drawable/ic_arrow_back_white\"\n            android:visibility=\"visible\" />\n\n        <TextView\n            android:id=\"@+id/toolbarTitle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:paddingStart=\"48dp\"\n            android:paddingEnd=\"48dp\"\n            android:layout_centerInParent=\"true\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"18sp\"\n            android:maxLines=\"1\"\n            android:ellipsize=\"end\" />\n\n    </RelativeLayout>\n\n</androidx.appcompat.widget.Toolbar>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\" />\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\" />\n</adaptive-icon>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"primary_light\">#C5CAE9</color>\n    <color name=\"colorAccent\">#FF9800</color>\n    <color name=\"primary_text\">#212121</color>\n    <color name=\"secondary_text\">#757575</color>\n    <color name=\"icons\">#FFFFFF</color>\n    <color name=\"divider\">#BDBDBD</color>\n    <color name=\"white\">#FFFFFF</color>\n    <color name=\"transparent\">#00000000</color>\n</resources>\n\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"output_text_size\">20sp</dimen>\n    <dimen name=\"btn_margin_top_bottom\">16dp</dimen>\n</resources>"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Coroutine Usecases on Android</string>\n    <string name=\"perform_single_network_request_on_background_thread\">Load recent Android Versions</string>\n    <string name=\"perform_2_network_requests_sequentially\">Load Features of most recent Android Version</string>\n    <string name=\"load_features_of_android_versions_sequentially\">Load Features of Android Versions sequentially</string>\n    <string name=\"load_features_of_android_versions_concurrently\">Load Features of Android Versions concurrently</string>\n    <string name=\"duration\">Operation took %d ms</string>\n    <string name=\"duration_calculation\">Calculation took %d ms</string>\n    <string name=\"duration_stringconversion\">Converting BigInteger to String took %d ms</string>\n    <string name=\"timeout\">TimeOut in ms: </string>\n    <string name=\"load_android_versions\">Load Android Versions</string>\n    <string name=\"clear_database\">Clear Database</string>\n    <string name=\"loading_data_from_database\">loading data from database</string>\n    <string name=\"loading_data_from_network\">loading data from network</string>\n    <string name=\"load_recent_android_versions_and_do_some_calculations\">Load Recent Android Versions and do some calculations</string>\n    <string name=\"factorial_of\">Factorial of:</string>\n    <string name=\"calculate\">Calculate</string>\n    <string name=\"number_of_coroutines\">Number of Coroutines:</string>\n    <string name=\"device_cores\">Your device has %d cores</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"workmanager_request\">A work manager worker was requested to send an analytics request.</string>\n    <string name=\"dispatcher\">Coroutine Dispatcher:</string>\n    <string name=\"yield_during_calculation\">yield() during calculation</string>\n    <string name=\"use_cases\">Use Cases</string>\n    <string name=\"jobs\">Jobs</string>\n    <string name=\"suspending_functions\">Suspending Functions</string>\n    <string name=\"observable_types\">Observable Types</string>\n    <string name=\"shared_flow\">Shared Flow</string>\n    <string name=\"flow\">Flow</string>\n    <string name=\"state_flow\">State Flow</string>\n    <string name=\"live_data\">Live Data</string>\n    <string name=\"initial_value\">Initial Value</string>\n\n    <string-array name=\"dispatchers\">\n        <item>Default</item>\n        <item>IO</item>\n        <item>Main</item>\n        <item>Unconfined</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/ExampleUnitTest.kt",
    "content": "package com.demo.code\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}\n"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/playground/testing/1_testing_coroutines.kt",
    "content": "package com.demo.code.playground.testing\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Test\n\n\nclass SystemUnderTest {\n\n    suspend fun functionWithDelay(): Int {\n        delay(1000)\n        return 42\n    }\n}\n\nfun CoroutineScope.functionThatStartsNewCoroutine() {\n    launch {\n        delay(1000)\n        println(\"Coroutine completed!\")\n    }\n}\n\nclass TestClass {\n\n    @Test\n    fun `functionWithDelay should return 42`() = runBlockingTest {\n\n        val realTimeStart = System.currentTimeMillis()\n        val virtualTimeStart = currentTime\n\n        functionThatStartsNewCoroutine()\n        advanceTimeBy(1000)\n\n        val realTimeDuration = System.currentTimeMillis() - realTimeStart\n        val virtualTimeDuration = currentTime - virtualTimeStart\n\n        println(\"Test took $realTimeDuration real ms\")\n        println(\"Test took $virtualTimeDuration virtual ms\")\n    }\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase1/FakeErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeErrorApi() : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        throw HttpException(\n            Response.error<List<AndroidVersion>>(\n                500,\n                ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n            )\n        )\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase1/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\n\nclass FakeSuccessApi() : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase1/PerformSingleNetworkRequestViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase1\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass PerformSingleNetworkRequestViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `should return Success when network request is successful`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeApi = FakeSuccessApi()\n            val viewModel =\n                PerformSingleNetworkRequestViewModel(fakeApi)\n            observeViewModel(viewModel)\n\n            assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performSingleNetworkRequest()\n\n            assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(mockAndroidVersions)\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `should return Error when network request fails`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeApi = FakeErrorApi()\n\n            val viewModel =\n                PerformSingleNetworkRequestViewModel(fakeApi)\n            observeViewModel(viewModel)\n\n            assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performSingleNetworkRequest()\n\n        assertEquals(\n            listOf(\n                UiState.Loading,\n                UiState.Error(\"Network Request failed!\")\n            ),\n            receivedUiStates\n        )\n    }\n\n    private fun observeViewModel(viewModel: PerformSingleNetworkRequestViewModel) {\n        viewModel.uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase10/CalculationInBackgroundViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase10\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\nclass CalculationInBackgroundViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `performCalculation() should perform correct calculations`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val viewModel =\n                CalculationInBackgroundViewModel(mainCoroutineScopeRule.testDispatcher).apply {\n                    observe()\n                }\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performCalculation(1)\n\n            Assert.assertEquals(\n                UiState.Loading,\n                receivedUiStates.first()\n            )\n\n            Assert.assertEquals(\n                \"1\",\n                (receivedUiStates[1] as UiState.Success).result\n            )\n\n            receivedUiStates.clear()\n\n            viewModel.performCalculation(2)\n\n            Assert.assertEquals(\n                UiState.Loading,\n                receivedUiStates.first()\n            )\n\n            Assert.assertEquals(\n                \"2\",\n                (receivedUiStates[1] as UiState.Success).result\n            )\n\n            receivedUiStates.clear()\n\n            viewModel.performCalculation(3)\n\n            Assert.assertEquals(\n                UiState.Loading,\n                receivedUiStates.first()\n            )\n\n            Assert.assertEquals(\n                \"6\",\n                (receivedUiStates[1] as UiState.Success).result\n            )\n\n        }\n\n    private fun CalculationInBackgroundViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase12/FactorialCalculatorTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase12\n\nimport junit.framework.Assert.assertEquals\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.TestCoroutineDispatcher\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Before\nimport org.junit.Test\nimport java.math.BigInteger\n\n@ExperimentalCoroutinesApi\nclass FactorialCalculatorTest {\n\n    lateinit var factorialCalculator: FactorialCalculator\n\n    private val testDispatcher = TestCoroutineDispatcher()\n\n    @Before\n    fun setUp() {\n        factorialCalculator = FactorialCalculator(testDispatcher)\n    }\n\n    @Test\n    fun `createSubRangeList() should create correct range lists`() = runBlockingTest {\n        assertEquals(\n            listOf(\n                SubRange(1, 3),\n                SubRange(4, 6),\n                SubRange(7, 9)\n            ),\n            factorialCalculator.createSubRangeList(9, 3)\n        )\n\n        assertEquals(\n            listOf(\n                SubRange(1, 3),\n                SubRange(4, 6),\n                SubRange(7, 10)\n            ),\n            factorialCalculator.createSubRangeList(10, 3)\n        )\n\n        assertEquals(\n            listOf(\n                SubRange(1, 3),\n                SubRange(4, 6),\n                SubRange(7, 11)\n            ),\n            factorialCalculator.createSubRangeList(11, 3)\n        )\n    }\n\n    @Test\n    fun calculateFactorialOfSubRange() = runBlockingTest {\n        assertEquals(\n            BigInteger.valueOf(6),\n            factorialCalculator.calculateFactorialOfSubRange(SubRange(1, 3))\n        )\n        assertEquals(\n            BigInteger.valueOf(120),\n            factorialCalculator.calculateFactorialOfSubRange(SubRange(4, 6))\n        )\n        assertEquals(\n            BigInteger.valueOf(55440),\n            factorialCalculator.calculateFactorialOfSubRange(SubRange(7, 11))\n        )\n    }\n\n    @Test\n    fun calculateFactorial() = runBlockingTest {\n        assertEquals(\n            BigInteger.valueOf(3628800),\n            factorialCalculator.calculateFactorial(10, 3)\n        )\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase14/AndroidVersionRepositoryTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport junit.framework.Assert.assertEquals\nimport junit.framework.Assert.fail\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.test.TestCoroutineScope\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Rule\nimport org.junit.Test\n\n@ExperimentalCoroutinesApi\nclass AndroidVersionRepositoryTest {\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    @Test\n    fun `getLocalAndroidVersions() should return android versions from database`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeDatabase = FakeDatabase()\n\n            val repository = AndroidVersionRepository(fakeDatabase, mainCoroutineScopeRule)\n            assertEquals(mockAndroidVersions, repository.getLocalAndroidVersions())\n        }\n\n    @Test\n    fun `loadRecentAndroidVersions() should return android versions from network`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeDatabase = FakeDatabase()\n            val fakeApi = FakeApi()\n            val repository = AndroidVersionRepository(\n                fakeDatabase,\n                mainCoroutineScopeRule,\n                api = fakeApi\n            )\n            assertEquals(mockAndroidVersions, repository.loadAndStoreRemoteAndroidVersions())\n        }\n\n    @Test\n    fun `loadRecentAndroidVersions() should continue to load and store android versions when calling scope gets cancelled`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeDatabase = FakeDatabase()\n            val fakeApi = FakeApi()\n            val repository = AndroidVersionRepository(\n                fakeDatabase,\n                mainCoroutineScopeRule,\n                api = fakeApi\n            )\n\n            // this coroutine will be executed immediately (eagerly)\n            // how ever, it will stop its execution at the delay(1) in the fakeApi\n            val viewModelScope = TestCoroutineScope(SupervisorJob())\n            viewModelScope.launch {\n                println(\"running coroutine!\")\n                repository.loadAndStoreRemoteAndroidVersions()\n                fail(\"Scope should be cancelled before versions are loaded!\")\n            }\n\n            viewModelScope.cancel()\n\n            // continue coroutine execution after delay(1) in the fakeApi\n            advanceUntilIdle()\n\n            assertEquals(true, fakeDatabase.insertedIntoDb)\n        }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase14/FakeApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\n\nclass FakeApi : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(1)\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase14/FakeDatabase.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase14\n\nimport com.demo.code.mock.mockAndroidVersions\n\nclass FakeDatabase : AndroidVersionDao {\n\n    var insertedIntoDb = false\n\n    override suspend fun getAndroidVersions(): List<AndroidVersionEntity> {\n        return mockAndroidVersions.mapToEntityList()\n    }\n\n    override suspend fun insert(androidVersionEntity: AndroidVersionEntity) {\n        insertedIntoDb = true\n    }\n\n    override suspend fun clear() {}\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/FakeFeaturesErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport com.demo.code.mock.*\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeFeaturesErrorApi : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> throw HttpException(\n                Response.error<List<AndroidVersion>>(\n                    500,\n                    ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n                )\n            )\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport com.demo.code.mock.*\n\nclass FakeSuccessApi : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/FakeVersionsErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeVersionsErrorApi : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        throw HttpException(\n            Response.error<List<AndroidVersion>>(\n                500,\n                ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n            )\n        )\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/Perform2SequentialNetworkRequestsViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass Perform2SequentialNetworkRequestsViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `should return Success when both network requests are successful`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val fakeApi = FakeSuccessApi()\n            val viewModel =\n                Perform2SequentialNetworkRequestsViewModel(\n                    fakeApi\n                )\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.perform2SequentialNetworkRequest()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(mockVersionFeaturesAndroid10)\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `should return Error when first network requests fails`() =\n        mainCoroutineScopeRule.runBlockingTest {\n\n            val fakeApi = FakeVersionsErrorApi()\n            val viewModel =\n                Perform2SequentialNetworkRequestsViewModel(\n                    fakeApi\n                )\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.perform2SequentialNetworkRequest()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `should return Error when second network requests fails`() =\n        mainCoroutineScopeRule.runBlockingTest {\n\n            val fakeApi = FakeFeaturesErrorApi()\n            val viewModel =\n                Perform2SequentialNetworkRequestsViewModel(\n                    fakeApi\n                )\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.perform2SequentialNetworkRequest()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    private fun Perform2SequentialNetworkRequestsViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/callbacks/FakeFeaturesErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport retrofit2.Call\nimport retrofit2.mock.Calls\nimport java.io.IOException\n\nclass FakeFeaturesErrorApi : CallbackMockApi {\n\n    override fun getRecentAndroidVersions(): Call<List<AndroidVersion>> {\n        return Calls.response(mockAndroidVersions)\n    }\n\n    override fun getAndroidVersionFeatures(apiLevel: Int): Call<VersionFeatures> {\n        return Calls.failure(IOException())\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/callbacks/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.demo.code.mock.*\nimport retrofit2.Call\nimport retrofit2.mock.Calls\n\nclass FakeSuccessApi : CallbackMockApi {\n\n    override fun getRecentAndroidVersions(): Call<List<AndroidVersion>> {\n        return Calls.response(mockAndroidVersions)\n    }\n\n    override fun getAndroidVersionFeatures(apiLevel: Int): Call<VersionFeatures> {\n        val featureMocks = when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n        return Calls.response(featureMocks)\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/callbacks/FakeVersionsErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport retrofit2.Call\nimport retrofit2.mock.Calls\nimport java.io.IOException\n\nclass FakeVersionsErrorApi : CallbackMockApi {\n\n    override fun getRecentAndroidVersions(): Call<List<AndroidVersion>> {\n        return Calls.response(mockAndroidVersions)\n    }\n\n    override fun getAndroidVersionFeatures(apiLevel: Int): Call<VersionFeatures> {\n        return Calls.failure(IOException())\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase2/callbacks/SequentialNetworkRequestsCallbacksViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase2.callbacks\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\nclass SequentialNetworkRequestsCallbacksViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    private val receivedUiStates: MutableList<UiState> =\n        arrayListOf()\n\n    @Test\n    fun `should return Success when both network requests are successful`() {\n        val fakeApi = FakeSuccessApi()\n        val viewModel =\n            SequentialNetworkRequestsCallbacksViewModel(\n                fakeApi\n            )\n\n        viewModel.observe()\n\n        Assert.assertTrue(receivedUiStates.isEmpty())\n\n        viewModel.perform2SequentialNetworkRequest()\n\n        Assert.assertEquals(\n            listOf(\n                UiState.Loading,\n                UiState.Success(mockVersionFeaturesAndroid10)\n            ),\n            receivedUiStates\n        )\n    }\n\n    @Test\n    fun `should return Error when first network request (recent-android-versions) fails`() {\n        val fakeApi = FakeVersionsErrorApi()\n        val viewModel =\n            SequentialNetworkRequestsCallbacksViewModel(\n                fakeApi\n            )\n        viewModel.observe()\n\n        Assert.assertTrue(receivedUiStates.isEmpty())\n\n        viewModel.perform2SequentialNetworkRequest()\n\n        Assert.assertEquals(\n            listOf(\n                UiState.Loading,\n                UiState.Error(\"Network Request failed\")\n            ),\n            receivedUiStates\n        )\n    }\n\n    @Test\n    fun `should return Error when second network requests (android-version-features) fails`() {\n        val fakeApi = FakeFeaturesErrorApi()\n        val viewModel =\n            SequentialNetworkRequestsCallbacksViewModel(\n                fakeApi\n            )\n        viewModel.observe()\n\n        Assert.assertTrue(receivedUiStates.isEmpty())\n\n        viewModel.perform2SequentialNetworkRequest()\n\n        Assert.assertEquals(\n            listOf(\n                UiState.Loading,\n                UiState.Error(\"Network Request failed\")\n            ),\n            receivedUiStates\n        )\n    }\n\n    private fun SequentialNetworkRequestsCallbacksViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase3/FakeErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport com.demo.code.mock.*\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeErrorApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        throw EndpointShouldNotBeCalledException()\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> throw HttpException(\n                Response.error<List<AndroidVersion>>(\n                    500,\n                    ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n                )\n            )\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase3/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport com.demo.code.mock.*\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\n\nclass FakeSuccessApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        throw EndpointShouldNotBeCalledException()\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase3/PerformNetworkRequestsConcurrentlyViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase3\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass PerformNetworkRequestsConcurrentlyViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `performNetworkRequestsSequentially should return data after 3 times the response delay`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = PerformNetworkRequestsConcurrentlyViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            val forwardedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(\n                        listOf(\n                            mockVersionFeaturesOreo,\n                            mockVersionFeaturesPie,\n                            mockVersionFeaturesAndroid10\n                        )\n                    )\n                ),\n                receivedUiStates\n            )\n\n            // Verify that requests actually got executed sequentially and it took\n            // 3000ms to receive all data\n            Assert.assertEquals(\n                3000,\n                forwardedTime\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsConcurrently should return data after the response delay`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = PerformNetworkRequestsConcurrentlyViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsConcurrently()\n\n            val forwardedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(\n                        listOf(\n                            mockVersionFeaturesOreo,\n                            mockVersionFeaturesPie,\n                            mockVersionFeaturesAndroid10\n                        )\n                    )\n                ),\n                receivedUiStates\n            )\n\n            // Verify that requests actually got executed concurrently within 1000ms\n            Assert.assertEquals(\n                1000,\n                forwardedTime\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsConcurrently should return Error when network request fails`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeErrorApi(responseDelay)\n            val viewModel = PerformNetworkRequestsConcurrentlyViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsConcurrently()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    private fun PerformNetworkRequestsConcurrentlyViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase4/FakeFeaturesErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport com.demo.code.mock.*\nimport kotlinx.coroutines.delay\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeFeaturesErrorApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(responseDelay)\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> throw HttpException(\n                Response.error<List<AndroidVersion>>(\n                    500,\n                    ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n                )\n            )\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase4/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport com.demo.code.mock.*\nimport kotlinx.coroutines.delay\n\nclass FakeSuccessApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(1000)\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase4/FakeVersionsErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeVersionsErrorApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(responseDelay)\n        throw throw HttpException(\n            Response.error<List<AndroidVersion>>(\n                500,\n                ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n            )\n        )\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase4/VariableAmountOfNetworkRequestsViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase4\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockVersionFeaturesAndroid10\nimport com.demo.code.mock.mockVersionFeaturesOreo\nimport com.demo.code.mock.mockVersionFeaturesPie\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass VariableAmountOfNetworkRequestsViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `performNetworkRequestsSequentially() should return Success UiState on successful network requests after 4000ms`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            val forwardedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(\n                        listOf(\n                            mockVersionFeaturesOreo,\n                            mockVersionFeaturesPie,\n                            mockVersionFeaturesAndroid10\n                        )\n                    )\n                ),\n                receivedUiStates\n            )\n\n            Assert.assertEquals(\n                4000,\n                forwardedTime\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsSequentially() should return Error UiState on unsuccessful recent-android-versions network request`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeVersionsErrorApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsSequentially() should return Error UiState on unsuccessful android-version-features network request`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeFeaturesErrorApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsConcurrently() should return Error UiState on successful network requests after 2000ms`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsConcurrently()\n\n            val forwardedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(\n                        listOf(\n                            mockVersionFeaturesOreo,\n                            mockVersionFeaturesPie,\n                            mockVersionFeaturesAndroid10\n                        )\n                    )\n                ),\n                receivedUiStates\n            )\n\n            Assert.assertEquals(\n                2000,\n                forwardedTime\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsConcurrently() should return Error UiState on unsuccessful recent-android-versions network request`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeVersionsErrorApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performNetworkRequestsConcurrently() should return Error UiState on unsuccessful android-version-features network request`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeFeaturesErrorApi(responseDelay)\n            val viewModel = VariableAmountOfNetworkRequestsViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequestsSequentially()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    private fun VariableAmountOfNetworkRequestsViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase5/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport com.demo.code.mock.*\nimport kotlinx.coroutines.delay\n\nclass FakeSuccessApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(1000)\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase5/FakeVersionsErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeVersionsErrorApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(responseDelay)\n        throw throw HttpException(\n            Response.error<List<AndroidVersion>>(\n                500,\n                ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n            )\n        )\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase5/NetworkRequestWithTimeoutViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase5\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass NetworkRequestWithTimeoutViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `performNetworkRequest() should return Success UiState on successful network request within timeout`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val timeout = 1001L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = NetworkRequestWithTimeoutViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest(timeout)\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(mockAndroidVersions)\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performNetworkRequest() should return Error UiState with timeout error message if timeout gets exceeded`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val timeout = 999L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = NetworkRequestWithTimeoutViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest(timeout)\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request timed out!\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performNetworkRequest() should return Error UiState on unsuccessful network response`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val timeout = 1001L\n            val fakeApi = FakeVersionsErrorApi(responseDelay)\n            val viewModel = NetworkRequestWithTimeoutViewModel(fakeApi)\n            viewModel.observe()\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest(timeout)\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed!\")\n                ),\n                receivedUiStates\n            )\n        }\n\n    private fun NetworkRequestWithTimeoutViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase6/FakeSuccessApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport com.demo.code.mock.*\nimport kotlinx.coroutines.delay\n\nclass FakeSuccessApi(private val responseDelay: Long) : MockApi {\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        delay(1000)\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        delay(responseDelay)\n        return when (apiLevel) {\n            27 -> mockVersionFeaturesOreo\n            28 -> mockVersionFeaturesPie\n            29 -> mockVersionFeaturesAndroid10\n            else -> throw IllegalArgumentException(\"apiLevel not found\")\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase6/FakeSuccessOnThirdAttemptApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\nimport java.io.IOException\n\nclass FakeSuccessOnThirdAttemptApi(private val responseDelay: Long) : MockApi {\n\n    var requestCount = 0\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        requestCount++\n        delay(responseDelay)\n        if (requestCount < 3) {\n            throw IOException()\n        }\n        return mockAndroidVersions\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase6/FakeVersionsErrorApi.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport com.demo.code.mock.AndroidVersion\nimport com.demo.code.mock.MockApi\nimport com.demo.code.mock.VersionFeatures\nimport com.demo.code.utils.EndpointShouldNotBeCalledException\nimport kotlinx.coroutines.delay\nimport okhttp3.MediaType\nimport okhttp3.ResponseBody\nimport retrofit2.HttpException\nimport retrofit2.Response\n\nclass FakeVersionsErrorApi(private val responseDelay: Long) : MockApi {\n\n    var requestCount = 0\n\n    override suspend fun getRecentAndroidVersions(): List<AndroidVersion> {\n        requestCount++\n        delay(responseDelay)\n        throw throw HttpException(\n            Response.error<List<AndroidVersion>>(\n                500,\n                ResponseBody.create(MediaType.parse(\"application/json\"), \"\")\n            )\n        )\n    }\n\n    override suspend fun getAndroidVersionFeatures(apiLevel: Int): VersionFeatures {\n        throw EndpointShouldNotBeCalledException()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/usecases/coroutines/usecase6/RetryNetworkRequestViewModelTest.kt",
    "content": "package com.demo.code.usecases.coroutines.usecase6\n\nimport androidx.arch.core.executor.testing.InstantTaskExecutorRule\nimport com.demo.code.mock.mockAndroidVersions\nimport com.demo.code.utils.MainCoroutineScopeRule\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runBlockingTest\nimport org.junit.Assert\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.rules.TestRule\n\n@ExperimentalCoroutinesApi\nclass RetryNetworkRequestViewModelTest {\n\n    @get:Rule\n    val testInstantTaskExecutorRule: TestRule = InstantTaskExecutorRule()\n\n    @get: Rule\n    val mainCoroutineScopeRule: MainCoroutineScopeRule = MainCoroutineScopeRule()\n\n    private val receivedUiStates = mutableListOf<UiState>()\n\n    @Test\n    fun `performSingleNetworkRequest() should return Success UiState on successful network response`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessApi(responseDelay)\n            val viewModel = RetryNetworkRequestViewModel(fakeApi).apply {\n                observe()\n            }\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest()\n\n            advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(mockAndroidVersions)\n                ),\n                receivedUiStates\n            )\n        }\n\n    @Test\n    fun `performSingleNetworkRequest() should retry network request two times`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeSuccessOnThirdAttemptApi(responseDelay)\n            val viewModel = RetryNetworkRequestViewModel(fakeApi).apply {\n                observe()\n            }\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest()\n\n            val elapsedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Success(mockAndroidVersions)\n                ),\n                receivedUiStates\n            )\n\n            Assert.assertEquals(\n                3,\n                fakeApi.requestCount\n            )\n\n            // 3*1000 (Request delays) + 100 (initial delay) + 200 (second delay)\n            Assert.assertEquals(\n                3300,\n                elapsedTime\n            )\n        }\n\n    @Test\n    fun `performSingleNetworkRequest() should return Error UiState on 3 unsuccessful network responses`() =\n        mainCoroutineScopeRule.runBlockingTest {\n            val responseDelay = 1000L\n            val fakeApi = FakeVersionsErrorApi(responseDelay)\n            val viewModel = RetryNetworkRequestViewModel(fakeApi).apply {\n                observe()\n            }\n\n            Assert.assertTrue(receivedUiStates.isEmpty())\n\n            viewModel.performNetworkRequest()\n\n            val elapsedTime = advanceUntilIdle()\n\n            Assert.assertEquals(\n                listOf(\n                    UiState.Loading,\n                    UiState.Error(\"Network Request failed\")\n                ),\n                receivedUiStates\n            )\n\n            Assert.assertEquals(\n                3,\n                fakeApi.requestCount\n            )\n\n            // 3*1000 response delays + 100 (initial delay) + 200 (second delay)\n            Assert.assertEquals(\n                3300,\n                elapsedTime\n            )\n        }\n\n    private fun RetryNetworkRequestViewModel.observe() {\n        uiState().observeForever { uiState ->\n            if (uiState != null) {\n                receivedUiStates.add(uiState)\n            }\n        }\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/utils/EndpointShouldNotBeCalledException.kt",
    "content": "package com.demo.code.utils\n\nclass EndpointShouldNotBeCalledException : Throwable()"
  },
  {
    "path": "application/Sample-Coroutines/app/src/test/java/com/demo/code/utils/MainCoroutineScopeRule.kt",
    "content": "package com.demo.code.utils\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.TestCoroutineDispatcher\nimport kotlinx.coroutines.test.TestCoroutineScope\nimport kotlinx.coroutines.test.resetMain\nimport kotlinx.coroutines.test.setMain\nimport org.junit.rules.TestWatcher\nimport org.junit.runner.Description\n\n// https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/\n\n// see: https://github.com/googlecodelabs/kotlin-coroutines/blob/master/coroutines-codelab/finished_code/src/test/java/com/example/android/kotlincoroutines/main/utils/MainCoroutineScopeRule.kt\n\n@ExperimentalCoroutinesApi\nclass MainCoroutineScopeRule(\n    val testDispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()\n) : TestWatcher(),\n    TestCoroutineScope by TestCoroutineScope(testDispatcher) {\n\n    override fun starting(description: Description?) {\n        super.starting(description)\n        Dispatchers.setMain(testDispatcher)\n    }\n\n    override fun finished(description: Description?) {\n        super.finished(description)\n        cleanupTestCoroutines()\n        Dispatchers.resetMain()\n    }\n}"
  },
  {
    "path": "application/Sample-Coroutines/build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle:${Versions.gradle}\")\n        classpath(\"org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}\")\n        classpath(\"com.google.dagger:hilt-android-gradle-plugin:${Versions.version_dagger}\")\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        google()\n        jcenter()\n    }\n}\n\ntasks.register(\"clean\", Delete::class) {\n    delete(rootProject.buildDir)\n}"
  },
  {
    "path": "application/Sample-Coroutines/buildSrc/build.gradle.kts",
    "content": "import org.gradle.kotlin.dsl.`kotlin-dsl`\n\nplugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    jcenter()\n}"
  },
  {
    "path": "application/Sample-Coroutines/buildSrc/src/main/java/AppConfig.kt",
    "content": "object AppConfig {\n\n    const val compileSdk = 31\n    const val minSdk = 21\n    const val targetSdk = 30\n    const val versionCode = 1\n    const val versionName = \"1.0.0\"\n    const val buildToolsVersion = \"29.0.3\"\n\n    const val androidTestInstrumentation = \"androidx.test.runner.AndroidJUnitRunner\"\n    const val proguardConsumerRules =  \"consumer-rules.pro\"\n    const val dimension = \"environment\"\n\n\n}"
  },
  {
    "path": "application/Sample-Coroutines/buildSrc/src/main/java/AppDependencies.kt",
    "content": "import org.gradle.api.artifacts.dsl.DependencyHandler\n\nobject AppDependencies {\n    //test libs\n    private const val junit = \"junit:junit:${Versions.junit}\"\n    private const val coreTesting = \"androidx.arch.core:core-testing:${Versions.version_core_testing}\"\n    private const val coroutinesTest = \"org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.version_coroutines}\"\n    private const val retrofitMock = \"com.squareup.retrofit2:retrofit-mock:${Versions.version_retrofit_mock}\"\n\n    private const val extJUnit = \"androidx.test.ext:junit:${Versions.extJunit}\"\n    private const val espressoCore = \"androidx.test.espresso:espresso-core:${Versions.espresso}\"\n\n    private const val kotlinStdLib = \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}\"\n    private const val coroutinesCore = \"org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.version_coroutines}\"\n    private const val coroutinesAndroid = \"org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.version_coroutines}\"\n    private const val appcompat = \"androidx.appcompat:appcompat:${Versions.version_appcompat}\"\n    private const val material = \"com.google.android.material:material:${Versions.version_google_material}\"\n    private const val constraintLayout = \"androidx.constraintlayout:constraintlayout:${Versions.version_constraint_layout}\"\n    private const val recyclerView = \"androidx.recyclerview:recyclerview:${Versions.version_recyclerview}\"\n    private const val cardView = \"androidx.cardview:cardview:${Versions.version_card_view}\"\n    private const val commonJava8 = \"androidx.lifecycle:lifecycle-common-java8:${Versions.version_lifecycle}\"\n    private const val retrofit = \"com.squareup.retrofit2:retrofit:${Versions.version_retrofit}\"\n    private const val rxJava2 = \"com.squareup.retrofit2:adapter-rxjava2:${Versions.version_adapter_rxjava2}\"\n    private const val gson = \"com.google.code.gson:gson:${Versions.version_gson}\"\n    private const val converterGson = \"com.squareup.retrofit2:converter-gson:${Versions.version_converter_gson}\"\n    private const val rxAndroid = \"io.reactivex.rxjava2:rxandroid:${Versions.version_rx_android}\"\n    private const val rxJava = \"io.reactivex.rxjava2:rxjava:${Versions.version_rxjava}\"\n    private const val rxKotlin = \"io.reactivex.rxjava2:rxkotlin:${Versions.version_rxkotlin}\"\n    private const val workRuntime = \"androidx.work:work-runtime:${Versions.version_work_manager}\"\n    private const val timber = \"com.jakewharton.timber:timber:${Versions.version_timber}\"\n    private const val roomRuntime = \"androidx.room:room-runtime:${Versions.version_room}\"\n    private const val roomCompiler = \"androidx.room:room-compiler:${Versions.version_room}\"\n    private const val hiltAndroid = \"com.google.dagger:hilt-android:${Versions.version_dagger}\"\n    private const val hiltCompiler = \"com.google.dagger:hilt-compiler:${Versions.version_dagger}\"\n\n\n    private const val coreKtx = \"androidx.core:core-ktx:${Versions.version_ktx_core}\"\n    private const val activityKtx = \"androidx.activity:activity-ktx:${Versions.version_ktx_activity}\"\n    private const val viewModelKtx = \"androidx.lifecycle:lifecycle-viewmodel-ktx${Versions.version_lifecycle}\"\n    private const val liveDataKtx = \"androidx.lifecycle:lifecycle-livedata-ktx:${Versions.version_lifecycle}\"\n\n\n    private const val liveDataCompiler = \"androidx.lifecycle:lifecycle-compiler:${Versions.version_lifecycle}\"\n    private const val workRuntimeKtx = \"androidx.work:work-runtime-ktx:${Versions.version_work_manager}\"\n    private const val roomKtx = \"androidx.room:room-ktx:${Versions.version_room}\"\n\n    val appLibraries = arrayListOf<String>().apply {\n        add(kotlinStdLib)\n        add(coroutinesCore)\n        add(coroutinesAndroid)\n        add(appcompat)\n        add(material)\n        add(constraintLayout)\n        add(recyclerView)\n        add(cardView)\n        add(commonJava8)\n        add(retrofit)\n        add(rxJava2)\n        add(gson)\n        add(converterGson)\n        add(rxAndroid)\n        add(rxJava)\n        add(rxKotlin)\n        add(workRuntime)\n        add(timber)\n        add(roomRuntime)\n        add(hiltAndroid)\n        add(viewModelKtx)\n        add(liveDataKtx)\n        add(coreKtx)\n        add(roomKtx)\n        add(activityKtx)\n        add(workRuntimeKtx)\n    }\n\n    val appLibrariesKtx = arrayListOf<String>().apply {\n        add(liveDataCompiler)\n        add(roomCompiler)\n        add(hiltCompiler)\n    }\n\n    val androidTestLibraries = arrayListOf<String>().apply {\n        add(extJUnit)\n        add(espressoCore)\n    }\n\n    val testLibraries = arrayListOf<String>().apply {\n        add(junit)\n        add(coreTesting)\n        add(coroutinesTest)\n        add(retrofitMock)\n    }\n}\n\n//util functions for adding the different type dependencies from build.gradle file\nfun DependencyHandler.kapt(list: List<String>) {\n    list.forEach { dependency -> add(\"kapt\", dependency) }\n}\n\nfun DependencyHandler.implementation(list: List<String>) {\n    list.forEach { dependency -> add(\"implementation\", dependency) }\n}\n\nfun DependencyHandler.androidTestImplementation(list: List<String>) {\n    list.forEach { dependency -> add(\"androidTestImplementation\", dependency) }\n}\n\nfun DependencyHandler.testImplementation(list: List<String>) {\n    list.forEach { dependency -> add(\"testImplementation\", dependency) }\n}"
  },
  {
    "path": "application/Sample-Coroutines/buildSrc/src/main/java/BuildPlugins.kt",
    "content": "object BuildPlugins {\n    const val androidHilt = \"dagger.hilt.android.plugin\"\n    const val androidLibrary = \"com.android.library\"\n    const val androidApplication = \"com.android.application\"\n    const val kotlinAndroid = \"kotlin-android\"\n    const val kotlinKapt = \"kotlin-kapt\"\n    const val kotlinAndroidExtensions = \"kotlin-android-extensions\"\n}"
  },
  {
    "path": "application/Sample-Coroutines/buildSrc/src/main/java/Versions.kt",
    "content": "object Versions {\n    //app level\n    const val gradle = \"4.0.1\"\n    const val kotlin = \"1.4.0\"\n\n    //test\n    const val junit = \"4.12\"\n    const val extJunit = \"1.1.1\"\n    const val espresso = \"3.2.0\"\n    const val version_coroutines = \"1.5.0\"\n    const val version_appcompat = \"1.3.1\"\n    const val version_google_material = \"1.4.0\"\n    const val version_ktx_core = \"1.7.0\"\n    const val version_ktx_activity = \"1.4.0\"\n    const val version_constraint_layout= \"2.1.1\"\n    const val version_recyclerview = \"1.2.1\"\n    const val version_card_view = \"1.0.0\"\n    const val version_lifecycle = \"2.4.0\"\n    const val version_retrofit = \"2.9.0\"\n    const val version_adapter_rxjava2 = \"2.7.1\"\n    const val version_gson = \"2.4.0\"\n    const val version_converter_gson = \"2.9.0\"\n    const val version_rx_android = \"2.1.1\"\n    const val version_rxjava = \"2.2.19\"\n    const val version_rxkotlin = \"2.4.0\"\n    const val version_work_manager = \"2.7.0\"\n    const val version_timber = \"4.7.1\"\n    const val version_room = \"2.3.0\"\n    const val version_dagger = \"2.38.1\"\n    const val version_core_testing = \"2.1.0\"\n    const val version_retrofit_mock = \"2.7.1\"\n}"
  },
  {
    "path": "application/Sample-Coroutines/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.2-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "application/Sample-Coroutines/gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\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# 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# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official"
  },
  {
    "path": "application/Sample-Coroutines/gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original 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 POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\nAPP_HOME=$( cd \"${APP_HOME:-./}\" && pwd -P ) || exit\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=${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} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\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\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "application/Sample-Coroutines/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 Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\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 execute\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 execute\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:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\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 %*\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": "application/Sample-Coroutines/settings.gradle.kts",
    "content": "//include(\":repository\", \":core\", \":app\")\ninclude(\":app\")\nrootProject.name = \"My Application\""
  }
]