[
  {
    "path": ".github/ISSUE_TEMPLATE/Bug_report.md",
    "content": "---\r\nname: Bug report\r\nabout: Create a report to help us improve\r\n\r\n---\r\n\r\n**Describe the bug**\r\nA clear and concise description of what the bug is.\r\n\r\n**To Reproduce**\r\nSteps to reproduce the behavior\r\n\r\n**Expected behavior**\r\nA clear and concise description of what you expected to happen.\r\n\r\n**Screenshots**\r\nIf applicable, add screenshots to help explain your problem.\r\n\r\n**System and Shadowsocksx-NG version: (please complete the following information):**\r\n - OS Version: [e.g. 10.13.1]\r\n - Version [e.g. 22]\r\n\r\n**Diagnoisis file:**\r\n\r\nPlease first upgrade to the latest version.\r\nThen export the diagnosis file and upload it to here.\r\n\r\n**ss-local.log**\r\n\r\nPlease upload the ss-local.log file here the file is in `~/Library/Logs`\r\n1) Open 'Advanced Settings -> enable Verbose Mode'\r\n2) Continue run `Shadowsocksx-NG` for 5 minutes\r\n3) Upload the `~/Library/Logs/ss-local.log` here (with or without compress)\r\n\r\n**Application log**\r\n\r\nOpen the `Console.app` and search `Shadowsocksx-NG`\r\nCopy paste the log here\r\n\r\n**Crash Log**\r\n\r\nIf the app crashes and pop up a crash log, please copy and paste here\r\n\r\n**Additional context**\r\nAdd any other context about the problem here.\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/Feature_request.md",
    "content": "---\r\nname: Feature request\r\nabout: Suggest an idea for this project\r\n\r\n---\r\n\r\n**Is your feature request related to a problem? Please describe.**\r\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\r\n\r\n**Describe the solution you'd like**\r\nA clear and concise description of what you want to happen.\r\n\r\n**Describe alternatives you've considered**\r\nA clear and concise description of any alternative solutions or features you've considered.\r\n\r\n**Additional context**\r\nAdd any other context or screenshots about the feature request here.\r\n"
  },
  {
    "path": ".github/workflows/feature.yml",
    "content": "name: Feature Building\n\non:\n  push:\n    branches:\n      - '*'\n  pull_request:\n    branches:\n      - '*'\n\njobs:\n  build:\n\n    runs-on: macos-latest\n\n    steps:\n\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          submodules: recursive\n          fetch-depth: 0\n\n      - name: Build\n        run: |\n          brew install automake\n          brew install autoconf\n          brew install libtool\n          make VERSION=\"${GITHUB_SHA::7}\" debug\n          make debug-dmg\n          shasum -a 256 build/Debug/ShadowsocksX-NG.dmg > build/Debug/ShadowsocksX-NG.dmg.checksum\n\n      - name: Upload artifacts\n        uses: actions/upload-artifact@v3\n        with:\n          name: ShadowsocksX-NG\n          path: |\n            build/Debug/ShadowsocksX-NG.dmg\n            build/Debug/ShadowsocksX-NG.dmg.checksum\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release Building\n\non:\n  push:\n    tags:\n      - '*'\n\njobs:\n  build:\n\n    runs-on: macos-latest\n\n    steps:\n\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          submodules: recursive\n          fetch-depth: 0\n\n      - name: Build\n        run: |\n          brew install automake\n          brew install autoconf\n          brew install libtool\n          make VERSION=\"${GITHUB_REF_NAME}\" release\n          make release-dmg \n          shasum -a 256 build/Release/ShadowsocksX-NG.dmg > build/Release/ShadowsocksX-NG.dmg.checksum\n\n      - name: Upload artifacts\n        uses: actions/upload-artifact@v3\n        with:\n          name: ShadowsocksX-NG\n          path: |\n            build/Release/ShadowsocksX-NG.dmg\n            build/Release/ShadowsocksX-NG.dmg.checksum\n\n      - name: Release\n        uses: softprops/action-gh-release@v1\n        with:\n          generate_release_notes: true\n          files: |\n            build/Release/ShadowsocksX-NG.dmg\n            build/Release/ShadowsocksX-NG.dmg.checksum\n"
  },
  {
    "path": ".gitignore",
    "content": "#####\n# OS X temporary files that should never be committed\n.DS_Store\n*.swp\n*.lock\nprofile\n\n####\n# Xcode temporary files that should never be committed\n*~.nib\n\n####\n# Objective-C/Swift specific\n*.hmap\n*.ipa\n\n####\n# Xcode build files\nDerivedData/\nbuild/\nBuilds/\n\n#####\n# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\n####\n# Xcode 4\nxcuserdata\n!xcschemes\n# Xcode 4\n*.moved-aside\n\n####\n# XCode 4 workspaces - more detailed\n!xcshareddata\n!default.xcworkspace\n*.xcworkspacedata\n\n\n####\n# Xcode 5\n*.xccheckout\n*.xcuserstate\n\n####\n# Xcode 7\n*.xcscmblueprint\n\n####\n# AppCode\n.idea/\n\n####\n# Other Xcode files\nprofile\n*.hmap\n*.ipa\n\n####\n# Carthage\nCarthage/Build\n\nIDEWorkspaceChecks.plist\n\n####\n# Dependencies\ndeps/dist\ndeps/pcre*\ndeps/libev*\ndeps/privoxy*\n\nShadowsocksX-NG/kcptun/client\nShadowsocksX-NG/privoxy/privoxy\nShadowsocksX-NG/simple-obfs/obfs-local\nShadowsocksX-NG/ss-local/ss-local\nShadowsocksX-NG/v2ray-plugin/v2ray-plugin\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"shadowsocks-libev\"]\n\tpath = deps/shadowsocks-libev\n\turl = https://github.com/shadowsocks/shadowsocks-libev\n[submodule \"libsodium\"]\n\tpath = deps/libsodium\n\turl = https://github.com/jedisct1/libsodium\n[submodule \"mbedtls\"]\n\tpath = deps/mbedtls\n\turl = https://github.com/Mbed-TLS/mbedtls\n[submodule \"c-ares\"]\n\tpath = deps/c-ares\n\turl = https://github.com/c-ares/c-ares\n[submodule \"deps/shadowsocks-libev\"]\n\tpath = deps/shadowsocks-libev\n\turl = https://github.com/shadowsocks/shadowsocks-libev\n[submodule \"deps/libsodium\"]\n\tpath = deps/libsodium\n\turl = https://github.com/jedisct1/libsodium\n[submodule \"deps/mbedtls\"]\n\tpath = deps/mbedtls\n\turl = https://github.com/Mbed-TLS/mbedtls\n[submodule \"deps/c-ares\"]\n\tpath = deps/c-ares\n\turl = https://github.com/c-ares/c-ares\n[submodule \"deps/v2ray-plugin\"]\n\tpath = deps/v2ray-plugin\n\turl = https://github.com/shadowsocks/v2ray-plugin\n[submodule \"deps/kcptun\"]\n\tpath = deps/kcptun\n\turl = https://github.com/xtaci/kcptun\n[submodule \"deps/simple-obfs\"]\n\tpath = deps/simple-obfs\n\turl = https://github.com/shadowsocks/simple-obfs\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  LaunchHelper\n//\n//  Created by 邱宇舟 on 2017/3/28.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\n@interface AppDelegate : NSObject <NSApplicationDelegate>\n\n\n@end\n\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  LaunchHelper\n//\n//  Created by 邱宇舟 on 2017/3/28.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@property (weak) IBOutlet NSWindow *window;\n@end\n\n@implementation AppDelegate\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {\n    // Insert code here to initialize your application\n    NSLog(@\"ShadowsocksX-NG LaunchHelper\");\n    \n    NSWorkspace* ws = [NSWorkspace sharedWorkspace];\n    BOOL bLaunched = NO;\n    bLaunched = [ws launchApplication: @\"/Applications/ShadowsocksX-NG.app\"];\n    if (!bLaunched) {\n        bLaunched = [ws launchApplication: @\"ShadowsocksX-NG.app\"];\n    }\n    if (!bLaunched) {\n        NSArray *pathComponents = [[[NSBundle mainBundle] bundlePath] pathComponents];\n        pathComponents = [pathComponents subarrayWithRange:NSMakeRange(0, [pathComponents count] - 4)];\n        NSString *path = [NSString pathWithComponents:pathComponents];\n        [[NSWorkspace sharedWorkspace] launchApplication:path];\n    }\n    [NSApp terminate:nil];\n}\n\n\n- (void)applicationWillTerminate:(NSNotification *)aNotification {\n    // Insert code here to tear down your application\n}\n\n\n@end\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "LaunchHelper/LaunchHelper/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"11762\" systemVersion=\"16D32\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11762\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\"/>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n    </objects>\n</document>\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>2</string>\n\t<key>LSBackgroundOnly</key>\n\t<true/>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2017年 qiuyuzhou. All rights reserved.</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper/main.m",
    "content": "//\n//  main.m\n//  LaunchHelper\n//\n//  Created by 邱宇舟 on 2017/3/28.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, const char * argv[]) {\n    return NSApplicationMain(argc, argv);\n}\n"
  },
  {
    "path": "LaunchHelper/LaunchHelper.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t9B9F13921E8A282C00DE4794 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9F13911E8A282C00DE4794 /* AppDelegate.m */; };\n\t\t9B9F13951E8A282C00DE4794 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9F13941E8A282C00DE4794 /* main.m */; };\n\t\t9B9F13971E8A282C00DE4794 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9B9F13961E8A282C00DE4794 /* Assets.xcassets */; };\n\t\t9B9F139A1E8A282C00DE4794 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B9F13981E8A282C00DE4794 /* MainMenu.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t9B9F138D1E8A282C00DE4794 /* LaunchHelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LaunchHelper.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B9F13901E8A282C00DE4794 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t9B9F13911E8A282C00DE4794 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t9B9F13941E8A282C00DE4794 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t9B9F13961E8A282C00DE4794 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t9B9F13991E8A282C00DE4794 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t9B9F139B1E8A282C00DE4794 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t9B9F138A1E8A282C00DE4794 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9B9F13841E8A282C00DE4794 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F138F1E8A282C00DE4794 /* LaunchHelper */,\n\t\t\t\t9B9F138E1E8A282C00DE4794 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B9F138E1E8A282C00DE4794 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F138D1E8A282C00DE4794 /* LaunchHelper.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B9F138F1E8A282C00DE4794 /* LaunchHelper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F13901E8A282C00DE4794 /* AppDelegate.h */,\n\t\t\t\t9B9F13911E8A282C00DE4794 /* AppDelegate.m */,\n\t\t\t\t9B9F13961E8A282C00DE4794 /* Assets.xcassets */,\n\t\t\t\t9B9F13981E8A282C00DE4794 /* MainMenu.xib */,\n\t\t\t\t9B9F139B1E8A282C00DE4794 /* Info.plist */,\n\t\t\t\t9B9F13931E8A282C00DE4794 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = LaunchHelper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B9F13931E8A282C00DE4794 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F13941E8A282C00DE4794 /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t9B9F138C1E8A282C00DE4794 /* LaunchHelper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9B9F139E1E8A282C00DE4794 /* Build configuration list for PBXNativeTarget \"LaunchHelper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9B9F13891E8A282C00DE4794 /* Sources */,\n\t\t\t\t9B9F138A1E8A282C00DE4794 /* Frameworks */,\n\t\t\t\t9B9F138B1E8A282C00DE4794 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = LaunchHelper;\n\t\t\tproductName = LaunchHelper;\n\t\t\tproductReference = 9B9F138D1E8A282C00DE4794 /* LaunchHelper.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t9B9F13851E8A282C00DE4794 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1250;\n\t\t\t\tORGANIZATIONNAME = qiuyuzhou;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t9B9F138C1E8A282C00DE4794 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 9B9F13881E8A282C00DE4794 /* Build configuration list for PBXProject \"LaunchHelper\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 9B9F13841E8A282C00DE4794;\n\t\t\tproductRefGroup = 9B9F138E1E8A282C00DE4794 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t9B9F138C1E8A282C00DE4794 /* LaunchHelper */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t9B9F138B1E8A282C00DE4794 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B9F13971E8A282C00DE4794 /* Assets.xcassets in Resources */,\n\t\t\t\t9B9F139A1E8A282C00DE4794 /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t9B9F13891E8A282C00DE4794 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B9F13951E8A282C00DE4794 /* main.m in Sources */,\n\t\t\t\t9B9F13921E8A282C00DE4794 /* AppDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t9B9F13981E8A282C00DE4794 /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F13991E8A282C00DE4794 /* Base */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t9B9F139C1E8A282C00DE4794 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B9F139D1E8A282C00DE4794 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9B9F139F1E8A282C00DE4794 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = LaunchHelper/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NG.LaunchHelper\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B9F13A01E8A282C00DE4794 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = LaunchHelper/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NG.LaunchHelper\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t9B9F13881E8A282C00DE4794 /* Build configuration list for PBXProject \"LaunchHelper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B9F139C1E8A282C00DE4794 /* Debug */,\n\t\t\t\t9B9F139D1E8A282C00DE4794 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9B9F139E1E8A282C00DE4794 /* Build configuration list for PBXNativeTarget \"LaunchHelper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B9F139F1E8A282C00DE4794 /* Debug */,\n\t\t\t\t9B9F13A01E8A282C00DE4794 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 9B9F13851E8A282C00DE4794 /* Project object */;\n}\n"
  },
  {
    "path": "Makefile",
    "content": "VERSION ?= 0.0.0\n\n.PHONY: all\nall: debug\n\n.PHONY: debug\ndebug: deps/dist set-version\n\txcodebuild -workspace ShadowsocksX-NG.xcworkspace -scheme ShadowsocksX-NG -configuration Debug SYMROOT=$${PWD}/build\n\n.PHONY: release\nrelease: deps/dist set-version\n\txcodebuild -workspace ShadowsocksX-NG.xcworkspace -scheme ShadowsocksX-NG -configuration Release SYMROOT=$${PWD}/build\n\n.PHONY: debug-dmg release-dmg\ndebug-dmg release-dmg: TARGET = $(subst -dmg,,$@)\ndebug-dmg release-dmg:\n\tt=\"$(TARGET)\" && t=\"`tr '[:lower:]' '[:upper:]' <<< $${t:0:1}`$${t:1}\" \\\n\t  && rm -rf build/$${t}/ShadowsocksX-NG/ \\\n\t  && mkdir build/$${t}/ShadowsocksX-NG \\\n\t  && cp -r build/$${t}/ShadowsocksX-NG.app build/$${t}/ShadowsocksX-NG/ \\\n\t  && ln -s /Applications build/$${t}/ShadowsocksX-NG/Applications \\\n\t  && hdiutil create build/$${t}/ShadowsocksX-NG.dmg -ov -volname \"ShadowsocksX-NG\" -fs HFS+ -srcfolder build/$${t}/ShadowsocksX-NG/ \\\n          && rm -rf build/$${t}/ShadowsocksX-NG/\n\n.PHONY: set-version\nset-version:\n\tagvtool new-marketing-version $(VERSION)\n\ndeps/dist:\n\t$(MAKE) -C deps\n\n.PHONY: clean\nclean:\n\t$(MAKE) -C deps clean\n"
  },
  {
    "path": "Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\nplatform :macos, '10.12'\n\ntarget 'ShadowsocksX-NG' do\n  # Comment this line if you're not using Swift and don't want to use dynamic frameworks\n  use_frameworks!\n\n  # Pods for ShadowsocksX-NG\n  pod 'Alamofire', '~> 5.4.3'\n  pod \"GCDWebServer\", \"~> 3.0\"\n  pod 'MASShortcut', '~> 2'\n  \n  # https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md\n  pod 'RxSwift',    '~> 6.2.0'\n  pod 'RxCocoa',    '~> 6.2.0'\n\n  target 'ShadowsocksX-NGTests' do\n    inherit! :search_paths\n    # Pods for testing\n  end\n\nend\n\ntarget 'proxy_conf_helper' do\n  pod 'BRLOptionParser', '~> 0.3.1'\nend\n"
  },
  {
    "path": "Pods/Alamofire/LICENSE",
    "content": "Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/Alamofire/README.md",
    "content": "![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png)\n\n[![Build Status](https://github.com/Alamofire/Alamofire/workflows/Alamofire%20CI/badge.svg?branch=master)](https://github.com/Alamofire/Alamofire/actions)\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire)\n[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](https://twitter.com/AlamofireSF)\n[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n[![Open Source Helpers](https://www.codetriage.com/alamofire/alamofire/badges/users.svg)](https://www.codetriage.com/alamofire/alamofire)\n\nAlamofire is an HTTP networking library written in Swift.\n\n- [Features](#features)\n- [Component Libraries](#component-libraries)\n- [Requirements](#requirements)\n- [Migration Guides](#migration-guides)\n- [Communication](#communication)\n- [Installation](#installation)\n- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#using-alamofire)\n    - [**Introduction -**](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#introduction) [Making Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-requests), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching)\n\t- **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameters and Parameter Encoder](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md##request-parameters-and-parameter-encoders), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication)\n\t- **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server)\n\t- **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output)\n- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md)\n\t- **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#sessiondelegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request)\n\t- **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests-with-requestinterceptor)\n\t- **Model Objects -** [Custom Response Handlers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#customizing-response-handlers)\n\t- **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability)\n- [Open Radars](#open-radars)\n- [FAQ](#faq)\n- [Credits](#credits)\n- [Donations](#donations)\n- [License](#license)\n\n## Features\n\n- [x] Chainable Request / Response Methods\n- [x] Combine Support\n- [x] URL / JSON Parameter Encoding\n- [x] Upload File / Data / Stream / MultipartFormData\n- [x] Download File using Request or Resume Data\n- [x] Authentication with `URLCredential`\n- [x] HTTP Response Validation\n- [x] Upload and Download Progress Closures with Progress\n- [x] cURL Command Output\n- [x] Dynamically Adapt and Retry Requests\n- [x] TLS Certificate and Public Key Pinning\n- [x] Network Reachability\n- [x] Comprehensive Unit and Integration Test Coverage\n- [x] [Complete Documentation](https://alamofire.github.io/Alamofire)\n\n## Component Libraries\n\nIn order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem.\n\n- [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache, and a priority-based image downloading system.\n- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator) - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support `URLSession` instances not managed by Alamofire.\n\n## Requirements\n\n- iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+\n- Xcode 11+\n- Swift 5.1+\n\n## Migration Guides\n\n- [Alamofire 5.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%205.0%20Migration%20Guide.md)\n- [Alamofire 4.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md)\n- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md)\n- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md)\n\n## Communication\n- If you **need help with making network requests** using Alamofire, use [Stack Overflow](https://stackoverflow.com/questions/tagged/alamofire) and tag `alamofire`.\n- If you need to **find or understand an API**, check [our documentation](http://alamofire.github.io/Alamofire/) or [Apple's documentation for `URLSession`](https://developer.apple.com/documentation/foundation/url_loading_system), on top of which Alamofire is built.\n- If you need **help with an Alamofire feature**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire).\n- If you'd like to **discuss Alamofire best practices**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire).\n- If you'd like to **discuss a feature request**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). \n- If you **found a bug**, open an issue here on GitHub and follow the guide. The more detail the better!\n- If you **want to contribute**, submit a pull request!\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods](https://cocoapods.org) is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\npod 'Alamofire', '~> 5.2'\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"Alamofire/Alamofire\" ~> 5.2\n```\n\n### Swift Package Manager\n\nThe [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Alamofire does support its use on supported platforms.\n\nOnce you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/Alamofire/Alamofire.git\", .upToNextMajor(from: \"5.2.0\"))\n]\n```\n\n### Manually\n\nIf you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.\n\n#### Embedded Framework\n\n- Open up Terminal, `cd` into your top-level project directory, and run the following command \"if\" your project is not initialized as a git repository:\n\n  ```bash\n  $ git init\n  ```\n\n- Add Alamofire as a git [submodule](https://git-scm.com/docs/git-submodule) by running the following command:\n\n  ```bash\n  $ git submodule add https://github.com/Alamofire/Alamofire.git\n  ```\n\n- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.\n\n    > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.\n\n- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.\n- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the \"Targets\" heading in the sidebar.\n- In the tab bar at the top of that window, open the \"General\" panel.\n- Click on the `+` button under the \"Embedded Binaries\" section.\n- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.\n\n    > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.\n\n- Select the top `Alamofire.framework` for iOS and the bottom one for macOS.\n\n    > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS`, or `Alamofire watchOS`.\n\n- And that's it!\n\n  > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.\n\n## Open Radars\n\nThe following radars have some effect on the current implementation of Alamofire.\n\n- [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in the test case\n- `rdar://26870455` - Background URL Session Configurations do not work in the simulator\n- `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest`\n- `FB7624529` - `urlSession(_:task:didFinishCollecting:)` never called on watchOS\n\n## Resolved Radars\n\nThe following radars have been resolved over time after being filed against the Alamofire project.\n\n- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage.\n  - (Resolved): 9/1/17 in Xcode 9 beta 6.\n- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+\n  - (Resolved): Just add `CFNetwork` to your linked frameworks.\n\n## Workarounds\n\n- Collection of `URLSessionTaskMetrics` is currently disabled on watchOS due to `FB7624529`.\n\n## FAQ\n\n### What's the origin of the name Alamofire?\n\nAlamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas.\n\n## Credits\n\nAlamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.\n\n### Security Disclosure\n\nIf you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.\n\n## Donations\n\nThe [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization.\nRegistering will allow Foundation members to gain some legal protections and also allow us to put donations to use, tax-free.\nDonating to the ASF will enable us to:\n\n- Pay our yearly legal fees to keep the non-profit in good status\n- Pay for our mail servers to help us stay on top of all questions and security issues\n- Potentially fund test servers to make it easier for us to test the edge cases\n- Potentially fund developers to work on one of our projects full-time\n\nThe community adoption of the ASF libraries has been amazing.\nWe are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward.\nWith your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members.\nIf you use any of our libraries for work, see if your employers would be interested in donating.\nAny amount you can donate today to help us reach our goal would be greatly appreciated.\n\n[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=W34WPEE74APJQ)\n\n## License\n\nAlamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details.\n"
  },
  {
    "path": "Pods/Alamofire/Source/AFError.swift",
    "content": "//\n//  AFError.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// `AFError` is the error type returned by Alamofire. It encompasses a few different types of errors, each with\n/// their own associated reasons.\npublic enum AFError: Error {\n    /// The underlying reason the `.multipartEncodingFailed` error occurred.\n    public enum MultipartEncodingFailureReason {\n        /// The `fileURL` provided for reading an encodable body part isn't a file `URL`.\n        case bodyPartURLInvalid(url: URL)\n        /// The filename of the `fileURL` provided has either an empty `lastPathComponent` or `pathExtension.\n        case bodyPartFilenameInvalid(in: URL)\n        /// The file at the `fileURL` provided was not reachable.\n        case bodyPartFileNotReachable(at: URL)\n        /// Attempting to check the reachability of the `fileURL` provided threw an error.\n        case bodyPartFileNotReachableWithError(atURL: URL, error: Error)\n        /// The file at the `fileURL` provided is actually a directory.\n        case bodyPartFileIsDirectory(at: URL)\n        /// The size of the file at the `fileURL` provided was not returned by the system.\n        case bodyPartFileSizeNotAvailable(at: URL)\n        /// The attempt to find the size of the file at the `fileURL` provided threw an error.\n        case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)\n        /// An `InputStream` could not be created for the provided `fileURL`.\n        case bodyPartInputStreamCreationFailed(for: URL)\n        /// An `OutputStream` could not be created when attempting to write the encoded data to disk.\n        case outputStreamCreationFailed(for: URL)\n        /// The encoded body data could not be written to disk because a file already exists at the provided `fileURL`.\n        case outputStreamFileAlreadyExists(at: URL)\n        /// The `fileURL` provided for writing the encoded body data to disk is not a file `URL`.\n        case outputStreamURLInvalid(url: URL)\n        /// The attempt to write the encoded body data to disk failed with an underlying error.\n        case outputStreamWriteFailed(error: Error)\n        /// The attempt to read an encoded body part `InputStream` failed with underlying system error.\n        case inputStreamReadFailed(error: Error)\n    }\n\n    /// Represents unexpected input stream length that occur when encoding the `MultipartFormData`. Instances will be\n    /// embedded within an `AFError.multipartEncodingFailed` `.inputStreamReadFailed` case.\n    public struct UnexpectedInputStreamLength: Error {\n        /// The expected byte count to read.\n        public var bytesExpected: UInt64\n        /// The actual byte count read.\n        public var bytesRead: UInt64\n    }\n\n    /// The underlying reason the `.parameterEncodingFailed` error occurred.\n    public enum ParameterEncodingFailureReason {\n        /// The `URLRequest` did not have a `URL` to encode.\n        case missingURL\n        /// JSON serialization failed with an underlying system error during the encoding process.\n        case jsonEncodingFailed(error: Error)\n        /// Custom parameter encoding failed due to the associated `Error`.\n        case customEncodingFailed(error: Error)\n    }\n\n    /// The underlying reason the `.parameterEncoderFailed` error occurred.\n    public enum ParameterEncoderFailureReason {\n        /// Possible missing components.\n        public enum RequiredComponent {\n            /// The `URL` was missing or unable to be extracted from the passed `URLRequest` or during encoding.\n            case url\n            /// The `HTTPMethod` could not be extracted from the passed `URLRequest`.\n            case httpMethod(rawValue: String)\n        }\n\n        /// A `RequiredComponent` was missing during encoding.\n        case missingRequiredComponent(RequiredComponent)\n        /// The underlying encoder failed with the associated error.\n        case encoderFailed(error: Error)\n    }\n\n    /// The underlying reason the `.responseValidationFailed` error occurred.\n    public enum ResponseValidationFailureReason {\n        /// The data file containing the server response did not exist.\n        case dataFileNil\n        /// The data file containing the server response at the associated `URL` could not be read.\n        case dataFileReadFailed(at: URL)\n        /// The response did not contain a `Content-Type` and the `acceptableContentTypes` provided did not contain a\n        /// wildcard type.\n        case missingContentType(acceptableContentTypes: [String])\n        /// The response `Content-Type` did not match any type in the provided `acceptableContentTypes`.\n        case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)\n        /// The response status code was not acceptable.\n        case unacceptableStatusCode(code: Int)\n        /// Custom response validation failed due to the associated `Error`.\n        case customValidationFailed(error: Error)\n    }\n\n    /// The underlying reason the response serialization error occurred.\n    public enum ResponseSerializationFailureReason {\n        /// The server response contained no data or the data was zero length.\n        case inputDataNilOrZeroLength\n        /// The file containing the server response did not exist.\n        case inputFileNil\n        /// The file containing the server response could not be read from the associated `URL`.\n        case inputFileReadFailed(at: URL)\n        /// String serialization failed using the provided `String.Encoding`.\n        case stringSerializationFailed(encoding: String.Encoding)\n        /// JSON serialization failed with an underlying system error.\n        case jsonSerializationFailed(error: Error)\n        /// A `DataDecoder` failed to decode the response due to the associated `Error`.\n        case decodingFailed(error: Error)\n        /// A custom response serializer failed due to the associated `Error`.\n        case customSerializationFailed(error: Error)\n        /// Generic serialization failed for an empty response that wasn't type `Empty` but instead the associated type.\n        case invalidEmptyResponse(type: String)\n    }\n\n    /// Underlying reason a server trust evaluation error occurred.\n    public enum ServerTrustFailureReason {\n        /// The output of a server trust evaluation.\n        public struct Output {\n            /// The host for which the evaluation was performed.\n            public let host: String\n            /// The `SecTrust` value which was evaluated.\n            public let trust: SecTrust\n            /// The `OSStatus` of evaluation operation.\n            public let status: OSStatus\n            /// The result of the evaluation operation.\n            public let result: SecTrustResultType\n\n            /// Creates an `Output` value from the provided values.\n            init(_ host: String, _ trust: SecTrust, _ status: OSStatus, _ result: SecTrustResultType) {\n                self.host = host\n                self.trust = trust\n                self.status = status\n                self.result = result\n            }\n        }\n\n        /// No `ServerTrustEvaluator` was found for the associated host.\n        case noRequiredEvaluator(host: String)\n        /// No certificates were found with which to perform the trust evaluation.\n        case noCertificatesFound\n        /// No public keys were found with which to perform the trust evaluation.\n        case noPublicKeysFound\n        /// During evaluation, application of the associated `SecPolicy` failed.\n        case policyApplicationFailed(trust: SecTrust, policy: SecPolicy, status: OSStatus)\n        /// During evaluation, setting the associated anchor certificates failed.\n        case settingAnchorCertificatesFailed(status: OSStatus, certificates: [SecCertificate])\n        /// During evaluation, creation of the revocation policy failed.\n        case revocationPolicyCreationFailed\n        /// `SecTrust` evaluation failed with the associated `Error`, if one was produced.\n        case trustEvaluationFailed(error: Error?)\n        /// Default evaluation failed with the associated `Output`.\n        case defaultEvaluationFailed(output: Output)\n        /// Host validation failed with the associated `Output`.\n        case hostValidationFailed(output: Output)\n        /// Revocation check failed with the associated `Output` and options.\n        case revocationCheckFailed(output: Output, options: RevocationTrustEvaluator.Options)\n        /// Certificate pinning failed.\n        case certificatePinningFailed(host: String, trust: SecTrust, pinnedCertificates: [SecCertificate], serverCertificates: [SecCertificate])\n        /// Public key pinning failed.\n        case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey])\n        /// Custom server trust evaluation failed due to the associated `Error`.\n        case customEvaluationFailed(error: Error)\n    }\n\n    /// The underlying reason the `.urlRequestValidationFailed`\n    public enum URLRequestValidationFailureReason {\n        /// URLRequest with GET method had body data.\n        case bodyDataInGETRequest(Data)\n    }\n\n    ///  `UploadableConvertible` threw an error in `createUploadable()`.\n    case createUploadableFailed(error: Error)\n    ///  `URLRequestConvertible` threw an error in `asURLRequest()`.\n    case createURLRequestFailed(error: Error)\n    /// `SessionDelegate` threw an error while attempting to move downloaded file to destination URL.\n    case downloadedFileMoveFailed(error: Error, source: URL, destination: URL)\n    /// `Request` was explicitly cancelled.\n    case explicitlyCancelled\n    /// `URLConvertible` type failed to create a valid `URL`.\n    case invalidURL(url: URLConvertible)\n    /// Multipart form encoding failed.\n    case multipartEncodingFailed(reason: MultipartEncodingFailureReason)\n    /// `ParameterEncoding` threw an error during the encoding process.\n    case parameterEncodingFailed(reason: ParameterEncodingFailureReason)\n    /// `ParameterEncoder` threw an error while running the encoder.\n    case parameterEncoderFailed(reason: ParameterEncoderFailureReason)\n    /// `RequestAdapter` threw an error during adaptation.\n    case requestAdaptationFailed(error: Error)\n    /// `RequestRetrier` threw an error during the request retry process.\n    case requestRetryFailed(retryError: Error, originalError: Error)\n    /// Response validation failed.\n    case responseValidationFailed(reason: ResponseValidationFailureReason)\n    /// Response serialization failed.\n    case responseSerializationFailed(reason: ResponseSerializationFailureReason)\n    /// `ServerTrustEvaluating` instance threw an error during trust evaluation.\n    case serverTrustEvaluationFailed(reason: ServerTrustFailureReason)\n    /// `Session` which issued the `Request` was deinitialized, most likely because its reference went out of scope.\n    case sessionDeinitialized\n    /// `Session` was explicitly invalidated, possibly with the `Error` produced by the underlying `URLSession`.\n    case sessionInvalidated(error: Error?)\n    /// `URLSessionTask` completed with error.\n    case sessionTaskFailed(error: Error)\n    /// `URLRequest` failed validation.\n    case urlRequestValidationFailed(reason: URLRequestValidationFailureReason)\n}\n\nextension Error {\n    /// Returns the instance cast as an `AFError`.\n    public var asAFError: AFError? {\n        self as? AFError\n    }\n\n    /// Returns the instance cast as an `AFError`. If casting fails, a `fatalError` with the specified `message` is thrown.\n    public func asAFError(orFailWith message: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> AFError {\n        guard let afError = self as? AFError else {\n            fatalError(message(), file: file, line: line)\n        }\n        return afError\n    }\n\n    /// Casts the instance as `AFError` or returns `defaultAFError`\n    func asAFError(or defaultAFError: @autoclosure () -> AFError) -> AFError {\n        self as? AFError ?? defaultAFError()\n    }\n}\n\n// MARK: - Error Booleans\n\nextension AFError {\n    /// Returns whether the instance is `.sessionDeinitialized`.\n    public var isSessionDeinitializedError: Bool {\n        if case .sessionDeinitialized = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.sessionInvalidated`.\n    public var isSessionInvalidatedError: Bool {\n        if case .sessionInvalidated = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.explicitlyCancelled`.\n    public var isExplicitlyCancelledError: Bool {\n        if case .explicitlyCancelled = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.invalidURL`.\n    public var isInvalidURLError: Bool {\n        if case .invalidURL = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.parameterEncodingFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isParameterEncodingError: Bool {\n        if case .parameterEncodingFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.parameterEncoderFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isParameterEncoderError: Bool {\n        if case .parameterEncoderFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.multipartEncodingFailed`. When `true`, the `url` and `underlyingError`\n    /// properties will contain the associated values.\n    public var isMultipartEncodingError: Bool {\n        if case .multipartEncodingFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.requestAdaptationFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isRequestAdaptationError: Bool {\n        if case .requestAdaptationFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.responseValidationFailed`. When `true`, the `acceptableContentTypes`,\n    /// `responseContentType`,  `responseCode`, and `underlyingError` properties will contain the associated values.\n    public var isResponseValidationError: Bool {\n        if case .responseValidationFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.responseSerializationFailed`. When `true`, the `failedStringEncoding` and\n    /// `underlyingError` properties will contain the associated values.\n    public var isResponseSerializationError: Bool {\n        if case .responseSerializationFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `.serverTrustEvaluationFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isServerTrustEvaluationError: Bool {\n        if case .serverTrustEvaluationFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `requestRetryFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isRequestRetryError: Bool {\n        if case .requestRetryFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `createUploadableFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isCreateUploadableError: Bool {\n        if case .createUploadableFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isCreateURLRequestError: Bool {\n        if case .createURLRequestFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `downloadedFileMoveFailed`. When `true`, the `destination` and `underlyingError` properties will\n    /// contain the associated values.\n    public var isDownloadedFileMoveError: Bool {\n        if case .downloadedFileMoveFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isSessionTaskError: Bool {\n        if case .sessionTaskFailed = self { return true }\n        return false\n    }\n}\n\n// MARK: - Convenience Properties\n\nextension AFError {\n    /// The `URLConvertible` associated with the error.\n    public var urlConvertible: URLConvertible? {\n        guard case let .invalidURL(url) = self else { return nil }\n        return url\n    }\n\n    /// The `URL` associated with the error.\n    public var url: URL? {\n        guard case let .multipartEncodingFailed(reason) = self else { return nil }\n        return reason.url\n    }\n\n    /// The underlying `Error` responsible for generating the failure associated with `.sessionInvalidated`,\n    /// `.parameterEncodingFailed`, `.parameterEncoderFailed`, `.multipartEncodingFailed`, `.requestAdaptationFailed`,\n    /// `.responseSerializationFailed`, `.requestRetryFailed` errors.\n    public var underlyingError: Error? {\n        switch self {\n        case let .multipartEncodingFailed(reason):\n            return reason.underlyingError\n        case let .parameterEncodingFailed(reason):\n            return reason.underlyingError\n        case let .parameterEncoderFailed(reason):\n            return reason.underlyingError\n        case let .requestAdaptationFailed(error):\n            return error\n        case let .requestRetryFailed(retryError, _):\n            return retryError\n        case let .responseValidationFailed(reason):\n            return reason.underlyingError\n        case let .responseSerializationFailed(reason):\n            return reason.underlyingError\n        case let .serverTrustEvaluationFailed(reason):\n            return reason.underlyingError\n        case let .sessionInvalidated(error):\n            return error\n        case let .createUploadableFailed(error):\n            return error\n        case let .createURLRequestFailed(error):\n            return error\n        case let .downloadedFileMoveFailed(error, _, _):\n            return error\n        case let .sessionTaskFailed(error):\n            return error\n        case .explicitlyCancelled,\n             .invalidURL,\n             .sessionDeinitialized,\n             .urlRequestValidationFailed:\n            return nil\n        }\n    }\n\n    /// The acceptable `Content-Type`s of a `.responseValidationFailed` error.\n    public var acceptableContentTypes: [String]? {\n        guard case let .responseValidationFailed(reason) = self else { return nil }\n        return reason.acceptableContentTypes\n    }\n\n    /// The response `Content-Type` of a `.responseValidationFailed` error.\n    public var responseContentType: String? {\n        guard case let .responseValidationFailed(reason) = self else { return nil }\n        return reason.responseContentType\n    }\n\n    /// The response code of a `.responseValidationFailed` error.\n    public var responseCode: Int? {\n        guard case let .responseValidationFailed(reason) = self else { return nil }\n        return reason.responseCode\n    }\n\n    /// The `String.Encoding` associated with a failed `.stringResponse()` call.\n    public var failedStringEncoding: String.Encoding? {\n        guard case let .responseSerializationFailed(reason) = self else { return nil }\n        return reason.failedStringEncoding\n    }\n\n    /// The `source` URL of a `.downloadedFileMoveFailed` error.\n    public var sourceURL: URL? {\n        guard case let .downloadedFileMoveFailed(_, source, _) = self else { return nil }\n        return source\n    }\n\n    /// The `destination` URL of a `.downloadedFileMoveFailed` error.\n    public var destinationURL: URL? {\n        guard case let .downloadedFileMoveFailed(_, _, destination) = self else { return nil }\n        return destination\n    }\n\n    /// The download resume data of any underlying network error. Only produced by `DownloadRequest`s.\n    public var downloadResumeData: Data? {\n        (underlyingError as? URLError)?.userInfo[NSURLSessionDownloadTaskResumeData] as? Data\n    }\n}\n\nextension AFError.ParameterEncodingFailureReason {\n    var underlyingError: Error? {\n        switch self {\n        case let .jsonEncodingFailed(error),\n             let .customEncodingFailed(error):\n            return error\n        case .missingURL:\n            return nil\n        }\n    }\n}\n\nextension AFError.ParameterEncoderFailureReason {\n    var underlyingError: Error? {\n        switch self {\n        case let .encoderFailed(error):\n            return error\n        case .missingRequiredComponent:\n            return nil\n        }\n    }\n}\n\nextension AFError.MultipartEncodingFailureReason {\n    var url: URL? {\n        switch self {\n        case let .bodyPartURLInvalid(url),\n             let .bodyPartFilenameInvalid(url),\n             let .bodyPartFileNotReachable(url),\n             let .bodyPartFileIsDirectory(url),\n             let .bodyPartFileSizeNotAvailable(url),\n             let .bodyPartInputStreamCreationFailed(url),\n             let .outputStreamCreationFailed(url),\n             let .outputStreamFileAlreadyExists(url),\n             let .outputStreamURLInvalid(url),\n             let .bodyPartFileNotReachableWithError(url, _),\n             let .bodyPartFileSizeQueryFailedWithError(url, _):\n            return url\n        case .outputStreamWriteFailed,\n             .inputStreamReadFailed:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case let .bodyPartFileNotReachableWithError(_, error),\n             let .bodyPartFileSizeQueryFailedWithError(_, error),\n             let .outputStreamWriteFailed(error),\n             let .inputStreamReadFailed(error):\n            return error\n        case .bodyPartURLInvalid,\n             .bodyPartFilenameInvalid,\n             .bodyPartFileNotReachable,\n             .bodyPartFileIsDirectory,\n             .bodyPartFileSizeNotAvailable,\n             .bodyPartInputStreamCreationFailed,\n             .outputStreamCreationFailed,\n             .outputStreamFileAlreadyExists,\n             .outputStreamURLInvalid:\n            return nil\n        }\n    }\n}\n\nextension AFError.ResponseValidationFailureReason {\n    var acceptableContentTypes: [String]? {\n        switch self {\n        case let .missingContentType(types),\n             let .unacceptableContentType(types, _):\n            return types\n        case .dataFileNil,\n             .dataFileReadFailed,\n             .unacceptableStatusCode,\n             .customValidationFailed:\n            return nil\n        }\n    }\n\n    var responseContentType: String? {\n        switch self {\n        case let .unacceptableContentType(_, responseType):\n            return responseType\n        case .dataFileNil,\n             .dataFileReadFailed,\n             .missingContentType,\n             .unacceptableStatusCode,\n             .customValidationFailed:\n            return nil\n        }\n    }\n\n    var responseCode: Int? {\n        switch self {\n        case let .unacceptableStatusCode(code):\n            return code\n        case .dataFileNil,\n             .dataFileReadFailed,\n             .missingContentType,\n             .unacceptableContentType,\n             .customValidationFailed:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case let .customValidationFailed(error):\n            return error\n        case .dataFileNil,\n             .dataFileReadFailed,\n             .missingContentType,\n             .unacceptableContentType,\n             .unacceptableStatusCode:\n            return nil\n        }\n    }\n}\n\nextension AFError.ResponseSerializationFailureReason {\n    var failedStringEncoding: String.Encoding? {\n        switch self {\n        case let .stringSerializationFailed(encoding):\n            return encoding\n        case .inputDataNilOrZeroLength,\n             .inputFileNil,\n             .inputFileReadFailed(_),\n             .jsonSerializationFailed(_),\n             .decodingFailed(_),\n             .customSerializationFailed(_),\n             .invalidEmptyResponse:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case let .jsonSerializationFailed(error),\n             let .decodingFailed(error),\n             let .customSerializationFailed(error):\n            return error\n        case .inputDataNilOrZeroLength,\n             .inputFileNil,\n             .inputFileReadFailed,\n             .stringSerializationFailed,\n             .invalidEmptyResponse:\n            return nil\n        }\n    }\n}\n\nextension AFError.ServerTrustFailureReason {\n    var output: AFError.ServerTrustFailureReason.Output? {\n        switch self {\n        case let .defaultEvaluationFailed(output),\n             let .hostValidationFailed(output),\n             let .revocationCheckFailed(output, _):\n            return output\n        case .noRequiredEvaluator,\n             .noCertificatesFound,\n             .noPublicKeysFound,\n             .policyApplicationFailed,\n             .settingAnchorCertificatesFailed,\n             .revocationPolicyCreationFailed,\n             .trustEvaluationFailed,\n             .certificatePinningFailed,\n             .publicKeyPinningFailed,\n             .customEvaluationFailed:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case let .customEvaluationFailed(error):\n            return error\n        case let .trustEvaluationFailed(error):\n            return error\n        case .noRequiredEvaluator,\n             .noCertificatesFound,\n             .noPublicKeysFound,\n             .policyApplicationFailed,\n             .settingAnchorCertificatesFailed,\n             .revocationPolicyCreationFailed,\n             .defaultEvaluationFailed,\n             .hostValidationFailed,\n             .revocationCheckFailed,\n             .certificatePinningFailed,\n             .publicKeyPinningFailed:\n            return nil\n        }\n    }\n}\n\n// MARK: - Error Descriptions\n\nextension AFError: LocalizedError {\n    public var errorDescription: String? {\n        switch self {\n        case .explicitlyCancelled:\n            return \"Request explicitly cancelled.\"\n        case let .invalidURL(url):\n            return \"URL is not valid: \\(url)\"\n        case let .parameterEncodingFailed(reason):\n            return reason.localizedDescription\n        case let .parameterEncoderFailed(reason):\n            return reason.localizedDescription\n        case let .multipartEncodingFailed(reason):\n            return reason.localizedDescription\n        case let .requestAdaptationFailed(error):\n            return \"Request adaption failed with error: \\(error.localizedDescription)\"\n        case let .responseValidationFailed(reason):\n            return reason.localizedDescription\n        case let .responseSerializationFailed(reason):\n            return reason.localizedDescription\n        case let .requestRetryFailed(retryError, originalError):\n            return \"\"\"\n            Request retry failed with retry error: \\(retryError.localizedDescription), \\\n            original error: \\(originalError.localizedDescription)\n            \"\"\"\n        case .sessionDeinitialized:\n            return \"\"\"\n            Session was invalidated without error, so it was likely deinitialized unexpectedly. \\\n            Be sure to retain a reference to your Session for the duration of your requests.\n            \"\"\"\n        case let .sessionInvalidated(error):\n            return \"Session was invalidated with error: \\(error?.localizedDescription ?? \"No description.\")\"\n        case let .serverTrustEvaluationFailed(reason):\n            return \"Server trust evaluation failed due to reason: \\(reason.localizedDescription)\"\n        case let .urlRequestValidationFailed(reason):\n            return \"URLRequest validation failed due to reason: \\(reason.localizedDescription)\"\n        case let .createUploadableFailed(error):\n            return \"Uploadable creation failed with error: \\(error.localizedDescription)\"\n        case let .createURLRequestFailed(error):\n            return \"URLRequest creation failed with error: \\(error.localizedDescription)\"\n        case let .downloadedFileMoveFailed(error, source, destination):\n            return \"Moving downloaded file from: \\(source) to: \\(destination) failed with error: \\(error.localizedDescription)\"\n        case let .sessionTaskFailed(error):\n            return \"URLSessionTask failed with error: \\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.ParameterEncodingFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .missingURL:\n            return \"URL request to encode was missing a URL\"\n        case let .jsonEncodingFailed(error):\n            return \"JSON could not be encoded because of error:\\n\\(error.localizedDescription)\"\n        case let .customEncodingFailed(error):\n            return \"Custom parameter encoder failed with error: \\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.ParameterEncoderFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case let .missingRequiredComponent(component):\n            return \"Encoding failed due to a missing request component: \\(component)\"\n        case let .encoderFailed(error):\n            return \"The underlying encoder failed with the error: \\(error)\"\n        }\n    }\n}\n\nextension AFError.MultipartEncodingFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case let .bodyPartURLInvalid(url):\n            return \"The URL provided is not a file URL: \\(url)\"\n        case let .bodyPartFilenameInvalid(url):\n            return \"The URL provided does not have a valid filename: \\(url)\"\n        case let .bodyPartFileNotReachable(url):\n            return \"The URL provided is not reachable: \\(url)\"\n        case let .bodyPartFileNotReachableWithError(url, error):\n            return \"\"\"\n            The system returned an error while checking the provided URL for reachability.\n            URL: \\(url)\n            Error: \\(error)\n            \"\"\"\n        case let .bodyPartFileIsDirectory(url):\n            return \"The URL provided is a directory: \\(url)\"\n        case let .bodyPartFileSizeNotAvailable(url):\n            return \"Could not fetch the file size from the provided URL: \\(url)\"\n        case let .bodyPartFileSizeQueryFailedWithError(url, error):\n            return \"\"\"\n            The system returned an error while attempting to fetch the file size from the provided URL.\n            URL: \\(url)\n            Error: \\(error)\n            \"\"\"\n        case let .bodyPartInputStreamCreationFailed(url):\n            return \"Failed to create an InputStream for the provided URL: \\(url)\"\n        case let .outputStreamCreationFailed(url):\n            return \"Failed to create an OutputStream for URL: \\(url)\"\n        case let .outputStreamFileAlreadyExists(url):\n            return \"A file already exists at the provided URL: \\(url)\"\n        case let .outputStreamURLInvalid(url):\n            return \"The provided OutputStream URL is invalid: \\(url)\"\n        case let .outputStreamWriteFailed(error):\n            return \"OutputStream write failed with error: \\(error)\"\n        case let .inputStreamReadFailed(error):\n            return \"InputStream read failed with error: \\(error)\"\n        }\n    }\n}\n\nextension AFError.ResponseSerializationFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .inputDataNilOrZeroLength:\n            return \"Response could not be serialized, input data was nil or zero length.\"\n        case .inputFileNil:\n            return \"Response could not be serialized, input file was nil.\"\n        case let .inputFileReadFailed(url):\n            return \"Response could not be serialized, input file could not be read: \\(url).\"\n        case let .stringSerializationFailed(encoding):\n            return \"String could not be serialized with encoding: \\(encoding).\"\n        case let .jsonSerializationFailed(error):\n            return \"JSON could not be serialized because of error:\\n\\(error.localizedDescription)\"\n        case let .invalidEmptyResponse(type):\n            return \"\"\"\n            Empty response could not be serialized to type: \\(type). \\\n            Use Empty as the expected type for such responses.\n            \"\"\"\n        case let .decodingFailed(error):\n            return \"Response could not be decoded because of error:\\n\\(error.localizedDescription)\"\n        case let .customSerializationFailed(error):\n            return \"Custom response serializer failed with error:\\n\\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.ResponseValidationFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .dataFileNil:\n            return \"Response could not be validated, data file was nil.\"\n        case let .dataFileReadFailed(url):\n            return \"Response could not be validated, data file could not be read: \\(url).\"\n        case let .missingContentType(types):\n            return \"\"\"\n            Response Content-Type was missing and acceptable content types \\\n            (\\(types.joined(separator: \",\"))) do not match \"*/*\".\n            \"\"\"\n        case let .unacceptableContentType(acceptableTypes, responseType):\n            return \"\"\"\n            Response Content-Type \"\\(responseType)\" does not match any acceptable types: \\\n            \\(acceptableTypes.joined(separator: \",\")).\n            \"\"\"\n        case let .unacceptableStatusCode(code):\n            return \"Response status code was unacceptable: \\(code).\"\n        case let .customValidationFailed(error):\n            return \"Custom response validation failed with error: \\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.ServerTrustFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case let .noRequiredEvaluator(host):\n            return \"A ServerTrustEvaluating value is required for host \\(host) but none was found.\"\n        case .noCertificatesFound:\n            return \"No certificates were found or provided for evaluation.\"\n        case .noPublicKeysFound:\n            return \"No public keys were found or provided for evaluation.\"\n        case .policyApplicationFailed:\n            return \"Attempting to set a SecPolicy failed.\"\n        case .settingAnchorCertificatesFailed:\n            return \"Attempting to set the provided certificates as anchor certificates failed.\"\n        case .revocationPolicyCreationFailed:\n            return \"Attempting to create a revocation policy failed.\"\n        case let .trustEvaluationFailed(error):\n            return \"SecTrust evaluation failed with error: \\(error?.localizedDescription ?? \"None\")\"\n        case let .defaultEvaluationFailed(output):\n            return \"Default evaluation failed for host \\(output.host).\"\n        case let .hostValidationFailed(output):\n            return \"Host validation failed for host \\(output.host).\"\n        case let .revocationCheckFailed(output, _):\n            return \"Revocation check failed for host \\(output.host).\"\n        case let .certificatePinningFailed(host, _, _, _):\n            return \"Certificate pinning failed for host \\(host).\"\n        case let .publicKeyPinningFailed(host, _, _, _):\n            return \"Public key pinning failed for host \\(host).\"\n        case let .customEvaluationFailed(error):\n            return \"Custom trust evaluation failed with error: \\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.URLRequestValidationFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case let .bodyDataInGETRequest(data):\n            return \"\"\"\n            Invalid URLRequest: Requests with GET method cannot have body data:\n            \\(String(decoding: data, as: UTF8.self))\n            \"\"\"\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Alamofire.swift",
    "content": "//\n//  Alamofire.swift\n//\n//  Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n/// Reference to `Session.default` for quick bootstrapping and examples.\npublic let AF = Session.default\n\n/// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate.\nlet version = \"5.4.3\"\n"
  },
  {
    "path": "Pods/Alamofire/Source/AlamofireExtended.swift",
    "content": "//\n//  AlamofireExtended.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n/// Type that acts as a generic extension point for all `AlamofireExtended` types.\npublic struct AlamofireExtension<ExtendedType> {\n    /// Stores the type or meta-type of any extended type.\n    public private(set) var type: ExtendedType\n\n    /// Create an instance from the provided value.\n    ///\n    /// - Parameter type: Instance being extended.\n    public init(_ type: ExtendedType) {\n        self.type = type\n    }\n}\n\n/// Protocol describing the `af` extension points for Alamofire extended types.\npublic protocol AlamofireExtended {\n    /// Type being extended.\n    associatedtype ExtendedType\n\n    /// Static Alamofire extension point.\n    static var af: AlamofireExtension<ExtendedType>.Type { get set }\n    /// Instance Alamofire extension point.\n    var af: AlamofireExtension<ExtendedType> { get set }\n}\n\nextension AlamofireExtended {\n    /// Static Alamofire extension point.\n    public static var af: AlamofireExtension<Self>.Type {\n        get { AlamofireExtension<Self>.self }\n        set {}\n    }\n\n    /// Instance Alamofire extension point.\n    public var af: AlamofireExtension<Self> {\n        get { AlamofireExtension(self) }\n        set {}\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/AuthenticationInterceptor.swift",
    "content": "//\n//  AuthenticationInterceptor.swift\n//\n//  Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Types adopting the `AuthenticationCredential` protocol can be used to authenticate `URLRequest`s.\n///\n/// One common example of an `AuthenticationCredential` is an OAuth2 credential containing an access token used to\n/// authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes\n/// which will then require a refresh of the credential using the refresh token to generate a new access token.\npublic protocol AuthenticationCredential {\n    /// Whether the credential requires a refresh. This property should always return `true` when the credential is\n    /// expired. It is also wise to consider returning `true` when the credential will expire in several seconds or\n    /// minutes depending on the expiration window of the credential.\n    ///\n    /// For example, if the credential is valid for 60 minutes, then it would be wise to return `true` when the\n    /// credential is only valid for 5 minutes or less. That ensures the credential will not expire as it is passed\n    /// around backend services.\n    var requiresRefresh: Bool { get }\n}\n\n// MARK: -\n\n/// Types adopting the `Authenticator` protocol can be used to authenticate `URLRequest`s with an\n/// `AuthenticationCredential` as well as refresh the `AuthenticationCredential` when required.\npublic protocol Authenticator: AnyObject {\n    /// The type of credential associated with the `Authenticator` instance.\n    associatedtype Credential: AuthenticationCredential\n\n    /// Applies the `Credential` to the `URLRequest`.\n    ///\n    /// In the case of OAuth2, the access token of the `Credential` would be added to the `URLRequest` as a Bearer\n    /// token to the `Authorization` header.\n    ///\n    /// - Parameters:\n    ///   - credential: The `Credential`.\n    ///   - urlRequest: The `URLRequest`.\n    func apply(_ credential: Credential, to urlRequest: inout URLRequest)\n\n    /// Refreshes the `Credential` and executes the `completion` closure with the `Result` once complete.\n    ///\n    /// Refresh can be called in one of two ways. It can be called before the `Request` is actually executed due to\n    /// a `requiresRefresh` returning `true` during the adapt portion of the `Request` creation process. It can also\n    /// be triggered by a failed `Request` where the authentication server denied access due to an expired or\n    /// invalidated access token.\n    ///\n    /// In the case of OAuth2, this method would use the refresh token of the `Credential` to generate a new\n    /// `Credential` using the authentication service. Once complete, the `completion` closure should be called with\n    /// the new `Credential`, or the error that occurred.\n    ///\n    /// In general, if the refresh call fails with certain status codes from the authentication server (commonly a 401),\n    /// the refresh token in the `Credential` can no longer be used to generate a valid `Credential`. In these cases,\n    /// you will need to reauthenticate the user with their username / password.\n    ///\n    /// Please note, these are just general examples of common use cases. They are not meant to solve your specific\n    /// authentication server challenges. Please work with your authentication server team to ensure your\n    /// `Authenticator` logic matches their expectations.\n    ///\n    /// - Parameters:\n    ///   - credential: The `Credential` to refresh.\n    ///   - session:    The `Session` requiring the refresh.\n    ///   - completion: The closure to be executed once the refresh is complete.\n    func refresh(_ credential: Credential, for session: Session, completion: @escaping (Result<Credential, Error>) -> Void)\n\n    /// Determines whether the `URLRequest` failed due to an authentication error based on the `HTTPURLResponse`.\n    ///\n    /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `false`\n    /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then you\n    /// will need to work with your authentication server team to understand how to identify when this occurs.\n    ///\n    /// In the case of OAuth2, where an authentication server can invalidate credentials, you will need to inspect the\n    /// `HTTPURLResponse` or possibly the `Error` for when this occurs. This is commonly handled by the authentication\n    /// server returning a 401 status code and some additional header to indicate an OAuth2 failure occurred.\n    ///\n    /// It is very important to understand how your authentication server works to be able to implement this correctly.\n    /// For example, if your authentication server returns a 401 when an OAuth2 error occurs, and your downstream\n    /// service also returns a 401 when you are not authorized to perform that operation, how do you know which layer\n    /// of the backend returned you a 401? You do not want to trigger a refresh unless you know your authentication\n    /// server is actually the layer rejecting the request. Again, work with your authentication server team to understand\n    /// how to identify an OAuth2 401 error vs. a downstream 401 error to avoid endless refresh loops.\n    ///\n    /// - Parameters:\n    ///   - urlRequest: The `URLRequest`.\n    ///   - response:   The `HTTPURLResponse`.\n    ///   - error:      The `Error`.\n    ///\n    /// - Returns: `true` if the `URLRequest` failed due to an authentication error, `false` otherwise.\n    func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool\n\n    /// Determines whether the `URLRequest` is authenticated with the `Credential`.\n    ///\n    /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `true`\n    /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then\n    /// read on.\n    ///\n    /// When an authentication server can invalidate credentials, it means that you may have a non-expired credential\n    /// that appears to be valid, but will be rejected by the authentication server when used. Generally when this\n    /// happens, a number of requests are all sent when the application is foregrounded, and all of them will be\n    /// rejected by the authentication server in the order they are received. The first failed request will trigger a\n    /// refresh internally, which will update the credential, and then retry all the queued requests with the new\n    /// credential. However, it is possible that some of the original requests will not return from the authentication\n    /// server until the refresh has completed. This is where this method comes in.\n    ///\n    /// When the authentication server rejects a credential, we need to check to make sure we haven't refreshed the\n    /// credential while the request was in flight. If it has already refreshed, then we don't need to trigger an\n    /// additional refresh. If it hasn't refreshed, then we need to refresh.\n    ///\n    /// Now that it is understood how the result of this method is used in the refresh lifecyle, let's walk through how\n    /// to implement it. You should return `true` in this method if the `URLRequest` is authenticated in a way that\n    /// matches the values in the `Credential`. In the case of OAuth2, this would mean that the Bearer token in the\n    /// `Authorization` header of the `URLRequest` matches the access token in the `Credential`. If it matches, then we\n    /// know the `Credential` was used to authenticate the `URLRequest` and should return `true`. If the Bearer token\n    /// did not match the access token, then you should return `false`.\n    ///\n    /// - Parameters:\n    ///   - urlRequest: The `URLRequest`.\n    ///   - credential: The `Credential`.\n    ///\n    /// - Returns: `true` if the `URLRequest` is authenticated with the `Credential`, `false` otherwise.\n    func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: Credential) -> Bool\n}\n\n// MARK: -\n\n/// Represents various authentication failures that occur when using the `AuthenticationInterceptor`. All errors are\n/// still vended from Alamofire as `AFError` types. The `AuthenticationError` instances will be embedded within\n/// `AFError` `.requestAdaptationFailed` or `.requestRetryFailed` cases.\npublic enum AuthenticationError: Error {\n    /// The credential was missing so the request could not be authenticated.\n    case missingCredential\n    /// The credential was refreshed too many times within the `RefreshWindow`.\n    case excessiveRefresh\n}\n\n// MARK: -\n\n/// The `AuthenticationInterceptor` class manages the queuing and threading complexity of authenticating requests.\n/// It relies on an `Authenticator` type to handle the actual `URLRequest` authentication and `Credential` refresh.\npublic class AuthenticationInterceptor<AuthenticatorType>: RequestInterceptor where AuthenticatorType: Authenticator {\n    // MARK: Typealiases\n\n    /// Type of credential used to authenticate requests.\n    public typealias Credential = AuthenticatorType.Credential\n\n    // MARK: Helper Types\n\n    /// Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a\n    /// refresh, the `AuthenticationInterceptor` compares the timestamp history of previous refresh calls against the\n    /// `RefreshWindow`. If more refreshes have occurred within the refresh window than allowed, the refresh is\n    /// cancelled and an `AuthorizationError.excessiveRefresh` error is thrown.\n    public struct RefreshWindow {\n        /// `TimeInterval` defining the duration of the time window before the current time in which the number of\n        /// refresh attempts is compared against `maximumAttempts`. For example, if `interval` is 30 seconds, then the\n        /// `RefreshWindow` represents the past 30 seconds. If more attempts occurred in the past 30 seconds than\n        /// `maximumAttempts`, an `.excessiveRefresh` error will be thrown.\n        public let interval: TimeInterval\n\n        /// Total refresh attempts allowed within `interval` before throwing an `.excessiveRefresh` error.\n        public let maximumAttempts: Int\n\n        /// Creates a `RefreshWindow` instance from the specified `interval` and `maximumAttempts`.\n        ///\n        /// - Parameters:\n        ///   - interval:        `TimeInterval` defining the duration of the time window before the current time.\n        ///   - maximumAttempts: The maximum attempts allowed within the `TimeInterval`.\n        public init(interval: TimeInterval = 30.0, maximumAttempts: Int = 5) {\n            self.interval = interval\n            self.maximumAttempts = maximumAttempts\n        }\n    }\n\n    private struct AdaptOperation {\n        let urlRequest: URLRequest\n        let session: Session\n        let completion: (Result<URLRequest, Error>) -> Void\n    }\n\n    private enum AdaptResult {\n        case adapt(Credential)\n        case doNotAdapt(AuthenticationError)\n        case adaptDeferred\n    }\n\n    private struct MutableState {\n        var credential: Credential?\n\n        var isRefreshing = false\n        var refreshTimestamps: [TimeInterval] = []\n        var refreshWindow: RefreshWindow?\n\n        var adaptOperations: [AdaptOperation] = []\n        var requestsToRetry: [(RetryResult) -> Void] = []\n    }\n\n    // MARK: Properties\n\n    /// The `Credential` used to authenticate requests.\n    public var credential: Credential? {\n        get { mutableState.credential }\n        set { mutableState.credential = newValue }\n    }\n\n    let authenticator: AuthenticatorType\n    let queue = DispatchQueue(label: \"org.alamofire.authentication.inspector\")\n\n    @Protected\n    private var mutableState = MutableState()\n\n    // MARK: Initialization\n\n    /// Creates an `AuthenticationInterceptor` instance from the specified parameters.\n    ///\n    /// A `nil` `RefreshWindow` will result in the `AuthenticationInterceptor` not checking for excessive refresh calls.\n    /// It is recommended to always use a `RefreshWindow` to avoid endless refresh cycles.\n    ///\n    /// - Parameters:\n    ///   - authenticator: The `Authenticator` type.\n    ///   - credential:    The `Credential` if it exists. `nil` by default.\n    ///   - refreshWindow: The `RefreshWindow` used to identify excessive refresh calls. `RefreshWindow()` by default.\n    public init(authenticator: AuthenticatorType,\n                credential: Credential? = nil,\n                refreshWindow: RefreshWindow? = RefreshWindow()) {\n        self.authenticator = authenticator\n        mutableState.credential = credential\n        mutableState.refreshWindow = refreshWindow\n    }\n\n    // MARK: Adapt\n\n    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {\n        let adaptResult: AdaptResult = $mutableState.write { mutableState in\n            // Queue the adapt operation if a refresh is already in place.\n            guard !mutableState.isRefreshing else {\n                let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion)\n                mutableState.adaptOperations.append(operation)\n                return .adaptDeferred\n            }\n\n            // Throw missing credential error is the credential is missing.\n            guard let credential = mutableState.credential else {\n                let error = AuthenticationError.missingCredential\n                return .doNotAdapt(error)\n            }\n\n            // Queue the adapt operation and trigger refresh operation if credential requires refresh.\n            guard !credential.requiresRefresh else {\n                let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion)\n                mutableState.adaptOperations.append(operation)\n                refresh(credential, for: session, insideLock: &mutableState)\n                return .adaptDeferred\n            }\n\n            return .adapt(credential)\n        }\n\n        switch adaptResult {\n        case let .adapt(credential):\n            var authenticatedRequest = urlRequest\n            authenticator.apply(credential, to: &authenticatedRequest)\n            completion(.success(authenticatedRequest))\n\n        case let .doNotAdapt(adaptError):\n            completion(.failure(adaptError))\n\n        case .adaptDeferred:\n            // No-op: adapt operation captured during refresh.\n            break\n        }\n    }\n\n    // MARK: Retry\n\n    public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {\n        // Do not attempt retry if there was not an original request and response from the server.\n        guard let urlRequest = request.request, let response = request.response else {\n            completion(.doNotRetry)\n            return\n        }\n\n        // Do not attempt retry unless the `Authenticator` verifies failure was due to authentication error (i.e. 401 status code).\n        guard authenticator.didRequest(urlRequest, with: response, failDueToAuthenticationError: error) else {\n            completion(.doNotRetry)\n            return\n        }\n\n        // Do not attempt retry if there is no credential.\n        guard let credential = credential else {\n            let error = AuthenticationError.missingCredential\n            completion(.doNotRetryWithError(error))\n            return\n        }\n\n        // Retry the request if the `Authenticator` verifies it was authenticated with a previous credential.\n        guard authenticator.isRequest(urlRequest, authenticatedWith: credential) else {\n            completion(.retry)\n            return\n        }\n\n        $mutableState.write { mutableState in\n            mutableState.requestsToRetry.append(completion)\n\n            guard !mutableState.isRefreshing else { return }\n\n            refresh(credential, for: session, insideLock: &mutableState)\n        }\n    }\n\n    // MARK: Refresh\n\n    private func refresh(_ credential: Credential, for session: Session, insideLock mutableState: inout MutableState) {\n        guard !isRefreshExcessive(insideLock: &mutableState) else {\n            let error = AuthenticationError.excessiveRefresh\n            handleRefreshFailure(error, insideLock: &mutableState)\n            return\n        }\n\n        mutableState.refreshTimestamps.append(ProcessInfo.processInfo.systemUptime)\n        mutableState.isRefreshing = true\n\n        // Dispatch to queue to hop out of the lock in case authenticator.refresh is implemented synchronously.\n        queue.async {\n            self.authenticator.refresh(credential, for: session) { result in\n                self.$mutableState.write { mutableState in\n                    switch result {\n                    case let .success(credential):\n                        self.handleRefreshSuccess(credential, insideLock: &mutableState)\n                    case let .failure(error):\n                        self.handleRefreshFailure(error, insideLock: &mutableState)\n                    }\n                }\n            }\n        }\n    }\n\n    private func isRefreshExcessive(insideLock mutableState: inout MutableState) -> Bool {\n        guard let refreshWindow = mutableState.refreshWindow else { return false }\n\n        let refreshWindowMin = ProcessInfo.processInfo.systemUptime - refreshWindow.interval\n\n        let refreshAttemptsWithinWindow = mutableState.refreshTimestamps.reduce(into: 0) { attempts, refreshTimestamp in\n            guard refreshWindowMin <= refreshTimestamp else { return }\n            attempts += 1\n        }\n\n        let isRefreshExcessive = refreshAttemptsWithinWindow >= refreshWindow.maximumAttempts\n\n        return isRefreshExcessive\n    }\n\n    private func handleRefreshSuccess(_ credential: Credential, insideLock mutableState: inout MutableState) {\n        mutableState.credential = credential\n\n        let adaptOperations = mutableState.adaptOperations\n        let requestsToRetry = mutableState.requestsToRetry\n\n        mutableState.adaptOperations.removeAll()\n        mutableState.requestsToRetry.removeAll()\n\n        mutableState.isRefreshing = false\n\n        // Dispatch to queue to hop out of the mutable state lock\n        queue.async {\n            adaptOperations.forEach { self.adapt($0.urlRequest, for: $0.session, completion: $0.completion) }\n            requestsToRetry.forEach { $0(.retry) }\n        }\n    }\n\n    private func handleRefreshFailure(_ error: Error, insideLock mutableState: inout MutableState) {\n        let adaptOperations = mutableState.adaptOperations\n        let requestsToRetry = mutableState.requestsToRetry\n\n        mutableState.adaptOperations.removeAll()\n        mutableState.requestsToRetry.removeAll()\n\n        mutableState.isRefreshing = false\n\n        // Dispatch to queue to hop out of the mutable state lock\n        queue.async {\n            adaptOperations.forEach { $0.completion(.failure(error)) }\n            requestsToRetry.forEach { $0(.doNotRetryWithError(error)) }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/CachedResponseHandler.swift",
    "content": "//\n//  CachedResponseHandler.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that handles whether the data task should store the HTTP response in the cache.\npublic protocol CachedResponseHandler {\n    /// Determines whether the HTTP response should be stored in the cache.\n    ///\n    /// The `completion` closure should be passed one of three possible options:\n    ///\n    ///   1. The cached response provided by the server (this is the most common use case).\n    ///   2. A modified version of the cached response (you may want to modify it in some way before caching).\n    ///   3. A `nil` value to prevent the cached response from being stored in the cache.\n    ///\n    /// - Parameters:\n    ///   - task:       The data task whose request resulted in the cached response.\n    ///   - response:   The cached response to potentially store in the cache.\n    ///   - completion: The closure to execute containing cached response, a modified response, or `nil`.\n    func dataTask(_ task: URLSessionDataTask,\n                  willCacheResponse response: CachedURLResponse,\n                  completion: @escaping (CachedURLResponse?) -> Void)\n}\n\n// MARK: -\n\n/// `ResponseCacher` is a convenience `CachedResponseHandler` making it easy to cache, not cache, or modify a cached\n/// response.\npublic struct ResponseCacher {\n    /// Defines the behavior of the `ResponseCacher` type.\n    public enum Behavior {\n        /// Stores the cached response in the cache.\n        case cache\n        /// Prevents the cached response from being stored in the cache.\n        case doNotCache\n        /// Modifies the cached response before storing it in the cache.\n        case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)\n    }\n\n    /// Returns a `ResponseCacher` with a follow `Behavior`.\n    public static let cache = ResponseCacher(behavior: .cache)\n    /// Returns a `ResponseCacher` with a do not follow `Behavior`.\n    public static let doNotCache = ResponseCacher(behavior: .doNotCache)\n\n    /// The `Behavior` of the `ResponseCacher`.\n    public let behavior: Behavior\n\n    /// Creates a `ResponseCacher` instance from the `Behavior`.\n    ///\n    /// - Parameter behavior: The `Behavior`.\n    public init(behavior: Behavior) {\n        self.behavior = behavior\n    }\n}\n\nextension ResponseCacher: CachedResponseHandler {\n    public func dataTask(_ task: URLSessionDataTask,\n                         willCacheResponse response: CachedURLResponse,\n                         completion: @escaping (CachedURLResponse?) -> Void) {\n        switch behavior {\n        case .cache:\n            completion(response)\n        case .doNotCache:\n            completion(nil)\n        case let .modify(closure):\n            let response = closure(task, response)\n            completion(response)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Combine.swift",
    "content": "//\n//  Combine.swift\n//\n//  Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n#if canImport(Combine)\n\nimport Combine\nimport Dispatch\nimport Foundation\n\n// MARK: - DataRequest / UploadRequest\n\n/// A Combine `Publisher` that publishes the `DataResponse<Value, AFError>` of the provided `DataRequest`.\n@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\npublic struct DataResponsePublisher<Value>: Publisher {\n    public typealias Output = DataResponse<Value, AFError>\n    public typealias Failure = Never\n\n    private typealias Handler = (@escaping (_ response: DataResponse<Value, AFError>) -> Void) -> DataRequest\n\n    private let request: DataRequest\n    private let responseHandler: Handler\n\n    /// Creates an instance which will serialize responses using the provided `ResponseSerializer`.\n    ///\n    /// - Parameters:\n    ///   - request:    `DataRequest` for which to publish the response.\n    ///   - queue:      `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.\n    ///   - serializer: `ResponseSerializer` used to produce the published `DataResponse`.\n    public init<Serializer: ResponseSerializer>(_ request: DataRequest, queue: DispatchQueue, serializer: Serializer)\n        where Value == Serializer.SerializedObject {\n        self.request = request\n        responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }\n    }\n\n    /// Creates an instance which will serialize responses using the provided `DataResponseSerializerProtocol`.\n    ///\n    /// - Parameters:\n    ///   - request:    `DataRequest` for which to publish the response.\n    ///   - queue:      `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.\n    ///   - serializer: `DataResponseSerializerProtocol` used to produce the published `DataResponse`.\n    public init<Serializer: DataResponseSerializerProtocol>(_ request: DataRequest,\n                                                            queue: DispatchQueue,\n                                                            serializer: Serializer)\n        where Value == Serializer.SerializedObject {\n        self.request = request\n        responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }\n    }\n\n    /// Publishes only the `Result` of the `DataResponse` value.\n    ///\n    /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.\n    public func result() -> AnyPublisher<Result<Value, AFError>, Never> {\n        map { $0.result }.eraseToAnyPublisher()\n    }\n\n    /// Publishes the `Result` of the `DataResponse` as a single `Value` or fail with the `AFError` instance.\n    ///\n    /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.\n    public func value() -> AnyPublisher<Value, AFError> {\n        setFailureType(to: AFError.self).flatMap { $0.result.publisher }.eraseToAnyPublisher()\n    }\n\n    public func receive<S>(subscriber: S) where S: Subscriber, DataResponsePublisher.Failure == S.Failure, DataResponsePublisher.Output == S.Input {\n        subscriber.receive(subscription: Inner(request: request,\n                                               responseHandler: responseHandler,\n                                               downstream: subscriber))\n    }\n\n    private final class Inner<Downstream: Subscriber>: Subscription, Cancellable\n        where Downstream.Input == Output {\n        typealias Failure = Downstream.Failure\n\n        @Protected\n        private var downstream: Downstream?\n        private let request: DataRequest\n        private let responseHandler: Handler\n\n        init(request: DataRequest, responseHandler: @escaping Handler, downstream: Downstream) {\n            self.request = request\n            self.responseHandler = responseHandler\n            self.downstream = downstream\n        }\n\n        func request(_ demand: Subscribers.Demand) {\n            assert(demand > 0)\n\n            guard let downstream = downstream else { return }\n\n            self.downstream = nil\n            responseHandler { response in\n                _ = downstream.receive(response)\n                downstream.receive(completion: .finished)\n            }.resume()\n        }\n\n        func cancel() {\n            request.cancel()\n            downstream = nil\n        }\n    }\n}\n\n@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\nextension DataResponsePublisher where Value == Data? {\n    /// Creates an instance which publishes a `DataResponse<Data?, AFError>` value without serialization.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public init(_ request: DataRequest, queue: DispatchQueue) {\n        self.request = request\n        responseHandler = { request.response(queue: queue, completionHandler: $0) }\n    }\n}\n\nextension DataRequest {\n    /// Creates a `DataResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`.\n    ///\n    /// - Parameters:\n    ///   - serializer: `ResponseSerializer` used to serialize response `Data`.\n    ///   - queue:      `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///\n    /// - Returns:      The `DataResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishResponse<Serializer: ResponseSerializer, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DataResponsePublisher<T>\n        where Serializer.SerializedObject == T {\n        DataResponsePublisher(self, queue: queue, serializer: serializer)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - queue:               `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    /// - Returns:               The `DataResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishData(queue: DispatchQueue = .main,\n                            preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,\n                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,\n                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher<Data> {\n        publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor,\n                                                      emptyResponseCodes: emptyResponseCodes,\n                                                      emptyRequestMethods: emptyRequestMethods),\n                        on: queue)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - queue:               `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - encoding:            `String.Encoding` to parse the response. `nil` by default, in which case the encoding\n    ///                          will be determined by the server response, falling back to the default HTTP character\n    ///                          set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    ///\n    /// - Returns:               The `DataResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishString(queue: DispatchQueue = .main,\n                              preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,\n                              encoding: String.Encoding? = nil,\n                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,\n                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher<String> {\n        publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor,\n                                                        encoding: encoding,\n                                                        emptyResponseCodes: emptyResponseCodes,\n                                                        emptyRequestMethods: emptyRequestMethods),\n                        on: queue)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - type:                `Decodable` type to which to decode response `Data`. Inferred from the context by default.\n    ///   - queue:               `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - decoder:             `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    ///\n    /// - Returns:               The `DataResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishDecodable<T: Decodable>(type: T.Type = T.self,\n                                               queue: DispatchQueue = .main,\n                                               preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,\n                                               decoder: DataDecoder = JSONDecoder(),\n                                               emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,\n                                               emptyResponseMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DataResponsePublisher<T> {\n        publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,\n                                                           decoder: decoder,\n                                                           emptyResponseCodes: emptyResponseCodes,\n                                                           emptyRequestMethods: emptyResponseMethods),\n                        on: queue)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance which does not serialize the response before publishing.\n    ///\n    ///   - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///\n    /// - Returns: The `DataResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishUnserialized(queue: DispatchQueue = .main) -> DataResponsePublisher<Data?> {\n        DataResponsePublisher(self, queue: queue)\n    }\n}\n\n// A Combine `Publisher` that publishes a sequence of `Stream<Value, AFError>` values received by the provided `DataStreamRequest`.\n@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\npublic struct DataStreamPublisher<Value>: Publisher {\n    public typealias Output = DataStreamRequest.Stream<Value, AFError>\n    public typealias Failure = Never\n\n    private typealias Handler = (@escaping DataStreamRequest.Handler<Value, AFError>) -> DataStreamRequest\n\n    private let request: DataStreamRequest\n    private let streamHandler: Handler\n\n    /// Creates an instance which will serialize responses using the provided `DataStreamSerializer`.\n    ///\n    /// - Parameters:\n    ///   - request:    `DataStreamRequest` for which to publish the response.\n    ///   - queue:      `DispatchQueue` on which the `Stream<Value, AFError>` values will be published. `.main` by\n    ///                 default.\n    ///   - serializer: `DataStreamSerializer` used to produce the published `Stream<Value, AFError>` values.\n    public init<Serializer: DataStreamSerializer>(_ request: DataStreamRequest, queue: DispatchQueue, serializer: Serializer)\n        where Value == Serializer.SerializedObject {\n        self.request = request\n        streamHandler = { request.responseStream(using: serializer, on: queue, stream: $0) }\n    }\n\n    /// Publishes only the `Result` of the `DataStreamRequest.Stream`'s `Event`s.\n    ///\n    /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.\n    public func result() -> AnyPublisher<Result<Value, AFError>, Never> {\n        compactMap { stream in\n            switch stream.event {\n            case let .stream(result):\n                return result\n            // If the stream has completed with an error, send the error value downstream as a `.failure`.\n            case let .complete(completion):\n                return completion.error.map(Result.failure)\n            }\n        }\n        .eraseToAnyPublisher()\n    }\n\n    /// Publishes the streamed values of the `DataStreamRequest.Stream` as a sequence of `Value` or fail with the\n    /// `AFError` instance.\n    ///\n    /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.\n    public func value() -> AnyPublisher<Value, AFError> {\n        result().setFailureType(to: AFError.self).flatMap { $0.publisher }.eraseToAnyPublisher()\n    }\n\n    public func receive<S>(subscriber: S) where S: Subscriber, DataStreamPublisher.Failure == S.Failure, DataStreamPublisher.Output == S.Input {\n        subscriber.receive(subscription: Inner(request: request,\n                                               streamHandler: streamHandler,\n                                               downstream: subscriber))\n    }\n\n    private final class Inner<Downstream: Subscriber>: Subscription, Cancellable\n        where Downstream.Input == Output {\n        typealias Failure = Downstream.Failure\n\n        @Protected\n        private var downstream: Downstream?\n        private let request: DataStreamRequest\n        private let streamHandler: Handler\n\n        init(request: DataStreamRequest, streamHandler: @escaping Handler, downstream: Downstream) {\n            self.request = request\n            self.streamHandler = streamHandler\n            self.downstream = downstream\n        }\n\n        func request(_ demand: Subscribers.Demand) {\n            assert(demand > 0)\n\n            guard let downstream = downstream else { return }\n\n            self.downstream = nil\n            streamHandler { stream in\n                _ = downstream.receive(stream)\n                if case .complete = stream.event {\n                    downstream.receive(completion: .finished)\n                }\n            }.resume()\n        }\n\n        func cancel() {\n            request.cancel()\n            downstream = nil\n        }\n    }\n}\n\nextension DataStreamRequest {\n    /// Creates a `DataStreamPublisher` for this instance using the given `DataStreamSerializer` and `DispatchQueue`.\n    ///\n    /// - Parameters:\n    ///   - serializer: `DataStreamSerializer` used to serialize the streamed `Data`.\n    ///   - queue:      `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.\n    /// - Returns:      The `DataStreamPublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishStream<Serializer: DataStreamSerializer>(using serializer: Serializer,\n                                                                on queue: DispatchQueue = .main) -> DataStreamPublisher<Serializer.SerializedObject> {\n        DataStreamPublisher(self, queue: queue, serializer: serializer)\n    }\n\n    /// Creates a `DataStreamPublisher` for this instance which uses a `PassthroughStreamSerializer` to stream `Data`\n    /// unserialized.\n    ///\n    /// - Parameters:\n    ///   - queue:      `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.\n    /// - Returns:      The `DataStreamPublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishData(queue: DispatchQueue = .main) -> DataStreamPublisher<Data> {\n        publishStream(using: PassthroughStreamSerializer(), on: queue)\n    }\n\n    /// Creates a `DataStreamPublisher` for this instance which uses a `StringStreamSerializer` to serialize stream\n    /// `Data` values into `String` values.\n    ///\n    /// - Parameters:\n    ///   - queue:      `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.\n    /// - Returns:      The `DataStreamPublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishString(queue: DispatchQueue = .main) -> DataStreamPublisher<String> {\n        publishStream(using: StringStreamSerializer(), on: queue)\n    }\n\n    /// Creates a `DataStreamPublisher` for this instance which uses a `DecodableStreamSerializer` with the provided\n    /// parameters to serialize stream `Data` values into the provided type.\n    ///\n    /// - Parameters:\n    ///   - type:         `Decodable` type to which to decode stream `Data`. Inferred from the context by default.\n    ///   - queue:        `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default.\n    ///   - decoder:      `DataDecoder` instance used to decode stream `Data`. `JSONDecoder()` by default.\n    ///   - preprocessor: `DataPreprocessor` which filters incoming stream `Data` before serialization.\n    ///                   `PassthroughPreprocessor()` by default.\n    /// - Returns:        The `DataStreamPublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishDecodable<T: Decodable>(type: T.Type = T.self,\n                                               queue: DispatchQueue = .main,\n                                               decoder: DataDecoder = JSONDecoder(),\n                                               preprocessor: DataPreprocessor = PassthroughPreprocessor()) -> DataStreamPublisher<T> {\n        publishStream(using: DecodableStreamSerializer(decoder: decoder,\n                                                       dataPreprocessor: preprocessor),\n                      on: queue)\n    }\n}\n\n/// A Combine `Publisher` that publishes the `DownloadResponse<Value, AFError>` of the provided `DownloadRequest`.\n@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\npublic struct DownloadResponsePublisher<Value>: Publisher {\n    public typealias Output = DownloadResponse<Value, AFError>\n    public typealias Failure = Never\n\n    private typealias Handler = (@escaping (_ response: DownloadResponse<Value, AFError>) -> Void) -> DownloadRequest\n\n    private let request: DownloadRequest\n    private let responseHandler: Handler\n\n    /// Creates an instance which will serialize responses using the provided `ResponseSerializer`.\n    ///\n    /// - Parameters:\n    ///   - request:    `DownloadRequest` for which to publish the response.\n    ///   - queue:      `DispatchQueue` on which the `DownloadResponse` value will be published. `.main` by default.\n    ///   - serializer: `ResponseSerializer` used to produce the published `DownloadResponse`.\n    public init<Serializer: ResponseSerializer>(_ request: DownloadRequest, queue: DispatchQueue, serializer: Serializer)\n        where Value == Serializer.SerializedObject {\n        self.request = request\n        responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }\n    }\n\n    /// Creates an instance which will serialize responses using the provided `DownloadResponseSerializerProtocol` value.\n    ///\n    /// - Parameters:\n    ///   - request:    `DownloadRequest` for which to publish the response.\n    ///   - queue:      `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default.\n    ///   - serializer: `DownloadResponseSerializerProtocol` used to produce the published `DownloadResponse`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public init<Serializer: DownloadResponseSerializerProtocol>(_ request: DownloadRequest,\n                                                                queue: DispatchQueue,\n                                                                serializer: Serializer)\n        where Value == Serializer.SerializedObject {\n        self.request = request\n        responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) }\n    }\n\n    /// Publishes only the `Result` of the `DownloadResponse` value.\n    ///\n    /// - Returns: The `AnyPublisher` publishing the `Result<Value, AFError>` value.\n    public func result() -> AnyPublisher<Result<Value, AFError>, Never> {\n        map { $0.result }.eraseToAnyPublisher()\n    }\n\n    /// Publishes the `Result` of the `DownloadResponse` as a single `Value` or fail with the `AFError` instance.\n    ///\n    /// - Returns: The `AnyPublisher<Value, AFError>` publishing the stream.\n    public func value() -> AnyPublisher<Value, AFError> {\n        setFailureType(to: AFError.self).flatMap { $0.result.publisher }.eraseToAnyPublisher()\n    }\n\n    public func receive<S>(subscriber: S) where S: Subscriber, DownloadResponsePublisher.Failure == S.Failure, DownloadResponsePublisher.Output == S.Input {\n        subscriber.receive(subscription: Inner(request: request,\n                                               responseHandler: responseHandler,\n                                               downstream: subscriber))\n    }\n\n    private final class Inner<Downstream: Subscriber>: Subscription, Cancellable\n        where Downstream.Input == Output {\n        typealias Failure = Downstream.Failure\n\n        @Protected\n        private var downstream: Downstream?\n        private let request: DownloadRequest\n        private let responseHandler: Handler\n\n        init(request: DownloadRequest, responseHandler: @escaping Handler, downstream: Downstream) {\n            self.request = request\n            self.responseHandler = responseHandler\n            self.downstream = downstream\n        }\n\n        func request(_ demand: Subscribers.Demand) {\n            assert(demand > 0)\n\n            guard let downstream = downstream else { return }\n\n            self.downstream = nil\n            responseHandler { response in\n                _ = downstream.receive(response)\n                downstream.receive(completion: .finished)\n            }.resume()\n        }\n\n        func cancel() {\n            request.cancel()\n            downstream = nil\n        }\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a `DownloadResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`.\n    ///\n    /// - Parameters:\n    ///   - serializer: `ResponseSerializer` used to serialize the response `Data` from disk.\n    ///   - queue:      `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default.\n    ///\n    /// - Returns:      The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishResponse<Serializer: ResponseSerializer, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher<T>\n        where Serializer.SerializedObject == T {\n        DownloadResponsePublisher(self, queue: queue, serializer: serializer)\n    }\n\n    /// Creates a `DownloadResponsePublisher` for this instance using the given `DownloadResponseSerializerProtocol` and\n    /// `DispatchQueue`.\n    ///\n    /// - Parameters:\n    ///   - serializer: `DownloadResponseSerializer` used to serialize the response `Data` from disk.\n    ///   - queue:      `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default.\n    ///\n    /// - Returns:      The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishResponse<Serializer: DownloadResponseSerializerProtocol, T>(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher<T>\n        where Serializer.SerializedObject == T {\n        DownloadResponsePublisher(self, queue: queue, serializer: serializer)\n    }\n\n    /// Creates a `DownloadResponsePublisher` for this instance and uses a `URLResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.\n    ///\n    /// - Returns:         The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishURL(queue: DispatchQueue = .main) -> DownloadResponsePublisher<URL> {\n        publishResponse(using: URLResponseSerializer(), on: queue)\n    }\n\n    /// Creates a `DownloadResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - queue:               `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    ///\n    /// - Returns:               The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishData(queue: DispatchQueue = .main,\n                            preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,\n                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,\n                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher<Data> {\n        publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor,\n                                                      emptyResponseCodes: emptyResponseCodes,\n                                                      emptyRequestMethods: emptyRequestMethods),\n                        on: queue)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - queue:               `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - encoding:            `String.Encoding` to parse the response. `nil` by default, in which case the encoding\n    ///                          will be determined by the server response, falling back to the default HTTP character\n    ///                          set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    ///\n    /// - Returns:               The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishString(queue: DispatchQueue = .main,\n                              preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,\n                              encoding: String.Encoding? = nil,\n                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,\n                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher<String> {\n        publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor,\n                                                        encoding: encoding,\n                                                        emptyResponseCodes: emptyResponseCodes,\n                                                        emptyRequestMethods: emptyRequestMethods),\n                        on: queue)\n    }\n\n    /// Creates a `DataResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize the\n    /// response.\n    ///\n    /// - Parameters:\n    ///   - type:                `Decodable` type to which to decode response `Data`. Inferred from the context by default.\n    ///   - queue:               `DispatchQueue` on which the `DataResponse` will be published. `.main` by default.\n    ///   - preprocessor:        `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()`\n    ///                          by default.\n    ///   - decoder:             `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default.\n    ///   - emptyResponseCodes:  `Set<Int>` of HTTP status codes for which empty responses are allowed. `[204, 205]` by\n    ///                          default.\n    ///   - emptyRequestMethods: `Set<HTTPMethod>` of `HTTPMethod`s for which empty responses are allowed, regardless of\n    ///                          status code. `[.head]` by default.\n    ///\n    /// - Returns:               The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishDecodable<T: Decodable>(type: T.Type = T.self,\n                                               queue: DispatchQueue = .main,\n                                               preprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,\n                                               decoder: DataDecoder = JSONDecoder(),\n                                               emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,\n                                               emptyResponseMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods) -> DownloadResponsePublisher<T> {\n        publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor,\n                                                           decoder: decoder,\n                                                           emptyResponseCodes: emptyResponseCodes,\n                                                           emptyRequestMethods: emptyResponseMethods),\n                        on: queue)\n    }\n}\n\n@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\nextension DownloadResponsePublisher where Value == URL? {\n    /// Creates an instance which publishes a `DownloadResponse<URL?, AFError>` value without serialization.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public init(_ request: DownloadRequest, queue: DispatchQueue) {\n        self.request = request\n        responseHandler = { request.response(queue: queue, completionHandler: $0) }\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a `DownloadResponsePublisher` for this instance which does not serialize the response before publishing.\n    ///\n    /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default.\n    ///\n    /// - Returns:         The `DownloadResponsePublisher`.\n    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)\n    public func publishUnserialized(on queue: DispatchQueue = .main) -> DownloadResponsePublisher<URL?> {\n        DownloadResponsePublisher(self, queue: queue)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/DispatchQueue+Alamofire.swift",
    "content": "//\n//  DispatchQueue+Alamofire.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Dispatch\nimport Foundation\n\nextension DispatchQueue {\n    /// Execute the provided closure after a `TimeInterval`.\n    ///\n    /// - Parameters:\n    ///   - delay:   `TimeInterval` to delay execution.\n    ///   - closure: Closure to execute.\n    func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {\n        asyncAfter(deadline: .now() + delay, execute: closure)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/EventMonitor.swift",
    "content": "//\n//  EventMonitor.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various\n/// `URLSession` delegate protocols as well as various events from the lifetime of `Request` and its subclasses.\npublic protocol EventMonitor {\n    /// The `DispatchQueue` onto which Alamofire's root `CompositeEventMonitor` will dispatch events. `.main` by default.\n    var queue: DispatchQueue { get }\n\n    // MARK: - URLSession Events\n\n    // MARK: URLSessionDelegate Events\n\n    /// Event called during `URLSessionDelegate`'s `urlSession(_:didBecomeInvalidWithError:)` method.\n    func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)\n\n    // MARK: URLSessionTaskDelegate Events\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didReceive:completionHandler:)` method.\n    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` method.\n    func urlSession(_ session: URLSession,\n                    task: URLSessionTask,\n                    didSendBodyData bytesSent: Int64,\n                    totalBytesSent: Int64,\n                    totalBytesExpectedToSend: Int64)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:needNewBodyStream:)` method.\n    func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` method.\n    func urlSession(_ session: URLSession,\n                    task: URLSessionTask,\n                    willPerformHTTPRedirection response: HTTPURLResponse,\n                    newRequest request: URLRequest)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didFinishCollecting:)` method.\n    func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didCompleteWithError:)` method.\n    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)\n\n    /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:taskIsWaitingForConnectivity:)` method.\n    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)\n    func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)\n\n    // MARK: URLSessionDataDelegate Events\n\n    /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:didReceive:)` method.\n    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)\n\n    /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:willCacheResponse:completionHandler:)` method.\n    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse)\n\n    // MARK: URLSessionDownloadDelegate Events\n\n    /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` method.\n    func urlSession(_ session: URLSession,\n                    downloadTask: URLSessionDownloadTask,\n                    didResumeAtOffset fileOffset: Int64,\n                    expectedTotalBytes: Int64)\n\n    /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` method.\n    func urlSession(_ session: URLSession,\n                    downloadTask: URLSessionDownloadTask,\n                    didWriteData bytesWritten: Int64,\n                    totalBytesWritten: Int64,\n                    totalBytesExpectedToWrite: Int64)\n\n    /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didFinishDownloadingTo:)` method.\n    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)\n\n    // MARK: - Request Events\n\n    /// Event called when a `URLRequest` is first created for a `Request`. If a `RequestAdapter` is active, the\n    /// `URLRequest` will be adapted before being issued.\n    func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest)\n\n    /// Event called when the attempt to create a `URLRequest` from a `Request`'s original `URLRequestConvertible` value fails.\n    func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError)\n\n    /// Event called when a `RequestAdapter` adapts the `Request`'s initial `URLRequest`.\n    func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest)\n\n    /// Event called when a `RequestAdapter` fails to adapt the `Request`'s initial `URLRequest`.\n    func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError)\n\n    /// Event called when a final `URLRequest` is created for a `Request`.\n    func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest)\n\n    /// Event called when a `URLSessionTask` subclass instance is created for a `Request`.\n    func request(_ request: Request, didCreateTask task: URLSessionTask)\n\n    /// Event called when a `Request` receives a `URLSessionTaskMetrics` value.\n    func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics)\n\n    /// Event called when a `Request` fails due to an error created by Alamofire. e.g. When certificate pinning fails.\n    func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError)\n\n    /// Event called when a `Request`'s task completes, possibly with an error. A `Request` may receive this event\n    /// multiple times if it is retried.\n    func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)\n\n    /// Event called when a `Request` is about to be retried.\n    func requestIsRetrying(_ request: Request)\n\n    /// Event called when a `Request` finishes and response serializers are being called.\n    func requestDidFinish(_ request: Request)\n\n    /// Event called when a `Request` receives a `resume` call.\n    func requestDidResume(_ request: Request)\n\n    /// Event called when a `Request`'s associated `URLSessionTask` is resumed.\n    func request(_ request: Request, didResumeTask task: URLSessionTask)\n\n    /// Event called when a `Request` receives a `suspend` call.\n    func requestDidSuspend(_ request: Request)\n\n    /// Event called when a `Request`'s associated `URLSessionTask` is suspended.\n    func request(_ request: Request, didSuspendTask task: URLSessionTask)\n\n    /// Event called when a `Request` receives a `cancel` call.\n    func requestDidCancel(_ request: Request)\n\n    /// Event called when a `Request`'s associated `URLSessionTask` is cancelled.\n    func request(_ request: Request, didCancelTask task: URLSessionTask)\n\n    // MARK: DataRequest Events\n\n    /// Event called when a `DataRequest` calls a `Validation`.\n    func request(_ request: DataRequest,\n                 didValidateRequest urlRequest: URLRequest?,\n                 response: HTTPURLResponse,\n                 data: Data?,\n                 withResult result: Request.ValidationResult)\n\n    /// Event called when a `DataRequest` creates a `DataResponse<Data?>` value without calling a `ResponseSerializer`.\n    func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>)\n\n    /// Event called when a `DataRequest` calls a `ResponseSerializer` and creates a generic `DataResponse<Value, AFError>`.\n    func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>)\n\n    // MARK: DataStreamRequest Events\n\n    /// Event called when a `DataStreamRequest` calls a `Validation` closure.\n    ///\n    /// - Parameters:\n    ///   - request:    `DataStreamRequest` which is calling the `Validation`.\n    ///   - urlRequest: `URLRequest` of the request being validated.\n    ///   - response:   `HTTPURLResponse` of the request being validated.\n    ///   - result:      Produced `ValidationResult`.\n    func request(_ request: DataStreamRequest,\n                 didValidateRequest urlRequest: URLRequest?,\n                 response: HTTPURLResponse,\n                 withResult result: Request.ValidationResult)\n\n    /// Event called when a `DataStreamSerializer` produces a value from streamed `Data`.\n    ///\n    /// - Parameters:\n    ///   - request: `DataStreamRequest` for which the value was serialized.\n    ///   - result:  `Result` of the serialization attempt.\n    func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>)\n\n    // MARK: UploadRequest Events\n\n    /// Event called when an `UploadRequest` creates its `Uploadable` value, indicating the type of upload it represents.\n    func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable)\n\n    /// Event called when an `UploadRequest` failed to create its `Uploadable` value due to an error.\n    func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError)\n\n    /// Event called when an `UploadRequest` provides the `InputStream` from its `Uploadable` value. This only occurs if\n    /// the `InputStream` does not wrap a `Data` value or file `URL`.\n    func request(_ request: UploadRequest, didProvideInputStream stream: InputStream)\n\n    // MARK: DownloadRequest Events\n\n    /// Event called when a `DownloadRequest`'s `URLSessionDownloadTask` finishes and the temporary file has been moved.\n    func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>)\n\n    /// Event called when a `DownloadRequest`'s `Destination` closure is called and creates the destination URL the\n    /// downloaded file will be moved to.\n    func request(_ request: DownloadRequest, didCreateDestinationURL url: URL)\n\n    /// Event called when a `DownloadRequest` calls a `Validation`.\n    func request(_ request: DownloadRequest,\n                 didValidateRequest urlRequest: URLRequest?,\n                 response: HTTPURLResponse,\n                 fileURL: URL?,\n                 withResult result: Request.ValidationResult)\n\n    /// Event called when a `DownloadRequest` creates a `DownloadResponse<URL?, AFError>` without calling a `ResponseSerializer`.\n    func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>)\n\n    /// Event called when a `DownloadRequest` calls a `DownloadResponseSerializer` and creates a generic `DownloadResponse<Value, AFError>`\n    func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>)\n}\n\nextension EventMonitor {\n    /// The default queue on which `CompositeEventMonitor`s will call the `EventMonitor` methods. `.main` by default.\n    public var queue: DispatchQueue { .main }\n\n    // MARK: Default Implementations\n\n    public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {}\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           didReceive challenge: URLAuthenticationChallenge) {}\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           didSendBodyData bytesSent: Int64,\n                           totalBytesSent: Int64,\n                           totalBytesExpectedToSend: Int64) {}\n    public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {}\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           willPerformHTTPRedirection response: HTTPURLResponse,\n                           newRequest request: URLRequest) {}\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           didFinishCollecting metrics: URLSessionTaskMetrics) {}\n    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {}\n    public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {}\n    public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {}\n    public func urlSession(_ session: URLSession,\n                           dataTask: URLSessionDataTask,\n                           willCacheResponse proposedResponse: CachedURLResponse) {}\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didResumeAtOffset fileOffset: Int64,\n                           expectedTotalBytes: Int64) {}\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didWriteData bytesWritten: Int64,\n                           totalBytesWritten: Int64,\n                           totalBytesExpectedToWrite: Int64) {}\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didFinishDownloadingTo location: URL) {}\n    public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {}\n    public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {}\n    public func request(_ request: Request,\n                        didAdaptInitialRequest initialRequest: URLRequest,\n                        to adaptedRequest: URLRequest) {}\n    public func request(_ request: Request,\n                        didFailToAdaptURLRequest initialRequest: URLRequest,\n                        withError error: AFError) {}\n    public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {}\n    public func request(_ request: Request, didCreateTask task: URLSessionTask) {}\n    public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {}\n    public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {}\n    public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {}\n    public func requestIsRetrying(_ request: Request) {}\n    public func requestDidFinish(_ request: Request) {}\n    public func requestDidResume(_ request: Request) {}\n    public func request(_ request: Request, didResumeTask task: URLSessionTask) {}\n    public func requestDidSuspend(_ request: Request) {}\n    public func request(_ request: Request, didSuspendTask task: URLSessionTask) {}\n    public func requestDidCancel(_ request: Request) {}\n    public func request(_ request: Request, didCancelTask task: URLSessionTask) {}\n    public func request(_ request: DataRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        data: Data?,\n                        withResult result: Request.ValidationResult) {}\n    public func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {}\n    public func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {}\n    public func request(_ request: DataStreamRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        withResult result: Request.ValidationResult) {}\n    public func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>) {}\n    public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {}\n    public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {}\n    public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {}\n    public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {}\n    public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {}\n    public func request(_ request: DownloadRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        fileURL: URL?,\n                        withResult result: Request.ValidationResult) {}\n    public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {}\n    public func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>) {}\n}\n\n/// An `EventMonitor` which can contain multiple `EventMonitor`s and calls their methods on their queues.\npublic final class CompositeEventMonitor: EventMonitor {\n    public let queue = DispatchQueue(label: \"org.alamofire.compositeEventMonitor\", qos: .utility)\n\n    let monitors: [EventMonitor]\n\n    init(monitors: [EventMonitor]) {\n        self.monitors = monitors\n    }\n\n    func performEvent(_ event: @escaping (EventMonitor) -> Void) {\n        queue.async {\n            for monitor in self.monitors {\n                monitor.queue.async { event(monitor) }\n            }\n        }\n    }\n\n    public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {\n        performEvent { $0.urlSession(session, didBecomeInvalidWithError: error) }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           didReceive challenge: URLAuthenticationChallenge) {\n        performEvent { $0.urlSession(session, task: task, didReceive: challenge) }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           didSendBodyData bytesSent: Int64,\n                           totalBytesSent: Int64,\n                           totalBytesExpectedToSend: Int64) {\n        performEvent {\n            $0.urlSession(session,\n                          task: task,\n                          didSendBodyData: bytesSent,\n                          totalBytesSent: totalBytesSent,\n                          totalBytesExpectedToSend: totalBytesExpectedToSend)\n        }\n    }\n\n    public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {\n        performEvent {\n            $0.urlSession(session, taskNeedsNewBodyStream: task)\n        }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           task: URLSessionTask,\n                           willPerformHTTPRedirection response: HTTPURLResponse,\n                           newRequest request: URLRequest) {\n        performEvent {\n            $0.urlSession(session,\n                          task: task,\n                          willPerformHTTPRedirection: response,\n                          newRequest: request)\n        }\n    }\n\n    public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {\n        performEvent { $0.urlSession(session, task: task, didFinishCollecting: metrics) }\n    }\n\n    public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        performEvent { $0.urlSession(session, task: task, didCompleteWithError: error) }\n    }\n\n    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)\n    public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {\n        performEvent { $0.urlSession(session, taskIsWaitingForConnectivity: task) }\n    }\n\n    public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n        performEvent { $0.urlSession(session, dataTask: dataTask, didReceive: data) }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           dataTask: URLSessionDataTask,\n                           willCacheResponse proposedResponse: CachedURLResponse) {\n        performEvent { $0.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didResumeAtOffset fileOffset: Int64,\n                           expectedTotalBytes: Int64) {\n        performEvent {\n            $0.urlSession(session,\n                          downloadTask: downloadTask,\n                          didResumeAtOffset: fileOffset,\n                          expectedTotalBytes: expectedTotalBytes)\n        }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didWriteData bytesWritten: Int64,\n                           totalBytesWritten: Int64,\n                           totalBytesExpectedToWrite: Int64) {\n        performEvent {\n            $0.urlSession(session,\n                          downloadTask: downloadTask,\n                          didWriteData: bytesWritten,\n                          totalBytesWritten: totalBytesWritten,\n                          totalBytesExpectedToWrite: totalBytesExpectedToWrite)\n        }\n    }\n\n    public func urlSession(_ session: URLSession,\n                           downloadTask: URLSessionDownloadTask,\n                           didFinishDownloadingTo location: URL) {\n        performEvent { $0.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) }\n    }\n\n    public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {\n        performEvent { $0.request(request, didCreateInitialURLRequest: urlRequest) }\n    }\n\n    public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {\n        performEvent { $0.request(request, didFailToCreateURLRequestWithError: error) }\n    }\n\n    public func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) {\n        performEvent { $0.request(request, didAdaptInitialRequest: initialRequest, to: adaptedRequest) }\n    }\n\n    public func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) {\n        performEvent { $0.request(request, didFailToAdaptURLRequest: initialRequest, withError: error) }\n    }\n\n    public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {\n        performEvent { $0.request(request, didCreateURLRequest: urlRequest) }\n    }\n\n    public func request(_ request: Request, didCreateTask task: URLSessionTask) {\n        performEvent { $0.request(request, didCreateTask: task) }\n    }\n\n    public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {\n        performEvent { $0.request(request, didGatherMetrics: metrics) }\n    }\n\n    public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {\n        performEvent { $0.request(request, didFailTask: task, earlyWithError: error) }\n    }\n\n    public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {\n        performEvent { $0.request(request, didCompleteTask: task, with: error) }\n    }\n\n    public func requestIsRetrying(_ request: Request) {\n        performEvent { $0.requestIsRetrying(request) }\n    }\n\n    public func requestDidFinish(_ request: Request) {\n        performEvent { $0.requestDidFinish(request) }\n    }\n\n    public func requestDidResume(_ request: Request) {\n        performEvent { $0.requestDidResume(request) }\n    }\n\n    public func request(_ request: Request, didResumeTask task: URLSessionTask) {\n        performEvent { $0.request(request, didResumeTask: task) }\n    }\n\n    public func requestDidSuspend(_ request: Request) {\n        performEvent { $0.requestDidSuspend(request) }\n    }\n\n    public func request(_ request: Request, didSuspendTask task: URLSessionTask) {\n        performEvent { $0.request(request, didSuspendTask: task) }\n    }\n\n    public func requestDidCancel(_ request: Request) {\n        performEvent { $0.requestDidCancel(request) }\n    }\n\n    public func request(_ request: Request, didCancelTask task: URLSessionTask) {\n        performEvent { $0.request(request, didCancelTask: task) }\n    }\n\n    public func request(_ request: DataRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        data: Data?,\n                        withResult result: Request.ValidationResult) {\n        performEvent { $0.request(request,\n                                  didValidateRequest: urlRequest,\n                                  response: response,\n                                  data: data,\n                                  withResult: result)\n        }\n    }\n\n    public func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {\n        performEvent { $0.request(request, didParseResponse: response) }\n    }\n\n    public func request<Value>(_ request: DataRequest, didParseResponse response: DataResponse<Value, AFError>) {\n        performEvent { $0.request(request, didParseResponse: response) }\n    }\n\n    public func request(_ request: DataStreamRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        withResult result: Request.ValidationResult) {\n        performEvent { $0.request(request,\n                                  didValidateRequest: urlRequest,\n                                  response: response,\n                                  withResult: result)\n        }\n    }\n\n    public func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>) {\n        performEvent { $0.request(request, didParseStream: result) }\n    }\n\n    public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {\n        performEvent { $0.request(request, didCreateUploadable: uploadable) }\n    }\n\n    public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {\n        performEvent { $0.request(request, didFailToCreateUploadableWithError: error) }\n    }\n\n    public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {\n        performEvent { $0.request(request, didProvideInputStream: stream) }\n    }\n\n    public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {\n        performEvent { $0.request(request, didFinishDownloadingUsing: task, with: result) }\n    }\n\n    public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {\n        performEvent { $0.request(request, didCreateDestinationURL: url) }\n    }\n\n    public func request(_ request: DownloadRequest,\n                        didValidateRequest urlRequest: URLRequest?,\n                        response: HTTPURLResponse,\n                        fileURL: URL?,\n                        withResult result: Request.ValidationResult) {\n        performEvent { $0.request(request,\n                                  didValidateRequest: urlRequest,\n                                  response: response,\n                                  fileURL: fileURL,\n                                  withResult: result) }\n    }\n\n    public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {\n        performEvent { $0.request(request, didParseResponse: response) }\n    }\n\n    public func request<Value>(_ request: DownloadRequest, didParseResponse response: DownloadResponse<Value, AFError>) {\n        performEvent { $0.request(request, didParseResponse: response) }\n    }\n}\n\n/// `EventMonitor` that allows optional closures to be set to receive events.\nopen class ClosureEventMonitor: EventMonitor {\n    /// Closure called on the `urlSession(_:didBecomeInvalidWithError:)` event.\n    open var sessionDidBecomeInvalidWithError: ((URLSession, Error?) -> Void)?\n\n    /// Closure called on the `urlSession(_:task:didReceive:completionHandler:)`.\n    open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> Void)?\n\n    /// Closure that receives `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` event.\n    open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?\n\n    /// Closure called on the `urlSession(_:task:needNewBodyStream:)` event.\n    open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> Void)?\n\n    /// Closure called on the `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` event.\n    open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> Void)?\n\n    /// Closure called on the `urlSession(_:task:didFinishCollecting:)` event.\n    open var taskDidFinishCollectingMetrics: ((URLSession, URLSessionTask, URLSessionTaskMetrics) -> Void)?\n\n    /// Closure called on the `urlSession(_:task:didCompleteWithError:)` event.\n    open var taskDidComplete: ((URLSession, URLSessionTask, Error?) -> Void)?\n\n    /// Closure called on the `urlSession(_:taskIsWaitingForConnectivity:)` event.\n    open var taskIsWaitingForConnectivity: ((URLSession, URLSessionTask) -> Void)?\n\n    /// Closure that receives the `urlSession(_:dataTask:didReceive:)` event.\n    open var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)?\n\n    /// Closure called on the `urlSession(_:dataTask:willCacheResponse:completionHandler:)` event.\n    open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> Void)?\n\n    /// Closure called on the `urlSession(_:downloadTask:didFinishDownloadingTo:)` event.\n    open var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> Void)?\n\n    /// Closure called on the `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)`\n    /// event.\n    open var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)?\n\n    /// Closure called on the `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` event.\n    open var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)?\n\n    // MARK: - Request Events\n\n    /// Closure called on the `request(_:didCreateInitialURLRequest:)` event.\n    open var requestDidCreateInitialURLRequest: ((Request, URLRequest) -> Void)?\n\n    /// Closure called on the `request(_:didFailToCreateURLRequestWithError:)` event.\n    open var requestDidFailToCreateURLRequestWithError: ((Request, AFError) -> Void)?\n\n    /// Closure called on the `request(_:didAdaptInitialRequest:to:)` event.\n    open var requestDidAdaptInitialRequestToAdaptedRequest: ((Request, URLRequest, URLRequest) -> Void)?\n\n    /// Closure called on the `request(_:didFailToAdaptURLRequest:withError:)` event.\n    open var requestDidFailToAdaptURLRequestWithError: ((Request, URLRequest, AFError) -> Void)?\n\n    /// Closure called on the `request(_:didCreateURLRequest:)` event.\n    open var requestDidCreateURLRequest: ((Request, URLRequest) -> Void)?\n\n    /// Closure called on the `request(_:didCreateTask:)` event.\n    open var requestDidCreateTask: ((Request, URLSessionTask) -> Void)?\n\n    /// Closure called on the `request(_:didGatherMetrics:)` event.\n    open var requestDidGatherMetrics: ((Request, URLSessionTaskMetrics) -> Void)?\n\n    /// Closure called on the `request(_:didFailTask:earlyWithError:)` event.\n    open var requestDidFailTaskEarlyWithError: ((Request, URLSessionTask, AFError) -> Void)?\n\n    /// Closure called on the `request(_:didCompleteTask:with:)` event.\n    open var requestDidCompleteTaskWithError: ((Request, URLSessionTask, AFError?) -> Void)?\n\n    /// Closure called on the `requestIsRetrying(_:)` event.\n    open var requestIsRetrying: ((Request) -> Void)?\n\n    /// Closure called on the `requestDidFinish(_:)` event.\n    open var requestDidFinish: ((Request) -> Void)?\n\n    /// Closure called on the `requestDidResume(_:)` event.\n    open var requestDidResume: ((Request) -> Void)?\n\n    /// Closure called on the `request(_:didResumeTask:)` event.\n    open var requestDidResumeTask: ((Request, URLSessionTask) -> Void)?\n\n    /// Closure called on the `requestDidSuspend(_:)` event.\n    open var requestDidSuspend: ((Request) -> Void)?\n\n    /// Closure called on the `request(_:didSuspendTask:)` event.\n    open var requestDidSuspendTask: ((Request, URLSessionTask) -> Void)?\n\n    /// Closure called on the `requestDidCancel(_:)` event.\n    open var requestDidCancel: ((Request) -> Void)?\n\n    /// Closure called on the `request(_:didCancelTask:)` event.\n    open var requestDidCancelTask: ((Request, URLSessionTask) -> Void)?\n\n    /// Closure called on the `request(_:didValidateRequest:response:data:withResult:)` event.\n    open var requestDidValidateRequestResponseDataWithResult: ((DataRequest, URLRequest?, HTTPURLResponse, Data?, Request.ValidationResult) -> Void)?\n\n    /// Closure called on the `request(_:didParseResponse:)` event.\n    open var requestDidParseResponse: ((DataRequest, DataResponse<Data?, AFError>) -> Void)?\n\n    /// Closure called on the `request(_:didValidateRequest:response:withResult:)` event.\n    open var requestDidValidateRequestResponseWithResult: ((DataStreamRequest, URLRequest?, HTTPURLResponse, Request.ValidationResult) -> Void)?\n\n    /// Closure called on the `request(_:didCreateUploadable:)` event.\n    open var requestDidCreateUploadable: ((UploadRequest, UploadRequest.Uploadable) -> Void)?\n\n    /// Closure called on the `request(_:didFailToCreateUploadableWithError:)` event.\n    open var requestDidFailToCreateUploadableWithError: ((UploadRequest, AFError) -> Void)?\n\n    /// Closure called on the `request(_:didProvideInputStream:)` event.\n    open var requestDidProvideInputStream: ((UploadRequest, InputStream) -> Void)?\n\n    /// Closure called on the `request(_:didFinishDownloadingUsing:with:)` event.\n    open var requestDidFinishDownloadingUsingTaskWithResult: ((DownloadRequest, URLSessionTask, Result<URL, AFError>) -> Void)?\n\n    /// Closure called on the `request(_:didCreateDestinationURL:)` event.\n    open var requestDidCreateDestinationURL: ((DownloadRequest, URL) -> Void)?\n\n    /// Closure called on the `request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:)` event.\n    open var requestDidValidateRequestResponseFileURLWithResult: ((DownloadRequest, URLRequest?, HTTPURLResponse, URL?, Request.ValidationResult) -> Void)?\n\n    /// Closure called on the `request(_:didParseResponse:)` event.\n    open var requestDidParseDownloadResponse: ((DownloadRequest, DownloadResponse<URL?, AFError>) -> Void)?\n\n    public let queue: DispatchQueue\n\n    /// Creates an instance using the provided queue.\n    ///\n    /// - Parameter queue: `DispatchQueue` on which events will fired. `.main` by default.\n    public init(queue: DispatchQueue = .main) {\n        self.queue = queue\n    }\n\n    open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {\n        sessionDidBecomeInvalidWithError?(session, error)\n    }\n\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) {\n        taskDidReceiveChallenge?(session, task, challenge)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         didSendBodyData bytesSent: Int64,\n                         totalBytesSent: Int64,\n                         totalBytesExpectedToSend: Int64) {\n        taskDidSendBodyData?(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)\n    }\n\n    open func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {\n        taskNeedNewBodyStream?(session, task)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         willPerformHTTPRedirection response: HTTPURLResponse,\n                         newRequest request: URLRequest) {\n        taskWillPerformHTTPRedirection?(session, task, response, request)\n    }\n\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {\n        taskDidFinishCollectingMetrics?(session, task, metrics)\n    }\n\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        taskDidComplete?(session, task, error)\n    }\n\n    open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {\n        taskIsWaitingForConnectivity?(session, task)\n    }\n\n    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n        dataTaskDidReceiveData?(session, dataTask, data)\n    }\n\n    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) {\n        dataTaskWillCacheResponse?(session, dataTask, proposedResponse)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         downloadTask: URLSessionDownloadTask,\n                         didResumeAtOffset fileOffset: Int64,\n                         expectedTotalBytes: Int64) {\n        downloadTaskDidResumeAtOffset?(session, downloadTask, fileOffset, expectedTotalBytes)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         downloadTask: URLSessionDownloadTask,\n                         didWriteData bytesWritten: Int64,\n                         totalBytesWritten: Int64,\n                         totalBytesExpectedToWrite: Int64) {\n        downloadTaskDidWriteData?(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)\n    }\n\n    open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {\n        downloadTaskDidFinishDownloadingToURL?(session, downloadTask, location)\n    }\n\n    // MARK: Request Events\n\n    open func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {\n        requestDidCreateInitialURLRequest?(request, urlRequest)\n    }\n\n    open func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {\n        requestDidFailToCreateURLRequestWithError?(request, error)\n    }\n\n    open func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) {\n        requestDidAdaptInitialRequestToAdaptedRequest?(request, initialRequest, adaptedRequest)\n    }\n\n    open func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) {\n        requestDidFailToAdaptURLRequestWithError?(request, initialRequest, error)\n    }\n\n    open func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {\n        requestDidCreateURLRequest?(request, urlRequest)\n    }\n\n    open func request(_ request: Request, didCreateTask task: URLSessionTask) {\n        requestDidCreateTask?(request, task)\n    }\n\n    open func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {\n        requestDidGatherMetrics?(request, metrics)\n    }\n\n    open func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {\n        requestDidFailTaskEarlyWithError?(request, task, error)\n    }\n\n    open func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {\n        requestDidCompleteTaskWithError?(request, task, error)\n    }\n\n    open func requestIsRetrying(_ request: Request) {\n        requestIsRetrying?(request)\n    }\n\n    open func requestDidFinish(_ request: Request) {\n        requestDidFinish?(request)\n    }\n\n    open func requestDidResume(_ request: Request) {\n        requestDidResume?(request)\n    }\n\n    public func request(_ request: Request, didResumeTask task: URLSessionTask) {\n        requestDidResumeTask?(request, task)\n    }\n\n    open func requestDidSuspend(_ request: Request) {\n        requestDidSuspend?(request)\n    }\n\n    public func request(_ request: Request, didSuspendTask task: URLSessionTask) {\n        requestDidSuspendTask?(request, task)\n    }\n\n    open func requestDidCancel(_ request: Request) {\n        requestDidCancel?(request)\n    }\n\n    public func request(_ request: Request, didCancelTask task: URLSessionTask) {\n        requestDidCancelTask?(request, task)\n    }\n\n    open func request(_ request: DataRequest,\n                      didValidateRequest urlRequest: URLRequest?,\n                      response: HTTPURLResponse,\n                      data: Data?,\n                      withResult result: Request.ValidationResult) {\n        requestDidValidateRequestResponseDataWithResult?(request, urlRequest, response, data, result)\n    }\n\n    open func request(_ request: DataRequest, didParseResponse response: DataResponse<Data?, AFError>) {\n        requestDidParseResponse?(request, response)\n    }\n\n    public func request(_ request: DataStreamRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, withResult result: Request.ValidationResult) {\n        requestDidValidateRequestResponseWithResult?(request, urlRequest, response, result)\n    }\n\n    open func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {\n        requestDidCreateUploadable?(request, uploadable)\n    }\n\n    open func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {\n        requestDidFailToCreateUploadableWithError?(request, error)\n    }\n\n    open func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {\n        requestDidProvideInputStream?(request, stream)\n    }\n\n    open func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result<URL, AFError>) {\n        requestDidFinishDownloadingUsingTaskWithResult?(request, task, result)\n    }\n\n    open func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {\n        requestDidCreateDestinationURL?(request, url)\n    }\n\n    open func request(_ request: DownloadRequest,\n                      didValidateRequest urlRequest: URLRequest?,\n                      response: HTTPURLResponse,\n                      fileURL: URL?,\n                      withResult result: Request.ValidationResult) {\n        requestDidValidateRequestResponseFileURLWithResult?(request,\n                                                            urlRequest,\n                                                            response,\n                                                            fileURL,\n                                                            result)\n    }\n\n    open func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse<URL?, AFError>) {\n        requestDidParseDownloadResponse?(request, response)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/HTTPHeaders.swift",
    "content": "//\n//  HTTPHeaders.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// An order-preserving and case-insensitive representation of HTTP headers.\npublic struct HTTPHeaders {\n    private var headers: [HTTPHeader] = []\n\n    /// Creates an empty instance.\n    public init() {}\n\n    /// Creates an instance from an array of `HTTPHeader`s. Duplicate case-insensitive names are collapsed into the last\n    /// name and value encountered.\n    public init(_ headers: [HTTPHeader]) {\n        self.init()\n\n        headers.forEach { update($0) }\n    }\n\n    /// Creates an instance from a `[String: String]`. Duplicate case-insensitive names are collapsed into the last name\n    /// and value encountered.\n    public init(_ dictionary: [String: String]) {\n        self.init()\n\n        dictionary.forEach { update(HTTPHeader(name: $0.key, value: $0.value)) }\n    }\n\n    /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`.\n    ///\n    /// - Parameters:\n    ///   - name:  The `HTTPHeader` name.\n    ///   - value: The `HTTPHeader value.\n    public mutating func add(name: String, value: String) {\n        update(HTTPHeader(name: name, value: value))\n    }\n\n    /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance.\n    ///\n    /// - Parameter header: The `HTTPHeader` to update or append.\n    public mutating func add(_ header: HTTPHeader) {\n        update(header)\n    }\n\n    /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`.\n    ///\n    /// - Parameters:\n    ///   - name:  The `HTTPHeader` name.\n    ///   - value: The `HTTPHeader value.\n    public mutating func update(name: String, value: String) {\n        update(HTTPHeader(name: name, value: value))\n    }\n\n    /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance.\n    ///\n    /// - Parameter header: The `HTTPHeader` to update or append.\n    public mutating func update(_ header: HTTPHeader) {\n        guard let index = headers.index(of: header.name) else {\n            headers.append(header)\n            return\n        }\n\n        headers.replaceSubrange(index...index, with: [header])\n    }\n\n    /// Case-insensitively removes an `HTTPHeader`, if it exists, from the instance.\n    ///\n    /// - Parameter name: The name of the `HTTPHeader` to remove.\n    public mutating func remove(name: String) {\n        guard let index = headers.index(of: name) else { return }\n\n        headers.remove(at: index)\n    }\n\n    /// Sort the current instance by header name, case insensitively.\n    public mutating func sort() {\n        headers.sort { $0.name.lowercased() < $1.name.lowercased() }\n    }\n\n    /// Returns an instance sorted by header name.\n    ///\n    /// - Returns: A copy of the current instance sorted by name.\n    public func sorted() -> HTTPHeaders {\n        var headers = self\n        headers.sort()\n\n        return headers\n    }\n\n    /// Case-insensitively find a header's value by name.\n    ///\n    /// - Parameter name: The name of the header to search for, case-insensitively.\n    ///\n    /// - Returns:        The value of header, if it exists.\n    public func value(for name: String) -> String? {\n        guard let index = headers.index(of: name) else { return nil }\n\n        return headers[index].value\n    }\n\n    /// Case-insensitively access the header with the given name.\n    ///\n    /// - Parameter name: The name of the header.\n    public subscript(_ name: String) -> String? {\n        get { value(for: name) }\n        set {\n            if let value = newValue {\n                update(name: name, value: value)\n            } else {\n                remove(name: name)\n            }\n        }\n    }\n\n    /// The dictionary representation of all headers.\n    ///\n    /// This representation does not preserve the current order of the instance.\n    public var dictionary: [String: String] {\n        let namesAndValues = headers.map { ($0.name, $0.value) }\n\n        return Dictionary(namesAndValues, uniquingKeysWith: { _, last in last })\n    }\n}\n\nextension HTTPHeaders: ExpressibleByDictionaryLiteral {\n    public init(dictionaryLiteral elements: (String, String)...) {\n        self.init()\n\n        elements.forEach { update(name: $0.0, value: $0.1) }\n    }\n}\n\nextension HTTPHeaders: ExpressibleByArrayLiteral {\n    public init(arrayLiteral elements: HTTPHeader...) {\n        self.init(elements)\n    }\n}\n\nextension HTTPHeaders: Sequence {\n    public func makeIterator() -> IndexingIterator<[HTTPHeader]> {\n        headers.makeIterator()\n    }\n}\n\nextension HTTPHeaders: Collection {\n    public var startIndex: Int {\n        headers.startIndex\n    }\n\n    public var endIndex: Int {\n        headers.endIndex\n    }\n\n    public subscript(position: Int) -> HTTPHeader {\n        headers[position]\n    }\n\n    public func index(after i: Int) -> Int {\n        headers.index(after: i)\n    }\n}\n\nextension HTTPHeaders: CustomStringConvertible {\n    public var description: String {\n        headers.map { $0.description }\n            .joined(separator: \"\\n\")\n    }\n}\n\n// MARK: - HTTPHeader\n\n/// A representation of a single HTTP header's name / value pair.\npublic struct HTTPHeader: Hashable {\n    /// Name of the header.\n    public let name: String\n\n    /// Value of the header.\n    public let value: String\n\n    /// Creates an instance from the given `name` and `value`.\n    ///\n    /// - Parameters:\n    ///   - name:  The name of the header.\n    ///   - value: The value of the header.\n    public init(name: String, value: String) {\n        self.name = name\n        self.value = value\n    }\n}\n\nextension HTTPHeader: CustomStringConvertible {\n    public var description: String {\n        \"\\(name): \\(value)\"\n    }\n}\n\nextension HTTPHeader {\n    /// Returns an `Accept` header.\n    ///\n    /// - Parameter value: The `Accept` value.\n    /// - Returns:         The header.\n    public static func accept(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Accept\", value: value)\n    }\n\n    /// Returns an `Accept-Charset` header.\n    ///\n    /// - Parameter value: The `Accept-Charset` value.\n    /// - Returns:         The header.\n    public static func acceptCharset(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Accept-Charset\", value: value)\n    }\n\n    /// Returns an `Accept-Language` header.\n    ///\n    /// Alamofire offers a default Accept-Language header that accumulates and encodes the system's preferred languages.\n    /// Use `HTTPHeader.defaultAcceptLanguage`.\n    ///\n    /// - Parameter value: The `Accept-Language` value.\n    ///\n    /// - Returns:         The header.\n    public static func acceptLanguage(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Accept-Language\", value: value)\n    }\n\n    /// Returns an `Accept-Encoding` header.\n    ///\n    /// Alamofire offers a default accept encoding value that provides the most common values. Use\n    /// `HTTPHeader.defaultAcceptEncoding`.\n    ///\n    /// - Parameter value: The `Accept-Encoding` value.\n    ///\n    /// - Returns:         The header\n    public static func acceptEncoding(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Accept-Encoding\", value: value)\n    }\n\n    /// Returns a `Basic` `Authorization` header using the `username` and `password` provided.\n    ///\n    /// - Parameters:\n    ///   - username: The username of the header.\n    ///   - password: The password of the header.\n    ///\n    /// - Returns:    The header.\n    public static func authorization(username: String, password: String) -> HTTPHeader {\n        let credential = Data(\"\\(username):\\(password)\".utf8).base64EncodedString()\n\n        return authorization(\"Basic \\(credential)\")\n    }\n\n    /// Returns a `Bearer` `Authorization` header using the `bearerToken` provided\n    ///\n    /// - Parameter bearerToken: The bearer token.\n    ///\n    /// - Returns:               The header.\n    public static func authorization(bearerToken: String) -> HTTPHeader {\n        authorization(\"Bearer \\(bearerToken)\")\n    }\n\n    /// Returns an `Authorization` header.\n    ///\n    /// Alamofire provides built-in methods to produce `Authorization` headers. For a Basic `Authorization` header use\n    /// `HTTPHeader.authorization(username:password:)`. For a Bearer `Authorization` header, use\n    /// `HTTPHeader.authorization(bearerToken:)`.\n    ///\n    /// - Parameter value: The `Authorization` value.\n    ///\n    /// - Returns:         The header.\n    public static func authorization(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Authorization\", value: value)\n    }\n\n    /// Returns a `Content-Disposition` header.\n    ///\n    /// - Parameter value: The `Content-Disposition` value.\n    ///\n    /// - Returns:         The header.\n    public static func contentDisposition(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Content-Disposition\", value: value)\n    }\n\n    /// Returns a `Content-Type` header.\n    ///\n    /// All Alamofire `ParameterEncoding`s and `ParameterEncoder`s set the `Content-Type` of the request, so it may not be necessary to manually\n    /// set this value.\n    ///\n    /// - Parameter value: The `Content-Type` value.\n    ///\n    /// - Returns:         The header.\n    public static func contentType(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"Content-Type\", value: value)\n    }\n\n    /// Returns a `User-Agent` header.\n    ///\n    /// - Parameter value: The `User-Agent` value.\n    ///\n    /// - Returns:         The header.\n    public static func userAgent(_ value: String) -> HTTPHeader {\n        HTTPHeader(name: \"User-Agent\", value: value)\n    }\n}\n\nextension Array where Element == HTTPHeader {\n    /// Case-insensitively finds the index of an `HTTPHeader` with the provided name, if it exists.\n    func index(of name: String) -> Int? {\n        let lowercasedName = name.lowercased()\n        return firstIndex { $0.name.lowercased() == lowercasedName }\n    }\n}\n\n// MARK: - Defaults\n\nextension HTTPHeaders {\n    /// The default set of `HTTPHeaders` used by Alamofire. Includes `Accept-Encoding`, `Accept-Language`, and\n    /// `User-Agent`.\n    public static let `default`: HTTPHeaders = [.defaultAcceptEncoding,\n                                                .defaultAcceptLanguage,\n                                                .defaultUserAgent]\n}\n\nextension HTTPHeader {\n    /// Returns Alamofire's default `Accept-Encoding` header, appropriate for the encodings supported by particular OS\n    /// versions.\n    ///\n    /// See the [Accept-Encoding HTTP header documentation](https://tools.ietf.org/html/rfc7230#section-4.2.3) .\n    public static let defaultAcceptEncoding: HTTPHeader = {\n        let encodings: [String]\n        if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) {\n            encodings = [\"br\", \"gzip\", \"deflate\"]\n        } else {\n            encodings = [\"gzip\", \"deflate\"]\n        }\n\n        return .acceptEncoding(encodings.qualityEncoded())\n    }()\n\n    /// Returns Alamofire's default `Accept-Language` header, generated by querying `Locale` for the user's\n    /// `preferredLanguages`.\n    ///\n    /// See the [Accept-Language HTTP header documentation](https://tools.ietf.org/html/rfc7231#section-5.3.5).\n    public static let defaultAcceptLanguage: HTTPHeader = {\n        .acceptLanguage(Locale.preferredLanguages.prefix(6).qualityEncoded())\n    }()\n\n    /// Returns Alamofire's default `User-Agent` header.\n    ///\n    /// See the [User-Agent header documentation](https://tools.ietf.org/html/rfc7231#section-5.5.3).\n    ///\n    /// Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0`\n    public static let defaultUserAgent: HTTPHeader = {\n        let info = Bundle.main.infoDictionary\n        let executable = (info?[kCFBundleExecutableKey as String] as? String) ??\n            (ProcessInfo.processInfo.arguments.first?.split(separator: \"/\").last.map(String.init)) ??\n            \"Unknown\"\n        let bundle = info?[kCFBundleIdentifierKey as String] as? String ?? \"Unknown\"\n        let appVersion = info?[\"CFBundleShortVersionString\"] as? String ?? \"Unknown\"\n        let appBuild = info?[kCFBundleVersionKey as String] as? String ?? \"Unknown\"\n\n        let osNameVersion: String = {\n            let version = ProcessInfo.processInfo.operatingSystemVersion\n            let versionString = \"\\(version.majorVersion).\\(version.minorVersion).\\(version.patchVersion)\"\n            let osName: String = {\n                #if os(iOS)\n                #if targetEnvironment(macCatalyst)\n                return \"macOS(Catalyst)\"\n                #else\n                return \"iOS\"\n                #endif\n                #elseif os(watchOS)\n                return \"watchOS\"\n                #elseif os(tvOS)\n                return \"tvOS\"\n                #elseif os(macOS)\n                return \"macOS\"\n                #elseif os(Linux)\n                return \"Linux\"\n                #elseif os(Windows)\n                return \"Windows\"\n                #else\n                return \"Unknown\"\n                #endif\n            }()\n\n            return \"\\(osName) \\(versionString)\"\n        }()\n\n        let alamofireVersion = \"Alamofire/\\(version)\"\n\n        let userAgent = \"\\(executable)/\\(appVersion) (\\(bundle); build:\\(appBuild); \\(osNameVersion)) \\(alamofireVersion)\"\n\n        return .userAgent(userAgent)\n    }()\n}\n\nextension Collection where Element == String {\n    func qualityEncoded() -> String {\n        enumerated().map { index, encoding in\n            let quality = 1.0 - (Double(index) * 0.1)\n            return \"\\(encoding);q=\\(quality)\"\n        }.joined(separator: \", \")\n    }\n}\n\n// MARK: - System Type Extensions\n\nextension URLRequest {\n    /// Returns `allHTTPHeaderFields` as `HTTPHeaders`.\n    public var headers: HTTPHeaders {\n        get { allHTTPHeaderFields.map(HTTPHeaders.init) ?? HTTPHeaders() }\n        set { allHTTPHeaderFields = newValue.dictionary }\n    }\n}\n\nextension HTTPURLResponse {\n    /// Returns `allHeaderFields` as `HTTPHeaders`.\n    public var headers: HTTPHeaders {\n        (allHeaderFields as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders()\n    }\n}\n\nextension URLSessionConfiguration {\n    /// Returns `httpAdditionalHeaders` as `HTTPHeaders`.\n    public var headers: HTTPHeaders {\n        get { (httpAdditionalHeaders as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() }\n        set { httpAdditionalHeaders = newValue.dictionary }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/HTTPMethod.swift",
    "content": "//\n//  HTTPMethod.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n/// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so\n/// `HTTPMethod.get != HTTPMethod(rawValue: \"get\")`.\n///\n/// See https://tools.ietf.org/html/rfc7231#section-4.3\npublic struct HTTPMethod: RawRepresentable, Equatable, Hashable {\n    /// `CONNECT` method.\n    public static let connect = HTTPMethod(rawValue: \"CONNECT\")\n    /// `DELETE` method.\n    public static let delete = HTTPMethod(rawValue: \"DELETE\")\n    /// `GET` method.\n    public static let get = HTTPMethod(rawValue: \"GET\")\n    /// `HEAD` method.\n    public static let head = HTTPMethod(rawValue: \"HEAD\")\n    /// `OPTIONS` method.\n    public static let options = HTTPMethod(rawValue: \"OPTIONS\")\n    /// `PATCH` method.\n    public static let patch = HTTPMethod(rawValue: \"PATCH\")\n    /// `POST` method.\n    public static let post = HTTPMethod(rawValue: \"POST\")\n    /// `PUT` method.\n    public static let put = HTTPMethod(rawValue: \"PUT\")\n    /// `TRACE` method.\n    public static let trace = HTTPMethod(rawValue: \"TRACE\")\n\n    public let rawValue: String\n\n    public init(rawValue: String) {\n        self.rawValue = rawValue\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/MultipartFormData.swift",
    "content": "//\n//  MultipartFormData.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(iOS) || os(watchOS) || os(tvOS)\nimport MobileCoreServices\n#elseif os(macOS)\nimport CoreServices\n#endif\n\n/// Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode\n/// multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead\n/// to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the\n/// data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for\n/// larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.\n///\n/// For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well\n/// and the w3 form documentation.\n///\n/// - https://www.ietf.org/rfc/rfc2388.txt\n/// - https://www.ietf.org/rfc/rfc2045.txt\n/// - https://www.w3.org/TR/html401/interact/forms.html#h-17.13\nopen class MultipartFormData {\n    // MARK: - Helper Types\n\n    enum EncodingCharacters {\n        static let crlf = \"\\r\\n\"\n    }\n\n    enum BoundaryGenerator {\n        enum BoundaryType {\n            case initial, encapsulated, final\n        }\n\n        static func randomBoundary() -> String {\n            let first = UInt32.random(in: UInt32.min...UInt32.max)\n            let second = UInt32.random(in: UInt32.min...UInt32.max)\n\n            return String(format: \"alamofire.boundary.%08x%08x\", first, second)\n        }\n\n        static func boundaryData(forBoundaryType boundaryType: BoundaryType, boundary: String) -> Data {\n            let boundaryText: String\n\n            switch boundaryType {\n            case .initial:\n                boundaryText = \"--\\(boundary)\\(EncodingCharacters.crlf)\"\n            case .encapsulated:\n                boundaryText = \"\\(EncodingCharacters.crlf)--\\(boundary)\\(EncodingCharacters.crlf)\"\n            case .final:\n                boundaryText = \"\\(EncodingCharacters.crlf)--\\(boundary)--\\(EncodingCharacters.crlf)\"\n            }\n\n            return Data(boundaryText.utf8)\n        }\n    }\n\n    class BodyPart {\n        let headers: HTTPHeaders\n        let bodyStream: InputStream\n        let bodyContentLength: UInt64\n        var hasInitialBoundary = false\n        var hasFinalBoundary = false\n\n        init(headers: HTTPHeaders, bodyStream: InputStream, bodyContentLength: UInt64) {\n            self.headers = headers\n            self.bodyStream = bodyStream\n            self.bodyContentLength = bodyContentLength\n        }\n    }\n\n    // MARK: - Properties\n\n    /// Default memory threshold used when encoding `MultipartFormData`, in bytes.\n    public static let encodingMemoryThreshold: UInt64 = 10_000_000\n\n    /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.\n    open lazy var contentType: String = \"multipart/form-data; boundary=\\(self.boundary)\"\n\n    /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries.\n    public var contentLength: UInt64 { bodyParts.reduce(0) { $0 + $1.bodyContentLength } }\n\n    /// The boundary used to separate the body parts in the encoded form data.\n    public let boundary: String\n\n    let fileManager: FileManager\n\n    private var bodyParts: [BodyPart]\n    private var bodyPartError: AFError?\n    private let streamBufferSize: Int\n\n    // MARK: - Lifecycle\n\n    /// Creates an instance.\n    ///\n    /// - Parameters:\n    ///   - fileManager: `FileManager` to use for file operations, if needed.\n    ///   - boundary: Boundary `String` used to separate body parts.\n    public init(fileManager: FileManager = .default, boundary: String? = nil) {\n        self.fileManager = fileManager\n        self.boundary = boundary ?? BoundaryGenerator.randomBoundary()\n        bodyParts = []\n\n        //\n        // The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more\n        // information, please refer to the following article:\n        //   - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html\n        //\n        streamBufferSize = 1024\n    }\n\n    // MARK: - Body Parts\n\n    /// Creates a body part from the data and appends it to the instance.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)\n    /// - `Content-Type: #{mimeType}` (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// - Parameters:\n    ///   - data:     `Data` to encoding into the instance.\n    ///   - name:     Name to associate with the `Data` in the `Content-Disposition` HTTP header.\n    ///   - fileName: Filename to associate with the `Data` in the `Content-Disposition` HTTP header.\n    ///   - mimeType: MIME type to associate with the data in the `Content-Type` HTTP header.\n    public func append(_ data: Data, withName name: String, fileName: String? = nil, mimeType: String? = nil) {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n        let stream = InputStream(data: data)\n        let length = UInt64(data.count)\n\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part from the file and appends it to the instance.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header)\n    /// - `Content-Type: #{generated mimeType}` (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// The filename in the `Content-Disposition` HTTP header is generated from the last path component of the\n    /// `fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the\n    /// system associated MIME type.\n    ///\n    /// - Parameters:\n    ///   - fileURL: `URL` of the file whose content will be encoded into the instance.\n    ///   - name:    Name to associate with the file content in the `Content-Disposition` HTTP header.\n    public func append(_ fileURL: URL, withName name: String) {\n        let fileName = fileURL.lastPathComponent\n        let pathExtension = fileURL.pathExtension\n\n        if !fileName.isEmpty && !pathExtension.isEmpty {\n            let mime = mimeType(forPathExtension: pathExtension)\n            append(fileURL, withName: name, fileName: fileName, mimeType: mime)\n        } else {\n            setBodyPartError(withReason: .bodyPartFilenameInvalid(in: fileURL))\n        }\n    }\n\n    /// Creates a body part from the file and appends it to the instance.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)\n    /// - Content-Type: #{mimeType} (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// - Parameters:\n    ///   - fileURL:  `URL` of the file whose content will be encoded into the instance.\n    ///   - name:     Name to associate with the file content in the `Content-Disposition` HTTP header.\n    ///   - fileName: Filename to associate with the file content in the `Content-Disposition` HTTP header.\n    ///   - mimeType: MIME type to associate with the file content in the `Content-Type` HTTP header.\n    public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String) {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n\n        //============================================================\n        //                 Check 1 - is file URL?\n        //============================================================\n\n        guard fileURL.isFileURL else {\n            setBodyPartError(withReason: .bodyPartURLInvalid(url: fileURL))\n            return\n        }\n\n        //============================================================\n        //              Check 2 - is file URL reachable?\n        //============================================================\n\n        do {\n            let isReachable = try fileURL.checkPromisedItemIsReachable()\n            guard isReachable else {\n                setBodyPartError(withReason: .bodyPartFileNotReachable(at: fileURL))\n                return\n            }\n        } catch {\n            setBodyPartError(withReason: .bodyPartFileNotReachableWithError(atURL: fileURL, error: error))\n            return\n        }\n\n        //============================================================\n        //            Check 3 - is file URL a directory?\n        //============================================================\n\n        var isDirectory: ObjCBool = false\n        let path = fileURL.path\n\n        guard fileManager.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else {\n            setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL))\n            return\n        }\n\n        //============================================================\n        //          Check 4 - can the file size be extracted?\n        //============================================================\n\n        let bodyContentLength: UInt64\n\n        do {\n            guard let fileSize = try fileManager.attributesOfItem(atPath: path)[.size] as? NSNumber else {\n                setBodyPartError(withReason: .bodyPartFileSizeNotAvailable(at: fileURL))\n                return\n            }\n\n            bodyContentLength = fileSize.uint64Value\n        } catch {\n            setBodyPartError(withReason: .bodyPartFileSizeQueryFailedWithError(forURL: fileURL, error: error))\n            return\n        }\n\n        //============================================================\n        //       Check 5 - can a stream be created from file URL?\n        //============================================================\n\n        guard let stream = InputStream(url: fileURL) else {\n            setBodyPartError(withReason: .bodyPartInputStreamCreationFailed(for: fileURL))\n            return\n        }\n\n        append(stream, withLength: bodyContentLength, headers: headers)\n    }\n\n    /// Creates a body part from the stream and appends it to the instance.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)\n    /// - `Content-Type: #{mimeType}` (HTTP Header)\n    /// - Encoded stream data\n    /// - Multipart form boundary\n    ///\n    /// - Parameters:\n    ///   - stream:   `InputStream` to encode into the instance.\n    ///   - length:   Length, in bytes, of the stream.\n    ///   - name:     Name to associate with the stream content in the `Content-Disposition` HTTP header.\n    ///   - fileName: Filename to associate with the stream content in the `Content-Disposition` HTTP header.\n    ///   - mimeType: MIME type to associate with the stream content in the `Content-Type` HTTP header.\n    public func append(_ stream: InputStream,\n                       withLength length: UInt64,\n                       name: String,\n                       fileName: String,\n                       mimeType: String) {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part with the stream, length, and headers and appends it to the instance.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - HTTP headers\n    /// - Encoded stream data\n    /// - Multipart form boundary\n    ///\n    /// - Parameters:\n    ///   - stream:  `InputStream` to encode into the instance.\n    ///   - length:  Length, in bytes, of the stream.\n    ///   - headers: `HTTPHeaders` for the body part.\n    public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders) {\n        let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length)\n        bodyParts.append(bodyPart)\n    }\n\n    // MARK: - Data Encoding\n\n    /// Encodes all appended body parts into a single `Data` value.\n    ///\n    /// - Note: This method will load all the appended body parts into memory all at the same time. This method should\n    ///         only be used when the encoded data will have a small memory footprint. For large data cases, please use\n    ///         the `writeEncodedData(to:))` method.\n    ///\n    /// - Returns: The encoded `Data`, if encoding is successful.\n    /// - Throws:  An `AFError` if encoding encounters an error.\n    public func encode() throws -> Data {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        var encoded = Data()\n\n        bodyParts.first?.hasInitialBoundary = true\n        bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in bodyParts {\n            let encodedData = try encode(bodyPart)\n            encoded.append(encodedData)\n        }\n\n        return encoded\n    }\n\n    /// Writes all appended body parts to the given file `URL`.\n    ///\n    /// This process is facilitated by reading and writing with input and output streams, respectively. Thus,\n    /// this approach is very memory efficient and should be used for large body part data.\n    ///\n    /// - Parameter fileURL: File `URL` to which to write the form data.\n    /// - Throws:            An `AFError` if encoding encounters an error.\n    public func writeEncodedData(to fileURL: URL) throws {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        if fileManager.fileExists(atPath: fileURL.path) {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamFileAlreadyExists(at: fileURL))\n        } else if !fileURL.isFileURL {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamURLInvalid(url: fileURL))\n        }\n\n        guard let outputStream = OutputStream(url: fileURL, append: false) else {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamCreationFailed(for: fileURL))\n        }\n\n        outputStream.open()\n        defer { outputStream.close() }\n\n        bodyParts.first?.hasInitialBoundary = true\n        bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in bodyParts {\n            try write(bodyPart, to: outputStream)\n        }\n    }\n\n    // MARK: - Private - Body Part Encoding\n\n    private func encode(_ bodyPart: BodyPart) throws -> Data {\n        var encoded = Data()\n\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        encoded.append(initialData)\n\n        let headerData = encodeHeaders(for: bodyPart)\n        encoded.append(headerData)\n\n        let bodyStreamData = try encodeBodyStream(for: bodyPart)\n        encoded.append(bodyStreamData)\n\n        if bodyPart.hasFinalBoundary {\n            encoded.append(finalBoundaryData())\n        }\n\n        return encoded\n    }\n\n    private func encodeHeaders(for bodyPart: BodyPart) -> Data {\n        let headerText = bodyPart.headers.map { \"\\($0.name): \\($0.value)\\(EncodingCharacters.crlf)\" }\n            .joined()\n            + EncodingCharacters.crlf\n\n        return Data(headerText.utf8)\n    }\n\n    private func encodeBodyStream(for bodyPart: BodyPart) throws -> Data {\n        let inputStream = bodyPart.bodyStream\n        inputStream.open()\n        defer { inputStream.close() }\n\n        var encoded = Data()\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](repeating: 0, count: streamBufferSize)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if let error = inputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error))\n            }\n\n            if bytesRead > 0 {\n                encoded.append(buffer, count: bytesRead)\n            } else {\n                break\n            }\n        }\n\n        guard UInt64(encoded.count) == bodyPart.bodyContentLength else {\n            let error = AFError.UnexpectedInputStreamLength(bytesExpected: bodyPart.bodyContentLength,\n                                                            bytesRead: UInt64(encoded.count))\n            throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error))\n        }\n\n        return encoded\n    }\n\n    // MARK: - Private - Writing Body Part to Output Stream\n\n    private func write(_ bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        try writeInitialBoundaryData(for: bodyPart, to: outputStream)\n        try writeHeaderData(for: bodyPart, to: outputStream)\n        try writeBodyStream(for: bodyPart, to: outputStream)\n        try writeFinalBoundaryData(for: bodyPart, to: outputStream)\n    }\n\n    private func writeInitialBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        return try write(initialData, to: outputStream)\n    }\n\n    private func writeHeaderData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let headerData = encodeHeaders(for: bodyPart)\n        return try write(headerData, to: outputStream)\n    }\n\n    private func writeBodyStream(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let inputStream = bodyPart.bodyStream\n\n        inputStream.open()\n        defer { inputStream.close() }\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](repeating: 0, count: streamBufferSize)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if let streamError = inputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: streamError))\n            }\n\n            if bytesRead > 0 {\n                if buffer.count != bytesRead {\n                    buffer = Array(buffer[0..<bytesRead])\n                }\n\n                try write(&buffer, to: outputStream)\n            } else {\n                break\n            }\n        }\n    }\n\n    private func writeFinalBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        if bodyPart.hasFinalBoundary {\n            return try write(finalBoundaryData(), to: outputStream)\n        }\n    }\n\n    // MARK: - Private - Writing Buffered Data to Output Stream\n\n    private func write(_ data: Data, to outputStream: OutputStream) throws {\n        var buffer = [UInt8](repeating: 0, count: data.count)\n        data.copyBytes(to: &buffer, count: data.count)\n\n        return try write(&buffer, to: outputStream)\n    }\n\n    private func write(_ buffer: inout [UInt8], to outputStream: OutputStream) throws {\n        var bytesToWrite = buffer.count\n\n        while bytesToWrite > 0, outputStream.hasSpaceAvailable {\n            let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite)\n\n            if let error = outputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .outputStreamWriteFailed(error: error))\n            }\n\n            bytesToWrite -= bytesWritten\n\n            if bytesToWrite > 0 {\n                buffer = Array(buffer[bytesWritten..<buffer.count])\n            }\n        }\n    }\n\n    // MARK: - Private - Mime Type\n\n    private func mimeType(forPathExtension pathExtension: String) -> String {\n        if\n            let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),\n            let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() {\n            return contentType as String\n        }\n\n        return \"application/octet-stream\"\n    }\n\n    // MARK: - Private - Content Headers\n\n    private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> HTTPHeaders {\n        var disposition = \"form-data; name=\\\"\\(name)\\\"\"\n        if let fileName = fileName { disposition += \"; filename=\\\"\\(fileName)\\\"\" }\n\n        var headers: HTTPHeaders = [.contentDisposition(disposition)]\n        if let mimeType = mimeType { headers.add(.contentType(mimeType)) }\n\n        return headers\n    }\n\n    // MARK: - Private - Boundary Encoding\n\n    private func initialBoundaryData() -> Data {\n        BoundaryGenerator.boundaryData(forBoundaryType: .initial, boundary: boundary)\n    }\n\n    private func encapsulatedBoundaryData() -> Data {\n        BoundaryGenerator.boundaryData(forBoundaryType: .encapsulated, boundary: boundary)\n    }\n\n    private func finalBoundaryData() -> Data {\n        BoundaryGenerator.boundaryData(forBoundaryType: .final, boundary: boundary)\n    }\n\n    // MARK: - Private - Errors\n\n    private func setBodyPartError(withReason reason: AFError.MultipartEncodingFailureReason) {\n        guard bodyPartError == nil else { return }\n        bodyPartError = AFError.multipartEncodingFailed(reason: reason)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/MultipartUpload.swift",
    "content": "//\n//  MultipartUpload.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Internal type which encapsulates a `MultipartFormData` upload.\nfinal class MultipartUpload {\n    lazy var result = Result { try build() }\n\n    @Protected\n    private(set) var multipartFormData: MultipartFormData\n    let encodingMemoryThreshold: UInt64\n    let request: URLRequestConvertible\n    let fileManager: FileManager\n\n    init(encodingMemoryThreshold: UInt64,\n         request: URLRequestConvertible,\n         multipartFormData: MultipartFormData) {\n        self.encodingMemoryThreshold = encodingMemoryThreshold\n        self.request = request\n        fileManager = multipartFormData.fileManager\n        self.multipartFormData = multipartFormData\n    }\n\n    func build() throws -> UploadRequest.Uploadable {\n        let uploadable: UploadRequest.Uploadable\n        if multipartFormData.contentLength < encodingMemoryThreshold {\n            let data = try multipartFormData.encode()\n\n            uploadable = .data(data)\n        } else {\n            let tempDirectoryURL = fileManager.temporaryDirectory\n            let directoryURL = tempDirectoryURL.appendingPathComponent(\"org.alamofire.manager/multipart.form.data\")\n            let fileName = UUID().uuidString\n            let fileURL = directoryURL.appendingPathComponent(fileName)\n\n            try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil)\n\n            do {\n                try multipartFormData.writeEncodedData(to: fileURL)\n            } catch {\n                // Cleanup after attempted write if it fails.\n                try? fileManager.removeItem(at: fileURL)\n                throw error\n            }\n\n            uploadable = .file(fileURL, shouldRemove: true)\n        }\n\n        return uploadable\n    }\n}\n\nextension MultipartUpload: UploadConvertible {\n    func asURLRequest() throws -> URLRequest {\n        var urlRequest = try request.asURLRequest()\n\n        $multipartFormData.read { multipartFormData in\n            urlRequest.headers.add(.contentType(multipartFormData.contentType))\n        }\n\n        return urlRequest\n    }\n\n    func createUploadable() throws -> UploadRequest.Uploadable {\n        try result.get()\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/NetworkReachabilityManager.swift",
    "content": "//\n//  NetworkReachabilityManager.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n#if !(os(watchOS) || os(Linux))\n\nimport Foundation\nimport SystemConfiguration\n\n/// The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both cellular and\n/// WiFi network interfaces.\n///\n/// Reachability can be used to determine background information about why a network operation failed, or to retry\n/// network requests when a connection is established. It should not be used to prevent a user from initiating a network\n/// request, as it's possible that an initial request may be required to establish reachability.\nopen class NetworkReachabilityManager {\n    /// Defines the various states of network reachability.\n    public enum NetworkReachabilityStatus {\n        /// It is unknown whether the network is reachable.\n        case unknown\n        /// The network is not reachable.\n        case notReachable\n        /// The network is reachable on the associated `ConnectionType`.\n        case reachable(ConnectionType)\n\n        init(_ flags: SCNetworkReachabilityFlags) {\n            guard flags.isActuallyReachable else { self = .notReachable; return }\n\n            var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi)\n\n            if flags.isCellular { networkStatus = .reachable(.cellular) }\n\n            self = networkStatus\n        }\n\n        /// Defines the various connection types detected by reachability flags.\n        public enum ConnectionType {\n            /// The connection type is either over Ethernet or WiFi.\n            case ethernetOrWiFi\n            /// The connection type is a cellular connection.\n            case cellular\n        }\n    }\n\n    /// A closure executed when the network reachability status changes. The closure takes a single argument: the\n    /// network reachability status.\n    public typealias Listener = (NetworkReachabilityStatus) -> Void\n\n    /// Default `NetworkReachabilityManager` for the zero address and a `listenerQueue` of `.main`.\n    public static let `default` = NetworkReachabilityManager()\n\n    // MARK: - Properties\n\n    /// Whether the network is currently reachable.\n    open var isReachable: Bool { isReachableOnCellular || isReachableOnEthernetOrWiFi }\n\n    /// Whether the network is currently reachable over the cellular interface.\n    ///\n    /// - Note: Using this property to decide whether to make a high or low bandwidth request is not recommended.\n    ///         Instead, set the `allowsCellularAccess` on any `URLRequest`s being issued.\n    ///\n    open var isReachableOnCellular: Bool { status == .reachable(.cellular) }\n\n    /// Whether the network is currently reachable over Ethernet or WiFi interface.\n    open var isReachableOnEthernetOrWiFi: Bool { status == .reachable(.ethernetOrWiFi) }\n\n    /// `DispatchQueue` on which reachability will update.\n    public let reachabilityQueue = DispatchQueue(label: \"org.alamofire.reachabilityQueue\")\n\n    /// Flags of the current reachability type, if any.\n    open var flags: SCNetworkReachabilityFlags? {\n        var flags = SCNetworkReachabilityFlags()\n\n        return (SCNetworkReachabilityGetFlags(reachability, &flags)) ? flags : nil\n    }\n\n    /// The current network reachability status.\n    open var status: NetworkReachabilityStatus {\n        flags.map(NetworkReachabilityStatus.init) ?? .unknown\n    }\n\n    /// Mutable state storage.\n    struct MutableState {\n        /// A closure executed when the network reachability status changes.\n        var listener: Listener?\n        /// `DispatchQueue` on which listeners will be called.\n        var listenerQueue: DispatchQueue?\n        /// Previously calculated status.\n        var previousStatus: NetworkReachabilityStatus?\n    }\n\n    /// `SCNetworkReachability` instance providing notifications.\n    private let reachability: SCNetworkReachability\n\n    /// Protected storage for mutable state.\n    @Protected\n    private var mutableState = MutableState()\n\n    // MARK: - Initialization\n\n    /// Creates an instance with the specified host.\n    ///\n    /// - Note: The `host` value must *not* contain a scheme, just the hostname.\n    ///\n    /// - Parameters:\n    ///   - host:          Host used to evaluate network reachability. Must *not* include the scheme (e.g. `https`).\n    public convenience init?(host: String) {\n        guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil }\n\n        self.init(reachability: reachability)\n    }\n\n    /// Creates an instance that monitors the address 0.0.0.0.\n    ///\n    /// Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing\n    /// status of the device, both IPv4 and IPv6.\n    public convenience init?() {\n        var zero = sockaddr()\n        zero.sa_len = UInt8(MemoryLayout<sockaddr>.size)\n        zero.sa_family = sa_family_t(AF_INET)\n\n        guard let reachability = SCNetworkReachabilityCreateWithAddress(nil, &zero) else { return nil }\n\n        self.init(reachability: reachability)\n    }\n\n    private init(reachability: SCNetworkReachability) {\n        self.reachability = reachability\n    }\n\n    deinit {\n        stopListening()\n    }\n\n    // MARK: - Listening\n\n    /// Starts listening for changes in network reachability status.\n    ///\n    /// - Note: Stops and removes any existing listener.\n    ///\n    /// - Parameters:\n    ///   - queue:    `DispatchQueue` on which to call the `listener` closure. `.main` by default.\n    ///   - listener: `Listener` closure called when reachability changes.\n    ///\n    /// - Returns: `true` if listening was started successfully, `false` otherwise.\n    @discardableResult\n    open func startListening(onQueue queue: DispatchQueue = .main,\n                             onUpdatePerforming listener: @escaping Listener) -> Bool {\n        stopListening()\n\n        $mutableState.write { state in\n            state.listenerQueue = queue\n            state.listener = listener\n        }\n\n        var context = SCNetworkReachabilityContext(version: 0,\n                                                   info: Unmanaged.passUnretained(self).toOpaque(),\n                                                   retain: nil,\n                                                   release: nil,\n                                                   copyDescription: nil)\n        let callback: SCNetworkReachabilityCallBack = { _, flags, info in\n            guard let info = info else { return }\n\n            let instance = Unmanaged<NetworkReachabilityManager>.fromOpaque(info).takeUnretainedValue()\n            instance.notifyListener(flags)\n        }\n\n        let queueAdded = SCNetworkReachabilitySetDispatchQueue(reachability, reachabilityQueue)\n        let callbackAdded = SCNetworkReachabilitySetCallback(reachability, callback, &context)\n\n        // Manually call listener to give initial state, since the framework may not.\n        if let currentFlags = flags {\n            reachabilityQueue.async {\n                self.notifyListener(currentFlags)\n            }\n        }\n\n        return callbackAdded && queueAdded\n    }\n\n    /// Stops listening for changes in network reachability status.\n    open func stopListening() {\n        SCNetworkReachabilitySetCallback(reachability, nil, nil)\n        SCNetworkReachabilitySetDispatchQueue(reachability, nil)\n        $mutableState.write { state in\n            state.listener = nil\n            state.listenerQueue = nil\n            state.previousStatus = nil\n        }\n    }\n\n    // MARK: - Internal - Listener Notification\n\n    /// Calls the `listener` closure of the `listenerQueue` if the computed status hasn't changed.\n    ///\n    /// - Note: Should only be called from the `reachabilityQueue`.\n    ///\n    /// - Parameter flags: `SCNetworkReachabilityFlags` to use to calculate the status.\n    func notifyListener(_ flags: SCNetworkReachabilityFlags) {\n        let newStatus = NetworkReachabilityStatus(flags)\n\n        $mutableState.write { state in\n            guard state.previousStatus != newStatus else { return }\n\n            state.previousStatus = newStatus\n\n            let listener = state.listener\n            state.listenerQueue?.async { listener?(newStatus) }\n        }\n    }\n}\n\n// MARK: -\n\nextension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {}\n\nextension SCNetworkReachabilityFlags {\n    var isReachable: Bool { contains(.reachable) }\n    var isConnectionRequired: Bool { contains(.connectionRequired) }\n    var canConnectAutomatically: Bool { contains(.connectionOnDemand) || contains(.connectionOnTraffic) }\n    var canConnectWithoutUserInteraction: Bool { canConnectAutomatically && !contains(.interventionRequired) }\n    var isActuallyReachable: Bool { isReachable && (!isConnectionRequired || canConnectWithoutUserInteraction) }\n    var isCellular: Bool {\n        #if os(iOS) || os(tvOS)\n        return contains(.isWWAN)\n        #else\n        return false\n        #endif\n    }\n\n    /// Human readable `String` for all states, to help with debugging.\n    var readableDescription: String {\n        let W = isCellular ? \"W\" : \"-\"\n        let R = isReachable ? \"R\" : \"-\"\n        let c = isConnectionRequired ? \"c\" : \"-\"\n        let t = contains(.transientConnection) ? \"t\" : \"-\"\n        let i = contains(.interventionRequired) ? \"i\" : \"-\"\n        let C = contains(.connectionOnTraffic) ? \"C\" : \"-\"\n        let D = contains(.connectionOnDemand) ? \"D\" : \"-\"\n        let l = contains(.isLocalAddress) ? \"l\" : \"-\"\n        let d = contains(.isDirect) ? \"d\" : \"-\"\n        let a = contains(.connectionAutomatic) ? \"a\" : \"-\"\n\n        return \"\\(W)\\(R) \\(c)\\(t)\\(i)\\(C)\\(D)\\(l)\\(d)\\(a)\"\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/Notifications.swift",
    "content": "//\n//  Notifications.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension Request {\n    /// Posted when a `Request` is resumed. The `Notification` contains the resumed `Request`.\n    public static let didResumeNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didResume\")\n    /// Posted when a `Request` is suspended. The `Notification` contains the suspended `Request`.\n    public static let didSuspendNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didSuspend\")\n    /// Posted when a `Request` is cancelled. The `Notification` contains the cancelled `Request`.\n    public static let didCancelNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didCancel\")\n    /// Posted when a `Request` is finished. The `Notification` contains the completed `Request`.\n    public static let didFinishNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didFinish\")\n\n    /// Posted when a `URLSessionTask` is resumed. The `Notification` contains the `Request` associated with the `URLSessionTask`.\n    public static let didResumeTaskNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didResumeTask\")\n    /// Posted when a `URLSessionTask` is suspended. The `Notification` contains the `Request` associated with the `URLSessionTask`.\n    public static let didSuspendTaskNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didSuspendTask\")\n    /// Posted when a `URLSessionTask` is cancelled. The `Notification` contains the `Request` associated with the `URLSessionTask`.\n    public static let didCancelTaskNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didCancelTask\")\n    /// Posted when a `URLSessionTask` is completed. The `Notification` contains the `Request` associated with the `URLSessionTask`.\n    public static let didCompleteTaskNotification = Notification.Name(rawValue: \"org.alamofire.notification.name.request.didCompleteTask\")\n}\n\n// MARK: -\n\nextension Notification {\n    /// The `Request` contained by the instance's `userInfo`, `nil` otherwise.\n    public var request: Request? {\n        userInfo?[String.requestKey] as? Request\n    }\n\n    /// Convenience initializer for a `Notification` containing a `Request` payload.\n    ///\n    /// - Parameters:\n    ///   - name:    The name of the notification.\n    ///   - request: The `Request` payload.\n    init(name: Notification.Name, request: Request) {\n        self.init(name: name, object: nil, userInfo: [String.requestKey: request])\n    }\n}\n\nextension NotificationCenter {\n    /// Convenience function for posting notifications with `Request` payloads.\n    ///\n    /// - Parameters:\n    ///   - name:    The name of the notification.\n    ///   - request: The `Request` payload.\n    func postNotification(named name: Notification.Name, with request: Request) {\n        let notification = Notification(name: name, request: request)\n        post(notification)\n    }\n}\n\nextension String {\n    /// User info dictionary key representing the `Request` associated with the notification.\n    fileprivate static let requestKey = \"org.alamofire.notification.key.request\"\n}\n\n/// `EventMonitor` that provides Alamofire's notifications.\npublic final class AlamofireNotifications: EventMonitor {\n    public func requestDidResume(_ request: Request) {\n        NotificationCenter.default.postNotification(named: Request.didResumeNotification, with: request)\n    }\n\n    public func requestDidSuspend(_ request: Request) {\n        NotificationCenter.default.postNotification(named: Request.didSuspendNotification, with: request)\n    }\n\n    public func requestDidCancel(_ request: Request) {\n        NotificationCenter.default.postNotification(named: Request.didCancelNotification, with: request)\n    }\n\n    public func requestDidFinish(_ request: Request) {\n        NotificationCenter.default.postNotification(named: Request.didFinishNotification, with: request)\n    }\n\n    public func request(_ request: Request, didResumeTask task: URLSessionTask) {\n        NotificationCenter.default.postNotification(named: Request.didResumeTaskNotification, with: request)\n    }\n\n    public func request(_ request: Request, didSuspendTask task: URLSessionTask) {\n        NotificationCenter.default.postNotification(named: Request.didSuspendTaskNotification, with: request)\n    }\n\n    public func request(_ request: Request, didCancelTask task: URLSessionTask) {\n        NotificationCenter.default.postNotification(named: Request.didCancelTaskNotification, with: request)\n    }\n\n    public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {\n        NotificationCenter.default.postNotification(named: Request.didCompleteTaskNotification, with: request)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/OperationQueue+Alamofire.swift",
    "content": "//\n//  OperationQueue+Alamofire.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension OperationQueue {\n    /// Creates an instance using the provided parameters.\n    ///\n    /// - Parameters:\n    ///   - qualityOfService:            `QualityOfService` to be applied to the queue. `.default` by default.\n    ///   - maxConcurrentOperationCount: Maximum concurrent operations.\n    ///                                  `OperationQueue.defaultMaxConcurrentOperationCount` by default.\n    ///   - underlyingQueue: Underlying  `DispatchQueue`. `nil` by default.\n    ///   - name:                        Name for the queue. `nil` by default.\n    ///   - startSuspended:              Whether the queue starts suspended. `false` by default.\n    convenience init(qualityOfService: QualityOfService = .default,\n                     maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount,\n                     underlyingQueue: DispatchQueue? = nil,\n                     name: String? = nil,\n                     startSuspended: Bool = false) {\n        self.init()\n        self.qualityOfService = qualityOfService\n        self.maxConcurrentOperationCount = maxConcurrentOperationCount\n        self.underlyingQueue = underlyingQueue\n        self.name = name\n        isSuspended = startSuspended\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ParameterEncoder.swift",
    "content": "//\n//  ParameterEncoder.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that can encode any `Encodable` type into a `URLRequest`.\npublic protocol ParameterEncoder {\n    /// Encode the provided `Encodable` parameters into `request`.\n    ///\n    /// - Parameters:\n    ///   - parameters: The `Encodable` parameter value.\n    ///   - request:    The `URLRequest` into which to encode the parameters.\n    ///\n    /// - Returns:      A `URLRequest` with the result of the encoding.\n    /// - Throws:       An `Error` when encoding fails. For Alamofire provided encoders, this will be an instance of\n    ///                 `AFError.parameterEncoderFailed` with an associated `ParameterEncoderFailureReason`.\n    func encode<Parameters: Encodable>(_ parameters: Parameters?, into request: URLRequest) throws -> URLRequest\n}\n\n/// A `ParameterEncoder` that encodes types as JSON body data.\n///\n/// If no `Content-Type` header is already set on the provided `URLRequest`s, it's set to `application/json`.\nopen class JSONParameterEncoder: ParameterEncoder {\n    /// Returns an encoder with default parameters.\n    public static var `default`: JSONParameterEncoder { JSONParameterEncoder() }\n\n    /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.prettyPrinted`.\n    public static var prettyPrinted: JSONParameterEncoder {\n        let encoder = JSONEncoder()\n        encoder.outputFormatting = .prettyPrinted\n\n        return JSONParameterEncoder(encoder: encoder)\n    }\n\n    /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.sortedKeys`.\n    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)\n    public static var sortedKeys: JSONParameterEncoder {\n        let encoder = JSONEncoder()\n        encoder.outputFormatting = .sortedKeys\n\n        return JSONParameterEncoder(encoder: encoder)\n    }\n\n    /// `JSONEncoder` used to encode parameters.\n    public let encoder: JSONEncoder\n\n    /// Creates an instance with the provided `JSONEncoder`.\n    ///\n    /// - Parameter encoder: The `JSONEncoder`. `JSONEncoder()` by default.\n    public init(encoder: JSONEncoder = JSONEncoder()) {\n        self.encoder = encoder\n    }\n\n    open func encode<Parameters: Encodable>(_ parameters: Parameters?,\n                                            into request: URLRequest) throws -> URLRequest {\n        guard let parameters = parameters else { return request }\n\n        var request = request\n\n        do {\n            let data = try encoder.encode(parameters)\n            request.httpBody = data\n            if request.headers[\"Content-Type\"] == nil {\n                request.headers.update(.contentType(\"application/json\"))\n            }\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))\n        }\n\n        return request\n    }\n}\n\n/// A `ParameterEncoder` that encodes types as URL-encoded query strings to be set on the URL or as body data, depending\n/// on the `Destination` set.\n///\n/// If no `Content-Type` header is already set on the provided `URLRequest`s, it will be set to\n/// `application/x-www-form-urlencoded; charset=utf-8`.\n///\n/// Encoding behavior can be customized by passing an instance of `URLEncodedFormEncoder` to the initializer.\nopen class URLEncodedFormParameterEncoder: ParameterEncoder {\n    /// Defines where the URL-encoded string should be set for each `URLRequest`.\n    public enum Destination {\n        /// Applies the encoded query string to any existing query string for `.get`, `.head`, and `.delete` request.\n        /// Sets it to the `httpBody` for all other methods.\n        case methodDependent\n        /// Applies the encoded query string to any existing query string from the `URLRequest`.\n        case queryString\n        /// Applies the encoded query string to the `httpBody` of the `URLRequest`.\n        case httpBody\n\n        /// Determines whether the URL-encoded string should be applied to the `URLRequest`'s `url`.\n        ///\n        /// - Parameter method: The `HTTPMethod`.\n        ///\n        /// - Returns:          Whether the URL-encoded string should be applied to a `URL`.\n        func encodesParametersInURL(for method: HTTPMethod) -> Bool {\n            switch self {\n            case .methodDependent: return [.get, .head, .delete].contains(method)\n            case .queryString: return true\n            case .httpBody: return false\n            }\n        }\n    }\n\n    /// Returns an encoder with default parameters.\n    public static var `default`: URLEncodedFormParameterEncoder { URLEncodedFormParameterEncoder() }\n\n    /// The `URLEncodedFormEncoder` to use.\n    public let encoder: URLEncodedFormEncoder\n\n    /// The `Destination` for the URL-encoded string.\n    public let destination: Destination\n\n    /// Creates an instance with the provided `URLEncodedFormEncoder` instance and `Destination` value.\n    ///\n    /// - Parameters:\n    ///   - encoder:     The `URLEncodedFormEncoder`. `URLEncodedFormEncoder()` by default.\n    ///   - destination: The `Destination`. `.methodDependent` by default.\n    public init(encoder: URLEncodedFormEncoder = URLEncodedFormEncoder(), destination: Destination = .methodDependent) {\n        self.encoder = encoder\n        self.destination = destination\n    }\n\n    open func encode<Parameters: Encodable>(_ parameters: Parameters?,\n                                            into request: URLRequest) throws -> URLRequest {\n        guard let parameters = parameters else { return request }\n\n        var request = request\n\n        guard let url = request.url else {\n            throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url))\n        }\n\n        guard let method = request.method else {\n            let rawValue = request.method?.rawValue ?? \"nil\"\n            throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.httpMethod(rawValue: rawValue)))\n        }\n\n        if destination.encodesParametersInURL(for: method),\n           var components = URLComponents(url: url, resolvingAgainstBaseURL: false) {\n            let query: String = try Result<String, Error> { try encoder.encode(parameters) }\n                .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get()\n            let newQueryString = [components.percentEncodedQuery, query].compactMap { $0 }.joinedWithAmpersands()\n            components.percentEncodedQuery = newQueryString.isEmpty ? nil : newQueryString\n\n            guard let newURL = components.url else {\n                throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url))\n            }\n\n            request.url = newURL\n        } else {\n            if request.headers[\"Content-Type\"] == nil {\n                request.headers.update(.contentType(\"application/x-www-form-urlencoded; charset=utf-8\"))\n            }\n\n            request.httpBody = try Result<Data, Error> { try encoder.encode(parameters) }\n                .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get()\n        }\n\n        return request\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ParameterEncoding.swift",
    "content": "//\n//  ParameterEncoding.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A dictionary of parameters to apply to a `URLRequest`.\npublic typealias Parameters = [String: Any]\n\n/// A type used to define how a set of parameters are applied to a `URLRequest`.\npublic protocol ParameterEncoding {\n    /// Creates a `URLRequest` by encoding parameters and applying them on the passed request.\n    ///\n    /// - Parameters:\n    ///   - urlRequest: `URLRequestConvertible` value onto which parameters will be encoded.\n    ///   - parameters: `Parameters` to encode onto the request.\n    ///\n    /// - Returns:      The encoded `URLRequest`.\n    /// - Throws:       Any `Error` produced during parameter encoding.\n    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest\n}\n\n// MARK: -\n\n/// Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP\n/// body of the URL request. Whether the query string is set or appended to any existing URL query string or set as\n/// the HTTP body depends on the destination of the encoding.\n///\n/// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to\n/// `application/x-www-form-urlencoded; charset=utf-8`.\n///\n/// There is no published specification for how to encode collection types. By default the convention of appending\n/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for\n/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the\n/// square brackets appended to array keys.\n///\n/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode\n/// `true` as 1 and `false` as 0.\npublic struct URLEncoding: ParameterEncoding {\n    // MARK: Helper Types\n\n    /// Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the\n    /// resulting URL request.\n    public enum Destination {\n        /// Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and\n        /// sets as the HTTP body for requests with any other HTTP method.\n        case methodDependent\n        /// Sets or appends encoded query string result to existing query string.\n        case queryString\n        /// Sets encoded query string result as the HTTP body of the URL request.\n        case httpBody\n\n        func encodesParametersInURL(for method: HTTPMethod) -> Bool {\n            switch self {\n            case .methodDependent: return [.get, .head, .delete].contains(method)\n            case .queryString: return true\n            case .httpBody: return false\n            }\n        }\n    }\n\n    /// Configures how `Array` parameters are encoded.\n    public enum ArrayEncoding {\n        /// An empty set of square brackets is appended to the key for every value. This is the default behavior.\n        case brackets\n        /// No brackets are appended. The key is encoded as is.\n        case noBrackets\n\n        func encode(key: String) -> String {\n            switch self {\n            case .brackets:\n                return \"\\(key)[]\"\n            case .noBrackets:\n                return key\n            }\n        }\n    }\n\n    /// Configures how `Bool` parameters are encoded.\n    public enum BoolEncoding {\n        /// Encode `true` as `1` and `false` as `0`. This is the default behavior.\n        case numeric\n        /// Encode `true` and `false` as string literals.\n        case literal\n\n        func encode(value: Bool) -> String {\n            switch self {\n            case .numeric:\n                return value ? \"1\" : \"0\"\n            case .literal:\n                return value ? \"true\" : \"false\"\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    /// Returns a default `URLEncoding` instance with a `.methodDependent` destination.\n    public static var `default`: URLEncoding { URLEncoding() }\n\n    /// Returns a `URLEncoding` instance with a `.queryString` destination.\n    public static var queryString: URLEncoding { URLEncoding(destination: .queryString) }\n\n    /// Returns a `URLEncoding` instance with an `.httpBody` destination.\n    public static var httpBody: URLEncoding { URLEncoding(destination: .httpBody) }\n\n    /// The destination defining where the encoded query string is to be applied to the URL request.\n    public let destination: Destination\n\n    /// The encoding to use for `Array` parameters.\n    public let arrayEncoding: ArrayEncoding\n\n    /// The encoding to use for `Bool` parameters.\n    public let boolEncoding: BoolEncoding\n\n    // MARK: Initialization\n\n    /// Creates an instance using the specified parameters.\n    ///\n    /// - Parameters:\n    ///   - destination:   `Destination` defining where the encoded query string will be applied. `.methodDependent` by\n    ///                    default.\n    ///   - arrayEncoding: `ArrayEncoding` to use. `.brackets` by default.\n    ///   - boolEncoding:  `BoolEncoding` to use. `.numeric` by default.\n    public init(destination: Destination = .methodDependent,\n                arrayEncoding: ArrayEncoding = .brackets,\n                boolEncoding: BoolEncoding = .numeric) {\n        self.destination = destination\n        self.arrayEncoding = arrayEncoding\n        self.boolEncoding = boolEncoding\n    }\n\n    // MARK: Encoding\n\n    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let parameters = parameters else { return urlRequest }\n\n        if let method = urlRequest.method, destination.encodesParametersInURL(for: method) {\n            guard let url = urlRequest.url else {\n                throw AFError.parameterEncodingFailed(reason: .missingURL)\n            }\n\n            if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty {\n                let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + \"&\" } ?? \"\") + query(parameters)\n                urlComponents.percentEncodedQuery = percentEncodedQuery\n                urlRequest.url = urlComponents.url\n            }\n        } else {\n            if urlRequest.headers[\"Content-Type\"] == nil {\n                urlRequest.headers.update(.contentType(\"application/x-www-form-urlencoded; charset=utf-8\"))\n            }\n\n            urlRequest.httpBody = Data(query(parameters).utf8)\n        }\n\n        return urlRequest\n    }\n\n    /// Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively.\n    ///\n    /// - Parameters:\n    ///   - key:   Key of the query component.\n    ///   - value: Value of the query component.\n    ///\n    /// - Returns: The percent-escaped, URL encoded query string components.\n    public func queryComponents(fromKey key: String, value: Any) -> [(String, String)] {\n        var components: [(String, String)] = []\n        switch value {\n        case let dictionary as [String: Any]:\n            for (nestedKey, value) in dictionary {\n                components += queryComponents(fromKey: \"\\(key)[\\(nestedKey)]\", value: value)\n            }\n        case let array as [Any]:\n            for value in array {\n                components += queryComponents(fromKey: arrayEncoding.encode(key: key), value: value)\n            }\n        case let number as NSNumber:\n            if number.isBool {\n                components.append((escape(key), escape(boolEncoding.encode(value: number.boolValue))))\n            } else {\n                components.append((escape(key), escape(\"\\(number)\")))\n            }\n        case let bool as Bool:\n            components.append((escape(key), escape(boolEncoding.encode(value: bool))))\n        default:\n            components.append((escape(key), escape(\"\\(value)\")))\n        }\n        return components\n    }\n\n    /// Creates a percent-escaped string following RFC 3986 for a query string key or value.\n    ///\n    /// - Parameter string: `String` to be percent-escaped.\n    ///\n    /// - Returns:          The percent-escaped `String`.\n    public func escape(_ string: String) -> String {\n        string.addingPercentEncoding(withAllowedCharacters: .afURLQueryAllowed) ?? string\n    }\n\n    private func query(_ parameters: [String: Any]) -> String {\n        var components: [(String, String)] = []\n\n        for key in parameters.keys.sorted(by: <) {\n            let value = parameters[key]!\n            components += queryComponents(fromKey: key, value: value)\n        }\n        return components.map { \"\\($0)=\\($1)\" }.joined(separator: \"&\")\n    }\n}\n\n// MARK: -\n\n/// Uses `JSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the\n/// request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.\npublic struct JSONEncoding: ParameterEncoding {\n    // MARK: Properties\n\n    /// Returns a `JSONEncoding` instance with default writing options.\n    public static var `default`: JSONEncoding { JSONEncoding() }\n\n    /// Returns a `JSONEncoding` instance with `.prettyPrinted` writing options.\n    public static var prettyPrinted: JSONEncoding { JSONEncoding(options: .prettyPrinted) }\n\n    /// The options for writing the parameters as JSON data.\n    public let options: JSONSerialization.WritingOptions\n\n    // MARK: Initialization\n\n    /// Creates an instance using the specified `WritingOptions`.\n    ///\n    /// - Parameter options: `JSONSerialization.WritingOptions` to use.\n    public init(options: JSONSerialization.WritingOptions = []) {\n        self.options = options\n    }\n\n    // MARK: Encoding\n\n    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let parameters = parameters else { return urlRequest }\n\n        do {\n            let data = try JSONSerialization.data(withJSONObject: parameters, options: options)\n\n            if urlRequest.headers[\"Content-Type\"] == nil {\n                urlRequest.headers.update(.contentType(\"application/json\"))\n            }\n\n            urlRequest.httpBody = data\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))\n        }\n\n        return urlRequest\n    }\n\n    /// Encodes any JSON compatible object into a `URLRequest`.\n    ///\n    /// - Parameters:\n    ///   - urlRequest: `URLRequestConvertible` value into which the object will be encoded.\n    ///   - jsonObject: `Any` value (must be JSON compatible` to be encoded into the `URLRequest`. `nil` by default.\n    ///\n    /// - Returns:      The encoded `URLRequest`.\n    /// - Throws:       Any `Error` produced during encoding.\n    public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let jsonObject = jsonObject else { return urlRequest }\n\n        do {\n            let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options)\n\n            if urlRequest.headers[\"Content-Type\"] == nil {\n                urlRequest.headers.update(.contentType(\"application/json\"))\n            }\n\n            urlRequest.httpBody = data\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))\n        }\n\n        return urlRequest\n    }\n}\n\n// MARK: -\n\nextension NSNumber {\n    fileprivate var isBool: Bool {\n        // Use Obj-C type encoding to check whether the underlying type is a `Bool`, as it's guaranteed as part of\n        // swift-corelibs-foundation, per [this discussion on the Swift forums](https://forums.swift.org/t/alamofire-on-linux-possible-but-not-release-ready/34553/22).\n        String(cString: objCType) == \"c\"\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Protected.swift",
    "content": "//\n//  Protected.swift\n//\n//  Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nprivate protocol Lock {\n    func lock()\n    func unlock()\n}\n\nextension Lock {\n    /// Executes a closure returning a value while acquiring the lock.\n    ///\n    /// - Parameter closure: The closure to run.\n    ///\n    /// - Returns:           The value the closure generated.\n    func around<T>(_ closure: () -> T) -> T {\n        lock(); defer { unlock() }\n        return closure()\n    }\n\n    /// Execute a closure while acquiring the lock.\n    ///\n    /// - Parameter closure: The closure to run.\n    func around(_ closure: () -> Void) {\n        lock(); defer { unlock() }\n        closure()\n    }\n}\n\n#if os(Linux)\n/// A `pthread_mutex_t` wrapper.\nfinal class MutexLock: Lock {\n    private var mutex: UnsafeMutablePointer<pthread_mutex_t>\n\n    init() {\n        mutex = .allocate(capacity: 1)\n\n        var attr = pthread_mutexattr_t()\n        pthread_mutexattr_init(&attr)\n        pthread_mutexattr_settype(&attr, .init(PTHREAD_MUTEX_ERRORCHECK))\n\n        let error = pthread_mutex_init(mutex, &attr)\n        precondition(error == 0, \"Failed to create pthread_mutex\")\n    }\n\n    deinit {\n        let error = pthread_mutex_destroy(mutex)\n        precondition(error == 0, \"Failed to destroy pthread_mutex\")\n    }\n\n    fileprivate func lock() {\n        let error = pthread_mutex_lock(mutex)\n        precondition(error == 0, \"Failed to lock pthread_mutex\")\n    }\n\n    fileprivate func unlock() {\n        let error = pthread_mutex_unlock(mutex)\n        precondition(error == 0, \"Failed to unlock pthread_mutex\")\n    }\n}\n#endif\n\n#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)\n/// An `os_unfair_lock` wrapper.\nfinal class UnfairLock: Lock {\n    private let unfairLock: os_unfair_lock_t\n\n    init() {\n        unfairLock = .allocate(capacity: 1)\n        unfairLock.initialize(to: os_unfair_lock())\n    }\n\n    deinit {\n        unfairLock.deinitialize(count: 1)\n        unfairLock.deallocate()\n    }\n\n    fileprivate func lock() {\n        os_unfair_lock_lock(unfairLock)\n    }\n\n    fileprivate func unlock() {\n        os_unfair_lock_unlock(unfairLock)\n    }\n}\n#endif\n\n/// A thread-safe wrapper around a value.\n@propertyWrapper\n@dynamicMemberLookup\nfinal class Protected<T> {\n    #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)\n    private let lock = UnfairLock()\n    #elseif os(Linux)\n    private let lock = MutexLock()\n    #endif\n    private var value: T\n\n    init(_ value: T) {\n        self.value = value\n    }\n\n    /// The contained value. Unsafe for anything more than direct read or write.\n    var wrappedValue: T {\n        get { lock.around { value } }\n        set { lock.around { value = newValue } }\n    }\n\n    var projectedValue: Protected<T> { self }\n\n    init(wrappedValue: T) {\n        value = wrappedValue\n    }\n\n    /// Synchronously read or transform the contained value.\n    ///\n    /// - Parameter closure: The closure to execute.\n    ///\n    /// - Returns:           The return value of the closure passed.\n    func read<U>(_ closure: (T) -> U) -> U {\n        lock.around { closure(self.value) }\n    }\n\n    /// Synchronously modify the protected value.\n    ///\n    /// - Parameter closure: The closure to execute.\n    ///\n    /// - Returns:           The modified value.\n    @discardableResult\n    func write<U>(_ closure: (inout T) -> U) -> U {\n        lock.around { closure(&self.value) }\n    }\n\n    subscript<Property>(dynamicMember keyPath: WritableKeyPath<T, Property>) -> Property {\n        get { lock.around { value[keyPath: keyPath] } }\n        set { lock.around { value[keyPath: keyPath] = newValue } }\n    }\n}\n\nextension Protected where T: RangeReplaceableCollection {\n    /// Adds a new element to the end of this protected collection.\n    ///\n    /// - Parameter newElement: The `Element` to append.\n    func append(_ newElement: T.Element) {\n        write { (ward: inout T) in\n            ward.append(newElement)\n        }\n    }\n\n    /// Adds the elements of a sequence to the end of this protected collection.\n    ///\n    /// - Parameter newElements: The `Sequence` to append.\n    func append<S: Sequence>(contentsOf newElements: S) where S.Element == T.Element {\n        write { (ward: inout T) in\n            ward.append(contentsOf: newElements)\n        }\n    }\n\n    /// Add the elements of a collection to the end of the protected collection.\n    ///\n    /// - Parameter newElements: The `Collection` to append.\n    func append<C: Collection>(contentsOf newElements: C) where C.Element == T.Element {\n        write { (ward: inout T) in\n            ward.append(contentsOf: newElements)\n        }\n    }\n}\n\nextension Protected where T == Data? {\n    /// Adds the contents of a `Data` value to the end of the protected `Data`.\n    ///\n    /// - Parameter data: The `Data` to be appended.\n    func append(_ data: Data) {\n        write { (ward: inout T) in\n            ward?.append(data)\n        }\n    }\n}\n\nextension Protected where T == Request.MutableState {\n    /// Attempts to transition to the passed `State`.\n    ///\n    /// - Parameter state: The `State` to attempt transition to.\n    ///\n    /// - Returns:         Whether the transition occurred.\n    func attemptToTransitionTo(_ state: Request.State) -> Bool {\n        lock.around {\n            guard value.state.canTransitionTo(state) else { return false }\n\n            value.state = state\n\n            return true\n        }\n    }\n\n    /// Perform a closure while locked with the provided `Request.State`.\n    ///\n    /// - Parameter perform: The closure to perform while locked.\n    func withState(perform: (Request.State) -> Void) {\n        lock.around { perform(value.state) }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/RedirectHandler.swift",
    "content": "//\n//  RedirectHandler.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.\npublic protocol RedirectHandler {\n    /// Determines how the HTTP redirect response should be redirected to the new request.\n    ///\n    /// The `completion` closure should be passed one of three possible options:\n    ///\n    ///   1. The new request specified by the redirect (this is the most common use case).\n    ///   2. A modified version of the new request (you may want to route it somewhere else).\n    ///   3. A `nil` value to deny the redirect request and return the body of the redirect response.\n    ///\n    /// - Parameters:\n    ///   - task:       The `URLSessionTask` whose request resulted in a redirect.\n    ///   - request:    The `URLRequest` to the new location specified by the redirect response.\n    ///   - response:   The `HTTPURLResponse` containing the server's response to the original request.\n    ///   - completion: The closure to execute containing the new `URLRequest`, a modified `URLRequest`, or `nil`.\n    func task(_ task: URLSessionTask,\n              willBeRedirectedTo request: URLRequest,\n              for response: HTTPURLResponse,\n              completion: @escaping (URLRequest?) -> Void)\n}\n\n// MARK: -\n\n/// `Redirector` is a convenience `RedirectHandler` making it easy to follow, not follow, or modify a redirect.\npublic struct Redirector {\n    /// Defines the behavior of the `Redirector` type.\n    public enum Behavior {\n        /// Follow the redirect as defined in the response.\n        case follow\n        /// Do not follow the redirect defined in the response.\n        case doNotFollow\n        /// Modify the redirect request defined in the response.\n        case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?)\n    }\n\n    /// Returns a `Redirector` with a `.follow` `Behavior`.\n    public static let follow = Redirector(behavior: .follow)\n    /// Returns a `Redirector` with a `.doNotFollow` `Behavior`.\n    public static let doNotFollow = Redirector(behavior: .doNotFollow)\n\n    /// The `Behavior` of the `Redirector`.\n    public let behavior: Behavior\n\n    /// Creates a `Redirector` instance from the `Behavior`.\n    ///\n    /// - Parameter behavior: The `Behavior`.\n    public init(behavior: Behavior) {\n        self.behavior = behavior\n    }\n}\n\n// MARK: -\n\nextension Redirector: RedirectHandler {\n    public func task(_ task: URLSessionTask,\n                     willBeRedirectedTo request: URLRequest,\n                     for response: HTTPURLResponse,\n                     completion: @escaping (URLRequest?) -> Void) {\n        switch behavior {\n        case .follow:\n            completion(request)\n        case .doNotFollow:\n            completion(nil)\n        case let .modify(closure):\n            let request = closure(task, request, response)\n            completion(request)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Request.swift",
    "content": "//\n//  Request.swift\n//\n//  Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// `Request` is the common superclass of all Alamofire request types and provides common state, delegate, and callback\n/// handling.\npublic class Request {\n    /// State of the `Request`, with managed transitions between states set when calling `resume()`, `suspend()`, or\n    /// `cancel()` on the `Request`.\n    public enum State {\n        /// Initial state of the `Request`.\n        case initialized\n        /// `State` set when `resume()` is called. Any tasks created for the `Request` will have `resume()` called on\n        /// them in this state.\n        case resumed\n        /// `State` set when `suspend()` is called. Any tasks created for the `Request` will have `suspend()` called on\n        /// them in this state.\n        case suspended\n        /// `State` set when `cancel()` is called. Any tasks created for the `Request` will have `cancel()` called on\n        /// them. Unlike `resumed` or `suspended`, once in the `cancelled` state, the `Request` can no longer transition\n        /// to any other state.\n        case cancelled\n        /// `State` set when all response serialization completion closures have been cleared on the `Request` and\n        /// enqueued on their respective queues.\n        case finished\n\n        /// Determines whether `self` can be transitioned to the provided `State`.\n        func canTransitionTo(_ state: State) -> Bool {\n            switch (self, state) {\n            case (.initialized, _):\n                return true\n            case (_, .initialized), (.cancelled, _), (.finished, _):\n                return false\n            case (.resumed, .cancelled), (.suspended, .cancelled), (.resumed, .suspended), (.suspended, .resumed):\n                return true\n            case (.suspended, .suspended), (.resumed, .resumed):\n                return false\n            case (_, .finished):\n                return true\n            }\n        }\n    }\n\n    // MARK: - Initial State\n\n    /// `UUID` providing a unique identifier for the `Request`, used in the `Hashable` and `Equatable` conformances.\n    public let id: UUID\n    /// The serial queue for all internal async actions.\n    public let underlyingQueue: DispatchQueue\n    /// The queue used for all serialization actions. By default it's a serial queue that targets `underlyingQueue`.\n    public let serializationQueue: DispatchQueue\n    /// `EventMonitor` used for event callbacks.\n    public let eventMonitor: EventMonitor?\n    /// The `Request`'s interceptor.\n    public let interceptor: RequestInterceptor?\n    /// The `Request`'s delegate.\n    public private(set) weak var delegate: RequestDelegate?\n\n    // MARK: - Mutable State\n\n    /// Type encapsulating all mutable state that may need to be accessed from anything other than the `underlyingQueue`.\n    struct MutableState {\n        /// State of the `Request`.\n        var state: State = .initialized\n        /// `ProgressHandler` and `DispatchQueue` provided for upload progress callbacks.\n        var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)?\n        /// `ProgressHandler` and `DispatchQueue` provided for download progress callbacks.\n        var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)?\n        /// `RedirectHandler` provided for to handle request redirection.\n        var redirectHandler: RedirectHandler?\n        /// `CachedResponseHandler` provided to handle response caching.\n        var cachedResponseHandler: CachedResponseHandler?\n        /// Queue and closure called when the `Request` is able to create a cURL description of itself.\n        var cURLHandler: (queue: DispatchQueue, handler: (String) -> Void)?\n        /// Queue and closure called when the `Request` creates a `URLRequest`.\n        var urlRequestHandler: (queue: DispatchQueue, handler: (URLRequest) -> Void)?\n        /// Queue and closure called when the `Request` creates a `URLSessionTask`.\n        var urlSessionTaskHandler: (queue: DispatchQueue, handler: (URLSessionTask) -> Void)?\n        /// Response serialization closures that handle response parsing.\n        var responseSerializers: [() -> Void] = []\n        /// Response serialization completion closures executed once all response serializers are complete.\n        var responseSerializerCompletions: [() -> Void] = []\n        /// Whether response serializer processing is finished.\n        var responseSerializerProcessingFinished = false\n        /// `URLCredential` used for authentication challenges.\n        var credential: URLCredential?\n        /// All `URLRequest`s created by Alamofire on behalf of the `Request`.\n        var requests: [URLRequest] = []\n        /// All `URLSessionTask`s created by Alamofire on behalf of the `Request`.\n        var tasks: [URLSessionTask] = []\n        /// All `URLSessionTaskMetrics` values gathered by Alamofire on behalf of the `Request`. Should correspond\n        /// exactly the the `tasks` created.\n        var metrics: [URLSessionTaskMetrics] = []\n        /// Number of times any retriers provided retried the `Request`.\n        var retryCount = 0\n        /// Final `AFError` for the `Request`, whether from various internal Alamofire calls or as a result of a `task`.\n        var error: AFError?\n        /// Whether the instance has had `finish()` called and is running the serializers. Should be replaced with a\n        /// representation in the state machine in the future.\n        var isFinishing = false\n    }\n\n    /// Protected `MutableState` value that provides thread-safe access to state values.\n    @Protected\n    fileprivate var mutableState = MutableState()\n\n    /// `State` of the `Request`.\n    public var state: State { mutableState.state }\n    /// Returns whether `state` is `.initialized`.\n    public var isInitialized: Bool { state == .initialized }\n    /// Returns whether `state is `.resumed`.\n    public var isResumed: Bool { state == .resumed }\n    /// Returns whether `state` is `.suspended`.\n    public var isSuspended: Bool { state == .suspended }\n    /// Returns whether `state` is `.cancelled`.\n    public var isCancelled: Bool { state == .cancelled }\n    /// Returns whether `state` is `.finished`.\n    public var isFinished: Bool { state == .finished }\n\n    // MARK: Progress\n\n    /// Closure type executed when monitoring the upload or download progress of a request.\n    public typealias ProgressHandler = (Progress) -> Void\n\n    /// `Progress` of the upload of the body of the executed `URLRequest`. Reset to `0` if the `Request` is retried.\n    public let uploadProgress = Progress(totalUnitCount: 0)\n    /// `Progress` of the download of any response data. Reset to `0` if the `Request` is retried.\n    public let downloadProgress = Progress(totalUnitCount: 0)\n    /// `ProgressHandler` called when `uploadProgress` is updated, on the provided `DispatchQueue`.\n    private var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? {\n        get { mutableState.uploadProgressHandler }\n        set { mutableState.uploadProgressHandler = newValue }\n    }\n\n    /// `ProgressHandler` called when `downloadProgress` is updated, on the provided `DispatchQueue`.\n    fileprivate var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? {\n        get { mutableState.downloadProgressHandler }\n        set { mutableState.downloadProgressHandler = newValue }\n    }\n\n    // MARK: Redirect Handling\n\n    /// `RedirectHandler` set on the instance.\n    public private(set) var redirectHandler: RedirectHandler? {\n        get { mutableState.redirectHandler }\n        set { mutableState.redirectHandler = newValue }\n    }\n\n    // MARK: Cached Response Handling\n\n    /// `CachedResponseHandler` set on the instance.\n    public private(set) var cachedResponseHandler: CachedResponseHandler? {\n        get { mutableState.cachedResponseHandler }\n        set { mutableState.cachedResponseHandler = newValue }\n    }\n\n    // MARK: URLCredential\n\n    /// `URLCredential` used for authentication challenges. Created by calling one of the `authenticate` methods.\n    public private(set) var credential: URLCredential? {\n        get { mutableState.credential }\n        set { mutableState.credential = newValue }\n    }\n\n    // MARK: Validators\n\n    /// `Validator` callback closures that store the validation calls enqueued.\n    @Protected\n    fileprivate var validators: [() -> Void] = []\n\n    // MARK: URLRequests\n\n    /// All `URLRequests` created on behalf of the `Request`, including original and adapted requests.\n    public var requests: [URLRequest] { mutableState.requests }\n    /// First `URLRequest` created on behalf of the `Request`. May not be the first one actually executed.\n    public var firstRequest: URLRequest? { requests.first }\n    /// Last `URLRequest` created on behalf of the `Request`.\n    public var lastRequest: URLRequest? { requests.last }\n    /// Current `URLRequest` created on behalf of the `Request`.\n    public var request: URLRequest? { lastRequest }\n\n    /// `URLRequest`s from all of the `URLSessionTask`s executed on behalf of the `Request`. May be different from\n    /// `requests` due to `URLSession` manipulation.\n    public var performedRequests: [URLRequest] { $mutableState.read { $0.tasks.compactMap { $0.currentRequest } } }\n\n    // MARK: HTTPURLResponse\n\n    /// `HTTPURLResponse` received from the server, if any. If the `Request` was retried, this is the response of the\n    /// last `URLSessionTask`.\n    public var response: HTTPURLResponse? { lastTask?.response as? HTTPURLResponse }\n\n    // MARK: Tasks\n\n    /// All `URLSessionTask`s created on behalf of the `Request`.\n    public var tasks: [URLSessionTask] { mutableState.tasks }\n    /// First `URLSessionTask` created on behalf of the `Request`.\n    public var firstTask: URLSessionTask? { tasks.first }\n    /// Last `URLSessionTask` crated on behalf of the `Request`.\n    public var lastTask: URLSessionTask? { tasks.last }\n    /// Current `URLSessionTask` created on behalf of the `Request`.\n    public var task: URLSessionTask? { lastTask }\n\n    // MARK: Metrics\n\n    /// All `URLSessionTaskMetrics` gathered on behalf of the `Request`. Should correspond to the `tasks` created.\n    public var allMetrics: [URLSessionTaskMetrics] { mutableState.metrics }\n    /// First `URLSessionTaskMetrics` gathered on behalf of the `Request`.\n    public var firstMetrics: URLSessionTaskMetrics? { allMetrics.first }\n    /// Last `URLSessionTaskMetrics` gathered on behalf of the `Request`.\n    public var lastMetrics: URLSessionTaskMetrics? { allMetrics.last }\n    /// Current `URLSessionTaskMetrics` gathered on behalf of the `Request`.\n    public var metrics: URLSessionTaskMetrics? { lastMetrics }\n\n    // MARK: Retry Count\n\n    /// Number of times the `Request` has been retried.\n    public var retryCount: Int { mutableState.retryCount }\n\n    // MARK: Error\n\n    /// `Error` returned from Alamofire internally, from the network request directly, or any validators executed.\n    public fileprivate(set) var error: AFError? {\n        get { mutableState.error }\n        set { mutableState.error = newValue }\n    }\n\n    /// Default initializer for the `Request` superclass.\n    ///\n    /// - Parameters:\n    ///   - id:                 `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default.\n    ///   - underlyingQueue:    `DispatchQueue` on which all internal `Request` work is performed.\n    ///   - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets\n    ///                         `underlyingQueue`, but can be passed another queue from a `Session`.\n    ///   - eventMonitor:       `EventMonitor` called for event callbacks from internal `Request` actions.\n    ///   - interceptor:        `RequestInterceptor` used throughout the request lifecycle.\n    ///   - delegate:           `RequestDelegate` that provides an interface to actions not performed by the `Request`.\n    init(id: UUID = UUID(),\n         underlyingQueue: DispatchQueue,\n         serializationQueue: DispatchQueue,\n         eventMonitor: EventMonitor?,\n         interceptor: RequestInterceptor?,\n         delegate: RequestDelegate) {\n        self.id = id\n        self.underlyingQueue = underlyingQueue\n        self.serializationQueue = serializationQueue\n        self.eventMonitor = eventMonitor\n        self.interceptor = interceptor\n        self.delegate = delegate\n    }\n\n    // MARK: - Internal Event API\n\n    // All API must be called from underlyingQueue.\n\n    /// Called when an initial `URLRequest` has been created on behalf of the instance. If a `RequestAdapter` is active,\n    /// the `URLRequest` will be adapted before being issued.\n    ///\n    /// - Parameter request: The `URLRequest` created.\n    func didCreateInitialURLRequest(_ request: URLRequest) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.write { $0.requests.append(request) }\n\n        eventMonitor?.request(self, didCreateInitialURLRequest: request)\n    }\n\n    /// Called when initial `URLRequest` creation has failed, typically through a `URLRequestConvertible`.\n    ///\n    /// - Note: Triggers retry.\n    ///\n    /// - Parameter error: `AFError` thrown from the failed creation.\n    func didFailToCreateURLRequest(with error: AFError) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        self.error = error\n\n        eventMonitor?.request(self, didFailToCreateURLRequestWithError: error)\n\n        callCURLHandlerIfNecessary()\n\n        retryOrFinish(error: error)\n    }\n\n    /// Called when a `RequestAdapter` has successfully adapted a `URLRequest`.\n    ///\n    /// - Parameters:\n    ///   - initialRequest: The `URLRequest` that was adapted.\n    ///   - adaptedRequest: The `URLRequest` returned by the `RequestAdapter`.\n    func didAdaptInitialRequest(_ initialRequest: URLRequest, to adaptedRequest: URLRequest) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.write { $0.requests.append(adaptedRequest) }\n\n        eventMonitor?.request(self, didAdaptInitialRequest: initialRequest, to: adaptedRequest)\n    }\n\n    /// Called when a `RequestAdapter` fails to adapt a `URLRequest`.\n    ///\n    /// - Note: Triggers retry.\n    ///\n    /// - Parameters:\n    ///   - request: The `URLRequest` the adapter was called with.\n    ///   - error:   The `AFError` returned by the `RequestAdapter`.\n    func didFailToAdaptURLRequest(_ request: URLRequest, withError error: AFError) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        self.error = error\n\n        eventMonitor?.request(self, didFailToAdaptURLRequest: request, withError: error)\n\n        callCURLHandlerIfNecessary()\n\n        retryOrFinish(error: error)\n    }\n\n    /// Final `URLRequest` has been created for the instance.\n    ///\n    /// - Parameter request: The `URLRequest` created.\n    func didCreateURLRequest(_ request: URLRequest) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.read { state in\n            state.urlRequestHandler?.queue.async { state.urlRequestHandler?.handler(request) }\n        }\n\n        eventMonitor?.request(self, didCreateURLRequest: request)\n\n        callCURLHandlerIfNecessary()\n    }\n\n    /// Asynchronously calls any stored `cURLHandler` and then removes it from `mutableState`.\n    private func callCURLHandlerIfNecessary() {\n        $mutableState.write { mutableState in\n            guard let cURLHandler = mutableState.cURLHandler else { return }\n\n            cURLHandler.queue.async { cURLHandler.handler(self.cURLDescription()) }\n\n            mutableState.cURLHandler = nil\n        }\n    }\n\n    /// Called when a `URLSessionTask` is created on behalf of the instance.\n    ///\n    /// - Parameter task: The `URLSessionTask` created.\n    func didCreateTask(_ task: URLSessionTask) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.write { state in\n            state.tasks.append(task)\n\n            guard let urlSessionTaskHandler = state.urlSessionTaskHandler else { return }\n\n            urlSessionTaskHandler.queue.async { urlSessionTaskHandler.handler(task) }\n        }\n\n        eventMonitor?.request(self, didCreateTask: task)\n    }\n\n    /// Called when resumption is completed.\n    func didResume() {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        eventMonitor?.requestDidResume(self)\n    }\n\n    /// Called when a `URLSessionTask` is resumed on behalf of the instance.\n    ///\n    /// - Parameter task: The `URLSessionTask` resumed.\n    func didResumeTask(_ task: URLSessionTask) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        eventMonitor?.request(self, didResumeTask: task)\n    }\n\n    /// Called when suspension is completed.\n    func didSuspend() {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        eventMonitor?.requestDidSuspend(self)\n    }\n\n    /// Called when a `URLSessionTask` is suspended on behalf of the instance.\n    ///\n    /// - Parameter task: The `URLSessionTask` suspended.\n    func didSuspendTask(_ task: URLSessionTask) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        eventMonitor?.request(self, didSuspendTask: task)\n    }\n\n    /// Called when cancellation is completed, sets `error` to `AFError.explicitlyCancelled`.\n    func didCancel() {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        error = error ?? AFError.explicitlyCancelled\n\n        eventMonitor?.requestDidCancel(self)\n    }\n\n    /// Called when a `URLSessionTask` is cancelled on behalf of the instance.\n    ///\n    /// - Parameter task: The `URLSessionTask` cancelled.\n    func didCancelTask(_ task: URLSessionTask) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        eventMonitor?.request(self, didCancelTask: task)\n    }\n\n    /// Called when a `URLSessionTaskMetrics` value is gathered on behalf of the instance.\n    ///\n    /// - Parameter metrics: The `URLSessionTaskMetrics` gathered.\n    func didGatherMetrics(_ metrics: URLSessionTaskMetrics) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.write { $0.metrics.append(metrics) }\n\n        eventMonitor?.request(self, didGatherMetrics: metrics)\n    }\n\n    /// Called when a `URLSessionTask` fails before it is finished, typically during certificate pinning.\n    ///\n    /// - Parameters:\n    ///   - task:  The `URLSessionTask` which failed.\n    ///   - error: The early failure `AFError`.\n    func didFailTask(_ task: URLSessionTask, earlyWithError error: AFError) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        self.error = error\n\n        // Task will still complete, so didCompleteTask(_:with:) will handle retry.\n        eventMonitor?.request(self, didFailTask: task, earlyWithError: error)\n    }\n\n    /// Called when a `URLSessionTask` completes. All tasks will eventually call this method.\n    ///\n    /// - Note: Response validation is synchronously triggered in this step.\n    ///\n    /// - Parameters:\n    ///   - task:  The `URLSessionTask` which completed.\n    ///   - error: The `AFError` `task` may have completed with. If `error` has already been set on the instance, this\n    ///            value is ignored.\n    func didCompleteTask(_ task: URLSessionTask, with error: AFError?) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        self.error = self.error ?? error\n\n        validators.forEach { $0() }\n\n        eventMonitor?.request(self, didCompleteTask: task, with: error)\n\n        retryOrFinish(error: self.error)\n    }\n\n    /// Called when the `RequestDelegate` is going to retry this `Request`. Calls `reset()`.\n    func prepareForRetry() {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        $mutableState.write { $0.retryCount += 1 }\n\n        reset()\n\n        eventMonitor?.requestIsRetrying(self)\n    }\n\n    /// Called to determine whether retry will be triggered for the particular error, or whether the instance should\n    /// call `finish()`.\n    ///\n    /// - Parameter error: The possible `AFError` which may trigger retry.\n    func retryOrFinish(error: AFError?) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        guard let error = error, let delegate = delegate else { finish(); return }\n\n        delegate.retryResult(for: self, dueTo: error) { retryResult in\n            switch retryResult {\n            case .doNotRetry:\n                self.finish()\n            case let .doNotRetryWithError(retryError):\n                self.finish(error: retryError.asAFError(orFailWith: \"Received retryError was not already AFError\"))\n            case .retry, .retryWithDelay:\n                delegate.retryRequest(self, withDelay: retryResult.delay)\n            }\n        }\n    }\n\n    /// Finishes this `Request` and starts the response serializers.\n    ///\n    /// - Parameter error: The possible `Error` with which the instance will finish.\n    func finish(error: AFError? = nil) {\n        dispatchPrecondition(condition: .onQueue(underlyingQueue))\n\n        guard !mutableState.isFinishing else { return }\n\n        mutableState.isFinishing = true\n\n        if let error = error { self.error = error }\n\n        // Start response handlers\n        processNextResponseSerializer()\n\n        eventMonitor?.requestDidFinish(self)\n    }\n\n    /// Appends the response serialization closure to the instance.\n    ///\n    ///  - Note: This method will also `resume` the instance if `delegate.startImmediately` returns `true`.\n    ///\n    /// - Parameter closure: The closure containing the response serialization call.\n    func appendResponseSerializer(_ closure: @escaping () -> Void) {\n        $mutableState.write { mutableState in\n            mutableState.responseSerializers.append(closure)\n\n            if mutableState.state == .finished {\n                mutableState.state = .resumed\n            }\n\n            if mutableState.responseSerializerProcessingFinished {\n                underlyingQueue.async { self.processNextResponseSerializer() }\n            }\n\n            if mutableState.state.canTransitionTo(.resumed) {\n                underlyingQueue.async { if self.delegate?.startImmediately == true { self.resume() } }\n            }\n        }\n    }\n\n    /// Returns the next response serializer closure to execute if there's one left.\n    ///\n    /// - Returns: The next response serialization closure, if there is one.\n    func nextResponseSerializer() -> (() -> Void)? {\n        var responseSerializer: (() -> Void)?\n\n        $mutableState.write { mutableState in\n            let responseSerializerIndex = mutableState.responseSerializerCompletions.count\n\n            if responseSerializerIndex < mutableState.responseSerializers.count {\n                responseSerializer = mutableState.responseSerializers[responseSerializerIndex]\n            }\n        }\n\n        return responseSerializer\n    }\n\n    /// Processes the next response serializer and calls all completions if response serialization is complete.\n    func processNextResponseSerializer() {\n        guard let responseSerializer = nextResponseSerializer() else {\n            // Execute all response serializer completions and clear them\n            var completions: [() -> Void] = []\n\n            $mutableState.write { mutableState in\n                completions = mutableState.responseSerializerCompletions\n\n                // Clear out all response serializers and response serializer completions in mutable state since the\n                // request is complete. It's important to do this prior to calling the completion closures in case\n                // the completions call back into the request triggering a re-processing of the response serializers.\n                // An example of how this can happen is by calling cancel inside a response completion closure.\n                mutableState.responseSerializers.removeAll()\n                mutableState.responseSerializerCompletions.removeAll()\n\n                if mutableState.state.canTransitionTo(.finished) {\n                    mutableState.state = .finished\n                }\n\n                mutableState.responseSerializerProcessingFinished = true\n                mutableState.isFinishing = false\n            }\n\n            completions.forEach { $0() }\n\n            // Cleanup the request\n            cleanup()\n\n            return\n        }\n\n        serializationQueue.async { responseSerializer() }\n    }\n\n    /// Notifies the `Request` that the response serializer is complete.\n    ///\n    /// - Parameter completion: The completion handler provided with the response serializer, called when all serializers\n    ///                         are complete.\n    func responseSerializerDidComplete(completion: @escaping () -> Void) {\n        $mutableState.write { $0.responseSerializerCompletions.append(completion) }\n        processNextResponseSerializer()\n    }\n\n    /// Resets all task and response serializer related state for retry.\n    func reset() {\n        error = nil\n\n        uploadProgress.totalUnitCount = 0\n        uploadProgress.completedUnitCount = 0\n        downloadProgress.totalUnitCount = 0\n        downloadProgress.completedUnitCount = 0\n\n        $mutableState.write { state in\n            state.isFinishing = false\n            state.responseSerializerCompletions = []\n        }\n    }\n\n    /// Called when updating the upload progress.\n    ///\n    /// - Parameters:\n    ///   - totalBytesSent: Total bytes sent so far.\n    ///   - totalBytesExpectedToSend: Total bytes expected to send.\n    func updateUploadProgress(totalBytesSent: Int64, totalBytesExpectedToSend: Int64) {\n        uploadProgress.totalUnitCount = totalBytesExpectedToSend\n        uploadProgress.completedUnitCount = totalBytesSent\n\n        uploadProgressHandler?.queue.async { self.uploadProgressHandler?.handler(self.uploadProgress) }\n    }\n\n    /// Perform a closure on the current `state` while locked.\n    ///\n    /// - Parameter perform: The closure to perform.\n    func withState(perform: (State) -> Void) {\n        $mutableState.withState(perform: perform)\n    }\n\n    // MARK: Task Creation\n\n    /// Called when creating a `URLSessionTask` for this `Request`. Subclasses must override.\n    ///\n    /// - Parameters:\n    ///   - request: `URLRequest` to use to create the `URLSessionTask`.\n    ///   - session: `URLSession` which creates the `URLSessionTask`.\n    ///\n    /// - Returns:   The `URLSessionTask` created.\n    func task(for request: URLRequest, using session: URLSession) -> URLSessionTask {\n        fatalError(\"Subclasses must override.\")\n    }\n\n    // MARK: - Public API\n\n    // These APIs are callable from any queue.\n\n    // MARK: State\n\n    /// Cancels the instance. Once cancelled, a `Request` can no longer be resumed or suspended.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    public func cancel() -> Self {\n        $mutableState.write { mutableState in\n            guard mutableState.state.canTransitionTo(.cancelled) else { return }\n\n            mutableState.state = .cancelled\n\n            underlyingQueue.async { self.didCancel() }\n\n            guard let task = mutableState.tasks.last, task.state != .completed else {\n                underlyingQueue.async { self.finish() }\n                return\n            }\n\n            // Resume to ensure metrics are gathered.\n            task.resume()\n            task.cancel()\n            underlyingQueue.async { self.didCancelTask(task) }\n        }\n\n        return self\n    }\n\n    /// Suspends the instance.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    public func suspend() -> Self {\n        $mutableState.write { mutableState in\n            guard mutableState.state.canTransitionTo(.suspended) else { return }\n\n            mutableState.state = .suspended\n\n            underlyingQueue.async { self.didSuspend() }\n\n            guard let task = mutableState.tasks.last, task.state != .completed else { return }\n\n            task.suspend()\n            underlyingQueue.async { self.didSuspendTask(task) }\n        }\n\n        return self\n    }\n\n    /// Resumes the instance.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    public func resume() -> Self {\n        $mutableState.write { mutableState in\n            guard mutableState.state.canTransitionTo(.resumed) else { return }\n\n            mutableState.state = .resumed\n\n            underlyingQueue.async { self.didResume() }\n\n            guard let task = mutableState.tasks.last, task.state != .completed else { return }\n\n            task.resume()\n            underlyingQueue.async { self.didResumeTask(task) }\n        }\n\n        return self\n    }\n\n    // MARK: - Closure API\n\n    /// Associates a credential using the provided values with the instance.\n    ///\n    /// - Parameters:\n    ///   - username:    The username.\n    ///   - password:    The password.\n    ///   - persistence: The `URLCredential.Persistence` for the created `URLCredential`. `.forSession` by default.\n    ///\n    /// - Returns:       The instance.\n    @discardableResult\n    public func authenticate(username: String, password: String, persistence: URLCredential.Persistence = .forSession) -> Self {\n        let credential = URLCredential(user: username, password: password, persistence: persistence)\n\n        return authenticate(with: credential)\n    }\n\n    /// Associates the provided credential with the instance.\n    ///\n    /// - Parameter credential: The `URLCredential`.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func authenticate(with credential: URLCredential) -> Self {\n        mutableState.credential = credential\n\n        return self\n    }\n\n    /// Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server.\n    ///\n    /// - Note: Only the last closure provided is used.\n    ///\n    /// - Parameters:\n    ///   - queue:   The `DispatchQueue` to execute the closure on. `.main` by default.\n    ///   - closure: The closure to be executed periodically as data is read from the server.\n    ///\n    /// - Returns:   The instance.\n    @discardableResult\n    public func downloadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self {\n        mutableState.downloadProgressHandler = (handler: closure, queue: queue)\n\n        return self\n    }\n\n    /// Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server.\n    ///\n    /// - Note: Only the last closure provided is used.\n    ///\n    /// - Parameters:\n    ///   - queue:   The `DispatchQueue` to execute the closure on. `.main` by default.\n    ///   - closure: The closure to be executed periodically as data is sent to the server.\n    ///\n    /// - Returns:   The instance.\n    @discardableResult\n    public func uploadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self {\n        mutableState.uploadProgressHandler = (handler: closure, queue: queue)\n\n        return self\n    }\n\n    // MARK: Redirects\n\n    /// Sets the redirect handler for the instance which will be used if a redirect response is encountered.\n    ///\n    /// - Note: Attempting to set the redirect handler more than once is a logic error and will crash.\n    ///\n    /// - Parameter handler: The `RedirectHandler`.\n    ///\n    /// - Returns:           The instance.\n    @discardableResult\n    public func redirect(using handler: RedirectHandler) -> Self {\n        $mutableState.write { mutableState in\n            precondition(mutableState.redirectHandler == nil, \"Redirect handler has already been set.\")\n            mutableState.redirectHandler = handler\n        }\n\n        return self\n    }\n\n    // MARK: Cached Responses\n\n    /// Sets the cached response handler for the `Request` which will be used when attempting to cache a response.\n    ///\n    /// - Note: Attempting to set the cache handler more than once is a logic error and will crash.\n    ///\n    /// - Parameter handler: The `CachedResponseHandler`.\n    ///\n    /// - Returns:           The instance.\n    @discardableResult\n    public func cacheResponse(using handler: CachedResponseHandler) -> Self {\n        $mutableState.write { mutableState in\n            precondition(mutableState.cachedResponseHandler == nil, \"Cached response handler has already been set.\")\n            mutableState.cachedResponseHandler = handler\n        }\n\n        return self\n    }\n\n    // MARK: - Lifetime APIs\n\n    /// Sets a handler to be called when the cURL description of the request is available.\n    ///\n    /// - Note: When waiting for a `Request`'s `URLRequest` to be created, only the last `handler` will be called.\n    ///\n    /// - Parameters:\n    ///   - queue:   `DispatchQueue` on which `handler` will be called.\n    ///   - handler: Closure to be called when the cURL description is available.\n    ///\n    /// - Returns:           The instance.\n    @discardableResult\n    public func cURLDescription(on queue: DispatchQueue, calling handler: @escaping (String) -> Void) -> Self {\n        $mutableState.write { mutableState in\n            if mutableState.requests.last != nil {\n                queue.async { handler(self.cURLDescription()) }\n            } else {\n                mutableState.cURLHandler = (queue, handler)\n            }\n        }\n\n        return self\n    }\n\n    /// Sets a handler to be called when the cURL description of the request is available.\n    ///\n    /// - Note: When waiting for a `Request`'s `URLRequest` to be created, only the last `handler` will be called.\n    ///\n    /// - Parameter handler: Closure to be called when the cURL description is available. Called on the instance's\n    ///                      `underlyingQueue` by default.\n    ///\n    /// - Returns:           The instance.\n    @discardableResult\n    public func cURLDescription(calling handler: @escaping (String) -> Void) -> Self {\n        $mutableState.write { mutableState in\n            if mutableState.requests.last != nil {\n                underlyingQueue.async { handler(self.cURLDescription()) }\n            } else {\n                mutableState.cURLHandler = (underlyingQueue, handler)\n            }\n        }\n\n        return self\n    }\n\n    /// Sets a closure to called whenever Alamofire creates a `URLRequest` for this instance.\n    ///\n    /// - Note: This closure will be called multiple times if the instance adapts incoming `URLRequest`s or is retried.\n    ///\n    /// - Parameters:\n    ///   - queue:   `DispatchQueue` on which `handler` will be called. `.main` by default.\n    ///   - handler: Closure to be called when a `URLRequest` is available.\n    ///\n    /// - Returns:   The instance.\n    @discardableResult\n    public func onURLRequestCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLRequest) -> Void) -> Self {\n        $mutableState.write { state in\n            if let request = state.requests.last {\n                queue.async { handler(request) }\n            }\n\n            state.urlRequestHandler = (queue, handler)\n        }\n\n        return self\n    }\n\n    /// Sets a closure to be called whenever the instance creates a `URLSessionTask`.\n    ///\n    /// - Note: This API should only be used to provide `URLSessionTask`s to existing API, like `NSFileProvider`. It\n    ///         **SHOULD NOT** be used to interact with tasks directly, as that may be break Alamofire features.\n    ///         Additionally, this closure may be called multiple times if the instance is retried.\n    ///\n    /// - Parameters:\n    ///   - queue:   `DispatchQueue` on which `handler` will be called. `.main` by default.\n    ///   - handler: Closure to be called when the `URLSessionTask` is available.\n    ///\n    /// - Returns:   The instance.\n    @discardableResult\n    public func onURLSessionTaskCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLSessionTask) -> Void) -> Self {\n        $mutableState.write { state in\n            if let task = state.tasks.last {\n                queue.async { handler(task) }\n            }\n\n            state.urlSessionTaskHandler = (queue, handler)\n        }\n\n        return self\n    }\n\n    // MARK: Cleanup\n\n    /// Final cleanup step executed when the instance finishes response serialization.\n    func cleanup() {\n        delegate?.cleanup(after: self)\n        // No-op: override in subclass\n    }\n}\n\n// MARK: - Protocol Conformances\n\nextension Request: Equatable {\n    public static func ==(lhs: Request, rhs: Request) -> Bool {\n        lhs.id == rhs.id\n    }\n}\n\nextension Request: Hashable {\n    public func hash(into hasher: inout Hasher) {\n        hasher.combine(id)\n    }\n}\n\nextension Request: CustomStringConvertible {\n    /// A textual representation of this instance, including the `HTTPMethod` and `URL` if the `URLRequest` has been\n    /// created, as well as the response status code, if a response has been received.\n    public var description: String {\n        guard let request = performedRequests.last ?? lastRequest,\n              let url = request.url,\n              let method = request.httpMethod else { return \"No request created yet.\" }\n\n        let requestDescription = \"\\(method) \\(url.absoluteString)\"\n\n        return response.map { \"\\(requestDescription) (\\($0.statusCode))\" } ?? requestDescription\n    }\n}\n\nextension Request {\n    /// cURL representation of the instance.\n    ///\n    /// - Returns: The cURL equivalent of the instance.\n    public func cURLDescription() -> String {\n        guard\n            let request = lastRequest,\n            let url = request.url,\n            let host = url.host,\n            let method = request.httpMethod else { return \"$ curl command could not be created\" }\n\n        var components = [\"$ curl -v\"]\n\n        components.append(\"-X \\(method)\")\n\n        if let credentialStorage = delegate?.sessionConfiguration.urlCredentialStorage {\n            let protectionSpace = URLProtectionSpace(host: host,\n                                                     port: url.port ?? 0,\n                                                     protocol: url.scheme,\n                                                     realm: host,\n                                                     authenticationMethod: NSURLAuthenticationMethodHTTPBasic)\n\n            if let credentials = credentialStorage.credentials(for: protectionSpace)?.values {\n                for credential in credentials {\n                    guard let user = credential.user, let password = credential.password else { continue }\n                    components.append(\"-u \\(user):\\(password)\")\n                }\n            } else {\n                if let credential = credential, let user = credential.user, let password = credential.password {\n                    components.append(\"-u \\(user):\\(password)\")\n                }\n            }\n        }\n\n        if let configuration = delegate?.sessionConfiguration, configuration.httpShouldSetCookies {\n            if\n                let cookieStorage = configuration.httpCookieStorage,\n                let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty {\n                let allCookies = cookies.map { \"\\($0.name)=\\($0.value)\" }.joined(separator: \";\")\n\n                components.append(\"-b \\\"\\(allCookies)\\\"\")\n            }\n        }\n\n        var headers = HTTPHeaders()\n\n        if let sessionHeaders = delegate?.sessionConfiguration.headers {\n            for header in sessionHeaders where header.name != \"Cookie\" {\n                headers[header.name] = header.value\n            }\n        }\n\n        for header in request.headers where header.name != \"Cookie\" {\n            headers[header.name] = header.value\n        }\n\n        for header in headers {\n            let escapedValue = header.value.replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\")\n            components.append(\"-H \\\"\\(header.name): \\(escapedValue)\\\"\")\n        }\n\n        if let httpBodyData = request.httpBody {\n            let httpBody = String(decoding: httpBodyData, as: UTF8.self)\n            var escapedBody = httpBody.replacingOccurrences(of: \"\\\\\\\"\", with: \"\\\\\\\\\\\"\")\n            escapedBody = escapedBody.replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\")\n\n            components.append(\"-d \\\"\\(escapedBody)\\\"\")\n        }\n\n        components.append(\"\\\"\\(url.absoluteString)\\\"\")\n\n        return components.joined(separator: \" \\\\\\n\\t\")\n    }\n}\n\n/// Protocol abstraction for `Request`'s communication back to the `SessionDelegate`.\npublic protocol RequestDelegate: AnyObject {\n    /// `URLSessionConfiguration` used to create the underlying `URLSessionTask`s.\n    var sessionConfiguration: URLSessionConfiguration { get }\n\n    /// Determines whether the `Request` should automatically call `resume()` when adding the first response handler.\n    var startImmediately: Bool { get }\n\n    /// Notifies the delegate the `Request` has reached a point where it needs cleanup.\n    ///\n    /// - Parameter request: The `Request` to cleanup after.\n    func cleanup(after request: Request)\n\n    /// Asynchronously ask the delegate whether a `Request` will be retried.\n    ///\n    /// - Parameters:\n    ///   - request:    `Request` which failed.\n    ///   - error:      `Error` which produced the failure.\n    ///   - completion: Closure taking the `RetryResult` for evaluation.\n    func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void)\n\n    /// Asynchronously retry the `Request`.\n    ///\n    /// - Parameters:\n    ///   - request:   `Request` which will be retried.\n    ///   - timeDelay: `TimeInterval` after which the retry will be triggered.\n    func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?)\n}\n\n// MARK: - Subclasses\n\n// MARK: - DataRequest\n\n/// `Request` subclass which handles in-memory `Data` download using `URLSessionDataTask`.\npublic class DataRequest: Request {\n    /// `URLRequestConvertible` value used to create `URLRequest`s for this instance.\n    public let convertible: URLRequestConvertible\n    /// `Data` read from the server so far.\n    public var data: Data? { mutableData }\n\n    /// Protected storage for the `Data` read by the instance.\n    @Protected\n    private var mutableData: Data? = nil\n\n    /// Creates a `DataRequest` using the provided parameters.\n    ///\n    /// - Parameters:\n    ///   - id:                 `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default.\n    ///   - convertible:        `URLRequestConvertible` value used to create `URLRequest`s for this instance.\n    ///   - underlyingQueue:    `DispatchQueue` on which all internal `Request` work is performed.\n    ///   - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets\n    ///                         `underlyingQueue`, but can be passed another queue from a `Session`.\n    ///   - eventMonitor:       `EventMonitor` called for event callbacks from internal `Request` actions.\n    ///   - interceptor:        `RequestInterceptor` used throughout the request lifecycle.\n    ///   - delegate:           `RequestDelegate` that provides an interface to actions not performed by the `Request`.\n    init(id: UUID = UUID(),\n         convertible: URLRequestConvertible,\n         underlyingQueue: DispatchQueue,\n         serializationQueue: DispatchQueue,\n         eventMonitor: EventMonitor?,\n         interceptor: RequestInterceptor?,\n         delegate: RequestDelegate) {\n        self.convertible = convertible\n\n        super.init(id: id,\n                   underlyingQueue: underlyingQueue,\n                   serializationQueue: serializationQueue,\n                   eventMonitor: eventMonitor,\n                   interceptor: interceptor,\n                   delegate: delegate)\n    }\n\n    override func reset() {\n        super.reset()\n\n        mutableData = nil\n    }\n\n    /// Called when `Data` is received by this instance.\n    ///\n    /// - Note: Also calls `updateDownloadProgress`.\n    ///\n    /// - Parameter data: The `Data` received.\n    func didReceive(data: Data) {\n        if self.data == nil {\n            mutableData = data\n        } else {\n            $mutableData.write { $0?.append(data) }\n        }\n\n        updateDownloadProgress()\n    }\n\n    override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask {\n        let copiedRequest = request\n        return session.dataTask(with: copiedRequest)\n    }\n\n    /// Called to updated the `downloadProgress` of the instance.\n    func updateDownloadProgress() {\n        let totalBytesReceived = Int64(data?.count ?? 0)\n        let totalBytesExpected = task?.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown\n\n        downloadProgress.totalUnitCount = totalBytesExpected\n        downloadProgress.completedUnitCount = totalBytesReceived\n\n        downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) }\n    }\n\n    /// Validates the request, using the specified closure.\n    ///\n    /// - Note: If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Parameter validation: `Validation` closure used to validate the response.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func validate(_ validation: @escaping Validation) -> Self {\n        let validator: () -> Void = { [unowned self] in\n            guard self.error == nil, let response = self.response else { return }\n\n            let result = validation(self.request, response, self.data)\n\n            if case let .failure(error) = result { self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) }\n\n            self.eventMonitor?.request(self,\n                                       didValidateRequest: self.request,\n                                       response: response,\n                                       data: self.data,\n                                       withResult: result)\n        }\n\n        $validators.write { $0.append(validator) }\n\n        return self\n    }\n}\n\n// MARK: - DataStreamRequest\n\n/// `Request` subclass which streams HTTP response `Data` through a `Handler` closure.\npublic final class DataStreamRequest: Request {\n    /// Closure type handling `DataStreamRequest.Stream` values.\n    public typealias Handler<Success, Failure: Error> = (Stream<Success, Failure>) throws -> Void\n\n    /// Type encapsulating an `Event` as it flows through the stream, as well as a `CancellationToken` which can be used\n    /// to stop the stream at any time.\n    public struct Stream<Success, Failure: Error> {\n        /// Latest `Event` from the stream.\n        public let event: Event<Success, Failure>\n        /// Token used to cancel the stream.\n        public let token: CancellationToken\n\n        /// Cancel the ongoing stream by canceling the underlying `DataStreamRequest`.\n        public func cancel() {\n            token.cancel()\n        }\n    }\n\n    /// Type representing an event flowing through the stream. Contains either the `Result` of processing streamed\n    /// `Data` or the completion of the stream.\n    public enum Event<Success, Failure: Error> {\n        /// Output produced every time the instance receives additional `Data`. The associated value contains the\n        /// `Result` of processing the incoming `Data`.\n        case stream(Result<Success, Failure>)\n        /// Output produced when the instance has completed, whether due to stream end, cancellation, or an error.\n        /// Associated `Completion` value contains the final state.\n        case complete(Completion)\n    }\n\n    /// Value containing the state of a `DataStreamRequest` when the stream was completed.\n    public struct Completion {\n        /// Last `URLRequest` issued by the instance.\n        public let request: URLRequest?\n        /// Last `HTTPURLResponse` received by the instance.\n        public let response: HTTPURLResponse?\n        /// Last `URLSessionTaskMetrics` produced for the instance.\n        public let metrics: URLSessionTaskMetrics?\n        /// `AFError` produced for the instance, if any.\n        public let error: AFError?\n    }\n\n    /// Type used to cancel an ongoing stream.\n    public struct CancellationToken {\n        weak var request: DataStreamRequest?\n\n        init(_ request: DataStreamRequest) {\n            self.request = request\n        }\n\n        /// Cancel the ongoing stream by canceling the underlying `DataStreamRequest`.\n        public func cancel() {\n            request?.cancel()\n        }\n    }\n\n    /// `URLRequestConvertible` value used to create `URLRequest`s for this instance.\n    public let convertible: URLRequestConvertible\n    /// Whether or not the instance will be cancelled if stream parsing encounters an error.\n    public let automaticallyCancelOnStreamError: Bool\n\n    /// Internal mutable state specific to this type.\n    struct StreamMutableState {\n        /// `OutputStream` bound to the `InputStream` produced by `asInputStream`, if it has been called.\n        var outputStream: OutputStream?\n        /// Stream closures called as `Data` is received.\n        var streams: [(_ data: Data) -> Void] = []\n        /// Number of currently executing streams. Used to ensure completions are only fired after all streams are\n        /// enqueued.\n        var numberOfExecutingStreams = 0\n        /// Completion calls enqueued while streams are still executing.\n        var enqueuedCompletionEvents: [() -> Void] = []\n    }\n\n    @Protected\n    var streamMutableState = StreamMutableState()\n\n    /// Creates a `DataStreamRequest` using the provided parameters.\n    ///\n    /// - Parameters:\n    ///   - id:                               `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()`\n    ///                                        by default.\n    ///   - convertible:                      `URLRequestConvertible` value used to create `URLRequest`s for this\n    ///                                        instance.\n    ///   - automaticallyCancelOnStreamError: `Bool` indicating whether the instance will be cancelled when an `Error`\n    ///                                       is thrown while serializing stream `Data`.\n    ///   - underlyingQueue:                  `DispatchQueue` on which all internal `Request` work is performed.\n    ///   - serializationQueue:               `DispatchQueue` on which all serialization work is performed. By default\n    ///                                       targets\n    ///                                       `underlyingQueue`, but can be passed another queue from a `Session`.\n    ///   - eventMonitor:                     `EventMonitor` called for event callbacks from internal `Request` actions.\n    ///   - interceptor:                      `RequestInterceptor` used throughout the request lifecycle.\n    ///   - delegate:                         `RequestDelegate` that provides an interface to actions not performed by\n    ///                                       the `Request`.\n    init(id: UUID = UUID(),\n         convertible: URLRequestConvertible,\n         automaticallyCancelOnStreamError: Bool,\n         underlyingQueue: DispatchQueue,\n         serializationQueue: DispatchQueue,\n         eventMonitor: EventMonitor?,\n         interceptor: RequestInterceptor?,\n         delegate: RequestDelegate) {\n        self.convertible = convertible\n        self.automaticallyCancelOnStreamError = automaticallyCancelOnStreamError\n\n        super.init(id: id,\n                   underlyingQueue: underlyingQueue,\n                   serializationQueue: serializationQueue,\n                   eventMonitor: eventMonitor,\n                   interceptor: interceptor,\n                   delegate: delegate)\n    }\n\n    override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask {\n        let copiedRequest = request\n        return session.dataTask(with: copiedRequest)\n    }\n\n    override func finish(error: AFError? = nil) {\n        $streamMutableState.write { state in\n            state.outputStream?.close()\n        }\n\n        super.finish(error: error)\n    }\n\n    func didReceive(data: Data) {\n        $streamMutableState.write { state in\n            if let stream = state.outputStream {\n                underlyingQueue.async {\n                    var bytes = Array(data)\n                    stream.write(&bytes, maxLength: bytes.count)\n                }\n            }\n            state.numberOfExecutingStreams += state.streams.count\n            let localState = state\n            underlyingQueue.async { localState.streams.forEach { $0(data) } }\n        }\n    }\n\n    /// Validates the `URLRequest` and `HTTPURLResponse` received for the instance using the provided `Validation` closure.\n    ///\n    /// - Parameter validation: `Validation` closure used to validate the request and response.\n    ///\n    /// - Returns:              The `DataStreamRequest`.\n    @discardableResult\n    public func validate(_ validation: @escaping Validation) -> Self {\n        let validator: () -> Void = { [unowned self] in\n            guard self.error == nil, let response = self.response else { return }\n\n            let result = validation(self.request, response)\n\n            if case let .failure(error) = result {\n                self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error)))\n            }\n\n            self.eventMonitor?.request(self,\n                                       didValidateRequest: self.request,\n                                       response: response,\n                                       withResult: result)\n        }\n\n        $validators.write { $0.append(validator) }\n\n        return self\n    }\n\n    /// Produces an `InputStream` that receives the `Data` received by the instance.\n    ///\n    /// - Note: The `InputStream` produced by this method must have `open()` called before being able to read `Data`.\n    ///         Additionally, this method will automatically call `resume()` on the instance, regardless of whether or\n    ///         not the creating session has `startRequestsImmediately` set to `true`.\n    ///\n    /// - Parameter bufferSize: Size, in bytes, of the buffer between the `OutputStream` and `InputStream`.\n    ///\n    /// - Returns:              The `InputStream` bound to the internal `OutboundStream`.\n    public func asInputStream(bufferSize: Int = 1024) -> InputStream? {\n        defer { resume() }\n\n        var inputStream: InputStream?\n        $streamMutableState.write { state in\n            Foundation.Stream.getBoundStreams(withBufferSize: bufferSize,\n                                              inputStream: &inputStream,\n                                              outputStream: &state.outputStream)\n            state.outputStream?.open()\n        }\n\n        return inputStream\n    }\n\n    func capturingError(from closure: () throws -> Void) {\n        do {\n            try closure()\n        } catch {\n            self.error = error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error)))\n            cancel()\n        }\n    }\n\n    func appendStreamCompletion<Success, Failure>(on queue: DispatchQueue,\n                                                  stream: @escaping Handler<Success, Failure>) {\n        appendResponseSerializer {\n            self.underlyingQueue.async {\n                self.responseSerializerDidComplete {\n                    self.$streamMutableState.write { state in\n                        guard state.numberOfExecutingStreams == 0 else {\n                            state.enqueuedCompletionEvents.append {\n                                self.enqueueCompletion(on: queue, stream: stream)\n                            }\n\n                            return\n                        }\n\n                        self.enqueueCompletion(on: queue, stream: stream)\n                    }\n                }\n            }\n        }\n    }\n\n    func enqueueCompletion<Success, Failure>(on queue: DispatchQueue,\n                                             stream: @escaping Handler<Success, Failure>) {\n        queue.async {\n            do {\n                let completion = Completion(request: self.request,\n                                            response: self.response,\n                                            metrics: self.metrics,\n                                            error: self.error)\n                try stream(.init(event: .complete(completion), token: .init(self)))\n            } catch {\n                // Ignore error, as errors on Completion can't be handled anyway.\n            }\n        }\n    }\n}\n\nextension DataStreamRequest.Stream {\n    /// Incoming `Result` values from `Event.stream`.\n    public var result: Result<Success, Failure>? {\n        guard case let .stream(result) = event else { return nil }\n\n        return result\n    }\n\n    /// `Success` value of the instance, if any.\n    public var value: Success? {\n        guard case let .success(value) = result else { return nil }\n\n        return value\n    }\n\n    /// `Failure` value of the instance, if any.\n    public var error: Failure? {\n        guard case let .failure(error) = result else { return nil }\n\n        return error\n    }\n\n    /// `Completion` value of the instance, if any.\n    public var completion: DataStreamRequest.Completion? {\n        guard case let .complete(completion) = event else { return nil }\n\n        return completion\n    }\n}\n\n// MARK: - DownloadRequest\n\n/// `Request` subclass which downloads `Data` to a file on disk using `URLSessionDownloadTask`.\npublic class DownloadRequest: Request {\n    /// A set of options to be executed prior to moving a downloaded file from the temporary `URL` to the destination\n    /// `URL`.\n    public struct Options: OptionSet {\n        /// Specifies that intermediate directories for the destination URL should be created.\n        public static let createIntermediateDirectories = Options(rawValue: 1 << 0)\n        /// Specifies that any previous file at the destination `URL` should be removed.\n        public static let removePreviousFile = Options(rawValue: 1 << 1)\n\n        public let rawValue: Int\n\n        public init(rawValue: Int) {\n            self.rawValue = rawValue\n        }\n    }\n\n    // MARK: Destination\n\n    /// A closure executed once a `DownloadRequest` has successfully completed in order to determine where to move the\n    /// temporary file written to during the download process. The closure takes two arguments: the temporary file URL\n    /// and the `HTTPURLResponse`, and returns two values: the file URL where the temporary file should be moved and\n    /// the options defining how the file should be moved.\n    ///\n    /// - Note: Downloads from a local `file://` `URL`s do not use the `Destination` closure, as those downloads do not\n    ///         return an `HTTPURLResponse`. Instead the file is merely moved within the temporary directory.\n    public typealias Destination = (_ temporaryURL: URL,\n                                    _ response: HTTPURLResponse) -> (destinationURL: URL, options: Options)\n\n    /// Creates a download file destination closure which uses the default file manager to move the temporary file to a\n    /// file URL in the first available directory with the specified search path directory and search path domain mask.\n    ///\n    /// - Parameters:\n    ///   - directory: The search path directory. `.documentDirectory` by default.\n    ///   - domain:    The search path domain mask. `.userDomainMask` by default.\n    ///   - options:   `DownloadRequest.Options` used when moving the downloaded file to its destination. None by\n    ///                default.\n    /// - Returns: The `Destination` closure.\n    public class func suggestedDownloadDestination(for directory: FileManager.SearchPathDirectory = .documentDirectory,\n                                                   in domain: FileManager.SearchPathDomainMask = .userDomainMask,\n                                                   options: Options = []) -> Destination {\n        { temporaryURL, response in\n            let directoryURLs = FileManager.default.urls(for: directory, in: domain)\n            let url = directoryURLs.first?.appendingPathComponent(response.suggestedFilename!) ?? temporaryURL\n\n            return (url, options)\n        }\n    }\n\n    /// Default `Destination` used by Alamofire to ensure all downloads persist. This `Destination` prepends\n    /// `Alamofire_` to the automatically generated download name and moves it within the temporary directory. Files\n    /// with this destination must be additionally moved if they should survive the system reclamation of temporary\n    /// space.\n    static let defaultDestination: Destination = { url, _ in\n        (defaultDestinationURL(url), [])\n    }\n\n    /// Default `URL` creation closure. Creates a `URL` in the temporary directory with `Alamofire_` prepended to the\n    /// provided file name.\n    static let defaultDestinationURL: (URL) -> URL = { url in\n        let filename = \"Alamofire_\\(url.lastPathComponent)\"\n        let destination = url.deletingLastPathComponent().appendingPathComponent(filename)\n\n        return destination\n    }\n\n    // MARK: Downloadable\n\n    /// Type describing the source used to create the underlying `URLSessionDownloadTask`.\n    public enum Downloadable {\n        /// Download should be started from the `URLRequest` produced by the associated `URLRequestConvertible` value.\n        case request(URLRequestConvertible)\n        /// Download should be started from the associated resume `Data` value.\n        case resumeData(Data)\n    }\n\n    // MARK: Mutable State\n\n    /// Type containing all mutable state for `DownloadRequest` instances.\n    private struct DownloadRequestMutableState {\n        /// Possible resume `Data` produced when cancelling the instance.\n        var resumeData: Data?\n        /// `URL` to which `Data` is being downloaded.\n        var fileURL: URL?\n    }\n\n    /// Protected mutable state specific to `DownloadRequest`.\n    @Protected\n    private var mutableDownloadState = DownloadRequestMutableState()\n\n    /// If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download\n    /// using the `download(resumingWith data:)` API.\n    ///\n    /// - Note: For more information about `resumeData`, see [Apple's documentation](https://developer.apple.com/documentation/foundation/urlsessiondownloadtask/1411634-cancel).\n    public var resumeData: Data? { mutableDownloadState.resumeData ?? error?.downloadResumeData }\n    /// If the download is successful, the `URL` where the file was downloaded.\n    public var fileURL: URL? { mutableDownloadState.fileURL }\n\n    // MARK: Initial State\n\n    /// `Downloadable` value used for this instance.\n    public let downloadable: Downloadable\n    /// The `Destination` to which the downloaded file is moved.\n    let destination: Destination\n\n    /// Creates a `DownloadRequest` using the provided parameters.\n    ///\n    /// - Parameters:\n    ///   - id:                 `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default.\n    ///   - downloadable:       `Downloadable` value used to create `URLSessionDownloadTasks` for the instance.\n    ///   - underlyingQueue:    `DispatchQueue` on which all internal `Request` work is performed.\n    ///   - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets\n    ///                         `underlyingQueue`, but can be passed another queue from a `Session`.\n    ///   - eventMonitor:       `EventMonitor` called for event callbacks from internal `Request` actions.\n    ///   - interceptor:        `RequestInterceptor` used throughout the request lifecycle.\n    ///   - delegate:           `RequestDelegate` that provides an interface to actions not performed by the `Request`\n    ///   - destination:        `Destination` closure used to move the downloaded file to its final location.\n    init(id: UUID = UUID(),\n         downloadable: Downloadable,\n         underlyingQueue: DispatchQueue,\n         serializationQueue: DispatchQueue,\n         eventMonitor: EventMonitor?,\n         interceptor: RequestInterceptor?,\n         delegate: RequestDelegate,\n         destination: @escaping Destination) {\n        self.downloadable = downloadable\n        self.destination = destination\n\n        super.init(id: id,\n                   underlyingQueue: underlyingQueue,\n                   serializationQueue: serializationQueue,\n                   eventMonitor: eventMonitor,\n                   interceptor: interceptor,\n                   delegate: delegate)\n    }\n\n    override func reset() {\n        super.reset()\n\n        $mutableDownloadState.write {\n            $0.resumeData = nil\n            $0.fileURL = nil\n        }\n    }\n\n    /// Called when a download has finished.\n    ///\n    /// - Parameters:\n    ///   - task:   `URLSessionTask` that finished the download.\n    ///   - result: `Result` of the automatic move to `destination`.\n    func didFinishDownloading(using task: URLSessionTask, with result: Result<URL, AFError>) {\n        eventMonitor?.request(self, didFinishDownloadingUsing: task, with: result)\n\n        switch result {\n        case let .success(url): mutableDownloadState.fileURL = url\n        case let .failure(error): self.error = error\n        }\n    }\n\n    /// Updates the `downloadProgress` using the provided values.\n    ///\n    /// - Parameters:\n    ///   - bytesWritten:              Total bytes written so far.\n    ///   - totalBytesExpectedToWrite: Total bytes expected to write.\n    func updateDownloadProgress(bytesWritten: Int64, totalBytesExpectedToWrite: Int64) {\n        downloadProgress.totalUnitCount = totalBytesExpectedToWrite\n        downloadProgress.completedUnitCount += bytesWritten\n\n        downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) }\n    }\n\n    override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask {\n        session.downloadTask(with: request)\n    }\n\n    /// Creates a `URLSessionTask` from the provided resume data.\n    ///\n    /// - Parameters:\n    ///   - data:    `Data` used to resume the download.\n    ///   - session: `URLSession` used to create the `URLSessionTask`.\n    ///\n    /// - Returns:   The `URLSessionTask` created.\n    public func task(forResumeData data: Data, using session: URLSession) -> URLSessionTask {\n        session.downloadTask(withResumeData: data)\n    }\n\n    /// Cancels the instance. Once cancelled, a `DownloadRequest` can no longer be resumed or suspended.\n    ///\n    /// - Note: This method will NOT produce resume data. If you wish to cancel and produce resume data, use\n    ///         `cancel(producingResumeData:)` or `cancel(byProducingResumeData:)`.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    override public func cancel() -> Self {\n        cancel(producingResumeData: false)\n    }\n\n    /// Cancels the instance, optionally producing resume data. Once cancelled, a `DownloadRequest` can no longer be\n    /// resumed or suspended.\n    ///\n    /// - Note: If `producingResumeData` is `true`, the `resumeData` property will be populated with any resume data, if\n    ///         available.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    public func cancel(producingResumeData shouldProduceResumeData: Bool) -> Self {\n        cancel(optionallyProducingResumeData: shouldProduceResumeData ? { _ in } : nil)\n    }\n\n    /// Cancels the instance while producing resume data. Once cancelled, a `DownloadRequest` can no longer be resumed\n    /// or suspended.\n    ///\n    /// - Note: The resume data passed to the completion handler will also be available on the instance's `resumeData`\n    ///         property.\n    ///\n    /// - Parameter completionHandler: The completion handler that is called when the download has been successfully\n    ///                                cancelled. It is not guaranteed to be called on a particular queue, so you may\n    ///                                want use an appropriate queue to perform your work.\n    ///\n    /// - Returns:                     The instance.\n    @discardableResult\n    public func cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void) -> Self {\n        cancel(optionallyProducingResumeData: completionHandler)\n    }\n\n    /// Internal implementation of cancellation that optionally takes a resume data handler. If no handler is passed,\n    /// cancellation is performed without producing resume data.\n    ///\n    /// - Parameter completionHandler: Optional resume data handler.\n    ///\n    /// - Returns:                     The instance.\n    private func cancel(optionallyProducingResumeData completionHandler: ((_ resumeData: Data?) -> Void)?) -> Self {\n        $mutableState.write { mutableState in\n            guard mutableState.state.canTransitionTo(.cancelled) else { return }\n\n            mutableState.state = .cancelled\n\n            underlyingQueue.async { self.didCancel() }\n\n            guard let task = mutableState.tasks.last as? URLSessionDownloadTask, task.state != .completed else {\n                underlyingQueue.async { self.finish() }\n                return\n            }\n\n            if let completionHandler = completionHandler {\n                // Resume to ensure metrics are gathered.\n                task.resume()\n                task.cancel { resumeData in\n                    self.mutableDownloadState.resumeData = resumeData\n                    self.underlyingQueue.async { self.didCancelTask(task) }\n                    completionHandler(resumeData)\n                }\n            } else {\n                // Resume to ensure metrics are gathered.\n                task.resume()\n                task.cancel(byProducingResumeData: { _ in })\n                self.underlyingQueue.async { self.didCancelTask(task) }\n            }\n        }\n\n        return self\n    }\n\n    /// Validates the request, using the specified closure.\n    ///\n    /// - Note: If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Parameter validation: `Validation` closure to validate the response.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func validate(_ validation: @escaping Validation) -> Self {\n        let validator: () -> Void = { [unowned self] in\n            guard self.error == nil, let response = self.response else { return }\n\n            let result = validation(self.request, response, self.fileURL)\n\n            if case let .failure(error) = result {\n                self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error)))\n            }\n\n            self.eventMonitor?.request(self,\n                                       didValidateRequest: self.request,\n                                       response: response,\n                                       fileURL: self.fileURL,\n                                       withResult: result)\n        }\n\n        $validators.write { $0.append(validator) }\n\n        return self\n    }\n}\n\n// MARK: - UploadRequest\n\n/// `DataRequest` subclass which handles `Data` upload from memory, file, or stream using `URLSessionUploadTask`.\npublic class UploadRequest: DataRequest {\n    /// Type describing the origin of the upload, whether `Data`, file, or stream.\n    public enum Uploadable {\n        /// Upload from the provided `Data` value.\n        case data(Data)\n        /// Upload from the provided file `URL`, as well as a `Bool` determining whether the source file should be\n        /// automatically removed once uploaded.\n        case file(URL, shouldRemove: Bool)\n        /// Upload from the provided `InputStream`.\n        case stream(InputStream)\n    }\n\n    // MARK: Initial State\n\n    /// The `UploadableConvertible` value used to produce the `Uploadable` value for this instance.\n    public let upload: UploadableConvertible\n\n    /// `FileManager` used to perform cleanup tasks, including the removal of multipart form encoded payloads written\n    /// to disk.\n    public let fileManager: FileManager\n\n    // MARK: Mutable State\n\n    /// `Uploadable` value used by the instance.\n    public var uploadable: Uploadable?\n\n    /// Creates an `UploadRequest` using the provided parameters.\n    ///\n    /// - Parameters:\n    ///   - id:                 `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default.\n    ///   - convertible:        `UploadConvertible` value used to determine the type of upload to be performed.\n    ///   - underlyingQueue:    `DispatchQueue` on which all internal `Request` work is performed.\n    ///   - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets\n    ///                         `underlyingQueue`, but can be passed another queue from a `Session`.\n    ///   - eventMonitor:       `EventMonitor` called for event callbacks from internal `Request` actions.\n    ///   - interceptor:        `RequestInterceptor` used throughout the request lifecycle.\n    ///   - delegate:           `RequestDelegate` that provides an interface to actions not performed by the `Request`.\n    init(id: UUID = UUID(),\n         convertible: UploadConvertible,\n         underlyingQueue: DispatchQueue,\n         serializationQueue: DispatchQueue,\n         eventMonitor: EventMonitor?,\n         interceptor: RequestInterceptor?,\n         fileManager: FileManager,\n         delegate: RequestDelegate) {\n        upload = convertible\n        self.fileManager = fileManager\n\n        super.init(id: id,\n                   convertible: convertible,\n                   underlyingQueue: underlyingQueue,\n                   serializationQueue: serializationQueue,\n                   eventMonitor: eventMonitor,\n                   interceptor: interceptor,\n                   delegate: delegate)\n    }\n\n    /// Called when the `Uploadable` value has been created from the `UploadConvertible`.\n    ///\n    /// - Parameter uploadable: The `Uploadable` that was created.\n    func didCreateUploadable(_ uploadable: Uploadable) {\n        self.uploadable = uploadable\n\n        eventMonitor?.request(self, didCreateUploadable: uploadable)\n    }\n\n    /// Called when the `Uploadable` value could not be created.\n    ///\n    /// - Parameter error: `AFError` produced by the failure.\n    func didFailToCreateUploadable(with error: AFError) {\n        self.error = error\n\n        eventMonitor?.request(self, didFailToCreateUploadableWithError: error)\n\n        retryOrFinish(error: error)\n    }\n\n    override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask {\n        guard let uploadable = uploadable else {\n            fatalError(\"Attempting to create a URLSessionUploadTask when Uploadable value doesn't exist.\")\n        }\n\n        switch uploadable {\n        case let .data(data): return session.uploadTask(with: request, from: data)\n        case let .file(url, _): return session.uploadTask(with: request, fromFile: url)\n        case .stream: return session.uploadTask(withStreamedRequest: request)\n        }\n    }\n\n    override func reset() {\n        // Uploadable must be recreated on every retry.\n        uploadable = nil\n\n        super.reset()\n    }\n\n    /// Produces the `InputStream` from `uploadable`, if it can.\n    ///\n    /// - Note: Calling this method with a non-`.stream` `Uploadable` is a logic error and will crash.\n    ///\n    /// - Returns: The `InputStream`.\n    func inputStream() -> InputStream {\n        guard let uploadable = uploadable else {\n            fatalError(\"Attempting to access the input stream but the uploadable doesn't exist.\")\n        }\n\n        guard case let .stream(stream) = uploadable else {\n            fatalError(\"Attempted to access the stream of an UploadRequest that wasn't created with one.\")\n        }\n\n        eventMonitor?.request(self, didProvideInputStream: stream)\n\n        return stream\n    }\n\n    override public func cleanup() {\n        defer { super.cleanup() }\n\n        guard\n            let uploadable = self.uploadable,\n            case let .file(url, shouldRemove) = uploadable,\n            shouldRemove\n        else { return }\n\n        try? fileManager.removeItem(at: url)\n    }\n}\n\n/// A type that can produce an `UploadRequest.Uploadable` value.\npublic protocol UploadableConvertible {\n    /// Produces an `UploadRequest.Uploadable` value from the instance.\n    ///\n    /// - Returns: The `UploadRequest.Uploadable`.\n    /// - Throws:  Any `Error` produced during creation.\n    func createUploadable() throws -> UploadRequest.Uploadable\n}\n\nextension UploadRequest.Uploadable: UploadableConvertible {\n    public func createUploadable() throws -> UploadRequest.Uploadable {\n        self\n    }\n}\n\n/// A type that can be converted to an upload, whether from an `UploadRequest.Uploadable` or `URLRequestConvertible`.\npublic protocol UploadConvertible: UploadableConvertible & URLRequestConvertible {}\n"
  },
  {
    "path": "Pods/Alamofire/Source/RequestInterceptor.swift",
    "content": "//\n//  RequestInterceptor.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that can inspect and optionally adapt a `URLRequest` in some manner if necessary.\npublic protocol RequestAdapter {\n    /// Inspects and adapts the specified `URLRequest` in some manner and calls the completion handler with the Result.\n    ///\n    /// - Parameters:\n    ///   - urlRequest: The `URLRequest` to adapt.\n    ///   - session:    The `Session` that will execute the `URLRequest`.\n    ///   - completion: The completion handler that must be called when adaptation is complete.\n    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)\n}\n\n// MARK: -\n\n/// Outcome of determination whether retry is necessary.\npublic enum RetryResult {\n    /// Retry should be attempted immediately.\n    case retry\n    /// Retry should be attempted after the associated `TimeInterval`.\n    case retryWithDelay(TimeInterval)\n    /// Do not retry.\n    case doNotRetry\n    /// Do not retry due to the associated `Error`.\n    case doNotRetryWithError(Error)\n}\n\nextension RetryResult {\n    var retryRequired: Bool {\n        switch self {\n        case .retry, .retryWithDelay: return true\n        default: return false\n        }\n    }\n\n    var delay: TimeInterval? {\n        switch self {\n        case let .retryWithDelay(delay): return delay\n        default: return nil\n        }\n    }\n\n    var error: Error? {\n        guard case let .doNotRetryWithError(error) = self else { return nil }\n        return error\n    }\n}\n\n/// A type that determines whether a request should be retried after being executed by the specified session manager\n/// and encountering an error.\npublic protocol RequestRetrier {\n    /// Determines whether the `Request` should be retried by calling the `completion` closure.\n    ///\n    /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs\n    /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly\n    /// cleaned up after.\n    ///\n    /// - Parameters:\n    ///   - request:    `Request` that failed due to the provided `Error`.\n    ///   - session:    `Session` that produced the `Request`.\n    ///   - error:      `Error` encountered while executing the `Request`.\n    ///   - completion: Completion closure to be executed when a retry decision has been determined.\n    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)\n}\n\n// MARK: -\n\n/// Type that provides both `RequestAdapter` and `RequestRetrier` functionality.\npublic protocol RequestInterceptor: RequestAdapter, RequestRetrier {}\n\nextension RequestInterceptor {\n    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {\n        completion(.success(urlRequest))\n    }\n\n    public func retry(_ request: Request,\n                      for session: Session,\n                      dueTo error: Error,\n                      completion: @escaping (RetryResult) -> Void) {\n        completion(.doNotRetry)\n    }\n}\n\n/// `RequestAdapter` closure definition.\npublic typealias AdaptHandler = (URLRequest, Session, _ completion: @escaping (Result<URLRequest, Error>) -> Void) -> Void\n/// `RequestRetrier` closure definition.\npublic typealias RetryHandler = (Request, Session, Error, _ completion: @escaping (RetryResult) -> Void) -> Void\n\n// MARK: -\n\n/// Closure-based `RequestAdapter`.\nopen class Adapter: RequestInterceptor {\n    private let adaptHandler: AdaptHandler\n\n    /// Creates an instance using the provided closure.\n    ///\n    /// - Parameter adaptHandler: `AdaptHandler` closure to be executed when handling request adaptation.\n    public init(_ adaptHandler: @escaping AdaptHandler) {\n        self.adaptHandler = adaptHandler\n    }\n\n    open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {\n        adaptHandler(urlRequest, session, completion)\n    }\n}\n\n// MARK: -\n\n/// Closure-based `RequestRetrier`.\nopen class Retrier: RequestInterceptor {\n    private let retryHandler: RetryHandler\n\n    /// Creates an instance using the provided closure.\n    ///\n    /// - Parameter retryHandler: `RetryHandler` closure to be executed when handling request retry.\n    public init(_ retryHandler: @escaping RetryHandler) {\n        self.retryHandler = retryHandler\n    }\n\n    open func retry(_ request: Request,\n                    for session: Session,\n                    dueTo error: Error,\n                    completion: @escaping (RetryResult) -> Void) {\n        retryHandler(request, session, error, completion)\n    }\n}\n\n// MARK: -\n\n/// `RequestInterceptor` which can use multiple `RequestAdapter` and `RequestRetrier` values.\nopen class Interceptor: RequestInterceptor {\n    /// All `RequestAdapter`s associated with the instance. These adapters will be run until one fails.\n    public let adapters: [RequestAdapter]\n    /// All `RequestRetrier`s associated with the instance. These retriers will be run one at a time until one triggers retry.\n    public let retriers: [RequestRetrier]\n\n    /// Creates an instance from `AdaptHandler` and `RetryHandler` closures.\n    ///\n    /// - Parameters:\n    ///   - adaptHandler: `AdaptHandler` closure to be used.\n    ///   - retryHandler: `RetryHandler` closure to be used.\n    public init(adaptHandler: @escaping AdaptHandler, retryHandler: @escaping RetryHandler) {\n        adapters = [Adapter(adaptHandler)]\n        retriers = [Retrier(retryHandler)]\n    }\n\n    /// Creates an instance from `RequestAdapter` and `RequestRetrier` values.\n    ///\n    /// - Parameters:\n    ///   - adapter: `RequestAdapter` value to be used.\n    ///   - retrier: `RequestRetrier` value to be used.\n    public init(adapter: RequestAdapter, retrier: RequestRetrier) {\n        adapters = [adapter]\n        retriers = [retrier]\n    }\n\n    /// Creates an instance from the arrays of `RequestAdapter` and `RequestRetrier` values.\n    ///\n    /// - Parameters:\n    ///   - adapters:     `RequestAdapter` values to be used.\n    ///   - retriers:     `RequestRetrier` values to be used.\n    ///   - interceptors: `RequestInterceptor`s to be used.\n    public init(adapters: [RequestAdapter] = [], retriers: [RequestRetrier] = [], interceptors: [RequestInterceptor] = []) {\n        self.adapters = adapters + interceptors\n        self.retriers = retriers + interceptors\n    }\n\n    open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {\n        adapt(urlRequest, for: session, using: adapters, completion: completion)\n    }\n\n    private func adapt(_ urlRequest: URLRequest,\n                       for session: Session,\n                       using adapters: [RequestAdapter],\n                       completion: @escaping (Result<URLRequest, Error>) -> Void) {\n        var pendingAdapters = adapters\n\n        guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return }\n\n        let adapter = pendingAdapters.removeFirst()\n\n        adapter.adapt(urlRequest, for: session) { result in\n            switch result {\n            case let .success(urlRequest):\n                self.adapt(urlRequest, for: session, using: pendingAdapters, completion: completion)\n            case .failure:\n                completion(result)\n            }\n        }\n    }\n\n    open func retry(_ request: Request,\n                    for session: Session,\n                    dueTo error: Error,\n                    completion: @escaping (RetryResult) -> Void) {\n        retry(request, for: session, dueTo: error, using: retriers, completion: completion)\n    }\n\n    private func retry(_ request: Request,\n                       for session: Session,\n                       dueTo error: Error,\n                       using retriers: [RequestRetrier],\n                       completion: @escaping (RetryResult) -> Void) {\n        var pendingRetriers = retriers\n\n        guard !pendingRetriers.isEmpty else { completion(.doNotRetry); return }\n\n        let retrier = pendingRetriers.removeFirst()\n\n        retrier.retry(request, for: session, dueTo: error) { result in\n            switch result {\n            case .retry, .retryWithDelay, .doNotRetryWithError:\n                completion(result)\n            case .doNotRetry:\n                // Only continue to the next retrier if retry was not triggered and no error was encountered\n                self.retry(request, for: session, dueTo: error, using: pendingRetriers, completion: completion)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/RequestTaskMap.swift",
    "content": "//\n//  RequestTaskMap.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that maintains a two way, one to one map of `URLSessionTask`s to `Request`s.\nstruct RequestTaskMap {\n    private typealias Events = (completed: Bool, metricsGathered: Bool)\n\n    private var tasksToRequests: [URLSessionTask: Request]\n    private var requestsToTasks: [Request: URLSessionTask]\n    private var taskEvents: [URLSessionTask: Events]\n\n    var requests: [Request] {\n        Array(tasksToRequests.values)\n    }\n\n    init(tasksToRequests: [URLSessionTask: Request] = [:],\n         requestsToTasks: [Request: URLSessionTask] = [:],\n         taskEvents: [URLSessionTask: (completed: Bool, metricsGathered: Bool)] = [:]) {\n        self.tasksToRequests = tasksToRequests\n        self.requestsToTasks = requestsToTasks\n        self.taskEvents = taskEvents\n    }\n\n    subscript(_ request: Request) -> URLSessionTask? {\n        get { requestsToTasks[request] }\n        set {\n            guard let newValue = newValue else {\n                guard let task = requestsToTasks[request] else {\n                    fatalError(\"RequestTaskMap consistency error: no task corresponding to request found.\")\n                }\n\n                requestsToTasks.removeValue(forKey: request)\n                tasksToRequests.removeValue(forKey: task)\n                taskEvents.removeValue(forKey: task)\n\n                return\n            }\n\n            requestsToTasks[request] = newValue\n            tasksToRequests[newValue] = request\n            taskEvents[newValue] = (completed: false, metricsGathered: false)\n        }\n    }\n\n    subscript(_ task: URLSessionTask) -> Request? {\n        get { tasksToRequests[task] }\n        set {\n            guard let newValue = newValue else {\n                guard let request = tasksToRequests[task] else {\n                    fatalError(\"RequestTaskMap consistency error: no request corresponding to task found.\")\n                }\n\n                tasksToRequests.removeValue(forKey: task)\n                requestsToTasks.removeValue(forKey: request)\n                taskEvents.removeValue(forKey: task)\n\n                return\n            }\n\n            tasksToRequests[task] = newValue\n            requestsToTasks[newValue] = task\n            taskEvents[task] = (completed: false, metricsGathered: false)\n        }\n    }\n\n    var count: Int {\n        precondition(tasksToRequests.count == requestsToTasks.count,\n                     \"RequestTaskMap.count invalid, requests.count: \\(tasksToRequests.count) != tasks.count: \\(requestsToTasks.count)\")\n\n        return tasksToRequests.count\n    }\n\n    var eventCount: Int {\n        precondition(taskEvents.count == count, \"RequestTaskMap.eventCount invalid, count: \\(count) != taskEvents.count: \\(taskEvents.count)\")\n\n        return taskEvents.count\n    }\n\n    var isEmpty: Bool {\n        precondition(tasksToRequests.isEmpty == requestsToTasks.isEmpty,\n                     \"RequestTaskMap.isEmpty invalid, requests.isEmpty: \\(tasksToRequests.isEmpty) != tasks.isEmpty: \\(requestsToTasks.isEmpty)\")\n\n        return tasksToRequests.isEmpty\n    }\n\n    var isEventsEmpty: Bool {\n        precondition(taskEvents.isEmpty == isEmpty, \"RequestTaskMap.isEventsEmpty invalid, isEmpty: \\(isEmpty) != taskEvents.isEmpty: \\(taskEvents.isEmpty)\")\n\n        return taskEvents.isEmpty\n    }\n\n    mutating func disassociateIfNecessaryAfterGatheringMetricsForTask(_ task: URLSessionTask) -> Bool {\n        guard let events = taskEvents[task] else {\n            fatalError(\"RequestTaskMap consistency error: no events corresponding to task found.\")\n        }\n\n        switch (events.completed, events.metricsGathered) {\n        case (_, true): fatalError(\"RequestTaskMap consistency error: duplicate metricsGatheredForTask call.\")\n        case (false, false): taskEvents[task] = (completed: false, metricsGathered: true); return false\n        case (true, false): self[task] = nil; return true\n        }\n    }\n\n    mutating func disassociateIfNecessaryAfterCompletingTask(_ task: URLSessionTask) -> Bool {\n        guard let events = taskEvents[task] else {\n            fatalError(\"RequestTaskMap consistency error: no events corresponding to task found.\")\n        }\n\n        switch (events.completed, events.metricsGathered) {\n        case (true, _): fatalError(\"RequestTaskMap consistency error: duplicate completionReceivedForTask call.\")\n        #if os(Linux) // Linux doesn't gather metrics, so unconditionally remove the reference and return true.\n        default: self[task] = nil; return true\n        #else\n        case (false, false):\n            if #available(macOS 10.12, iOS 10, watchOS 7, tvOS 10, *) {\n                taskEvents[task] = (completed: true, metricsGathered: false); return false\n            } else {\n                // watchOS < 7 doesn't gather metrics, so unconditionally remove the reference and return true.\n                self[task] = nil; return true\n            }\n        case (false, true):\n            self[task] = nil; return true\n        #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Response.swift",
    "content": "//\n//  Response.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Default type of `DataResponse` returned by Alamofire, with an `AFError` `Failure` type.\npublic typealias AFDataResponse<Success> = DataResponse<Success, AFError>\n/// Default type of `DownloadResponse` returned by Alamofire, with an `AFError` `Failure` type.\npublic typealias AFDownloadResponse<Success> = DownloadResponse<Success, AFError>\n\n/// Type used to store all values associated with a serialized response of a `DataRequest` or `UploadRequest`.\npublic struct DataResponse<Success, Failure: Error> {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The data returned by the server.\n    public let data: Data?\n\n    /// The final metrics of the response.\n    ///\n    /// - Note: Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS is currently disabled.`\n    ///\n    public let metrics: URLSessionTaskMetrics?\n\n    /// The time taken to serialize the response.\n    public let serializationDuration: TimeInterval\n\n    /// The result of response serialization.\n    public let result: Result<Success, Failure>\n\n    /// Returns the associated value of the result if it is a success, `nil` otherwise.\n    public var value: Success? { result.success }\n\n    /// Returns the associated error value if the result if it is a failure, `nil` otherwise.\n    public var error: Failure? { result.failure }\n\n    /// Creates a `DataResponse` instance with the specified parameters derived from the response serialization.\n    ///\n    /// - Parameters:\n    ///   - request:               The `URLRequest` sent to the server.\n    ///   - response:              The `HTTPURLResponse` from the server.\n    ///   - data:                  The `Data` returned by the server.\n    ///   - metrics:               The `URLSessionTaskMetrics` of the `DataRequest` or `UploadRequest`.\n    ///   - serializationDuration: The duration taken by serialization.\n    ///   - result:                The `Result` of response serialization.\n    public init(request: URLRequest?,\n                response: HTTPURLResponse?,\n                data: Data?,\n                metrics: URLSessionTaskMetrics?,\n                serializationDuration: TimeInterval,\n                result: Result<Success, Failure>) {\n        self.request = request\n        self.response = response\n        self.data = data\n        self.metrics = metrics\n        self.serializationDuration = serializationDuration\n        self.result = result\n    }\n}\n\n// MARK: -\n\nextension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure.\n    public var description: String {\n        \"\\(result)\"\n    }\n\n    /// The debug textual representation used when written to an output stream, which includes (if available) a summary\n    /// of the `URLRequest`, the request's headers and body (if decodable as a `String` below 100KB); the\n    /// `HTTPURLResponse`'s status code, headers, and body; the duration of the network and serialization actions; and\n    /// the `Result` of serialization.\n    public var debugDescription: String {\n        guard let urlRequest = request else { return \"[Request]: None\\n[Result]: \\(result)\" }\n\n        let requestDescription = DebugDescription.description(of: urlRequest)\n\n        let responseDescription = response.map { response in\n            let responseBodyDescription = DebugDescription.description(for: data, headers: response.headers)\n\n            return \"\"\"\n            \\(DebugDescription.description(of: response))\n                \\(responseBodyDescription.indentingNewlines())\n            \"\"\"\n        } ?? \"[Response]: None\"\n\n        let networkDuration = metrics.map { \"\\($0.taskInterval.duration)s\" } ?? \"None\"\n\n        return \"\"\"\n        \\(requestDescription)\n        \\(responseDescription)\n        [Network Duration]: \\(networkDuration)\n        [Serialization Duration]: \\(serializationDuration)s\n        [Result]: \\(result)\n        \"\"\"\n    }\n}\n\n// MARK: -\n\nextension DataResponse {\n    /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `map` method with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let possibleInt = possibleData.map { $0.count }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's\n    ///            result is a failure, returns a response wrapping the same failure.\n    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DataResponse<NewSuccess, Failure> {\n        DataResponse<NewSuccess, Failure>(request: request,\n                                          response: response,\n                                          data: data,\n                                          metrics: metrics,\n                                          serializationDuration: serializationDuration,\n                                          result: result.map(transform))\n    }\n\n    /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result\n    /// value as a parameter.\n    ///\n    /// Use the `tryMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let possibleObject = possibleData.tryMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's\n    ///            result is a failure, returns the same failure.\n    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DataResponse<NewSuccess, Error> {\n        DataResponse<NewSuccess, Error>(request: request,\n                                        response: response,\n                                        data: data,\n                                        metrics: metrics,\n                                        serializationDuration: serializationDuration,\n                                        result: result.tryMap(transform))\n    }\n\n    /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `mapError` function with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let withMyError = possibleData.mapError { MyError.error($0) }\n    ///\n    /// - Parameter transform: A closure that takes the error of the instance.\n    ///\n    /// - Returns: A `DataResponse` instance containing the result of the transform.\n    public func mapError<NewFailure: Error>(_ transform: (Failure) -> NewFailure) -> DataResponse<Success, NewFailure> {\n        DataResponse<Success, NewFailure>(request: request,\n                                          response: response,\n                                          data: data,\n                                          metrics: metrics,\n                                          serializationDuration: serializationDuration,\n                                          result: result.mapError(transform))\n    }\n\n    /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `tryMapError` function with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let possibleObject = possibleData.tryMapError {\n    ///         try someFailableFunction(taking: $0)\n    ///     }\n    ///\n    /// - Parameter transform: A throwing closure that takes the error of the instance.\n    ///\n    /// - Returns: A `DataResponse` instance containing the result of the transform.\n    public func tryMapError<NewFailure: Error>(_ transform: (Failure) throws -> NewFailure) -> DataResponse<Success, Error> {\n        DataResponse<Success, Error>(request: request,\n                                     response: response,\n                                     data: data,\n                                     metrics: metrics,\n                                     serializationDuration: serializationDuration,\n                                     result: result.tryMapError(transform))\n    }\n}\n\n// MARK: -\n\n/// Used to store all data associated with a serialized response of a download request.\npublic struct DownloadResponse<Success, Failure: Error> {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The final destination URL of the data returned from the server after it is moved.\n    public let fileURL: URL?\n\n    /// The resume data generated if the request was cancelled.\n    public let resumeData: Data?\n\n    /// The final metrics of the response.\n    ///\n    /// - Note: Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS is currently disabled.`\n    ///\n    public let metrics: URLSessionTaskMetrics?\n\n    /// The time taken to serialize the response.\n    public let serializationDuration: TimeInterval\n\n    /// The result of response serialization.\n    public let result: Result<Success, Failure>\n\n    /// Returns the associated value of the result if it is a success, `nil` otherwise.\n    public var value: Success? { result.success }\n\n    /// Returns the associated error value if the result if it is a failure, `nil` otherwise.\n    public var error: Failure? { result.failure }\n\n    /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization.\n    ///\n    /// - Parameters:\n    ///   - request:               The `URLRequest` sent to the server.\n    ///   - response:              The `HTTPURLResponse` from the server.\n    ///   - temporaryURL:          The temporary destination `URL` of the data returned from the server.\n    ///   - destinationURL:        The final destination `URL` of the data returned from the server, if it was moved.\n    ///   - resumeData:            The resume `Data` generated if the request was cancelled.\n    ///   - metrics:               The `URLSessionTaskMetrics` of the `DownloadRequest`.\n    ///   - serializationDuration: The duration taken by serialization.\n    ///   - result:                The `Result` of response serialization.\n    public init(request: URLRequest?,\n                response: HTTPURLResponse?,\n                fileURL: URL?,\n                resumeData: Data?,\n                metrics: URLSessionTaskMetrics?,\n                serializationDuration: TimeInterval,\n                result: Result<Success, Failure>) {\n        self.request = request\n        self.response = response\n        self.fileURL = fileURL\n        self.resumeData = resumeData\n        self.metrics = metrics\n        self.serializationDuration = serializationDuration\n        self.result = result\n    }\n}\n\n// MARK: -\n\nextension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure.\n    public var description: String {\n        \"\\(result)\"\n    }\n\n    /// The debug textual representation used when written to an output stream, which includes the URL request, the URL\n    /// response, the temporary and destination URLs, the resume data, the durations of the network and serialization\n    /// actions, and the response serialization result.\n    public var debugDescription: String {\n        guard let urlRequest = request else { return \"[Request]: None\\n[Result]: \\(result)\" }\n\n        let requestDescription = DebugDescription.description(of: urlRequest)\n        let responseDescription = response.map(DebugDescription.description(of:)) ?? \"[Response]: None\"\n        let networkDuration = metrics.map { \"\\($0.taskInterval.duration)s\" } ?? \"None\"\n        let resumeDataDescription = resumeData.map { \"\\($0)\" } ?? \"None\"\n\n        return \"\"\"\n        \\(requestDescription)\n        \\(responseDescription)\n        [File URL]: \\(fileURL?.path ?? \"None\")\n        [Resume Data]: \\(resumeDataDescription)\n        [Network Duration]: \\(networkDuration)\n        [Serialization Duration]: \\(serializationDuration)s\n        [Result]: \\(result)\n        \"\"\"\n    }\n}\n\n// MARK: -\n\nextension DownloadResponse {\n    /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `map` method with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let possibleInt = possibleData.map { $0.count }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's\n    ///            result is a failure, returns a response wrapping the same failure.\n    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DownloadResponse<NewSuccess, Failure> {\n        DownloadResponse<NewSuccess, Failure>(request: request,\n                                              response: response,\n                                              fileURL: fileURL,\n                                              resumeData: resumeData,\n                                              metrics: metrics,\n                                              serializationDuration: serializationDuration,\n                                              result: result.map(transform))\n    }\n\n    /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `tryMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let possibleObject = possibleData.tryMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this\n    /// instance's result is a failure, returns the same failure.\n    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DownloadResponse<NewSuccess, Error> {\n        DownloadResponse<NewSuccess, Error>(request: request,\n                                            response: response,\n                                            fileURL: fileURL,\n                                            resumeData: resumeData,\n                                            metrics: metrics,\n                                            serializationDuration: serializationDuration,\n                                            result: result.tryMap(transform))\n    }\n\n    /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `mapError` function with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let withMyError = possibleData.mapError { MyError.error($0) }\n    ///\n    /// - Parameter transform: A closure that takes the error of the instance.\n    ///\n    /// - Returns: A `DownloadResponse` instance containing the result of the transform.\n    public func mapError<NewFailure: Error>(_ transform: (Failure) -> NewFailure) -> DownloadResponse<Success, NewFailure> {\n        DownloadResponse<Success, NewFailure>(request: request,\n                                              response: response,\n                                              fileURL: fileURL,\n                                              resumeData: resumeData,\n                                              metrics: metrics,\n                                              serializationDuration: serializationDuration,\n                                              result: result.mapError(transform))\n    }\n\n    /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `tryMapError` function with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let possibleObject = possibleData.tryMapError {\n    ///         try someFailableFunction(taking: $0)\n    ///     }\n    ///\n    /// - Parameter transform: A throwing closure that takes the error of the instance.\n    ///\n    /// - Returns: A `DownloadResponse` instance containing the result of the transform.\n    public func tryMapError<NewFailure: Error>(_ transform: (Failure) throws -> NewFailure) -> DownloadResponse<Success, Error> {\n        DownloadResponse<Success, Error>(request: request,\n                                         response: response,\n                                         fileURL: fileURL,\n                                         resumeData: resumeData,\n                                         metrics: metrics,\n                                         serializationDuration: serializationDuration,\n                                         result: result.tryMapError(transform))\n    }\n}\n\nprivate enum DebugDescription {\n    static func description(of request: URLRequest) -> String {\n        let requestSummary = \"\\(request.httpMethod!) \\(request)\"\n        let requestHeadersDescription = DebugDescription.description(for: request.headers)\n        let requestBodyDescription = DebugDescription.description(for: request.httpBody, headers: request.headers)\n\n        return \"\"\"\n        [Request]: \\(requestSummary)\n            \\(requestHeadersDescription.indentingNewlines())\n            \\(requestBodyDescription.indentingNewlines())\n        \"\"\"\n    }\n\n    static func description(of response: HTTPURLResponse) -> String {\n        \"\"\"\n        [Response]:\n            [Status Code]: \\(response.statusCode)\n            \\(DebugDescription.description(for: response.headers).indentingNewlines())\n        \"\"\"\n    }\n\n    static func description(for headers: HTTPHeaders) -> String {\n        guard !headers.isEmpty else { return \"[Headers]: None\" }\n\n        let headerDescription = \"\\(headers.sorted())\".indentingNewlines()\n        return \"\"\"\n        [Headers]:\n            \\(headerDescription)\n        \"\"\"\n    }\n\n    static func description(for data: Data?,\n                            headers: HTTPHeaders,\n                            allowingPrintableTypes printableTypes: [String] = [\"json\", \"xml\", \"text\"],\n                            maximumLength: Int = 100_000) -> String {\n        guard let data = data, !data.isEmpty else { return \"[Body]: None\" }\n\n        guard\n            data.count <= maximumLength,\n            printableTypes.compactMap({ headers[\"Content-Type\"]?.contains($0) }).contains(true)\n        else { return \"[Body]: \\(data.count) bytes\" }\n\n        return \"\"\"\n        [Body]:\n            \\(String(decoding: data, as: UTF8.self)\n            .trimmingCharacters(in: .whitespacesAndNewlines)\n            .indentingNewlines())\n        \"\"\"\n    }\n}\n\nextension String {\n    fileprivate func indentingNewlines(by spaceCount: Int = 4) -> String {\n        let spaces = String(repeating: \" \", count: spaceCount)\n        return replacingOccurrences(of: \"\\n\", with: \"\\n\\(spaces)\")\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ResponseSerialization.swift",
    "content": "//\n//  ResponseSerialization.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// MARK: Protocols\n\n/// The type to which all data response serializers must conform in order to serialize a response.\npublic protocol DataResponseSerializerProtocol {\n    /// The type of serialized object to be created.\n    associatedtype SerializedObject\n\n    /// Serialize the response `Data` into the provided type..\n    ///\n    /// - Parameters:\n    ///   - request:  `URLRequest` which was used to perform the request, if any.\n    ///   - response: `HTTPURLResponse` received from the server, if any.\n    ///   - data:     `Data` returned from the server, if any.\n    ///   - error:    `Error` produced by Alamofire or the underlying `URLSession` during the request.\n    ///\n    /// - Returns:    The `SerializedObject`.\n    /// - Throws:     Any `Error` produced during serialization.\n    func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject\n}\n\n/// The type to which all download response serializers must conform in order to serialize a response.\npublic protocol DownloadResponseSerializerProtocol {\n    /// The type of serialized object to be created.\n    associatedtype SerializedObject\n\n    /// Serialize the downloaded response `Data` from disk into the provided type..\n    ///\n    /// - Parameters:\n    ///   - request:  `URLRequest` which was used to perform the request, if any.\n    ///   - response: `HTTPURLResponse` received from the server, if any.\n    ///   - fileURL:  File `URL` to which the response data was downloaded.\n    ///   - error:    `Error` produced by Alamofire or the underlying `URLSession` during the request.\n    ///\n    /// - Returns:    The `SerializedObject`.\n    /// - Throws:     Any `Error` produced during serialization.\n    func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> SerializedObject\n}\n\n/// A serializer that can handle both data and download responses.\npublic protocol ResponseSerializer: DataResponseSerializerProtocol & DownloadResponseSerializerProtocol {\n    /// `DataPreprocessor` used to prepare incoming `Data` for serialization.\n    var dataPreprocessor: DataPreprocessor { get }\n    /// `HTTPMethod`s for which empty response bodies are considered appropriate.\n    var emptyRequestMethods: Set<HTTPMethod> { get }\n    /// HTTP response codes for which empty response bodies are considered appropriate.\n    var emptyResponseCodes: Set<Int> { get }\n}\n\n/// Type used to preprocess `Data` before it handled by a serializer.\npublic protocol DataPreprocessor {\n    /// Process           `Data` before it's handled by a serializer.\n    /// - Parameter data: The raw `Data` to process.\n    func preprocess(_ data: Data) throws -> Data\n}\n\n/// `DataPreprocessor` that returns passed `Data` without any transform.\npublic struct PassthroughPreprocessor: DataPreprocessor {\n    public init() {}\n\n    public func preprocess(_ data: Data) throws -> Data { data }\n}\n\n/// `DataPreprocessor` that trims Google's typical `)]}',\\n` XSSI JSON header.\npublic struct GoogleXSSIPreprocessor: DataPreprocessor {\n    public init() {}\n\n    public func preprocess(_ data: Data) throws -> Data {\n        (data.prefix(6) == Data(\")]}',\\n\".utf8)) ? data.dropFirst(6) : data\n    }\n}\n\nextension ResponseSerializer {\n    /// Default `DataPreprocessor`. `PassthroughPreprocessor` by default.\n    public static var defaultDataPreprocessor: DataPreprocessor { PassthroughPreprocessor() }\n    /// Default `HTTPMethod`s for which empty response bodies are considered appropriate. `[.head]` by default.\n    public static var defaultEmptyRequestMethods: Set<HTTPMethod> { [.head] }\n    /// HTTP response codes for which empty response bodies are considered appropriate. `[204, 205]` by default.\n    public static var defaultEmptyResponseCodes: Set<Int> { [204, 205] }\n\n    public var dataPreprocessor: DataPreprocessor { Self.defaultDataPreprocessor }\n    public var emptyRequestMethods: Set<HTTPMethod> { Self.defaultEmptyRequestMethods }\n    public var emptyResponseCodes: Set<Int> { Self.defaultEmptyResponseCodes }\n\n    /// Determines whether the `request` allows empty response bodies, if `request` exists.\n    ///\n    /// - Parameter request: `URLRequest` to evaluate.\n    ///\n    /// - Returns:           `Bool` representing the outcome of the evaluation, or `nil` if `request` was `nil`.\n    public func requestAllowsEmptyResponseData(_ request: URLRequest?) -> Bool? {\n        request.flatMap { $0.httpMethod }\n            .flatMap(HTTPMethod.init)\n            .map { emptyRequestMethods.contains($0) }\n    }\n\n    /// Determines whether the `response` allows empty response bodies, if `response` exists`.\n    ///\n    /// - Parameter response: `HTTPURLResponse` to evaluate.\n    ///\n    /// - Returns:            `Bool` representing the outcome of the evaluation, or `nil` if `response` was `nil`.\n    public func responseAllowsEmptyResponseData(_ response: HTTPURLResponse?) -> Bool? {\n        response.flatMap { $0.statusCode }\n            .map { emptyResponseCodes.contains($0) }\n    }\n\n    /// Determines whether `request` and `response` allow empty response bodies.\n    ///\n    /// - Parameters:\n    ///   - request:  `URLRequest` to evaluate.\n    ///   - response: `HTTPURLResponse` to evaluate.\n    ///\n    /// - Returns:    `true` if `request` or `response` allow empty bodies, `false` otherwise.\n    public func emptyResponseAllowed(forRequest request: URLRequest?, response: HTTPURLResponse?) -> Bool {\n        (requestAllowsEmptyResponseData(request) == true) || (responseAllowsEmptyResponseData(response) == true)\n    }\n}\n\n/// By default, any serializer declared to conform to both types will get file serialization for free, as it just feeds\n/// the data read from disk into the data response serializer.\nextension DownloadResponseSerializerProtocol where Self: DataResponseSerializerProtocol {\n    public func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> Self.SerializedObject {\n        guard error == nil else { throw error! }\n\n        guard let fileURL = fileURL else {\n            throw AFError.responseSerializationFailed(reason: .inputFileNil)\n        }\n\n        let data: Data\n        do {\n            data = try Data(contentsOf: fileURL)\n        } catch {\n            throw AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL))\n        }\n\n        do {\n            return try serialize(request: request, response: response, data: data, error: error)\n        } catch {\n            throw error\n        }\n    }\n}\n\n// MARK: - Default\n\nextension DataRequest {\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:             The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - Returns:             The request.\n    @discardableResult\n    public func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse<Data?>) -> Void) -> Self {\n        appendResponseSerializer {\n            // Start work that should be on the serialization queue.\n            let result = AFResult<Data?>(value: self.data, error: self.error)\n            // End work that should be on the serialization queue.\n\n            self.underlyingQueue.async {\n                let response = DataResponse(request: self.request,\n                                            response: self.response,\n                                            data: self.data,\n                                            metrics: self.metrics,\n                                            serializationDuration: 0,\n                                            result: result)\n\n                self.eventMonitor?.request(self, didParseResponse: response)\n\n                self.responseSerializerDidComplete { queue.async { completionHandler(response) } }\n            }\n        }\n\n        return self\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:              The queue on which the completion handler is dispatched. `.main` by default\n    ///   - responseSerializer: The response serializer responsible for serializing the request, response, and data.\n    ///   - completionHandler:  The code to be executed once the request has finished.\n    ///\n    /// - Returns:              The request.\n    @discardableResult\n    public func response<Serializer: DataResponseSerializerProtocol>(queue: DispatchQueue = .main,\n                                                                     responseSerializer: Serializer,\n                                                                     completionHandler: @escaping (AFDataResponse<Serializer.SerializedObject>) -> Void)\n        -> Self {\n        appendResponseSerializer {\n            // Start work that should be on the serialization queue.\n            let start = ProcessInfo.processInfo.systemUptime\n            let result: AFResult<Serializer.SerializedObject> = Result {\n                try responseSerializer.serialize(request: self.request,\n                                                 response: self.response,\n                                                 data: self.data,\n                                                 error: self.error)\n            }.mapError { error in\n                error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error)))\n            }\n\n            let end = ProcessInfo.processInfo.systemUptime\n            // End work that should be on the serialization queue.\n\n            self.underlyingQueue.async {\n                let response = DataResponse(request: self.request,\n                                            response: self.response,\n                                            data: self.data,\n                                            metrics: self.metrics,\n                                            serializationDuration: end - start,\n                                            result: result)\n\n                self.eventMonitor?.request(self, didParseResponse: response)\n\n                guard let serializerError = result.failure, let delegate = self.delegate else {\n                    self.responseSerializerDidComplete { queue.async { completionHandler(response) } }\n                    return\n                }\n\n                delegate.retryResult(for: self, dueTo: serializerError) { retryResult in\n                    var didComplete: (() -> Void)?\n\n                    defer {\n                        if let didComplete = didComplete {\n                            self.responseSerializerDidComplete { queue.async { didComplete() } }\n                        }\n                    }\n\n                    switch retryResult {\n                    case .doNotRetry:\n                        didComplete = { completionHandler(response) }\n\n                    case let .doNotRetryWithError(retryError):\n                        let result: AFResult<Serializer.SerializedObject> = .failure(retryError.asAFError(orFailWith: \"Received retryError was not already AFError\"))\n\n                        let response = DataResponse(request: self.request,\n                                                    response: self.response,\n                                                    data: self.data,\n                                                    metrics: self.metrics,\n                                                    serializationDuration: end - start,\n                                                    result: result)\n\n                        didComplete = { completionHandler(response) }\n\n                    case .retry, .retryWithDelay:\n                        delegate.retryRequest(self, withDelay: retryResult.delay)\n                    }\n                }\n            }\n        }\n\n        return self\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:             The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - Returns:             The request.\n    @discardableResult\n    public func response(queue: DispatchQueue = .main,\n                         completionHandler: @escaping (AFDownloadResponse<URL?>) -> Void)\n        -> Self {\n        appendResponseSerializer {\n            // Start work that should be on the serialization queue.\n            let result = AFResult<URL?>(value: self.fileURL, error: self.error)\n            // End work that should be on the serialization queue.\n\n            self.underlyingQueue.async {\n                let response = DownloadResponse(request: self.request,\n                                                response: self.response,\n                                                fileURL: self.fileURL,\n                                                resumeData: self.resumeData,\n                                                metrics: self.metrics,\n                                                serializationDuration: 0,\n                                                result: result)\n\n                self.eventMonitor?.request(self, didParseResponse: response)\n\n                self.responseSerializerDidComplete { queue.async { completionHandler(response) } }\n            }\n        }\n\n        return self\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:              The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - responseSerializer: The response serializer responsible for serializing the request, response, and data\n    ///                         contained in the destination `URL`.\n    ///   - completionHandler:  The code to be executed once the request has finished.\n    ///\n    /// - Returns:              The request.\n    @discardableResult\n    public func response<Serializer: DownloadResponseSerializerProtocol>(queue: DispatchQueue = .main,\n                                                                         responseSerializer: Serializer,\n                                                                         completionHandler: @escaping (AFDownloadResponse<Serializer.SerializedObject>) -> Void)\n        -> Self {\n        appendResponseSerializer {\n            // Start work that should be on the serialization queue.\n            let start = ProcessInfo.processInfo.systemUptime\n            let result: AFResult<Serializer.SerializedObject> = Result {\n                try responseSerializer.serializeDownload(request: self.request,\n                                                         response: self.response,\n                                                         fileURL: self.fileURL,\n                                                         error: self.error)\n            }.mapError { error in\n                error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error)))\n            }\n            let end = ProcessInfo.processInfo.systemUptime\n            // End work that should be on the serialization queue.\n\n            self.underlyingQueue.async {\n                let response = DownloadResponse(request: self.request,\n                                                response: self.response,\n                                                fileURL: self.fileURL,\n                                                resumeData: self.resumeData,\n                                                metrics: self.metrics,\n                                                serializationDuration: end - start,\n                                                result: result)\n\n                self.eventMonitor?.request(self, didParseResponse: response)\n\n                guard let serializerError = result.failure, let delegate = self.delegate else {\n                    self.responseSerializerDidComplete { queue.async { completionHandler(response) } }\n                    return\n                }\n\n                delegate.retryResult(for: self, dueTo: serializerError) { retryResult in\n                    var didComplete: (() -> Void)?\n\n                    defer {\n                        if let didComplete = didComplete {\n                            self.responseSerializerDidComplete { queue.async { didComplete() } }\n                        }\n                    }\n\n                    switch retryResult {\n                    case .doNotRetry:\n                        didComplete = { completionHandler(response) }\n\n                    case let .doNotRetryWithError(retryError):\n                        let result: AFResult<Serializer.SerializedObject> = .failure(retryError.asAFError(orFailWith: \"Received retryError was not already AFError\"))\n\n                        let response = DownloadResponse(request: self.request,\n                                                        response: self.response,\n                                                        fileURL: self.fileURL,\n                                                        resumeData: self.resumeData,\n                                                        metrics: self.metrics,\n                                                        serializationDuration: end - start,\n                                                        result: result)\n\n                        didComplete = { completionHandler(response) }\n\n                    case .retry, .retryWithDelay:\n                        delegate.retryRequest(self, withDelay: retryResult.delay)\n                    }\n                }\n            }\n        }\n\n        return self\n    }\n}\n\n// MARK: - URL\n\n/// A `DownloadResponseSerializerProtocol` that performs only `Error` checking and ensures that a downloaded `fileURL`\n/// is present.\npublic struct URLResponseSerializer: DownloadResponseSerializerProtocol {\n    /// Creates an instance.\n    public init() {}\n\n    public func serializeDownload(request: URLRequest?,\n                                  response: HTTPURLResponse?,\n                                  fileURL: URL?,\n                                  error: Error?) throws -> URL {\n        guard error == nil else { throw error! }\n\n        guard let url = fileURL else {\n            throw AFError.responseSerializationFailed(reason: .inputFileNil)\n        }\n\n        return url\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler using a `URLResponseSerializer` to be called once the request is finished.\n    ///\n    /// - Parameters:\n    ///   - queue:             The queue on which the completion handler is called. `.main` by default.\n    ///   - completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - Returns:             The request.\n    @discardableResult\n    public func responseURL(queue: DispatchQueue = .main,\n                            completionHandler: @escaping (AFDownloadResponse<URL>) -> Void) -> Self {\n        response(queue: queue, responseSerializer: URLResponseSerializer(), completionHandler: completionHandler)\n    }\n}\n\n// MARK: - Data\n\n/// A `ResponseSerializer` that performs minimal response checking and returns any response `Data` as-is. By default, a\n/// request returning `nil` or no data is considered an error. However, if the request has an `HTTPMethod` or the\n/// response has an  HTTP status code valid for empty responses, then an empty `Data` value is returned.\npublic final class DataResponseSerializer: ResponseSerializer {\n    public let dataPreprocessor: DataPreprocessor\n    public let emptyResponseCodes: Set<Int>\n    public let emptyRequestMethods: Set<HTTPMethod>\n\n    /// Creates an instance using the provided values.\n    ///\n    /// - Parameters:\n    ///   - dataPreprocessor:    `DataPreprocessor` used to prepare the received `Data` for serialization.\n    ///   - emptyResponseCodes:  The HTTP response codes for which empty responses are allowed. `[204, 205]` by default.\n    ///   - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default.\n    public init(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,\n                emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,\n                emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) {\n        self.dataPreprocessor = dataPreprocessor\n        self.emptyResponseCodes = emptyResponseCodes\n        self.emptyRequestMethods = emptyRequestMethods\n    }\n\n    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data {\n        guard error == nil else { throw error! }\n\n        guard var data = data, !data.isEmpty else {\n            guard emptyResponseAllowed(forRequest: request, response: response) else {\n                throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)\n            }\n\n            return Data()\n        }\n\n        data = try dataPreprocessor.preprocess(data)\n\n        return data\n    }\n}\n\nextension DataRequest {\n    /// Adds a handler using a `DataResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is called. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseData(queue: DispatchQueue = .main,\n                             dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,\n                             emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,\n                             emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,\n                             completionHandler: @escaping (AFDataResponse<Data>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: DataResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                            emptyResponseCodes: emptyResponseCodes,\n                                                            emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler using a `DataResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is called. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseData(queue: DispatchQueue = .main,\n                             dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,\n                             emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,\n                             emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,\n                             completionHandler: @escaping (AFDownloadResponse<Data>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: DataResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                            emptyResponseCodes: emptyResponseCodes,\n                                                            emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\n// MARK: - String\n\n/// A `ResponseSerializer` that decodes the response data as a `String`. By default, a request returning `nil` or no\n/// data is considered an error. However, if the request has an `HTTPMethod` or the response has an  HTTP status code\n/// valid for empty responses, then an empty `String` is returned.\npublic final class StringResponseSerializer: ResponseSerializer {\n    public let dataPreprocessor: DataPreprocessor\n    /// Optional string encoding used to validate the response.\n    public let encoding: String.Encoding?\n    public let emptyResponseCodes: Set<Int>\n    public let emptyRequestMethods: Set<HTTPMethod>\n\n    /// Creates an instance with the provided values.\n    ///\n    /// - Parameters:\n    ///   - dataPreprocessor:    `DataPreprocessor` used to prepare the received `Data` for serialization.\n    ///   - encoding:            A string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  The HTTP response codes for which empty responses are allowed. `[204, 205]` by default.\n    ///   - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default.\n    public init(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,\n                encoding: String.Encoding? = nil,\n                emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,\n                emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) {\n        self.dataPreprocessor = dataPreprocessor\n        self.encoding = encoding\n        self.emptyResponseCodes = emptyResponseCodes\n        self.emptyRequestMethods = emptyRequestMethods\n    }\n\n    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> String {\n        guard error == nil else { throw error! }\n\n        guard var data = data, !data.isEmpty else {\n            guard emptyResponseAllowed(forRequest: request, response: response) else {\n                throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)\n            }\n\n            return \"\"\n        }\n\n        data = try dataPreprocessor.preprocess(data)\n\n        var convertedEncoding = encoding\n\n        if let encodingName = response?.textEncodingName, convertedEncoding == nil {\n            convertedEncoding = String.Encoding(ianaCharsetName: encodingName)\n        }\n\n        let actualEncoding = convertedEncoding ?? .isoLatin1\n\n        guard let string = String(data: data, encoding: actualEncoding) else {\n            throw AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding))\n        }\n\n        return string\n    }\n}\n\nextension DataRequest {\n    /// Adds a handler using a `StringResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseString(queue: DispatchQueue = .main,\n                               dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,\n                               encoding: String.Encoding? = nil,\n                               emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,\n                               emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,\n                               completionHandler: @escaping (AFDataResponse<String>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: StringResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                              encoding: encoding,\n                                                              emptyResponseCodes: emptyResponseCodes,\n                                                              emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler using a `StringResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseString(queue: DispatchQueue = .main,\n                               dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,\n                               encoding: String.Encoding? = nil,\n                               emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,\n                               emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,\n                               completionHandler: @escaping (AFDownloadResponse<String>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: StringResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                              encoding: encoding,\n                                                              emptyResponseCodes: emptyResponseCodes,\n                                                              emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\n// MARK: - JSON\n\n/// A `ResponseSerializer` that decodes the response data using `JSONSerialization`. By default, a request returning\n/// `nil` or no data is considered an error. However, if the request has an `HTTPMethod` or the response has an\n/// HTTP status code valid for empty responses, then an `NSNull` value is returned.\npublic final class JSONResponseSerializer: ResponseSerializer {\n    public let dataPreprocessor: DataPreprocessor\n    public let emptyResponseCodes: Set<Int>\n    public let emptyRequestMethods: Set<HTTPMethod>\n    /// `JSONSerialization.ReadingOptions` used when serializing a response.\n    public let options: JSONSerialization.ReadingOptions\n\n    /// Creates an instance with the provided values.\n    ///\n    /// - Parameters:\n    ///   - dataPreprocessor:    `DataPreprocessor` used to prepare the received `Data` for serialization.\n    ///   - emptyResponseCodes:  The HTTP response codes for which empty responses are allowed. `[204, 205]` by default.\n    ///   - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default.\n    ///   - options:             The options to use. `.allowFragments` by default.\n    public init(dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,\n                emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,\n                emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,\n                options: JSONSerialization.ReadingOptions = .allowFragments) {\n        self.dataPreprocessor = dataPreprocessor\n        self.emptyResponseCodes = emptyResponseCodes\n        self.emptyRequestMethods = emptyRequestMethods\n        self.options = options\n    }\n\n    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any {\n        guard error == nil else { throw error! }\n\n        guard var data = data, !data.isEmpty else {\n            guard emptyResponseAllowed(forRequest: request, response: response) else {\n                throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)\n            }\n\n            return NSNull()\n        }\n\n        data = try dataPreprocessor.preprocess(data)\n\n        do {\n            return try JSONSerialization.jsonObject(with: data, options: options)\n        } catch {\n            throw AFError.responseSerializationFailed(reason: .jsonSerializationFailed(error: error))\n        }\n    }\n}\n\nextension DataRequest {\n    /// Adds a handler using a `JSONResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - options:             `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments`\n    ///                          by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseJSON(queue: DispatchQueue = .main,\n                             dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,\n                             emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,\n                             emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,\n                             options: JSONSerialization.ReadingOptions = .allowFragments,\n                             completionHandler: @escaping (AFDataResponse<Any>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: JSONResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                            emptyResponseCodes: emptyResponseCodes,\n                                                            emptyRequestMethods: emptyRequestMethods,\n                                                            options: options),\n                 completionHandler: completionHandler)\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler using a `JSONResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - options:             `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments`\n    ///                          by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseJSON(queue: DispatchQueue = .main,\n                             dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,\n                             emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,\n                             emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,\n                             options: JSONSerialization.ReadingOptions = .allowFragments,\n                             completionHandler: @escaping (AFDownloadResponse<Any>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: JSONResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                            emptyResponseCodes: emptyResponseCodes,\n                                                            emptyRequestMethods: emptyRequestMethods,\n                                                            options: options),\n                 completionHandler: completionHandler)\n    }\n}\n\n// MARK: - Empty\n\n/// Protocol representing an empty response. Use `T.emptyValue()` to get an instance.\npublic protocol EmptyResponse {\n    /// Empty value for the conforming type.\n    ///\n    /// - Returns: Value of `Self` to use for empty values.\n    static func emptyValue() -> Self\n}\n\n/// Type representing an empty value. Use `Empty.value` to get the static instance.\npublic struct Empty: Codable {\n    /// Static `Empty` instance used for all `Empty` responses.\n    public static let value = Empty()\n}\n\nextension Empty: EmptyResponse {\n    public static func emptyValue() -> Empty {\n        value\n    }\n}\n\n// MARK: - DataDecoder Protocol\n\n/// Any type which can decode `Data` into a `Decodable` type.\npublic protocol DataDecoder {\n    /// Decode `Data` into the provided type.\n    ///\n    /// - Parameters:\n    ///   - type:  The `Type` to be decoded.\n    ///   - data:  The `Data` to be decoded.\n    ///\n    /// - Returns: The decoded value of type `D`.\n    /// - Throws:  Any error that occurs during decode.\n    func decode<D: Decodable>(_ type: D.Type, from data: Data) throws -> D\n}\n\n/// `JSONDecoder` automatically conforms to `DataDecoder`.\nextension JSONDecoder: DataDecoder {}\n/// `PropertyListDecoder` automatically conforms to `DataDecoder`.\nextension PropertyListDecoder: DataDecoder {}\n\n// MARK: - Decodable\n\n/// A `ResponseSerializer` that decodes the response data as a generic value using any type that conforms to\n/// `DataDecoder`. By default, this is an instance of `JSONDecoder`. Additionally, a request returning `nil` or no data\n/// is considered an error. However, if the request has an `HTTPMethod` or the response has an HTTP status code valid\n/// for empty responses then an empty value will be returned. If the decoded type conforms to `EmptyResponse`, the\n/// type's `emptyValue()` will be returned. If the decoded type is `Empty`, the `.value` instance is returned. If the\n/// decoded type *does not* conform to `EmptyResponse` and isn't `Empty`, an error will be produced.\npublic final class DecodableResponseSerializer<T: Decodable>: ResponseSerializer {\n    public let dataPreprocessor: DataPreprocessor\n    /// The `DataDecoder` instance used to decode responses.\n    public let decoder: DataDecoder\n    public let emptyResponseCodes: Set<Int>\n    public let emptyRequestMethods: Set<HTTPMethod>\n\n    /// Creates an instance using the values provided.\n    ///\n    /// - Parameters:\n    ///   - dataPreprocessor:    `DataPreprocessor` used to prepare the received `Data` for serialization.\n    ///   - decoder:             The `DataDecoder`. `JSONDecoder()` by default.\n    ///   - emptyResponseCodes:  The HTTP response codes for which empty responses are allowed. `[204, 205]` by default.\n    ///   - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default.\n    public init(dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor,\n                decoder: DataDecoder = JSONDecoder(),\n                emptyResponseCodes: Set<Int> = DecodableResponseSerializer.defaultEmptyResponseCodes,\n                emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer.defaultEmptyRequestMethods) {\n        self.dataPreprocessor = dataPreprocessor\n        self.decoder = decoder\n        self.emptyResponseCodes = emptyResponseCodes\n        self.emptyRequestMethods = emptyRequestMethods\n    }\n\n    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> T {\n        guard error == nil else { throw error! }\n\n        guard var data = data, !data.isEmpty else {\n            guard emptyResponseAllowed(forRequest: request, response: response) else {\n                throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength)\n            }\n\n            guard let emptyResponseType = T.self as? EmptyResponse.Type, let emptyValue = emptyResponseType.emptyValue() as? T else {\n                throw AFError.responseSerializationFailed(reason: .invalidEmptyResponse(type: \"\\(T.self)\"))\n            }\n\n            return emptyValue\n        }\n\n        data = try dataPreprocessor.preprocess(data)\n\n        do {\n            return try decoder.decode(T.self, from: data)\n        } catch {\n            throw AFError.responseSerializationFailed(reason: .decodingFailed(error: error))\n        }\n    }\n}\n\nextension DataRequest {\n    /// Adds a handler using a `DecodableResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - type:                `Decodable` type to decode from response data.\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - decoder:             `DataDecoder` to use to decode the response. `JSONDecoder()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - options:             `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments`\n    ///                          by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseDecodable<T: Decodable>(of type: T.Type = T.self,\n                                                queue: DispatchQueue = .main,\n                                                dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,\n                                                decoder: DataDecoder = JSONDecoder(),\n                                                emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,\n                                                emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,\n                                                completionHandler: @escaping (AFDataResponse<T>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                                 decoder: decoder,\n                                                                 emptyResponseCodes: emptyResponseCodes,\n                                                                 emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler using a `DecodableResponseSerializer` to be called once the request has finished.\n    ///\n    /// - Parameters:\n    ///   - type:                `Decodable` type to decode from response data.\n    ///   - queue:               The queue on which the completion handler is dispatched. `.main` by default.\n    ///   - dataPreprocessor:    `DataPreprocessor` which processes the received `Data` before calling the\n    ///                          `completionHandler`. `PassthroughPreprocessor()` by default.\n    ///   - decoder:             `DataDecoder` to use to decode the response. `JSONDecoder()` by default.\n    ///   - encoding:            The string encoding. Defaults to `nil`, in which case the encoding will be determined\n    ///                          from the server response, falling back to the default HTTP character set, `ISO-8859-1`.\n    ///   - emptyResponseCodes:  HTTP status codes for which empty responses are always valid. `[204, 205]` by default.\n    ///   - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default.\n    ///   - options:             `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments`\n    ///                          by default.\n    ///   - completionHandler:   A closure to be executed once the request has finished.\n    ///\n    /// - Returns:               The request.\n    @discardableResult\n    public func responseDecodable<T: Decodable>(of type: T.Type = T.self,\n                                                queue: DispatchQueue = .main,\n                                                dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,\n                                                decoder: DataDecoder = JSONDecoder(),\n                                                emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,\n                                                emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,\n                                                completionHandler: @escaping (AFDownloadResponse<T>) -> Void) -> Self {\n        response(queue: queue,\n                 responseSerializer: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor,\n                                                                 decoder: decoder,\n                                                                 emptyResponseCodes: emptyResponseCodes,\n                                                                 emptyRequestMethods: emptyRequestMethods),\n                 completionHandler: completionHandler)\n    }\n}\n\n// MARK: - DataStreamRequest\n\n/// A type which can serialize incoming `Data`.\npublic protocol DataStreamSerializer {\n    /// Type produced from the serialized `Data`.\n    associatedtype SerializedObject\n\n    /// Serializes incoming `Data` into a `SerializedObject` value.\n    ///\n    /// - Parameter data: `Data` to be serialized.\n    ///\n    /// - Throws: Any error produced during serialization.\n    func serialize(_ data: Data) throws -> SerializedObject\n}\n\n/// `DataStreamSerializer` which uses the provided `DataPreprocessor` and `DataDecoder` to serialize the incoming `Data`.\npublic struct DecodableStreamSerializer<T: Decodable>: DataStreamSerializer {\n    /// `DataDecoder` used to decode incoming `Data`.\n    public let decoder: DataDecoder\n    /// `DataPreprocessor` incoming `Data` is passed through before being passed to the `DataDecoder`.\n    public let dataPreprocessor: DataPreprocessor\n\n    /// Creates an instance with the provided `DataDecoder` and `DataPreprocessor`.\n    /// - Parameters:\n    ///   - decoder: `        DataDecoder` used to decode incoming `Data`.\n    ///   - dataPreprocessor: `DataPreprocessor` used to process incoming `Data` before it's passed through the `decoder`.\n    public init(decoder: DataDecoder = JSONDecoder(), dataPreprocessor: DataPreprocessor = PassthroughPreprocessor()) {\n        self.decoder = decoder\n        self.dataPreprocessor = dataPreprocessor\n    }\n\n    public func serialize(_ data: Data) throws -> T {\n        let processedData = try dataPreprocessor.preprocess(data)\n        do {\n            return try decoder.decode(T.self, from: processedData)\n        } catch {\n            throw AFError.responseSerializationFailed(reason: .decodingFailed(error: error))\n        }\n    }\n}\n\n/// `DataStreamSerializer` which performs no serialization on incoming `Data`.\npublic struct PassthroughStreamSerializer: DataStreamSerializer {\n    public func serialize(_ data: Data) throws -> Data { data }\n}\n\n/// `DataStreamSerializer` which serializes incoming stream `Data` into `UTF8`-decoded `String` values.\npublic struct StringStreamSerializer: DataStreamSerializer {\n    public func serialize(_ data: Data) throws -> String {\n        String(decoding: data, as: UTF8.self)\n    }\n}\n\nextension DataStreamRequest {\n    /// Adds a `StreamHandler` which performs no parsing on incoming `Data`.\n    ///\n    /// - Parameters:\n    ///   - queue:  `DispatchQueue` on which to perform `StreamHandler` closure.\n    ///   - stream: `StreamHandler` closure called as `Data` is received. May be called multiple times.\n    ///\n    /// - Returns:  The `DataStreamRequest`.\n    @discardableResult\n    public func responseStream(on queue: DispatchQueue = .main, stream: @escaping Handler<Data, Never>) -> Self {\n        let parser = { [unowned self] (data: Data) in\n            queue.async {\n                self.capturingError {\n                    try stream(.init(event: .stream(.success(data)), token: .init(self)))\n                }\n\n                self.updateAndCompleteIfPossible()\n            }\n        }\n\n        $streamMutableState.write { $0.streams.append(parser) }\n        appendStreamCompletion(on: queue, stream: stream)\n\n        return self\n    }\n\n    /// Adds a `StreamHandler` which uses the provided `DataStreamSerializer` to process incoming `Data`.\n    ///\n    /// - Parameters:\n    ///   - serializer: `DataStreamSerializer` used to process incoming `Data`. Its work is done on the `serializationQueue`.\n    ///   - queue:      `DispatchQueue` on which to perform `StreamHandler` closure.\n    ///   - stream:     `StreamHandler` closure called as `Data` is received. May be called multiple times.\n    ///\n    /// - Returns:      The `DataStreamRequest`.\n    @discardableResult\n    public func responseStream<Serializer: DataStreamSerializer>(using serializer: Serializer,\n                                                                 on queue: DispatchQueue = .main,\n                                                                 stream: @escaping Handler<Serializer.SerializedObject, AFError>) -> Self {\n        let parser = { [unowned self] (data: Data) in\n            self.serializationQueue.async {\n                // Start work on serialization queue.\n                let result = Result { try serializer.serialize(data) }\n                    .mapError { $0.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: $0))) }\n                // End work on serialization queue.\n                self.underlyingQueue.async {\n                    self.eventMonitor?.request(self, didParseStream: result)\n\n                    if result.isFailure, self.automaticallyCancelOnStreamError {\n                        self.cancel()\n                    }\n\n                    queue.async {\n                        self.capturingError {\n                            try stream(.init(event: .stream(result), token: .init(self)))\n                        }\n\n                        self.updateAndCompleteIfPossible()\n                    }\n                }\n            }\n        }\n\n        $streamMutableState.write { $0.streams.append(parser) }\n        appendStreamCompletion(on: queue, stream: stream)\n\n        return self\n    }\n\n    /// Adds a `StreamHandler` which parses incoming `Data` as a UTF8 `String`.\n    ///\n    /// - Parameters:\n    ///   - queue:      `DispatchQueue` on which to perform `StreamHandler` closure.\n    ///   - stream:     `StreamHandler` closure called as `Data` is received. May be called multiple times.\n    ///\n    /// - Returns:  The `DataStreamRequest`.\n    @discardableResult\n    public func responseStreamString(on queue: DispatchQueue = .main,\n                                     stream: @escaping Handler<String, Never>) -> Self {\n        let parser = { [unowned self] (data: Data) in\n            self.serializationQueue.async {\n                // Start work on serialization queue.\n                let string = String(decoding: data, as: UTF8.self)\n                // End work on serialization queue.\n                self.underlyingQueue.async {\n                    self.eventMonitor?.request(self, didParseStream: .success(string))\n\n                    queue.async {\n                        self.capturingError {\n                            try stream(.init(event: .stream(.success(string)), token: .init(self)))\n                        }\n\n                        self.updateAndCompleteIfPossible()\n                    }\n                }\n            }\n        }\n\n        $streamMutableState.write { $0.streams.append(parser) }\n        appendStreamCompletion(on: queue, stream: stream)\n\n        return self\n    }\n\n    private func updateAndCompleteIfPossible() {\n        $streamMutableState.write { state in\n            state.numberOfExecutingStreams -= 1\n\n            guard state.numberOfExecutingStreams == 0, !state.enqueuedCompletionEvents.isEmpty else { return }\n\n            let completionEvents = state.enqueuedCompletionEvents\n            self.underlyingQueue.async { completionEvents.forEach { $0() } }\n            state.enqueuedCompletionEvents.removeAll()\n        }\n    }\n\n    /// Adds a `StreamHandler` which parses incoming `Data` using the provided `DataDecoder`.\n    ///\n    /// - Parameters:\n    ///   - type:         `Decodable` type to parse incoming `Data` into.\n    ///   - queue:        `DispatchQueue` on which to perform `StreamHandler` closure.\n    ///   - decoder:      `DataDecoder` used to decode the incoming `Data`.\n    ///   - preprocessor: `DataPreprocessor` used to process the incoming `Data` before it's passed to the `decoder`.\n    ///   - stream:       `StreamHandler` closure called as `Data` is received. May be called multiple times.\n    ///\n    /// - Returns: The `DataStreamRequest`.\n    @discardableResult\n    public func responseStreamDecodable<T: Decodable>(of type: T.Type = T.self,\n                                                      on queue: DispatchQueue = .main,\n                                                      using decoder: DataDecoder = JSONDecoder(),\n                                                      preprocessor: DataPreprocessor = PassthroughPreprocessor(),\n                                                      stream: @escaping Handler<T, AFError>) -> Self {\n        responseStream(using: DecodableStreamSerializer<T>(decoder: decoder, dataPreprocessor: preprocessor),\n                       stream: stream)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Result+Alamofire.swift",
    "content": "//\n//  Result+Alamofire.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Default type of `Result` returned by Alamofire, with an `AFError` `Failure` type.\npublic typealias AFResult<Success> = Result<Success, AFError>\n\n// MARK: - Internal APIs\n\nextension Result {\n    /// Returns whether the instance is `.success`.\n    var isSuccess: Bool {\n        guard case .success = self else { return false }\n        return true\n    }\n\n    /// Returns whether the instance is `.failure`.\n    var isFailure: Bool {\n        !isSuccess\n    }\n\n    /// Returns the associated value if the result is a success, `nil` otherwise.\n    var success: Success? {\n        guard case let .success(value) = self else { return nil }\n        return value\n    }\n\n    /// Returns the associated error value if the result is a failure, `nil` otherwise.\n    var failure: Failure? {\n        guard case let .failure(error) = self else { return nil }\n        return error\n    }\n\n    /// Initializes a `Result` from value or error. Returns `.failure` if the error is non-nil, `.success` otherwise.\n    ///\n    /// - Parameters:\n    ///   - value: A value.\n    ///   - error: An `Error`.\n    init(value: Success, error: Failure?) {\n        if let error = error {\n            self = .failure(error)\n        } else {\n            self = .success(value)\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.\n    ///\n    /// Use the `tryMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: Result<Data, Error> = .success(Data(...))\n    ///     let possibleObject = possibleData.tryMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance.\n    ///\n    /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the\n    ///            same failure.\n    func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> Result<NewSuccess, Error> {\n        switch self {\n        case let .success(value):\n            do {\n                return try .success(transform(value))\n            } catch {\n                return .failure(error)\n            }\n        case let .failure(error):\n            return .failure(error)\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `tryMapError` function with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: Result<Data, Error> = .success(Data(...))\n    ///     let possibleObject = possibleData.tryMapError {\n    ///         try someFailableFunction(taking: $0)\n    ///     }\n    ///\n    /// - Parameter transform: A throwing closure that takes the error of the instance.\n    ///\n    /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns\n    ///            the same success.\n    func tryMapError<NewFailure: Error>(_ transform: (Failure) throws -> NewFailure) -> Result<Success, Error> {\n        switch self {\n        case let .failure(error):\n            do {\n                return try .failure(transform(error))\n            } catch {\n                return .failure(error)\n            }\n        case let .success(value):\n            return .success(value)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/RetryPolicy.swift",
    "content": "//\n//  RetryPolicy.swift\n//\n//  Copyright (c) 2019-2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes\n/// as well as certain types of networking errors.\nopen class RetryPolicy: RequestInterceptor {\n    /// The default retry limit for retry policies.\n    public static let defaultRetryLimit: UInt = 2\n\n    /// The default exponential backoff base for retry policies (must be a minimum of 2).\n    public static let defaultExponentialBackoffBase: UInt = 2\n\n    /// The default exponential backoff scale for retry policies.\n    public static let defaultExponentialBackoffScale: Double = 0.5\n\n    /// The default HTTP methods to retry.\n    /// See [RFC 2616 - Section 9.1.2](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) for more information.\n    public static let defaultRetryableHTTPMethods: Set<HTTPMethod> = [.delete, // [Delete](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7) - not always idempotent\n                                                                      .get, // [GET](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3) - generally idempotent\n                                                                      .head, // [HEAD](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4) - generally idempotent\n                                                                      .options, // [OPTIONS](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2) - inherently idempotent\n                                                                      .put, // [PUT](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) - not always idempotent\n                                                                      .trace // [TRACE](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.8) - inherently idempotent\n    ]\n\n    /// The default HTTP status codes to retry.\n    /// See [RFC 2616 - Section 10](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10) for more information.\n    public static let defaultRetryableHTTPStatusCodes: Set<Int> = [408, // [Request Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.9)\n                                                                   500, // [Internal Server Error](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1)\n                                                                   502, // [Bad Gateway](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.3)\n                                                                   503, // [Service Unavailable](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4)\n                                                                   504 // [Gateway Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5)\n    ]\n\n    /// The default URL error codes to retry.\n    public static let defaultRetryableURLErrorCodes: Set<URLError.Code> = [// [Security] App Transport Security disallowed a connection because there is no secure network connection.\n        //   - [Disabled] ATS settings do not change at runtime.\n        // .appTransportSecurityRequiresSecureConnection,\n\n        // [System] An app or app extension attempted to connect to a background session that is already connected to a\n        // process.\n        //   - [Enabled] The other process could release the background session.\n        .backgroundSessionInUseByAnotherProcess,\n\n        // [System] The shared container identifier of the URL session configuration is needed but has not been set.\n        //   - [Disabled] Cannot change at runtime.\n        // .backgroundSessionRequiresSharedContainer,\n\n        // [System] The app is suspended or exits while a background data task is processing.\n        //   - [Enabled] App can be foregrounded or launched to recover.\n        .backgroundSessionWasDisconnected,\n\n        // [Network] The URL Loading system received bad data from the server.\n        //   - [Enabled] Server could return valid data when retrying.\n        .badServerResponse,\n\n        // [Resource] A malformed URL prevented a URL request from being initiated.\n        //   - [Disabled] URL was most likely constructed incorrectly.\n        // .badURL,\n\n        // [System] A connection was attempted while a phone call is active on a network that does not support\n        // simultaneous phone and data communication (EDGE or GPRS).\n        //   - [Enabled] Phone call could be ended to allow request to recover.\n        .callIsActive,\n\n        // [Client] An asynchronous load has been canceled.\n        //   - [Disabled] Request was cancelled by the client.\n        // .cancelled,\n\n        // [File System] A download task couldn’t close the downloaded file on disk.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotCloseFile,\n\n        // [Network] An attempt to connect to a host failed.\n        //   - [Enabled] Server or DNS lookup could recover during retry.\n        .cannotConnectToHost,\n\n        // [File System] A download task couldn’t create the downloaded file on disk because of an I/O failure.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotCreateFile,\n\n        // [Data] Content data received during a connection request had an unknown content encoding.\n        //   - [Disabled] Server is unlikely to modify the content encoding during a retry.\n        // .cannotDecodeContentData,\n\n        // [Data] Content data received during a connection request could not be decoded for a known content encoding.\n        //   - [Disabled] Server is unlikely to modify the content encoding during a retry.\n        // .cannotDecodeRawData,\n\n        // [Network] The host name for a URL could not be resolved.\n        //   - [Enabled] Server or DNS lookup could recover during retry.\n        .cannotFindHost,\n\n        // [Network] A request to load an item only from the cache could not be satisfied.\n        //   - [Enabled] Cache could be populated during a retry.\n        .cannotLoadFromNetwork,\n\n        // [File System] A download task was unable to move a downloaded file on disk.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotMoveFile,\n\n        // [File System] A download task was unable to open the downloaded file on disk.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotOpenFile,\n\n        // [Data] A task could not parse a response.\n        //   - [Disabled] Invalid response is unlikely to recover with retry.\n        // .cannotParseResponse,\n\n        // [File System] A download task was unable to remove a downloaded file from disk.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotRemoveFile,\n\n        // [File System] A download task was unable to write to the downloaded file on disk.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .cannotWriteToFile,\n\n        // [Security] A client certificate was rejected.\n        //   - [Disabled] Client certificate is unlikely to change with retry.\n        // .clientCertificateRejected,\n\n        // [Security] A client certificate was required to authenticate an SSL connection during a request.\n        //   - [Disabled] Client certificate is unlikely to be provided with retry.\n        // .clientCertificateRequired,\n\n        // [Data] The length of the resource data exceeds the maximum allowed.\n        //   - [Disabled] Resource will likely still exceed the length maximum on retry.\n        // .dataLengthExceedsMaximum,\n\n        // [System] The cellular network disallowed a connection.\n        //   - [Enabled] WiFi connection could be established during retry.\n        .dataNotAllowed,\n\n        // [Network] The host address could not be found via DNS lookup.\n        //   - [Enabled] DNS lookup could succeed during retry.\n        .dnsLookupFailed,\n\n        // [Data] A download task failed to decode an encoded file during the download.\n        //   - [Enabled] Server could correct the decoding issue with retry.\n        .downloadDecodingFailedMidStream,\n\n        // [Data] A download task failed to decode an encoded file after downloading.\n        //   - [Enabled] Server could correct the decoding issue with retry.\n        .downloadDecodingFailedToComplete,\n\n        // [File System] A file does not exist.\n        //   - [Disabled] File system error is unlikely to recover with retry.\n        // .fileDoesNotExist,\n\n        // [File System] A request for an FTP file resulted in the server responding that the file is not a plain file,\n        // but a directory.\n        //   - [Disabled] FTP directory is not likely to change to a file during a retry.\n        // .fileIsDirectory,\n\n        // [Network] A redirect loop has been detected or the threshold for number of allowable redirects has been\n        // exceeded (currently 16).\n        //   - [Disabled] The redirect loop is unlikely to be resolved within the retry window.\n        // .httpTooManyRedirects,\n\n        // [System] The attempted connection required activating a data context while roaming, but international roaming\n        // is disabled.\n        //   - [Enabled] WiFi connection could be established during retry.\n        .internationalRoamingOff,\n\n        // [Connectivity] A client or server connection was severed in the middle of an in-progress load.\n        //   - [Enabled] A network connection could be established during retry.\n        .networkConnectionLost,\n\n        // [File System] A resource couldn’t be read because of insufficient permissions.\n        //   - [Disabled] Permissions are unlikely to be granted during retry.\n        // .noPermissionsToReadFile,\n\n        // [Connectivity] A network resource was requested, but an internet connection has not been established and\n        // cannot be established automatically.\n        //   - [Enabled] A network connection could be established during retry.\n        .notConnectedToInternet,\n\n        // [Resource] A redirect was specified by way of server response code, but the server did not accompany this\n        // code with a redirect URL.\n        //   - [Disabled] The redirect URL is unlikely to be supplied during a retry.\n        // .redirectToNonExistentLocation,\n\n        // [Client] A body stream is needed but the client did not provide one.\n        //   - [Disabled] The client will be unlikely to supply a body stream during retry.\n        // .requestBodyStreamExhausted,\n\n        // [Resource] A requested resource couldn’t be retrieved.\n        //   - [Disabled] The resource is unlikely to become available during the retry window.\n        // .resourceUnavailable,\n\n        // [Security] An attempt to establish a secure connection failed for reasons that can’t be expressed more\n        // specifically.\n        //   - [Enabled] The secure connection could be established during a retry given the lack of specificity\n        //     provided by the error.\n        .secureConnectionFailed,\n\n        // [Security] A server certificate had a date which indicates it has expired, or is not yet valid.\n        //   - [Enabled] The server certificate could become valid within the retry window.\n        .serverCertificateHasBadDate,\n\n        // [Security] A server certificate was not signed by any root server.\n        //   - [Disabled] The server certificate is unlikely to change during the retry window.\n        // .serverCertificateHasUnknownRoot,\n\n        // [Security] A server certificate is not yet valid.\n        //   - [Enabled] The server certificate could become valid within the retry window.\n        .serverCertificateNotYetValid,\n\n        // [Security] A server certificate was signed by a root server that isn’t trusted.\n        //   - [Disabled] The server certificate is unlikely to become trusted within the retry window.\n        // .serverCertificateUntrusted,\n\n        // [Network] An asynchronous operation timed out.\n        //   - [Enabled] The request timed out for an unknown reason and should be retried.\n        .timedOut\n\n        // [System] The URL Loading System encountered an error that it can’t interpret.\n        //   - [Disabled] The error could not be interpreted and is unlikely to be recovered from during a retry.\n        // .unknown,\n\n        // [Resource] A properly formed URL couldn’t be handled by the framework.\n        //   - [Disabled] The URL is unlikely to change during a retry.\n        // .unsupportedURL,\n\n        // [Client] Authentication is required to access a resource.\n        //   - [Disabled] The user authentication is unlikely to be provided by retrying.\n        // .userAuthenticationRequired,\n\n        // [Client] An asynchronous request for authentication has been canceled by the user.\n        //   - [Disabled] The user cancelled authentication and explicitly took action to not retry.\n        // .userCancelledAuthentication,\n\n        // [Resource] A server reported that a URL has a non-zero content length, but terminated the network connection\n        // gracefully without sending any data.\n        //   - [Disabled] The server is unlikely to provide data during the retry window.\n        // .zeroByteResource,\n    ]\n\n    /// The total number of times the request is allowed to be retried.\n    public let retryLimit: UInt\n\n    /// The base of the exponential backoff policy (should always be greater than or equal to 2).\n    public let exponentialBackoffBase: UInt\n\n    /// The scale of the exponential backoff.\n    public let exponentialBackoffScale: Double\n\n    /// The HTTP methods that are allowed to be retried.\n    public let retryableHTTPMethods: Set<HTTPMethod>\n\n    /// The HTTP status codes that are automatically retried by the policy.\n    public let retryableHTTPStatusCodes: Set<Int>\n\n    /// The URL error codes that are automatically retried by the policy.\n    public let retryableURLErrorCodes: Set<URLError.Code>\n\n    /// Creates an `ExponentialBackoffRetryPolicy` from the specified parameters.\n    ///\n    /// - Parameters:\n    ///   - retryLimit:               The total number of times the request is allowed to be retried. `2` by default.\n    ///   - exponentialBackoffBase:   The base of the exponential backoff policy. `2` by default.\n    ///   - exponentialBackoffScale:  The scale of the exponential backoff. `0.5` by default.\n    ///   - retryableHTTPMethods:     The HTTP methods that are allowed to be retried.\n    ///                               `RetryPolicy.defaultRetryableHTTPMethods` by default.\n    ///   - retryableHTTPStatusCodes: The HTTP status codes that are automatically retried by the policy.\n    ///                               `RetryPolicy.defaultRetryableHTTPStatusCodes` by default.\n    ///   - retryableURLErrorCodes:   The URL error codes that are automatically retried by the policy.\n    ///                               `RetryPolicy.defaultRetryableURLErrorCodes` by default.\n    public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit,\n                exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase,\n                exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale,\n                retryableHTTPMethods: Set<HTTPMethod> = RetryPolicy.defaultRetryableHTTPMethods,\n                retryableHTTPStatusCodes: Set<Int> = RetryPolicy.defaultRetryableHTTPStatusCodes,\n                retryableURLErrorCodes: Set<URLError.Code> = RetryPolicy.defaultRetryableURLErrorCodes) {\n        precondition(exponentialBackoffBase >= 2, \"The `exponentialBackoffBase` must be a minimum of 2.\")\n\n        self.retryLimit = retryLimit\n        self.exponentialBackoffBase = exponentialBackoffBase\n        self.exponentialBackoffScale = exponentialBackoffScale\n        self.retryableHTTPMethods = retryableHTTPMethods\n        self.retryableHTTPStatusCodes = retryableHTTPStatusCodes\n        self.retryableURLErrorCodes = retryableURLErrorCodes\n    }\n\n    open func retry(_ request: Request,\n                    for session: Session,\n                    dueTo error: Error,\n                    completion: @escaping (RetryResult) -> Void) {\n        if request.retryCount < retryLimit, shouldRetry(request: request, dueTo: error) {\n            completion(.retryWithDelay(pow(Double(exponentialBackoffBase), Double(request.retryCount)) * exponentialBackoffScale))\n        } else {\n            completion(.doNotRetry)\n        }\n    }\n\n    /// Determines whether or not to retry the provided `Request`.\n    ///\n    /// - Parameters:\n    ///     - request: `Request` that failed due to the provided `Error`.\n    ///     - error:   `Error` encountered while executing the `Request`.\n    ///\n    /// - Returns:     `Bool` determining whether or not to retry the `Request`.\n    open func shouldRetry(request: Request, dueTo error: Error) -> Bool {\n        guard let httpMethod = request.request?.method, retryableHTTPMethods.contains(httpMethod) else { return false }\n\n        if let statusCode = request.response?.statusCode, retryableHTTPStatusCodes.contains(statusCode) {\n            return true\n        } else {\n            let errorCode = (error as? URLError)?.code\n            let afErrorCode = (error.asAFError?.underlyingError as? URLError)?.code\n\n            guard let code = errorCode ?? afErrorCode else { return false }\n\n            return retryableURLErrorCodes.contains(code)\n        }\n    }\n}\n\n// MARK: -\n\n/// A retry policy that automatically retries idempotent requests for network connection lost errors. For more\n/// information about retrying network connection lost errors, please refer to Apple's\n/// [technical document](https://developer.apple.com/library/content/qa/qa1941/_index.html).\nopen class ConnectionLostRetryPolicy: RetryPolicy {\n    /// Creates a `ConnectionLostRetryPolicy` instance from the specified parameters.\n    ///\n    /// - Parameters:\n    ///   - retryLimit:              The total number of times the request is allowed to be retried.\n    ///                              `RetryPolicy.defaultRetryLimit` by default.\n    ///   - exponentialBackoffBase:  The base of the exponential backoff policy.\n    ///                              `RetryPolicy.defaultExponentialBackoffBase` by default.\n    ///   - exponentialBackoffScale: The scale of the exponential backoff.\n    ///                              `RetryPolicy.defaultExponentialBackoffScale` by default.\n    ///   - retryableHTTPMethods:    The idempotent http methods to retry.\n    ///                              `RetryPolicy.defaultRetryableHTTPMethods` by default.\n    public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit,\n                exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase,\n                exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale,\n                retryableHTTPMethods: Set<HTTPMethod> = RetryPolicy.defaultRetryableHTTPMethods) {\n        super.init(retryLimit: retryLimit,\n                   exponentialBackoffBase: exponentialBackoffBase,\n                   exponentialBackoffScale: exponentialBackoffScale,\n                   retryableHTTPMethods: retryableHTTPMethods,\n                   retryableHTTPStatusCodes: [],\n                   retryableURLErrorCodes: [.networkConnectionLost])\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ServerTrustEvaluation.swift",
    "content": "//\n//  ServerTrustPolicy.swift\n//\n//  Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Responsible for managing the mapping of `ServerTrustEvaluating` values to given hosts.\nopen class ServerTrustManager {\n    /// Determines whether all hosts for this `ServerTrustManager` must be evaluated. `true` by default.\n    public let allHostsMustBeEvaluated: Bool\n\n    /// The dictionary of policies mapped to a particular host.\n    public let evaluators: [String: ServerTrustEvaluating]\n\n    /// Initializes the `ServerTrustManager` instance with the given evaluators.\n    ///\n    /// Since different servers and web services can have different leaf certificates, intermediate and even root\n    /// certificates, it is important to have the flexibility to specify evaluation policies on a per host basis. This\n    /// allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key\n    /// pinning for host3 and disabling evaluation for host4.\n    ///\n    /// - Parameters:\n    ///   - allHostsMustBeEvaluated: The value determining whether all hosts for this instance must be evaluated. `true`\n    ///                              by default.\n    ///   - evaluators:              A dictionary of evaluators mapped to hosts.\n    public init(allHostsMustBeEvaluated: Bool = true, evaluators: [String: ServerTrustEvaluating]) {\n        self.allHostsMustBeEvaluated = allHostsMustBeEvaluated\n        self.evaluators = evaluators\n    }\n\n    /// Returns the `ServerTrustEvaluating` value for the given host, if one is set.\n    ///\n    /// By default, this method will return the policy that perfectly matches the given host. Subclasses could override\n    /// this method and implement more complex mapping implementations such as wildcards.\n    ///\n    /// - Parameter host: The host to use when searching for a matching policy.\n    ///\n    /// - Returns:        The `ServerTrustEvaluating` value for the given host if found, `nil` otherwise.\n    /// - Throws:         `AFError.serverTrustEvaluationFailed` if `allHostsMustBeEvaluated` is `true` and no matching\n    ///                   evaluators are found.\n    open func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating? {\n        guard let evaluator = evaluators[host] else {\n            if allHostsMustBeEvaluated {\n                throw AFError.serverTrustEvaluationFailed(reason: .noRequiredEvaluator(host: host))\n            }\n\n            return nil\n        }\n\n        return evaluator\n    }\n}\n\n/// A protocol describing the API used to evaluate server trusts.\npublic protocol ServerTrustEvaluating {\n    #if os(Linux)\n    // Implement this once Linux has API for evaluating server trusts.\n    #else\n    /// Evaluates the given `SecTrust` value for the given `host`.\n    ///\n    /// - Parameters:\n    ///   - trust: The `SecTrust` value to evaluate.\n    ///   - host:  The host for which to evaluate the `SecTrust` value.\n    ///\n    /// - Returns: A `Bool` indicating whether the evaluator considers the `SecTrust` value valid for `host`.\n    func evaluate(_ trust: SecTrust, forHost host: String) throws\n    #endif\n}\n\n// MARK: - Server Trust Evaluators\n\n/// An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the\n/// host provided by the challenge. Applications are encouraged to always validate the host in production environments\n/// to guarantee the validity of the server's certificate chain.\npublic final class DefaultTrustEvaluator: ServerTrustEvaluating {\n    private let validateHost: Bool\n\n    /// Creates a `DefaultTrustEvaluator`.\n    ///\n    /// - Parameter validateHost: Determines whether or not the evaluator should validate the host. `true` by default.\n    public init(validateHost: Bool = true) {\n        self.validateHost = validateHost\n    }\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        if validateHost {\n            try trust.af.performValidation(forHost: host)\n        }\n\n        try trust.af.performDefaultValidation(forHost: host)\n    }\n}\n\n/// An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate\n/// the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates.\n/// Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS\n/// 10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production\n/// environments to guarantee the validity of the server's certificate chain.\npublic final class RevocationTrustEvaluator: ServerTrustEvaluating {\n    /// Represents the options to be use when evaluating the status of a certificate.\n    /// Only Revocation Policy Constants are valid, and can be found in [Apple's documentation](https://developer.apple.com/documentation/security/certificate_key_and_trust_services/policies/1563600-revocation_policy_constants).\n    public struct Options: OptionSet {\n        /// Perform revocation checking using the CRL (Certification Revocation List) method.\n        public static let crl = Options(rawValue: kSecRevocationCRLMethod)\n        /// Consult only locally cached replies; do not use network access.\n        public static let networkAccessDisabled = Options(rawValue: kSecRevocationNetworkAccessDisabled)\n        /// Perform revocation checking using OCSP (Online Certificate Status Protocol).\n        public static let ocsp = Options(rawValue: kSecRevocationOCSPMethod)\n        /// Prefer CRL revocation checking over OCSP; by default, OCSP is preferred.\n        public static let preferCRL = Options(rawValue: kSecRevocationPreferCRL)\n        /// Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a\n        /// \"best attempt\" basis, where failure to reach the server is not considered fatal.\n        public static let requirePositiveResponse = Options(rawValue: kSecRevocationRequirePositiveResponse)\n        /// Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the\n        /// certificate and the value of `preferCRL`.\n        public static let any = Options(rawValue: kSecRevocationUseAnyAvailableMethod)\n\n        /// The raw value of the option.\n        public let rawValue: CFOptionFlags\n\n        /// Creates an `Options` value with the given `CFOptionFlags`.\n        ///\n        /// - Parameter rawValue: The `CFOptionFlags` value to initialize with.\n        public init(rawValue: CFOptionFlags) {\n            self.rawValue = rawValue\n        }\n    }\n\n    private let performDefaultValidation: Bool\n    private let validateHost: Bool\n    private let options: Options\n\n    /// Creates a `RevocationTrustEvaluator`.\n    ///\n    /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use\n    ///         `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates.\n    ///\n    /// - Parameters:\n    ///   - performDefaultValidation:     Determines whether default validation should be performed in addition to\n    ///                                   evaluating the pinned certificates. `true` by default.\n    ///   - validateHost:                 Determines whether or not the evaluator should validate the host, in addition\n    ///                                   to performing the default evaluation, even if `performDefaultValidation` is\n    ///                                   `false`. `true` by default.\n    ///   - options:                      The `Options` to use to check the revocation status of the certificate. `.any`\n    ///                                   by default.\n    public init(performDefaultValidation: Bool = true, validateHost: Bool = true, options: Options = .any) {\n        self.performDefaultValidation = performDefaultValidation\n        self.validateHost = validateHost\n        self.options = options\n    }\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        if performDefaultValidation {\n            try trust.af.performDefaultValidation(forHost: host)\n        }\n\n        if validateHost {\n            try trust.af.performValidation(forHost: host)\n        }\n\n        if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) {\n            try trust.af.evaluate(afterApplying: SecPolicy.af.revocation(options: options))\n        } else {\n            try trust.af.validate(policy: SecPolicy.af.revocation(options: options)) { status, result in\n                AFError.serverTrustEvaluationFailed(reason: .revocationCheckFailed(output: .init(host, trust, status, result), options: options))\n            }\n        }\n    }\n}\n\n/// Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned\n/// certificates match one of the server certificates. By validating both the certificate chain and host, certificate\n/// pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks.\n/// Applications are encouraged to always validate the host and require a valid certificate chain in production\n/// environments.\npublic final class PinnedCertificatesTrustEvaluator: ServerTrustEvaluating {\n    private let certificates: [SecCertificate]\n    private let acceptSelfSignedCertificates: Bool\n    private let performDefaultValidation: Bool\n    private let validateHost: Bool\n\n    /// Creates a `PinnedCertificatesTrustEvaluator`.\n    ///\n    /// - Parameters:\n    ///   - certificates:                 The certificates to use to evaluate the trust. All `cer`, `crt`, and `der`\n    ///                                   certificates in `Bundle.main` by default.\n    ///   - acceptSelfSignedCertificates: Adds the provided certificates as anchors for the trust evaluation, allowing\n    ///                                   self-signed certificates to pass. `false` by default. THIS SETTING SHOULD BE\n    ///                                   FALSE IN PRODUCTION!\n    ///   - performDefaultValidation:     Determines whether default validation should be performed in addition to\n    ///                                   evaluating the pinned certificates. `true` by default.\n    ///   - validateHost:                 Determines whether or not the evaluator should validate the host, in addition\n    ///                                   to performing the default evaluation, even if `performDefaultValidation` is\n    ///                                   `false`. `true` by default.\n    public init(certificates: [SecCertificate] = Bundle.main.af.certificates,\n                acceptSelfSignedCertificates: Bool = false,\n                performDefaultValidation: Bool = true,\n                validateHost: Bool = true) {\n        self.certificates = certificates\n        self.acceptSelfSignedCertificates = acceptSelfSignedCertificates\n        self.performDefaultValidation = performDefaultValidation\n        self.validateHost = validateHost\n    }\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        guard !certificates.isEmpty else {\n            throw AFError.serverTrustEvaluationFailed(reason: .noCertificatesFound)\n        }\n\n        if acceptSelfSignedCertificates {\n            try trust.af.setAnchorCertificates(certificates)\n        }\n\n        if performDefaultValidation {\n            try trust.af.performDefaultValidation(forHost: host)\n        }\n\n        if validateHost {\n            try trust.af.performValidation(forHost: host)\n        }\n\n        let serverCertificatesData = Set(trust.af.certificateData)\n        let pinnedCertificatesData = Set(certificates.af.data)\n        let pinnedCertificatesInServerData = !serverCertificatesData.isDisjoint(with: pinnedCertificatesData)\n        if !pinnedCertificatesInServerData {\n            throw AFError.serverTrustEvaluationFailed(reason: .certificatePinningFailed(host: host,\n                                                                                        trust: trust,\n                                                                                        pinnedCertificates: certificates,\n                                                                                        serverCertificates: trust.af.certificates))\n        }\n    }\n}\n\n/// Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned\n/// public keys match one of the server certificate public keys. By validating both the certificate chain and host,\n/// public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks.\n/// Applications are encouraged to always validate the host and require a valid certificate chain in production\n/// environments.\npublic final class PublicKeysTrustEvaluator: ServerTrustEvaluating {\n    private let keys: [SecKey]\n    private let performDefaultValidation: Bool\n    private let validateHost: Bool\n\n    /// Creates a `PublicKeysTrustEvaluator`.\n    ///\n    /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use\n    ///         `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates.\n    ///\n    /// - Parameters:\n    ///   - keys:                     The `SecKey`s to use to validate public keys. Defaults to the public keys of all\n    ///                               certificates included in the main bundle.\n    ///   - performDefaultValidation: Determines whether default validation should be performed in addition to\n    ///                               evaluating the pinned certificates. `true` by default.\n    ///   - validateHost:             Determines whether or not the evaluator should validate the host, in addition to\n    ///                               performing the default evaluation, even if `performDefaultValidation` is `false`.\n    ///                               `true` by default.\n    public init(keys: [SecKey] = Bundle.main.af.publicKeys,\n                performDefaultValidation: Bool = true,\n                validateHost: Bool = true) {\n        self.keys = keys\n        self.performDefaultValidation = performDefaultValidation\n        self.validateHost = validateHost\n    }\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        guard !keys.isEmpty else {\n            throw AFError.serverTrustEvaluationFailed(reason: .noPublicKeysFound)\n        }\n\n        if performDefaultValidation {\n            try trust.af.performDefaultValidation(forHost: host)\n        }\n\n        if validateHost {\n            try trust.af.performValidation(forHost: host)\n        }\n\n        let pinnedKeysInServerKeys: Bool = {\n            for serverPublicKey in trust.af.publicKeys {\n                for pinnedPublicKey in keys {\n                    if serverPublicKey == pinnedPublicKey {\n                        return true\n                    }\n                }\n            }\n            return false\n        }()\n\n        if !pinnedKeysInServerKeys {\n            throw AFError.serverTrustEvaluationFailed(reason: .publicKeyPinningFailed(host: host,\n                                                                                      trust: trust,\n                                                                                      pinnedKeys: keys,\n                                                                                      serverKeys: trust.af.publicKeys))\n        }\n    }\n}\n\n/// Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the\n/// evaluators consider it valid.\npublic final class CompositeTrustEvaluator: ServerTrustEvaluating {\n    private let evaluators: [ServerTrustEvaluating]\n\n    /// Creates a `CompositeTrustEvaluator`.\n    ///\n    /// - Parameter evaluators: The `ServerTrustEvaluating` values used to evaluate the server trust.\n    public init(evaluators: [ServerTrustEvaluating]) {\n        self.evaluators = evaluators\n    }\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        try evaluators.evaluate(trust, forHost: host)\n    }\n}\n\n/// Disables all evaluation which in turn will always consider any server trust as valid.\n///\n/// - Note: Instead of disabling server trust evaluation, it's a better idea to configure systems to properly trust test\n///         certificates, as outlined in [this Apple tech note](https://developer.apple.com/library/archive/qa/qa1948/_index.html).\n///\n/// **THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!**\n@available(*, deprecated, renamed: \"DisabledTrustEvaluator\", message: \"DisabledEvaluator has been renamed DisabledTrustEvaluator.\")\npublic typealias DisabledEvaluator = DisabledTrustEvaluator\n\n/// Disables all evaluation which in turn will always consider any server trust as valid.\n///\n///\n/// - Note: Instead of disabling server trust evaluation, it's a better idea to configure systems to properly trust test\n///         certificates, as outlined in [this Apple tech note](https://developer.apple.com/library/archive/qa/qa1948/_index.html).\n///\n/// **THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!**\npublic final class DisabledTrustEvaluator: ServerTrustEvaluating {\n    /// Creates an instance.\n    public init() {}\n\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {}\n}\n\n// MARK: - Extensions\n\nextension Array where Element == ServerTrustEvaluating {\n    #if os(Linux)\n    // Add this same convenience method for Linux.\n    #else\n    /// Evaluates the given `SecTrust` value for the given `host`.\n    ///\n    /// - Parameters:\n    ///   - trust: The `SecTrust` value to evaluate.\n    ///   - host:  The host for which to evaluate the `SecTrust` value.\n    ///\n    /// - Returns: Whether or not the evaluator considers the `SecTrust` value valid for `host`.\n    public func evaluate(_ trust: SecTrust, forHost host: String) throws {\n        for evaluator in self {\n            try evaluator.evaluate(trust, forHost: host)\n        }\n    }\n    #endif\n}\n\nextension Bundle: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType: Bundle {\n    /// Returns all valid `cer`, `crt`, and `der` certificates in the bundle.\n    public var certificates: [SecCertificate] {\n        paths(forResourcesOfTypes: [\".cer\", \".CER\", \".crt\", \".CRT\", \".der\", \".DER\"]).compactMap { path in\n            guard\n                let certificateData = try? Data(contentsOf: URL(fileURLWithPath: path)) as CFData,\n                let certificate = SecCertificateCreateWithData(nil, certificateData) else { return nil }\n\n            return certificate\n        }\n    }\n\n    /// Returns all public keys for the valid certificates in the bundle.\n    public var publicKeys: [SecKey] {\n        certificates.af.publicKeys\n    }\n\n    /// Returns all pathnames for the resources identified by the provided file extensions.\n    ///\n    /// - Parameter types: The filename extensions locate.\n    ///\n    /// - Returns:         All pathnames for the given filename extensions.\n    public func paths(forResourcesOfTypes types: [String]) -> [String] {\n        Array(Set(types.flatMap { type.paths(forResourcesOfType: $0, inDirectory: nil) }))\n    }\n}\n\nextension SecTrust: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == SecTrust {\n    /// Evaluates `self` after applying the `SecPolicy` value provided.\n    ///\n    /// - Parameter policy: The `SecPolicy` to apply to `self` before evaluation.\n    ///\n    /// - Throws:           Any `Error` from applying the `SecPolicy` or from evaluation.\n    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)\n    public func evaluate(afterApplying policy: SecPolicy) throws {\n        try apply(policy: policy).af.evaluate()\n    }\n\n    /// Attempts to validate `self` using the `SecPolicy` provided and transforming any error produced using the closure passed.\n    ///\n    /// - Parameters:\n    ///   - policy:        The `SecPolicy` used to evaluate `self`.\n    ///   - errorProducer: The closure used transform the failed `OSStatus` and `SecTrustResultType`.\n    /// - Throws:          Any `Error` from applying the `policy`, or the result of `errorProducer` if validation fails.\n    @available(iOS, introduced: 10, deprecated: 12, renamed: \"evaluate(afterApplying:)\")\n    @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: \"evaluate(afterApplying:)\")\n    @available(tvOS, introduced: 10, deprecated: 12, renamed: \"evaluate(afterApplying:)\")\n    @available(watchOS, introduced: 3, deprecated: 5, renamed: \"evaluate(afterApplying:)\")\n    public func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws {\n        try apply(policy: policy).af.validate(errorProducer: errorProducer)\n    }\n\n    /// Applies a `SecPolicy` to `self`, throwing if it fails.\n    ///\n    /// - Parameter policy: The `SecPolicy`.\n    ///\n    /// - Returns: `self`, with the policy applied.\n    /// - Throws: An `AFError.serverTrustEvaluationFailed` instance with a `.policyApplicationFailed` reason.\n    public func apply(policy: SecPolicy) throws -> SecTrust {\n        let status = SecTrustSetPolicies(type, policy)\n\n        guard status.af.isSuccess else {\n            throw AFError.serverTrustEvaluationFailed(reason: .policyApplicationFailed(trust: type,\n                                                                                       policy: policy,\n                                                                                       status: status))\n        }\n\n        return type\n    }\n\n    /// Evaluate `self`, throwing an `Error` if evaluation fails.\n    ///\n    /// - Throws: `AFError.serverTrustEvaluationFailed` with reason `.trustValidationFailed` and associated error from\n    ///           the underlying evaluation.\n    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)\n    public func evaluate() throws {\n        var error: CFError?\n        let evaluationSucceeded = SecTrustEvaluateWithError(type, &error)\n\n        if !evaluationSucceeded {\n            throw AFError.serverTrustEvaluationFailed(reason: .trustEvaluationFailed(error: error))\n        }\n    }\n\n    /// Validate `self`, passing any failure values through `errorProducer`.\n    ///\n    /// - Parameter errorProducer: The closure used to transform the failed `OSStatus` and `SecTrustResultType` into an\n    ///                            `Error`.\n    /// - Throws:                  The `Error` produced by the `errorProducer` closure.\n    @available(iOS, introduced: 10, deprecated: 12, renamed: \"evaluate()\")\n    @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: \"evaluate()\")\n    @available(tvOS, introduced: 10, deprecated: 12, renamed: \"evaluate()\")\n    @available(watchOS, introduced: 3, deprecated: 5, renamed: \"evaluate()\")\n    public func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws {\n        var result = SecTrustResultType.invalid\n        let status = SecTrustEvaluate(type, &result)\n\n        guard status.af.isSuccess && result.af.isSuccess else {\n            throw errorProducer(status, result)\n        }\n    }\n\n    /// Sets a custom certificate chain on `self`, allowing full validation of a self-signed certificate and its chain.\n    ///\n    /// - Parameter certificates: The `SecCertificate`s to add to the chain.\n    /// - Throws:                 Any error produced when applying the new certificate chain.\n    public func setAnchorCertificates(_ certificates: [SecCertificate]) throws {\n        // Add additional anchor certificates.\n        let status = SecTrustSetAnchorCertificates(type, certificates as CFArray)\n        guard status.af.isSuccess else {\n            throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: status,\n                                                                                               certificates: certificates))\n        }\n\n        // Trust only the set anchor certs.\n        let onlyStatus = SecTrustSetAnchorCertificatesOnly(type, true)\n        guard onlyStatus.af.isSuccess else {\n            throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: onlyStatus,\n                                                                                               certificates: certificates))\n        }\n    }\n\n    /// The public keys contained in `self`.\n    public var publicKeys: [SecKey] {\n        certificates.af.publicKeys\n    }\n\n    /// The `SecCertificate`s contained i `self`.\n    public var certificates: [SecCertificate] {\n        (0..<SecTrustGetCertificateCount(type)).compactMap { index in\n            SecTrustGetCertificateAtIndex(type, index)\n        }\n    }\n\n    /// The `Data` values for all certificates contained in `self`.\n    public var certificateData: [Data] {\n        certificates.af.data\n    }\n\n    /// Validates `self` after applying `SecPolicy.af.default`. This evaluation does not validate the hostname.\n    ///\n    /// - Parameter host: The hostname, used only in the error output if validation fails.\n    /// - Throws: An `AFError.serverTrustEvaluationFailed` instance with a `.defaultEvaluationFailed` reason.\n    public func performDefaultValidation(forHost host: String) throws {\n        if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) {\n            try evaluate(afterApplying: SecPolicy.af.default)\n        } else {\n            try validate(policy: SecPolicy.af.default) { status, result in\n                AFError.serverTrustEvaluationFailed(reason: .defaultEvaluationFailed(output: .init(host, type, status, result)))\n            }\n        }\n    }\n\n    /// Validates `self` after applying `SecPolicy.af.hostname(host)`, which performs the default validation as well as\n    /// hostname validation.\n    ///\n    /// - Parameter host: The hostname to use in the validation.\n    /// - Throws:         An `AFError.serverTrustEvaluationFailed` instance with a `.defaultEvaluationFailed` reason.\n    public func performValidation(forHost host: String) throws {\n        if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) {\n            try evaluate(afterApplying: SecPolicy.af.hostname(host))\n        } else {\n            try validate(policy: SecPolicy.af.hostname(host)) { status, result in\n                AFError.serverTrustEvaluationFailed(reason: .hostValidationFailed(output: .init(host, type, status, result)))\n            }\n        }\n    }\n}\n\nextension SecPolicy: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == SecPolicy {\n    /// Creates a `SecPolicy` instance which will validate server certificates but not require a host name match.\n    public static let `default` = SecPolicyCreateSSL(true, nil)\n\n    /// Creates a `SecPolicy` instance which will validate server certificates and much match the provided hostname.\n    ///\n    /// - Parameter hostname: The hostname to validate against.\n    ///\n    /// - Returns:            The `SecPolicy`.\n    public static func hostname(_ hostname: String) -> SecPolicy {\n        SecPolicyCreateSSL(true, hostname as CFString)\n    }\n\n    /// Creates a `SecPolicy` which checks the revocation of certificates.\n    ///\n    /// - Parameter options: The `RevocationTrustEvaluator.Options` for evaluation.\n    ///\n    /// - Returns:           The `SecPolicy`.\n    /// - Throws:            An `AFError.serverTrustEvaluationFailed` error with reason `.revocationPolicyCreationFailed`\n    ///                      if the policy cannot be created.\n    public static func revocation(options: RevocationTrustEvaluator.Options) throws -> SecPolicy {\n        guard let policy = SecPolicyCreateRevocation(options.rawValue) else {\n            throw AFError.serverTrustEvaluationFailed(reason: .revocationPolicyCreationFailed)\n        }\n\n        return policy\n    }\n}\n\nextension Array: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == [SecCertificate] {\n    /// All `Data` values for the contained `SecCertificate`s.\n    public var data: [Data] {\n        type.map { SecCertificateCopyData($0) as Data }\n    }\n\n    /// All public `SecKey` values for the contained `SecCertificate`s.\n    public var publicKeys: [SecKey] {\n        type.compactMap { $0.af.publicKey }\n    }\n}\n\nextension SecCertificate: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == SecCertificate {\n    /// The public key for `self`, if it can be extracted.\n    public var publicKey: SecKey? {\n        let policy = SecPolicyCreateBasicX509()\n        var trust: SecTrust?\n        let trustCreationStatus = SecTrustCreateWithCertificates(type, policy, &trust)\n\n        guard let createdTrust = trust, trustCreationStatus == errSecSuccess else { return nil }\n\n        return SecTrustCopyPublicKey(createdTrust)\n    }\n}\n\nextension OSStatus: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == OSStatus {\n    /// Returns whether `self` is `errSecSuccess`.\n    public var isSuccess: Bool { type == errSecSuccess }\n}\n\nextension SecTrustResultType: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType == SecTrustResultType {\n    /// Returns whether `self is `.unspecified` or `.proceed`.\n    public var isSuccess: Bool {\n        type == .unspecified || type == .proceed\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Session.swift",
    "content": "//\n//  Session.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// `Session` creates and manages Alamofire's `Request` types during their lifetimes. It also provides common\n/// functionality for all `Request`s, including queuing, interception, trust management, redirect handling, and response\n/// cache handling.\nopen class Session {\n    /// Shared singleton instance used by all `AF.request` APIs. Cannot be modified.\n    public static let `default` = Session()\n\n    /// Underlying `URLSession` used to create `URLSessionTasks` for this instance, and for which this instance's\n    /// `delegate` handles `URLSessionDelegate` callbacks.\n    ///\n    /// - Note: This instance should **NOT** be used to interact with the underlying `URLSessionTask`s. Doing so will\n    ///         break internal Alamofire logic that tracks those tasks.\n    ///\n    public let session: URLSession\n    /// Instance's `SessionDelegate`, which handles the `URLSessionDelegate` methods and `Request` interaction.\n    public let delegate: SessionDelegate\n    /// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue.\n    public let rootQueue: DispatchQueue\n    /// Value determining whether this instance automatically calls `resume()` on all created `Request`s.\n    public let startRequestsImmediately: Bool\n    /// `DispatchQueue` on which `URLRequest`s are created asynchronously. By default this queue uses `rootQueue` as its\n    /// `target`, but a separate queue can be used if request creation is determined to be a bottleneck. Always profile\n    /// and test before introducing an additional queue.\n    public let requestQueue: DispatchQueue\n    /// `DispatchQueue` passed to all `Request`s on which they perform their response serialization. By default this\n    /// queue uses `rootQueue` as its `target` but a separate queue can be used if response serialization is determined\n    /// to be a bottleneck. Always profile and test before introducing an additional queue.\n    public let serializationQueue: DispatchQueue\n    /// `RequestInterceptor` used for all `Request` created by the instance. `RequestInterceptor`s can also be set on a\n    /// per-`Request` basis, in which case the `Request`'s interceptor takes precedence over this value.\n    public let interceptor: RequestInterceptor?\n    /// `ServerTrustManager` instance used to evaluate all trust challenges and provide certificate and key pinning.\n    public let serverTrustManager: ServerTrustManager?\n    /// `RedirectHandler` instance used to provide customization for request redirection.\n    public let redirectHandler: RedirectHandler?\n    /// `CachedResponseHandler` instance used to provide customization of cached response handling.\n    public let cachedResponseHandler: CachedResponseHandler?\n    /// `CompositeEventMonitor` used to compose Alamofire's `defaultEventMonitors` and any passed `EventMonitor`s.\n    public let eventMonitor: CompositeEventMonitor\n    /// `EventMonitor`s included in all instances. `[AlamofireNotifications()]` by default.\n    public let defaultEventMonitors: [EventMonitor] = [AlamofireNotifications()]\n\n    /// Internal map between `Request`s and any `URLSessionTasks` that may be in flight for them.\n    var requestTaskMap = RequestTaskMap()\n    /// `Set` of currently active `Request`s.\n    var activeRequests: Set<Request> = []\n    /// Completion events awaiting `URLSessionTaskMetrics`.\n    var waitingCompletions: [URLSessionTask: () -> Void] = [:]\n\n    /// Creates a `Session` from a `URLSession` and other parameters.\n    ///\n    /// - Note: When passing a `URLSession`, you must create the `URLSession` with a specific `delegateQueue` value and\n    ///         pass the `delegateQueue`'s `underlyingQueue` as the `rootQueue` parameter of this initializer.\n    ///\n    /// - Parameters:\n    ///   - session:                  Underlying `URLSession` for this instance.\n    ///   - delegate:                 `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request`\n    ///                               interaction.\n    ///   - rootQueue:                Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a\n    ///                               serial queue.\n    ///   - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true`\n    ///                               by default. If set to `false`, all `Request`s created must have `.resume()` called.\n    ///                               on them for them to start.\n    ///   - requestQueue:             `DispatchQueue` on which to perform `URLRequest` creation. By default this queue\n    ///                               will use the `rootQueue` as its `target`. A separate queue can be used if it's\n    ///                               determined request creation is a bottleneck, but that should only be done after\n    ///                               careful testing and profiling. `nil` by default.\n    ///   - serializationQueue:       `DispatchQueue` on which to perform all response serialization. By default this\n    ///                               queue will use the `rootQueue` as its `target`. A separate queue can be used if\n    ///                               it's determined response serialization is a bottleneck, but that should only be\n    ///                               done after careful testing and profiling. `nil` by default.\n    ///   - interceptor:              `RequestInterceptor` to be used for all `Request`s created by this instance. `nil`\n    ///                               by default.\n    ///   - serverTrustManager:       `ServerTrustManager` to be used for all trust evaluations by this instance. `nil`\n    ///                               by default.\n    ///   - redirectHandler:          `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by\n    ///                               default.\n    ///   - cachedResponseHandler:    `CachedResponseHandler` to be used by all `Request`s created by this instance.\n    ///                               `nil` by default.\n    ///   - eventMonitors:            Additional `EventMonitor`s used by the instance. Alamofire always adds a\n    ///                               `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default.\n    public init(session: URLSession,\n                delegate: SessionDelegate,\n                rootQueue: DispatchQueue,\n                startRequestsImmediately: Bool = true,\n                requestQueue: DispatchQueue? = nil,\n                serializationQueue: DispatchQueue? = nil,\n                interceptor: RequestInterceptor? = nil,\n                serverTrustManager: ServerTrustManager? = nil,\n                redirectHandler: RedirectHandler? = nil,\n                cachedResponseHandler: CachedResponseHandler? = nil,\n                eventMonitors: [EventMonitor] = []) {\n        precondition(session.configuration.identifier == nil,\n                     \"Alamofire does not support background URLSessionConfigurations.\")\n        precondition(session.delegateQueue.underlyingQueue === rootQueue,\n                     \"Session(session:) initializer must be passed the DispatchQueue used as the delegateQueue's underlyingQueue as rootQueue.\")\n\n        self.session = session\n        self.delegate = delegate\n        self.rootQueue = rootQueue\n        self.startRequestsImmediately = startRequestsImmediately\n        self.requestQueue = requestQueue ?? DispatchQueue(label: \"\\(rootQueue.label).requestQueue\", target: rootQueue)\n        self.serializationQueue = serializationQueue ?? DispatchQueue(label: \"\\(rootQueue.label).serializationQueue\", target: rootQueue)\n        self.interceptor = interceptor\n        self.serverTrustManager = serverTrustManager\n        self.redirectHandler = redirectHandler\n        self.cachedResponseHandler = cachedResponseHandler\n        eventMonitor = CompositeEventMonitor(monitors: defaultEventMonitors + eventMonitors)\n        delegate.eventMonitor = eventMonitor\n        delegate.stateProvider = self\n    }\n\n    /// Creates a `Session` from a `URLSessionConfiguration`.\n    ///\n    /// - Note: This initializer lets Alamofire handle the creation of the underlying `URLSession` and its\n    ///         `delegateQueue`, and is the recommended initializer for most uses.\n    ///\n    /// - Parameters:\n    ///   - configuration:            `URLSessionConfiguration` to be used to create the underlying `URLSession`. Changes\n    ///                               to this value after being passed to this initializer will have no effect.\n    ///                               `URLSessionConfiguration.af.default` by default.\n    ///   - delegate:                 `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request`\n    ///                               interaction. `SessionDelegate()` by default.\n    ///   - rootQueue:                Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a\n    ///                               serial queue. `DispatchQueue(label: \"org.alamofire.session.rootQueue\")` by default.\n    ///   - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true`\n    ///                               by default. If set to `false`, all `Request`s created must have `.resume()` called.\n    ///                               on them for them to start.\n    ///   - requestQueue:             `DispatchQueue` on which to perform `URLRequest` creation. By default this queue\n    ///                               will use the `rootQueue` as its `target`. A separate queue can be used if it's\n    ///                               determined request creation is a bottleneck, but that should only be done after\n    ///                               careful testing and profiling. `nil` by default.\n    ///   - serializationQueue:       `DispatchQueue` on which to perform all response serialization. By default this\n    ///                               queue will use the `rootQueue` as its `target`. A separate queue can be used if\n    ///                               it's determined response serialization is a bottleneck, but that should only be\n    ///                               done after careful testing and profiling. `nil` by default.\n    ///   - interceptor:              `RequestInterceptor` to be used for all `Request`s created by this instance. `nil`\n    ///                               by default.\n    ///   - serverTrustManager:       `ServerTrustManager` to be used for all trust evaluations by this instance. `nil`\n    ///                               by default.\n    ///   - redirectHandler:          `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by\n    ///                               default.\n    ///   - cachedResponseHandler:    `CachedResponseHandler` to be used by all `Request`s created by this instance.\n    ///                               `nil` by default.\n    ///   - eventMonitors:            Additional `EventMonitor`s used by the instance. Alamofire always adds a\n    ///                               `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default.\n    public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,\n                            delegate: SessionDelegate = SessionDelegate(),\n                            rootQueue: DispatchQueue = DispatchQueue(label: \"org.alamofire.session.rootQueue\"),\n                            startRequestsImmediately: Bool = true,\n                            requestQueue: DispatchQueue? = nil,\n                            serializationQueue: DispatchQueue? = nil,\n                            interceptor: RequestInterceptor? = nil,\n                            serverTrustManager: ServerTrustManager? = nil,\n                            redirectHandler: RedirectHandler? = nil,\n                            cachedResponseHandler: CachedResponseHandler? = nil,\n                            eventMonitors: [EventMonitor] = []) {\n        precondition(configuration.identifier == nil, \"Alamofire does not support background URLSessionConfigurations.\")\n\n        let delegateQueue = OperationQueue(maxConcurrentOperationCount: 1, underlyingQueue: rootQueue, name: \"org.alamofire.session.sessionDelegateQueue\")\n        let session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: delegateQueue)\n\n        self.init(session: session,\n                  delegate: delegate,\n                  rootQueue: rootQueue,\n                  startRequestsImmediately: startRequestsImmediately,\n                  requestQueue: requestQueue,\n                  serializationQueue: serializationQueue,\n                  interceptor: interceptor,\n                  serverTrustManager: serverTrustManager,\n                  redirectHandler: redirectHandler,\n                  cachedResponseHandler: cachedResponseHandler,\n                  eventMonitors: eventMonitors)\n    }\n\n    deinit {\n        finishRequestsForDeinit()\n        session.invalidateAndCancel()\n    }\n\n    // MARK: - All Requests API\n\n    /// Perform an action on all active `Request`s.\n    ///\n    /// - Note: The provided `action` closure is performed asynchronously, meaning that some `Request`s may complete and\n    ///         be unavailable by time it runs. Additionally, this action is performed on the instances's `rootQueue`,\n    ///         so care should be taken that actions are fast. Once the work on the `Request`s is complete, any\n    ///         additional work should be performed on another queue.\n    ///\n    /// - Parameters:\n    ///   - action:     Closure to perform with all `Request`s.\n    public func withAllRequests(perform action: @escaping (Set<Request>) -> Void) {\n        rootQueue.async {\n            action(self.activeRequests)\n        }\n    }\n\n    /// Cancel all active `Request`s, optionally calling a completion handler when complete.\n    ///\n    /// - Note: This is an asynchronous operation and does not block the creation of future `Request`s. Cancelled\n    ///         `Request`s may not cancel immediately due internal work, and may not cancel at all if they are close to\n    ///         completion when cancelled.\n    ///\n    /// - Parameters:\n    ///   - queue:      `DispatchQueue` on which the completion handler is run. `.main` by default.\n    ///   - completion: Closure to be called when all `Request`s have been cancelled.\n    public func cancelAllRequests(completingOnQueue queue: DispatchQueue = .main, completion: (() -> Void)? = nil) {\n        withAllRequests { requests in\n            requests.forEach { $0.cancel() }\n            queue.async {\n                completion?()\n            }\n        }\n    }\n\n    // MARK: - DataRequest\n\n    /// Closure which provides a `URLRequest` for mutation.\n    public typealias RequestModifier = (inout URLRequest) throws -> Void\n\n    struct RequestConvertible: URLRequestConvertible {\n        let url: URLConvertible\n        let method: HTTPMethod\n        let parameters: Parameters?\n        let encoding: ParameterEncoding\n        let headers: HTTPHeaders?\n        let requestModifier: RequestModifier?\n\n        func asURLRequest() throws -> URLRequest {\n            var request = try URLRequest(url: url, method: method, headers: headers)\n            try requestModifier?(&request)\n\n            return try encoding.encode(request, with: parameters)\n        }\n    }\n\n    /// Creates a `DataRequest` from a `URLRequest` created using the passed components and a `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - parameters:      `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by\n    ///                      default.\n    ///   - encoding:        `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`.\n    ///                      `URLEncoding.default` by default.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///\n    /// - Returns:       The created `DataRequest`.\n    open func request(_ convertible: URLConvertible,\n                      method: HTTPMethod = .get,\n                      parameters: Parameters? = nil,\n                      encoding: ParameterEncoding = URLEncoding.default,\n                      headers: HTTPHeaders? = nil,\n                      interceptor: RequestInterceptor? = nil,\n                      requestModifier: RequestModifier? = nil) -> DataRequest {\n        let convertible = RequestConvertible(url: convertible,\n                                             method: method,\n                                             parameters: parameters,\n                                             encoding: encoding,\n                                             headers: headers,\n                                             requestModifier: requestModifier)\n\n        return request(convertible, interceptor: interceptor)\n    }\n\n    struct RequestEncodableConvertible<Parameters: Encodable>: URLRequestConvertible {\n        let url: URLConvertible\n        let method: HTTPMethod\n        let parameters: Parameters?\n        let encoder: ParameterEncoder\n        let headers: HTTPHeaders?\n        let requestModifier: RequestModifier?\n\n        func asURLRequest() throws -> URLRequest {\n            var request = try URLRequest(url: url, method: method, headers: headers)\n            try requestModifier?(&request)\n\n            return try parameters.map { try encoder.encode($0, into: request) } ?? request\n        }\n    }\n\n    /// Creates a `DataRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and a\n    /// `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:      `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - parameters:  `Encodable` value to be encoded into the `URLRequest`. `nil` by default.\n    ///   - encoder:     `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`.\n    ///                  `URLEncodedFormParameterEncoder.default` by default.\n    ///   - headers:     `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///\n    /// - Returns:       The created `DataRequest`.\n    open func request<Parameters: Encodable>(_ convertible: URLConvertible,\n                                             method: HTTPMethod = .get,\n                                             parameters: Parameters? = nil,\n                                             encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,\n                                             headers: HTTPHeaders? = nil,\n                                             interceptor: RequestInterceptor? = nil,\n                                             requestModifier: RequestModifier? = nil) -> DataRequest {\n        let convertible = RequestEncodableConvertible(url: convertible,\n                                                      method: method,\n                                                      parameters: parameters,\n                                                      encoder: encoder,\n                                                      headers: headers,\n                                                      requestModifier: requestModifier)\n\n        return request(convertible, interceptor: interceptor)\n    }\n\n    /// Creates a `DataRequest` from a `URLRequestConvertible` value and a `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///\n    /// - Returns:       The created `DataRequest`.\n    open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil) -> DataRequest {\n        let request = DataRequest(convertible: convertible,\n                                  underlyingQueue: rootQueue,\n                                  serializationQueue: serializationQueue,\n                                  eventMonitor: eventMonitor,\n                                  interceptor: interceptor,\n                                  delegate: self)\n\n        perform(request)\n\n        return request\n    }\n\n    // MARK: - DataStreamRequest\n\n    /// Creates a `DataStreamRequest` from the passed components, `Encodable` parameters, and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible:                      `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:                           `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - parameters:                       `Encodable` value to be encoded into the `URLRequest`. `nil` by default.\n    ///   - encoder:                          `ParameterEncoder` to be used to encode the `parameters` value into the\n    ///                                       `URLRequest`.\n    ///                                       `URLEncodedFormParameterEncoder.default` by default.\n    ///   - headers:                          `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error`\n    ///                                       is thrown while serializing stream `Data`. `false` by default.\n    ///   - interceptor:                      `RequestInterceptor` value to be used by the returned `DataRequest`. `nil`\n    ///                                       by default.\n    ///   - requestModifier:                  `RequestModifier` which will be applied to the `URLRequest` created from\n    ///                                       the provided parameters. `nil` by default.\n    ///\n    /// - Returns:       The created `DataStream` request.\n    open func streamRequest<Parameters: Encodable>(_ convertible: URLConvertible,\n                                                   method: HTTPMethod = .get,\n                                                   parameters: Parameters? = nil,\n                                                   encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,\n                                                   headers: HTTPHeaders? = nil,\n                                                   automaticallyCancelOnStreamError: Bool = false,\n                                                   interceptor: RequestInterceptor? = nil,\n                                                   requestModifier: RequestModifier? = nil) -> DataStreamRequest {\n        let convertible = RequestEncodableConvertible(url: convertible,\n                                                      method: method,\n                                                      parameters: parameters,\n                                                      encoder: encoder,\n                                                      headers: headers,\n                                                      requestModifier: requestModifier)\n\n        return streamRequest(convertible,\n                             automaticallyCancelOnStreamError: automaticallyCancelOnStreamError,\n                             interceptor: interceptor)\n    }\n\n    /// Creates a `DataStreamRequest` from the passed components and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible:                      `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:                           `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - headers:                          `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error`\n    ///                                       is thrown while serializing stream `Data`. `false` by default.\n    ///   - interceptor:                      `RequestInterceptor` value to be used by the returned `DataRequest`. `nil`\n    ///                                       by default.\n    ///   - requestModifier:                  `RequestModifier` which will be applied to the `URLRequest` created from\n    ///                                       the provided parameters. `nil` by default.\n    ///\n    /// - Returns:       The created `DataStream` request.\n    open func streamRequest(_ convertible: URLConvertible,\n                            method: HTTPMethod = .get,\n                            headers: HTTPHeaders? = nil,\n                            automaticallyCancelOnStreamError: Bool = false,\n                            interceptor: RequestInterceptor? = nil,\n                            requestModifier: RequestModifier? = nil) -> DataStreamRequest {\n        let convertible = RequestEncodableConvertible(url: convertible,\n                                                      method: method,\n                                                      parameters: Empty?.none,\n                                                      encoder: URLEncodedFormParameterEncoder.default,\n                                                      headers: headers,\n                                                      requestModifier: requestModifier)\n\n        return streamRequest(convertible,\n                             automaticallyCancelOnStreamError: automaticallyCancelOnStreamError,\n                             interceptor: interceptor)\n    }\n\n    /// Creates a `DataStreamRequest` from the passed `URLRequestConvertible` value and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible:                      `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error`\n    ///                                       is thrown while serializing stream `Data`. `false` by default.\n    ///   - interceptor:                      `RequestInterceptor` value to be used by the returned `DataRequest`. `nil`\n    ///                                        by default.\n    ///\n    /// - Returns:       The created `DataStreamRequest`.\n    open func streamRequest(_ convertible: URLRequestConvertible,\n                            automaticallyCancelOnStreamError: Bool = false,\n                            interceptor: RequestInterceptor? = nil) -> DataStreamRequest {\n        let request = DataStreamRequest(convertible: convertible,\n                                        automaticallyCancelOnStreamError: automaticallyCancelOnStreamError,\n                                        underlyingQueue: rootQueue,\n                                        serializationQueue: serializationQueue,\n                                        eventMonitor: eventMonitor,\n                                        interceptor: interceptor,\n                                        delegate: self)\n\n        perform(request)\n\n        return request\n    }\n\n    // MARK: - DownloadRequest\n\n    /// Creates a `DownloadRequest` using a `URLRequest` created using the passed components, `RequestInterceptor`, and\n    /// `Destination`.\n    ///\n    /// - Parameters:\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - parameters:      `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by\n    ///                      default.\n    ///   - encoding:        `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`.\n    ///                      Defaults to `URLEncoding.default`.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///   - destination:     `DownloadRequest.Destination` closure used to determine how and where the downloaded file\n    ///                      should be moved. `nil` by default.\n    ///\n    /// - Returns:           The created `DownloadRequest`.\n    open func download(_ convertible: URLConvertible,\n                       method: HTTPMethod = .get,\n                       parameters: Parameters? = nil,\n                       encoding: ParameterEncoding = URLEncoding.default,\n                       headers: HTTPHeaders? = nil,\n                       interceptor: RequestInterceptor? = nil,\n                       requestModifier: RequestModifier? = nil,\n                       to destination: DownloadRequest.Destination? = nil) -> DownloadRequest {\n        let convertible = RequestConvertible(url: convertible,\n                                             method: method,\n                                             parameters: parameters,\n                                             encoding: encoding,\n                                             headers: headers,\n                                             requestModifier: requestModifier)\n\n        return download(convertible, interceptor: interceptor, to: destination)\n    }\n\n    /// Creates a `DownloadRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and\n    /// a `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.get` by default.\n    ///   - parameters:      Value conforming to `Encodable` to be encoded into the `URLRequest`. `nil` by default.\n    ///   - encoder:         `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`.\n    ///                      Defaults to `URLEncodedFormParameterEncoder.default`.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///   - destination:     `DownloadRequest.Destination` closure used to determine how and where the downloaded file\n    ///                      should be moved. `nil` by default.\n    ///\n    /// - Returns:           The created `DownloadRequest`.\n    open func download<Parameters: Encodable>(_ convertible: URLConvertible,\n                                              method: HTTPMethod = .get,\n                                              parameters: Parameters? = nil,\n                                              encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default,\n                                              headers: HTTPHeaders? = nil,\n                                              interceptor: RequestInterceptor? = nil,\n                                              requestModifier: RequestModifier? = nil,\n                                              to destination: DownloadRequest.Destination? = nil) -> DownloadRequest {\n        let convertible = RequestEncodableConvertible(url: convertible,\n                                                      method: method,\n                                                      parameters: parameters,\n                                                      encoder: encoder,\n                                                      headers: headers,\n                                                      requestModifier: requestModifier)\n\n        return download(convertible, interceptor: interceptor, to: destination)\n    }\n\n    /// Creates a `DownloadRequest` from a `URLRequestConvertible` value, a `RequestInterceptor`, and a `Destination`.\n    ///\n    /// - Parameters:\n    ///   - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file\n    ///                  should be moved. `nil` by default.\n    ///\n    /// - Returns:       The created `DownloadRequest`.\n    open func download(_ convertible: URLRequestConvertible,\n                       interceptor: RequestInterceptor? = nil,\n                       to destination: DownloadRequest.Destination? = nil) -> DownloadRequest {\n        let request = DownloadRequest(downloadable: .request(convertible),\n                                      underlyingQueue: rootQueue,\n                                      serializationQueue: serializationQueue,\n                                      eventMonitor: eventMonitor,\n                                      interceptor: interceptor,\n                                      delegate: self,\n                                      destination: destination ?? DownloadRequest.defaultDestination)\n\n        perform(request)\n\n        return request\n    }\n\n    /// Creates a `DownloadRequest` from the `resumeData` produced from a previously cancelled `DownloadRequest`, as\n    /// well as a `RequestInterceptor`, and a `Destination`.\n    ///\n    /// - Note: If `destination` is not specified, the download will be moved to a temporary location determined by\n    ///         Alamofire. The file will not be deleted until the system purges the temporary files.\n    ///\n    /// - Note: On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1),\n    /// `resumeData` is broken on background URL session configurations. There's an underlying bug in the `resumeData`\n    /// generation logic where the data is written incorrectly and will always fail to resume the download. For more\n    /// information about the bug and possible workarounds, please refer to the [this Stack Overflow post](http://stackoverflow.com/a/39347461/1342462).\n    ///\n    /// - Parameters:\n    ///   - data:        The resume data from a previously cancelled `DownloadRequest` or `URLSessionDownloadTask`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file\n    ///                  should be moved. `nil` by default.\n    ///\n    /// - Returns:       The created `DownloadRequest`.\n    open func download(resumingWith data: Data,\n                       interceptor: RequestInterceptor? = nil,\n                       to destination: DownloadRequest.Destination? = nil) -> DownloadRequest {\n        let request = DownloadRequest(downloadable: .resumeData(data),\n                                      underlyingQueue: rootQueue,\n                                      serializationQueue: serializationQueue,\n                                      eventMonitor: eventMonitor,\n                                      interceptor: interceptor,\n                                      delegate: self,\n                                      destination: destination ?? DownloadRequest.defaultDestination)\n\n        perform(request)\n\n        return request\n    }\n\n    // MARK: - UploadRequest\n\n    struct ParameterlessRequestConvertible: URLRequestConvertible {\n        let url: URLConvertible\n        let method: HTTPMethod\n        let headers: HTTPHeaders?\n        let requestModifier: RequestModifier?\n\n        func asURLRequest() throws -> URLRequest {\n            var request = try URLRequest(url: url, method: method, headers: headers)\n            try requestModifier?(&request)\n\n            return request\n        }\n    }\n\n    struct Upload: UploadConvertible {\n        let request: URLRequestConvertible\n        let uploadable: UploadableConvertible\n\n        func createUploadable() throws -> UploadRequest.Uploadable {\n            try uploadable.createUploadable()\n        }\n\n        func asURLRequest() throws -> URLRequest {\n            try request.asURLRequest()\n        }\n    }\n\n    // MARK: Data\n\n    /// Creates an `UploadRequest` for the given `Data`, `URLRequest` components, and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - data:            The `Data` to upload.\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.post` by default.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:     `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                      default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///\n    /// - Returns:           The created `UploadRequest`.\n    open func upload(_ data: Data,\n                     to convertible: URLConvertible,\n                     method: HTTPMethod = .post,\n                     headers: HTTPHeaders? = nil,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default,\n                     requestModifier: RequestModifier? = nil) -> UploadRequest {\n        let convertible = ParameterlessRequestConvertible(url: convertible,\n                                                          method: method,\n                                                          headers: headers,\n                                                          requestModifier: requestModifier)\n\n        return upload(data, with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` for the given `Data` using the `URLRequestConvertible` value and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - data:        The `Data` to upload.\n    ///   - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                  default.\n    ///\n    /// - Returns:       The created `UploadRequest`.\n    open func upload(_ data: Data,\n                     with convertible: URLRequestConvertible,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default) -> UploadRequest {\n        upload(.data(data), with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    // MARK: File\n\n    /// Creates an `UploadRequest` for the file at the given file `URL`, using a `URLRequest` from the provided\n    /// components and `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - fileURL:         The `URL` of the file to upload.\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.post` by default.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `UploadRequest`. `nil` by default.\n    ///   - fileManager:     `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                      default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///\n    /// - Returns:           The created `UploadRequest`.\n    open func upload(_ fileURL: URL,\n                     to convertible: URLConvertible,\n                     method: HTTPMethod = .post,\n                     headers: HTTPHeaders? = nil,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default,\n                     requestModifier: RequestModifier? = nil) -> UploadRequest {\n        let convertible = ParameterlessRequestConvertible(url: convertible,\n                                                          method: method,\n                                                          headers: headers,\n                                                          requestModifier: requestModifier)\n\n        return upload(fileURL, with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` for the file at the given file `URL` using the `URLRequestConvertible` value and\n    /// `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - fileURL:     The `URL` of the file to upload.\n    ///   - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                  default.\n    ///\n    /// - Returns:       The created `UploadRequest`.\n    open func upload(_ fileURL: URL,\n                     with convertible: URLRequestConvertible,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default) -> UploadRequest {\n        upload(.file(fileURL, shouldRemove: false), with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    // MARK: InputStream\n\n    /// Creates an `UploadRequest` from the `InputStream` provided using a `URLRequest` from the provided components and\n    /// `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - stream:          The `InputStream` that provides the data to upload.\n    ///   - convertible:     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - method:          `HTTPMethod` for the `URLRequest`. `.post` by default.\n    ///   - headers:         `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:     `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:     `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                      default.\n    ///   - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided\n    ///                      parameters. `nil` by default.\n    ///\n    /// - Returns:           The created `UploadRequest`.\n    open func upload(_ stream: InputStream,\n                     to convertible: URLConvertible,\n                     method: HTTPMethod = .post,\n                     headers: HTTPHeaders? = nil,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default,\n                     requestModifier: RequestModifier? = nil) -> UploadRequest {\n        let convertible = ParameterlessRequestConvertible(url: convertible,\n                                                          method: method,\n                                                          headers: headers,\n                                                          requestModifier: requestModifier)\n\n        return upload(stream, with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` from the provided `InputStream` using the `URLRequestConvertible` value and\n    /// `RequestInterceptor`.\n    ///\n    /// - Parameters:\n    ///   - stream:      The `InputStream` that provides the data to upload.\n    ///   - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                  default.\n    ///\n    /// - Returns:       The created `UploadRequest`.\n    open func upload(_ stream: InputStream,\n                     with convertible: URLRequestConvertible,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default) -> UploadRequest {\n        upload(.stream(stream), with: convertible, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    // MARK: MultipartFormData\n\n    /// Creates an `UploadRequest` for the multipart form data built using a closure and sent using the provided\n    /// `URLRequest` components and `RequestInterceptor`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// - Parameters:\n    ///   - multipartFormData:       `MultipartFormData` building closure.\n    ///   - convertible:             `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or\n    ///                              onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by\n    ///                              default.\n    ///   - method:                  `HTTPMethod` for the `URLRequest`. `.post` by default.\n    ///   - headers:                 `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:             `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:             `FileManager` to be used if the form data exceeds the memory threshold and is\n    ///                              written to disk before being uploaded. `.default` instance by default.\n    ///   - requestModifier:         `RequestModifier` which will be applied to the `URLRequest` created from the\n    ///                              provided parameters. `nil` by default.\n    ///\n    /// - Returns:                   The created `UploadRequest`.\n    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,\n                     to url: URLConvertible,\n                     usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,\n                     method: HTTPMethod = .post,\n                     headers: HTTPHeaders? = nil,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default,\n                     requestModifier: RequestModifier? = nil) -> UploadRequest {\n        let convertible = ParameterlessRequestConvertible(url: url,\n                                                          method: method,\n                                                          headers: headers,\n                                                          requestModifier: requestModifier)\n\n        let formData = MultipartFormData(fileManager: fileManager)\n        multipartFormData(formData)\n\n        return upload(multipartFormData: formData,\n                      with: convertible,\n                      usingThreshold: encodingMemoryThreshold,\n                      interceptor: interceptor,\n                      fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` using a `MultipartFormData` building closure, the provided `URLRequestConvertible`\n    /// value, and a `RequestInterceptor`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// - Parameters:\n    ///   - multipartFormData:       `MultipartFormData` building closure.\n    ///   - request:                 `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or\n    ///                              onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by\n    ///                              default.\n    ///   - interceptor:             `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:             `FileManager` to be used if the form data exceeds the memory threshold and is\n    ///                              written to disk before being uploaded. `.default` instance by default.\n    ///\n    /// - Returns:                   The created `UploadRequest`.\n    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,\n                     with request: URLRequestConvertible,\n                     usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default) -> UploadRequest {\n        let formData = MultipartFormData(fileManager: fileManager)\n        multipartFormData(formData)\n\n        return upload(multipartFormData: formData,\n                      with: request,\n                      usingThreshold: encodingMemoryThreshold,\n                      interceptor: interceptor,\n                      fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the provided `URLRequest` components\n    /// and `RequestInterceptor`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// - Parameters:\n    ///   - multipartFormData:       `MultipartFormData` instance to upload.\n    ///   - url:                     `URLConvertible` value to be used as the `URLRequest`'s `URL`.\n    ///   - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or\n    ///                              onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by\n    ///                              default.\n    ///   - method:                  `HTTPMethod` for the `URLRequest`. `.post` by default.\n    ///   - headers:                 `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default.\n    ///   - interceptor:             `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:             `FileManager` to be used if the form data exceeds the memory threshold and is\n    ///                              written to disk before being uploaded. `.default` instance by default.\n    ///   - requestModifier:         `RequestModifier` which will be applied to the `URLRequest` created from the\n    ///                              provided parameters. `nil` by default.\n    ///\n    /// - Returns:                   The created `UploadRequest`.\n    open func upload(multipartFormData: MultipartFormData,\n                     to url: URLConvertible,\n                     usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,\n                     method: HTTPMethod = .post,\n                     headers: HTTPHeaders? = nil,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default,\n                     requestModifier: RequestModifier? = nil) -> UploadRequest {\n        let convertible = ParameterlessRequestConvertible(url: url,\n                                                          method: method,\n                                                          headers: headers,\n                                                          requestModifier: requestModifier)\n\n        let multipartUpload = MultipartUpload(encodingMemoryThreshold: encodingMemoryThreshold,\n                                              request: convertible,\n                                              multipartFormData: multipartFormData)\n\n        return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the providing `URLRequestConvertible`\n    /// value and `RequestInterceptor`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// - Parameters:\n    ///   - multipartFormData:       `MultipartFormData` instance to upload.\n    ///   - request:                 `URLRequestConvertible` value to be used to create the `URLRequest`.\n    ///   - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or\n    ///                              onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by\n    ///                              default.\n    ///   - interceptor:             `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default.\n    ///   - fileManager:             `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by\n    ///                              default.\n    ///\n    /// - Returns:                   The created `UploadRequest`.\n    open func upload(multipartFormData: MultipartFormData,\n                     with request: URLRequestConvertible,\n                     usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,\n                     interceptor: RequestInterceptor? = nil,\n                     fileManager: FileManager = .default) -> UploadRequest {\n        let multipartUpload = MultipartUpload(encodingMemoryThreshold: encodingMemoryThreshold,\n                                              request: request,\n                                              multipartFormData: multipartFormData)\n\n        return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    // MARK: - Internal API\n\n    // MARK: Uploadable\n\n    func upload(_ uploadable: UploadRequest.Uploadable,\n                with convertible: URLRequestConvertible,\n                interceptor: RequestInterceptor?,\n                fileManager: FileManager) -> UploadRequest {\n        let uploadable = Upload(request: convertible, uploadable: uploadable)\n\n        return upload(uploadable, interceptor: interceptor, fileManager: fileManager)\n    }\n\n    func upload(_ upload: UploadConvertible, interceptor: RequestInterceptor?, fileManager: FileManager) -> UploadRequest {\n        let request = UploadRequest(convertible: upload,\n                                    underlyingQueue: rootQueue,\n                                    serializationQueue: serializationQueue,\n                                    eventMonitor: eventMonitor,\n                                    interceptor: interceptor,\n                                    fileManager: fileManager,\n                                    delegate: self)\n\n        perform(request)\n\n        return request\n    }\n\n    // MARK: Perform\n\n    /// Starts performing the provided `Request`.\n    ///\n    /// - Parameter request: The `Request` to perform.\n    func perform(_ request: Request) {\n        rootQueue.async {\n            guard !request.isCancelled else { return }\n\n            self.activeRequests.insert(request)\n\n            self.requestQueue.async {\n                // Leaf types must come first, otherwise they will cast as their superclass.\n                switch request {\n                case let r as UploadRequest: self.performUploadRequest(r) // UploadRequest must come before DataRequest due to subtype relationship.\n                case let r as DataRequest: self.performDataRequest(r)\n                case let r as DownloadRequest: self.performDownloadRequest(r)\n                case let r as DataStreamRequest: self.performDataStreamRequest(r)\n                default: fatalError(\"Attempted to perform unsupported Request subclass: \\(type(of: request))\")\n                }\n            }\n        }\n    }\n\n    func performDataRequest(_ request: DataRequest) {\n        dispatchPrecondition(condition: .onQueue(requestQueue))\n\n        performSetupOperations(for: request, convertible: request.convertible)\n    }\n\n    func performDataStreamRequest(_ request: DataStreamRequest) {\n        dispatchPrecondition(condition: .onQueue(requestQueue))\n\n        performSetupOperations(for: request, convertible: request.convertible)\n    }\n\n    func performUploadRequest(_ request: UploadRequest) {\n        dispatchPrecondition(condition: .onQueue(requestQueue))\n\n        performSetupOperations(for: request, convertible: request.convertible) {\n            do {\n                let uploadable = try request.upload.createUploadable()\n                self.rootQueue.async { request.didCreateUploadable(uploadable) }\n                return true\n            } catch {\n                self.rootQueue.async { request.didFailToCreateUploadable(with: error.asAFError(or: .createUploadableFailed(error: error))) }\n                return false\n            }\n        }\n    }\n\n    func performDownloadRequest(_ request: DownloadRequest) {\n        dispatchPrecondition(condition: .onQueue(requestQueue))\n\n        switch request.downloadable {\n        case let .request(convertible):\n            performSetupOperations(for: request, convertible: convertible)\n        case let .resumeData(resumeData):\n            rootQueue.async { self.didReceiveResumeData(resumeData, for: request) }\n        }\n    }\n\n    func performSetupOperations(for request: Request,\n                                convertible: URLRequestConvertible,\n                                shouldCreateTask: @escaping () -> Bool = { true })\n    {\n        dispatchPrecondition(condition: .onQueue(requestQueue))\n\n        let initialRequest: URLRequest\n\n        do {\n            initialRequest = try convertible.asURLRequest()\n            try initialRequest.validate()\n        } catch {\n            rootQueue.async { request.didFailToCreateURLRequest(with: error.asAFError(or: .createURLRequestFailed(error: error))) }\n            return\n        }\n\n        rootQueue.async { request.didCreateInitialURLRequest(initialRequest) }\n\n        guard !request.isCancelled else { return }\n\n        guard let adapter = adapter(for: request) else {\n            guard shouldCreateTask() else { return }\n            rootQueue.async { self.didCreateURLRequest(initialRequest, for: request) }\n            return\n        }\n\n        adapter.adapt(initialRequest, for: self) { result in\n            do {\n                let adaptedRequest = try result.get()\n                try adaptedRequest.validate()\n\n                self.rootQueue.async { request.didAdaptInitialRequest(initialRequest, to: adaptedRequest) }\n\n                guard shouldCreateTask() else { return }\n\n                self.rootQueue.async { self.didCreateURLRequest(adaptedRequest, for: request) }\n            } catch {\n                self.rootQueue.async { request.didFailToAdaptURLRequest(initialRequest, withError: .requestAdaptationFailed(error: error)) }\n            }\n        }\n    }\n\n    // MARK: - Task Handling\n\n    func didCreateURLRequest(_ urlRequest: URLRequest, for request: Request) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        request.didCreateURLRequest(urlRequest)\n\n        guard !request.isCancelled else { return }\n\n        let task = request.task(for: urlRequest, using: session)\n        requestTaskMap[request] = task\n        request.didCreateTask(task)\n\n        updateStatesForTask(task, request: request)\n    }\n\n    func didReceiveResumeData(_ data: Data, for request: DownloadRequest) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        guard !request.isCancelled else { return }\n\n        let task = request.task(forResumeData: data, using: session)\n        requestTaskMap[request] = task\n        request.didCreateTask(task)\n\n        updateStatesForTask(task, request: request)\n    }\n\n    func updateStatesForTask(_ task: URLSessionTask, request: Request) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        request.withState { state in\n            switch state {\n            case .initialized, .finished:\n                // Do nothing.\n                break\n            case .resumed:\n                task.resume()\n                rootQueue.async { request.didResumeTask(task) }\n            case .suspended:\n                task.suspend()\n                rootQueue.async { request.didSuspendTask(task) }\n            case .cancelled:\n                // Resume to ensure metrics are gathered.\n                task.resume()\n                task.cancel()\n                rootQueue.async { request.didCancelTask(task) }\n            }\n        }\n    }\n\n    // MARK: - Adapters and Retriers\n\n    func adapter(for request: Request) -> RequestAdapter? {\n        if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor {\n            return Interceptor(adapters: [requestInterceptor, sessionInterceptor])\n        } else {\n            return request.interceptor ?? interceptor\n        }\n    }\n\n    func retrier(for request: Request) -> RequestRetrier? {\n        if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor {\n            return Interceptor(retriers: [requestInterceptor, sessionInterceptor])\n        } else {\n            return request.interceptor ?? interceptor\n        }\n    }\n\n    // MARK: - Invalidation\n\n    func finishRequestsForDeinit() {\n        requestTaskMap.requests.forEach { request in\n            rootQueue.async {\n                request.finish(error: AFError.sessionDeinitialized)\n            }\n        }\n    }\n}\n\n// MARK: - RequestDelegate\n\nextension Session: RequestDelegate {\n    public var sessionConfiguration: URLSessionConfiguration {\n        session.configuration\n    }\n\n    public var startImmediately: Bool { startRequestsImmediately }\n\n    public func cleanup(after request: Request) {\n        activeRequests.remove(request)\n    }\n\n    public func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void) {\n        guard let retrier = retrier(for: request) else {\n            rootQueue.async { completion(.doNotRetry) }\n            return\n        }\n\n        retrier.retry(request, for: self, dueTo: error) { retryResult in\n            self.rootQueue.async {\n                guard let retryResultError = retryResult.error else { completion(retryResult); return }\n\n                let retryError = AFError.requestRetryFailed(retryError: retryResultError, originalError: error)\n                completion(.doNotRetryWithError(retryError))\n            }\n        }\n    }\n\n    public func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?) {\n        rootQueue.async {\n            let retry: () -> Void = {\n                guard !request.isCancelled else { return }\n\n                request.prepareForRetry()\n                self.perform(request)\n            }\n\n            if let retryDelay = timeDelay {\n                self.rootQueue.after(retryDelay) { retry() }\n            } else {\n                retry()\n            }\n        }\n    }\n}\n\n// MARK: - SessionStateProvider\n\nextension Session: SessionStateProvider {\n    func request(for task: URLSessionTask) -> Request? {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        return requestTaskMap[task]\n    }\n\n    func didGatherMetricsForTask(_ task: URLSessionTask) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        let didDisassociate = requestTaskMap.disassociateIfNecessaryAfterGatheringMetricsForTask(task)\n\n        if didDisassociate {\n            waitingCompletions[task]?()\n            waitingCompletions[task] = nil\n        }\n    }\n\n    func didCompleteTask(_ task: URLSessionTask, completion: @escaping () -> Void) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        let didDisassociate = requestTaskMap.disassociateIfNecessaryAfterCompletingTask(task)\n\n        if didDisassociate {\n            completion()\n        } else {\n            waitingCompletions[task] = completion\n        }\n    }\n\n    func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential? {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        return requestTaskMap[task]?.credential ??\n            session.configuration.urlCredentialStorage?.defaultCredential(for: protectionSpace)\n    }\n\n    func cancelRequestsForSessionInvalidation(with error: Error?) {\n        dispatchPrecondition(condition: .onQueue(rootQueue))\n\n        requestTaskMap.requests.forEach { $0.finish(error: AFError.sessionInvalidated(error: error)) }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/SessionDelegate.swift",
    "content": "//\n//  SessionDelegate.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Class which implements the various `URLSessionDelegate` methods to connect various Alamofire features.\nopen class SessionDelegate: NSObject {\n    private let fileManager: FileManager\n\n    weak var stateProvider: SessionStateProvider?\n    var eventMonitor: EventMonitor?\n\n    /// Creates an instance from the given `FileManager`.\n    ///\n    /// - Parameter fileManager: `FileManager` to use for underlying file management, such as moving downloaded files.\n    ///                          `.default` by default.\n    public init(fileManager: FileManager = .default) {\n        self.fileManager = fileManager\n    }\n\n    /// Internal method to find and cast requests while maintaining some integrity checking.\n    ///\n    /// - Parameters:\n    ///   - task: The `URLSessionTask` for which to find the associated `Request`.\n    ///   - type: The `Request` subclass type to cast any `Request` associate with `task`.\n    func request<R: Request>(for task: URLSessionTask, as type: R.Type) -> R? {\n        guard let provider = stateProvider else {\n            assertionFailure(\"StateProvider is nil.\")\n            return nil\n        }\n\n        return provider.request(for: task) as? R\n    }\n}\n\n/// Type which provides various `Session` state values.\nprotocol SessionStateProvider: AnyObject {\n    var serverTrustManager: ServerTrustManager? { get }\n    var redirectHandler: RedirectHandler? { get }\n    var cachedResponseHandler: CachedResponseHandler? { get }\n\n    func request(for task: URLSessionTask) -> Request?\n    func didGatherMetricsForTask(_ task: URLSessionTask)\n    func didCompleteTask(_ task: URLSessionTask, completion: @escaping () -> Void)\n    func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential?\n    func cancelRequestsForSessionInvalidation(with error: Error?)\n}\n\n// MARK: URLSessionDelegate\n\nextension SessionDelegate: URLSessionDelegate {\n    open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {\n        eventMonitor?.urlSession(session, didBecomeInvalidWithError: error)\n\n        stateProvider?.cancelRequestsForSessionInvalidation(with: error)\n    }\n}\n\n// MARK: URLSessionTaskDelegate\n\nextension SessionDelegate: URLSessionTaskDelegate {\n    /// Result of a `URLAuthenticationChallenge` evaluation.\n    typealias ChallengeEvaluation = (disposition: URLSession.AuthChallengeDisposition, credential: URLCredential?, error: AFError?)\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         didReceive challenge: URLAuthenticationChallenge,\n                         completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {\n        eventMonitor?.urlSession(session, task: task, didReceive: challenge)\n\n        let evaluation: ChallengeEvaluation\n        switch challenge.protectionSpace.authenticationMethod {\n        case NSURLAuthenticationMethodServerTrust:\n            evaluation = attemptServerTrustAuthentication(with: challenge)\n        case NSURLAuthenticationMethodHTTPBasic, NSURLAuthenticationMethodHTTPDigest, NSURLAuthenticationMethodNTLM,\n             NSURLAuthenticationMethodNegotiate, NSURLAuthenticationMethodClientCertificate:\n            evaluation = attemptCredentialAuthentication(for: challenge, belongingTo: task)\n        default:\n            evaluation = (.performDefaultHandling, nil, nil)\n        }\n\n        if let error = evaluation.error {\n            stateProvider?.request(for: task)?.didFailTask(task, earlyWithError: error)\n        }\n\n        completionHandler(evaluation.disposition, evaluation.credential)\n    }\n\n    /// Evaluates the server trust `URLAuthenticationChallenge` received.\n    ///\n    /// - Parameter challenge: The `URLAuthenticationChallenge`.\n    ///\n    /// - Returns:             The `ChallengeEvaluation`.\n    func attemptServerTrustAuthentication(with challenge: URLAuthenticationChallenge) -> ChallengeEvaluation {\n        let host = challenge.protectionSpace.host\n\n        guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,\n              let trust = challenge.protectionSpace.serverTrust\n        else {\n            return (.performDefaultHandling, nil, nil)\n        }\n\n        do {\n            guard let evaluator = try stateProvider?.serverTrustManager?.serverTrustEvaluator(forHost: host) else {\n                return (.performDefaultHandling, nil, nil)\n            }\n\n            try evaluator.evaluate(trust, forHost: host)\n\n            return (.useCredential, URLCredential(trust: trust), nil)\n        } catch {\n            return (.cancelAuthenticationChallenge, nil, error.asAFError(or: .serverTrustEvaluationFailed(reason: .customEvaluationFailed(error: error))))\n        }\n    }\n\n    /// Evaluates the credential-based authentication `URLAuthenticationChallenge` received for `task`.\n    ///\n    /// - Parameters:\n    ///   - challenge: The `URLAuthenticationChallenge`.\n    ///   - task:      The `URLSessionTask` which received the challenge.\n    ///\n    /// - Returns:     The `ChallengeEvaluation`.\n    func attemptCredentialAuthentication(for challenge: URLAuthenticationChallenge,\n                                         belongingTo task: URLSessionTask) -> ChallengeEvaluation {\n        guard challenge.previousFailureCount == 0 else {\n            return (.rejectProtectionSpace, nil, nil)\n        }\n\n        guard let credential = stateProvider?.credential(for: task, in: challenge.protectionSpace) else {\n            return (.performDefaultHandling, nil, nil)\n        }\n\n        return (.useCredential, credential, nil)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         didSendBodyData bytesSent: Int64,\n                         totalBytesSent: Int64,\n                         totalBytesExpectedToSend: Int64) {\n        eventMonitor?.urlSession(session,\n                                 task: task,\n                                 didSendBodyData: bytesSent,\n                                 totalBytesSent: totalBytesSent,\n                                 totalBytesExpectedToSend: totalBytesExpectedToSend)\n\n        stateProvider?.request(for: task)?.updateUploadProgress(totalBytesSent: totalBytesSent,\n                                                                totalBytesExpectedToSend: totalBytesExpectedToSend)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         needNewBodyStream completionHandler: @escaping (InputStream?) -> Void) {\n        eventMonitor?.urlSession(session, taskNeedsNewBodyStream: task)\n\n        guard let request = request(for: task, as: UploadRequest.self) else {\n            assertionFailure(\"needNewBodyStream did not find UploadRequest.\")\n            completionHandler(nil)\n            return\n        }\n\n        completionHandler(request.inputStream())\n    }\n\n    open func urlSession(_ session: URLSession,\n                         task: URLSessionTask,\n                         willPerformHTTPRedirection response: HTTPURLResponse,\n                         newRequest request: URLRequest,\n                         completionHandler: @escaping (URLRequest?) -> Void) {\n        eventMonitor?.urlSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request)\n\n        if let redirectHandler = stateProvider?.request(for: task)?.redirectHandler ?? stateProvider?.redirectHandler {\n            redirectHandler.task(task, willBeRedirectedTo: request, for: response, completion: completionHandler)\n        } else {\n            completionHandler(request)\n        }\n    }\n\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {\n        eventMonitor?.urlSession(session, task: task, didFinishCollecting: metrics)\n\n        stateProvider?.request(for: task)?.didGatherMetrics(metrics)\n\n        stateProvider?.didGatherMetricsForTask(task)\n    }\n\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        eventMonitor?.urlSession(session, task: task, didCompleteWithError: error)\n\n        let request = stateProvider?.request(for: task)\n\n        stateProvider?.didCompleteTask(task) {\n            request?.didCompleteTask(task, with: error.map { $0.asAFError(or: .sessionTaskFailed(error: $0)) })\n        }\n    }\n\n    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)\n    open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {\n        eventMonitor?.urlSession(session, taskIsWaitingForConnectivity: task)\n    }\n}\n\n// MARK: URLSessionDataDelegate\n\nextension SessionDelegate: URLSessionDataDelegate {\n    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n        eventMonitor?.urlSession(session, dataTask: dataTask, didReceive: data)\n\n        if let request = request(for: dataTask, as: DataRequest.self) {\n            request.didReceive(data: data)\n        } else if let request = request(for: dataTask, as: DataStreamRequest.self) {\n            request.didReceive(data: data)\n        } else {\n            assertionFailure(\"dataTask did not find DataRequest or DataStreamRequest in didReceive\")\n            return\n        }\n    }\n\n    open func urlSession(_ session: URLSession,\n                         dataTask: URLSessionDataTask,\n                         willCacheResponse proposedResponse: CachedURLResponse,\n                         completionHandler: @escaping (CachedURLResponse?) -> Void) {\n        eventMonitor?.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse)\n\n        if let handler = stateProvider?.request(for: dataTask)?.cachedResponseHandler ?? stateProvider?.cachedResponseHandler {\n            handler.dataTask(dataTask, willCacheResponse: proposedResponse, completion: completionHandler)\n        } else {\n            completionHandler(proposedResponse)\n        }\n    }\n}\n\n// MARK: URLSessionDownloadDelegate\n\nextension SessionDelegate: URLSessionDownloadDelegate {\n    open func urlSession(_ session: URLSession,\n                         downloadTask: URLSessionDownloadTask,\n                         didResumeAtOffset fileOffset: Int64,\n                         expectedTotalBytes: Int64) {\n        eventMonitor?.urlSession(session,\n                                 downloadTask: downloadTask,\n                                 didResumeAtOffset: fileOffset,\n                                 expectedTotalBytes: expectedTotalBytes)\n        guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else {\n            assertionFailure(\"downloadTask did not find DownloadRequest.\")\n            return\n        }\n\n        downloadRequest.updateDownloadProgress(bytesWritten: fileOffset,\n                                               totalBytesExpectedToWrite: expectedTotalBytes)\n    }\n\n    open func urlSession(_ session: URLSession,\n                         downloadTask: URLSessionDownloadTask,\n                         didWriteData bytesWritten: Int64,\n                         totalBytesWritten: Int64,\n                         totalBytesExpectedToWrite: Int64) {\n        eventMonitor?.urlSession(session,\n                                 downloadTask: downloadTask,\n                                 didWriteData: bytesWritten,\n                                 totalBytesWritten: totalBytesWritten,\n                                 totalBytesExpectedToWrite: totalBytesExpectedToWrite)\n        guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else {\n            assertionFailure(\"downloadTask did not find DownloadRequest.\")\n            return\n        }\n\n        downloadRequest.updateDownloadProgress(bytesWritten: bytesWritten,\n                                               totalBytesExpectedToWrite: totalBytesExpectedToWrite)\n    }\n\n    open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {\n        eventMonitor?.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location)\n\n        guard let request = request(for: downloadTask, as: DownloadRequest.self) else {\n            assertionFailure(\"downloadTask did not find DownloadRequest.\")\n            return\n        }\n\n        let (destination, options): (URL, DownloadRequest.Options)\n        if let response = request.response {\n            (destination, options) = request.destination(location, response)\n        } else {\n            // If there's no response this is likely a local file download, so generate the temporary URL directly.\n            (destination, options) = (DownloadRequest.defaultDestinationURL(location), [])\n        }\n\n        eventMonitor?.request(request, didCreateDestinationURL: destination)\n\n        do {\n            if options.contains(.removePreviousFile), fileManager.fileExists(atPath: destination.path) {\n                try fileManager.removeItem(at: destination)\n            }\n\n            if options.contains(.createIntermediateDirectories) {\n                let directory = destination.deletingLastPathComponent()\n                try fileManager.createDirectory(at: directory, withIntermediateDirectories: true)\n            }\n\n            try fileManager.moveItem(at: location, to: destination)\n\n            request.didFinishDownloading(using: downloadTask, with: .success(destination))\n        } catch {\n            request.didFinishDownloading(using: downloadTask, with: .failure(.downloadedFileMoveFailed(error: error,\n                                                                                                       source: location,\n                                                                                                       destination: destination)))\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/StringEncoding+Alamofire.swift",
    "content": "//\n//  StringEncoding+Alamofire.swift\n//\n//  Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension String.Encoding {\n    /// Creates an encoding from the IANA charset name.\n    ///\n    /// - Notes: These mappings match those [provided by CoreFoundation](https://opensource.apple.com/source/CF/CF-476.18/CFStringUtilities.c.auto.html)\n    ///\n    /// - Parameter name: IANA charset name.\n    init?(ianaCharsetName name: String) {\n        switch name.lowercased() {\n        case \"utf-8\":\n            self = .utf8\n        case \"iso-8859-1\":\n            self = .isoLatin1\n        case \"unicode-1-1\", \"iso-10646-ucs-2\", \"utf-16\":\n            self = .utf16\n        case \"utf-16be\":\n            self = .utf16BigEndian\n        case \"utf-16le\":\n            self = .utf16LittleEndian\n        case \"utf-32\":\n            self = .utf32\n        case \"utf-32be\":\n            self = .utf32BigEndian\n        case \"utf-32le\":\n            self = .utf32LittleEndian\n        default:\n            return nil\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift",
    "content": "//\n//  URLConvertible+URLRequestConvertible.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Types adopting the `URLConvertible` protocol can be used to construct `URL`s, which can then be used to construct\n/// `URLRequests`.\npublic protocol URLConvertible {\n    /// Returns a `URL` from the conforming instance or throws.\n    ///\n    /// - Returns: The `URL` created from the instance.\n    /// - Throws:  Any error thrown while creating the `URL`.\n    func asURL() throws -> URL\n}\n\nextension String: URLConvertible {\n    /// Returns a `URL` if `self` can be used to initialize a `URL` instance, otherwise throws.\n    ///\n    /// - Returns: The `URL` initialized with `self`.\n    /// - Throws:  An `AFError.invalidURL` instance.\n    public func asURL() throws -> URL {\n        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }\n\n        return url\n    }\n}\n\nextension URL: URLConvertible {\n    /// Returns `self`.\n    public func asURL() throws -> URL { self }\n}\n\nextension URLComponents: URLConvertible {\n    /// Returns a `URL` if the `self`'s `url` is not nil, otherwise throws.\n    ///\n    /// - Returns: The `URL` from the `url` property.\n    /// - Throws:  An `AFError.invalidURL` instance.\n    public func asURL() throws -> URL {\n        guard let url = url else { throw AFError.invalidURL(url: self) }\n\n        return url\n    }\n}\n\n// MARK: -\n\n/// Types adopting the `URLRequestConvertible` protocol can be used to safely construct `URLRequest`s.\npublic protocol URLRequestConvertible {\n    /// Returns a `URLRequest` or throws if an `Error` was encountered.\n    ///\n    /// - Returns: A `URLRequest`.\n    /// - Throws:  Any error thrown while constructing the `URLRequest`.\n    func asURLRequest() throws -> URLRequest\n}\n\nextension URLRequestConvertible {\n    /// The `URLRequest` returned by discarding any `Error` encountered.\n    public var urlRequest: URLRequest? { try? asURLRequest() }\n}\n\nextension URLRequest: URLRequestConvertible {\n    /// Returns `self`.\n    public func asURLRequest() throws -> URLRequest { self }\n}\n\n// MARK: -\n\nextension URLRequest {\n    /// Creates an instance with the specified `url`, `method`, and `headers`.\n    ///\n    /// - Parameters:\n    ///   - url:     The `URLConvertible` value.\n    ///   - method:  The `HTTPMethod`.\n    ///   - headers: The `HTTPHeaders`, `nil` by default.\n    /// - Throws:    Any error thrown while converting the `URLConvertible` to a `URL`.\n    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {\n        let url = try url.asURL()\n\n        self.init(url: url)\n\n        httpMethod = method.rawValue\n        allHTTPHeaderFields = headers?.dictionary\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/URLEncodedFormEncoder.swift",
    "content": "//\n//  URLEncodedFormEncoder.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// An object that encodes instances into URL-encoded query strings.\n///\n/// There is no published specification for how to encode collection types. By default, the convention of appending\n/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for\n/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the\n/// square brackets appended to array keys.\n///\n/// `BoolEncoding` can be used to configure how `Bool` values are encoded. The default behavior is to encode\n/// `true` as 1 and `false` as 0.\n///\n/// `DateEncoding` can be used to configure how `Date` values are encoded. By default, the `.deferredToDate`\n/// strategy is used, which formats dates from their structure.\n///\n/// `SpaceEncoding` can be used to configure how spaces are encoded. Modern encodings use percent replacement (`%20`),\n/// while older encodings may expect spaces to be replaced with `+`.\n///\n/// This type is largely based on Vapor's [`url-encoded-form`](https://github.com/vapor/url-encoded-form) project.\npublic final class URLEncodedFormEncoder {\n    /// Encoding to use for `Array` values.\n    public enum ArrayEncoding {\n        /// An empty set of square brackets (\"[]\") are appended to the key for every value. This is the default encoding.\n        case brackets\n        /// No brackets are appended to the key and the key is encoded as is.\n        case noBrackets\n\n        /// Encodes the key according to the encoding.\n        ///\n        /// - Parameter key: The `key` to encode.\n        /// - Returns:       The encoded key.\n        func encode(_ key: String) -> String {\n            switch self {\n            case .brackets: return \"\\(key)[]\"\n            case .noBrackets: return key\n            }\n        }\n    }\n\n    /// Encoding to use for `Bool` values.\n    public enum BoolEncoding {\n        /// Encodes `true` as `1`, `false` as `0`.\n        case numeric\n        /// Encodes `true` as \"true\", `false` as \"false\". This is the default encoding.\n        case literal\n\n        /// Encodes the given `Bool` as a `String`.\n        ///\n        /// - Parameter value: The `Bool` to encode.\n        ///\n        /// - Returns:         The encoded `String`.\n        func encode(_ value: Bool) -> String {\n            switch self {\n            case .numeric: return value ? \"1\" : \"0\"\n            case .literal: return value ? \"true\" : \"false\"\n            }\n        }\n    }\n\n    /// Encoding to use for `Data` values.\n    public enum DataEncoding {\n        /// Defers encoding to the `Data` type.\n        case deferredToData\n        /// Encodes `Data` as a Base64-encoded string. This is the default encoding.\n        case base64\n        /// Encode the `Data` as a custom value encoded by the given closure.\n        case custom((Data) throws -> String)\n\n        /// Encodes `Data` according to the encoding.\n        ///\n        /// - Parameter data: The `Data` to encode.\n        ///\n        /// - Returns:        The encoded `String`, or `nil` if the `Data` should be encoded according to its\n        ///                   `Encodable` implementation.\n        func encode(_ data: Data) throws -> String? {\n            switch self {\n            case .deferredToData: return nil\n            case .base64: return data.base64EncodedString()\n            case let .custom(encoding): return try encoding(data)\n            }\n        }\n    }\n\n    /// Encoding to use for `Date` values.\n    public enum DateEncoding {\n        /// ISO8601 and RFC3339 formatter.\n        private static let iso8601Formatter: ISO8601DateFormatter = {\n            let formatter = ISO8601DateFormatter()\n            formatter.formatOptions = .withInternetDateTime\n            return formatter\n        }()\n\n        /// Defers encoding to the `Date` type. This is the default encoding.\n        case deferredToDate\n        /// Encodes `Date`s as seconds since midnight UTC on January 1, 1970.\n        case secondsSince1970\n        /// Encodes `Date`s as milliseconds since midnight UTC on January 1, 1970.\n        case millisecondsSince1970\n        /// Encodes `Date`s according to the ISO8601 and RFC3339 standards.\n        case iso8601\n        /// Encodes `Date`s using the given `DateFormatter`.\n        case formatted(DateFormatter)\n        /// Encodes `Date`s using the given closure.\n        case custom((Date) throws -> String)\n\n        /// Encodes the date according to the encoding.\n        ///\n        /// - Parameter date: The `Date` to encode.\n        ///\n        /// - Returns:        The encoded `String`, or `nil` if the `Date` should be encoded according to its\n        ///                   `Encodable` implementation.\n        func encode(_ date: Date) throws -> String? {\n            switch self {\n            case .deferredToDate:\n                return nil\n            case .secondsSince1970:\n                return String(date.timeIntervalSince1970)\n            case .millisecondsSince1970:\n                return String(date.timeIntervalSince1970 * 1000.0)\n            case .iso8601:\n                return DateEncoding.iso8601Formatter.string(from: date)\n            case let .formatted(formatter):\n                return formatter.string(from: date)\n            case let .custom(closure):\n                return try closure(date)\n            }\n        }\n    }\n\n    /// Encoding to use for keys.\n    ///\n    /// This type is derived from [`JSONEncoder`'s `KeyEncodingStrategy`](https://github.com/apple/swift/blob/6aa313b8dd5f05135f7f878eccc1db6f9fbe34ff/stdlib/public/Darwin/Foundation/JSONEncoder.swift#L128)\n    /// and [`XMLEncoder`s `KeyEncodingStrategy`](https://github.com/MaxDesiatov/XMLCoder/blob/master/Sources/XMLCoder/Encoder/XMLEncoder.swift#L102).\n    public enum KeyEncoding {\n        /// Use the keys specified by each type. This is the default encoding.\n        case useDefaultKeys\n        /// Convert from \"camelCaseKeys\" to \"snake_case_keys\" before writing a key.\n        ///\n        /// Capital characters are determined by testing membership in\n        /// `CharacterSet.uppercaseLetters` and `CharacterSet.lowercaseLetters`\n        /// (Unicode General Categories Lu and Lt).\n        /// The conversion to lower case uses `Locale.system`, also known as\n        /// the ICU \"root\" locale. This means the result is consistent\n        /// regardless of the current user's locale and language preferences.\n        ///\n        /// Converting from camel case to snake case:\n        /// 1. Splits words at the boundary of lower-case to upper-case\n        /// 2. Inserts `_` between words\n        /// 3. Lowercases the entire string\n        /// 4. Preserves starting and ending `_`.\n        ///\n        /// For example, `oneTwoThree` becomes `one_two_three`. `_oneTwoThree_` becomes `_one_two_three_`.\n        ///\n        /// - Note: Using a key encoding strategy has a nominal performance cost, as each string key has to be converted.\n        case convertToSnakeCase\n        /// Same as convertToSnakeCase, but using `-` instead of `_`.\n        /// For example `oneTwoThree` becomes `one-two-three`.\n        case convertToKebabCase\n        /// Capitalize the first letter only.\n        /// For example `oneTwoThree` becomes  `OneTwoThree`.\n        case capitalized\n        /// Uppercase all letters.\n        /// For example `oneTwoThree` becomes  `ONETWOTHREE`.\n        case uppercased\n        /// Lowercase all letters.\n        /// For example `oneTwoThree` becomes  `onetwothree`.\n        case lowercased\n        /// A custom encoding using the provided closure.\n        case custom((String) -> String)\n\n        func encode(_ key: String) -> String {\n            switch self {\n            case .useDefaultKeys: return key\n            case .convertToSnakeCase: return convertToSnakeCase(key)\n            case .convertToKebabCase: return convertToKebabCase(key)\n            case .capitalized: return String(key.prefix(1).uppercased() + key.dropFirst())\n            case .uppercased: return key.uppercased()\n            case .lowercased: return key.lowercased()\n            case let .custom(encoding): return encoding(key)\n            }\n        }\n\n        private func convertToSnakeCase(_ key: String) -> String {\n            convert(key, usingSeparator: \"_\")\n        }\n\n        private func convertToKebabCase(_ key: String) -> String {\n            convert(key, usingSeparator: \"-\")\n        }\n\n        private func convert(_ key: String, usingSeparator separator: String) -> String {\n            guard !key.isEmpty else { return key }\n\n            var words: [Range<String.Index>] = []\n            // The general idea of this algorithm is to split words on\n            // transition from lower to upper case, then on transition of >1\n            // upper case characters to lowercase\n            //\n            // myProperty -> my_property\n            // myURLProperty -> my_url_property\n            //\n            // It is assumed, per Swift naming conventions, that the first character of the key is lowercase.\n            var wordStart = key.startIndex\n            var searchRange = key.index(after: wordStart)..<key.endIndex\n\n            // Find next uppercase character\n            while let upperCaseRange = key.rangeOfCharacter(from: CharacterSet.uppercaseLetters, options: [], range: searchRange) {\n                let untilUpperCase = wordStart..<upperCaseRange.lowerBound\n                words.append(untilUpperCase)\n\n                // Find next lowercase character\n                searchRange = upperCaseRange.lowerBound..<searchRange.upperBound\n                guard let lowerCaseRange = key.rangeOfCharacter(from: CharacterSet.lowercaseLetters, options: [], range: searchRange) else {\n                    // There are no more lower case letters. Just end here.\n                    wordStart = searchRange.lowerBound\n                    break\n                }\n\n                // Is the next lowercase letter more than 1 after the uppercase?\n                // If so, we encountered a group of uppercase letters that we\n                // should treat as its own word\n                let nextCharacterAfterCapital = key.index(after: upperCaseRange.lowerBound)\n                if lowerCaseRange.lowerBound == nextCharacterAfterCapital {\n                    // The next character after capital is a lower case character and therefore not a word boundary.\n                    // Continue searching for the next upper case for the boundary.\n                    wordStart = upperCaseRange.lowerBound\n                } else {\n                    // There was a range of >1 capital letters. Turn those into a word, stopping at the capital before the lower case character.\n                    let beforeLowerIndex = key.index(before: lowerCaseRange.lowerBound)\n                    words.append(upperCaseRange.lowerBound..<beforeLowerIndex)\n\n                    // Next word starts at the capital before the lowercase we just found\n                    wordStart = beforeLowerIndex\n                }\n                searchRange = lowerCaseRange.upperBound..<searchRange.upperBound\n            }\n            words.append(wordStart..<searchRange.upperBound)\n            let result = words.map { range in\n                key[range].lowercased()\n            }.joined(separator: separator)\n\n            return result\n        }\n    }\n\n    /// Encoding to use for spaces.\n    public enum SpaceEncoding {\n        /// Encodes spaces according to normal percent escaping rules (%20).\n        case percentEscaped\n        /// Encodes spaces as `+`,\n        case plusReplaced\n\n        /// Encodes the string according to the encoding.\n        ///\n        /// - Parameter string: The `String` to encode.\n        ///\n        /// - Returns:          The encoded `String`.\n        func encode(_ string: String) -> String {\n            switch self {\n            case .percentEscaped: return string.replacingOccurrences(of: \" \", with: \"%20\")\n            case .plusReplaced: return string.replacingOccurrences(of: \" \", with: \"+\")\n            }\n        }\n    }\n\n    /// `URLEncodedFormEncoder` error.\n    public enum Error: Swift.Error {\n        /// An invalid root object was created by the encoder. Only keyed values are valid.\n        case invalidRootObject(String)\n\n        var localizedDescription: String {\n            switch self {\n            case let .invalidRootObject(object):\n                return \"URLEncodedFormEncoder requires keyed root object. Received \\(object) instead.\"\n            }\n        }\n    }\n\n    /// Whether or not to sort the encoded key value pairs.\n    ///\n    /// - Note: This setting ensures a consistent ordering for all encodings of the same parameters. When set to `false`,\n    ///         encoded `Dictionary` values may have a different encoded order each time they're encoded due to\n    ///       ` Dictionary`'s random storage order, but `Encodable` types will maintain their encoded order.\n    public let alphabetizeKeyValuePairs: Bool\n    /// The `ArrayEncoding` to use.\n    public let arrayEncoding: ArrayEncoding\n    /// The `BoolEncoding` to use.\n    public let boolEncoding: BoolEncoding\n    /// THe `DataEncoding` to use.\n    public let dataEncoding: DataEncoding\n    /// The `DateEncoding` to use.\n    public let dateEncoding: DateEncoding\n    /// The `KeyEncoding` to use.\n    public let keyEncoding: KeyEncoding\n    /// The `SpaceEncoding` to use.\n    public let spaceEncoding: SpaceEncoding\n    /// The `CharacterSet` of allowed (non-escaped) characters.\n    public var allowedCharacters: CharacterSet\n\n    /// Creates an instance from the supplied parameters.\n    ///\n    /// - Parameters:\n    ///   - alphabetizeKeyValuePairs: Whether or not to sort the encoded key value pairs. `true` by default.\n    ///   - arrayEncoding:            The `ArrayEncoding` to use. `.brackets` by default.\n    ///   - boolEncoding:             The `BoolEncoding` to use. `.numeric` by default.\n    ///   - dataEncoding:             The `DataEncoding` to use. `.base64` by default.\n    ///   - dateEncoding:             The `DateEncoding` to use. `.deferredToDate` by default.\n    ///   - keyEncoding:              The `KeyEncoding` to use. `.useDefaultKeys` by default.\n    ///   - spaceEncoding:            The `SpaceEncoding` to use. `.percentEscaped` by default.\n    ///   - allowedCharacters:        The `CharacterSet` of allowed (non-escaped) characters. `.afURLQueryAllowed` by\n    ///                               default.\n    public init(alphabetizeKeyValuePairs: Bool = true,\n                arrayEncoding: ArrayEncoding = .brackets,\n                boolEncoding: BoolEncoding = .numeric,\n                dataEncoding: DataEncoding = .base64,\n                dateEncoding: DateEncoding = .deferredToDate,\n                keyEncoding: KeyEncoding = .useDefaultKeys,\n                spaceEncoding: SpaceEncoding = .percentEscaped,\n                allowedCharacters: CharacterSet = .afURLQueryAllowed) {\n        self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs\n        self.arrayEncoding = arrayEncoding\n        self.boolEncoding = boolEncoding\n        self.dataEncoding = dataEncoding\n        self.dateEncoding = dateEncoding\n        self.keyEncoding = keyEncoding\n        self.spaceEncoding = spaceEncoding\n        self.allowedCharacters = allowedCharacters\n    }\n\n    func encode(_ value: Encodable) throws -> URLEncodedFormComponent {\n        let context = URLEncodedFormContext(.object([]))\n        let encoder = _URLEncodedFormEncoder(context: context,\n                                             boolEncoding: boolEncoding,\n                                             dataEncoding: dataEncoding,\n                                             dateEncoding: dateEncoding)\n        try value.encode(to: encoder)\n\n        return context.component\n    }\n\n    /// Encodes the `value` as a URL form encoded `String`.\n    ///\n    /// - Parameter value: The `Encodable` value.`\n    ///\n    /// - Returns:         The encoded `String`.\n    /// - Throws:          An `Error` or `EncodingError` instance if encoding fails.\n    public func encode(_ value: Encodable) throws -> String {\n        let component: URLEncodedFormComponent = try encode(value)\n\n        guard case let .object(object) = component else {\n            throw Error.invalidRootObject(\"\\(component)\")\n        }\n\n        let serializer = URLEncodedFormSerializer(alphabetizeKeyValuePairs: alphabetizeKeyValuePairs,\n                                                  arrayEncoding: arrayEncoding,\n                                                  keyEncoding: keyEncoding,\n                                                  spaceEncoding: spaceEncoding,\n                                                  allowedCharacters: allowedCharacters)\n        let query = serializer.serialize(object)\n\n        return query\n    }\n\n    /// Encodes the value as `Data`. This is performed by first creating an encoded `String` and then returning the\n    /// `.utf8` data.\n    ///\n    /// - Parameter value: The `Encodable` value.\n    ///\n    /// - Returns:         The encoded `Data`.\n    ///\n    /// - Throws:          An `Error` or `EncodingError` instance if encoding fails.\n    public func encode(_ value: Encodable) throws -> Data {\n        let string: String = try encode(value)\n\n        return Data(string.utf8)\n    }\n}\n\nfinal class _URLEncodedFormEncoder {\n    var codingPath: [CodingKey]\n    // Returns an empty dictionary, as this encoder doesn't support userInfo.\n    var userInfo: [CodingUserInfoKey: Any] { [:] }\n\n    let context: URLEncodedFormContext\n\n    private let boolEncoding: URLEncodedFormEncoder.BoolEncoding\n    private let dataEncoding: URLEncodedFormEncoder.DataEncoding\n    private let dateEncoding: URLEncodedFormEncoder.DateEncoding\n\n    init(context: URLEncodedFormContext,\n         codingPath: [CodingKey] = [],\n         boolEncoding: URLEncodedFormEncoder.BoolEncoding,\n         dataEncoding: URLEncodedFormEncoder.DataEncoding,\n         dateEncoding: URLEncodedFormEncoder.DateEncoding) {\n        self.context = context\n        self.codingPath = codingPath\n        self.boolEncoding = boolEncoding\n        self.dataEncoding = dataEncoding\n        self.dateEncoding = dateEncoding\n    }\n}\n\nextension _URLEncodedFormEncoder: Encoder {\n    func container<Key>(keyedBy type: Key.Type) -> KeyedEncodingContainer<Key> where Key: CodingKey {\n        let container = _URLEncodedFormEncoder.KeyedContainer<Key>(context: context,\n                                                                   codingPath: codingPath,\n                                                                   boolEncoding: boolEncoding,\n                                                                   dataEncoding: dataEncoding,\n                                                                   dateEncoding: dateEncoding)\n        return KeyedEncodingContainer(container)\n    }\n\n    func unkeyedContainer() -> UnkeyedEncodingContainer {\n        _URLEncodedFormEncoder.UnkeyedContainer(context: context,\n                                                codingPath: codingPath,\n                                                boolEncoding: boolEncoding,\n                                                dataEncoding: dataEncoding,\n                                                dateEncoding: dateEncoding)\n    }\n\n    func singleValueContainer() -> SingleValueEncodingContainer {\n        _URLEncodedFormEncoder.SingleValueContainer(context: context,\n                                                    codingPath: codingPath,\n                                                    boolEncoding: boolEncoding,\n                                                    dataEncoding: dataEncoding,\n                                                    dateEncoding: dateEncoding)\n    }\n}\n\nfinal class URLEncodedFormContext {\n    var component: URLEncodedFormComponent\n\n    init(_ component: URLEncodedFormComponent) {\n        self.component = component\n    }\n}\n\nenum URLEncodedFormComponent {\n    typealias Object = [(key: String, value: URLEncodedFormComponent)]\n\n    case string(String)\n    case array([URLEncodedFormComponent])\n    case object(Object)\n\n    /// Converts self to an `[URLEncodedFormData]` or returns `nil` if not convertible.\n    var array: [URLEncodedFormComponent]? {\n        switch self {\n        case let .array(array): return array\n        default: return nil\n        }\n    }\n\n    /// Converts self to an `Object` or returns `nil` if not convertible.\n    var object: Object? {\n        switch self {\n        case let .object(object): return object\n        default: return nil\n        }\n    }\n\n    /// Sets self to the supplied value at a given path.\n    ///\n    ///     data.set(to: \"hello\", at: [\"path\", \"to\", \"value\"])\n    ///\n    /// - parameters:\n    ///     - value: Value of `Self` to set at the supplied path.\n    ///     - path: `CodingKey` path to update with the supplied value.\n    public mutating func set(to value: URLEncodedFormComponent, at path: [CodingKey]) {\n        set(&self, to: value, at: path)\n    }\n\n    /// Recursive backing method to `set(to:at:)`.\n    private func set(_ context: inout URLEncodedFormComponent, to value: URLEncodedFormComponent, at path: [CodingKey]) {\n        guard path.count >= 1 else {\n            context = value\n            return\n        }\n\n        let end = path[0]\n        var child: URLEncodedFormComponent\n        switch path.count {\n        case 1:\n            child = value\n        case 2...:\n            if let index = end.intValue {\n                let array = context.array ?? []\n                if array.count > index {\n                    child = array[index]\n                } else {\n                    child = .array([])\n                }\n                set(&child, to: value, at: Array(path[1...]))\n            } else {\n                child = context.object?.first { $0.key == end.stringValue }?.value ?? .object(.init())\n                set(&child, to: value, at: Array(path[1...]))\n            }\n        default: fatalError(\"Unreachable\")\n        }\n\n        if let index = end.intValue {\n            if var array = context.array {\n                if array.count > index {\n                    array[index] = child\n                } else {\n                    array.append(child)\n                }\n                context = .array(array)\n            } else {\n                context = .array([child])\n            }\n        } else {\n            if var object = context.object {\n                if let index = object.firstIndex(where: { $0.key == end.stringValue }) {\n                    object[index] = (key: end.stringValue, value: child)\n                } else {\n                    object.append((key: end.stringValue, value: child))\n                }\n                context = .object(object)\n            } else {\n                context = .object([(key: end.stringValue, value: child)])\n            }\n        }\n    }\n}\n\nstruct AnyCodingKey: CodingKey, Hashable {\n    let stringValue: String\n    let intValue: Int?\n\n    init?(stringValue: String) {\n        self.stringValue = stringValue\n        intValue = nil\n    }\n\n    init?(intValue: Int) {\n        stringValue = \"\\(intValue)\"\n        self.intValue = intValue\n    }\n\n    init<Key>(_ base: Key) where Key: CodingKey {\n        if let intValue = base.intValue {\n            self.init(intValue: intValue)!\n        } else {\n            self.init(stringValue: base.stringValue)!\n        }\n    }\n}\n\nextension _URLEncodedFormEncoder {\n    final class KeyedContainer<Key> where Key: CodingKey {\n        var codingPath: [CodingKey]\n\n        private let context: URLEncodedFormContext\n        private let boolEncoding: URLEncodedFormEncoder.BoolEncoding\n        private let dataEncoding: URLEncodedFormEncoder.DataEncoding\n        private let dateEncoding: URLEncodedFormEncoder.DateEncoding\n\n        init(context: URLEncodedFormContext,\n             codingPath: [CodingKey],\n             boolEncoding: URLEncodedFormEncoder.BoolEncoding,\n             dataEncoding: URLEncodedFormEncoder.DataEncoding,\n             dateEncoding: URLEncodedFormEncoder.DateEncoding) {\n            self.context = context\n            self.codingPath = codingPath\n            self.boolEncoding = boolEncoding\n            self.dataEncoding = dataEncoding\n            self.dateEncoding = dateEncoding\n        }\n\n        private func nestedCodingPath(for key: CodingKey) -> [CodingKey] {\n            codingPath + [key]\n        }\n    }\n}\n\nextension _URLEncodedFormEncoder.KeyedContainer: KeyedEncodingContainerProtocol {\n    func encodeNil(forKey key: Key) throws {\n        let context = EncodingError.Context(codingPath: codingPath,\n                                            debugDescription: \"URLEncodedFormEncoder cannot encode nil values.\")\n        throw EncodingError.invalidValue(\"\\(key): nil\", context)\n    }\n\n    func encode<T>(_ value: T, forKey key: Key) throws where T: Encodable {\n        var container = nestedSingleValueEncoder(for: key)\n        try container.encode(value)\n    }\n\n    func nestedSingleValueEncoder(for key: Key) -> SingleValueEncodingContainer {\n        let container = _URLEncodedFormEncoder.SingleValueContainer(context: context,\n                                                                    codingPath: nestedCodingPath(for: key),\n                                                                    boolEncoding: boolEncoding,\n                                                                    dataEncoding: dataEncoding,\n                                                                    dateEncoding: dateEncoding)\n\n        return container\n    }\n\n    func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer {\n        let container = _URLEncodedFormEncoder.UnkeyedContainer(context: context,\n                                                                codingPath: nestedCodingPath(for: key),\n                                                                boolEncoding: boolEncoding,\n                                                                dataEncoding: dataEncoding,\n                                                                dateEncoding: dateEncoding)\n\n        return container\n    }\n\n    func nestedContainer<NestedKey>(keyedBy keyType: NestedKey.Type, forKey key: Key) -> KeyedEncodingContainer<NestedKey> where NestedKey: CodingKey {\n        let container = _URLEncodedFormEncoder.KeyedContainer<NestedKey>(context: context,\n                                                                         codingPath: nestedCodingPath(for: key),\n                                                                         boolEncoding: boolEncoding,\n                                                                         dataEncoding: dataEncoding,\n                                                                         dateEncoding: dateEncoding)\n\n        return KeyedEncodingContainer(container)\n    }\n\n    func superEncoder() -> Encoder {\n        _URLEncodedFormEncoder(context: context,\n                               codingPath: codingPath,\n                               boolEncoding: boolEncoding,\n                               dataEncoding: dataEncoding,\n                               dateEncoding: dateEncoding)\n    }\n\n    func superEncoder(forKey key: Key) -> Encoder {\n        _URLEncodedFormEncoder(context: context,\n                               codingPath: nestedCodingPath(for: key),\n                               boolEncoding: boolEncoding,\n                               dataEncoding: dataEncoding,\n                               dateEncoding: dateEncoding)\n    }\n}\n\nextension _URLEncodedFormEncoder {\n    final class SingleValueContainer {\n        var codingPath: [CodingKey]\n\n        private var canEncodeNewValue = true\n\n        private let context: URLEncodedFormContext\n        private let boolEncoding: URLEncodedFormEncoder.BoolEncoding\n        private let dataEncoding: URLEncodedFormEncoder.DataEncoding\n        private let dateEncoding: URLEncodedFormEncoder.DateEncoding\n\n        init(context: URLEncodedFormContext,\n             codingPath: [CodingKey],\n             boolEncoding: URLEncodedFormEncoder.BoolEncoding,\n             dataEncoding: URLEncodedFormEncoder.DataEncoding,\n             dateEncoding: URLEncodedFormEncoder.DateEncoding) {\n            self.context = context\n            self.codingPath = codingPath\n            self.boolEncoding = boolEncoding\n            self.dataEncoding = dataEncoding\n            self.dateEncoding = dateEncoding\n        }\n\n        private func checkCanEncode(value: Any?) throws {\n            guard canEncodeNewValue else {\n                let context = EncodingError.Context(codingPath: codingPath,\n                                                    debugDescription: \"Attempt to encode value through single value container when previously value already encoded.\")\n                throw EncodingError.invalidValue(value as Any, context)\n            }\n        }\n    }\n}\n\nextension _URLEncodedFormEncoder.SingleValueContainer: SingleValueEncodingContainer {\n    func encodeNil() throws {\n        try checkCanEncode(value: nil)\n        defer { canEncodeNewValue = false }\n\n        let context = EncodingError.Context(codingPath: codingPath,\n                                            debugDescription: \"URLEncodedFormEncoder cannot encode nil values.\")\n        throw EncodingError.invalidValue(\"nil\", context)\n    }\n\n    func encode(_ value: Bool) throws {\n        try encode(value, as: String(boolEncoding.encode(value)))\n    }\n\n    func encode(_ value: String) throws {\n        try encode(value, as: value)\n    }\n\n    func encode(_ value: Double) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Float) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Int) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Int8) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Int16) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Int32) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: Int64) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: UInt) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: UInt8) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: UInt16) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: UInt32) throws {\n        try encode(value, as: String(value))\n    }\n\n    func encode(_ value: UInt64) throws {\n        try encode(value, as: String(value))\n    }\n\n    private func encode<T>(_ value: T, as string: String) throws where T: Encodable {\n        try checkCanEncode(value: value)\n        defer { canEncodeNewValue = false }\n\n        context.component.set(to: .string(string), at: codingPath)\n    }\n\n    func encode<T>(_ value: T) throws where T: Encodable {\n        switch value {\n        case let date as Date:\n            guard let string = try dateEncoding.encode(date) else {\n                try attemptToEncode(value)\n                return\n            }\n\n            try encode(value, as: string)\n        case let data as Data:\n            guard let string = try dataEncoding.encode(data) else {\n                try attemptToEncode(value)\n                return\n            }\n\n            try encode(value, as: string)\n        case let decimal as Decimal:\n            // Decimal's `Encodable` implementation returns an object, not a single value, so override it.\n            try encode(value, as: String(describing: decimal))\n        default:\n            try attemptToEncode(value)\n        }\n    }\n\n    private func attemptToEncode<T>(_ value: T) throws where T: Encodable {\n        try checkCanEncode(value: value)\n        defer { canEncodeNewValue = false }\n\n        let encoder = _URLEncodedFormEncoder(context: context,\n                                             codingPath: codingPath,\n                                             boolEncoding: boolEncoding,\n                                             dataEncoding: dataEncoding,\n                                             dateEncoding: dateEncoding)\n        try value.encode(to: encoder)\n    }\n}\n\nextension _URLEncodedFormEncoder {\n    final class UnkeyedContainer {\n        var codingPath: [CodingKey]\n\n        var count = 0\n        var nestedCodingPath: [CodingKey] {\n            codingPath + [AnyCodingKey(intValue: count)!]\n        }\n\n        private let context: URLEncodedFormContext\n        private let boolEncoding: URLEncodedFormEncoder.BoolEncoding\n        private let dataEncoding: URLEncodedFormEncoder.DataEncoding\n        private let dateEncoding: URLEncodedFormEncoder.DateEncoding\n\n        init(context: URLEncodedFormContext,\n             codingPath: [CodingKey],\n             boolEncoding: URLEncodedFormEncoder.BoolEncoding,\n             dataEncoding: URLEncodedFormEncoder.DataEncoding,\n             dateEncoding: URLEncodedFormEncoder.DateEncoding) {\n            self.context = context\n            self.codingPath = codingPath\n            self.boolEncoding = boolEncoding\n            self.dataEncoding = dataEncoding\n            self.dateEncoding = dateEncoding\n        }\n    }\n}\n\nextension _URLEncodedFormEncoder.UnkeyedContainer: UnkeyedEncodingContainer {\n    func encodeNil() throws {\n        let context = EncodingError.Context(codingPath: codingPath,\n                                            debugDescription: \"URLEncodedFormEncoder cannot encode nil values.\")\n        throw EncodingError.invalidValue(\"nil\", context)\n    }\n\n    func encode<T>(_ value: T) throws where T: Encodable {\n        var container = nestedSingleValueContainer()\n        try container.encode(value)\n    }\n\n    func nestedSingleValueContainer() -> SingleValueEncodingContainer {\n        defer { count += 1 }\n\n        return _URLEncodedFormEncoder.SingleValueContainer(context: context,\n                                                           codingPath: nestedCodingPath,\n                                                           boolEncoding: boolEncoding,\n                                                           dataEncoding: dataEncoding,\n                                                           dateEncoding: dateEncoding)\n    }\n\n    func nestedContainer<NestedKey>(keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer<NestedKey> where NestedKey: CodingKey {\n        defer { count += 1 }\n        let container = _URLEncodedFormEncoder.KeyedContainer<NestedKey>(context: context,\n                                                                         codingPath: nestedCodingPath,\n                                                                         boolEncoding: boolEncoding,\n                                                                         dataEncoding: dataEncoding,\n                                                                         dateEncoding: dateEncoding)\n\n        return KeyedEncodingContainer(container)\n    }\n\n    func nestedUnkeyedContainer() -> UnkeyedEncodingContainer {\n        defer { count += 1 }\n\n        return _URLEncodedFormEncoder.UnkeyedContainer(context: context,\n                                                       codingPath: nestedCodingPath,\n                                                       boolEncoding: boolEncoding,\n                                                       dataEncoding: dataEncoding,\n                                                       dateEncoding: dateEncoding)\n    }\n\n    func superEncoder() -> Encoder {\n        defer { count += 1 }\n\n        return _URLEncodedFormEncoder(context: context,\n                                      codingPath: codingPath,\n                                      boolEncoding: boolEncoding,\n                                      dataEncoding: dataEncoding,\n                                      dateEncoding: dateEncoding)\n    }\n}\n\nfinal class URLEncodedFormSerializer {\n    private let alphabetizeKeyValuePairs: Bool\n    private let arrayEncoding: URLEncodedFormEncoder.ArrayEncoding\n    private let keyEncoding: URLEncodedFormEncoder.KeyEncoding\n    private let spaceEncoding: URLEncodedFormEncoder.SpaceEncoding\n    private let allowedCharacters: CharacterSet\n\n    init(alphabetizeKeyValuePairs: Bool,\n         arrayEncoding: URLEncodedFormEncoder.ArrayEncoding,\n         keyEncoding: URLEncodedFormEncoder.KeyEncoding,\n         spaceEncoding: URLEncodedFormEncoder.SpaceEncoding,\n         allowedCharacters: CharacterSet) {\n        self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs\n        self.arrayEncoding = arrayEncoding\n        self.keyEncoding = keyEncoding\n        self.spaceEncoding = spaceEncoding\n        self.allowedCharacters = allowedCharacters\n    }\n\n    func serialize(_ object: URLEncodedFormComponent.Object) -> String {\n        var output: [String] = []\n        for (key, component) in object {\n            let value = serialize(component, forKey: key)\n            output.append(value)\n        }\n        output = alphabetizeKeyValuePairs ? output.sorted() : output\n\n        return output.joinedWithAmpersands()\n    }\n\n    func serialize(_ component: URLEncodedFormComponent, forKey key: String) -> String {\n        switch component {\n        case let .string(string): return \"\\(escape(keyEncoding.encode(key)))=\\(escape(string))\"\n        case let .array(array): return serialize(array, forKey: key)\n        case let .object(object): return serialize(object, forKey: key)\n        }\n    }\n\n    func serialize(_ object: URLEncodedFormComponent.Object, forKey key: String) -> String {\n        var segments: [String] = object.map { subKey, value in\n            let keyPath = \"[\\(subKey)]\"\n            return serialize(value, forKey: key + keyPath)\n        }\n        segments = alphabetizeKeyValuePairs ? segments.sorted() : segments\n\n        return segments.joinedWithAmpersands()\n    }\n\n    func serialize(_ array: [URLEncodedFormComponent], forKey key: String) -> String {\n        var segments: [String] = array.map { component in\n            let keyPath = arrayEncoding.encode(key)\n            return serialize(component, forKey: keyPath)\n        }\n        segments = alphabetizeKeyValuePairs ? segments.sorted() : segments\n\n        return segments.joinedWithAmpersands()\n    }\n\n    func escape(_ query: String) -> String {\n        var allowedCharactersWithSpace = allowedCharacters\n        allowedCharactersWithSpace.insert(charactersIn: \" \")\n        let escapedQuery = query.addingPercentEncoding(withAllowedCharacters: allowedCharactersWithSpace) ?? query\n        let spaceEncodedQuery = spaceEncoding.encode(escapedQuery)\n\n        return spaceEncodedQuery\n    }\n}\n\nextension Array where Element == String {\n    func joinedWithAmpersands() -> String {\n        joined(separator: \"&\")\n    }\n}\n\nextension CharacterSet {\n    /// Creates a CharacterSet from RFC 3986 allowed characters.\n    ///\n    /// RFC 3986 states that the following characters are \"reserved\" characters.\n    ///\n    /// - General Delimiters: \":\", \"#\", \"[\", \"]\", \"@\", \"?\", \"/\"\n    /// - Sub-Delimiters: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n    ///\n    /// In RFC 3986 - Section 3.4, it states that the \"?\" and \"/\" characters should not be escaped to allow\n    /// query strings to include a URL. Therefore, all \"reserved\" characters with the exception of \"?\" and \"/\"\n    /// should be percent-escaped in the query string.\n    public static let afURLQueryAllowed: CharacterSet = {\n        let generalDelimitersToEncode = \":#[]@\" // does not include \"?\" or \"/\" due to RFC 3986 - Section 3.4\n        let subDelimitersToEncode = \"!$&'()*+,;=\"\n        let encodableDelimiters = CharacterSet(charactersIn: \"\\(generalDelimitersToEncode)\\(subDelimitersToEncode)\")\n\n        return CharacterSet.urlQueryAllowed.subtracting(encodableDelimiters)\n    }()\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/URLRequest+Alamofire.swift",
    "content": "//\n//  URLRequest+Alamofire.swift\n//\n//  Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension URLRequest {\n    /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type.\n    public var method: HTTPMethod? {\n        get { httpMethod.flatMap(HTTPMethod.init) }\n        set { httpMethod = newValue?.rawValue }\n    }\n\n    public func validate() throws {\n        if method == .get, let bodyData = httpBody {\n            throw AFError.urlRequestValidationFailed(reason: .bodyDataInGETRequest(bodyData))\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift",
    "content": "//\n//  URLSessionConfiguration+Alamofire.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension URLSessionConfiguration: AlamofireExtended {}\nextension AlamofireExtension where ExtendedType: URLSessionConfiguration {\n    /// Alamofire's default configuration. Same as `URLSessionConfiguration.default` but adds Alamofire default\n    /// `Accept-Language`, `Accept-Encoding`, and `User-Agent` headers.\n    public static var `default`: URLSessionConfiguration {\n        let configuration = URLSessionConfiguration.default\n        configuration.headers = .default\n\n        return configuration\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Validation.swift",
    "content": "//\n//  Validation.swift\n//\n//  Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension Request {\n    // MARK: Helper Types\n\n    fileprivate typealias ErrorReason = AFError.ResponseValidationFailureReason\n\n    /// Used to represent whether a validation succeeded or failed.\n    public typealias ValidationResult = Result<Void, Error>\n\n    fileprivate struct MIMEType {\n        let type: String\n        let subtype: String\n\n        var isWildcard: Bool { type == \"*\" && subtype == \"*\" }\n\n        init?(_ string: String) {\n            let components: [String] = {\n                let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines)\n                let split = stripped[..<(stripped.range(of: \";\")?.lowerBound ?? stripped.endIndex)]\n\n                return split.components(separatedBy: \"/\")\n            }()\n\n            if let type = components.first, let subtype = components.last {\n                self.type = type\n                self.subtype = subtype\n            } else {\n                return nil\n            }\n        }\n\n        func matches(_ mime: MIMEType) -> Bool {\n            switch (type, subtype) {\n            case (mime.type, mime.subtype), (mime.type, \"*\"), (\"*\", mime.subtype), (\"*\", \"*\"):\n                return true\n            default:\n                return false\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    fileprivate var acceptableStatusCodes: Range<Int> { 200..<300 }\n\n    fileprivate var acceptableContentTypes: [String] {\n        if let accept = request?.value(forHTTPHeaderField: \"Accept\") {\n            return accept.components(separatedBy: \",\")\n        }\n\n        return [\"*/*\"]\n    }\n\n    // MARK: Status Code\n\n    fileprivate func validate<S: Sequence>(statusCode acceptableStatusCodes: S,\n                                           response: HTTPURLResponse)\n        -> ValidationResult\n        where S.Iterator.Element == Int {\n        if acceptableStatusCodes.contains(response.statusCode) {\n            return .success(())\n        } else {\n            let reason: ErrorReason = .unacceptableStatusCode(code: response.statusCode)\n            return .failure(AFError.responseValidationFailed(reason: reason))\n        }\n    }\n\n    // MARK: Content Type\n\n    fileprivate func validate<S: Sequence>(contentType acceptableContentTypes: S,\n                                           response: HTTPURLResponse,\n                                           data: Data?)\n        -> ValidationResult\n        where S.Iterator.Element == String {\n        guard let data = data, !data.isEmpty else { return .success(()) }\n\n        return validate(contentType: acceptableContentTypes, response: response)\n    }\n\n    fileprivate func validate<S: Sequence>(contentType acceptableContentTypes: S,\n                                           response: HTTPURLResponse)\n        -> ValidationResult\n        where S.Iterator.Element == String {\n        guard\n            let responseContentType = response.mimeType,\n            let responseMIMEType = MIMEType(responseContentType)\n        else {\n            for contentType in acceptableContentTypes {\n                if let mimeType = MIMEType(contentType), mimeType.isWildcard {\n                    return .success(())\n                }\n            }\n\n            let error: AFError = {\n                let reason: ErrorReason = .missingContentType(acceptableContentTypes: Array(acceptableContentTypes))\n                return AFError.responseValidationFailed(reason: reason)\n            }()\n\n            return .failure(error)\n        }\n\n        for contentType in acceptableContentTypes {\n            if let acceptableMIMEType = MIMEType(contentType), acceptableMIMEType.matches(responseMIMEType) {\n                return .success(())\n            }\n        }\n\n        let error: AFError = {\n            let reason: ErrorReason = .unacceptableContentType(acceptableContentTypes: Array(acceptableContentTypes),\n                                                               responseContentType: responseContentType)\n\n            return AFError.responseValidationFailed(reason: reason)\n        }()\n\n        return .failure(error)\n    }\n}\n\n// MARK: -\n\nextension DataRequest {\n    /// A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the\n    /// request was valid.\n    public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult\n\n    /// Validates that the response has a status code in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Parameter statusCode: `Sequence` of acceptable response status codes.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {\n        validate { [unowned self] _, response, _ in\n            self.validate(statusCode: acceptableStatusCodes, response: response)\n        }\n    }\n\n    /// Validates that the response has a content type in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {\n        validate { [unowned self] _, response, data in\n            self.validate(contentType: acceptableContentTypes(), response: response, data: data)\n        }\n    }\n\n    /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content\n    /// type matches any specified in the Accept HTTP header field.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate() -> Self {\n        let contentTypes: () -> [String] = { [unowned self] in\n            self.acceptableContentTypes\n        }\n        return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())\n    }\n}\n\nextension DataStreamRequest {\n    /// A closure used to validate a request that takes a `URLRequest` and `HTTPURLResponse` and returns whether the\n    /// request was valid.\n    public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult\n\n    /// Validates that the response has a status code in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Parameter statusCode: `Sequence` of acceptable response status codes.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {\n        validate { [unowned self] _, response in\n            self.validate(statusCode: acceptableStatusCodes, response: response)\n        }\n    }\n\n    /// Validates that the response has a content type in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {\n        validate { [unowned self] _, response in\n            self.validate(contentType: acceptableContentTypes(), response: response)\n        }\n    }\n\n    /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content\n    /// type matches any specified in the Accept HTTP header field.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Returns: The instance.\n    @discardableResult\n    public func validate() -> Self {\n        let contentTypes: () -> [String] = { [unowned self] in\n            self.acceptableContentTypes\n        }\n        return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())\n    }\n}\n\n// MARK: -\n\nextension DownloadRequest {\n    /// A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a\n    /// destination URL, and returns whether the request was valid.\n    public typealias Validation = (_ request: URLRequest?,\n                                   _ response: HTTPURLResponse,\n                                   _ fileURL: URL?)\n        -> ValidationResult\n\n    /// Validates that the response has a status code in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - Parameter statusCode: `Sequence` of acceptable response status codes.\n    ///\n    /// - Returns:              The instance.\n    @discardableResult\n    public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {\n        validate { [unowned self] _, response, _ in\n            self.validate(statusCode: acceptableStatusCodes, response: response)\n        }\n    }\n\n    /// Validates that the response has a content type in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String {\n        validate { [unowned self] _, response, fileURL in\n            guard let validFileURL = fileURL else {\n                return .failure(AFError.responseValidationFailed(reason: .dataFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: validFileURL)\n                return self.validate(contentType: acceptableContentTypes(), response: response, data: data)\n            } catch {\n                return .failure(AFError.responseValidationFailed(reason: .dataFileReadFailed(at: validFileURL)))\n            }\n        }\n    }\n\n    /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content\n    /// type matches any specified in the Accept HTTP header field.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate() -> Self {\n        let contentTypes = { [unowned self] in\n            self.acceptableContentTypes\n        }\n        return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes())\n    }\n}\n"
  },
  {
    "path": "Pods/BRLOptionParser/BRLOptionParser/BRLOptionParser.h",
    "content": "// BRLOptionParser.h\n//\n// Copyright © 2013–2015 Stephen Celis (<stephen@stephencelis.com>)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n@import Foundation;\n\n\ntypedef void (^BRLOptionParserOptionBlock)();\ntypedef void (^BRLOptionParserOptionBlockWithArgument)(NSString *value);\n\n\nstatic NSString *const BRLOptionParserErrorDomain = @\"BRLOptionParserErrorDomain\";\n\n\ntypedef NS_ENUM(NSUInteger, BRLOptionParserErrorCode) {\n    BRLOptionParserErrorCodeUnrecognized = 1,\n    BRLOptionParserErrorCodeRequired\n};\n\n\n@interface BRLOptionParser : NSObject\n\n+ (instancetype)parser;\n+ (instancetype)longOnlyParser;\n\n@property (nonatomic, getter = isLongOnly) BOOL longOnly;\n\n@property (nonatomic, copy) NSString *banner;\n\n- (void)setBanner:(NSString *)banner, ...;\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description block:(BRLOptionParserOptionBlock)block;\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description blockWithArgument:(BRLOptionParserOptionBlockWithArgument)blockWithArgument;\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description value:(BOOL *)value;\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description argument:(NSString *__strong *)argument;\n\n- (void)addSeparator;\n- (void)addSeparator:(NSString *)separator;\n\n- (BOOL)parseArgc:(int)argc argv:(const char **)argv error:(NSError **)error;\n\n@end\n"
  },
  {
    "path": "Pods/BRLOptionParser/BRLOptionParser/BRLOptionParser.m",
    "content": "// BRLOptionParser.m\n//\n// Copyright © 2013–2015 Stephen Celis (<stephen@stephencelis.com>)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n#import \"BRLOptionParser.h\"\n#import <getopt.h>\n\n\ntypedef NS_ENUM(NSUInteger, BRLOptionArgument) {\n    BRLOptionArgumentNone = no_argument,\n    BRLOptionArgumentRequired = required_argument\n};\n\n\n@interface BRLOption : NSObject\n\n@property (assign) BRLOptionArgument argument;\n@property (assign) char * name;\n@property (assign) unichar flag;\n@property (strong) NSString *description;\n@property (copy) id block;\n\n+ (instancetype)optionWithName:(char *)name flag:(unichar)flag description:(NSString *)description block:(BRLOptionParserOptionBlock)block;\n+ (instancetype)optionWithName:(char *)name flag:(unichar)flag description:(NSString *)description blockWithArgument:(BRLOptionParserOptionBlockWithArgument)blockWithArgument;\n\n@end\n\n\n@implementation BRLOption\n\n@synthesize description = _description;\n\n+ (instancetype)optionWithName:(char *)name flag:(unichar)flag description:(NSString *)description block:(BRLOptionParserOptionBlock)block\n{\n    BRLOption *option = [[self alloc] initWithName:name flag:flag description:description argument:BRLOptionArgumentNone block:block];\n    return option;\n}\n\n+ (instancetype)optionWithName:(char *)name flag:(unichar)flag description:(NSString *)description blockWithArgument:(BRLOptionParserOptionBlockWithArgument)blockWithArgument\n{\n    BRLOption *option = [[self alloc] initWithName:name flag:flag description:description argument:BRLOptionArgumentRequired block:blockWithArgument];\n    return option;\n}\n\n- (instancetype)initWithName:(char *)name flag:(unichar)flag description:(NSString *)description argument:(BRLOptionArgument)argument block:(id)block\n{\n    if (self = [super init]) {\n        _argument = argument;\n        _name = name;\n        _flag = flag;\n        _block = block;\n        _description = description;\n    }\n    return self;\n}\n\n@end\n\n\n@interface BRLOptionParser ()\n\n@property NSMutableArray *options;\n\n@end\n\n\n@implementation BRLOptionParser\n\n+ (instancetype)parser\n{\n    return [self new];\n}\n\n+ (instancetype)longOnlyParser\n{\n    BRLOptionParser *parser = [self parser];\n    if (parser) {\n        parser.longOnly = YES;\n    }\n    return parser;\n}\n\n- (id)init\n{\n    if (self = [super init]) {\n        [self setBanner:@\"usage: %@ [options]\", [NSProcessInfo processInfo].processName];\n        _options = [NSMutableArray new];\n    }\n    return self;\n}\n\n- (void)setBanner:(NSString *)banner, ...\n{\n    va_list args;\n    va_start(args, banner);\n    _banner = [[NSString alloc] initWithFormat:banner arguments:args];\n    va_end(args);\n    return;\n}\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description block:(BRLOptionParserOptionBlock)block\n{\n    [self.options addObject:[BRLOption optionWithName:option flag:flag description:description block:block]];\n}\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description blockWithArgument:(BRLOptionParserOptionBlockWithArgument)blockWithArgument\n{\n    [self.options addObject:[BRLOption optionWithName:option flag:flag description:description blockWithArgument:blockWithArgument]];\n}\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description value:(BOOL *)value\n{\n    [self addOption:option flag:flag description:description block:^{\n        *value = YES;\n    }];\n}\n\n- (void)addOption:(char *)option flag:(unichar)flag description:(NSString *)description argument:(NSString *__strong *)argument\n{\n    [self addOption:option flag:flag description:description blockWithArgument:^(NSString *value) {\n        *argument = value;\n    }];\n}\n\n- (void)addSeparator\n{\n    [self addSeparator:nil];\n}\n\n- (void)addSeparator:(NSString *)separator\n{\n    if (separator == nil) {\n        separator = @\"\";\n    }\n    [self.options addObject:separator];\n}\n\n- (BOOL)parseArgc:(int)argc argv:(const char **)argv error:(NSError *__autoreleasing *)error\n{\n    NSMapTable *mapTable = NSCreateMapTable(NSIntegerMapKeyCallBacks, NSNonRetainedObjectMapValueCallBacks, self.options.count);\n\n    NSUInteger i = 0;\n    NSUInteger c = 0;\n\n    struct option * long_options = malloc((self.options.count + 1) * sizeof(struct option));\n    char * short_options = malloc(((self.options.count * 2) + 1) * sizeof(char));\n\n    for (id each in self.options) {\n        if (![each isKindOfClass:[BRLOption class]]) {\n            continue;\n        }\n        BRLOption *option = each;\n        if (option.name) {\n            NSMapInsert(mapTable, (const void *)option.name, (__bridge void *)option);\n            long_options[i++] = (struct option){option.name, option.argument, NULL, option.flag};\n        }\n        if (option.flag) {\n            NSMapInsert(mapTable, (const void *)(NSUInteger)option.flag, (__bridge void *)option);\n            short_options[c++] = option.flag;\n            if (option.argument == BRLOptionArgumentRequired) {\n                short_options[c++] = ':';\n            };\n        }\n    }\n    long_options[i] = (struct option){0, 0, 0, 0};\n    short_options[c] = '\\0';\n\n    int ch = 0;\n    int long_options_index = 0;\n\n    opterr = 0;\n\n    int (* getopt_long_method)(int, char * const *, const char *, const struct option *, int *);\n    getopt_long_method = self.isLongOnly ? &getopt_long_only : &getopt_long;\n\n    int cached_optind = optind;\n    while ((ch = getopt_long_method(argc, (char **)argv, short_options, long_options, &long_options_index)) != -1) {\n        @try {\n            BRLOption *option = nil;\n\n            switch (ch) {\n                case '?': {\n                    if (error) {\n                        // I wish this could be done more cleanly, but getopt doesn't appear to expose the current failing option as originally input.\n                        NSString *arg = [NSString stringWithUTF8String:argv[cached_optind]];\n                        if ([arg hasPrefix:[self longPrefix]]) {\n                            arg = [arg componentsSeparatedByString:@\"=\"].firstObject;\n                        } else if (optopt) {\n                            arg = [NSString stringWithFormat:@\"-%c\", optopt];\n                        }\n\n                        if (optopt) {\n                            option = (__bridge BRLOption *)NSMapGet(mapTable, (const void *)(NSUInteger)optopt);\n                        } else {\n                            NSString *longOption = [NSString stringWithFormat:@\"%@%s\", [self longPrefix], long_options[long_options_index].name];\n                            if ([arg isEqualToString:longOption]) {\n                                option = (__bridge BRLOption *)NSMapGet(mapTable, (const void *)long_options[long_options_index].name);\n                            }\n                        }\n\n                        if (option && option.argument == BRLOptionArgumentRequired) {\n                            *error = [NSError errorWithDomain:BRLOptionParserErrorDomain code:BRLOptionParserErrorCodeRequired userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@\"option `%@' requires an argument\", arg]}];\n                        } else {\n                            *error = [NSError errorWithDomain:BRLOptionParserErrorDomain code:BRLOptionParserErrorCodeUnrecognized userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@\"unrecognized option `%@'\", arg]}];\n                        }\n                    }\n                    return NO;\n                    break;\n                }\n                case ':':\n\n                    break;\n                case 0:\n                    option = (__bridge BRLOption *)NSMapGet(mapTable, (const void *)long_options[long_options_index].name);\n                    break;\n                default: {\n                    option = (__bridge BRLOption *)NSMapGet(mapTable, (const void *)(NSUInteger)ch);\n                    break;\n                }\n            }\n\n            if (option.argument == BRLOptionArgumentRequired) {\n                BRLOptionParserOptionBlockWithArgument block = option.block;\n                block([NSString stringWithUTF8String:optarg]);\n            } else {\n                BRLOptionParserOptionBlock block = option.block;\n                block();\n            }\n        } @finally {\n            cached_optind = optind;\n        }\n    }\n\n    return YES;\n}\n\n- (NSString *)description\n{\n    NSMutableString *(^trimLine)(NSMutableString *) = ^NSMutableString *(NSMutableString *line) {\n        NSRange range = [line rangeOfCharacterFromSet:[[NSCharacterSet whitespaceCharacterSet] invertedSet] options:NSBackwardsSearch];\n        if (range.location != NSNotFound) {\n            line = [[line substringToIndex:range.location + 1] mutableCopy];\n        }\n        return line;\n    };\n\n    NSMutableArray *description = [NSMutableArray arrayWithObject:self.banner];\n    for (id each in self.options) {\n        NSMutableString *line = [NSMutableString new];\n        if ([each isKindOfClass:[BRLOption class]]) {\n            BRLOption *option = each;\n            [line appendString:@\"    \"];\n            if (option.flag) {\n                [line appendFormat:@\"-%c\", option.flag];\n                [line appendString:option.name ? @\", \" : @\"  \"];\n            } else {\n                [line appendString:@\"    \"];\n            }\n            if (option.name) {\n                [line appendFormat:@\"%@%-24s   \", [self longPrefix], option.name];\n            } else {\n                [line appendString:@\"                             \"];\n            }\n            if (line.length > 37) {\n                line = trimLine(line);\n                [line appendString:@\"\\n                                     \"];\n            }\n            if (option.description) {\n                [line appendString:option.description];\n            }\n            line = trimLine(line);\n        } else {\n            [line appendFormat:@\"%@\", each];\n        }\n        [description addObject:line];\n    }\n    return [[description componentsJoinedByString:@\"\\n\"] stringByAppendingString:@\"\\n\"];\n}\n\n#pragma mark -\n\n- (NSString *)longPrefix\n{\n    return self.isLongOnly ? @\"-\" : @\"--\";\n}\n\n@end\n"
  },
  {
    "path": "Pods/BRLOptionParser/LICENSE",
    "content": "(The MIT License)\n\nCopyright © 2013-2015 Stephen Celis (<stephen@stephencelis.com>)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Pods/BRLOptionParser/README.markdown",
    "content": "# BRLOptionParser [![Build Status][1]][2]\n\nA short wrapper for [getopt_long(3)][3] (and getopt_long_only(3)).\n\n[1]: https://img.shields.io/travis/stephencelis/BRLOptionParser.svg?style=flat\n[2]: https://travis-ci.org/stephencelis/BRLOptionParser\n[3]: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/getopt_long.3.html\n\n## Install\n\nWith [CocoaPods][4]:\n\n``` rb\n# Podfile\npod 'BRLOptionParser', '~> 0.3.1'\n```\n\n[4]: http://cocoapods.org\n\n## Example\n\n``` objc\n// main.m\n#import <BRLOptionParser/BRLOptionParser.h>\n\nint main(int argc, const char * argv[])\n{\n    @autoreleasepool {\n        NSString *name = @\"world\";\n        BOOL verbose = NO;\n\n        BRLOptionParser *options = [BRLOptionParser new];\n\n        [options setBanner:@\"usage: %s [-n <name>] [-vh]\", argv[0]];\n        [options addOption:\"name\" flag:'n' description:@\"Your name\" argument:&name];\n        [options addSeparator];\n        [options addOption:\"verbose\" flag:'v' description:nil value:&verbose];\n        __weak typeof(options) weakOptions = options;\n        [options addOption:\"help\" flag:'h' description:@\"Show this message\" block:^{\n            printf(\"%s\", [[weakOptions description] UTF8String]);\n            exit(EXIT_SUCCESS);\n        }];\n\n        NSError *error = nil;\n        if (![options parseArgc:argc argv:argv error:&error]) {\n            const char * message = error.localizedDescription.UTF8String;\n            fprintf(stderr, \"%s: %s\\n\", argv[0], message);\n            exit(EXIT_FAILURE);\n        }\n\n        if (verbose) {\n            fprintf(stderr, \"(Preparing to say hello...)\\n\");\n        }\n\n        printf(\"Hello, %s!\\n\", name.UTF8String);\n    }\n\n    return EXIT_SUCCESS;\n}\n```\n\nIn practice:\n\n```\n$ hello\nHello, world!\n$ hello -h\nusage: hello [-n <name>] [-vh]\n    -n, --name                       Your name\n\n    -v, --verbose\n    -h, --help                       Show this message\n$ hello -n\nhello: option `-n' requires an argument\n$ hello --name Stephen\nHello, Stephen!\n$ hello -vngoodbye\n(Preparing to say hello...)\nHello, goodbye!\n$ hello --goodbye\nhello: unrecognized option `--goodbye'\n```\n\n## License\n\nBRLOptionParser is available under the MIT license. See the LICENSE file\nfor more information.\n\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <TargetConditionals.h>\n\n#import \"GCDWebServerRequest.h\"\n#import \"GCDWebServerResponse.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerMatchBlock is called for every handler added to the\n *  GCDWebServer whenever a new HTTP request has started (i.e. HTTP headers have\n *  been received). The block is passed the basic info for the request (HTTP method,\n *  URL, headers...) and must decide if it wants to handle it or not.\n *\n *  If the handler can handle the request, the block must return a new\n *  GCDWebServerRequest instance created with the same basic info.\n *  Otherwise, it simply returns nil.\n */\ntypedef GCDWebServerRequest* _Nullable (^GCDWebServerMatchBlock)(NSString* requestMethod, NSURL* requestURL, NSDictionary<NSString*, NSString*>* requestHeaders, NSString* urlPath, NSDictionary<NSString*, NSString*>* urlQuery);\n\n/**\n *  The GCDWebServerProcessBlock is called after the HTTP request has been fully\n *  received (i.e. the entire HTTP body has been read). The block is passed the\n *  GCDWebServerRequest created at the previous step by the GCDWebServerMatchBlock.\n *\n *  The block must return a GCDWebServerResponse or nil on error, which will\n *  result in a 500 HTTP status code returned to the client. It's however\n *  recommended to return a GCDWebServerErrorResponse on error so more useful\n *  information can be returned to the client.\n */\ntypedef GCDWebServerResponse* _Nullable (^GCDWebServerProcessBlock)(__kindof GCDWebServerRequest* request);\n\n/**\n *  The GCDWebServerAsynchronousProcessBlock works like the GCDWebServerProcessBlock\n *  except the GCDWebServerResponse can be returned to the server at a later time\n *  allowing for asynchronous generation of the response.\n *\n *  The block must eventually call \"completionBlock\" passing a GCDWebServerResponse\n *  or nil on error, which will result in a 500 HTTP status code returned to the client.\n *  It's however recommended to return a GCDWebServerErrorResponse on error so more\n *  useful information can be returned to the client.\n */\ntypedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* _Nullable response);\ntypedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock);\n\n/**\n *  The GCDWebServerBuiltInLoggerBlock is used to override the built-in logger at runtime.\n *  The block will be passed the log level and the log message, see setLogLevel for\n *  documentation of the log levels for the built-in logger.\n */\ntypedef void (^GCDWebServerBuiltInLoggerBlock)(int level, NSString* _Nonnull message);\n\n/**\n *  The port used by the GCDWebServer (NSNumber / NSUInteger).\n *\n *  The default value is 0 i.e. let the OS pick a random port.\n */\nextern NSString* const GCDWebServerOption_Port;\n\n/**\n *  The Bonjour name used by the GCDWebServer (NSString). If set to an empty string,\n *  the name will automatically take the value of the GCDWebServerOption_ServerName\n *  option. If this option is set to nil, Bonjour will be disabled.\n *\n *  The default value is nil.\n */\nextern NSString* const GCDWebServerOption_BonjourName;\n\n/**\n *  The Bonjour service type used by the GCDWebServer (NSString).\n *\n *  The default value is \"_http._tcp\", the service type for HTTP web servers.\n */\nextern NSString* const GCDWebServerOption_BonjourType;\n\n/**\n *  Request a port mapping in the NAT gateway (NSNumber / BOOL).\n *\n *  This uses the DNSService API under the hood which supports IPv4 mappings only.\n *\n *  The default value is NO.\n *\n *  @warning The external port set up by the NAT gateway may be different than\n *  the one used by the GCDWebServer.\n */\nextern NSString* const GCDWebServerOption_RequestNATPortMapping;\n\n/**\n *  Only accept HTTP requests coming from localhost i.e. not from the outside\n *  network (NSNumber / BOOL).\n *\n *  The default value is NO.\n *\n *  @warning Bonjour and NAT port mapping should be disabled if using this option\n *  since the server will not be reachable from the outside network anyway.\n */\nextern NSString* const GCDWebServerOption_BindToLocalhost;\n\n/**\n *  The maximum number of incoming HTTP requests that can be queued waiting to\n *  be handled before new ones are dropped (NSNumber / NSUInteger).\n *\n *  The default value is 16.\n */\nextern NSString* const GCDWebServerOption_MaxPendingConnections;\n\n/**\n *  The value for \"Server\" HTTP header used by the GCDWebServer (NSString).\n *\n *  The default value is the GCDWebServer class name.\n */\nextern NSString* const GCDWebServerOption_ServerName;\n\n/**\n *  The authentication method used by the GCDWebServer\n *  (one of \"GCDWebServerAuthenticationMethod_...\").\n *\n *  The default value is nil i.e. authentication is disabled.\n */\nextern NSString* const GCDWebServerOption_AuthenticationMethod;\n\n/**\n *  The authentication realm used by the GCDWebServer (NSString).\n *\n *  The default value is the same as the GCDWebServerOption_ServerName option.\n */\nextern NSString* const GCDWebServerOption_AuthenticationRealm;\n\n/**\n *  The authentication accounts used by the GCDWebServer\n *  (NSDictionary of username / password pairs).\n *\n *  The default value is nil i.e. no accounts.\n */\nextern NSString* const GCDWebServerOption_AuthenticationAccounts;\n\n/**\n *  The class used by the GCDWebServer when instantiating GCDWebServerConnection\n *  (subclass of GCDWebServerConnection).\n *\n *  The default value is the GCDWebServerConnection class.\n */\nextern NSString* const GCDWebServerOption_ConnectionClass;\n\n/**\n *  Allow the GCDWebServer to pretend \"HEAD\" requests are actually \"GET\" ones\n *  and automatically discard the HTTP body of the response (NSNumber / BOOL).\n *\n *  The default value is YES.\n */\nextern NSString* const GCDWebServerOption_AutomaticallyMapHEADToGET;\n\n/**\n *  The interval expressed in seconds used by the GCDWebServer to decide how to\n *  coalesce calls to -webServerDidConnect: and -webServerDidDisconnect:\n *  (NSNumber / double). Coalescing will be disabled if the interval is <= 0.0.\n *\n *  The default value is 1.0 second.\n */\nextern NSString* const GCDWebServerOption_ConnectedStateCoalescingInterval;\n\n/**\n *  Set the dispatch queue priority on which server connection will be \n *  run (NSNumber / long).\n *\n *\n *  The default value is DISPATCH_QUEUE_PRIORITY_DEFAULT.\n */\nextern NSString* const GCDWebServerOption_DispatchQueuePriority;\n\n#if TARGET_OS_IPHONE\n\n/**\n *  Enables the GCDWebServer to automatically suspend itself (as if -stop was\n *  called) when the iOS app goes into the background and the last\n *  GCDWebServerConnection is closed, then resume itself (as if -start was called)\n *  when the iOS app comes back to the foreground (NSNumber / BOOL).\n *\n *  See the README.md file for more information about this option.\n *\n *  The default value is YES.\n *\n *  @warning The running property will be NO while the GCDWebServer is suspended.\n */\nextern NSString* const GCDWebServerOption_AutomaticallySuspendInBackground;\n\n#endif\n\n/**\n *  HTTP Basic Authentication scheme (see https://tools.ietf.org/html/rfc2617).\n *\n *  @warning Use of this authentication scheme is not recommended as the\n *  passwords are sent in clear.\n */\nextern NSString* const GCDWebServerAuthenticationMethod_Basic;\n\n/**\n *  HTTP Digest Access Authentication scheme (see https://tools.ietf.org/html/rfc2617).\n */\nextern NSString* const GCDWebServerAuthenticationMethod_DigestAccess;\n\n@class GCDWebServer;\n\n/**\n *  Delegate methods for GCDWebServer.\n *\n *  @warning These methods are always called on the main thread in a serialized way.\n */\n@protocol GCDWebServerDelegate <NSObject>\n@optional\n\n/**\n *  This method is called after the server has successfully started.\n */\n- (void)webServerDidStart:(GCDWebServer*)server;\n\n/**\n *  This method is called after the Bonjour registration for the server has\n *  successfully completed.\n *\n *  Use the \"bonjourServerURL\" property to retrieve the Bonjour address of the\n *  server.\n */\n- (void)webServerDidCompleteBonjourRegistration:(GCDWebServer*)server;\n\n/**\n *  This method is called after the NAT port mapping for the server has been\n *  updated.\n *\n *  Use the \"publicServerURL\" property to retrieve the public address of the\n *  server.\n */\n- (void)webServerDidUpdateNATPortMapping:(GCDWebServer*)server;\n\n/**\n *  This method is called when the first GCDWebServerConnection is opened by the\n *  server to serve a series of HTTP requests.\n *\n *  A series of HTTP requests is considered ongoing as long as new HTTP requests\n *  keep coming (and new GCDWebServerConnection instances keep being opened),\n *  until before the last HTTP request has been responded to (and the\n *  corresponding last GCDWebServerConnection closed).\n */\n- (void)webServerDidConnect:(GCDWebServer*)server;\n\n/**\n *  This method is called when the last GCDWebServerConnection is closed after\n *  the server has served a series of HTTP requests.\n *\n *  The GCDWebServerOption_ConnectedStateCoalescingInterval option can be used\n *  to have the server wait some extra delay before considering that the series\n *  of HTTP requests has ended (in case there some latency between consecutive\n *  requests). This effectively coalesces the calls to -webServerDidConnect:\n *  and -webServerDidDisconnect:.\n */\n- (void)webServerDidDisconnect:(GCDWebServer*)server;\n\n/**\n *  This method is called after the server has stopped.\n */\n- (void)webServerDidStop:(GCDWebServer*)server;\n\n@end\n\n/**\n *  The GCDWebServer class listens for incoming HTTP requests on a given port,\n *  then passes each one to a \"handler\" capable of generating an HTTP response\n *  for it, which is then sent back to the client.\n *\n *  GCDWebServer instances can be created and used from any thread but it's\n *  recommended to have the main thread's runloop be running so internal callbacks\n *  can be handled e.g. for Bonjour registration.\n *\n *  See the README.md file for more information about the architecture of GCDWebServer.\n */\n@interface GCDWebServer : NSObject\n\n/**\n *  Sets the delegate for the server.\n */\n@property(nonatomic, weak, nullable) id<GCDWebServerDelegate> delegate;\n\n/**\n *  Returns YES if the server is currently running.\n */\n@property(nonatomic, readonly, getter=isRunning) BOOL running;\n\n/**\n *  Returns the port used by the server.\n *\n *  @warning This property is only valid if the server is running.\n */\n@property(nonatomic, readonly) NSUInteger port;\n\n/**\n *  Returns the Bonjour name used by the server.\n *\n *  @warning This property is only valid if the server is running and Bonjour\n *  registration has successfully completed, which can take up to a few seconds.\n */\n@property(nonatomic, readonly, nullable) NSString* bonjourName;\n\n/**\n *  Returns the Bonjour service type used by the server.\n *\n *  @warning This property is only valid if the server is running and Bonjour\n *  registration has successfully completed, which can take up to a few seconds.\n */\n@property(nonatomic, readonly, nullable) NSString* bonjourType;\n\n/**\n *  This method is the designated initializer for the class.\n */\n- (instancetype)init;\n\n/**\n *  Adds to the server a handler that generates responses synchronously when handling incoming HTTP requests.\n *\n *  Handlers are called in a LIFO queue, so if multiple handlers can potentially\n *  respond to a given request, the latest added one wins.\n *\n *  @warning Addling handlers while the server is running is not allowed.\n */\n- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock;\n\n/**\n *  Adds to the server a handler that generates responses asynchronously when handling incoming HTTP requests.\n *\n *  Handlers are called in a LIFO queue, so if multiple handlers can potentially\n *  respond to a given request, the latest added one wins.\n *\n *  @warning Addling handlers while the server is running is not allowed.\n */\n- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock;\n\n/**\n *  Removes all handlers previously added to the server.\n *\n *  @warning Removing handlers while the server is running is not allowed.\n */\n- (void)removeAllHandlers;\n\n/**\n *  Starts the server with explicit options. This method is the designated way\n *  to start the server.\n *\n *  Returns NO if the server failed to start and sets \"error\" argument if not NULL.\n */\n- (BOOL)startWithOptions:(nullable NSDictionary<NSString*, id>*)options error:(NSError** _Nullable)error;\n\n/**\n *  Stops the server and prevents it to accepts new HTTP requests.\n *\n *  @warning Stopping the server does not abort GCDWebServerConnection instances\n *  currently handling already received HTTP requests. These connections will\n *  continue to execute normally until completion.\n */\n- (void)stop;\n\n@end\n\n@interface GCDWebServer (Extensions)\n\n/**\n *  Returns the server's URL.\n *\n *  @warning This property is only valid if the server is running.\n */\n@property(nonatomic, readonly, nullable) NSURL* serverURL;\n\n/**\n *  Returns the server's Bonjour URL.\n *\n *  @warning This property is only valid if the server is running and Bonjour\n *  registration has successfully completed, which can take up to a few seconds.\n *  Also be aware this property will not automatically update if the Bonjour hostname\n *  has been dynamically changed after the server started running (this should be rare).\n */\n@property(nonatomic, readonly, nullable) NSURL* bonjourServerURL;\n\n/**\n *  Returns the server's public URL.\n *\n *  @warning This property is only valid if the server is running and NAT port\n *  mapping is active.\n */\n@property(nonatomic, readonly, nullable) NSURL* publicServerURL;\n\n/**\n *  Starts the server on port 8080 (OS X & iOS Simulator) or port 80 (iOS)\n *  using the default Bonjour name.\n *\n *  Returns NO if the server failed to start.\n */\n- (BOOL)start;\n\n/**\n *  Starts the server on a given port and with a specific Bonjour name.\n *  Pass a nil Bonjour name to disable Bonjour entirely or an empty string to\n *  use the default name.\n *\n *  Returns NO if the server failed to start.\n */\n- (BOOL)startWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name;\n\n#if !TARGET_OS_IPHONE\n\n/**\n *  Runs the server synchronously using -startWithPort:bonjourName: until a\n *  SIGINT signal is received i.e. Ctrl-C. This method is intended to be used\n *  by command line tools.\n *\n *  Returns NO if the server failed to start.\n *\n *  @warning This method must be used from the main thread only.\n */\n- (BOOL)runWithPort:(NSUInteger)port bonjourName:(nullable NSString*)name;\n\n/**\n *  Runs the server synchronously using -startWithOptions: until a SIGTERM or\n *  SIGINT signal is received i.e. Ctrl-C in Terminal. This method is intended to\n *  be used by command line tools.\n *\n *  Returns NO if the server failed to start and sets \"error\" argument if not NULL.\n *\n *  @warning This method must be used from the main thread only.\n */\n- (BOOL)runWithOptions:(nullable NSDictionary<NSString*, id>*)options error:(NSError** _Nullable)error;\n\n#endif\n\n@end\n\n@interface GCDWebServer (Handlers)\n\n/**\n *  Adds a default handler to the server to handle all incoming HTTP requests\n *  with a given HTTP method and generate responses synchronously.\n */\n- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;\n\n/**\n *  Adds a default handler to the server to handle all incoming HTTP requests\n *  with a given HTTP method and generate responses asynchronously.\n */\n- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;\n\n/**\n *  Adds a handler to the server to handle incoming HTTP requests with a given\n *  HTTP method and a specific case-insensitive path  and generate responses\n *  synchronously.\n */\n- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;\n\n/**\n *  Adds a handler to the server to handle incoming HTTP requests with a given\n *  HTTP method and a specific case-insensitive path and generate responses\n *  asynchronously.\n */\n- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;\n\n/**\n *  Adds a handler to the server to handle incoming HTTP requests with a given\n *  HTTP method and a path matching a case-insensitive regular expression and\n *  generate responses synchronously.\n */\n- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block;\n\n/**\n *  Adds a handler to the server to handle incoming HTTP requests with a given\n *  HTTP method and a path matching a case-insensitive regular expression and\n *  generate responses asynchronously.\n */\n- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block;\n\n@end\n\n@interface GCDWebServer (GETHandlers)\n\n/**\n *  Adds a handler to the server to respond to incoming \"GET\" HTTP requests\n *  with a specific case-insensitive path with in-memory data.\n */\n- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(nullable NSString*)contentType cacheAge:(NSUInteger)cacheAge;\n\n/**\n *  Adds a handler to the server to respond to incoming \"GET\" HTTP requests\n *  with a specific case-insensitive path with a file.\n */\n- (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests;\n\n/**\n *  Adds a handler to the server to respond to incoming \"GET\" HTTP requests\n *  with a case-insensitive path inside a base path with the corresponding file\n *  inside a local directory. If no local file matches the request path, a 401\n *  HTTP status code is returned to the client.\n *\n *  The \"indexFilename\" argument allows to specify an \"index\" file name to use\n *  when the request path corresponds to a directory.\n */\n- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(nullable NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests;\n\n@end\n\n/**\n *  GCDWebServer provides its own built-in logging facility which is used by\n *  default. It simply sends log messages to stderr assuming it is connected\n *  to a terminal type device.\n *\n *  GCDWebServer is also compatible with a limited set of third-party logging\n *  facilities. If one of them is available at compile time, GCDWebServer will\n *  automatically use it in place of the built-in one.\n *\n *  Currently supported third-party logging facilities are:\n *  - XLFacility (by the same author as GCDWebServer): https://github.com/swisspol/XLFacility\n *\n *  For the built-in logging facility, the default logging level is INFO\n *  (or DEBUG if the preprocessor constant \"DEBUG\" evaluates to non-zero at\n *  compile time).\n *\n *  It's possible to have GCDWebServer use a custom logging facility by defining\n *  the \"__GCDWEBSERVER_LOGGING_HEADER__\" preprocessor constant in Xcode build\n *  settings to the name of a custom header file (escaped like \\\"MyLogging.h\\\").\n *  This header file must define the following set of macros:\n *\n *    GWS_LOG_DEBUG(...)\n *    GWS_LOG_VERBOSE(...)\n *    GWS_LOG_INFO(...)\n *    GWS_LOG_WARNING(...)\n *    GWS_LOG_ERROR(...)\n *\n *  IMPORTANT: These macros must behave like NSLog(). Furthermore the GWS_LOG_DEBUG()\n *  macro should not do anything unless the preprocessor constant \"DEBUG\" evaluates\n *  to non-zero.\n *\n *  The logging methods below send log messages to the same logging facility\n *  used by GCDWebServer. They can be used for consistency wherever you interact\n *  with GCDWebServer in your code (e.g. in the implementation of handlers).\n */\n@interface GCDWebServer (Logging)\n\n/**\n *  Sets the log level of the logging facility below which log messages are discarded.\n *\n *  @warning The interpretation of the \"level\" argument depends on the logging\n *  facility used at compile time.\n *\n *  If using the built-in logging facility, the log levels are as follow:\n *  DEBUG = 0\n *  VERBOSE = 1\n *  INFO = 2\n *  WARNING = 3\n *  ERROR = 4\n */\n+ (void)setLogLevel:(int)level;\n\n/**\n *  Set a logger to be used instead of the built-in logger which logs to stderr.\n *\n *  IMPORTANT: In order for this override to work, you should not be specifying\n *  a custom logger at compile time with \"__GCDWEBSERVER_LOGGING_HEADER__\".\n */\n+ (void)setBuiltInLogger:(GCDWebServerBuiltInLoggerBlock)block;\n\n/**\n *  Logs a message to the logging facility at the VERBOSE level.\n */\n- (void)logVerbose:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2);\n\n/**\n *  Logs a message to the logging facility at the INFO level.\n */\n- (void)logInfo:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2);\n\n/**\n *  Logs a message to the logging facility at the WARNING level.\n */\n- (void)logWarning:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2);\n\n/**\n *  Logs a message to the logging facility at the ERROR level.\n */\n- (void)logError:(NSString*)format, ... NS_FORMAT_FUNCTION(1, 2);\n\n@end\n\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n\n@interface GCDWebServer (Testing)\n\n/**\n *  Activates recording of HTTP requests and responses which create files in the\n *  current directory containing the raw data for all requests and responses.\n *\n *  @warning The current directory must not contain any prior recording files.\n */\n@property(nonatomic, getter=isRecordingEnabled) BOOL recordingEnabled;\n\n/**\n *  Runs tests by playing back pre-recorded HTTP requests in the given directory\n *  and comparing the generated responses with the pre-recorded ones.\n *\n *  Returns the number of failed tests or -1 if server failed to start.\n */\n- (NSInteger)runTestsWithOptions:(nullable NSDictionary<NSString*, id>*)options inDirectory:(NSString*)path;\n\n@end\n\n#endif\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServer.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <TargetConditionals.h>\n#if TARGET_OS_IPHONE\n#import <UIKit/UIKit.h>\n#else\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n#import <AppKit/AppKit.h>\n#endif\n#endif\n#import <netinet/in.h>\n#import <dns_sd.h>\n\n#import \"GCDWebServerPrivate.h\"\n\n#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR\n#define kDefaultPort 80\n#else\n#define kDefaultPort 8080\n#endif\n\n#define kBonjourResolutionTimeout 5.0\n\nNSString* const GCDWebServerOption_Port = @\"Port\";\nNSString* const GCDWebServerOption_BonjourName = @\"BonjourName\";\nNSString* const GCDWebServerOption_BonjourType = @\"BonjourType\";\nNSString* const GCDWebServerOption_RequestNATPortMapping = @\"RequestNATPortMapping\";\nNSString* const GCDWebServerOption_BindToLocalhost = @\"BindToLocalhost\";\nNSString* const GCDWebServerOption_MaxPendingConnections = @\"MaxPendingConnections\";\nNSString* const GCDWebServerOption_ServerName = @\"ServerName\";\nNSString* const GCDWebServerOption_AuthenticationMethod = @\"AuthenticationMethod\";\nNSString* const GCDWebServerOption_AuthenticationRealm = @\"AuthenticationRealm\";\nNSString* const GCDWebServerOption_AuthenticationAccounts = @\"AuthenticationAccounts\";\nNSString* const GCDWebServerOption_ConnectionClass = @\"ConnectionClass\";\nNSString* const GCDWebServerOption_AutomaticallyMapHEADToGET = @\"AutomaticallyMapHEADToGET\";\nNSString* const GCDWebServerOption_ConnectedStateCoalescingInterval = @\"ConnectedStateCoalescingInterval\";\nNSString* const GCDWebServerOption_DispatchQueuePriority = @\"DispatchQueuePriority\";\n#if TARGET_OS_IPHONE\nNSString* const GCDWebServerOption_AutomaticallySuspendInBackground = @\"AutomaticallySuspendInBackground\";\n#endif\n\nNSString* const GCDWebServerAuthenticationMethod_Basic = @\"Basic\";\nNSString* const GCDWebServerAuthenticationMethod_DigestAccess = @\"DigestAccess\";\n\n#if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__)\n#if DEBUG\nGCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Debug;\n#else\nGCDWebServerLoggingLevel GCDWebServerLogLevel = kGCDWebServerLoggingLevel_Info;\n#endif\n#endif\n\n#if !TARGET_OS_IPHONE\nstatic BOOL _run;\n#endif\n\n#ifdef __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__\n\nstatic GCDWebServerBuiltInLoggerBlock _builtInLoggerBlock;\n\nvoid GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) {\n  static const char* levelNames[] = {\"DEBUG\", \"VERBOSE\", \"INFO\", \"WARNING\", \"ERROR\"};\n  static int enableLogging = -1;\n  if (enableLogging < 0) {\n    enableLogging = (isatty(STDERR_FILENO) ? 1 : 0);\n  }\n  if (_builtInLoggerBlock || enableLogging) {\n    va_list arguments;\n    va_start(arguments, format);\n    NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];\n    va_end(arguments);\n    if (_builtInLoggerBlock) {\n      _builtInLoggerBlock(level, message);\n    } else {\n      fprintf(stderr, \"[%s] %s\\n\", levelNames[level], [message UTF8String]);\n    }\n  }\n}\n\n#endif\n\n#if !TARGET_OS_IPHONE\n\nstatic void _SignalHandler(int signal) {\n  _run = NO;\n  printf(\"\\n\");\n}\n\n#endif\n\n#if !TARGET_OS_IPHONE || defined(__GCDWEBSERVER_ENABLE_TESTING__)\n\n// This utility function is used to ensure scheduled callbacks on the main thread are called when running the server synchronously\n// https://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html\n// The main queue works with the application’s run loop to interleave the execution of queued tasks with the execution of other event sources attached to the run loop\n// TODO: Ensure all scheduled blocks on the main queue are also executed\nstatic void _ExecuteMainThreadRunLoopSources() {\n  SInt32 result;\n  do {\n    result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.0, true);\n  } while (result == kCFRunLoopRunHandledSource);\n}\n\n#endif\n\n@implementation GCDWebServerHandler\n\n- (instancetype)initWithMatchBlock:(GCDWebServerMatchBlock _Nonnull)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock _Nonnull)processBlock {\n  if ((self = [super init])) {\n    _matchBlock = [matchBlock copy];\n    _asyncProcessBlock = [processBlock copy];\n  }\n  return self;\n}\n\n@end\n\n@implementation GCDWebServer {\n  dispatch_queue_t _syncQueue;\n  dispatch_group_t _sourceGroup;\n  NSMutableArray<GCDWebServerHandler*>* _handlers;\n  NSInteger _activeConnections;  // Accessed through _syncQueue only\n  BOOL _connected;  // Accessed on main thread only\n  CFRunLoopTimerRef _disconnectTimer;  // Accessed on main thread only\n\n  NSDictionary<NSString*, id>* _options;\n  NSMutableDictionary<NSString*, NSString*>* _authenticationBasicAccounts;\n  NSMutableDictionary<NSString*, NSString*>* _authenticationDigestAccounts;\n  Class _connectionClass;\n  CFTimeInterval _disconnectDelay;\n  dispatch_source_t _source4;\n  dispatch_source_t _source6;\n  CFNetServiceRef _registrationService;\n  CFNetServiceRef _resolutionService;\n  DNSServiceRef _dnsService;\n  CFSocketRef _dnsSocket;\n  CFRunLoopSourceRef _dnsSource;\n  NSString* _dnsAddress;\n  NSUInteger _dnsPort;\n  BOOL _bindToLocalhost;\n#if TARGET_OS_IPHONE\n  BOOL _suspendInBackground;\n  UIBackgroundTaskIdentifier _backgroundTask;\n#endif\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  BOOL _recording;\n#endif\n}\n\n+ (void)initialize {\n  GCDWebServerInitializeFunctions();\n}\n\n- (instancetype)init {\n  if ((self = [super init])) {\n    _syncQueue = dispatch_queue_create([NSStringFromClass([self class]) UTF8String], DISPATCH_QUEUE_SERIAL);\n    _sourceGroup = dispatch_group_create();\n    _handlers = [[NSMutableArray alloc] init];\n#if TARGET_OS_IPHONE\n    _backgroundTask = UIBackgroundTaskInvalid;\n#endif\n  }\n  return self;\n}\n\n- (void)dealloc {\n  GWS_DCHECK(_connected == NO);\n  GWS_DCHECK(_activeConnections == 0);\n  GWS_DCHECK(_options == nil);  // The server can never be dealloc'ed while running because of the retain-cycle with the dispatch source\n  GWS_DCHECK(_disconnectTimer == NULL);  // The server can never be dealloc'ed while the disconnect timer is pending because of the retain-cycle\n\n#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE\n  dispatch_release(_sourceGroup);\n  dispatch_release(_syncQueue);\n#endif\n}\n\n#if TARGET_OS_IPHONE\n\n// Always called on main thread\n- (void)_startBackgroundTask {\n  GWS_DCHECK([NSThread isMainThread]);\n  if (_backgroundTask == UIBackgroundTaskInvalid) {\n    GWS_LOG_DEBUG(@\"Did start background task\");\n    _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{\n      GWS_LOG_WARNING(@\"Application is being suspended while %@ is still connected\", [self class]);\n      [self _endBackgroundTask];\n    }];\n  } else {\n    GWS_DNOT_REACHED();\n  }\n}\n\n#endif\n\n// Always called on main thread\n- (void)_didConnect {\n  GWS_DCHECK([NSThread isMainThread]);\n  GWS_DCHECK(_connected == NO);\n  _connected = YES;\n  GWS_LOG_DEBUG(@\"Did connect\");\n\n#if TARGET_OS_IPHONE\n  if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {\n    [self _startBackgroundTask];\n  }\n#endif\n\n  if ([_delegate respondsToSelector:@selector(webServerDidConnect:)]) {\n    [_delegate webServerDidConnect:self];\n  }\n}\n\n- (void)willStartConnection:(GCDWebServerConnection*)connection {\n  dispatch_sync(_syncQueue, ^{\n    GWS_DCHECK(self->_activeConnections >= 0);\n    if (self->_activeConnections == 0) {\n      dispatch_async(dispatch_get_main_queue(), ^{\n        if (self->_disconnectTimer) {\n          CFRunLoopTimerInvalidate(self->_disconnectTimer);\n          CFRelease(self->_disconnectTimer);\n          self->_disconnectTimer = NULL;\n        }\n        if (self->_connected == NO) {\n          [self _didConnect];\n        }\n      });\n    }\n    self->_activeConnections += 1;\n  });\n}\n\n#if TARGET_OS_IPHONE\n\n// Always called on main thread\n- (void)_endBackgroundTask {\n  GWS_DCHECK([NSThread isMainThread]);\n  if (_backgroundTask != UIBackgroundTaskInvalid) {\n    if (_suspendInBackground && ([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground) && _source4) {\n      [self _stop];\n    }\n    [[UIApplication sharedApplication] endBackgroundTask:_backgroundTask];\n    _backgroundTask = UIBackgroundTaskInvalid;\n    GWS_LOG_DEBUG(@\"Did end background task\");\n  }\n}\n\n#endif\n\n// Always called on main thread\n- (void)_didDisconnect {\n  GWS_DCHECK([NSThread isMainThread]);\n  GWS_DCHECK(_connected == YES);\n  _connected = NO;\n  GWS_LOG_DEBUG(@\"Did disconnect\");\n\n#if TARGET_OS_IPHONE\n  [self _endBackgroundTask];\n#endif\n\n  if ([_delegate respondsToSelector:@selector(webServerDidDisconnect:)]) {\n    [_delegate webServerDidDisconnect:self];\n  }\n}\n\n- (void)didEndConnection:(GCDWebServerConnection*)connection {\n  dispatch_sync(_syncQueue, ^{\n    GWS_DCHECK(self->_activeConnections > 0);\n    self->_activeConnections -= 1;\n    if (self->_activeConnections == 0) {\n      dispatch_async(dispatch_get_main_queue(), ^{\n        if ((self->_disconnectDelay > 0.0) && (self->_source4 != NULL)) {\n          if (self->_disconnectTimer) {\n            CFRunLoopTimerInvalidate(self->_disconnectTimer);\n            CFRelease(self->_disconnectTimer);\n          }\n          self->_disconnectTimer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + self->_disconnectDelay, 0.0, 0, 0, ^(CFRunLoopTimerRef timer) {\n            GWS_DCHECK([NSThread isMainThread]);\n            [self _didDisconnect];\n            CFRelease(self->_disconnectTimer);\n            self->_disconnectTimer = NULL;\n          });\n          CFRunLoopAddTimer(CFRunLoopGetMain(), self->_disconnectTimer, kCFRunLoopCommonModes);\n        } else {\n          [self _didDisconnect];\n        }\n      });\n    }\n  });\n}\n\n- (NSString*)bonjourName {\n  CFStringRef name = _resolutionService ? CFNetServiceGetName(_resolutionService) : NULL;\n  return name && CFStringGetLength(name) ? CFBridgingRelease(CFStringCreateCopy(kCFAllocatorDefault, name)) : nil;\n}\n\n- (NSString*)bonjourType {\n  CFStringRef type = _resolutionService ? CFNetServiceGetType(_resolutionService) : NULL;\n  return type && CFStringGetLength(type) ? CFBridgingRelease(CFStringCreateCopy(kCFAllocatorDefault, type)) : nil;\n}\n\n- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock processBlock:(GCDWebServerProcessBlock)processBlock {\n  [self addHandlerWithMatchBlock:matchBlock\n               asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {\n                 completionBlock(processBlock(request));\n               }];\n}\n\n- (void)addHandlerWithMatchBlock:(GCDWebServerMatchBlock)matchBlock asyncProcessBlock:(GCDWebServerAsyncProcessBlock)processBlock {\n  GWS_DCHECK(_options == nil);\n  GCDWebServerHandler* handler = [[GCDWebServerHandler alloc] initWithMatchBlock:matchBlock asyncProcessBlock:processBlock];\n  [_handlers insertObject:handler atIndex:0];\n}\n\n- (void)removeAllHandlers {\n  GWS_DCHECK(_options == nil);\n  [_handlers removeAllObjects];\n}\n\nstatic void _NetServiceRegisterCallBack(CFNetServiceRef service, CFStreamError* error, void* info) {\n  GWS_DCHECK([NSThread isMainThread]);\n  @autoreleasepool {\n    if (error->error) {\n      GWS_LOG_ERROR(@\"Bonjour registration error %i (domain %i)\", (int)error->error, (int)error->domain);\n    } else {\n      GCDWebServer* server = (__bridge GCDWebServer*)info;\n      GWS_LOG_VERBOSE(@\"Bonjour registration complete for %@\", [server class]);\n      if (!CFNetServiceResolveWithTimeout(server->_resolutionService, kBonjourResolutionTimeout, NULL)) {\n        GWS_LOG_ERROR(@\"Failed starting Bonjour resolution\");\n        GWS_DNOT_REACHED();\n      }\n    }\n  }\n}\n\nstatic void _NetServiceResolveCallBack(CFNetServiceRef service, CFStreamError* error, void* info) {\n  GWS_DCHECK([NSThread isMainThread]);\n  @autoreleasepool {\n    if (error->error) {\n      if ((error->domain != kCFStreamErrorDomainNetServices) && (error->error != kCFNetServicesErrorTimeout)) {\n        GWS_LOG_ERROR(@\"Bonjour resolution error %i (domain %i)\", (int)error->error, (int)error->domain);\n      }\n    } else {\n      GCDWebServer* server = (__bridge GCDWebServer*)info;\n      GWS_LOG_INFO(@\"%@ now locally reachable at %@\", [server class], server.bonjourServerURL);\n      if ([server.delegate respondsToSelector:@selector(webServerDidCompleteBonjourRegistration:)]) {\n        [server.delegate webServerDidCompleteBonjourRegistration:server];\n      }\n    }\n  }\n}\n\nstatic void _DNSServiceCallBack(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, uint32_t externalAddress, DNSServiceProtocol protocol, uint16_t internalPort, uint16_t externalPort, uint32_t ttl, void* context) {\n  GWS_DCHECK([NSThread isMainThread]);\n  @autoreleasepool {\n    GCDWebServer* server = (__bridge GCDWebServer*)context;\n    if ((errorCode == kDNSServiceErr_NoError) || (errorCode == kDNSServiceErr_DoubleNAT)) {\n      struct sockaddr_in addr4;\n      bzero(&addr4, sizeof(addr4));\n      addr4.sin_len = sizeof(addr4);\n      addr4.sin_family = AF_INET;\n      addr4.sin_addr.s_addr = externalAddress;  // Already in network byte order\n      server->_dnsAddress = GCDWebServerStringFromSockAddr((const struct sockaddr*)&addr4, NO);\n      server->_dnsPort = ntohs(externalPort);\n      GWS_LOG_INFO(@\"%@ now publicly reachable at %@\", [server class], server.publicServerURL);\n    } else {\n      GWS_LOG_ERROR(@\"DNS service error %i\", errorCode);\n      server->_dnsAddress = nil;\n      server->_dnsPort = 0;\n    }\n    if ([server.delegate respondsToSelector:@selector(webServerDidUpdateNATPortMapping:)]) {\n      [server.delegate webServerDidUpdateNATPortMapping:server];\n    }\n  }\n}\n\nstatic void _SocketCallBack(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void* data, void* info) {\n  GWS_DCHECK([NSThread isMainThread]);\n  @autoreleasepool {\n    GCDWebServer* server = (__bridge GCDWebServer*)info;\n    DNSServiceErrorType status = DNSServiceProcessResult(server->_dnsService);\n    if (status != kDNSServiceErr_NoError) {\n      GWS_LOG_ERROR(@\"DNS service error %i\", status);\n    }\n  }\n}\n\nstatic inline id _GetOption(NSDictionary<NSString*, id>* options, NSString* key, id defaultValue) {\n  id value = [options objectForKey:key];\n  return value ? value : defaultValue;\n}\n\nstatic inline NSString* _EncodeBase64(NSString* string) {\n  NSData* data = [string dataUsingEncoding:NSUTF8StringEncoding];\n#if TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9)\n  return [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSASCIIStringEncoding];\n#else\n  if (@available(macOS 10.9, *)) {\n    return [[NSString alloc] initWithData:[data base64EncodedDataWithOptions:0] encoding:NSASCIIStringEncoding];\n  }\n  return [data base64Encoding];\n#endif\n}\n\n- (int)_createListeningSocket:(BOOL)useIPv6\n                 localAddress:(const void*)address\n                       length:(socklen_t)length\n        maxPendingConnections:(NSUInteger)maxPendingConnections\n                        error:(NSError**)error {\n  int listeningSocket = socket(useIPv6 ? PF_INET6 : PF_INET, SOCK_STREAM, IPPROTO_TCP);\n  if (listeningSocket > 0) {\n    int yes = 1;\n    setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));\n\n    if (bind(listeningSocket, address, length) == 0) {\n      if (listen(listeningSocket, (int)maxPendingConnections) == 0) {\n        GWS_LOG_DEBUG(@\"Did open %s listening socket %i\", useIPv6 ? \"IPv6\" : \"IPv4\", listeningSocket);\n        return listeningSocket;\n      } else {\n        if (error) {\n          *error = GCDWebServerMakePosixError(errno);\n        }\n        GWS_LOG_ERROR(@\"Failed starting %s listening socket: %s (%i)\", useIPv6 ? \"IPv6\" : \"IPv4\", strerror(errno), errno);\n        close(listeningSocket);\n      }\n    } else {\n      if (error) {\n        *error = GCDWebServerMakePosixError(errno);\n      }\n      GWS_LOG_ERROR(@\"Failed binding %s listening socket: %s (%i)\", useIPv6 ? \"IPv6\" : \"IPv4\", strerror(errno), errno);\n      close(listeningSocket);\n    }\n\n  } else {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    GWS_LOG_ERROR(@\"Failed creating %s listening socket: %s (%i)\", useIPv6 ? \"IPv6\" : \"IPv4\", strerror(errno), errno);\n  }\n  return -1;\n}\n\n- (dispatch_source_t)_createDispatchSourceWithListeningSocket:(int)listeningSocket isIPv6:(BOOL)isIPv6 {\n  dispatch_group_enter(_sourceGroup);\n  dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, listeningSocket, 0, dispatch_get_global_queue(_dispatchQueuePriority, 0));\n  dispatch_source_set_cancel_handler(source, ^{\n    @autoreleasepool {\n      int result = close(listeningSocket);\n      if (result != 0) {\n        GWS_LOG_ERROR(@\"Failed closing %s listening socket: %s (%i)\", isIPv6 ? \"IPv6\" : \"IPv4\", strerror(errno), errno);\n      } else {\n        GWS_LOG_DEBUG(@\"Did close %s listening socket %i\", isIPv6 ? \"IPv6\" : \"IPv4\", listeningSocket);\n      }\n    }\n    dispatch_group_leave(self->_sourceGroup);\n  });\n  dispatch_source_set_event_handler(source, ^{\n    @autoreleasepool {\n      struct sockaddr_storage remoteSockAddr;\n      socklen_t remoteAddrLen = sizeof(remoteSockAddr);\n      int socket = accept(listeningSocket, (struct sockaddr*)&remoteSockAddr, &remoteAddrLen);\n      if (socket > 0) {\n        NSData* remoteAddress = [NSData dataWithBytes:&remoteSockAddr length:remoteAddrLen];\n\n        struct sockaddr_storage localSockAddr;\n        socklen_t localAddrLen = sizeof(localSockAddr);\n        NSData* localAddress = nil;\n        if (getsockname(socket, (struct sockaddr*)&localSockAddr, &localAddrLen) == 0) {\n          localAddress = [NSData dataWithBytes:&localSockAddr length:localAddrLen];\n          GWS_DCHECK((!isIPv6 && localSockAddr.ss_family == AF_INET) || (isIPv6 && localSockAddr.ss_family == AF_INET6));\n        } else {\n          GWS_DNOT_REACHED();\n        }\n\n        int noSigPipe = 1;\n        setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &noSigPipe, sizeof(noSigPipe));  // Make sure this socket cannot generate SIG_PIPE\n\n        GCDWebServerConnection* connection = [(GCDWebServerConnection*)[self->_connectionClass alloc] initWithServer:self localAddress:localAddress remoteAddress:remoteAddress socket:socket];  // Connection will automatically retain itself while opened\n        [connection self];  // Prevent compiler from complaining about unused variable / useless statement\n      } else {\n        GWS_LOG_ERROR(@\"Failed accepting %s socket: %s (%i)\", isIPv6 ? \"IPv6\" : \"IPv4\", strerror(errno), errno);\n      }\n    }\n  });\n  return source;\n}\n\n- (BOOL)_start:(NSError**)error {\n  GWS_DCHECK(_source4 == NULL);\n\n  NSUInteger port = [(NSNumber*)_GetOption(_options, GCDWebServerOption_Port, @0) unsignedIntegerValue];\n  BOOL bindToLocalhost = [(NSNumber*)_GetOption(_options, GCDWebServerOption_BindToLocalhost, @NO) boolValue];\n  NSUInteger maxPendingConnections = [(NSNumber*)_GetOption(_options, GCDWebServerOption_MaxPendingConnections, @16) unsignedIntegerValue];\n\n  struct sockaddr_in addr4;\n  bzero(&addr4, sizeof(addr4));\n  addr4.sin_len = sizeof(addr4);\n  addr4.sin_family = AF_INET;\n  addr4.sin_port = htons(port);\n  addr4.sin_addr.s_addr = bindToLocalhost ? htonl(INADDR_LOOPBACK) : htonl(INADDR_ANY);\n  int listeningSocket4 = [self _createListeningSocket:NO localAddress:&addr4 length:sizeof(addr4) maxPendingConnections:maxPendingConnections error:error];\n  if (listeningSocket4 <= 0) {\n    return NO;\n  }\n  if (port == 0) {\n    struct sockaddr_in addr;\n    socklen_t addrlen = sizeof(addr);\n    if (getsockname(listeningSocket4, (struct sockaddr*)&addr, &addrlen) == 0) {\n      port = ntohs(addr.sin_port);\n    } else {\n      GWS_LOG_ERROR(@\"Failed retrieving socket address: %s (%i)\", strerror(errno), errno);\n    }\n  }\n\n  struct sockaddr_in6 addr6;\n  bzero(&addr6, sizeof(addr6));\n  addr6.sin6_len = sizeof(addr6);\n  addr6.sin6_family = AF_INET6;\n  addr6.sin6_port = htons(port);\n  addr6.sin6_addr = bindToLocalhost ? in6addr_loopback : in6addr_any;\n  int listeningSocket6 = [self _createListeningSocket:YES localAddress:&addr6 length:sizeof(addr6) maxPendingConnections:maxPendingConnections error:error];\n  if (listeningSocket6 <= 0) {\n    close(listeningSocket4);\n    return NO;\n  }\n\n  _serverName = [(NSString*)_GetOption(_options, GCDWebServerOption_ServerName, NSStringFromClass([self class])) copy];\n  NSString* authenticationMethod = _GetOption(_options, GCDWebServerOption_AuthenticationMethod, nil);\n  if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_Basic]) {\n    _authenticationRealm = [(NSString*)_GetOption(_options, GCDWebServerOption_AuthenticationRealm, _serverName) copy];\n    _authenticationBasicAccounts = [[NSMutableDictionary alloc] init];\n    NSDictionary* accounts = _GetOption(_options, GCDWebServerOption_AuthenticationAccounts, @{});\n    [accounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* password, BOOL* stop) {\n      [self->_authenticationBasicAccounts setObject:_EncodeBase64([NSString stringWithFormat:@\"%@:%@\", username, password]) forKey:username];\n    }];\n  } else if ([authenticationMethod isEqualToString:GCDWebServerAuthenticationMethod_DigestAccess]) {\n    _authenticationRealm = [(NSString*)_GetOption(_options, GCDWebServerOption_AuthenticationRealm, _serverName) copy];\n    _authenticationDigestAccounts = [[NSMutableDictionary alloc] init];\n    NSDictionary* accounts = _GetOption(_options, GCDWebServerOption_AuthenticationAccounts, @{});\n    [accounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* password, BOOL* stop) {\n      [self->_authenticationDigestAccounts setObject:GCDWebServerComputeMD5Digest(@\"%@:%@:%@\", username, self->_authenticationRealm, password) forKey:username];\n    }];\n  }\n  _connectionClass = _GetOption(_options, GCDWebServerOption_ConnectionClass, [GCDWebServerConnection class]);\n  _shouldAutomaticallyMapHEADToGET = [(NSNumber*)_GetOption(_options, GCDWebServerOption_AutomaticallyMapHEADToGET, @YES) boolValue];\n  _disconnectDelay = [(NSNumber*)_GetOption(_options, GCDWebServerOption_ConnectedStateCoalescingInterval, @1.0) doubleValue];\n  _dispatchQueuePriority = [(NSNumber*)_GetOption(_options, GCDWebServerOption_DispatchQueuePriority, @(DISPATCH_QUEUE_PRIORITY_DEFAULT)) longValue];\n\n  _source4 = [self _createDispatchSourceWithListeningSocket:listeningSocket4 isIPv6:NO];\n  _source6 = [self _createDispatchSourceWithListeningSocket:listeningSocket6 isIPv6:YES];\n  _port = port;\n  _bindToLocalhost = bindToLocalhost;\n\n  NSString* bonjourName = _GetOption(_options, GCDWebServerOption_BonjourName, nil);\n  NSString* bonjourType = _GetOption(_options, GCDWebServerOption_BonjourType, @\"_http._tcp\");\n  if (bonjourName) {\n    _registrationService = CFNetServiceCreate(kCFAllocatorDefault, CFSTR(\"local.\"), (__bridge CFStringRef)bonjourType, (__bridge CFStringRef)(bonjourName.length ? bonjourName : _serverName), (SInt32)_port);\n    if (_registrationService) {\n      CFNetServiceClientContext context = {0, (__bridge void*)self, NULL, NULL, NULL};\n\n      CFNetServiceSetClient(_registrationService, _NetServiceRegisterCallBack, &context);\n      CFNetServiceScheduleWithRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes);\n      CFStreamError streamError = {0};\n      CFNetServiceRegisterWithOptions(_registrationService, 0, &streamError);\n\n      _resolutionService = CFNetServiceCreateCopy(kCFAllocatorDefault, _registrationService);\n      if (_resolutionService) {\n        CFNetServiceSetClient(_resolutionService, _NetServiceResolveCallBack, &context);\n        CFNetServiceScheduleWithRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes);\n      } else {\n        GWS_LOG_ERROR(@\"Failed creating CFNetService for resolution\");\n      }\n    } else {\n      GWS_LOG_ERROR(@\"Failed creating CFNetService for registration\");\n    }\n  }\n\n  if ([(NSNumber*)_GetOption(_options, GCDWebServerOption_RequestNATPortMapping, @NO) boolValue]) {\n    DNSServiceErrorType status = DNSServiceNATPortMappingCreate(&_dnsService, 0, 0, kDNSServiceProtocol_TCP, htons(port), htons(port), 0, _DNSServiceCallBack, (__bridge void*)self);\n    if (status == kDNSServiceErr_NoError) {\n      CFSocketContext context = {0, (__bridge void*)self, NULL, NULL, NULL};\n      _dnsSocket = CFSocketCreateWithNative(kCFAllocatorDefault, DNSServiceRefSockFD(_dnsService), kCFSocketReadCallBack, _SocketCallBack, &context);\n      if (_dnsSocket) {\n        CFSocketSetSocketFlags(_dnsSocket, CFSocketGetSocketFlags(_dnsSocket) & ~kCFSocketCloseOnInvalidate);\n        _dnsSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _dnsSocket, 0);\n        if (_dnsSource) {\n          CFRunLoopAddSource(CFRunLoopGetMain(), _dnsSource, kCFRunLoopCommonModes);\n        } else {\n          GWS_LOG_ERROR(@\"Failed creating CFRunLoopSource\");\n          GWS_DNOT_REACHED();\n        }\n      } else {\n        GWS_LOG_ERROR(@\"Failed creating CFSocket\");\n        GWS_DNOT_REACHED();\n      }\n    } else {\n      GWS_LOG_ERROR(@\"Failed creating NAT port mapping (%i)\", status);\n    }\n  }\n\n  dispatch_resume(_source4);\n  dispatch_resume(_source6);\n  GWS_LOG_INFO(@\"%@ started on port %i and reachable at %@\", [self class], (int)_port, self.serverURL);\n  if ([_delegate respondsToSelector:@selector(webServerDidStart:)]) {\n    dispatch_async(dispatch_get_main_queue(), ^{\n      [self->_delegate webServerDidStart:self];\n    });\n  }\n\n  return YES;\n}\n\n- (void)_stop {\n  GWS_DCHECK(_source4 != NULL);\n\n  if (_dnsService) {\n    _dnsAddress = nil;\n    _dnsPort = 0;\n    if (_dnsSource) {\n      CFRunLoopSourceInvalidate(_dnsSource);\n      CFRelease(_dnsSource);\n      _dnsSource = NULL;\n    }\n    if (_dnsSocket) {\n      CFRelease(_dnsSocket);\n      _dnsSocket = NULL;\n    }\n    DNSServiceRefDeallocate(_dnsService);\n    _dnsService = NULL;\n  }\n\n  if (_registrationService) {\n    if (_resolutionService) {\n      CFNetServiceUnscheduleFromRunLoop(_resolutionService, CFRunLoopGetMain(), kCFRunLoopCommonModes);\n      CFNetServiceSetClient(_resolutionService, NULL, NULL);\n      CFNetServiceCancel(_resolutionService);\n      CFRelease(_resolutionService);\n      _resolutionService = NULL;\n    }\n    CFNetServiceUnscheduleFromRunLoop(_registrationService, CFRunLoopGetMain(), kCFRunLoopCommonModes);\n    CFNetServiceSetClient(_registrationService, NULL, NULL);\n    CFNetServiceCancel(_registrationService);\n    CFRelease(_registrationService);\n    _registrationService = NULL;\n  }\n\n  dispatch_source_cancel(_source6);\n  dispatch_source_cancel(_source4);\n  dispatch_group_wait(_sourceGroup, DISPATCH_TIME_FOREVER);  // Wait until the cancellation handlers have been called which guarantees the listening sockets are closed\n#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE\n  dispatch_release(_source6);\n#endif\n  _source6 = NULL;\n#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE\n  dispatch_release(_source4);\n#endif\n  _source4 = NULL;\n  _port = 0;\n  _bindToLocalhost = NO;\n\n  _serverName = nil;\n  _authenticationRealm = nil;\n  _authenticationBasicAccounts = nil;\n  _authenticationDigestAccounts = nil;\n\n  dispatch_async(dispatch_get_main_queue(), ^{\n    if (self->_disconnectTimer) {\n      CFRunLoopTimerInvalidate(self->_disconnectTimer);\n      CFRelease(self->_disconnectTimer);\n      self->_disconnectTimer = NULL;\n      [self _didDisconnect];\n    }\n  });\n\n  GWS_LOG_INFO(@\"%@ stopped\", [self class]);\n  if ([_delegate respondsToSelector:@selector(webServerDidStop:)]) {\n    dispatch_async(dispatch_get_main_queue(), ^{\n      [self->_delegate webServerDidStop:self];\n    });\n  }\n}\n\n#if TARGET_OS_IPHONE\n\n- (void)_didEnterBackground:(NSNotification*)notification {\n  GWS_DCHECK([NSThread isMainThread]);\n  GWS_LOG_DEBUG(@\"Did enter background\");\n  if ((_backgroundTask == UIBackgroundTaskInvalid) && _source4) {\n    [self _stop];\n  }\n}\n\n- (void)_willEnterForeground:(NSNotification*)notification {\n  GWS_DCHECK([NSThread isMainThread]);\n  GWS_LOG_DEBUG(@\"Will enter foreground\");\n  if (!_source4) {\n    [self _start:NULL];  // TODO: There's probably nothing we can do on failure\n  }\n}\n\n#endif\n\n- (BOOL)startWithOptions:(NSDictionary<NSString*, id>*)options error:(NSError**)error {\n  if (_options == nil) {\n    _options = options ? [options copy] : @{};\n#if TARGET_OS_IPHONE\n    _suspendInBackground = [(NSNumber*)_GetOption(_options, GCDWebServerOption_AutomaticallySuspendInBackground, @YES) boolValue];\n    if (((_suspendInBackground == NO) || ([[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground)) && ![self _start:error])\n#else\n    if (![self _start:error])\n#endif\n    {\n      _options = nil;\n      return NO;\n    }\n#if TARGET_OS_IPHONE\n    if (_suspendInBackground) {\n      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_didEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];\n      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_willEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];\n    }\n#endif\n    return YES;\n  } else {\n    GWS_DNOT_REACHED();\n  }\n  return NO;\n}\n\n- (BOOL)isRunning {\n  return (_options ? YES : NO);\n}\n\n- (void)stop {\n  if (_options) {\n#if TARGET_OS_IPHONE\n    if (_suspendInBackground) {\n      [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];\n      [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];\n    }\n#endif\n    if (_source4) {\n      [self _stop];\n    }\n    _options = nil;\n  } else {\n    GWS_DNOT_REACHED();\n  }\n}\n\n@end\n\n@implementation GCDWebServer (Extensions)\n\n- (NSURL*)serverURL {\n  if (_source4) {\n    NSString* ipAddress = _bindToLocalhost ? @\"localhost\" : GCDWebServerGetPrimaryIPAddress(NO);  // We can't really use IPv6 anyway as it doesn't work great with HTTP URLs in practice\n    if (ipAddress) {\n      if (_port != 80) {\n        return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@:%i/\", ipAddress, (int)_port]];\n      } else {\n        return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@/\", ipAddress]];\n      }\n    }\n  }\n  return nil;\n}\n\n- (NSURL*)bonjourServerURL {\n  if (_source4 && _resolutionService) {\n    NSString* name = (__bridge NSString*)CFNetServiceGetTargetHost(_resolutionService);\n    if (name.length) {\n      name = [name substringToIndex:(name.length - 1)];  // Strip trailing period at end of domain\n      if (_port != 80) {\n        return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@:%i/\", name, (int)_port]];\n      } else {\n        return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@/\", name]];\n      }\n    }\n  }\n  return nil;\n}\n\n- (NSURL*)publicServerURL {\n  if (_source4 && _dnsService && _dnsAddress && _dnsPort) {\n    if (_dnsPort != 80) {\n      return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@:%i/\", _dnsAddress, (int)_dnsPort]];\n    } else {\n      return [NSURL URLWithString:[NSString stringWithFormat:@\"http://%@/\", _dnsAddress]];\n    }\n  }\n  return nil;\n}\n\n- (BOOL)start {\n  return [self startWithPort:kDefaultPort bonjourName:@\"\"];\n}\n\n- (BOOL)startWithPort:(NSUInteger)port bonjourName:(NSString*)name {\n  NSMutableDictionary* options = [NSMutableDictionary dictionary];\n  [options setObject:[NSNumber numberWithInteger:port] forKey:GCDWebServerOption_Port];\n  [options setValue:name forKey:GCDWebServerOption_BonjourName];\n  return [self startWithOptions:options error:NULL];\n}\n\n#if !TARGET_OS_IPHONE\n\n- (BOOL)runWithPort:(NSUInteger)port bonjourName:(NSString*)name {\n  NSMutableDictionary* options = [NSMutableDictionary dictionary];\n  [options setObject:[NSNumber numberWithInteger:port] forKey:GCDWebServerOption_Port];\n  [options setValue:name forKey:GCDWebServerOption_BonjourName];\n  return [self runWithOptions:options error:NULL];\n}\n\n- (BOOL)runWithOptions:(NSDictionary<NSString*, id>*)options error:(NSError**)error {\n  GWS_DCHECK([NSThread isMainThread]);\n  BOOL success = NO;\n  _run = YES;\n  void (*termHandler)(int) = signal(SIGTERM, _SignalHandler);\n  void (*intHandler)(int) = signal(SIGINT, _SignalHandler);\n  if ((termHandler != SIG_ERR) && (intHandler != SIG_ERR)) {\n    if ([self startWithOptions:options error:error]) {\n      while (_run) {\n        CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0, true);\n      }\n      [self stop];\n      success = YES;\n    }\n    _ExecuteMainThreadRunLoopSources();\n    signal(SIGINT, intHandler);\n    signal(SIGTERM, termHandler);\n  }\n  return success;\n}\n\n#endif\n\n@end\n\n@implementation GCDWebServer (Handlers)\n\n- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {\n  [self addDefaultHandlerForMethod:method\n                      requestClass:aClass\n                 asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {\n                   completionBlock(block(request));\n                 }];\n}\n\n- (void)addDefaultHandlerForMethod:(NSString*)method requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {\n  [self\n      addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary<NSString*, NSString*>* requestHeaders, NSString* urlPath, NSDictionary<NSString*, NSString*>* urlQuery) {\n        if (![requestMethod isEqualToString:method]) {\n          return nil;\n        }\n        return [(GCDWebServerRequest*)[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];\n      }\n             asyncProcessBlock:block];\n}\n\n- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {\n  [self addHandlerForMethod:method\n                       path:path\n               requestClass:aClass\n          asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {\n            completionBlock(block(request));\n          }];\n}\n\n- (void)addHandlerForMethod:(NSString*)method path:(NSString*)path requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {\n  if ([path hasPrefix:@\"/\"] && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) {\n    [self\n        addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary<NSString*, NSString*>* requestHeaders, NSString* urlPath, NSDictionary<NSString*, NSString*>* urlQuery) {\n          if (![requestMethod isEqualToString:method]) {\n            return nil;\n          }\n          if ([urlPath caseInsensitiveCompare:path] != NSOrderedSame) {\n            return nil;\n          }\n          return [(GCDWebServerRequest*)[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];\n        }\n               asyncProcessBlock:block];\n  } else {\n    GWS_DNOT_REACHED();\n  }\n}\n\n- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass processBlock:(GCDWebServerProcessBlock)block {\n  [self addHandlerForMethod:method\n                  pathRegex:regex\n               requestClass:aClass\n          asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {\n            completionBlock(block(request));\n          }];\n}\n\n- (void)addHandlerForMethod:(NSString*)method pathRegex:(NSString*)regex requestClass:(Class)aClass asyncProcessBlock:(GCDWebServerAsyncProcessBlock)block {\n  NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:regex options:NSRegularExpressionCaseInsensitive error:NULL];\n  if (expression && [aClass isSubclassOfClass:[GCDWebServerRequest class]]) {\n    [self\n        addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary<NSString*, NSString*>* requestHeaders, NSString* urlPath, NSDictionary<NSString*, NSString*>* urlQuery) {\n          if (![requestMethod isEqualToString:method]) {\n            return nil;\n          }\n\n          NSArray* matches = [expression matchesInString:urlPath options:0 range:NSMakeRange(0, urlPath.length)];\n          if (matches.count == 0) {\n            return nil;\n          }\n\n          NSMutableArray* captures = [NSMutableArray array];\n          for (NSTextCheckingResult* result in matches) {\n            // Start at 1; index 0 is the whole string\n            for (NSUInteger i = 1; i < result.numberOfRanges; i++) {\n              NSRange range = [result rangeAtIndex:i];\n              // range is {NSNotFound, 0} \"if one of the capture groups did not participate in this particular match\"\n              // see discussion in -[NSRegularExpression firstMatchInString:options:range:]\n              if (range.location != NSNotFound) {\n                [captures addObject:[urlPath substringWithRange:range]];\n              }\n            }\n          }\n\n          GCDWebServerRequest* request = [(GCDWebServerRequest*)[aClass alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];\n          [request setAttribute:captures forKey:GCDWebServerRequestAttribute_RegexCaptures];\n          return request;\n        }\n               asyncProcessBlock:block];\n  } else {\n    GWS_DNOT_REACHED();\n  }\n}\n\n@end\n\n@implementation GCDWebServer (GETHandlers)\n\n- (void)addGETHandlerForPath:(NSString*)path staticData:(NSData*)staticData contentType:(NSString*)contentType cacheAge:(NSUInteger)cacheAge {\n  [self addHandlerForMethod:@\"GET\"\n                       path:path\n               requestClass:[GCDWebServerRequest class]\n               processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) {\n                 GCDWebServerResponse* response = [GCDWebServerDataResponse responseWithData:staticData contentType:contentType];\n                 response.cacheControlMaxAge = cacheAge;\n                 return response;\n               }];\n}\n\n- (void)addGETHandlerForPath:(NSString*)path filePath:(NSString*)filePath isAttachment:(BOOL)isAttachment cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests {\n  [self addHandlerForMethod:@\"GET\"\n                       path:path\n               requestClass:[GCDWebServerRequest class]\n               processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) {\n                 GCDWebServerResponse* response = nil;\n                 if (allowRangeRequests) {\n                   response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange isAttachment:isAttachment];\n                   [response setValue:@\"bytes\" forAdditionalHeader:@\"Accept-Ranges\"];\n                 } else {\n                   response = [GCDWebServerFileResponse responseWithFile:filePath isAttachment:isAttachment];\n                 }\n                 response.cacheControlMaxAge = cacheAge;\n                 return response;\n               }];\n}\n\n- (GCDWebServerResponse*)_responseWithContentsOfDirectory:(NSString*)path {\n  NSArray* contents = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];\n  if (contents == nil) {\n    return nil;\n  }\n  NSMutableString* html = [NSMutableString string];\n  [html appendString:@\"<!DOCTYPE html>\\n\"];\n  [html appendString:@\"<html><head><meta charset=\\\"utf-8\\\"></head><body>\\n\"];\n  [html appendString:@\"<ul>\\n\"];\n  for (NSString* entry in contents) {\n    if (![entry hasPrefix:@\".\"]) {\n      NSString* type = [[[NSFileManager defaultManager] attributesOfItemAtPath:[path stringByAppendingPathComponent:entry] error:NULL] objectForKey:NSFileType];\n      GWS_DCHECK(type);\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n      NSString* escapedFile = [entry stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n#pragma clang diagnostic pop\n      GWS_DCHECK(escapedFile);\n      if ([type isEqualToString:NSFileTypeRegular]) {\n        [html appendFormat:@\"<li><a href=\\\"%@\\\">%@</a></li>\\n\", escapedFile, entry];\n      } else if ([type isEqualToString:NSFileTypeDirectory]) {\n        [html appendFormat:@\"<li><a href=\\\"%@/\\\">%@/</a></li>\\n\", escapedFile, entry];\n      }\n    }\n  }\n  [html appendString:@\"</ul>\\n\"];\n  [html appendString:@\"</body></html>\\n\"];\n  return [GCDWebServerDataResponse responseWithHTML:html];\n}\n\n- (void)addGETHandlerForBasePath:(NSString*)basePath directoryPath:(NSString*)directoryPath indexFilename:(NSString*)indexFilename cacheAge:(NSUInteger)cacheAge allowRangeRequests:(BOOL)allowRangeRequests {\n  if ([basePath hasPrefix:@\"/\"] && [basePath hasSuffix:@\"/\"]) {\n    GCDWebServer* __unsafe_unretained server = self;\n    [self\n        addHandlerWithMatchBlock:^GCDWebServerRequest*(NSString* requestMethod, NSURL* requestURL, NSDictionary<NSString*, NSString*>* requestHeaders, NSString* urlPath, NSDictionary<NSString*, NSString*>* urlQuery) {\n          if (![requestMethod isEqualToString:@\"GET\"]) {\n            return nil;\n          }\n          if (![urlPath hasPrefix:basePath]) {\n            return nil;\n          }\n          return [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:urlPath query:urlQuery];\n        }\n        processBlock:^GCDWebServerResponse*(GCDWebServerRequest* request) {\n          GCDWebServerResponse* response = nil;\n          NSString* filePath = [directoryPath stringByAppendingPathComponent:GCDWebServerNormalizePath([request.path substringFromIndex:basePath.length])];\n          NSString* fileType = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileType];\n          if (fileType) {\n            if ([fileType isEqualToString:NSFileTypeDirectory]) {\n              if (indexFilename) {\n                NSString* indexPath = [filePath stringByAppendingPathComponent:indexFilename];\n                NSString* indexType = [[[NSFileManager defaultManager] attributesOfItemAtPath:indexPath error:NULL] fileType];\n                if ([indexType isEqualToString:NSFileTypeRegular]) {\n                  return [GCDWebServerFileResponse responseWithFile:indexPath];\n                }\n              }\n              response = [server _responseWithContentsOfDirectory:filePath];\n            } else if ([fileType isEqualToString:NSFileTypeRegular]) {\n              if (allowRangeRequests) {\n                response = [GCDWebServerFileResponse responseWithFile:filePath byteRange:request.byteRange];\n                [response setValue:@\"bytes\" forAdditionalHeader:@\"Accept-Ranges\"];\n              } else {\n                response = [GCDWebServerFileResponse responseWithFile:filePath];\n              }\n            }\n          }\n          if (response) {\n            response.cacheControlMaxAge = cacheAge;\n          } else {\n            response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_NotFound];\n          }\n          return response;\n        }];\n  } else {\n    GWS_DNOT_REACHED();\n  }\n}\n\n@end\n\n@implementation GCDWebServer (Logging)\n\n+ (void)setLogLevel:(int)level {\n#if defined(__GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__)\n  [XLSharedFacility setMinLogLevel:level];\n#elif defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__)\n  GCDWebServerLogLevel = level;\n#endif\n}\n\n+ (void)setBuiltInLogger:(GCDWebServerBuiltInLoggerBlock)block {\n#if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__)\n  _builtInLoggerBlock = block;\n#else\n  GWS_DNOT_REACHED();  // Built-in logger must be enabled in order to override\n#endif\n}\n\n- (void)logVerbose:(NSString*)format, ... {\n  va_list arguments;\n  va_start(arguments, format);\n  GWS_LOG_VERBOSE(@\"%@\", [[NSString alloc] initWithFormat:format arguments:arguments]);\n  va_end(arguments);\n}\n\n- (void)logInfo:(NSString*)format, ... {\n  va_list arguments;\n  va_start(arguments, format);\n  GWS_LOG_INFO(@\"%@\", [[NSString alloc] initWithFormat:format arguments:arguments]);\n  va_end(arguments);\n}\n\n- (void)logWarning:(NSString*)format, ... {\n  va_list arguments;\n  va_start(arguments, format);\n  GWS_LOG_WARNING(@\"%@\", [[NSString alloc] initWithFormat:format arguments:arguments]);\n  va_end(arguments);\n}\n\n- (void)logError:(NSString*)format, ... {\n  va_list arguments;\n  va_start(arguments, format);\n  GWS_LOG_ERROR(@\"%@\", [[NSString alloc] initWithFormat:format arguments:arguments]);\n  va_end(arguments);\n}\n\n@end\n\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n\n@implementation GCDWebServer (Testing)\n\n- (void)setRecordingEnabled:(BOOL)flag {\n  _recording = flag;\n}\n\n- (BOOL)isRecordingEnabled {\n  return _recording;\n}\n\nstatic CFHTTPMessageRef _CreateHTTPMessageFromData(NSData* data, BOOL isRequest) {\n  CFHTTPMessageRef message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, isRequest);\n  if (CFHTTPMessageAppendBytes(message, data.bytes, data.length)) {\n    return message;\n  }\n  CFRelease(message);\n  return NULL;\n}\n\nstatic CFHTTPMessageRef _CreateHTTPMessageFromPerformingRequest(NSData* inData, NSUInteger port) {\n  CFHTTPMessageRef response = NULL;\n  int httpSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);\n  if (httpSocket > 0) {\n    struct sockaddr_in addr4;\n    bzero(&addr4, sizeof(addr4));\n    addr4.sin_len = sizeof(addr4);\n    addr4.sin_family = AF_INET;\n    addr4.sin_port = htons(port);\n    addr4.sin_addr.s_addr = htonl(INADDR_ANY);\n    if (connect(httpSocket, (void*)&addr4, sizeof(addr4)) == 0) {\n      if (write(httpSocket, inData.bytes, inData.length) == (ssize_t)inData.length) {\n        NSMutableData* outData = [[NSMutableData alloc] initWithLength:(256 * 1024)];\n        NSUInteger length = 0;\n        while (1) {\n          ssize_t result = read(httpSocket, (char*)outData.mutableBytes + length, outData.length - length);\n          if (result < 0) {\n            length = NSUIntegerMax;\n            break;\n          } else if (result == 0) {\n            break;\n          }\n          length += result;\n          if (length >= outData.length) {\n            outData.length = 2 * outData.length;\n          }\n        }\n        if (length != NSUIntegerMax) {\n          outData.length = length;\n          response = _CreateHTTPMessageFromData(outData, NO);\n        } else {\n          GWS_DNOT_REACHED();\n        }\n      }\n    }\n    close(httpSocket);\n  }\n  return response;\n}\n\nstatic void _LogResult(NSString* format, ...) {\n  va_list arguments;\n  va_start(arguments, format);\n  NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];\n  va_end(arguments);\n  fprintf(stdout, \"%s\\n\", [message UTF8String]);\n}\n\n- (NSInteger)runTestsWithOptions:(NSDictionary<NSString*, id>*)options inDirectory:(NSString*)path {\n  GWS_DCHECK([NSThread isMainThread]);\n  NSArray* ignoredHeaders = @[ @\"Date\", @\"Etag\" ];  // Dates are always different by definition and ETags depend on file system node IDs\n  NSInteger result = -1;\n  if ([self startWithOptions:options error:NULL]) {\n    _ExecuteMainThreadRunLoopSources();\n\n    result = 0;\n    NSArray* files = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL] sortedArrayUsingSelector:@selector(localizedStandardCompare:)];\n    for (NSString* requestFile in files) {\n      if (![requestFile hasSuffix:@\".request\"]) {\n        continue;\n      }\n      @autoreleasepool {\n        NSString* index = [[requestFile componentsSeparatedByString:@\"-\"] firstObject];\n        BOOL success = NO;\n        NSData* requestData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:requestFile]];\n        if (requestData) {\n          CFHTTPMessageRef request = _CreateHTTPMessageFromData(requestData, YES);\n          if (request) {\n            NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(request));\n            NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(request));\n            _LogResult(@\"[%i] %@ %@\", (int)[index integerValue], requestMethod, requestURL.path);\n            NSString* prefix = [index stringByAppendingString:@\"-\"];\n            for (NSString* responseFile in files) {\n              if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@\".response\"]) {\n                NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]];\n                if (responseData) {\n                  CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO);\n                  if (expectedResponse) {\n                    CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, self.port);\n                    if (actualResponse) {\n                      success = YES;\n\n                      CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse);\n                      CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse);\n                      if (actualStatusCode != expectedStatusCode) {\n                        _LogResult(@\"  Status code not matching:\\n    Expected: %i\\n      Actual: %i\", (int)expectedStatusCode, (int)actualStatusCode);\n                        success = NO;\n                      }\n\n                      NSDictionary* expectedHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(expectedResponse));\n                      NSDictionary* actualHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(actualResponse));\n                      for (NSString* expectedHeader in expectedHeaders) {\n                        if ([ignoredHeaders containsObject:expectedHeader]) {\n                          continue;\n                        }\n                        NSString* expectedValue = [expectedHeaders objectForKey:expectedHeader];\n                        NSString* actualValue = [actualHeaders objectForKey:expectedHeader];\n                        if (![actualValue isEqualToString:expectedValue]) {\n                          _LogResult(@\"  Header '%@' not matching:\\n    Expected: \\\"%@\\\"\\n      Actual: \\\"%@\\\"\", expectedHeader, expectedValue, actualValue);\n                          success = NO;\n                        }\n                      }\n                      for (NSString* actualHeader in actualHeaders) {\n                        if (![expectedHeaders objectForKey:actualHeader]) {\n                          _LogResult(@\"  Header '%@' not matching:\\n    Expected: \\\"%@\\\"\\n      Actual: \\\"%@\\\"\", actualHeader, nil, [actualHeaders objectForKey:actualHeader]);\n                          success = NO;\n                        }\n                      }\n\n                      NSString* expectedContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(expectedResponse, CFSTR(\"Content-Length\")));\n                      NSData* expectedBody = CFBridgingRelease(CFHTTPMessageCopyBody(expectedResponse));\n                      NSString* actualContentLength = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(actualResponse, CFSTR(\"Content-Length\")));\n                      NSData* actualBody = CFBridgingRelease(CFHTTPMessageCopyBody(actualResponse));\n                      if ([actualContentLength isEqualToString:expectedContentLength] && (actualBody.length > expectedBody.length)) {  // Handle web browser closing connection before retrieving entire body (e.g. when playing a video file)\n                        actualBody = [actualBody subdataWithRange:NSMakeRange(0, expectedBody.length)];\n                      }\n                      if ((actualBody && expectedBody && ![actualBody isEqualToData:expectedBody]) || (actualBody && !expectedBody) || (!actualBody && expectedBody)) {\n                        _LogResult(@\"  Bodies not matching:\\n    Expected: %lu bytes\\n      Actual: %lu bytes\", (unsigned long)expectedBody.length, (unsigned long)actualBody.length);\n                        success = NO;\n#if !TARGET_OS_IPHONE\n#if DEBUG\n                        if (GCDWebServerIsTextContentType((NSString*)[expectedHeaders objectForKey:@\"Content-Type\"])) {\n                          NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@\"txt\"]];\n                          NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:(NSString*)[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@\"txt\"]];\n                          if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) {\n                            NSTask* task = [[NSTask alloc] init];\n                            [task setLaunchPath:@\"/usr/bin/opendiff\"];\n                            [task setArguments:@[ expectedPath, actualPath ]];\n                            [task launch];\n                          }\n                        }\n#endif\n#endif\n                      }\n\n                      CFRelease(actualResponse);\n                    }\n                    CFRelease(expectedResponse);\n                  }\n                } else {\n                  GWS_DNOT_REACHED();\n                }\n                break;\n              }\n            }\n            CFRelease(request);\n          }\n        } else {\n          GWS_DNOT_REACHED();\n        }\n        _LogResult(@\"\");\n        if (!success) {\n          ++result;\n        }\n      }\n      _ExecuteMainThreadRunLoopSources();\n    }\n\n    [self stop];\n\n    _ExecuteMainThreadRunLoopSources();\n  }\n  return result;\n}\n\n@end\n\n#endif\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServer.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class GCDWebServerHandler;\n\n/**\n *  The GCDWebServerConnection class is instantiated by GCDWebServer to handle\n *  each new HTTP connection. Each instance stays alive until the connection is\n *  closed.\n *\n *  You cannot use this class directly, but it is made public so you can\n *  subclass it to override some hooks. Use the GCDWebServerOption_ConnectionClass\n *  option for GCDWebServer to install your custom subclass.\n *\n *  @warning The GCDWebServerConnection retains the GCDWebServer until the\n *  connection is closed.\n */\n@interface GCDWebServerConnection : NSObject\n\n/**\n *  Returns the GCDWebServer that owns the connection.\n */\n@property(nonatomic, readonly) GCDWebServer* server;\n\n/**\n *  Returns YES if the connection is using IPv6.\n */\n@property(nonatomic, readonly, getter=isUsingIPv6) BOOL usingIPv6;\n\n/**\n *  Returns the address of the local peer (i.e. server) of the connection\n *  as a raw \"struct sockaddr\".\n */\n@property(nonatomic, readonly) NSData* localAddressData;\n\n/**\n *  Returns the address of the local peer (i.e. server) of the connection\n *  as a string.\n */\n@property(nonatomic, readonly) NSString* localAddressString;\n\n/**\n *  Returns the address of the remote peer (i.e. client) of the connection\n *  as a raw \"struct sockaddr\".\n */\n@property(nonatomic, readonly) NSData* remoteAddressData;\n\n/**\n *  Returns the address of the remote peer (i.e. client) of the connection\n *  as a string.\n */\n@property(nonatomic, readonly) NSString* remoteAddressString;\n\n/**\n *  Returns the total number of bytes received from the remote peer (i.e. client)\n *  so far.\n */\n@property(nonatomic, readonly) NSUInteger totalBytesRead;\n\n/**\n *  Returns the total number of bytes sent to the remote peer (i.e. client) so far.\n */\n@property(nonatomic, readonly) NSUInteger totalBytesWritten;\n\n@end\n\n/**\n *  Hooks to customize the behavior of GCDWebServer HTTP connections.\n *\n *  @warning These methods can be called on any GCD thread.\n *  Be sure to also call \"super\" when overriding them.\n */\n@interface GCDWebServerConnection (Subclassing)\n\n/**\n *  This method is called when the connection is opened.\n *\n *  Return NO to reject the connection e.g. after validating the local\n *  or remote address.\n */\n- (BOOL)open;\n\n/**\n *  This method is called whenever data has been received\n *  from the remote peer (i.e. client).\n *\n *  @warning Do not attempt to modify this data.\n */\n- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length;\n\n/**\n *  This method is called whenever data has been sent\n *  to the remote peer (i.e. client).\n *\n *  @warning Do not attempt to modify this data.\n */\n- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length;\n\n/**\n *  This method is called after the HTTP headers have been received to\n *  allow replacing the request URL by another one.\n *\n *  The default implementation returns the original URL.\n */\n- (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NSDictionary<NSString*, NSString*>*)headers;\n\n/**\n *  Assuming a valid HTTP request was received, this method is called before\n *  the request is processed.\n *\n *  Return a non-nil GCDWebServerResponse to bypass the request processing entirely.\n *\n *  The default implementation checks for HTTP authentication if applicable\n *  and returns a barebone 401 status code response if authentication failed.\n */\n- (nullable GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request;\n\n/**\n *  Assuming a valid HTTP request was received and -preflightRequest: returned nil,\n *  this method is called to process the request by executing the handler's\n *  process block.\n */\n- (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion;\n\n/**\n *  Assuming a valid HTTP request was received and either -preflightRequest:\n *  or -processRequest:completion: returned a non-nil GCDWebServerResponse,\n *  this method is called to override the response.\n *\n *  You can either modify the current response and return it, or return a\n *  completely new one.\n *\n *  The default implementation replaces any response matching the \"ETag\" or\n *  \"Last-Modified-Date\" header of the request by a barebone \"Not-Modified\" (304)\n *  one.\n */\n- (GCDWebServerResponse*)overrideResponse:(GCDWebServerResponse*)response forRequest:(GCDWebServerRequest*)request;\n\n/**\n *  This method is called if any error happens while validing or processing\n *  the request or if no GCDWebServerResponse was generated during processing.\n *\n *  @warning If the request was invalid (e.g. the HTTP headers were malformed),\n *  the \"request\" argument will be nil.\n */\n- (void)abortRequest:(nullable GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode;\n\n/**\n *  Called when the connection is closed.\n */\n- (void)close;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerConnection.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <TargetConditionals.h>\n#import <netdb.h>\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n#import <libkern/OSAtomic.h>\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n#define kHeadersReadCapacity (1 * 1024)\n#define kBodyReadCapacity (256 * 1024)\n\ntypedef void (^ReadDataCompletionBlock)(BOOL success);\ntypedef void (^ReadHeadersCompletionBlock)(NSData* extraData);\ntypedef void (^ReadBodyCompletionBlock)(BOOL success);\n\ntypedef void (^WriteDataCompletionBlock)(BOOL success);\ntypedef void (^WriteHeadersCompletionBlock)(BOOL success);\ntypedef void (^WriteBodyCompletionBlock)(BOOL success);\n\nstatic NSData* _CRLFData = nil;\nstatic NSData* _CRLFCRLFData = nil;\nstatic NSData* _continueData = nil;\nstatic NSData* _lastChunkData = nil;\nstatic NSString* _digestAuthenticationNonce = nil;\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\nstatic int32_t _connectionCounter = 0;\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface GCDWebServerConnection (Read)\n- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block;\n- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block;\n- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block;\n- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block;\n@end\n\n@interface GCDWebServerConnection (Write)\n- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block;\n- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block;\n- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block;\n@end\n\nNS_ASSUME_NONNULL_END\n\n@implementation GCDWebServerConnection {\n  CFSocketNativeHandle _socket;\n  BOOL _virtualHEAD;\n\n  CFHTTPMessageRef _requestMessage;\n  GCDWebServerRequest* _request;\n  GCDWebServerHandler* _handler;\n  CFHTTPMessageRef _responseMessage;\n  GCDWebServerResponse* _response;\n  NSInteger _statusCode;\n\n  BOOL _opened;\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  NSUInteger _connectionIndex;\n  NSString* _requestPath;\n  int _requestFD;\n  NSString* _responsePath;\n  int _responseFD;\n#endif\n}\n\n+ (void)initialize {\n  if (_CRLFData == nil) {\n    _CRLFData = [[NSData alloc] initWithBytes:\"\\r\\n\" length:2];\n    GWS_DCHECK(_CRLFData);\n  }\n  if (_CRLFCRLFData == nil) {\n    _CRLFCRLFData = [[NSData alloc] initWithBytes:\"\\r\\n\\r\\n\" length:4];\n    GWS_DCHECK(_CRLFCRLFData);\n  }\n  if (_continueData == nil) {\n    CFHTTPMessageRef message = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 100, NULL, kCFHTTPVersion1_1);\n    _continueData = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(message));\n    CFRelease(message);\n    GWS_DCHECK(_continueData);\n  }\n  if (_lastChunkData == nil) {\n    _lastChunkData = [[NSData alloc] initWithBytes:\"0\\r\\n\\r\\n\" length:5];\n  }\n  if (_digestAuthenticationNonce == nil) {\n    CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);\n    _digestAuthenticationNonce = GCDWebServerComputeMD5Digest(@\"%@\", CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, uuid)));\n    CFRelease(uuid);\n  }\n}\n\n- (BOOL)isUsingIPv6 {\n  const struct sockaddr* localSockAddr = _localAddressData.bytes;\n  return (localSockAddr->sa_family == AF_INET6);\n}\n\n- (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {\n  _statusCode = statusCode;\n  _responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);\n  CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Connection\"), CFSTR(\"Close\"));\n  CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Server\"), (__bridge CFStringRef)_server.serverName);\n  CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Date\"), (__bridge CFStringRef)GCDWebServerFormatRFC822([NSDate date]));\n}\n\n- (void)_startProcessingRequest {\n  GWS_DCHECK(_responseMessage == NULL);\n\n  GCDWebServerResponse* preflightResponse = [self preflightRequest:_request];\n  if (preflightResponse) {\n    [self _finishProcessingRequest:preflightResponse];\n  } else {\n    [self processRequest:_request\n              completion:^(GCDWebServerResponse* processResponse) {\n                [self _finishProcessingRequest:processResponse];\n              }];\n  }\n}\n\n// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n- (void)_finishProcessingRequest:(GCDWebServerResponse*)response {\n  GWS_DCHECK(_responseMessage == NULL);\n  BOOL hasBody = NO;\n\n  if (response) {\n    response = [self overrideResponse:response forRequest:_request];\n  }\n  if (response) {\n    if ([response hasBody]) {\n      [response prepareForReading];\n      hasBody = !_virtualHEAD;\n    }\n    NSError* error = nil;\n    if (hasBody && ![response performOpen:&error]) {\n      GWS_LOG_ERROR(@\"Failed opening response body for socket %i: %@\", _socket, error);\n    } else {\n      _response = response;\n    }\n  }\n\n  if (_response) {\n    [self _initializeResponseHeadersWithStatusCode:_response.statusCode];\n    if (_response.lastModifiedDate) {\n      CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Last-Modified\"), (__bridge CFStringRef)GCDWebServerFormatRFC822((NSDate*)_response.lastModifiedDate));\n    }\n    if (_response.eTag) {\n      CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"ETag\"), (__bridge CFStringRef)_response.eTag);\n    }\n    if ((_response.statusCode >= 200) && (_response.statusCode < 300)) {\n      if (_response.cacheControlMaxAge > 0) {\n        CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Cache-Control\"), (__bridge CFStringRef)[NSString stringWithFormat:@\"max-age=%i, public\", (int)_response.cacheControlMaxAge]);\n      } else {\n        CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Cache-Control\"), CFSTR(\"no-cache\"));\n      }\n    }\n    if (_response.contentType != nil) {\n      CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Content-Type\"), (__bridge CFStringRef)GCDWebServerNormalizeHeaderValue(_response.contentType));\n    }\n    if (_response.contentLength != NSUIntegerMax) {\n      CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Content-Length\"), (__bridge CFStringRef)[NSString stringWithFormat:@\"%lu\", (unsigned long)_response.contentLength]);\n    }\n    if (_response.usesChunkedTransferEncoding) {\n      CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR(\"Transfer-Encoding\"), CFSTR(\"chunked\"));\n    }\n    [_response.additionalHeaders enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL* stop) {\n      CFHTTPMessageSetHeaderFieldValue(self->_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);\n    }];\n    [self writeHeadersWithCompletionBlock:^(BOOL success) {\n      if (success) {\n        if (hasBody) {\n          [self writeBodyWithCompletionBlock:^(BOOL successInner) {\n            [self->_response performClose];  // TODO: There's nothing we can do on failure as headers have already been sent\n          }];\n        }\n      } else if (hasBody) {\n        [self->_response performClose];\n      }\n    }];\n  } else {\n    [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n  }\n}\n\n- (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData {\n  NSError* error = nil;\n  if (![_request performOpen:&error]) {\n    GWS_LOG_ERROR(@\"Failed opening request body for socket %i: %@\", _socket, error);\n    [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n    return;\n  }\n\n  if (initialData.length) {\n    if (![_request performWriteData:initialData error:&error]) {\n      GWS_LOG_ERROR(@\"Failed writing request body on socket %i: %@\", _socket, error);\n      if (![_request performClose:&error]) {\n        GWS_LOG_ERROR(@\"Failed closing request body for socket %i: %@\", _socket, error);\n      }\n      [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n      return;\n    }\n    length -= initialData.length;\n  }\n\n  if (length) {\n    [self readBodyWithRemainingLength:length\n                      completionBlock:^(BOOL success) {\n                        NSError* localError = nil;\n                        if ([self->_request performClose:&localError]) {\n                          [self _startProcessingRequest];\n                        } else {\n                          GWS_LOG_ERROR(@\"Failed closing request body for socket %i: %@\", self->_socket, error);\n                          [self abortRequest:self->_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n                        }\n                      }];\n  } else {\n    if ([_request performClose:&error]) {\n      [self _startProcessingRequest];\n    } else {\n      GWS_LOG_ERROR(@\"Failed closing request body for socket %i: %@\", _socket, error);\n      [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n    }\n  }\n}\n\n- (void)_readChunkedBodyWithInitialData:(NSData*)initialData {\n  NSError* error = nil;\n  if (![_request performOpen:&error]) {\n    GWS_LOG_ERROR(@\"Failed opening request body for socket %i: %@\", _socket, error);\n    [self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n    return;\n  }\n\n  NSMutableData* chunkData = [[NSMutableData alloc] initWithData:initialData];\n  [self readNextBodyChunk:chunkData\n          completionBlock:^(BOOL success) {\n            NSError* localError = nil;\n            if ([self->_request performClose:&localError]) {\n              [self _startProcessingRequest];\n            } else {\n              GWS_LOG_ERROR(@\"Failed closing request body for socket %i: %@\", self->_socket, error);\n              [self abortRequest:self->_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n            }\n          }];\n}\n\n- (void)_readRequestHeaders {\n  _requestMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true);\n  NSMutableData* headersData = [[NSMutableData alloc] initWithCapacity:kHeadersReadCapacity];\n  [self readHeaders:headersData\n      withCompletionBlock:^(NSData* extraData) {\n        if (extraData) {\n          NSString* requestMethod = CFBridgingRelease(CFHTTPMessageCopyRequestMethod(self->_requestMessage));  // Method verbs are case-sensitive and uppercase\n          if (self->_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString:@\"HEAD\"]) {\n            requestMethod = @\"GET\";\n            self->_virtualHEAD = YES;\n          }\n          NSDictionary* requestHeaders = CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(self->_requestMessage));  // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones\n          NSURL* requestURL = CFBridgingRelease(CFHTTPMessageCopyRequestURL(self->_requestMessage));\n          if (requestURL) {\n            requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders];\n            GWS_DCHECK(requestURL);\n          }\n          NSString* urlPath = requestURL ? CFBridgingRelease(CFURLCopyPath((CFURLRef)requestURL)) : nil;  // Don't use -[NSURL path] which strips the ending slash\n          if (urlPath == nil) {\n            urlPath = @\"/\";  // CFURLCopyPath() returns NULL for a relative URL with path \"//\" contrary to -[NSURL path] which returns \"/\"\n          }\n          NSString* requestPath = urlPath ? GCDWebServerUnescapeURLString(urlPath) : nil;\n          NSString* queryString = requestURL ? CFBridgingRelease(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil;  // Don't use -[NSURL query] to make sure query is not unescaped;\n          NSDictionary* requestQuery = queryString ? GCDWebServerParseURLEncodedForm(queryString) : @{};\n          if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) {\n            for (self->_handler in self->_server.handlers) {\n              self->_request = self->_handler.matchBlock(requestMethod, requestURL, requestHeaders, requestPath, requestQuery);\n              if (self->_request) {\n                break;\n              }\n            }\n            if (self->_request) {\n              self->_request.localAddressData = self.localAddressData;\n              self->_request.remoteAddressData = self.remoteAddressData;\n              if ([self->_request hasBody]) {\n                [self->_request prepareForWriting];\n                if (self->_request.usesChunkedTransferEncoding || (extraData.length <= self->_request.contentLength)) {\n                  NSString* expectHeader = [requestHeaders objectForKey:@\"Expect\"];\n                  if (expectHeader) {\n                    if ([expectHeader caseInsensitiveCompare:@\"100-continue\"] == NSOrderedSame) {  // TODO: Actually validate request before continuing\n                      [self writeData:_continueData\n                          withCompletionBlock:^(BOOL success) {\n                            if (success) {\n                              if (self->_request.usesChunkedTransferEncoding) {\n                                [self _readChunkedBodyWithInitialData:extraData];\n                              } else {\n                                [self _readBodyWithLength:self->_request.contentLength initialData:extraData];\n                              }\n                            }\n                          }];\n                    } else {\n                      GWS_LOG_ERROR(@\"Unsupported 'Expect' / 'Content-Length' header combination on socket %i\", self->_socket);\n                      [self abortRequest:self->_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed];\n                    }\n                  } else {\n                    if (self->_request.usesChunkedTransferEncoding) {\n                      [self _readChunkedBodyWithInitialData:extraData];\n                    } else {\n                      [self _readBodyWithLength:self->_request.contentLength initialData:extraData];\n                    }\n                  }\n                } else {\n                  GWS_LOG_ERROR(@\"Unexpected 'Content-Length' header value on socket %i\", self->_socket);\n                  [self abortRequest:self->_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest];\n                }\n              } else {\n                [self _startProcessingRequest];\n              }\n            } else {\n              self->_request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery];\n              GWS_DCHECK(self->_request);\n              [self abortRequest:self->_request withStatusCode:kGCDWebServerHTTPStatusCode_NotImplemented];\n            }\n          } else {\n            [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n            GWS_DNOT_REACHED();\n          }\n        } else {\n          [self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];\n        }\n      }];\n}\n\n- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket {\n  if ((self = [super init])) {\n    _server = server;\n    _localAddressData = localAddress;\n    _remoteAddressData = remoteAddress;\n    _socket = socket;\n    GWS_LOG_DEBUG(@\"Did open connection on socket %i\", _socket);\n\n    [_server willStartConnection:self];\n\n    if (![self open]) {\n      close(_socket);\n      return nil;\n    }\n    _opened = YES;\n\n    [self _readRequestHeaders];\n  }\n  return self;\n}\n\n- (NSString*)localAddressString {\n  return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES);\n}\n\n- (NSString*)remoteAddressString {\n  return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES);\n}\n\n- (void)dealloc {\n  int result = close(_socket);\n  if (result != 0) {\n    GWS_LOG_ERROR(@\"Failed closing socket %i for connection: %s (%i)\", _socket, strerror(errno), errno);\n  } else {\n    GWS_LOG_DEBUG(@\"Did close connection on socket %i\", _socket);\n  }\n\n  if (_opened) {\n    [self close];\n  }\n\n  [_server didEndConnection:self];\n\n  if (_requestMessage) {\n    CFRelease(_requestMessage);\n  }\n\n  if (_responseMessage) {\n    CFRelease(_responseMessage);\n  }\n}\n\n@end\n\n@implementation GCDWebServerConnection (Read)\n\n- (void)readData:(NSMutableData*)data withLength:(NSUInteger)length completionBlock:(ReadDataCompletionBlock)block {\n  dispatch_read(_socket, length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t buffer, int error) {\n    @autoreleasepool {\n      if (error == 0) {\n        size_t size = dispatch_data_get_size(buffer);\n        if (size > 0) {\n          NSUInteger originalLength = data.length;\n          dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {\n            [data appendBytes:chunkBytes length:chunkSize];\n            return true;\n          });\n          [self didReadBytes:((char*)data.bytes + originalLength) length:(data.length - originalLength)];\n          block(YES);\n        } else {\n          if (self->_totalBytesRead > 0) {\n            GWS_LOG_ERROR(@\"No more data available on socket %i\", self->_socket);\n          } else {\n            GWS_LOG_WARNING(@\"No data received from socket %i\", self->_socket);\n          }\n          block(NO);\n        }\n      } else {\n        GWS_LOG_ERROR(@\"Error while reading from socket %i: %s (%i)\", self->_socket, strerror(error), error);\n        block(NO);\n      }\n    }\n  });\n}\n\n- (void)readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block {\n  GWS_DCHECK(_requestMessage);\n  [self readData:headersData\n           withLength:NSUIntegerMax\n      completionBlock:^(BOOL success) {\n        if (success) {\n          NSRange range = [headersData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, headersData.length)];\n          if (range.location == NSNotFound) {\n            [self readHeaders:headersData withCompletionBlock:block];\n          } else {\n            NSUInteger length = range.location + range.length;\n            if (CFHTTPMessageAppendBytes(self->_requestMessage, headersData.bytes, length)) {\n              if (CFHTTPMessageIsHeaderComplete(self->_requestMessage)) {\n                block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]);\n              } else {\n                GWS_LOG_ERROR(@\"Failed parsing request headers from socket %i\", self->_socket);\n                block(nil);\n              }\n            } else {\n              GWS_LOG_ERROR(@\"Failed appending request headers data from socket %i\", self->_socket);\n              block(nil);\n            }\n          }\n        } else {\n          block(nil);\n        }\n      }];\n}\n\n- (void)readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block {\n  GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]);\n  NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity];\n  [self readData:bodyData\n           withLength:length\n      completionBlock:^(BOOL success) {\n        if (success) {\n          if (bodyData.length <= length) {\n            NSError* error = nil;\n            if ([self->_request performWriteData:bodyData error:&error]) {\n              NSUInteger remainingLength = length - bodyData.length;\n              if (remainingLength) {\n                [self readBodyWithRemainingLength:remainingLength completionBlock:block];\n              } else {\n                block(YES);\n              }\n            } else {\n              GWS_LOG_ERROR(@\"Failed writing request body on socket %i: %@\", self->_socket, error);\n              block(NO);\n            }\n          } else {\n            GWS_LOG_ERROR(@\"Unexpected extra content reading request body on socket %i\", self->_socket);\n            block(NO);\n            GWS_DNOT_REACHED();\n          }\n        } else {\n          block(NO);\n        }\n      }];\n}\n\nstatic inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {\n  char buffer[size + 1];\n  bcopy(bytes, buffer, size);\n  buffer[size] = 0;\n  char* end = NULL;\n  long result = strtol(buffer, &end, 16);\n  return ((end != NULL) && (*end == 0) && (result >= 0) ? result : NSNotFound);\n}\n\n- (void)readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block {\n  GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]);\n\n  while (1) {\n    NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)];\n    if (range.location == NSNotFound) {\n      break;\n    }\n    NSRange extensionRange = [chunkData rangeOfData:[NSData dataWithBytes:\";\" length:1] options:0 range:NSMakeRange(0, range.location)];  // Ignore chunk extensions\n    NSUInteger length = _ScanHexNumber((char*)chunkData.bytes, extensionRange.location != NSNotFound ? extensionRange.location : range.location);\n    if (length != NSNotFound) {\n      if (length) {\n        if (chunkData.length < range.location + range.length + length + 2) {\n          break;\n        }\n        const char* ptr = (char*)chunkData.bytes + range.location + range.length + length;\n        if ((*ptr == '\\r') && (*(ptr + 1) == '\\n')) {\n          NSError* error = nil;\n          if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) {\n            [chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0];\n          } else {\n            GWS_LOG_ERROR(@\"Failed writing request body on socket %i: %@\", _socket, error);\n            block(NO);\n            return;\n          }\n        } else {\n          GWS_LOG_ERROR(@\"Missing terminating CRLF sequence for chunk reading request body on socket %i\", _socket);\n          block(NO);\n          return;\n        }\n      } else {\n        NSRange trailerRange = [chunkData rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(range.location, chunkData.length - range.location)];  // Ignore trailers\n        if (trailerRange.location != NSNotFound) {\n          block(YES);\n          return;\n        }\n      }\n    } else {\n      GWS_LOG_ERROR(@\"Invalid chunk length reading request body on socket %i\", _socket);\n      block(NO);\n      return;\n    }\n  }\n\n  [self readData:chunkData\n           withLength:NSUIntegerMax\n      completionBlock:^(BOOL success) {\n        if (success) {\n          [self readNextBodyChunk:chunkData completionBlock:block];\n        } else {\n          block(NO);\n        }\n      }];\n}\n\n@end\n\n@implementation GCDWebServerConnection (Write)\n\n- (void)writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)block {\n  dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^{\n    [data self];  // Keeps ARC from releasing data too early\n  });\n  dispatch_write(_socket, buffer, dispatch_get_global_queue(_server.dispatchQueuePriority, 0), ^(dispatch_data_t remainingData, int error) {\n    @autoreleasepool {\n      if (error == 0) {\n        GWS_DCHECK(remainingData == NULL);\n        [self didWriteBytes:data.bytes length:data.length];\n        block(YES);\n      } else {\n        GWS_LOG_ERROR(@\"Error while writing to socket %i: %s (%i)\", self->_socket, strerror(error), error);\n        block(NO);\n      }\n    }\n  });\n#if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE\n  dispatch_release(buffer);\n#endif\n}\n\n- (void)writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {\n  GWS_DCHECK(_responseMessage);\n  CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage);\n  [self writeData:(__bridge NSData*)data withCompletionBlock:block];\n  CFRelease(data);\n}\n\n- (void)writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block {\n  GWS_DCHECK([_response hasBody]);\n  [_response performReadDataWithCompletion:^(NSData* data, NSError* error) {\n    if (data) {\n      if (data.length) {\n        if (self->_response.usesChunkedTransferEncoding) {\n          const char* hexString = [[NSString stringWithFormat:@\"%lx\", (unsigned long)data.length] UTF8String];\n          size_t hexLength = strlen(hexString);\n          NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)];\n          if (chunk == nil) {\n            GWS_LOG_ERROR(@\"Failed allocating memory for response body chunk for socket %i: %@\", self->_socket, error);\n            block(NO);\n            return;\n          }\n          char* ptr = (char*)[(NSMutableData*)chunk mutableBytes];\n          bcopy(hexString, ptr, hexLength);\n          ptr += hexLength;\n          *ptr++ = '\\r';\n          *ptr++ = '\\n';\n          bcopy(data.bytes, ptr, data.length);\n          ptr += data.length;\n          *ptr++ = '\\r';\n          *ptr = '\\n';\n          data = chunk;\n        }\n        [self writeData:data\n            withCompletionBlock:^(BOOL success) {\n              if (success) {\n                [self writeBodyWithCompletionBlock:block];\n              } else {\n                block(NO);\n              }\n            }];\n      } else {\n        if (self->_response.usesChunkedTransferEncoding) {\n          [self writeData:_lastChunkData\n              withCompletionBlock:^(BOOL success) {\n                block(success);\n              }];\n        } else {\n          block(YES);\n        }\n      }\n    } else {\n      GWS_LOG_ERROR(@\"Failed reading response body for socket %i: %@\", self->_socket, error);\n      block(NO);\n    }\n  }];\n}\n\n@end\n\n@implementation GCDWebServerConnection (Subclassing)\n\n- (BOOL)open {\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  if (_server.recordingEnabled) {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n    _connectionIndex = OSAtomicIncrement32(&_connectionCounter);\n#pragma clang diagnostic pop\n\n    _requestPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];\n    _requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);\n    GWS_DCHECK(_requestFD > 0);\n\n    _responsePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];\n    _responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);\n    GWS_DCHECK(_responseFD > 0);\n  }\n#endif\n\n  return YES;\n}\n\n- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length {\n  GWS_LOG_DEBUG(@\"Connection received %lu bytes on socket %i\", (unsigned long)length, _socket);\n  _totalBytesRead += length;\n\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) {\n    GWS_LOG_ERROR(@\"Failed recording request data: %s (%i)\", strerror(errno), errno);\n    close(_requestFD);\n    _requestFD = 0;\n  }\n#endif\n}\n\n- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length {\n  GWS_LOG_DEBUG(@\"Connection sent %lu bytes on socket %i\", (unsigned long)length, _socket);\n  _totalBytesWritten += length;\n\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) {\n    GWS_LOG_ERROR(@\"Failed recording response data: %s (%i)\", strerror(errno), errno);\n    close(_responseFD);\n    _responseFD = 0;\n  }\n#endif\n}\n\n- (NSURL*)rewriteRequestURL:(NSURL*)url withMethod:(NSString*)method headers:(NSDictionary<NSString*, NSString*>*)headers {\n  return url;\n}\n\n// https://tools.ietf.org/html/rfc2617\n- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request {\n  GWS_LOG_DEBUG(@\"Connection on socket %i preflighting request \\\"%@ %@\\\" with %lu bytes body\", _socket, _virtualHEAD ? @\"HEAD\" : _request.method, _request.path, (unsigned long)_totalBytesRead);\n  GCDWebServerResponse* response = nil;\n  if (_server.authenticationBasicAccounts) {\n    __block BOOL authenticated = NO;\n    NSString* authorizationHeader = [request.headers objectForKey:@\"Authorization\"];\n    if ([authorizationHeader hasPrefix:@\"Basic \"]) {\n      NSString* basicAccount = [authorizationHeader substringFromIndex:6];\n      [_server.authenticationBasicAccounts enumerateKeysAndObjectsUsingBlock:^(NSString* username, NSString* digest, BOOL* stop) {\n        if ([basicAccount isEqualToString:digest]) {\n          authenticated = YES;\n          *stop = YES;\n        }\n      }];\n    }\n    if (!authenticated) {\n      response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Unauthorized];\n      [response setValue:[NSString stringWithFormat:@\"Basic realm=\\\"%@\\\"\", _server.authenticationRealm] forAdditionalHeader:@\"WWW-Authenticate\"];\n    }\n  } else if (_server.authenticationDigestAccounts) {\n    BOOL authenticated = NO;\n    BOOL isStaled = NO;\n    NSString* authorizationHeader = [request.headers objectForKey:@\"Authorization\"];\n    if ([authorizationHeader hasPrefix:@\"Digest \"]) {\n      NSString* realm = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @\"realm\");\n      if (realm && [_server.authenticationRealm isEqualToString:realm]) {\n        NSString* nonce = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @\"nonce\");\n        if ([nonce isEqualToString:_digestAuthenticationNonce]) {\n          NSString* username = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @\"username\");\n          NSString* uri = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @\"uri\");\n          NSString* actualResponse = GCDWebServerExtractHeaderValueParameter(authorizationHeader, @\"response\");\n          NSString* ha1 = [_server.authenticationDigestAccounts objectForKey:username];\n          NSString* ha2 = GCDWebServerComputeMD5Digest(@\"%@:%@\", request.method, uri);  // We cannot use \"request.path\" as the query string is required\n          NSString* expectedResponse = GCDWebServerComputeMD5Digest(@\"%@:%@:%@\", ha1, _digestAuthenticationNonce, ha2);\n          if ([actualResponse isEqualToString:expectedResponse]) {\n            authenticated = YES;\n          }\n        } else if (nonce.length) {\n          isStaled = YES;\n        }\n      }\n    }\n    if (!authenticated) {\n      response = [GCDWebServerResponse responseWithStatusCode:kGCDWebServerHTTPStatusCode_Unauthorized];\n      [response setValue:[NSString stringWithFormat:@\"Digest realm=\\\"%@\\\", nonce=\\\"%@\\\"%@\", _server.authenticationRealm, _digestAuthenticationNonce, isStaled ? @\", stale=TRUE\" : @\"\"] forAdditionalHeader:@\"WWW-Authenticate\"];  // TODO: Support Quality of Protection (\"qop\")\n    }\n  }\n  return response;\n}\n\n- (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion {\n  GWS_LOG_DEBUG(@\"Connection on socket %i processing request \\\"%@ %@\\\" with %lu bytes body\", _socket, _virtualHEAD ? @\"HEAD\" : _request.method, _request.path, (unsigned long)_totalBytesRead);\n  _handler.asyncProcessBlock(request, [completion copy]);\n}\n\n// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25\n// http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26\nstatic inline BOOL _CompareResources(NSString* responseETag, NSString* requestETag, NSDate* responseLastModified, NSDate* requestLastModified) {\n  if (requestLastModified && responseLastModified) {\n    if ([responseLastModified compare:requestLastModified] != NSOrderedDescending) {\n      return YES;\n    }\n  }\n  if (requestETag && responseETag) {  // Per the specs \"If-None-Match\" must be checked after \"If-Modified-Since\"\n    if ([requestETag isEqualToString:@\"*\"]) {\n      return YES;\n    }\n    if ([responseETag isEqualToString:requestETag]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n- (GCDWebServerResponse*)overrideResponse:(GCDWebServerResponse*)response forRequest:(GCDWebServerRequest*)request {\n  if ((response.statusCode >= 200) && (response.statusCode < 300) && _CompareResources(response.eTag, request.ifNoneMatch, response.lastModifiedDate, request.ifModifiedSince)) {\n    NSInteger code = [request.method isEqualToString:@\"HEAD\"] || [request.method isEqualToString:@\"GET\"] ? kGCDWebServerHTTPStatusCode_NotModified : kGCDWebServerHTTPStatusCode_PreconditionFailed;\n    GCDWebServerResponse* newResponse = [GCDWebServerResponse responseWithStatusCode:code];\n    newResponse.cacheControlMaxAge = response.cacheControlMaxAge;\n    newResponse.lastModifiedDate = response.lastModifiedDate;\n    newResponse.eTag = response.eTag;\n    GWS_DCHECK(newResponse);\n    return newResponse;\n  }\n  return response;\n}\n\n- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode {\n  GWS_DCHECK(_responseMessage == NULL);\n  GWS_DCHECK((statusCode >= 400) && (statusCode < 600));\n  [self _initializeResponseHeadersWithStatusCode:statusCode];\n  [self writeHeadersWithCompletionBlock:^(BOOL success){\n      // Nothing more to do\n  }];\n  GWS_LOG_DEBUG(@\"Connection aborted with status code %i on socket %i\", (int)statusCode, _socket);\n}\n\n- (void)close {\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  if (_requestPath) {\n    BOOL success = NO;\n    NSError* error = nil;\n    if (_requestFD > 0) {\n      close(_requestFD);\n      NSString* name = [NSString stringWithFormat:@\"%03lu-%@.request\", (unsigned long)_connectionIndex, _virtualHEAD ? @\"HEAD\" : _request.method];\n      success = [[NSFileManager defaultManager] moveItemAtPath:_requestPath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];\n    }\n    if (!success) {\n      GWS_LOG_ERROR(@\"Failed saving recorded request: %@\", error);\n      GWS_DNOT_REACHED();\n    }\n    unlink([_requestPath fileSystemRepresentation]);\n  }\n\n  if (_responsePath) {\n    BOOL success = NO;\n    NSError* error = nil;\n    if (_responseFD > 0) {\n      close(_responseFD);\n      NSString* name = [NSString stringWithFormat:@\"%03lu-%i.response\", (unsigned long)_connectionIndex, (int)_statusCode];\n      success = [[NSFileManager defaultManager] moveItemAtPath:_responsePath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];\n    }\n    if (!success) {\n      GWS_LOG_ERROR(@\"Failed saving recorded response: %@\", error);\n      GWS_DNOT_REACHED();\n    }\n    unlink([_responsePath fileSystemRepresentation]);\n  }\n#endif\n\n  if (_request) {\n    GWS_LOG_VERBOSE(@\"[%@] %@ %i \\\"%@ %@\\\" (%lu | %lu)\", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @\"HEAD\" : _request.method, _request.path, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten);\n  } else {\n    GWS_LOG_VERBOSE(@\"[%@] %@ %i \\\"(invalid request)\\\" (%lu | %lu)\", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_totalBytesRead, (unsigned long)_totalBytesWritten);\n  }\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n *  Converts a file extension to the corresponding MIME type.\n *  If there is no match, \"application/octet-stream\" is returned.\n *\n *  Overrides allow to customize the built-in mapping from extensions to MIME\n *  types. Keys of the dictionary must be lowercased file extensions without\n *  the period, and the values must be the corresponding MIME types.\n */\nNSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary<NSString*, NSString*>* _Nullable overrides);\n\n/**\n *  Add percent-escapes to a string so it can be used in a URL.\n *  The legal characters \":@/?&=+\" are also escaped to ensure compatibility\n *  with URL encoded forms and URL queries.\n */\nNSString* _Nullable GCDWebServerEscapeURLString(NSString* string);\n\n/**\n *  Unescapes a URL percent-encoded string.\n */\nNSString* _Nullable GCDWebServerUnescapeURLString(NSString* string);\n\n/**\n *  Extracts the unescaped names and values from an\n *  \"application/x-www-form-urlencoded\" form.\n *  http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n */\nNSDictionary<NSString*, NSString*>* GCDWebServerParseURLEncodedForm(NSString* form);\n\n/**\n *  On OS X, returns the IPv4 or IPv6 address as a string of the primary\n *  connected service or nil if not available.\n *  \n *  On iOS, returns the IPv4 or IPv6 address as a string of the WiFi\n *  interface if connected or nil otherwise.\n */\nNSString* _Nullable GCDWebServerGetPrimaryIPAddress(BOOL useIPv6);\n\n/**\n *  Converts a date into a string using RFC822 formatting.\n *  https://tools.ietf.org/html/rfc822#section-5\n *  https://tools.ietf.org/html/rfc1123#section-5.2.14\n */\nNSString* GCDWebServerFormatRFC822(NSDate* date);\n\n/**\n *  Converts a RFC822 formatted string into a date.\n *  https://tools.ietf.org/html/rfc822#section-5\n *  https://tools.ietf.org/html/rfc1123#section-5.2.14\n *\n *  @warning Timezones other than GMT are not supported by this function.\n */\nNSDate* _Nullable GCDWebServerParseRFC822(NSString* string);\n\n/**\n *  Converts a date into a string using IOS 8601 formatting.\n *  http://tools.ietf.org/html/rfc3339#section-5.6\n */\nNSString* GCDWebServerFormatISO8601(NSDate* date);\n\n/**\n *  Converts a ISO 8601 formatted string into a date.\n *  http://tools.ietf.org/html/rfc3339#section-5.6\n *\n *  @warning Only \"calendar\" variant is supported at this time and timezones\n *  other than GMT are not supported either.\n */\nNSDate* _Nullable GCDWebServerParseISO8601(NSString* string);\n\n/**\n *  Removes \"//\", \"/./\" and \"/../\" components from path as well as any trailing slash.\n */\nNSString* GCDWebServerNormalizePath(NSString* path);\n\n#ifdef __cplusplus\n}\n#endif\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerFunctions.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <TargetConditionals.h>\n#if TARGET_OS_IPHONE\n#import <MobileCoreServices/MobileCoreServices.h>\n#else\n#import <SystemConfiguration/SystemConfiguration.h>\n#endif\n#import <CommonCrypto/CommonDigest.h>\n\n#import <ifaddrs.h>\n#import <net/if.h>\n#import <netdb.h>\n\n#import \"GCDWebServerPrivate.h\"\n\nstatic NSDateFormatter* _dateFormatterRFC822 = nil;\nstatic NSDateFormatter* _dateFormatterISO8601 = nil;\nstatic dispatch_queue_t _dateFormatterQueue = NULL;\n\n// TODO: Handle RFC 850 and ANSI C's asctime() format\nvoid GCDWebServerInitializeFunctions() {\n  GWS_DCHECK([NSThread isMainThread]);  // NSDateFormatter should be initialized on main thread\n  if (_dateFormatterRFC822 == nil) {\n    _dateFormatterRFC822 = [[NSDateFormatter alloc] init];\n    _dateFormatterRFC822.timeZone = [NSTimeZone timeZoneWithAbbreviation:@\"GMT\"];\n    _dateFormatterRFC822.dateFormat = @\"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'\";\n    _dateFormatterRFC822.locale = [[NSLocale alloc] initWithLocaleIdentifier:@\"en_US\"];\n    GWS_DCHECK(_dateFormatterRFC822);\n  }\n  if (_dateFormatterISO8601 == nil) {\n    _dateFormatterISO8601 = [[NSDateFormatter alloc] init];\n    _dateFormatterISO8601.timeZone = [NSTimeZone timeZoneWithAbbreviation:@\"GMT\"];\n    _dateFormatterISO8601.dateFormat = @\"yyyy-MM-dd'T'HH:mm:ss'+00:00'\";\n    _dateFormatterISO8601.locale = [[NSLocale alloc] initWithLocaleIdentifier:@\"en_US\"];\n    GWS_DCHECK(_dateFormatterISO8601);\n  }\n  if (_dateFormatterQueue == NULL) {\n    _dateFormatterQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);\n    GWS_DCHECK(_dateFormatterQueue);\n  }\n}\n\nNSString* GCDWebServerNormalizeHeaderValue(NSString* value) {\n  if (value) {\n    NSRange range = [value rangeOfString:@\";\"];  // Assume part before \";\" separator is case-insensitive\n    if (range.location != NSNotFound) {\n      value = [[[value substringToIndex:range.location] lowercaseString] stringByAppendingString:[value substringFromIndex:range.location]];\n    } else {\n      value = [value lowercaseString];\n    }\n  }\n  return value;\n}\n\nNSString* GCDWebServerTruncateHeaderValue(NSString* value) {\n  if (value) {\n    NSRange range = [value rangeOfString:@\";\"];\n    if (range.location != NSNotFound) {\n      return [value substringToIndex:range.location];\n    }\n  }\n  return value;\n}\n\nNSString* GCDWebServerExtractHeaderValueParameter(NSString* value, NSString* name) {\n  NSString* parameter = nil;\n  if (value) {\n    NSScanner* scanner = [[NSScanner alloc] initWithString:value];\n    [scanner setCaseSensitive:NO];  // Assume parameter names are case-insensitive\n    NSString* string = [NSString stringWithFormat:@\"%@=\", name];\n    if ([scanner scanUpToString:string intoString:NULL]) {\n      [scanner scanString:string intoString:NULL];\n      if ([scanner scanString:@\"\\\"\" intoString:NULL]) {\n        [scanner scanUpToString:@\"\\\"\" intoString:&parameter];\n      } else {\n        [scanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:&parameter];\n      }\n    }\n  }\n  return parameter;\n}\n\n// http://www.w3schools.com/tags/ref_charactersets.asp\nNSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset) {\n  NSStringEncoding encoding = kCFStringEncodingInvalidId;\n  if (charset) {\n    encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef)charset));\n  }\n  return (encoding != kCFStringEncodingInvalidId ? encoding : NSUTF8StringEncoding);\n}\n\nNSString* GCDWebServerFormatRFC822(NSDate* date) {\n  __block NSString* string;\n  dispatch_sync(_dateFormatterQueue, ^{\n    string = [_dateFormatterRFC822 stringFromDate:date];\n  });\n  return string;\n}\n\nNSDate* GCDWebServerParseRFC822(NSString* string) {\n  __block NSDate* date;\n  dispatch_sync(_dateFormatterQueue, ^{\n    date = [_dateFormatterRFC822 dateFromString:string];\n  });\n  return date;\n}\n\nNSString* GCDWebServerFormatISO8601(NSDate* date) {\n  __block NSString* string;\n  dispatch_sync(_dateFormatterQueue, ^{\n    string = [_dateFormatterISO8601 stringFromDate:date];\n  });\n  return string;\n}\n\nNSDate* GCDWebServerParseISO8601(NSString* string) {\n  __block NSDate* date;\n  dispatch_sync(_dateFormatterQueue, ^{\n    date = [_dateFormatterISO8601 dateFromString:string];\n  });\n  return date;\n}\n\nBOOL GCDWebServerIsTextContentType(NSString* type) {\n  return ([type hasPrefix:@\"text/\"] || [type hasPrefix:@\"application/json\"] || [type hasPrefix:@\"application/xml\"]);\n}\n\nNSString* GCDWebServerDescribeData(NSData* data, NSString* type) {\n  if (GCDWebServerIsTextContentType(type)) {\n    NSString* charset = GCDWebServerExtractHeaderValueParameter(type, @\"charset\");\n    NSString* string = [[NSString alloc] initWithData:data encoding:GCDWebServerStringEncodingFromCharset(charset)];\n    if (string) {\n      return string;\n    }\n  }\n  return [NSString stringWithFormat:@\"<%lu bytes>\", (unsigned long)data.length];\n}\n\nNSString* GCDWebServerGetMimeTypeForExtension(NSString* extension, NSDictionary<NSString*, NSString*>* overrides) {\n  NSDictionary* builtInOverrides = @{@\"css\" : @\"text/css\"};\n  NSString* mimeType = nil;\n  extension = [extension lowercaseString];\n  if (extension.length) {\n    mimeType = [overrides objectForKey:extension];\n    if (mimeType == nil) {\n      mimeType = [builtInOverrides objectForKey:extension];\n    }\n    if (mimeType == nil) {\n      CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);\n      if (uti) {\n        mimeType = CFBridgingRelease(UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType));\n        CFRelease(uti);\n      }\n    }\n  }\n  return mimeType ? mimeType : kGCDWebServerDefaultMimeType;\n}\n\nNSString* GCDWebServerEscapeURLString(NSString* string) {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n  return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(\":@/?&=+\"), kCFStringEncodingUTF8));\n#pragma clang diagnostic pop\n}\n\nNSString* GCDWebServerUnescapeURLString(NSString* string) {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n  return CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (CFStringRef)string, CFSTR(\"\"), kCFStringEncodingUTF8));\n#pragma clang diagnostic pop\n}\n\nNSDictionary<NSString*, NSString*>* GCDWebServerParseURLEncodedForm(NSString* form) {\n  NSMutableDictionary* parameters = [NSMutableDictionary dictionary];\n  NSScanner* scanner = [[NSScanner alloc] initWithString:form];\n  [scanner setCharactersToBeSkipped:nil];\n  while (1) {\n    NSString* key = nil;\n    if (![scanner scanUpToString:@\"=\" intoString:&key] || [scanner isAtEnd]) {\n      break;\n    }\n    [scanner setScanLocation:([scanner scanLocation] + 1)];\n\n    NSString* value = nil;\n    [scanner scanUpToString:@\"&\" intoString:&value];\n    if (value == nil) {\n      value = @\"\";\n    }\n\n    key = [key stringByReplacingOccurrencesOfString:@\"+\" withString:@\" \"];\n    NSString* unescapedKey = key ? GCDWebServerUnescapeURLString(key) : nil;\n    value = [value stringByReplacingOccurrencesOfString:@\"+\" withString:@\" \"];\n    NSString* unescapedValue = value ? GCDWebServerUnescapeURLString(value) : nil;\n    if (unescapedKey && unescapedValue) {\n      [parameters setObject:unescapedValue forKey:unescapedKey];\n    } else {\n      GWS_LOG_WARNING(@\"Failed parsing URL encoded form for key \\\"%@\\\" and value \\\"%@\\\"\", key, value);\n      GWS_DNOT_REACHED();\n    }\n\n    if ([scanner isAtEnd]) {\n      break;\n    }\n    [scanner setScanLocation:([scanner scanLocation] + 1)];\n  }\n  return parameters;\n}\n\nNSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService) {\n  char hostBuffer[NI_MAXHOST];\n  char serviceBuffer[NI_MAXSERV];\n  if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) != 0) {\n#if DEBUG\n    GWS_DNOT_REACHED();\n#else\n    return @\"\";\n#endif\n  }\n  return includeService ? [NSString stringWithFormat:@\"%s:%s\", hostBuffer, serviceBuffer] : (NSString*)[NSString stringWithUTF8String:hostBuffer];\n}\n\nNSString* GCDWebServerGetPrimaryIPAddress(BOOL useIPv6) {\n  NSString* address = nil;\n#if TARGET_OS_IPHONE\n#if !TARGET_IPHONE_SIMULATOR && !TARGET_OS_TV\n  const char* primaryInterface = \"en0\";  // WiFi interface on iOS\n#endif\n#else\n  const char* primaryInterface = NULL;\n  SCDynamicStoreRef store = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR(\"GCDWebServer\"), NULL, NULL);\n  if (store) {\n    CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR(\"State:/Network/Global/IPv4\"));  // There is no equivalent for IPv6 but the primary interface should be the same\n    if (info) {\n      NSString* interface = [(__bridge NSDictionary*)info objectForKey:@\"PrimaryInterface\"];\n      if (interface) {\n        primaryInterface = [[NSString stringWithString:interface] UTF8String];  // Copy string to auto-release pool\n      }\n      CFRelease(info);\n    }\n    CFRelease(store);\n  }\n  if (primaryInterface == NULL) {\n    primaryInterface = \"lo0\";\n  }\n#endif\n  struct ifaddrs* list;\n  if (getifaddrs(&list) >= 0) {\n    for (struct ifaddrs* ifap = list; ifap; ifap = ifap->ifa_next) {\n#if TARGET_IPHONE_SIMULATOR || TARGET_OS_TV\n      // Assume en0 is Ethernet and en1 is WiFi since there is no way to use SystemConfiguration framework in iOS Simulator\n      // Assumption holds for Apple TV running tvOS\n      if (strcmp(ifap->ifa_name, \"en0\") && strcmp(ifap->ifa_name, \"en1\"))\n#else\n      if (strcmp(ifap->ifa_name, primaryInterface))\n#endif\n      {\n        continue;\n      }\n      if ((ifap->ifa_flags & IFF_UP) && ((!useIPv6 && (ifap->ifa_addr->sa_family == AF_INET)) || (useIPv6 && (ifap->ifa_addr->sa_family == AF_INET6)))) {\n        address = GCDWebServerStringFromSockAddr(ifap->ifa_addr, NO);\n        break;\n      }\n    }\n    freeifaddrs(list);\n  }\n  return address;\n}\n\nNSString* GCDWebServerComputeMD5Digest(NSString* format, ...) {\n  va_list arguments;\n  va_start(arguments, format);\n  const char* string = [[[NSString alloc] initWithFormat:format arguments:arguments] UTF8String];\n  va_end(arguments);\n  unsigned char md5[CC_MD5_DIGEST_LENGTH];\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n  CC_MD5(string, (CC_LONG)strlen(string), md5);\n#pragma clang diagnostic pop\n  char buffer[2 * CC_MD5_DIGEST_LENGTH + 1];\n  for (int i = 0; i < CC_MD5_DIGEST_LENGTH; ++i) {\n    unsigned char byte = md5[i];\n    unsigned char byteHi = (byte & 0xF0) >> 4;\n    buffer[2 * i + 0] = byteHi >= 10 ? 'a' + byteHi - 10 : '0' + byteHi;\n    unsigned char byteLo = byte & 0x0F;\n    buffer[2 * i + 1] = byteLo >= 10 ? 'a' + byteLo - 10 : '0' + byteLo;\n  }\n  buffer[2 * CC_MD5_DIGEST_LENGTH] = 0;\n  return (NSString*)[NSString stringWithUTF8String:buffer];\n}\n\nNSString* GCDWebServerNormalizePath(NSString* path) {\n  NSMutableArray* components = [[NSMutableArray alloc] init];\n  for (NSString* component in [path componentsSeparatedByString:@\"/\"]) {\n    if ([component isEqualToString:@\"..\"]) {\n      [components removeLastObject];\n    } else if (component.length && ![component isEqualToString:@\".\"]) {\n      [components addObject:component];\n    }\n  }\n  if (path.length && ([path characterAtIndex:0] == '/')) {\n    return [@\"/\" stringByAppendingString:[components componentsJoinedByString:@\"/\"]];  // Preserve initial slash\n  }\n  return [components componentsJoinedByString:@\"/\"];\n}\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n// http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml\n\n#import <Foundation/Foundation.h>\n\n/**\n *  Convenience constants for \"informational\" HTTP status codes.\n */\ntypedef NS_ENUM(NSInteger, GCDWebServerInformationalHTTPStatusCode) {\n  kGCDWebServerHTTPStatusCode_Continue = 100,\n  kGCDWebServerHTTPStatusCode_SwitchingProtocols = 101,\n  kGCDWebServerHTTPStatusCode_Processing = 102\n};\n\n/**\n *  Convenience constants for \"successful\" HTTP status codes.\n */\ntypedef NS_ENUM(NSInteger, GCDWebServerSuccessfulHTTPStatusCode) {\n  kGCDWebServerHTTPStatusCode_OK = 200,\n  kGCDWebServerHTTPStatusCode_Created = 201,\n  kGCDWebServerHTTPStatusCode_Accepted = 202,\n  kGCDWebServerHTTPStatusCode_NonAuthoritativeInformation = 203,\n  kGCDWebServerHTTPStatusCode_NoContent = 204,\n  kGCDWebServerHTTPStatusCode_ResetContent = 205,\n  kGCDWebServerHTTPStatusCode_PartialContent = 206,\n  kGCDWebServerHTTPStatusCode_MultiStatus = 207,\n  kGCDWebServerHTTPStatusCode_AlreadyReported = 208\n};\n\n/**\n *  Convenience constants for \"redirection\" HTTP status codes.\n */\ntypedef NS_ENUM(NSInteger, GCDWebServerRedirectionHTTPStatusCode) {\n  kGCDWebServerHTTPStatusCode_MultipleChoices = 300,\n  kGCDWebServerHTTPStatusCode_MovedPermanently = 301,\n  kGCDWebServerHTTPStatusCode_Found = 302,\n  kGCDWebServerHTTPStatusCode_SeeOther = 303,\n  kGCDWebServerHTTPStatusCode_NotModified = 304,\n  kGCDWebServerHTTPStatusCode_UseProxy = 305,\n  kGCDWebServerHTTPStatusCode_TemporaryRedirect = 307,\n  kGCDWebServerHTTPStatusCode_PermanentRedirect = 308\n};\n\n/**\n *  Convenience constants for \"client error\" HTTP status codes.\n */\ntypedef NS_ENUM(NSInteger, GCDWebServerClientErrorHTTPStatusCode) {\n  kGCDWebServerHTTPStatusCode_BadRequest = 400,\n  kGCDWebServerHTTPStatusCode_Unauthorized = 401,\n  kGCDWebServerHTTPStatusCode_PaymentRequired = 402,\n  kGCDWebServerHTTPStatusCode_Forbidden = 403,\n  kGCDWebServerHTTPStatusCode_NotFound = 404,\n  kGCDWebServerHTTPStatusCode_MethodNotAllowed = 405,\n  kGCDWebServerHTTPStatusCode_NotAcceptable = 406,\n  kGCDWebServerHTTPStatusCode_ProxyAuthenticationRequired = 407,\n  kGCDWebServerHTTPStatusCode_RequestTimeout = 408,\n  kGCDWebServerHTTPStatusCode_Conflict = 409,\n  kGCDWebServerHTTPStatusCode_Gone = 410,\n  kGCDWebServerHTTPStatusCode_LengthRequired = 411,\n  kGCDWebServerHTTPStatusCode_PreconditionFailed = 412,\n  kGCDWebServerHTTPStatusCode_RequestEntityTooLarge = 413,\n  kGCDWebServerHTTPStatusCode_RequestURITooLong = 414,\n  kGCDWebServerHTTPStatusCode_UnsupportedMediaType = 415,\n  kGCDWebServerHTTPStatusCode_RequestedRangeNotSatisfiable = 416,\n  kGCDWebServerHTTPStatusCode_ExpectationFailed = 417,\n  kGCDWebServerHTTPStatusCode_UnprocessableEntity = 422,\n  kGCDWebServerHTTPStatusCode_Locked = 423,\n  kGCDWebServerHTTPStatusCode_FailedDependency = 424,\n  kGCDWebServerHTTPStatusCode_UpgradeRequired = 426,\n  kGCDWebServerHTTPStatusCode_PreconditionRequired = 428,\n  kGCDWebServerHTTPStatusCode_TooManyRequests = 429,\n  kGCDWebServerHTTPStatusCode_RequestHeaderFieldsTooLarge = 431\n};\n\n/**\n *  Convenience constants for \"server error\" HTTP status codes.\n */\ntypedef NS_ENUM(NSInteger, GCDWebServerServerErrorHTTPStatusCode) {\n  kGCDWebServerHTTPStatusCode_InternalServerError = 500,\n  kGCDWebServerHTTPStatusCode_NotImplemented = 501,\n  kGCDWebServerHTTPStatusCode_BadGateway = 502,\n  kGCDWebServerHTTPStatusCode_ServiceUnavailable = 503,\n  kGCDWebServerHTTPStatusCode_GatewayTimeout = 504,\n  kGCDWebServerHTTPStatusCode_HTTPVersionNotSupported = 505,\n  kGCDWebServerHTTPStatusCode_InsufficientStorage = 507,\n  kGCDWebServerHTTPStatusCode_LoopDetected = 508,\n  kGCDWebServerHTTPStatusCode_NotExtended = 510,\n  kGCDWebServerHTTPStatusCode_NetworkAuthenticationRequired = 511\n};\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerPrivate.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <os/object.h>\n#import <sys/socket.h>\n\n/**\n *  All GCDWebServer headers.\n */\n\n#import \"GCDWebServerHTTPStatusCodes.h\"\n#import \"GCDWebServerFunctions.h\"\n\n#import \"GCDWebServer.h\"\n#import \"GCDWebServerConnection.h\"\n\n#import \"GCDWebServerDataRequest.h\"\n#import \"GCDWebServerFileRequest.h\"\n#import \"GCDWebServerMultiPartFormRequest.h\"\n#import \"GCDWebServerURLEncodedFormRequest.h\"\n\n#import \"GCDWebServerDataResponse.h\"\n#import \"GCDWebServerErrorResponse.h\"\n#import \"GCDWebServerFileResponse.h\"\n#import \"GCDWebServerStreamedResponse.h\"\n\n/**\n *  Check if a custom logging facility should be used instead.\n */\n\n#if defined(__GCDWEBSERVER_LOGGING_HEADER__)\n\n#define __GCDWEBSERVER_LOGGING_FACILITY_CUSTOM__\n\n#import __GCDWEBSERVER_LOGGING_HEADER__\n\n/**\n *  Automatically detect if XLFacility is available and if so use it as a\n *  logging facility.\n */\n\n#elif defined(__has_include) && __has_include(\"XLFacilityMacros.h\")\n\n#define __GCDWEBSERVER_LOGGING_FACILITY_XLFACILITY__\n\n#undef XLOG_TAG\n#define XLOG_TAG @\"gcdwebserver.internal\"\n\n#import \"XLFacilityMacros.h\"\n\n#define GWS_LOG_DEBUG(...) XLOG_DEBUG(__VA_ARGS__)\n#define GWS_LOG_VERBOSE(...) XLOG_VERBOSE(__VA_ARGS__)\n#define GWS_LOG_INFO(...) XLOG_INFO(__VA_ARGS__)\n#define GWS_LOG_WARNING(...) XLOG_WARNING(__VA_ARGS__)\n#define GWS_LOG_ERROR(...) XLOG_ERROR(__VA_ARGS__)\n\n#define GWS_DCHECK(__CONDITION__) XLOG_DEBUG_CHECK(__CONDITION__)\n#define GWS_DNOT_REACHED() XLOG_DEBUG_UNREACHABLE()\n\n/**\n *  If all of the above fail, then use GCDWebServer built-in\n *  logging facility.\n */\n\n#else\n\n#define __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__\n\ntypedef NS_ENUM(int, GCDWebServerLoggingLevel) {\n  kGCDWebServerLoggingLevel_Debug = 0,\n  kGCDWebServerLoggingLevel_Verbose,\n  kGCDWebServerLoggingLevel_Info,\n  kGCDWebServerLoggingLevel_Warning,\n  kGCDWebServerLoggingLevel_Error\n};\n\nextern GCDWebServerLoggingLevel GCDWebServerLogLevel;\nextern void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* _Nonnull format, ...) NS_FORMAT_FUNCTION(2, 3);\n\n#if DEBUG\n#define GWS_LOG_DEBUG(...)                                                                                                             \\\n  do {                                                                                                                                 \\\n    if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Debug) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Debug, __VA_ARGS__); \\\n  } while (0)\n#else\n#define GWS_LOG_DEBUG(...)\n#endif\n#define GWS_LOG_VERBOSE(...)                                                                                                               \\\n  do {                                                                                                                                     \\\n    if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Verbose) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Verbose, __VA_ARGS__); \\\n  } while (0)\n#define GWS_LOG_INFO(...)                                                                                                            \\\n  do {                                                                                                                               \\\n    if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Info) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Info, __VA_ARGS__); \\\n  } while (0)\n#define GWS_LOG_WARNING(...)                                                                                                               \\\n  do {                                                                                                                                     \\\n    if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Warning) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Warning, __VA_ARGS__); \\\n  } while (0)\n#define GWS_LOG_ERROR(...)                                                                                                             \\\n  do {                                                                                                                                 \\\n    if (GCDWebServerLogLevel <= kGCDWebServerLoggingLevel_Error) GCDWebServerLogMessage(kGCDWebServerLoggingLevel_Error, __VA_ARGS__); \\\n  } while (0)\n\n#endif\n\n/**\n *  Consistency check macros used when building Debug only.\n */\n\n#if !defined(GWS_DCHECK) || !defined(GWS_DNOT_REACHED)\n\n#if DEBUG\n\n#define GWS_DCHECK(__CONDITION__) \\\n  do {                            \\\n    if (!(__CONDITION__)) {       \\\n      abort();                    \\\n    }                             \\\n  } while (0)\n#define GWS_DNOT_REACHED() abort()\n\n#else\n\n#define GWS_DCHECK(__CONDITION__)\n#define GWS_DNOT_REACHED()\n\n#endif\n\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  GCDWebServer internal constants and APIs.\n */\n\n#define kGCDWebServerDefaultMimeType @\"application/octet-stream\"\n#define kGCDWebServerErrorDomain @\"GCDWebServerErrorDomain\"\n\nstatic inline BOOL GCDWebServerIsValidByteRange(NSRange range) {\n  return ((range.location != NSUIntegerMax) || (range.length > 0));\n}\n\nstatic inline NSError* GCDWebServerMakePosixError(int code) {\n  return [NSError errorWithDomain:NSPOSIXErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey : (NSString*)[NSString stringWithUTF8String:strerror(code)]}];\n}\n\nextern void GCDWebServerInitializeFunctions(void);\nextern NSString* _Nullable GCDWebServerNormalizeHeaderValue(NSString* _Nullable value);\nextern NSString* _Nullable GCDWebServerTruncateHeaderValue(NSString* _Nullable value);\nextern NSString* _Nullable GCDWebServerExtractHeaderValueParameter(NSString* _Nullable value, NSString* attribute);\nextern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset);\nextern BOOL GCDWebServerIsTextContentType(NSString* type);\nextern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType);\nextern NSString* GCDWebServerComputeMD5Digest(NSString* format, ...) NS_FORMAT_FUNCTION(1, 2);\nextern NSString* GCDWebServerStringFromSockAddr(const struct sockaddr* addr, BOOL includeService);\n\n@interface GCDWebServerConnection ()\n- (instancetype)initWithServer:(GCDWebServer*)server localAddress:(NSData*)localAddress remoteAddress:(NSData*)remoteAddress socket:(CFSocketNativeHandle)socket;\n@end\n\n@interface GCDWebServer ()\n@property(nonatomic, readonly) NSMutableArray<GCDWebServerHandler*>* handlers;\n@property(nonatomic, readonly, nullable) NSString* serverName;\n@property(nonatomic, readonly, nullable) NSString* authenticationRealm;\n@property(nonatomic, readonly, nullable) NSMutableDictionary<NSString*, NSString*>* authenticationBasicAccounts;\n@property(nonatomic, readonly, nullable) NSMutableDictionary<NSString*, NSString*>* authenticationDigestAccounts;\n@property(nonatomic, readonly) BOOL shouldAutomaticallyMapHEADToGET;\n@property(nonatomic, readonly) dispatch_queue_priority_t dispatchQueuePriority;\n- (void)willStartConnection:(GCDWebServerConnection*)connection;\n- (void)didEndConnection:(GCDWebServerConnection*)connection;\n@end\n\n@interface GCDWebServerHandler : NSObject\n@property(nonatomic, readonly) GCDWebServerMatchBlock matchBlock;\n@property(nonatomic, readonly) GCDWebServerAsyncProcessBlock asyncProcessBlock;\n@end\n\n@interface GCDWebServerRequest ()\n@property(nonatomic, readonly) BOOL usesChunkedTransferEncoding;\n@property(nonatomic) NSData* localAddressData;\n@property(nonatomic) NSData* remoteAddressData;\n- (void)prepareForWriting;\n- (BOOL)performOpen:(NSError**)error;\n- (BOOL)performWriteData:(NSData*)data error:(NSError**)error;\n- (BOOL)performClose:(NSError**)error;\n- (void)setAttribute:(nullable id)attribute forKey:(NSString*)key;\n@end\n\n@interface GCDWebServerResponse ()\n@property(nonatomic, readonly) NSDictionary<NSString*, NSString*>* additionalHeaders;\n@property(nonatomic, readonly) BOOL usesChunkedTransferEncoding;\n- (void)prepareForReading;\n- (BOOL)performOpen:(NSError**)error;\n- (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block;\n- (void)performClose;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  Attribute key to retrieve an NSArray containing NSStrings from a GCDWebServerRequest\n *  with the contents of any regular expression captures done on the request path.\n *\n *  @warning This attribute will only be set on the request if adding a handler using \n *  -addHandlerForMethod:pathRegex:requestClass:processBlock:.\n */\nextern NSString* const GCDWebServerRequestAttribute_RegexCaptures;\n\n/**\n *  This protocol is used by the GCDWebServerConnection to communicate with\n *  the GCDWebServerRequest and write the received HTTP body data.\n *\n *  Note that multiple GCDWebServerBodyWriter objects can be chained together\n *  internally e.g. to automatically decode gzip encoded content before\n *  passing it on to the GCDWebServerRequest.\n *\n *  @warning These methods can be called on any GCD thread.\n */\n@protocol GCDWebServerBodyWriter <NSObject>\n\n/**\n *  This method is called before any body data is received.\n *\n *  It should return YES on success or NO on failure and set the \"error\" argument\n *  which is guaranteed to be non-NULL.\n */\n- (BOOL)open:(NSError**)error;\n\n/**\n *  This method is called whenever body data has been received.\n *\n *  It should return YES on success or NO on failure and set the \"error\" argument\n *  which is guaranteed to be non-NULL.\n */\n- (BOOL)writeData:(NSData*)data error:(NSError**)error;\n\n/**\n *  This method is called after all body data has been received.\n *\n *  It should return YES on success or NO on failure and set the \"error\" argument\n *  which is guaranteed to be non-NULL.\n */\n- (BOOL)close:(NSError**)error;\n\n@end\n\n/**\n *  The GCDWebServerRequest class is instantiated by the GCDWebServerConnection\n *  after the HTTP headers have been received. Each instance wraps a single HTTP\n *  request. If a body is present, the methods from the GCDWebServerBodyWriter\n *  protocol will be called by the GCDWebServerConnection to receive it.\n *\n *  The default implementation of the GCDWebServerBodyWriter protocol on the class\n *  simply ignores the body data.\n *\n *  @warning GCDWebServerRequest instances can be created and used on any GCD thread.\n */\n@interface GCDWebServerRequest : NSObject <GCDWebServerBodyWriter>\n\n/**\n *  Returns the HTTP method for the request.\n */\n@property(nonatomic, readonly) NSString* method;\n\n/**\n *  Returns the URL for the request.\n */\n@property(nonatomic, readonly) NSURL* URL;\n\n/**\n *  Returns the HTTP headers for the request.\n */\n@property(nonatomic, readonly) NSDictionary<NSString*, NSString*>* headers;\n\n/**\n *  Returns the path component of the URL for the request.\n */\n@property(nonatomic, readonly) NSString* path;\n\n/**\n *  Returns the parsed and unescaped query component of the URL for the request.\n *\n *  @warning This property will be nil if there is no query in the URL.\n */\n@property(nonatomic, readonly, nullable) NSDictionary<NSString*, NSString*>* query;\n\n/**\n *  Returns the content type for the body of the request parsed from the\n *  \"Content-Type\" header.\n *\n *  This property will be nil if the request has no body or set to\n *  \"application/octet-stream\" if a body is present but there was no\n *  \"Content-Type\" header.\n */\n@property(nonatomic, readonly, nullable) NSString* contentType;\n\n/**\n *  Returns the content length for the body of the request parsed from the\n *  \"Content-Length\" header.\n *\n *  This property will be set to \"NSUIntegerMax\" if the request has no body or\n *  if there is a body but no \"Content-Length\" header, typically because\n *  chunked transfer encoding is used.\n */\n@property(nonatomic, readonly) NSUInteger contentLength;\n\n/**\n *  Returns the parsed \"If-Modified-Since\" header or nil if absent or malformed.\n */\n@property(nonatomic, readonly, nullable) NSDate* ifModifiedSince;\n\n/**\n *  Returns the parsed \"If-None-Match\" header or nil if absent or malformed.\n */\n@property(nonatomic, readonly, nullable) NSString* ifNoneMatch;\n\n/**\n *  Returns the parsed \"Range\" header or (NSUIntegerMax, 0) if absent or malformed.\n *  The range will be set to (offset, length) if expressed from the beginning\n *  of the entity body, or (NSUIntegerMax, length) if expressed from its end.\n */\n@property(nonatomic, readonly) NSRange byteRange;\n\n/**\n *  Returns YES if the client supports gzip content encoding according to the\n *  \"Accept-Encoding\" header.\n */\n@property(nonatomic, readonly) BOOL acceptsGzipContentEncoding;\n\n/**\n *  Returns the address of the local peer (i.e. server) for the request\n *  as a raw \"struct sockaddr\".\n */\n@property(nonatomic, readonly) NSData* localAddressData;\n\n/**\n *  Returns the address of the local peer (i.e. server) for the request\n *  as a string.\n */\n@property(nonatomic, readonly) NSString* localAddressString;\n\n/**\n *  Returns the address of the remote peer (i.e. client) for the request\n *  as a raw \"struct sockaddr\".\n */\n@property(nonatomic, readonly) NSData* remoteAddressData;\n\n/**\n *  Returns the address of the remote peer (i.e. client) for the request\n *  as a string.\n */\n@property(nonatomic, readonly) NSString* remoteAddressString;\n\n/**\n *  This method is the designated initializer for the class.\n */\n- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary<NSString*, NSString*>*)headers path:(NSString*)path query:(nullable NSDictionary<NSString*, NSString*>*)query;\n\n/**\n *  Convenience method that checks if the contentType property is defined.\n */\n- (BOOL)hasBody;\n\n/**\n *  Convenience method that checks if the byteRange property is defined.\n */\n- (BOOL)hasByteRange;\n\n/**\n *  Retrieves an attribute associated with this request using the given key.\n *\n *  @return The attribute value for the key.\n */\n- (nullable id)attributeForKey:(NSString*)key;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerRequest.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <zlib.h>\n\n#import \"GCDWebServerPrivate.h\"\n\nNSString* const GCDWebServerRequestAttribute_RegexCaptures = @\"GCDWebServerRequestAttribute_RegexCaptures\";\n\n#define kZlibErrorDomain @\"ZlibErrorDomain\"\n#define kGZipInitialBufferSize (256 * 1024)\n\n@interface GCDWebServerBodyDecoder : NSObject <GCDWebServerBodyWriter>\n@end\n\n@interface GCDWebServerGZipDecoder : GCDWebServerBodyDecoder\n@end\n\n@implementation GCDWebServerBodyDecoder {\n  GCDWebServerRequest* __unsafe_unretained _request;\n  id<GCDWebServerBodyWriter> __unsafe_unretained _writer;\n}\n\n- (instancetype)initWithRequest:(GCDWebServerRequest* _Nonnull)request writer:(id<GCDWebServerBodyWriter> _Nonnull)writer {\n  if ((self = [super init])) {\n    _request = request;\n    _writer = writer;\n  }\n  return self;\n}\n\n- (BOOL)open:(NSError**)error {\n  return [_writer open:error];\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  return [_writer writeData:data error:error];\n}\n\n- (BOOL)close:(NSError**)error {\n  return [_writer close:error];\n}\n\n@end\n\n@implementation GCDWebServerGZipDecoder {\n  z_stream _stream;\n  BOOL _finished;\n}\n\n- (BOOL)open:(NSError**)error {\n  int result = inflateInit2(&_stream, 15 + 16);\n  if (result != Z_OK) {\n    if (error) {\n      *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];\n    }\n    return NO;\n  }\n  if (![super open:error]) {\n    inflateEnd(&_stream);\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  GWS_DCHECK(!_finished);\n  _stream.next_in = (Bytef*)data.bytes;\n  _stream.avail_in = (uInt)data.length;\n  NSMutableData* decodedData = [[NSMutableData alloc] initWithLength:kGZipInitialBufferSize];\n  if (decodedData == nil) {\n    GWS_DNOT_REACHED();\n    return NO;\n  }\n  NSUInteger length = 0;\n  while (1) {\n    NSUInteger maxLength = decodedData.length - length;\n    _stream.next_out = (Bytef*)((char*)decodedData.mutableBytes + length);\n    _stream.avail_out = (uInt)maxLength;\n    int result = inflate(&_stream, Z_NO_FLUSH);\n    if ((result != Z_OK) && (result != Z_STREAM_END)) {\n      if (error) {\n        *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];\n      }\n      return NO;\n    }\n    length += maxLength - _stream.avail_out;\n    if (_stream.avail_out > 0) {\n      if (result == Z_STREAM_END) {\n        _finished = YES;\n      }\n      break;\n    }\n    decodedData.length = 2 * decodedData.length;  // zlib has used all the output buffer so resize it and try again in case more data is available\n  }\n  decodedData.length = length;\n  BOOL success = length ? [super writeData:decodedData error:error] : YES;  // No need to call writer if we have no data yet\n  return success;\n}\n\n- (BOOL)close:(NSError**)error {\n  GWS_DCHECK(_finished);\n  inflateEnd(&_stream);\n  return [super close:error];\n}\n\n@end\n\n@implementation GCDWebServerRequest {\n  BOOL _opened;\n  NSMutableArray<GCDWebServerBodyDecoder*>* _decoders;\n  id<GCDWebServerBodyWriter> __unsafe_unretained _writer;\n  NSMutableDictionary<NSString*, id>* _attributes;\n}\n\n- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary<NSString*, NSString*>*)headers path:(NSString*)path query:(NSDictionary<NSString*, NSString*>*)query {\n  if ((self = [super init])) {\n    _method = [method copy];\n    _URL = url;\n    _headers = headers;\n    _path = [path copy];\n    _query = query;\n\n    _contentType = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@\"Content-Type\"]);\n    _usesChunkedTransferEncoding = [GCDWebServerNormalizeHeaderValue([_headers objectForKey:@\"Transfer-Encoding\"]) isEqualToString:@\"chunked\"];\n    NSString* lengthHeader = [_headers objectForKey:@\"Content-Length\"];\n    if (lengthHeader) {\n      NSInteger length = [lengthHeader integerValue];\n      if (_usesChunkedTransferEncoding || (length < 0)) {\n        GWS_LOG_WARNING(@\"Invalid 'Content-Length' header '%@' for '%@' request on \\\"%@\\\"\", lengthHeader, _method, _URL);\n        GWS_DNOT_REACHED();\n        return nil;\n      }\n      _contentLength = length;\n      if (_contentType == nil) {\n        _contentType = kGCDWebServerDefaultMimeType;\n      }\n    } else if (_usesChunkedTransferEncoding) {\n      if (_contentType == nil) {\n        _contentType = kGCDWebServerDefaultMimeType;\n      }\n      _contentLength = NSUIntegerMax;\n    } else {\n      if (_contentType) {\n        GWS_LOG_WARNING(@\"Ignoring 'Content-Type' header for '%@' request on \\\"%@\\\"\", _method, _URL);\n        _contentType = nil;  // Content-Type without Content-Length or chunked-encoding doesn't make sense\n      }\n      _contentLength = NSUIntegerMax;\n    }\n\n    NSString* modifiedHeader = [_headers objectForKey:@\"If-Modified-Since\"];\n    if (modifiedHeader) {\n      _ifModifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy];\n    }\n    _ifNoneMatch = [_headers objectForKey:@\"If-None-Match\"];\n\n    _byteRange = NSMakeRange(NSUIntegerMax, 0);\n    NSString* rangeHeader = GCDWebServerNormalizeHeaderValue([_headers objectForKey:@\"Range\"]);\n    if (rangeHeader) {\n      if ([rangeHeader hasPrefix:@\"bytes=\"]) {\n        NSArray* components = [[rangeHeader substringFromIndex:6] componentsSeparatedByString:@\",\"];\n        if (components.count == 1) {\n          components = [(NSString*)[components firstObject] componentsSeparatedByString:@\"-\"];\n          if (components.count == 2) {\n            NSString* startString = [components objectAtIndex:0];\n            NSInteger startValue = [startString integerValue];\n            NSString* endString = [components objectAtIndex:1];\n            NSInteger endValue = [endString integerValue];\n            if (startString.length && (startValue >= 0) && endString.length && (endValue >= startValue)) {  // The second 500 bytes: \"500-999\"\n              _byteRange.location = startValue;\n              _byteRange.length = endValue - startValue + 1;\n            } else if (startString.length && (startValue >= 0)) {  // The bytes after 9500 bytes: \"9500-\"\n              _byteRange.location = startValue;\n              _byteRange.length = NSUIntegerMax;\n            } else if (endString.length && (endValue > 0)) {  // The final 500 bytes: \"-500\"\n              _byteRange.location = NSUIntegerMax;\n              _byteRange.length = endValue;\n            }\n          }\n        }\n      }\n      if ((_byteRange.location == NSUIntegerMax) && (_byteRange.length == 0)) {  // Ignore \"Range\" header if syntactically invalid\n        GWS_LOG_WARNING(@\"Failed to parse 'Range' header \\\"%@\\\" for url: %@\", rangeHeader, url);\n      }\n    }\n\n    if ([[_headers objectForKey:@\"Accept-Encoding\"] rangeOfString:@\"gzip\"].location != NSNotFound) {\n      _acceptsGzipContentEncoding = YES;\n    }\n\n    _decoders = [[NSMutableArray alloc] init];\n    _attributes = [[NSMutableDictionary alloc] init];\n  }\n  return self;\n}\n\n- (BOOL)hasBody {\n  return _contentType ? YES : NO;\n}\n\n- (BOOL)hasByteRange {\n  return GCDWebServerIsValidByteRange(_byteRange);\n}\n\n- (id)attributeForKey:(NSString*)key {\n  return [_attributes objectForKey:key];\n}\n\n- (BOOL)open:(NSError**)error {\n  return YES;\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  return YES;\n}\n\n- (BOOL)close:(NSError**)error {\n  return YES;\n}\n\n- (void)prepareForWriting {\n  _writer = self;\n  if ([GCDWebServerNormalizeHeaderValue([self.headers objectForKey:@\"Content-Encoding\"]) isEqualToString:@\"gzip\"]) {\n    GCDWebServerGZipDecoder* decoder = [[GCDWebServerGZipDecoder alloc] initWithRequest:self writer:_writer];\n    [_decoders addObject:decoder];\n    _writer = decoder;\n  }\n}\n\n- (BOOL)performOpen:(NSError**)error {\n  GWS_DCHECK(_contentType);\n  GWS_DCHECK(_writer);\n  if (_opened) {\n    GWS_DNOT_REACHED();\n    return NO;\n  }\n  _opened = YES;\n  return [_writer open:error];\n}\n\n- (BOOL)performWriteData:(NSData*)data error:(NSError**)error {\n  GWS_DCHECK(_opened);\n  return [_writer writeData:data error:error];\n}\n\n- (BOOL)performClose:(NSError**)error {\n  GWS_DCHECK(_opened);\n  return [_writer close:error];\n}\n\n- (void)setAttribute:(id)attribute forKey:(NSString*)key {\n  [_attributes setValue:attribute forKey:key];\n}\n\n- (NSString*)localAddressString {\n  return GCDWebServerStringFromSockAddr(_localAddressData.bytes, YES);\n}\n\n- (NSString*)remoteAddressString {\n  return GCDWebServerStringFromSockAddr(_remoteAddressData.bytes, YES);\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithFormat:@\"%@ %@\", _method, _path];\n  for (NSString* argument in [[_query allKeys] sortedArrayUsingSelector:@selector(compare:)]) {\n    [description appendFormat:@\"\\n  %@ = %@\", argument, [_query objectForKey:argument]];\n  }\n  [description appendString:@\"\\n\"];\n  for (NSString* header in [[_headers allKeys] sortedArrayUsingSelector:@selector(compare:)]) {\n    [description appendFormat:@\"\\n%@: %@\", header, [_headers objectForKey:header]];\n  }\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerBodyReaderCompletionBlock is passed by GCDWebServer to the\n *  GCDWebServerBodyReader object when reading data from it asynchronously.\n */\ntypedef void (^GCDWebServerBodyReaderCompletionBlock)(NSData* _Nullable data, NSError* _Nullable error);\n\n/**\n *  This protocol is used by the GCDWebServerConnection to communicate with\n *  the GCDWebServerResponse and read the HTTP body data to send.\n *\n *  Note that multiple GCDWebServerBodyReader objects can be chained together\n *  internally e.g. to automatically apply gzip encoding to the content before\n *  passing it on to the GCDWebServerResponse.\n *\n *  @warning These methods can be called on any GCD thread.\n */\n@protocol GCDWebServerBodyReader <NSObject>\n\n@required\n\n/**\n *  This method is called before any body data is sent.\n *\n *  It should return YES on success or NO on failure and set the \"error\" argument\n *  which is guaranteed to be non-NULL.\n */\n- (BOOL)open:(NSError**)error;\n\n/**\n *  This method is called whenever body data is sent.\n *\n *  It should return a non-empty NSData if there is body data available,\n *  or an empty NSData there is no more body data, or nil on error and set\n *  the \"error\" argument which is guaranteed to be non-NULL.\n */\n- (nullable NSData*)readData:(NSError**)error;\n\n/**\n *  This method is called after all body data has been sent.\n */\n- (void)close;\n\n@optional\n\n/**\n *  If this method is implemented, it will be preferred over -readData:.\n *\n *  It must call the passed block when data is available, passing a non-empty\n *  NSData if there is body data available, or an empty NSData there is no more\n *  body data, or nil on error and pass an NSError along.\n */\n- (void)asyncReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block;\n\n@end\n\n/**\n *  The GCDWebServerResponse class is used to wrap a single HTTP response.\n *  It is instantiated by the handler of the GCDWebServer that handled the request.\n *  If a body is present, the methods from the GCDWebServerBodyReader protocol\n *  will be called by the GCDWebServerConnection to send it.\n *\n *  The default implementation of the GCDWebServerBodyReader protocol\n *  on the class simply returns an empty body.\n *\n *  @warning GCDWebServerResponse instances can be created and used on any GCD thread.\n */\n@interface GCDWebServerResponse : NSObject <GCDWebServerBodyReader>\n\n/**\n *  Sets the content type for the body of the response.\n *\n *  The default value is nil i.e. the response has no body.\n *\n *  @warning This property must be set if a body is present.\n */\n@property(nonatomic, copy, nullable) NSString* contentType;\n\n/**\n *  Sets the content length for the body of the response. If a body is present\n *  but this property is set to \"NSUIntegerMax\", this means the length of the body\n *  cannot be known ahead of time. Chunked transfer encoding will be\n *  automatically enabled by the GCDWebServerConnection to comply with HTTP/1.1\n *  specifications.\n *\n *  The default value is \"NSUIntegerMax\" i.e. the response has no body or its length\n *  is undefined.\n */\n@property(nonatomic) NSUInteger contentLength;\n\n/**\n *  Sets the HTTP status code for the response.\n *\n *  The default value is 200 i.e. \"OK\".\n */\n@property(nonatomic) NSInteger statusCode;\n\n/**\n *  Sets the caching hint for the response using the \"Cache-Control\" header.\n *  This value is expressed in seconds.\n *\n *  The default value is 0 i.e. \"no-cache\".\n */\n@property(nonatomic) NSUInteger cacheControlMaxAge;\n\n/**\n *  Sets the last modified date for the response using the \"Last-Modified\" header.\n *\n *  The default value is nil.\n */\n@property(nonatomic, nullable) NSDate* lastModifiedDate;\n\n/**\n *  Sets the ETag for the response using the \"ETag\" header.\n *\n *  The default value is nil.\n */\n@property(nonatomic, copy, nullable) NSString* eTag;\n\n/**\n *  Enables gzip encoding for the response body.\n *\n *  The default value is NO.\n *\n *  @warning Enabling gzip encoding will remove any \"Content-Length\" header\n *  since the length of the body is not known anymore. The client will still\n *  be able to determine the body length when connection is closed per\n *  HTTP/1.1 specifications.\n */\n@property(nonatomic, getter=isGZipContentEncodingEnabled) BOOL gzipContentEncodingEnabled;\n\n/**\n *  Creates an empty response.\n */\n+ (instancetype)response;\n\n/**\n *  This method is the designated initializer for the class.\n */\n- (instancetype)init;\n\n/**\n *  Sets an additional HTTP header on the response.\n *  Pass a nil value to remove an additional header.\n *\n *  @warning Do not attempt to override the primary headers used\n *  by GCDWebServerResponse like \"Content-Type\", \"ETag\", etc...\n */\n- (void)setValue:(nullable NSString*)value forAdditionalHeader:(NSString*)header;\n\n/**\n *  Convenience method that checks if the contentType property is defined.\n */\n- (BOOL)hasBody;\n\n@end\n\n@interface GCDWebServerResponse (Extensions)\n\n/**\n *  Creates a empty response with a specific HTTP status code.\n */\n+ (instancetype)responseWithStatusCode:(NSInteger)statusCode;\n\n/**\n *  Creates an HTTP redirect response to a new URL.\n */\n+ (instancetype)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent;\n\n/**\n *  Initializes an empty response with a specific HTTP status code.\n */\n- (instancetype)initWithStatusCode:(NSInteger)statusCode;\n\n/**\n *  Initializes an HTTP redirect response to a new URL.\n */\n- (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Core/GCDWebServerResponse.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <zlib.h>\n\n#import \"GCDWebServerPrivate.h\"\n\n#define kZlibErrorDomain @\"ZlibErrorDomain\"\n#define kGZipInitialBufferSize (256 * 1024)\n\n@interface GCDWebServerBodyEncoder : NSObject <GCDWebServerBodyReader>\n@end\n\n@interface GCDWebServerGZipEncoder : GCDWebServerBodyEncoder\n@end\n\n@implementation GCDWebServerBodyEncoder {\n  GCDWebServerResponse* __unsafe_unretained _response;\n  id<GCDWebServerBodyReader> __unsafe_unretained _reader;\n}\n\n- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id<GCDWebServerBodyReader> _Nonnull)reader {\n  if ((self = [super init])) {\n    _response = response;\n    _reader = reader;\n  }\n  return self;\n}\n\n- (BOOL)open:(NSError**)error {\n  return [_reader open:error];\n}\n\n- (NSData*)readData:(NSError**)error {\n  return [_reader readData:error];\n}\n\n- (void)close {\n  [_reader close];\n}\n\n@end\n\n@implementation GCDWebServerGZipEncoder {\n  z_stream _stream;\n  BOOL _finished;\n}\n\n- (instancetype)initWithResponse:(GCDWebServerResponse* _Nonnull)response reader:(id<GCDWebServerBodyReader> _Nonnull)reader {\n  if ((self = [super initWithResponse:response reader:reader])) {\n    response.contentLength = NSUIntegerMax;  // Make sure \"Content-Length\" header is not set since we don't know it\n    [response setValue:@\"gzip\" forAdditionalHeader:@\"Content-Encoding\"];\n  }\n  return self;\n}\n\n- (BOOL)open:(NSError**)error {\n  int result = deflateInit2(&_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY);\n  if (result != Z_OK) {\n    if (error) {\n      *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];\n    }\n    return NO;\n  }\n  if (![super open:error]) {\n    deflateEnd(&_stream);\n    return NO;\n  }\n  return YES;\n}\n\n- (NSData*)readData:(NSError**)error {\n  NSMutableData* encodedData;\n  if (_finished) {\n    encodedData = [[NSMutableData alloc] init];\n  } else {\n    encodedData = [[NSMutableData alloc] initWithLength:kGZipInitialBufferSize];\n    if (encodedData == nil) {\n      GWS_DNOT_REACHED();\n      return nil;\n    }\n    NSUInteger length = 0;\n    do {\n      NSData* data = [super readData:error];\n      if (data == nil) {\n        return nil;\n      }\n      _stream.next_in = (Bytef*)data.bytes;\n      _stream.avail_in = (uInt)data.length;\n      while (1) {\n        NSUInteger maxLength = encodedData.length - length;\n        _stream.next_out = (Bytef*)((char*)encodedData.mutableBytes + length);\n        _stream.avail_out = (uInt)maxLength;\n        int result = deflate(&_stream, data.length ? Z_NO_FLUSH : Z_FINISH);\n        if (result == Z_STREAM_END) {\n          _finished = YES;\n        } else if (result != Z_OK) {\n          if (error) {\n            *error = [NSError errorWithDomain:kZlibErrorDomain code:result userInfo:nil];\n          }\n          return nil;\n        }\n        length += maxLength - _stream.avail_out;\n        if (_stream.avail_out > 0) {\n          break;\n        }\n        encodedData.length = 2 * encodedData.length;  // zlib has used all the output buffer so resize it and try again in case more data is available\n      }\n      GWS_DCHECK(_stream.avail_in == 0);\n    } while (length == 0);  // Make sure we don't return an empty NSData if not in finished state\n    encodedData.length = length;\n  }\n  return encodedData;\n}\n\n- (void)close {\n  deflateEnd(&_stream);\n  [super close];\n}\n\n@end\n\n@implementation GCDWebServerResponse {\n  BOOL _opened;\n  NSMutableArray<GCDWebServerBodyEncoder*>* _encoders;\n  id<GCDWebServerBodyReader> __unsafe_unretained _reader;\n}\n\n+ (instancetype)response {\n  return [(GCDWebServerResponse*)[[self class] alloc] init];\n}\n\n- (instancetype)init {\n  if ((self = [super init])) {\n    _contentType = nil;\n    _contentLength = NSUIntegerMax;\n    _statusCode = kGCDWebServerHTTPStatusCode_OK;\n    _cacheControlMaxAge = 0;\n    _additionalHeaders = [[NSMutableDictionary alloc] init];\n    _encoders = [[NSMutableArray alloc] init];\n  }\n  return self;\n}\n\n- (void)setValue:(NSString*)value forAdditionalHeader:(NSString*)header {\n  [_additionalHeaders setValue:value forKey:header];\n}\n\n- (BOOL)hasBody {\n  return _contentType ? YES : NO;\n}\n\n- (BOOL)usesChunkedTransferEncoding {\n  return (_contentType != nil) && (_contentLength == NSUIntegerMax);\n}\n\n- (BOOL)open:(NSError**)error {\n  return YES;\n}\n\n- (NSData*)readData:(NSError**)error {\n  return [NSData data];\n}\n\n- (void)close {\n  ;\n}\n\n- (void)prepareForReading {\n  _reader = self;\n  if (_gzipContentEncodingEnabled) {\n    GCDWebServerGZipEncoder* encoder = [[GCDWebServerGZipEncoder alloc] initWithResponse:self reader:_reader];\n    [_encoders addObject:encoder];\n    _reader = encoder;\n  }\n}\n\n- (BOOL)performOpen:(NSError**)error {\n  GWS_DCHECK(_contentType);\n  GWS_DCHECK(_reader);\n  if (_opened) {\n    GWS_DNOT_REACHED();\n    return NO;\n  }\n  _opened = YES;\n  return [_reader open:error];\n}\n\n- (void)performReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block {\n  GWS_DCHECK(_opened);\n  if ([_reader respondsToSelector:@selector(asyncReadDataWithCompletion:)]) {\n    [_reader asyncReadDataWithCompletion:[block copy]];\n  } else {\n    NSError* error = nil;\n    NSData* data = [_reader readData:&error];\n    block(data, error);\n  }\n}\n\n- (void)performClose {\n  GWS_DCHECK(_opened);\n  [_reader close];\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithFormat:@\"Status Code = %i\", (int)_statusCode];\n  if (_contentType) {\n    [description appendFormat:@\"\\nContent Type = %@\", _contentType];\n  }\n  if (_contentLength != NSUIntegerMax) {\n    [description appendFormat:@\"\\nContent Length = %lu\", (unsigned long)_contentLength];\n  }\n  [description appendFormat:@\"\\nCache Control Max Age = %lu\", (unsigned long)_cacheControlMaxAge];\n  if (_lastModifiedDate) {\n    [description appendFormat:@\"\\nLast Modified Date = %@\", _lastModifiedDate];\n  }\n  if (_eTag) {\n    [description appendFormat:@\"\\nETag = %@\", _eTag];\n  }\n  if (_additionalHeaders.count) {\n    [description appendString:@\"\\n\"];\n    for (NSString* header in [[_additionalHeaders allKeys] sortedArrayUsingSelector:@selector(compare:)]) {\n      [description appendFormat:@\"\\n%@: %@\", header, [_additionalHeaders objectForKey:header]];\n    }\n  }\n  return description;\n}\n\n@end\n\n@implementation GCDWebServerResponse (Extensions)\n\n+ (instancetype)responseWithStatusCode:(NSInteger)statusCode {\n  return [(GCDWebServerResponse*)[self alloc] initWithStatusCode:statusCode];\n}\n\n+ (instancetype)responseWithRedirect:(NSURL*)location permanent:(BOOL)permanent {\n  return [(GCDWebServerResponse*)[self alloc] initWithRedirect:location permanent:permanent];\n}\n\n- (instancetype)initWithStatusCode:(NSInteger)statusCode {\n  if ((self = [self init])) {\n    self.statusCode = statusCode;\n  }\n  return self;\n}\n\n- (instancetype)initWithRedirect:(NSURL*)location permanent:(BOOL)permanent {\n  if ((self = [self init])) {\n    self.statusCode = permanent ? kGCDWebServerHTTPStatusCode_MovedPermanently : kGCDWebServerHTTPStatusCode_TemporaryRedirect;\n    [self setValue:[location absoluteString] forAdditionalHeader:@\"Location\"];\n  }\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerRequest.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerDataRequest subclass of GCDWebServerRequest stores the body\n *  of the HTTP request in memory.\n */\n@interface GCDWebServerDataRequest : GCDWebServerRequest\n\n/**\n *  Returns the data for the request body.\n */\n@property(nonatomic, readonly) NSData* data;\n\n@end\n\n@interface GCDWebServerDataRequest (Extensions)\n\n/**\n *  Returns the data for the request body interpreted as text. If the content\n *  type of the body is not a text one, or if an error occurs, nil is returned.\n *\n *  The text encoding used to interpret the data is extracted from the\n *  \"Content-Type\" header or defaults to UTF-8.\n */\n@property(nonatomic, readonly, nullable) NSString* text;\n\n/**\n *  Returns the data for the request body interpreted as a JSON object. If the\n *  content type of the body is not JSON, or if an error occurs, nil is returned.\n */\n@property(nonatomic, readonly, nullable) id jsonObject;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerDataRequest.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@interface GCDWebServerDataRequest ()\n@property(nonatomic) NSMutableData* data;\n@end\n\n@implementation GCDWebServerDataRequest {\n  NSString* _text;\n  id _jsonObject;\n}\n\n- (BOOL)open:(NSError**)error {\n  if (self.contentLength != NSUIntegerMax) {\n    _data = [[NSMutableData alloc] initWithCapacity:self.contentLength];\n  } else {\n    _data = [[NSMutableData alloc] init];\n  }\n  if (_data == nil) {\n    if (error) {\n      *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @\"Failed allocating memory\"}];\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  [_data appendData:data];\n  return YES;\n}\n\n- (BOOL)close:(NSError**)error {\n  return YES;\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  if (_data) {\n    [description appendString:@\"\\n\\n\"];\n    [description appendString:GCDWebServerDescribeData(_data, (NSString*)self.contentType)];\n  }\n  return description;\n}\n\n@end\n\n@implementation GCDWebServerDataRequest (Extensions)\n\n- (NSString*)text {\n  if (_text == nil) {\n    if ([self.contentType hasPrefix:@\"text/\"]) {\n      NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @\"charset\");\n      _text = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)];\n    } else {\n      GWS_DNOT_REACHED();\n    }\n  }\n  return _text;\n}\n\n- (id)jsonObject {\n  if (_jsonObject == nil) {\n    NSString* mimeType = GCDWebServerTruncateHeaderValue(self.contentType);\n    if ([mimeType isEqualToString:@\"application/json\"] || [mimeType isEqualToString:@\"text/json\"] || [mimeType isEqualToString:@\"text/javascript\"]) {\n      _jsonObject = [NSJSONSerialization JSONObjectWithData:_data options:0 error:NULL];\n    } else {\n      GWS_DNOT_REACHED();\n    }\n  }\n  return _jsonObject;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerRequest.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerFileRequest subclass of GCDWebServerRequest stores the body\n *  of the HTTP request to a file on disk.\n */\n@interface GCDWebServerFileRequest : GCDWebServerRequest\n\n/**\n *  Returns the path to the temporary file containing the request body.\n *\n *  @warning This temporary file will be automatically deleted when the\n *  GCDWebServerFileRequest is deallocated. If you want to preserve this file,\n *  you must move it to a different location beforehand.\n */\n@property(nonatomic, readonly) NSString* temporaryPath;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerFileRequest.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@implementation GCDWebServerFileRequest {\n  int _file;\n}\n\n- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary<NSString*, NSString*>*)headers path:(NSString*)path query:(NSDictionary<NSString*, NSString*>*)query {\n  if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {\n    _temporaryPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];\n  }\n  return self;\n}\n\n- (void)dealloc {\n  unlink([_temporaryPath fileSystemRepresentation]);\n}\n\n- (BOOL)open:(NSError**)error {\n  _file = open([_temporaryPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);\n  if (_file <= 0) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  if (write(_file, data.bytes, data.length) != (ssize_t)data.length) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)close:(NSError**)error {\n  if (close(_file) < 0) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    return NO;\n  }\n#ifdef __GCDWEBSERVER_ENABLE_TESTING__\n  NSString* creationDateHeader = [self.headers objectForKey:@\"X-GCDWebServer-CreationDate\"];\n  if (creationDateHeader) {\n    NSDate* date = GCDWebServerParseISO8601(creationDateHeader);\n    if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate : date} ofItemAtPath:_temporaryPath error:error]) {\n      return NO;\n    }\n  }\n  NSString* modifiedDateHeader = [self.headers objectForKey:@\"X-GCDWebServer-ModifiedDate\"];\n  if (modifiedDateHeader) {\n    NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader);\n    if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate : date} ofItemAtPath:_temporaryPath error:error]) {\n      return NO;\n    }\n  }\n#endif\n  return YES;\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  [description appendFormat:@\"\\n\\n{%@}\", _temporaryPath];\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerRequest.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerMultiPart class is an abstract class that wraps the content\n *  of a part.\n */\n@interface GCDWebServerMultiPart : NSObject\n\n/**\n *  Returns the control name retrieved from the part headers.\n */\n@property(nonatomic, readonly) NSString* controlName;\n\n/**\n *  Returns the content type retrieved from the part headers or \"text/plain\"\n *  if not available (per HTTP specifications).\n */\n@property(nonatomic, readonly) NSString* contentType;\n\n/**\n *  Returns the MIME type component of the content type for the part.\n */\n@property(nonatomic, readonly) NSString* mimeType;\n\n@end\n\n/**\n *  The GCDWebServerMultiPartArgument subclass of GCDWebServerMultiPart wraps\n *  the content of a part as data in memory.\n */\n@interface GCDWebServerMultiPartArgument : GCDWebServerMultiPart\n\n/**\n *  Returns the data for the part.\n */\n@property(nonatomic, readonly) NSData* data;\n\n/**\n *  Returns the data for the part interpreted as text. If the content\n *  type of the part is not a text one, or if an error occurs, nil is returned.\n *\n *  The text encoding used to interpret the data is extracted from the\n *  \"Content-Type\" header or defaults to UTF-8.\n */\n@property(nonatomic, readonly, nullable) NSString* string;\n\n@end\n\n/**\n *  The GCDWebServerMultiPartFile subclass of GCDWebServerMultiPart wraps\n *  the content of a part as a file on disk.\n */\n@interface GCDWebServerMultiPartFile : GCDWebServerMultiPart\n\n/**\n *  Returns the file name retrieved from the part headers.\n */\n@property(nonatomic, readonly) NSString* fileName;\n\n/**\n *  Returns the path to the temporary file containing the part data.\n *\n *  @warning This temporary file will be automatically deleted when the\n *  GCDWebServerMultiPartFile is deallocated. If you want to preserve this file,\n *  you must move it to a different location beforehand.\n */\n@property(nonatomic, readonly) NSString* temporaryPath;\n\n@end\n\n/**\n *  The GCDWebServerMultiPartFormRequest subclass of GCDWebServerRequest\n *  parses the body of the HTTP request as a multipart encoded form.\n */\n@interface GCDWebServerMultiPartFormRequest : GCDWebServerRequest\n\n/**\n *  Returns the argument parts from the multipart encoded form as\n *  name / GCDWebServerMultiPartArgument pairs.\n */\n@property(nonatomic, readonly) NSArray<GCDWebServerMultiPartArgument*>* arguments;\n\n/**\n *  Returns the files parts from the multipart encoded form as\n *  name / GCDWebServerMultiPartFile pairs.\n */\n@property(nonatomic, readonly) NSArray<GCDWebServerMultiPartFile*>* files;\n\n/**\n *  Returns the MIME type for multipart encoded forms\n *  i.e. \"multipart/form-data\".\n */\n+ (NSString*)mimeType;\n\n/**\n *  Returns the first argument for a given control name or nil if not found.\n */\n- (nullable GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name;\n\n/**\n *  Returns the first file for a given control name or nil if not found.\n */\n- (nullable GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n#define kMultiPartBufferSize (256 * 1024)\n\ntypedef enum {\n  kParserState_Undefined = 0,\n  kParserState_Start,\n  kParserState_Headers,\n  kParserState_Content,\n  kParserState_End\n} ParserState;\n\n@interface GCDWebServerMIMEStreamParser : NSObject\n@end\n\nstatic NSData* _newlineData = nil;\nstatic NSData* _newlinesData = nil;\nstatic NSData* _dashNewlineData = nil;\n\n@implementation GCDWebServerMultiPart\n\n- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type {\n  if ((self = [super init])) {\n    _controlName = [name copy];\n    _contentType = [type copy];\n    _mimeType = (NSString*)GCDWebServerTruncateHeaderValue(_contentType);\n  }\n  return self;\n}\n\n@end\n\n@implementation GCDWebServerMultiPartArgument\n\n- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type data:(NSData* _Nonnull)data {\n  if ((self = [super initWithControlName:name contentType:type])) {\n    _data = data;\n\n    if ([self.contentType hasPrefix:@\"text/\"]) {\n      NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @\"charset\");\n      _string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)];\n    }\n  }\n  return self;\n}\n\n- (NSString*)description {\n  return [NSString stringWithFormat:@\"<%@ | '%@' | %lu bytes>\", [self class], self.mimeType, (unsigned long)_data.length];\n}\n\n@end\n\n@implementation GCDWebServerMultiPartFile\n\n- (instancetype)initWithControlName:(NSString* _Nonnull)name contentType:(NSString* _Nonnull)type fileName:(NSString* _Nonnull)fileName temporaryPath:(NSString* _Nonnull)temporaryPath {\n  if ((self = [super initWithControlName:name contentType:type])) {\n    _fileName = [fileName copy];\n    _temporaryPath = [temporaryPath copy];\n  }\n  return self;\n}\n\n- (void)dealloc {\n  unlink([_temporaryPath fileSystemRepresentation]);\n}\n\n- (NSString*)description {\n  return [NSString stringWithFormat:@\"<%@ | '%@' | '%@>'\", [self class], self.mimeType, _fileName];\n}\n\n@end\n\n@implementation GCDWebServerMIMEStreamParser {\n  NSData* _boundary;\n  NSString* _defaultcontrolName;\n  ParserState _state;\n  NSMutableData* _data;\n  NSMutableArray<GCDWebServerMultiPartArgument*>* _arguments;\n  NSMutableArray<GCDWebServerMultiPartFile*>* _files;\n\n  NSString* _controlName;\n  NSString* _fileName;\n  NSString* _contentType;\n  NSString* _tmpPath;\n  int _tmpFile;\n  GCDWebServerMIMEStreamParser* _subParser;\n}\n\n+ (void)initialize {\n  if (_newlineData == nil) {\n    _newlineData = [[NSData alloc] initWithBytes:\"\\r\\n\" length:2];\n    GWS_DCHECK(_newlineData);\n  }\n  if (_newlinesData == nil) {\n    _newlinesData = [[NSData alloc] initWithBytes:\"\\r\\n\\r\\n\" length:4];\n    GWS_DCHECK(_newlinesData);\n  }\n  if (_dashNewlineData == nil) {\n    _dashNewlineData = [[NSData alloc] initWithBytes:\"--\\r\\n\" length:4];\n    GWS_DCHECK(_dashNewlineData);\n  }\n}\n\n- (instancetype)initWithBoundary:(NSString* _Nonnull)boundary defaultControlName:(NSString* _Nullable)name arguments:(NSMutableArray<GCDWebServerMultiPartArgument*>* _Nonnull)arguments files:(NSMutableArray<GCDWebServerMultiPartFile*>* _Nonnull)files {\n  NSData* data = boundary.length ? [[NSString stringWithFormat:@\"--%@\", boundary] dataUsingEncoding:NSASCIIStringEncoding] : nil;\n  if (data == nil) {\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n  if ((self = [super init])) {\n    _boundary = data;\n    _defaultcontrolName = name;\n    _arguments = arguments;\n    _files = files;\n    _data = [[NSMutableData alloc] initWithCapacity:kMultiPartBufferSize];\n    _state = kParserState_Start;\n  }\n  return self;\n}\n\n- (void)dealloc {\n  if (_tmpFile > 0) {\n    close(_tmpFile);\n    unlink([_tmpPath fileSystemRepresentation]);\n  }\n}\n\n// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2\n- (BOOL)_parseData {\n  BOOL success = YES;\n\n  if (_state == kParserState_Headers) {\n    NSRange range = [_data rangeOfData:_newlinesData options:0 range:NSMakeRange(0, _data.length)];\n    if (range.location != NSNotFound) {\n      _controlName = nil;\n      _fileName = nil;\n      _contentType = nil;\n      _tmpPath = nil;\n      _subParser = nil;\n      NSString* headers = [[NSString alloc] initWithData:[_data subdataWithRange:NSMakeRange(0, range.location)] encoding:NSUTF8StringEncoding];\n      if (headers) {\n        for (NSString* header in [headers componentsSeparatedByString:@\"\\r\\n\"]) {\n          NSRange subRange = [header rangeOfString:@\":\"];\n          if (subRange.location != NSNotFound) {\n            NSString* name = [header substringToIndex:subRange.location];\n            NSString* value = [[header substringFromIndex:(subRange.location + subRange.length)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n            if ([name caseInsensitiveCompare:@\"Content-Type\"] == NSOrderedSame) {\n              _contentType = GCDWebServerNormalizeHeaderValue(value);\n            } else if ([name caseInsensitiveCompare:@\"Content-Disposition\"] == NSOrderedSame) {\n              NSString* contentDisposition = GCDWebServerNormalizeHeaderValue(value);\n              if ([GCDWebServerTruncateHeaderValue(contentDisposition) isEqualToString:@\"form-data\"]) {\n                _controlName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @\"name\");\n                _fileName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @\"filename\");\n              } else if ([GCDWebServerTruncateHeaderValue(contentDisposition) isEqualToString:@\"file\"]) {\n                _controlName = _defaultcontrolName;\n                _fileName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @\"filename\");\n              }\n            }\n          } else {\n            GWS_DNOT_REACHED();\n          }\n        }\n        if (_contentType == nil) {\n          _contentType = @\"text/plain\";\n        }\n      } else {\n        GWS_LOG_ERROR(@\"Failed decoding headers in part of 'multipart/form-data'\");\n        GWS_DNOT_REACHED();\n      }\n      if (_controlName) {\n        if ([GCDWebServerTruncateHeaderValue(_contentType) isEqualToString:@\"multipart/mixed\"]) {\n          NSString* boundary = GCDWebServerExtractHeaderValueParameter(_contentType, @\"boundary\");\n          _subParser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:_controlName arguments:_arguments files:_files];\n          if (_subParser == nil) {\n            GWS_DNOT_REACHED();\n            success = NO;\n          }\n        } else if (_fileName) {\n          NSString* path = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];\n          _tmpFile = open([path fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);\n          if (_tmpFile > 0) {\n            _tmpPath = [path copy];\n          } else {\n            GWS_DNOT_REACHED();\n            success = NO;\n          }\n        }\n      } else {\n        GWS_DNOT_REACHED();\n        success = NO;\n      }\n\n      [_data replaceBytesInRange:NSMakeRange(0, range.location + range.length) withBytes:NULL length:0];\n      _state = kParserState_Content;\n    }\n  }\n\n  if ((_state == kParserState_Start) || (_state == kParserState_Content)) {\n    NSRange range = [_data rangeOfData:_boundary options:0 range:NSMakeRange(0, _data.length)];\n    if (range.location != NSNotFound) {\n      NSRange subRange = NSMakeRange(range.location + range.length, _data.length - range.location - range.length);\n      NSRange subRange1 = [_data rangeOfData:_newlineData options:NSDataSearchAnchored range:subRange];\n      NSRange subRange2 = [_data rangeOfData:_dashNewlineData options:NSDataSearchAnchored range:subRange];\n      if ((subRange1.location != NSNotFound) || (subRange2.location != NSNotFound)) {\n        if (_state == kParserState_Content) {\n          const void* dataBytes = _data.bytes;\n          NSUInteger dataLength = range.location - 2;\n          if (_subParser) {\n            if (![_subParser appendBytes:dataBytes length:(dataLength + 2)] || ![_subParser isAtEnd]) {\n              GWS_DNOT_REACHED();\n              success = NO;\n            }\n            _subParser = nil;\n          } else if (_tmpPath) {\n            ssize_t result = write(_tmpFile, dataBytes, dataLength);\n            if (result == (ssize_t)dataLength) {\n              if (close(_tmpFile) == 0) {\n                _tmpFile = 0;\n                GCDWebServerMultiPartFile* file = [[GCDWebServerMultiPartFile alloc] initWithControlName:_controlName contentType:_contentType fileName:_fileName temporaryPath:_tmpPath];\n                [_files addObject:file];\n              } else {\n                GWS_DNOT_REACHED();\n                success = NO;\n              }\n            } else {\n              GWS_DNOT_REACHED();\n              success = NO;\n            }\n            _tmpPath = nil;\n          } else {\n            NSData* data = [[NSData alloc] initWithBytes:(void*)dataBytes length:dataLength];\n            GCDWebServerMultiPartArgument* argument = [[GCDWebServerMultiPartArgument alloc] initWithControlName:_controlName contentType:_contentType data:data];\n            [_arguments addObject:argument];\n          }\n        }\n\n        if (subRange1.location != NSNotFound) {\n          [_data replaceBytesInRange:NSMakeRange(0, subRange1.location + subRange1.length) withBytes:NULL length:0];\n          _state = kParserState_Headers;\n          success = [self _parseData];\n        } else {\n          _state = kParserState_End;\n        }\n      }\n    } else {\n      NSUInteger margin = 2 * _boundary.length;\n      if (_data.length > margin) {\n        NSUInteger length = _data.length - margin;\n        if (_subParser) {\n          if ([_subParser appendBytes:_data.bytes length:length]) {\n            [_data replaceBytesInRange:NSMakeRange(0, length) withBytes:NULL length:0];\n          } else {\n            GWS_DNOT_REACHED();\n            success = NO;\n          }\n        } else if (_tmpPath) {\n          ssize_t result = write(_tmpFile, _data.bytes, length);\n          if (result == (ssize_t)length) {\n            [_data replaceBytesInRange:NSMakeRange(0, length) withBytes:NULL length:0];\n          } else {\n            GWS_DNOT_REACHED();\n            success = NO;\n          }\n        }\n      }\n    }\n  }\n\n  return success;\n}\n\n- (BOOL)appendBytes:(const void*)bytes length:(NSUInteger)length {\n  [_data appendBytes:bytes length:length];\n  return [self _parseData];\n}\n\n- (BOOL)isAtEnd {\n  return (_state == kParserState_End);\n}\n\n@end\n\n@interface GCDWebServerMultiPartFormRequest ()\n@property(nonatomic) NSMutableArray<GCDWebServerMultiPartArgument*>* arguments;\n@property(nonatomic) NSMutableArray<GCDWebServerMultiPartFile*>* files;\n@end\n\n@implementation GCDWebServerMultiPartFormRequest {\n  GCDWebServerMIMEStreamParser* _parser;\n}\n\n+ (NSString*)mimeType {\n  return @\"multipart/form-data\";\n}\n\n- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary<NSString*, NSString*>*)headers path:(NSString*)path query:(NSDictionary<NSString*, NSString*>*)query {\n  if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {\n    _arguments = [[NSMutableArray alloc] init];\n    _files = [[NSMutableArray alloc] init];\n  }\n  return self;\n}\n\n- (BOOL)open:(NSError**)error {\n  NSString* boundary = GCDWebServerExtractHeaderValueParameter(self.contentType, @\"boundary\");\n  _parser = [[GCDWebServerMIMEStreamParser alloc] initWithBoundary:boundary defaultControlName:nil arguments:_arguments files:_files];\n  if (_parser == nil) {\n    if (error) {\n      *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @\"Failed starting to parse multipart form data\"}];\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)writeData:(NSData*)data error:(NSError**)error {\n  if (![_parser appendBytes:data.bytes length:data.length]) {\n    if (error) {\n      *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @\"Failed continuing to parse multipart form data\"}];\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)close:(NSError**)error {\n  BOOL atEnd = [_parser isAtEnd];\n  _parser = nil;\n  if (!atEnd) {\n    if (error) {\n      *error = [NSError errorWithDomain:kGCDWebServerErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @\"Failed finishing to parse multipart form data\"}];\n    }\n    return NO;\n  }\n  return YES;\n}\n\n- (GCDWebServerMultiPartArgument*)firstArgumentForControlName:(NSString*)name {\n  for (GCDWebServerMultiPartArgument* argument in _arguments) {\n    if ([argument.controlName isEqualToString:name]) {\n      return argument;\n    }\n  }\n  return nil;\n}\n\n- (GCDWebServerMultiPartFile*)firstFileForControlName:(NSString*)name {\n  for (GCDWebServerMultiPartFile* file in _files) {\n    if ([file.controlName isEqualToString:name]) {\n      return file;\n    }\n  }\n  return nil;\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  if (_arguments.count) {\n    [description appendString:@\"\\n\"];\n    for (GCDWebServerMultiPartArgument* argument in _arguments) {\n      [description appendFormat:@\"\\n%@ (%@)\\n\", argument.controlName, argument.contentType];\n      [description appendString:GCDWebServerDescribeData(argument.data, argument.contentType)];\n    }\n  }\n  if (_files.count) {\n    [description appendString:@\"\\n\"];\n    for (GCDWebServerMultiPartFile* file in _files) {\n      [description appendFormat:@\"\\n%@ (%@): %@\\n{%@}\", file.controlName, file.contentType, file.fileName, file.temporaryPath];\n    }\n  }\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerDataRequest.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerURLEncodedFormRequest subclass of GCDWebServerRequest\n *  parses the body of the HTTP request as a URL encoded form using\n *  GCDWebServerParseURLEncodedForm().\n */\n@interface GCDWebServerURLEncodedFormRequest : GCDWebServerDataRequest\n\n/**\n *  Returns the unescaped control names and values for the URL encoded form.\n *\n *  The text encoding used to interpret the data is extracted from the\n *  \"Content-Type\" header or defaults to UTF-8.\n */\n@property(nonatomic, readonly) NSDictionary<NSString*, NSString*>* arguments;\n\n/**\n *  Returns the MIME type for URL encoded forms\n *  i.e. \"application/x-www-form-urlencoded\".\n */\n+ (NSString*)mimeType;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@implementation GCDWebServerURLEncodedFormRequest\n\n+ (NSString*)mimeType {\n  return @\"application/x-www-form-urlencoded\";\n}\n\n- (BOOL)close:(NSError**)error {\n  if (![super close:error]) {\n    return NO;\n  }\n\n  NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @\"charset\");\n  NSString* string = [[NSString alloc] initWithData:self.data encoding:GCDWebServerStringEncodingFromCharset(charset)];\n  _arguments = GCDWebServerParseURLEncodedForm(string);\n  return YES;\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  [description appendString:@\"\\n\"];\n  for (NSString* argument in [[_arguments allKeys] sortedArrayUsingSelector:@selector(compare:)]) {\n    [description appendFormat:@\"\\n%@ = %@\", argument, [_arguments objectForKey:argument]];\n  }\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerResponse.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerDataResponse subclass of GCDWebServerResponse reads the body\n *  of the HTTP response from memory.\n */\n@interface GCDWebServerDataResponse : GCDWebServerResponse\n@property(nonatomic, copy) NSString* contentType;  // Redeclare as non-null\n\n/**\n *  Creates a response with data in memory and a given content type.\n */\n+ (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type;\n\n/**\n *  This method is the designated initializer for the class.\n */\n- (instancetype)initWithData:(NSData*)data contentType:(NSString*)type;\n\n@end\n\n@interface GCDWebServerDataResponse (Extensions)\n\n/**\n *  Creates a data response from text encoded using UTF-8.\n */\n+ (nullable instancetype)responseWithText:(NSString*)text;\n\n/**\n *  Creates a data response from HTML encoded using UTF-8.\n */\n+ (nullable instancetype)responseWithHTML:(NSString*)html;\n\n/**\n *  Creates a data response from an HTML template encoded using UTF-8.\n *  See -initWithHTMLTemplate:variables: for details.\n */\n+ (nullable instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary<NSString*, NSString*>*)variables;\n\n/**\n *  Creates a data response from a serialized JSON object and the default\n *  \"application/json\" content type.\n */\n+ (nullable instancetype)responseWithJSONObject:(id)object;\n\n/**\n *  Creates a data response from a serialized JSON object and a custom\n *  content type.\n */\n+ (nullable instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type;\n\n/**\n *  Initializes a data response from text encoded using UTF-8.\n */\n- (nullable instancetype)initWithText:(NSString*)text;\n\n/**\n *  Initializes a data response from HTML encoded using UTF-8.\n */\n- (nullable instancetype)initWithHTML:(NSString*)html;\n\n/**\n *  Initializes a data response from an HTML template encoded using UTF-8.\n *\n *  All occurences of \"%variable%\" within the HTML template are replaced with\n *  their corresponding values.\n */\n- (nullable instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary<NSString*, NSString*>*)variables;\n\n/**\n *  Initializes a data response from a serialized JSON object and the default\n *  \"application/json\" content type.\n */\n- (nullable instancetype)initWithJSONObject:(id)object;\n\n/**\n *  Initializes a data response from a serialized JSON object and a custom\n *  content type.\n */\n- (nullable instancetype)initWithJSONObject:(id)object contentType:(NSString*)type;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerDataResponse.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@implementation GCDWebServerDataResponse {\n  NSData* _data;\n  BOOL _done;\n}\n\n@dynamic contentType;\n\n+ (instancetype)responseWithData:(NSData*)data contentType:(NSString*)type {\n  return [(GCDWebServerDataResponse*)[[self class] alloc] initWithData:data contentType:type];\n}\n\n- (instancetype)initWithData:(NSData*)data contentType:(NSString*)type {\n  if ((self = [super init])) {\n    _data = data;\n\n    self.contentType = type;\n    self.contentLength = data.length;\n  }\n  return self;\n}\n\n- (NSData*)readData:(NSError**)error {\n  NSData* data;\n  if (_done) {\n    data = [NSData data];\n  } else {\n    data = _data;\n    _done = YES;\n  }\n  return data;\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  [description appendString:@\"\\n\\n\"];\n  [description appendString:GCDWebServerDescribeData(_data, self.contentType)];\n  return description;\n}\n\n@end\n\n@implementation GCDWebServerDataResponse (Extensions)\n\n+ (instancetype)responseWithText:(NSString*)text {\n  return [(GCDWebServerDataResponse*)[self alloc] initWithText:text];\n}\n\n+ (instancetype)responseWithHTML:(NSString*)html {\n  return [(GCDWebServerDataResponse*)[self alloc] initWithHTML:html];\n}\n\n+ (instancetype)responseWithHTMLTemplate:(NSString*)path variables:(NSDictionary<NSString*, NSString*>*)variables {\n  return [(GCDWebServerDataResponse*)[self alloc] initWithHTMLTemplate:path variables:variables];\n}\n\n+ (instancetype)responseWithJSONObject:(id)object {\n  return [(GCDWebServerDataResponse*)[self alloc] initWithJSONObject:object];\n}\n\n+ (instancetype)responseWithJSONObject:(id)object contentType:(NSString*)type {\n  return [(GCDWebServerDataResponse*)[self alloc] initWithJSONObject:object contentType:type];\n}\n\n- (instancetype)initWithText:(NSString*)text {\n  NSData* data = [text dataUsingEncoding:NSUTF8StringEncoding];\n  if (data == nil) {\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n  return [self initWithData:data contentType:@\"text/plain; charset=utf-8\"];\n}\n\n- (instancetype)initWithHTML:(NSString*)html {\n  NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];\n  if (data == nil) {\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n  return [self initWithData:data contentType:@\"text/html; charset=utf-8\"];\n}\n\n- (instancetype)initWithHTMLTemplate:(NSString*)path variables:(NSDictionary<NSString*, NSString*>*)variables {\n  NSMutableString* html = [[NSMutableString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];\n  [variables enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) {\n    [html replaceOccurrencesOfString:[NSString stringWithFormat:@\"%%%@%%\", key] withString:value options:0 range:NSMakeRange(0, html.length)];\n  }];\n  return [self initWithHTML:html];\n}\n\n- (instancetype)initWithJSONObject:(id)object {\n  return [self initWithJSONObject:object contentType:@\"application/json\"];\n}\n\n- (instancetype)initWithJSONObject:(id)object contentType:(NSString*)type {\n  NSData* data = [NSJSONSerialization dataWithJSONObject:object options:0 error:NULL];\n  if (data == nil) {\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n  return [self initWithData:data contentType:type];\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerDataResponse.h\"\n#import \"GCDWebServerHTTPStatusCodes.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerDataResponse subclass of GCDWebServerDataResponse generates\n *  an HTML body from an HTTP status code and an error message.\n */\n@interface GCDWebServerErrorResponse : GCDWebServerDataResponse\n\n/**\n *  Creates a client error response with the corresponding HTTP status code.\n */\n+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3);\n\n/**\n *  Creates a server error response with the corresponding HTTP status code.\n */\n+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3);\n\n/**\n *  Creates a client error response with the corresponding HTTP status code\n *  and an underlying NSError.\n */\n+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4);\n\n/**\n *  Creates a server error response with the corresponding HTTP status code\n *  and an underlying NSError.\n */\n+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4);\n\n/**\n *  Initializes a client error response with the corresponding HTTP status code.\n */\n- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3);\n\n/**\n *  Initializes a server error response with the corresponding HTTP status code.\n */\n- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... NS_FORMAT_FUNCTION(2, 3);\n\n/**\n *  Initializes a client error response with the corresponding HTTP status code\n *  and an underlying NSError.\n */\n- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4);\n\n/**\n *  Initializes a server error response with the corresponding HTTP status code\n *  and an underlying NSError.\n */\n- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(nullable NSError*)underlyingError message:(NSString*)format, ... NS_FORMAT_FUNCTION(3, 4);\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerErrorResponse.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@implementation GCDWebServerErrorResponse\n\n+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));\n  va_list arguments;\n  va_start(arguments, format);\n  GCDWebServerErrorResponse* response = [(GCDWebServerErrorResponse*)[self alloc] initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return response;\n}\n\n+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));\n  va_list arguments;\n  va_start(arguments, format);\n  GCDWebServerErrorResponse* response = [(GCDWebServerErrorResponse*)[self alloc] initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return response;\n}\n\n+ (instancetype)responseWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));\n  va_list arguments;\n  va_start(arguments, format);\n  GCDWebServerErrorResponse* response = [(GCDWebServerErrorResponse*)[self alloc] initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return response;\n}\n\n+ (instancetype)responseWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));\n  va_list arguments;\n  va_start(arguments, format);\n  GCDWebServerErrorResponse* response = [(GCDWebServerErrorResponse*)[self alloc] initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return response;\n}\n\nstatic inline NSString* _EscapeHTMLString(NSString* string) {\n  return [string stringByReplacingOccurrencesOfString:@\"\\\"\" withString:@\"&quot;\"];\n}\n\n- (instancetype)initWithStatusCode:(NSInteger)statusCode underlyingError:(NSError*)underlyingError messageFormat:(NSString*)format arguments:(va_list)arguments {\n  NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];\n  NSString* title = [NSString stringWithFormat:@\"HTTP Error %i\", (int)statusCode];\n  NSString* error = underlyingError ? [NSString stringWithFormat:@\"[%@] %@ (%li)\", underlyingError.domain, _EscapeHTMLString(underlyingError.localizedDescription), (long)underlyingError.code] : @\"\";\n  NSString* html = [NSString stringWithFormat:@\"<!DOCTYPE html><html lang=\\\"en\\\"><head><meta charset=\\\"utf-8\\\"><title>%@</title></head><body><h1>%@: %@</h1><h3>%@</h3></body></html>\",\n                                              title, title, _EscapeHTMLString(message), error];\n  if ((self = [self initWithHTML:html])) {\n    self.statusCode = statusCode;\n  }\n  return self;\n}\n\n- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));\n  va_list arguments;\n  va_start(arguments, format);\n  self = [self initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return self;\n}\n\n- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));\n  va_list arguments;\n  va_start(arguments, format);\n  self = [self initWithStatusCode:errorCode underlyingError:nil messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return self;\n}\n\n- (instancetype)initWithClientError:(GCDWebServerClientErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 400) && ((NSInteger)errorCode < 500));\n  va_list arguments;\n  va_start(arguments, format);\n  self = [self initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return self;\n}\n\n- (instancetype)initWithServerError:(GCDWebServerServerErrorHTTPStatusCode)errorCode underlyingError:(NSError*)underlyingError message:(NSString*)format, ... {\n  GWS_DCHECK(((NSInteger)errorCode >= 500) && ((NSInteger)errorCode < 600));\n  va_list arguments;\n  va_start(arguments, format);\n  self = [self initWithStatusCode:errorCode underlyingError:underlyingError messageFormat:format arguments:arguments];\n  va_end(arguments);\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerResponse.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerFileResponse subclass of GCDWebServerResponse reads the body\n *  of the HTTP response from a file on disk.\n *\n *  It will automatically set the contentType, lastModifiedDate and eTag\n *  properties of the GCDWebServerResponse according to the file extension and\n *  metadata.\n */\n@interface GCDWebServerFileResponse : GCDWebServerResponse\n@property(nonatomic, copy) NSString* contentType;  // Redeclare as non-null\n@property(nonatomic) NSDate* lastModifiedDate;  // Redeclare as non-null\n@property(nonatomic, copy) NSString* eTag;  // Redeclare as non-null\n\n/**\n *  Creates a response with the contents of a file.\n */\n+ (nullable instancetype)responseWithFile:(NSString*)path;\n\n/**\n *  Creates a response like +responseWithFile: and sets the \"Content-Disposition\"\n *  HTTP header for a download if the \"attachment\" argument is YES.\n */\n+ (nullable instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment;\n\n/**\n *  Creates a response like +responseWithFile: but restricts the file contents\n *  to a specific byte range.\n *\n *  See -initWithFile:byteRange: for details.\n */\n+ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range;\n\n/**\n *  Creates a response like +responseWithFile:byteRange: and sets the\n *  \"Content-Disposition\" HTTP header for a download if the \"attachment\"\n *  argument is YES.\n */\n+ (nullable instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment;\n\n/**\n *  Initializes a response with the contents of a file.\n */\n- (nullable instancetype)initWithFile:(NSString*)path;\n\n/**\n *  Initializes a response like +responseWithFile: and sets the\n *  \"Content-Disposition\" HTTP header for a download if the \"attachment\"\n *  argument is YES.\n */\n- (nullable instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment;\n\n/**\n *  Initializes a response like -initWithFile: but restricts the file contents\n *  to a specific byte range. This range should be set to (NSUIntegerMax, 0) for\n *  the full file, (offset, length) if expressed from the beginning of the file,\n *  or (NSUIntegerMax, length) if expressed from the end of the file. The \"offset\"\n *  and \"length\" values will be automatically adjusted to be compatible with the\n *  actual size of the file.\n *\n *  This argument would typically be set to the value of the byteRange property\n *  of the current GCDWebServerRequest.\n */\n- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range;\n\n/**\n *  This method is the designated initializer for the class.\n *\n *  If MIME type overrides are specified, they allow to customize the built-in\n *  mapping from extensions to MIME types. Keys of the dictionary must be lowercased\n *  file extensions without the period, and the values must be the corresponding\n *  MIME types.\n */\n- (nullable instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(nullable NSDictionary<NSString*, NSString*>*)overrides;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerFileResponse.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import <sys/stat.h>\n\n#import \"GCDWebServerPrivate.h\"\n\n#define kFileReadBufferSize (32 * 1024)\n\n@implementation GCDWebServerFileResponse {\n  NSString* _path;\n  NSUInteger _offset;\n  NSUInteger _size;\n  int _file;\n}\n\n@dynamic contentType, lastModifiedDate, eTag;\n\n+ (instancetype)responseWithFile:(NSString*)path {\n  return [(GCDWebServerFileResponse*)[[self class] alloc] initWithFile:path];\n}\n\n+ (instancetype)responseWithFile:(NSString*)path isAttachment:(BOOL)attachment {\n  return [(GCDWebServerFileResponse*)[[self class] alloc] initWithFile:path isAttachment:attachment];\n}\n\n+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range {\n  return [(GCDWebServerFileResponse*)[[self class] alloc] initWithFile:path byteRange:range];\n}\n\n+ (instancetype)responseWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment {\n  return [(GCDWebServerFileResponse*)[[self class] alloc] initWithFile:path byteRange:range isAttachment:attachment mimeTypeOverrides:nil];\n}\n\n- (instancetype)initWithFile:(NSString*)path {\n  return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:NO mimeTypeOverrides:nil];\n}\n\n- (instancetype)initWithFile:(NSString*)path isAttachment:(BOOL)attachment {\n  return [self initWithFile:path byteRange:NSMakeRange(NSUIntegerMax, 0) isAttachment:attachment mimeTypeOverrides:nil];\n}\n\n- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range {\n  return [self initWithFile:path byteRange:range isAttachment:NO mimeTypeOverrides:nil];\n}\n\nstatic inline NSDate* _NSDateFromTimeSpec(const struct timespec* t) {\n  return [NSDate dateWithTimeIntervalSince1970:((NSTimeInterval)t->tv_sec + (NSTimeInterval)t->tv_nsec / 1000000000.0)];\n}\n\n- (instancetype)initWithFile:(NSString*)path byteRange:(NSRange)range isAttachment:(BOOL)attachment mimeTypeOverrides:(NSDictionary<NSString*, NSString*>*)overrides {\n  struct stat info;\n  if (lstat([path fileSystemRepresentation], &info) || !(info.st_mode & S_IFREG)) {\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n#ifndef __LP64__\n  if (info.st_size >= (off_t)4294967295) {  // In 32 bit mode, we can't handle files greater than 4 GiBs (don't use \"NSUIntegerMax\" here to avoid potential unsigned to signed conversion issues)\n    GWS_DNOT_REACHED();\n    return nil;\n  }\n#endif\n  NSUInteger fileSize = (NSUInteger)info.st_size;\n\n  BOOL hasByteRange = GCDWebServerIsValidByteRange(range);\n  if (hasByteRange) {\n    if (range.location != NSUIntegerMax) {\n      range.location = MIN(range.location, fileSize);\n      range.length = MIN(range.length, fileSize - range.location);\n    } else {\n      range.length = MIN(range.length, fileSize);\n      range.location = fileSize - range.length;\n    }\n    if (range.length == 0) {\n      return nil;  // TODO: Return 416 status code and \"Content-Range: bytes */{file length}\" header\n    }\n  } else {\n    range.location = 0;\n    range.length = fileSize;\n  }\n\n  if ((self = [super init])) {\n    _path = [path copy];\n    _offset = range.location;\n    _size = range.length;\n    if (hasByteRange) {\n      [self setStatusCode:kGCDWebServerHTTPStatusCode_PartialContent];\n      [self setValue:[NSString stringWithFormat:@\"bytes %lu-%lu/%lu\", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), (unsigned long)fileSize] forAdditionalHeader:@\"Content-Range\"];\n      GWS_LOG_DEBUG(@\"Using content bytes range [%lu-%lu] for file \\\"%@\\\"\", (unsigned long)_offset, (unsigned long)(_offset + _size - 1), path);\n    }\n\n    if (attachment) {\n      NSString* fileName = [path lastPathComponent];\n      NSData* data = [[fileName stringByReplacingOccurrencesOfString:@\"\\\"\" withString:@\"\"] dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES];\n      NSString* lossyFileName = data ? [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding] : nil;\n      if (lossyFileName) {\n        NSString* value = [NSString stringWithFormat:@\"attachment; filename=\\\"%@\\\"; filename*=UTF-8''%@\", lossyFileName, GCDWebServerEscapeURLString(fileName)];\n        [self setValue:value forAdditionalHeader:@\"Content-Disposition\"];\n      } else {\n        GWS_DNOT_REACHED();\n      }\n    }\n\n    self.contentType = GCDWebServerGetMimeTypeForExtension([_path pathExtension], overrides);\n    self.contentLength = _size;\n    self.lastModifiedDate = _NSDateFromTimeSpec(&info.st_mtimespec);\n    self.eTag = [NSString stringWithFormat:@\"%llu/%li/%li\", info.st_ino, info.st_mtimespec.tv_sec, info.st_mtimespec.tv_nsec];\n  }\n  return self;\n}\n\n- (BOOL)open:(NSError**)error {\n  _file = open([_path fileSystemRepresentation], O_NOFOLLOW | O_RDONLY);\n  if (_file <= 0) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    return NO;\n  }\n  if (lseek(_file, _offset, SEEK_SET) != (off_t)_offset) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    close(_file);\n    return NO;\n  }\n  return YES;\n}\n\n- (NSData*)readData:(NSError**)error {\n  size_t length = MIN((NSUInteger)kFileReadBufferSize, _size);\n  NSMutableData* data = [[NSMutableData alloc] initWithLength:length];\n  ssize_t result = read(_file, data.mutableBytes, length);\n  if (result < 0) {\n    if (error) {\n      *error = GCDWebServerMakePosixError(errno);\n    }\n    return nil;\n  }\n  if (result > 0) {\n    [data setLength:result];\n    _size -= result;\n  }\n  return data;\n}\n\n- (void)close {\n  close(_file);\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  [description appendFormat:@\"\\n\\n{%@}\", _path];\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.h",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#import \"GCDWebServerResponse.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n *  The GCDWebServerStreamBlock is called to stream the data for the HTTP body.\n *  The block must return either a chunk of data, an empty NSData when done, or\n *  nil on error and set the \"error\" argument which is guaranteed to be non-NULL.\n */\ntypedef NSData* _Nullable (^GCDWebServerStreamBlock)(NSError** error);\n\n/**\n *  The GCDWebServerAsyncStreamBlock works like the GCDWebServerStreamBlock\n *  except the streamed data can be returned at a later time allowing for\n *  truly asynchronous generation of the data.\n *\n *  The block must call \"completionBlock\" passing the new chunk of data when ready,\n *  an empty NSData when done, or nil on error and pass a NSError.\n *\n *  The block cannot call \"completionBlock\" more than once per invocation.\n */\ntypedef void (^GCDWebServerAsyncStreamBlock)(GCDWebServerBodyReaderCompletionBlock completionBlock);\n\n/**\n *  The GCDWebServerStreamedResponse subclass of GCDWebServerResponse streams\n *  the body of the HTTP response using a GCD block.\n */\n@interface GCDWebServerStreamedResponse : GCDWebServerResponse\n@property(nonatomic, copy) NSString* contentType;  // Redeclare as non-null\n\n/**\n *  Creates a response with streamed data and a given content type.\n */\n+ (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block;\n\n/**\n *  Creates a response with async streamed data and a given content type.\n */\n+ (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block;\n\n/**\n *  Initializes a response with streamed data and a given content type.\n */\n- (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block;\n\n/**\n *  This method is the designated initializer for the class.\n */\n- (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/GCDWebServer/GCDWebServer/Responses/GCDWebServerStreamedResponse.m",
    "content": "/*\n Copyright (c) 2012-2019, Pierre-Olivier Latour\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * The name of Pierre-Olivier Latour may not be used to endorse\n or promote products derived from this software without specific\n prior written permission.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n DISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#if !__has_feature(objc_arc)\n#error GCDWebServer requires ARC\n#endif\n\n#import \"GCDWebServerPrivate.h\"\n\n@implementation GCDWebServerStreamedResponse {\n  GCDWebServerAsyncStreamBlock _block;\n}\n\n@dynamic contentType;\n\n+ (instancetype)responseWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block {\n  return [(GCDWebServerStreamedResponse*)[[self class] alloc] initWithContentType:type streamBlock:block];\n}\n\n+ (instancetype)responseWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block {\n  return [(GCDWebServerStreamedResponse*)[[self class] alloc] initWithContentType:type asyncStreamBlock:block];\n}\n\n- (instancetype)initWithContentType:(NSString*)type streamBlock:(GCDWebServerStreamBlock)block {\n  return [self initWithContentType:type\n                  asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {\n                    NSError* error = nil;\n                    NSData* data = block(&error);\n                    completionBlock(data, error);\n                  }];\n}\n\n- (instancetype)initWithContentType:(NSString*)type asyncStreamBlock:(GCDWebServerAsyncStreamBlock)block {\n  if ((self = [super init])) {\n    _block = [block copy];\n\n    self.contentType = type;\n  }\n  return self;\n}\n\n- (void)asyncReadDataWithCompletion:(GCDWebServerBodyReaderCompletionBlock)block {\n  _block(block);\n}\n\n- (NSString*)description {\n  NSMutableString* description = [NSMutableString stringWithString:[super description]];\n  [description appendString:@\"\\n\\n<STREAM>\"];\n  return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/GCDWebServer/LICENSE",
    "content": "Copyright (c) 2012-2014, Pierre-Olivier Latour\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * The name of Pierre-Olivier Latour may not be used to endorse\n      or promote products derived from this software without specific\n      prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Pods/GCDWebServer/README.md",
    "content": "Overview\n========\n\n[![Build Status](https://travis-ci.org/swisspol/GCDWebServer.svg?branch=master)](https://travis-ci.org/swisspol/GCDWebServer)\n[![Version](http://cocoapod-badges.herokuapp.com/v/GCDWebServer/badge.png)](https://cocoapods.org/pods/GCDWebServer)\n[![Platform](http://cocoapod-badges.herokuapp.com/p/GCDWebServer/badge.png)](https://github.com/swisspol/GCDWebServer)\n[![License](http://img.shields.io/cocoapods/l/GCDWebServer.svg)](LICENSE)\n\nGCDWebServer is a modern and lightweight GCD based HTTP 1.1 server designed to be embedded in iOS, macOS & tvOS apps. It was written from scratch with the following goals in mind:\n* Elegant and easy to use architecture with only 4 core classes: server, connection, request and response (see \"Understanding GCDWebServer's Architecture\" below)\n* Well designed API with fully documented headers for easy integration and customization\n* Entirely built with an event-driven design using [Grand Central Dispatch](http://en.wikipedia.org/wiki/Grand_Central_Dispatch) for best performance and concurrency\n* No dependencies on third-party source code\n* Available under a friendly [New BSD License](LICENSE)\n\nExtra built-in features:\n* Allow implementation of fully asynchronous handlers of incoming HTTP requests\n* Minimize memory usage with disk streaming of large HTTP request or response bodies\n* Parser for [web forms](http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4) submitted using \"application/x-www-form-urlencoded\" or \"multipart/form-data\" encodings (including file uploads)\n* [JSON](http://www.json.org/) parsing and serialization for request and response HTTP bodies\n* [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) for request and response HTTP bodies\n* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with gzip for request and response HTTP bodies\n* [HTTP range](https://en.wikipedia.org/wiki/Byte_serving) support for requests of local files\n* [Basic](https://en.wikipedia.org/wiki/Basic_access_authentication) and [Digest Access](https://en.wikipedia.org/wiki/Digest_access_authentication) authentications for password protection\n* Automatically handle transitions between foreground, background and suspended modes in iOS apps\n* Full support for both IPv4 and IPv6\n* NAT port mapping (IPv4 only)\n\nIncluded extensions:\n* [GCDWebUploader](GCDWebUploader/GCDWebUploader.h): subclass of ```GCDWebServer``` that implements an interface for uploading and downloading files using a web browser\n* [GCDWebDAVServer](GCDWebDAVServer/GCDWebDAVServer.h): subclass of ```GCDWebServer``` that implements a class 1 [WebDAV](https://en.wikipedia.org/wiki/WebDAV) server (with partial class 2 support for macOS Finder)\n\nWhat's not supported (but not really required from an embedded HTTP server):\n* Keep-alive connections\n* HTTPS\n\nRequirements:\n* macOS 10.7 or later (x86_64)\n* iOS 8.0 or later (armv7, armv7s or arm64)\n* tvOS 9.0 or later (arm64)\n* ARC memory management only (if you need MRC support use GCDWebServer 3.1 or earlier)\n\nGetting Started\n===============\n\nDownload or check out the [latest release](https://github.com/swisspol/GCDWebServer/releases) of GCDWebServer then add the entire \"GCDWebServer\" subfolder to your Xcode project. If you intend to use one of the extensions like GCDWebDAVServer or GCDWebUploader, add these subfolders as well. Finally link to `libz` (via Target > Build Phases > Link Binary With Libraries) and add `$(SDKROOT)/usr/include/libxml2` to your header search paths (via Target > Build Settings > HEADER_SEARCH_PATHS).\n\nAlternatively, you can install GCDWebServer using [CocoaPods](http://cocoapods.org/) by simply adding this line to your Podfile:\n```\npod \"GCDWebServer\", \"~> 3.0\"\n```\nIf you want to use GCDWebUploader, use this line instead:\n```\npod \"GCDWebServer/WebUploader\", \"~> 3.0\"\n```\nOr this line for GCDWebDAVServer:\n```\npod \"GCDWebServer/WebDAV\", \"~> 3.0\"\n```\n\nAnd finally run `$ pod install`.\n\nYou can also use [Carthage](https://github.com/Carthage/Carthage) by adding this line to your Cartfile (3.2.5 is the first release with Carthage support):\n```\ngithub \"swisspol/GCDWebServer\" ~> 3.2.5\n```\n\nThen run `$ carthage update` and add the generated frameworks to your Xcode projects (see [Carthage instructions](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application)).\n\nHelp & Support\n==============\n\nFor help with using GCDWebServer, it's best to ask your question on Stack Overflow with the [`gcdwebserver`](http://stackoverflow.com/questions/tagged/gcdwebserver) tag. For bug reports and enhancement requests you can use [issues](https://github.com/swisspol/GCDWebServer/issues) in this project.\n\nBe sure to read this entire README first though!\n\nHello World\n===========\n\nThese code snippets show how to implement a custom HTTP server that runs on port 8080 and returns a \"Hello World\" HTML page to any request. Since GCDWebServer uses GCD blocks to handle requests, no subclassing or delegates are needed, which results in very clean code.\n\n**IMPORTANT:** If not using CocoaPods, be sure to add the `libz` shared system library to the Xcode target for your app.\n\n**macOS version (command line tool):**\n```objectivec\n#import \"GCDWebServer.h\"\n#import \"GCDWebServerDataResponse.h\"\n\nint main(int argc, const char* argv[]) {\n  @autoreleasepool {\n    \n    // Create server\n    GCDWebServer* webServer = [[GCDWebServer alloc] init];\n    \n    // Add a handler to respond to GET requests on any URL\n    [webServer addDefaultHandlerForMethod:@\"GET\"\n                             requestClass:[GCDWebServerRequest class]\n                             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n      \n      return [GCDWebServerDataResponse responseWithHTML:@\"<html><body><p>Hello World</p></body></html>\"];\n      \n    }];\n    \n    // Use convenience method that runs server on port 8080\n    // until SIGINT (Ctrl-C in Terminal) or SIGTERM is received\n    [webServer runWithPort:8080 bonjourName:nil];\n    NSLog(@\"Visit %@ in your web browser\", webServer.serverURL);\n    \n  }\n  return 0;\n}\n```\n\n**iOS version:**\n```objectivec\n#import \"GCDWebServer.h\"\n#import \"GCDWebServerDataResponse.h\"\n\n@interface AppDelegate : NSObject <UIApplicationDelegate> {\n  GCDWebServer* _webServer;\n}\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {\n  \n  // Create server\n  _webServer = [[GCDWebServer alloc] init];\n  \n  // Add a handler to respond to GET requests on any URL\n  [_webServer addDefaultHandlerForMethod:@\"GET\"\n                            requestClass:[GCDWebServerRequest class]\n                            processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n    \n    return [GCDWebServerDataResponse responseWithHTML:@\"<html><body><p>Hello World</p></body></html>\"];\n    \n  }];\n  \n  // Start server on port 8080\n  [_webServer startWithPort:8080 bonjourName:nil];\n  NSLog(@\"Visit %@ in your web browser\", _webServer.serverURL);\n  \n  return YES;\n}\n\n@end\n```\n\n**macOS Swift version (command line tool):**\n\n***webServer.swift***\n```swift\nimport Foundation\nimport GCDWebServer\n\nfunc initWebServer() {\n\n    let webServer = GCDWebServer()\n\n    webServer.addDefaultHandler(forMethod: \"GET\", request: GCDWebServerRequest.self, processBlock: {request in\n            return GCDWebServerDataResponse(html:\"<html><body><p>Hello World</p></body></html>\")\n            \n        })\n        \n    webServer.start(withPort: 8080, bonjourName: \"GCD Web Server\")\n    \n    print(\"Visit \\(webServer.serverURL) in your web browser\")\n}\n```\n\n***WebServer-Bridging-Header.h***\n```objectivec\n#import <GCDWebServer/GCDWebServer.h>\n#import <GCDWebServer/GCDWebServerDataResponse.h>\n```\n\nWeb Based Uploads in iOS Apps\n=============================\n\nGCDWebUploader is a subclass of ```GCDWebServer``` that provides a ready-to-use HTML 5 file uploader & downloader. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using a clean user interface in their web browser.\n\nSimply instantiate and run a ```GCDWebUploader``` instance then visit ```http://{YOUR-IOS-DEVICE-IP-ADDRESS}/``` from your web browser:\n\n```objectivec\n#import \"GCDWebUploader.h\"\n\n@interface AppDelegate : NSObject <UIApplicationDelegate> {\n  GCDWebUploader* _webUploader;\n}\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {\n  NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];\n  _webUploader = [[GCDWebUploader alloc] initWithUploadDirectory:documentsPath];\n  [_webUploader start];\n  NSLog(@\"Visit %@ in your web browser\", _webUploader.serverURL);\n  return YES;\n}\n\n@end\n```\n\nWebDAV Server in iOS Apps\n=========================\n\nGCDWebDAVServer is a subclass of ```GCDWebServer``` that provides a class 1 compliant [WebDAV](https://en.wikipedia.org/wiki/WebDAV) server. This lets users upload, download, delete files and create directories from a directory inside your iOS app's sandbox using any WebDAV client like [Transmit](https://panic.com/transmit/) (Mac), [ForkLift](http://binarynights.com/forklift/) (Mac) or [CyberDuck](http://cyberduck.io/) (Mac / Windows).\n\nGCDWebDAVServer should also work with the [macOS Finder](http://support.apple.com/kb/PH13859) as it is partially class 2 compliant (but only when the client is the macOS WebDAV implementation).\n\nSimply instantiate and run a ```GCDWebDAVServer``` instance then connect to ```http://{YOUR-IOS-DEVICE-IP-ADDRESS}/``` using a WebDAV client:\n\n```objectivec\n#import \"GCDWebDAVServer.h\"\n\n@interface AppDelegate : NSObject <UIApplicationDelegate> {\n  GCDWebDAVServer* _davServer;\n}\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {\n  NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];\n  _davServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:documentsPath];\n  [_davServer start];\n  NSLog(@\"Visit %@ in your WebDAV client\", _davServer.serverURL);\n  return YES;\n}\n\n@end\n```\n\nServing a Static Website\n========================\n\nGCDWebServer includes a built-in handler that can recursively serve a directory (it also lets you control how the [\"Cache-Control\"](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9) header should be set):\n\n**macOS version (command line tool):**\n```objectivec\n#import \"GCDWebServer.h\"\n\nint main(int argc, const char* argv[]) {\n  @autoreleasepool {\n    \n    GCDWebServer* webServer = [[GCDWebServer alloc] init];\n    [webServer addGETHandlerForBasePath:@\"/\" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];\n    [webServer runWithPort:8080];\n    \n  }\n  return 0;\n}\n```\n\nUsing GCDWebServer\n==================\n\nYou start by creating an instance of the ```GCDWebServer``` class. Note that you can have multiple web servers running in the same app as long as they listen on different ports.\n\nThen you add one or more \"handlers\" to the server: each handler gets a chance to handle an incoming web request and provide a response. Handlers are called in a LIFO queue, so the latest added handler overrides any previously added ones.\n\nFinally you start the server on a given port.\n\nUnderstanding GCDWebServer's Architecture\n=========================================\n\nGCDWebServer's architecture consists of only 4 core classes:\n* [GCDWebServer](GCDWebServer/Core/GCDWebServer.h) manages the socket that listens for new HTTP connections and the list of handlers used by the server.\n* [GCDWebServerConnection](GCDWebServer/Core/GCDWebServerConnection.h) is instantiated by ```GCDWebServer``` to handle each new HTTP connection. Each instance stays alive until the connection is closed. You cannot use this class directly, but it is exposed so you can subclass it to override some hooks.\n* [GCDWebServerRequest](GCDWebServer/Core/GCDWebServerRequest.h) is created by the ```GCDWebServerConnection``` instance after HTTP headers have been received. It wraps the request and handles the HTTP body if any. GCDWebServer comes with [several subclasses](GCDWebServer/Requests) of ```GCDWebServerRequest``` to handle common cases like storing the body in memory or stream it to a file on disk.\n* [GCDWebServerResponse](GCDWebServer/Core/GCDWebServerResponse.h) is created by the request handler and wraps the response HTTP headers and optional body. GCDWebServer comes with [several subclasses](GCDWebServer/Responses) of ```GCDWebServerResponse``` to handle common cases like HTML text in memory or streaming a file from disk.\n\nImplementing Handlers\n=====================\n\nGCDWebServer relies on \"handlers\" to process incoming web requests and generating responses. Handlers are implemented with GCD blocks which makes it very easy to provide your own. However, they are executed on arbitrary threads within GCD so __special attention must be paid to thread-safety and re-entrancy__.\n\nHandlers require 2 GCD blocks:\n* The ```GCDWebServerMatchBlock``` is called on every handler added to the ```GCDWebServer``` instance whenever a web request has started (i.e. HTTP headers have been received). It is passed the basic info for the web request (HTTP method, URL, headers...) and must decide if it wants to handle it or not. If yes, it must return a new ```GCDWebServerRequest``` instance (see above) created with this info. Otherwise, it simply returns nil.\n* The ```GCDWebServerProcessBlock``` or ```GCDWebServerAsyncProcessBlock``` is called after the web request has been fully received and is passed the ```GCDWebServerRequest``` instance created at the previous step. It must return synchronously (if using ```GCDWebServerProcessBlock```) or asynchronously (if using ```GCDWebServerAsyncProcessBlock```) a ```GCDWebServerResponse``` instance (see above) or nil on error, which will result in a 500 HTTP status code returned to the client. It's however recommended to return an instance of [GCDWebServerErrorResponse](GCDWebServer/Responses/GCDWebServerErrorResponse.h) on error so more useful information can be returned to the client.\n\nNote that most methods on ```GCDWebServer``` to add handlers only require the ```GCDWebServerProcessBlock``` or ```GCDWebServerAsyncProcessBlock``` as they already provide a built-in ```GCDWebServerMatchBlock``` e.g. to match a URL path with a Regex.\n\nAsynchronous HTTP Responses\n===========================\n\nNew in GCDWebServer 3.0 is the ability to process HTTP requests asynchronously i.e. add handlers to the server which generate their ```GCDWebServerResponse``` asynchronously. This is achieved by adding handlers that use a ```GCDWebServerAsyncProcessBlock``` instead of a ```GCDWebServerProcessBlock```. Here's an example:\n\n**(Synchronous version)** The handler blocks while generating the HTTP response:\n```objectivec\n[webServer addDefaultHandlerForMethod:@\"GET\"\n                         requestClass:[GCDWebServerRequest class]\n                         processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n  \n  GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@\"<html><body><p>Hello World</p></body></html>\"];\n  return response;\n  \n}];\n```\n\n**(Asynchronous version)** The handler returns immediately and calls back GCDWebServer later with the generated HTTP response:\n```objectivec\n[webServer addDefaultHandlerForMethod:@\"GET\"\n                         requestClass:[GCDWebServerRequest class]\n                    asyncProcessBlock:^(GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock) {\n  \n  // Do some async operation like network access or file I/O (simulated here using dispatch_after())\n  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    GCDWebServerDataResponse* response = [GCDWebServerDataResponse responseWithHTML:@\"<html><body><p>Hello World</p></body></html>\"];\n    completionBlock(response);\n  });\n\n}];\n```\n\n**(Advanced asynchronous version)** The handler returns immediately a streamed HTTP response which itself generates its contents asynchronously:\n```objectivec\n[webServer addDefaultHandlerForMethod:@\"GET\"\n                         requestClass:[GCDWebServerRequest class]\n                         processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n  \n  NSMutableArray* contents = [NSMutableArray arrayWithObjects:@\"<html><body><p>\\n\", @\"Hello World!\\n\", @\"</p></body></html>\\n\", nil];  // Fake data source we are reading from\n  GCDWebServerStreamedResponse* response = [GCDWebServerStreamedResponse responseWithContentType:@\"text/html\" asyncStreamBlock:^(GCDWebServerBodyReaderCompletionBlock completionBlock) {\n    \n    // Simulate a delay reading from the fake data source\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n      NSString* string = contents.firstObject;\n      if (string) {\n        [contents removeObjectAtIndex:0];\n        completionBlock([string dataUsingEncoding:NSUTF8StringEncoding], nil);  // Generate the 2nd part of the stream data\n      } else {\n        completionBlock([NSData data], nil);  // Must pass an empty NSData to signal the end of the stream\n      }\n    });\n    \n  }];\n  return response;\n  \n}];\n```\n\n*Note that you can even combine both the asynchronous and advanced asynchronous versions to return asynchronously an asynchronous HTTP response!*\n\nGCDWebServer & Background Mode for iOS Apps\n===========================================\n\nWhen doing networking operations in iOS apps, you must handle carefully [what happens when iOS puts the app in the background](https://developer.apple.com/library/ios/technotes/tn2277/_index.html). Typically you must stop any network servers while the app is in the background and restart them when the app comes back to the foreground. This can become quite complex considering servers might have ongoing connections when they need to be stopped.\n\nFortunately, GCDWebServer does all of this automatically for you:\n- GCDWebServer begins a [background task](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html) whenever the first HTTP connection is opened and ends it only when the last one is closed. This prevents iOS from suspending the app after it goes in the background, which would immediately kill HTTP connections to the client.\n - While the app is in the background, as long as new HTTP connections keep being initiated, the background task will continue to exist and iOS will not suspend the app **for up to 10 minutes** (unless under sudden and unexpected memory pressure).\n - If the app is still in the background when the last HTTP connection is closed, GCDWebServer will suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option).\n- If the app goes in the background while no HTTP connections are opened, GCDWebServer will immediately suspend itself and stop accepting new connections as if you had called ```-stop``` (this behavior can be disabled with the ```GCDWebServerOption_AutomaticallySuspendInBackground``` option).\n- If the app comes back to the foreground and GCDWebServer had been suspended, it will automatically resume itself and start accepting again new HTTP connections as if you had called ```-start```.\n\nHTTP connections are often initiated in batches (or bursts), for instance when loading a web page with multiple resources. This makes it difficult to accurately detect when the *very last* HTTP connection has been closed: it's possible 2 consecutive HTTP connections part of the same batch would be separated by a small delay instead of overlapping. It would be bad for the client if GCDWebServer suspended itself right in between. The ```GCDWebServerOption_ConnectedStateCoalescingInterval``` option solves this problem elegantly by forcing GCDWebServer to wait some extra delay before performing any action after the last HTTP connection has been closed, just in case a new HTTP connection is initiated within this delay.\n\nLogging in GCDWebServer\n=======================\n\nBoth for debugging and informational purpose, GCDWebServer logs messages extensively whenever something happens. Furthermore, when building GCDWebServer in \"Debug\" mode versus \"Release\" mode, it logs even more information but also performs a number of internal consistency checks. To enable this behavior, define the preprocessor constant ```DEBUG=1``` when compiling GCDWebServer. In Xcode target settings, this can be done by adding ```DEBUG=1``` to the build setting ```GCC_PREPROCESSOR_DEFINITIONS``` when building in \"Debug\" configuration. Finally, you can also control the logging verbosity at run time by calling ```+[GCDWebServer setLogLevel:]```.\n\nBy default, all messages logged by GCDWebServer are sent to its built-in logging facility, which simply outputs to ```stderr``` (assuming a terminal type device is connected). In order to better integrate with the rest of your app or because of the amount of information logged, you might want to use another logging facility.\n\nGCDWebServer has automatic support for [XLFacility](https://github.com/swisspol/XLFacility) (by the same author as GCDWebServer and also open-source): if it is in the same Xcode project, GCDWebServer should use it automatically instead of the built-in logging facility (see [GCDWebServerPrivate.h](GCDWebServer/Core/GCDWebServerPrivate.h) for the implementation details).\n\nIt's also possible to use a custom logging facility - see [GCDWebServer.h](GCDWebServer/Core/GCDWebServer.h) for more information.\n\nAdvanced Example 1: Implementing HTTP Redirects\n===============================================\n\nHere's an example handler that redirects \"/\" to \"/index.html\" using the convenience method on ```GCDWebServerResponse``` (it sets the HTTP status code and \"Location\" header automatically):\n\n```objectivec\n[self addHandlerForMethod:@\"GET\"\n                     path:@\"/\"\n             requestClass:[GCDWebServerRequest class]\n             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n    \n  return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@\"index.html\" relativeToURL:request.URL]\n                                          permanent:NO];\n    \n}];\n```\n\nAdvanced Example 2: Implementing Forms\n======================================\n\nTo implement an HTTP form, you need a pair of handlers:\n* The GET handler does not expect any body in the HTTP request and therefore uses the ```GCDWebServerRequest``` class. The handler generates a response containing a simple HTML form.\n* The POST handler expects the form values to be in the body of the HTTP request and percent-encoded. Fortunately, GCDWebServer provides the request class ```GCDWebServerURLEncodedFormRequest``` which can automatically parse such bodies. The handler simply echoes back the value from the user submitted form.\n\n```objectivec\n[webServer addHandlerForMethod:@\"GET\"\n                          path:@\"/\"\n                  requestClass:[GCDWebServerRequest class]\n                  processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n  \n  NSString* html = @\" \\\n    <html><body> \\\n      <form name=\\\"input\\\" action=\\\"/\\\" method=\\\"post\\\" enctype=\\\"application/x-www-form-urlencoded\\\"> \\\n      Value: <input type=\\\"text\\\" name=\\\"value\\\"> \\\n      <input type=\\\"submit\\\" value=\\\"Submit\\\"> \\\n      </form> \\\n    </body></html> \\\n  \";\n  return [GCDWebServerDataResponse responseWithHTML:html];\n  \n}];\n\n[webServer addHandlerForMethod:@\"POST\"\n                          path:@\"/\"\n                  requestClass:[GCDWebServerURLEncodedFormRequest class]\n                  processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n  \n  NSString* value = [[(GCDWebServerURLEncodedFormRequest*)request arguments] objectForKey:@\"value\"];\n  NSString* html = [NSString stringWithFormat:@\"<html><body><p>%@</p></body></html>\", value];\n  return [GCDWebServerDataResponse responseWithHTML:html];\n  \n}];\n```\n\nAdvanced Example 3: Serving a Dynamic Website\n=============================================\n\nGCDWebServer provides an extension to the ```GCDWebServerDataResponse``` class that can return HTML content generated from a template and a set of variables (using the format ```%variable%```). It is a very basic template system and is really intended as a starting point to building more advanced template systems by subclassing ```GCDWebServerResponse```.\n\nAssuming you have a website directory in your app containing HTML template files along with the corresponding CSS, scripts and images, it's pretty easy to turn it into a dynamic website:\n\n```objectivec\n// Get the path to the website directory\nNSString* websitePath = [[NSBundle mainBundle] pathForResource:@\"Website\" ofType:nil];\n\n// Add a default handler to serve static files (i.e. anything other than HTML files)\n[self addGETHandlerForBasePath:@\"/\" directoryPath:websitePath indexFilename:nil cacheAge:3600 allowRangeRequests:YES];\n\n// Add an override handler for all requests to \"*.html\" URLs to do the special HTML templatization\n[self addHandlerForMethod:@\"GET\"\n                pathRegex:@\"/.*\\.html\"\n             requestClass:[GCDWebServerRequest class]\n             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n    \n    NSDictionary* variables = [NSDictionary dictionaryWithObjectsAndKeys:@\"value\", @\"variable\", nil];\n    return [GCDWebServerDataResponse responseWithHTMLTemplate:[websitePath stringByAppendingPathComponent:request.path]\n                                                    variables:variables];\n    \n}];\n\n// Add an override handler to redirect \"/\" URL to \"/index.html\"\n[self addHandlerForMethod:@\"GET\"\n                     path:@\"/\"\n             requestClass:[GCDWebServerRequest class]\n             processBlock:^GCDWebServerResponse *(GCDWebServerRequest* request) {\n    \n    return [GCDWebServerResponse responseWithRedirect:[NSURL URLWithString:@\"index.html\" relativeToURL:request.URL]\n                                            permanent:NO];\n    \n];\n\n```\n\nFinal Example: File Downloads and Uploads From iOS App\n======================================================\n\nGCDWebServer was originally written for the [ComicFlow](http://itunes.apple.com/us/app/comicflow/id409290355?mt=8) comic reader app for iPad. It allow users to connect to their iPad with their web browser over WiFi and then upload, download and organize comic files inside the app.\n\nComicFlow is [entirely open-source](https://github.com/swisspol/ComicFlow) and you can see how it uses GCDWebServer in the [WebServer.h](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.h) and [WebServer.m](https://github.com/swisspol/ComicFlow/blob/master/Classes/WebServer.m) files.\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASKeyCodes.h",
    "content": "#import <Carbon/Carbon.h>\n#import <AppKit/AppKit.h>\n#import \"MASKeyMasks.h\"\n\n// These glyphs are missed in Carbon.h\ntypedef NS_ENUM(unsigned short, kMASShortcutGlyph) {\n    kMASShortcutGlyphEject = 0x23CF,\n    kMASShortcutGlyphClear = 0x2715,\n    kMASShortcutGlyphDeleteLeft = 0x232B,\n    kMASShortcutGlyphDeleteRight = 0x2326,\n    kMASShortcutGlyphLeftArrow = 0x2190,\n    kMASShortcutGlyphRightArrow = 0x2192,\n    kMASShortcutGlyphUpArrow = 0x2191,\n    kMASShortcutGlyphDownArrow = 0x2193,\n    kMASShortcutGlyphEscape = 0x238B,\n    kMASShortcutGlyphHelp = 0x003F,\n    kMASShortcutGlyphPageDown = 0x21DF,\n    kMASShortcutGlyphPageUp = 0x21DE,\n    kMASShortcutGlyphTabRight = 0x21E5,\n    kMASShortcutGlyphReturn = 0x2305,\n    kMASShortcutGlyphReturnR2L = 0x21A9,\n    kMASShortcutGlyphPadClear = 0x2327,\n    kMASShortcutGlyphNorthwestArrow = 0x2196,\n    kMASShortcutGlyphSoutheastArrow = 0x2198,\n};\n\nNS_INLINE NSString* NSStringFromMASKeyCode(unsigned short ch)\n{\n    return [NSString stringWithFormat:@\"%C\", ch];\n}\n\nNS_INLINE NSUInteger MASPickCocoaModifiers(NSUInteger flags)\n{\n    return (flags & (NSEventModifierFlagControl | NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagCommand));\n}\n\nNS_INLINE UInt32 MASCarbonModifiersFromCocoaModifiers(NSUInteger cocoaFlags)\n{\n    return\n          (cocoaFlags & NSEventModifierFlagCommand ? cmdKey : 0)\n        | (cocoaFlags & NSEventModifierFlagOption ? optionKey : 0)\n        | (cocoaFlags & NSEventModifierFlagControl ? controlKey : 0)\n        | (cocoaFlags & NSEventModifierFlagShift ? shiftKey : 0);\n}\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASKeyMasks.h",
    "content": "#import <Availability.h>\n\n// https://github.com/shpakovski/MASShortcut/issues/99\n//\n// Long story short: NSControlKeyMask and friends were replaced with NSEventModifierFlagControl\n// and similar in macOS Sierra. The project builds fine & clean, but including MASShortcut in\n// a project with deployment target set to 10.12 results in several deprecation warnings because\n// of the control masks. Simply replacing the old symbols with the new ones isn’t an option,\n// since it breaks the build on older SDKs – in Travis, for example.\n//\n// It should be safe to remove this whole thing once the 10.12 SDK is ubiquitous.\n\n#if __MAC_OS_X_VERSION_MAX_ALLOWED < 101200\n#define NSEventModifierFlagCommand  NSCommandKeyMask\n#define NSEventModifierFlagControl  NSControlKeyMask\n#define NSEventModifierFlagOption   NSAlternateKeyMask\n#define NSEventModifierFlagShift    NSShiftKeyMask\n#endif\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASShortcut.h",
    "content": "#import \"MASKeyCodes.h\"\n\n/**\n A model class to hold a key combination.\n\n This class just represents a combination of keys. It does not care if\n the combination is valid or can be used as a hotkey, it doesn’t watch\n the input system for the shortcut appearance, nor it does access user\n defaults.\n*/\n@interface MASShortcut : NSObject <NSSecureCoding, NSCopying>\n\n/**\n The virtual key code for the keyboard key.\n\n Hardware independent, same as in `NSEvent`. See `Events.h` in the HIToolbox\n framework for a complete list, or Command-click this symbol: `kVK_ANSI_A`.\n*/\n@property (nonatomic, readonly) NSInteger keyCode;\n\n/**\n Cocoa keyboard modifier flags.\n\n Same as in `NSEvent`: `NSCommandKeyMask`, `NSAlternateKeyMask`, etc.\n*/\n@property (nonatomic, readonly) NSEventModifierFlags modifierFlags;\n\n/**\n Same as `keyCode`, just a different type.\n*/\n@property (nonatomic, readonly) UInt32 carbonKeyCode;\n\n/**\n Carbon modifier flags.\n\n A bit sum of `cmdKey`, `optionKey`, etc.\n*/\n@property (nonatomic, readonly) UInt32 carbonFlags;\n\n/**\n A string representing the “key” part of a shortcut, like the `5` in `⌘5`.\n\n @warning The value may change depending on the active keyboard layout.\n For example for the `^2` keyboard shortcut (`kVK_ANSI_2+NSControlKeyMask`\n to be precise) the `keyCodeString` is `2` on the US keyboard, but `ě` when\n the Czech keyboard layout is active. See the spec for details.\n*/\n@property (nonatomic, readonly) NSString *keyCodeString;\n\n/**\n A key-code string used in key equivalent matching.\n\n For precise meaning of “key equivalents” see the `keyEquivalent`\n property of `NSMenuItem`. Here the string is used to support shortcut\n validation (“is the shortcut already taken in this menu?”) and\n for display in `NSMenu`.\n\n The value of this property may differ from `keyCodeString`. For example\n the Russian keyboard has a `Г` (Ge) Cyrillic character in place of the\n latin `U` key. This means you can create a `^Г` shortcut, but in menus\n that’s always displayed as `^U`. So the `keyCodeString` returns `Г`\n and `keyCodeStringForKeyEquivalent` returns `U`.\n*/\n@property (nonatomic, readonly) NSString *keyCodeStringForKeyEquivalent;\n\n/**\n A string representing the shortcut modifiers, like the `⌘` in `⌘5`.\n*/\n@property (nonatomic, readonly) NSString *modifierFlagsString;\n\n- (instancetype)initWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags;\n+ (instancetype)shortcutWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags;\n\n/**\n Creates a new shortcut from an `NSEvent` object.\n\n This is just a convenience initializer that reads the key code and modifiers from an `NSEvent`.\n*/\n+ (instancetype)shortcutWithEvent:(NSEvent *)anEvent;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASShortcut.m",
    "content": "#import \"MASShortcut.h\"\n#import \"MASLocalization.h\"\n\nstatic NSString *const MASShortcutKeyCode = @\"KeyCode\";\nstatic NSString *const MASShortcutModifierFlags = @\"ModifierFlags\";\n\n@implementation MASShortcut\n\n#pragma mark Initialization\n\n- (instancetype)initWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags\n{\n    self = [super init];\n    if (self) {\n        _keyCode = code;\n        _modifierFlags = MASPickCocoaModifiers(flags);\n    }\n    return self;\n}\n\n+ (instancetype)shortcutWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags\n{\n    return [[self alloc] initWithKeyCode:code modifierFlags:flags];\n}\n\n+ (instancetype)shortcutWithEvent:(NSEvent *)event\n{\n    return [[self alloc] initWithKeyCode:event.keyCode modifierFlags:event.modifierFlags];\n}\n\n#pragma mark Shortcut Accessors\n\n- (UInt32)carbonKeyCode\n{\n    return (self.keyCode == NSNotFound ? 0 : (UInt32)self.keyCode);\n}\n\n- (UInt32)carbonFlags\n{\n    return MASCarbonModifiersFromCocoaModifiers(self.modifierFlags);\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:@\"%@%@\", self.modifierFlagsString, self.keyCodeString];\n}\n\n- (NSString *)keyCodeStringForKeyEquivalent\n{\n    NSString *keyCodeString = self.keyCodeString;\n\n    if (keyCodeString.length <= 1) {\n        return keyCodeString.lowercaseString;\n    }\n\n    switch (self.keyCode) {\n        case kVK_F1: return NSStringFromMASKeyCode(NSF1FunctionKey);\n        case kVK_F2: return NSStringFromMASKeyCode(NSF2FunctionKey);\n        case kVK_F3: return NSStringFromMASKeyCode(NSF3FunctionKey);\n        case kVK_F4: return NSStringFromMASKeyCode(NSF4FunctionKey);\n        case kVK_F5: return NSStringFromMASKeyCode(NSF5FunctionKey);\n        case kVK_F6: return NSStringFromMASKeyCode(NSF6FunctionKey);\n        case kVK_F7: return NSStringFromMASKeyCode(NSF7FunctionKey);\n        case kVK_F8: return NSStringFromMASKeyCode(NSF8FunctionKey);\n        case kVK_F9: return NSStringFromMASKeyCode(NSF9FunctionKey);\n        case kVK_F10: return NSStringFromMASKeyCode(NSF10FunctionKey);\n        case kVK_F11: return NSStringFromMASKeyCode(NSF11FunctionKey);\n        case kVK_F12: return NSStringFromMASKeyCode(NSF12FunctionKey);\n        case kVK_F13: return NSStringFromMASKeyCode(NSF13FunctionKey);\n        case kVK_F14: return NSStringFromMASKeyCode(NSF14FunctionKey);\n        case kVK_F15: return NSStringFromMASKeyCode(NSF15FunctionKey);\n        case kVK_F16: return NSStringFromMASKeyCode(NSF16FunctionKey);\n        case kVK_F17: return NSStringFromMASKeyCode(NSF17FunctionKey);\n        case kVK_F18: return NSStringFromMASKeyCode(NSF18FunctionKey);\n        case kVK_F19: return NSStringFromMASKeyCode(NSF19FunctionKey);\n        case kVK_Space: return NSStringFromMASKeyCode(0x20);\n        default: return @\"\";\n    }\n}\n\n- (NSString *)keyCodeString\n{\n    // Some key codes don't have an equivalent\n    switch (self.keyCode) {\n        case NSNotFound: return @\"\";\n        case kVK_F1: return @\"F1\";\n        case kVK_F2: return @\"F2\";\n        case kVK_F3: return @\"F3\";\n        case kVK_F4: return @\"F4\";\n        case kVK_F5: return @\"F5\";\n        case kVK_F6: return @\"F6\";\n        case kVK_F7: return @\"F7\";\n        case kVK_F8: return @\"F8\";\n        case kVK_F9: return @\"F9\";\n        case kVK_F10: return @\"F10\";\n        case kVK_F11: return @\"F11\";\n        case kVK_F12: return @\"F12\";\n        case kVK_F13: return @\"F13\";\n        case kVK_F14: return @\"F14\";\n        case kVK_F15: return @\"F15\";\n        case kVK_F16: return @\"F16\";\n        case kVK_F17: return @\"F17\";\n        case kVK_F18: return @\"F18\";\n        case kVK_F19: return @\"F19\";\n        case kVK_Space: return MASLocalizedString(@\"Space\", @\"Shortcut glyph name for SPACE key\");\n        case kVK_Escape: return NSStringFromMASKeyCode(kMASShortcutGlyphEscape);\n        case kVK_Delete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteLeft);\n        case kVK_ForwardDelete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteRight);\n        case kVK_LeftArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphLeftArrow);\n        case kVK_RightArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphRightArrow);\n        case kVK_UpArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphUpArrow);\n        case kVK_DownArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphDownArrow);\n        case kVK_Help: return NSStringFromMASKeyCode(kMASShortcutGlyphHelp);\n        case kVK_PageUp: return NSStringFromMASKeyCode(kMASShortcutGlyphPageUp);\n        case kVK_PageDown: return NSStringFromMASKeyCode(kMASShortcutGlyphPageDown);\n        case kVK_Tab: return NSStringFromMASKeyCode(kMASShortcutGlyphTabRight);\n        case kVK_Return: return NSStringFromMASKeyCode(kMASShortcutGlyphReturnR2L);\n            \n        // Keypad\n        case kVK_ANSI_Keypad0: return @\"0\";\n        case kVK_ANSI_Keypad1: return @\"1\";\n        case kVK_ANSI_Keypad2: return @\"2\";\n        case kVK_ANSI_Keypad3: return @\"3\";\n        case kVK_ANSI_Keypad4: return @\"4\";\n        case kVK_ANSI_Keypad5: return @\"5\";\n        case kVK_ANSI_Keypad6: return @\"6\";\n        case kVK_ANSI_Keypad7: return @\"7\";\n        case kVK_ANSI_Keypad8: return @\"8\";\n        case kVK_ANSI_Keypad9: return @\"9\";\n        case kVK_ANSI_KeypadDecimal: return @\".\";\n        case kVK_ANSI_KeypadMultiply: return @\"*\";\n        case kVK_ANSI_KeypadPlus: return @\"+\";\n        case kVK_ANSI_KeypadClear: return NSStringFromMASKeyCode(kMASShortcutGlyphPadClear);\n        case kVK_ANSI_KeypadDivide: return @\"/\";\n        case kVK_ANSI_KeypadEnter: return NSStringFromMASKeyCode(kMASShortcutGlyphReturn);\n        case kVK_ANSI_KeypadMinus: return @\"-\";\n        case kVK_ANSI_KeypadEquals: return @\"=\";\n            \n        // Hardcode\n        case 119: return NSStringFromMASKeyCode(kMASShortcutGlyphSoutheastArrow);\n        case 115: return NSStringFromMASKeyCode(kMASShortcutGlyphNorthwestArrow);\n    }\n    \n    // Everything else should be printable so look it up in the current ASCII capable keyboard layout\n    OSStatus error = noErr;\n    NSString *keystroke = nil;\n    TISInputSourceRef inputSource = TISCopyCurrentASCIICapableKeyboardLayoutInputSource();\n    if (inputSource) {\n        CFDataRef layoutDataRef = TISGetInputSourceProperty(inputSource, kTISPropertyUnicodeKeyLayoutData);\n        if (layoutDataRef) {\n            UCKeyboardLayout *layoutData = (UCKeyboardLayout *)CFDataGetBytePtr(layoutDataRef);\n            UniCharCount length = 0;\n            UniChar  chars[256] = { 0 };\n            UInt32 deadKeyState = 0;\n            error = UCKeyTranslate(layoutData, (UInt16)self.keyCode, kUCKeyActionDisplay, 0, // No modifiers\n                                   LMGetKbdType(), kUCKeyTranslateNoDeadKeysMask, &deadKeyState,\n                                   sizeof(chars) / sizeof(UniChar), &length, chars);\n            keystroke = ((error == noErr) && length ? [NSString stringWithCharacters:chars length:length] : @\"\");\n        }\n        CFRelease(inputSource);\n    }\n    \n    // Validate keystroke\n    if (keystroke.length) {\n        static NSMutableCharacterSet *validChars = nil;\n        if (validChars == nil) {\n            validChars = [[NSMutableCharacterSet alloc] init];\n            [validChars formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];\n            [validChars formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];\n            [validChars formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];\n        }\n        for (NSUInteger i = 0, length = keystroke.length; i < length; i++) {\n            if (![validChars characterIsMember:[keystroke characterAtIndex:i]]) {\n                keystroke = @\"\";\n                break;\n            }\n        }\n    }\n    \n    // Finally, we've got a shortcut!\n    return keystroke.uppercaseString;\n}\n\n- (NSString *)modifierFlagsString\n{\n    unichar chars[4];\n    NSUInteger count = 0;\n    // These are in the same order as the menu manager shows them\n    if (self.modifierFlags & NSControlKeyMask) chars[count++] = kControlUnicode;\n    if (self.modifierFlags & NSAlternateKeyMask) chars[count++] = kOptionUnicode;\n    if (self.modifierFlags & NSShiftKeyMask) chars[count++] = kShiftUnicode;\n    if (self.modifierFlags & NSCommandKeyMask) chars[count++] = kCommandUnicode;\n    return (count ? [NSString stringWithCharacters:chars length:count] : @\"\");\n}\n\n#pragma mark NSObject\n\n- (BOOL) isEqual: (MASShortcut*) object\n{\n    return [object isKindOfClass:[self class]]\n        && (object.keyCode == self.keyCode)\n        && (object.modifierFlags == self.modifierFlags);\n}\n\n- (NSUInteger) hash\n{\n    return self.keyCode + self.modifierFlags;\n}\n\n#pragma mark NSCoding\n\n- (void)encodeWithCoder:(NSCoder *)coder\n{\n    [coder encodeInteger:(self.keyCode != NSNotFound ? self.keyCode : - 1) forKey:MASShortcutKeyCode];\n    [coder encodeInteger:(NSInteger)self.modifierFlags forKey:MASShortcutModifierFlags];\n}\n\n- (instancetype)initWithCoder:(NSCoder *)decoder\n{\n    self = [super init];\n    if (self) {\n        NSInteger code = [decoder decodeIntegerForKey:MASShortcutKeyCode];\n        _keyCode = (code < 0) ? NSNotFound : code;\n        _modifierFlags = [decoder decodeIntegerForKey:MASShortcutModifierFlags];\n    }\n    return self;\n}\n\n#pragma mark NSSecureCoding\n\n+ (BOOL)supportsSecureCoding\n{\n    return YES;\n}\n\n#pragma mark NSCopying\n\n- (instancetype) copyWithZone:(NSZone *)zone\n{\n    return [[self class] shortcutWithKeyCode:_keyCode modifierFlags:_modifierFlags];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASShortcutValidator.h",
    "content": "#import \"MASShortcut.h\"\n\n/**\n This class is used by the recording control to tell which shortcuts are acceptable.\n\n There are two kinds of shortcuts that are not considered acceptable: shortcuts that\n are too simple (like single letter keys) and shortcuts that are already used by the\n operating system.\n*/\n@interface MASShortcutValidator : NSObject\n\n/**\n Set to `YES` if you want to accept Option-something shortcuts.\n\n `NO` by default, since Option-something shortcuts are often used by system,\n for example Option-G will type the © sign. This also applies to Option-Shift\n shortcuts – in other words, shortcut recorder will not accept shortcuts like\n Option-Shift-K by default. (Again, since Option-Shift-K inserts the Apple\n logo sign by default.)\n*/\n@property(assign) BOOL allowAnyShortcutWithOptionModifier;\n\n+ (instancetype) sharedValidator;\n\n- (BOOL) isShortcutValid: (MASShortcut*) shortcut;\n- (BOOL) isShortcut: (MASShortcut*) shortcut alreadyTakenInMenu: (NSMenu*) menu explanation: (NSString**) explanation;\n- (BOOL) isShortcutAlreadyTakenBySystem: (MASShortcut*) shortcut explanation: (NSString**) explanation;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Model/MASShortcutValidator.m",
    "content": "#import \"MASShortcutValidator.h\"\n#import \"MASLocalization.h\"\n\n@implementation MASShortcutValidator\n\n+ (instancetype) sharedValidator\n{\n    static dispatch_once_t once;\n    static MASShortcutValidator *sharedInstance;\n    dispatch_once(&once, ^{\n        sharedInstance = [[self alloc] init];\n    });\n    return sharedInstance;\n}\n\n- (BOOL) isShortcutValid: (MASShortcut*) shortcut\n{\n    NSInteger keyCode = [shortcut keyCode];\n    NSEventModifierFlags modifiers = [shortcut modifierFlags];\n\n    // Allow any function key with any combination of modifiers\n    BOOL includesFunctionKey = ((keyCode == kVK_F1) || (keyCode == kVK_F2) || (keyCode == kVK_F3) || (keyCode == kVK_F4) ||\n                                (keyCode == kVK_F5) || (keyCode == kVK_F6) || (keyCode == kVK_F7) || (keyCode == kVK_F8) ||\n                                (keyCode == kVK_F9) || (keyCode == kVK_F10) || (keyCode == kVK_F11) || (keyCode == kVK_F12) ||\n                                (keyCode == kVK_F13) || (keyCode == kVK_F14) || (keyCode == kVK_F15) || (keyCode == kVK_F16) ||\n                                (keyCode == kVK_F17) || (keyCode == kVK_F18) || (keyCode == kVK_F19) || (keyCode == kVK_F20));\n    if (includesFunctionKey) return YES;\n\n    // Do not allow any other key without modifiers\n    BOOL hasModifierFlags = (modifiers > 0);\n    if (!hasModifierFlags) return NO;\n\n    // Allow any hotkey containing Control or Command modifier\n    BOOL includesCommand = ((modifiers & NSCommandKeyMask) > 0);\n    BOOL includesControl = ((modifiers & NSControlKeyMask) > 0);\n    if (includesCommand || includesControl) return YES;\n\n    // Allow Option key only in selected cases\n    BOOL includesOption = ((modifiers & NSAlternateKeyMask) > 0);\n    if (includesOption) {\n\n        // Always allow Option-Space and Option-Escape because they do not have any bind system commands\n        if ((keyCode == kVK_Space) || (keyCode == kVK_Escape)) return YES;\n\n        // Allow Option modifier with any key even if it will break the system binding\n        if (_allowAnyShortcutWithOptionModifier) return YES;\n    }\n\n    // The hotkey does not have any modifiers or violates system bindings\n    return NO;\n}\n\n- (BOOL) isShortcut: (MASShortcut*) shortcut alreadyTakenInMenu: (NSMenu*) menu explanation: (NSString**) explanation\n{\n    NSString *keyEquivalent = [shortcut keyCodeStringForKeyEquivalent];\n    NSEventModifierFlags flags = [shortcut modifierFlags];\n\n    for (NSMenuItem *menuItem in menu.itemArray) {\n        if (menuItem.hasSubmenu && [self isShortcut:shortcut alreadyTakenInMenu:[menuItem submenu] explanation:explanation]) return YES;\n        \n        BOOL equalFlags = (MASPickCocoaModifiers(menuItem.keyEquivalentModifierMask) == flags);\n        BOOL equalHotkeyLowercase = [menuItem.keyEquivalent.lowercaseString isEqualToString:keyEquivalent];\n        \n        // Check if the cases are different, we know ours is lower and that shift is included in our modifiers\n        // If theirs is capitol, we need to add shift to their modifiers\n        if (equalHotkeyLowercase && ![menuItem.keyEquivalent isEqualToString:keyEquivalent]) {\n            equalFlags = (MASPickCocoaModifiers(menuItem.keyEquivalentModifierMask | NSShiftKeyMask) == flags);\n        }\n        \n        if (equalFlags && equalHotkeyLowercase) {\n            if (explanation) {\n                *explanation = MASLocalizedString(@\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\",\n                                                     @\"Message for alert when shortcut is already used\");\n                *explanation = [NSString stringWithFormat:*explanation, menuItem.title];\n            }\n            return YES;\n        }\n    }\n    return NO;\n}\n\n- (BOOL) isShortcutAlreadyTakenBySystem: (MASShortcut*) shortcut explanation: (NSString**) explanation\n{\n    CFArrayRef globalHotKeys;\n    if (CopySymbolicHotKeys(&globalHotKeys) == noErr) {\n\n        // Enumerate all global hotkeys and check if any of them matches current shortcut\n        for (CFIndex i = 0, count = CFArrayGetCount(globalHotKeys); i < count; i++) {\n            CFDictionaryRef hotKeyInfo = CFArrayGetValueAtIndex(globalHotKeys, i);\n            CFNumberRef code = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyCode);\n            CFNumberRef flags = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyModifiers);\n            CFNumberRef enabled = CFDictionaryGetValue(hotKeyInfo, kHISymbolicHotKeyEnabled);\n\n            if (([(__bridge NSNumber *)code integerValue] == [shortcut keyCode]) &&\n                ([(__bridge NSNumber *)flags unsignedIntegerValue] == [shortcut carbonFlags]) &&\n                ([(__bridge NSNumber *)enabled boolValue])) {\n\n                if (explanation) {\n                    *explanation = MASLocalizedString(@\"This combination cannot be used because it is already used by a system-wide \"\n                                                     @\"keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts \"\n                                                     @\"can be changed in the Keyboard & Mouse panel in System Preferences.\",\n                                                     @\"Message for alert when shortcut is already used by the system\");\n                }\n                return YES;\n            }\n        }\n        CFRelease(globalHotKeys);\n    }\n    return [self isShortcut:shortcut alreadyTakenInMenu:[NSApp mainMenu] explanation:explanation];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Monitoring/MASHotKey.h",
    "content": "#import \"MASShortcut.h\"\n\nextern FourCharCode const MASHotKeySignature;\n\n@interface MASHotKey : NSObject\n\n@property(readonly) UInt32 carbonID;\n@property(copy) dispatch_block_t action;\n\n+ (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Monitoring/MASHotKey.m",
    "content": "#import \"MASHotKey.h\"\n\nFourCharCode const MASHotKeySignature = 'MASS';\n\n@interface MASHotKey ()\n@property(assign) EventHotKeyRef hotKeyRef;\n@property(assign) UInt32 carbonID;\n@end\n\n@implementation MASHotKey\n\n- (instancetype) initWithShortcut: (MASShortcut*) shortcut\n{\n    self = [super init];\n\n    static UInt32 CarbonHotKeyID = 0;\n\n    _carbonID = ++CarbonHotKeyID;\n    EventHotKeyID hotKeyID = { .signature = MASHotKeySignature, .id = _carbonID };\n\n    OSStatus status = RegisterEventHotKey([shortcut carbonKeyCode], [shortcut carbonFlags],\n        hotKeyID, GetEventDispatcherTarget(), 0, &_hotKeyRef);\n\n    if (status != noErr) {\n        return nil;\n    }\n\n    return self;\n}\n\n+ (instancetype) registeredHotKeyWithShortcut: (MASShortcut*) shortcut\n{\n    return [[self alloc] initWithShortcut:shortcut];\n}\n\n- (void) dealloc\n{\n    if (_hotKeyRef) {\n        UnregisterEventHotKey(_hotKeyRef);\n        _hotKeyRef = NULL;\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Monitoring/MASShortcutMonitor.h",
    "content": "#import \"MASShortcut.h\"\n\n/**\n Executes action when a shortcut is pressed.\n\n There can only be one instance of this class, otherwise things\n will probably not work. (There’s a Carbon event handler inside\n and there can only be one Carbon event handler of a given type.)\n*/\n@interface MASShortcutMonitor : NSObject\n\n- (instancetype) init __unavailable;\n+ (instancetype) sharedMonitor;\n\n/**\n Register a shortcut along with an action.\n\n Attempting to insert an already registered shortcut probably won’t work.\n It may burn your house or cut your fingers. You have been warned.\n*/\n- (BOOL) registerShortcut: (MASShortcut*) shortcut withAction: (dispatch_block_t) action;\n- (BOOL) isShortcutRegistered: (MASShortcut*) shortcut;\n\n- (void) unregisterShortcut: (MASShortcut*) shortcut;\n- (void) unregisterAllShortcuts;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Monitoring/MASShortcutMonitor.m",
    "content": "#import \"MASShortcutMonitor.h\"\n#import \"MASHotKey.h\"\n\n@interface MASShortcutMonitor ()\n@property(assign) EventHandlerRef eventHandlerRef;\n@property(strong) NSMutableDictionary *hotKeys;\n@end\n\nstatic OSStatus MASCarbonEventCallback(EventHandlerCallRef, EventRef, void*);\n\n@implementation MASShortcutMonitor\n\n#pragma mark Initialization\n\n- (instancetype) init\n{\n    self = [super init];\n    [self setHotKeys:[NSMutableDictionary dictionary]];\n    EventTypeSpec hotKeyPressedSpec = { .eventClass = kEventClassKeyboard, .eventKind = kEventHotKeyPressed };\n    OSStatus status = InstallEventHandler(GetEventDispatcherTarget(), MASCarbonEventCallback,\n        1, &hotKeyPressedSpec, (__bridge void*)self, &_eventHandlerRef);\n    if (status != noErr) {\n        return nil;\n    }\n    return self;\n}\n\n- (void) dealloc\n{\n    if (_eventHandlerRef) {\n        RemoveEventHandler(_eventHandlerRef);\n        _eventHandlerRef = NULL;\n    }\n}\n\n+ (instancetype) sharedMonitor\n{\n    static dispatch_once_t once;\n    static MASShortcutMonitor *sharedInstance;\n    dispatch_once(&once, ^{\n        sharedInstance = [[self alloc] init];\n    });\n    return sharedInstance;\n}\n\n#pragma mark Registration\n\n- (BOOL) registerShortcut: (MASShortcut*) shortcut withAction: (dispatch_block_t) action\n{\n    MASHotKey *hotKey = [MASHotKey registeredHotKeyWithShortcut:shortcut];\n    if (hotKey) {\n        [hotKey setAction:action];\n        [_hotKeys setObject:hotKey forKey:shortcut];\n        return YES;\n    } else {\n        return NO;\n    }\n}\n\n- (void) unregisterShortcut: (MASShortcut*) shortcut\n{\n    if (shortcut) {\n        [_hotKeys removeObjectForKey:shortcut];\n    }\n}\n\n- (void) unregisterAllShortcuts\n{\n    [_hotKeys removeAllObjects];\n}\n\n- (BOOL) isShortcutRegistered: (MASShortcut*) shortcut\n{\n    return !![_hotKeys objectForKey:shortcut];\n}\n\n#pragma mark Event Handling\n\n- (void) handleEvent: (EventRef) event\n{\n    if (GetEventClass(event) != kEventClassKeyboard) {\n        return;\n    }\n\n    EventHotKeyID hotKeyID;\n    OSStatus status = GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID), NULL, &hotKeyID);\n    if (status != noErr || hotKeyID.signature != MASHotKeySignature) {\n        return;\n    }\n\n    [_hotKeys enumerateKeysAndObjectsUsingBlock:^(MASShortcut *shortcut, MASHotKey *hotKey, BOOL *stop) {\n        if (hotKeyID.id == [hotKey carbonID]) {\n            if ([hotKey action]) {\n                dispatch_async(dispatch_get_main_queue(), [hotKey action]);\n            }\n            *stop = YES;\n        }\n    }];\n}\n\n@end\n\nstatic OSStatus MASCarbonEventCallback(EventHandlerCallRef _, EventRef event, void *context)\n{\n    MASShortcutMonitor *dispatcher = (__bridge id)context;\n    [dispatcher handleEvent:event];\n    return noErr;\n}\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/Shortcut.h",
    "content": "#import \"MASKeyMasks.h\"\n#import \"MASShortcut.h\"\n#import \"MASShortcutValidator.h\"\n#import \"MASShortcutMonitor.h\"\n#import \"MASShortcutBinder.h\"\n#import \"MASDictionaryTransformer.h\"\n#import \"MASShortcutView.h\"\n#import \"MASShortcutView+Bindings.h\"\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASLocalization.h",
    "content": "/**\n Reads a localized string from the framework’s bundle.\n\n Normally you would use NSLocalizedString to read the localized\n strings, but that’s just a shortcut for loading the strings from\n the main bundle. And once the framework ends up in an app, the\n main bundle will be the app’s bundle and won’t contain our strings.\n So we introduced this helper function that makes sure to load the\n strings from the framework’s bundle. Please avoid using\n NSLocalizedString throughout the framework, it wouldn’t work\n properly.\n*/\nNSString *MASLocalizedString(NSString *key, NSString *comment);"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASLocalization.m",
    "content": "#import \"MASLocalization.h\"\n#import \"MASShortcut.h\"\n\nstatic NSString *const MASLocalizationTableName = @\"Localizable\";\nstatic NSString *const MASPlaceholderLocalizationString = @\"XXX\";\n\n// The CocoaPods trickery here is needed because when the code\n// is built as a part of CocoaPods, it won’t make a separate framework\n// and the Localized.strings file won’t be bundled correctly.\n// See https://github.com/shpakovski/MASShortcut/issues/74\nNSString *MASLocalizedString(NSString *key, NSString *comment) {\n    static NSBundle *localizationBundle = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        NSBundle *frameworkBundle = [NSBundle bundleForClass:[MASShortcut class]];\n        // first we'll check if resources bundle was copied to MASShortcut framework bundle when !use_frameworks option is active\n        NSURL *cocoaPodsBundleURL = [frameworkBundle URLForResource:@\"MASShortcut\" withExtension:@\"bundle\"];\n        if (cocoaPodsBundleURL) {\n            localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL];\n        } else {\n            // trying to fetch cocoapods bundle from main bundle\n            cocoaPodsBundleURL = [[NSBundle mainBundle] URLForResource: @\"MASShortcut\" withExtension:@\"bundle\"];\n            if (cocoaPodsBundleURL) {\n                localizationBundle = [NSBundle bundleWithURL: cocoaPodsBundleURL];\n            } else {\n                // fallback to framework bundle\n                localizationBundle = frameworkBundle;\n            }\n        }\n    });\n    return [localizationBundle localizedStringForKey:key\n        value:MASPlaceholderLocalizationString\n        table:MASLocalizationTableName];\n}\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASShortcutView+Bindings.h",
    "content": "#import \"MASShortcutView.h\"\n\n/**\n A simplified interface to bind the recorder value to user defaults.\n\n You can bind the `shortcutValue` to user defaults using the standard\n `bind:toObject:withKeyPath:options:` call, but since that’s a lot to type\n and read, here’s a simpler option.\n\n Setting the `associatedUserDefaultsKey` binds the view’s shortcut value\n to the given user defaults key. You can supply a value transformer to convert\n values between user defaults and `MASShortcut`. If you don’t supply\n a transformer, the `NSUnarchiveFromDataTransformerName` will be used\n automatically.\n\n Set `associatedUserDefaultsKey` to `nil` to disconnect the binding.\n*/\n@interface MASShortcutView (Bindings)\n\n@property(copy) NSString *associatedUserDefaultsKey;\n\n- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer;\n- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASShortcutView+Bindings.m",
    "content": "#import \"MASShortcutView+Bindings.h\"\n\n@implementation MASShortcutView (Bindings)\n\n- (NSString*) associatedUserDefaultsKey\n{\n    NSDictionary* bindingInfo = [self infoForBinding:MASShortcutBinding];\n    if (bindingInfo != nil) {\n        NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey];\n        NSString *key = [keyPath stringByReplacingOccurrencesOfString:@\"values.\" withString:@\"\"];\n        return key;\n    } else {\n        return nil;\n    }\n}\n\n- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformer: (NSValueTransformer*) transformer\n{\n    // Break previous binding if any\n    NSString *currentKey = [self associatedUserDefaultsKey];\n    if (currentKey != nil) {\n        [self unbind:currentKey];\n    }\n\n    // Stop if the new binding is nil\n    if (newKey == nil) {\n        return;\n    }\n\n    NSDictionary *options = transformer ?\n        @{NSValueTransformerBindingOption:transformer} :\n        nil;\n\n    [self bind:MASShortcutBinding\n        toObject:[NSUserDefaultsController sharedUserDefaultsController]\n        withKeyPath:[@\"values.\" stringByAppendingString:newKey]\n        options:options];\n}\n\n- (void) setAssociatedUserDefaultsKey: (NSString*) newKey withTransformerName: (NSString*) transformerName\n{\n    [self setAssociatedUserDefaultsKey:newKey withTransformer:[NSValueTransformer valueTransformerForName:transformerName]];\n}\n\n- (void) setAssociatedUserDefaultsKey: (NSString*) newKey\n{\n    [self setAssociatedUserDefaultsKey:newKey withTransformerName:NSKeyedUnarchiveFromDataTransformerName];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASShortcutView.h",
    "content": "@class MASShortcut, MASShortcutValidator;\n\nextern NSString *const MASShortcutBinding;\n\ntypedef NS_ENUM(NSInteger, MASShortcutViewStyle) {\n    MASShortcutViewStyleDefault = 0,  // Height = 19 px\n    MASShortcutViewStyleTexturedRect, // Height = 25 px\n    MASShortcutViewStyleRounded,      // Height = 43 px\n    MASShortcutViewStyleFlat\n};\n\n@interface MASShortcutView : NSView\n\n@property (nonatomic, strong) MASShortcut *shortcutValue;\n@property (nonatomic, strong) MASShortcutValidator *shortcutValidator;\n@property (nonatomic, getter = isRecording) BOOL recording;\n@property (nonatomic, getter = isEnabled) BOOL enabled;\n@property (nonatomic, copy) void (^shortcutValueChange)(MASShortcutView *sender);\n@property (nonatomic, assign) MASShortcutViewStyle style;\n\n/// Returns custom class for drawing control.\n+ (Class)shortcutCellClass;\n\n- (void)setAcceptsFirstResponder:(BOOL)value;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/UI/MASShortcutView.m",
    "content": "#import \"MASShortcutView.h\"\n#import \"MASShortcutValidator.h\"\n#import \"MASLocalization.h\"\n\nNSString *const MASShortcutBinding = @\"shortcutValue\";\n\nstatic const CGFloat MASHintButtonWidth = 23;\nstatic const CGFloat MASButtonFontSize = 11;\n\n#pragma mark -\n\n@interface MASShortcutView () // Private accessors\n\n@property (nonatomic, getter = isHinting) BOOL hinting;\n@property (nonatomic, copy) NSString *shortcutPlaceholder;\n@property (nonatomic, assign) BOOL showsDeleteButton;\n\n@end\n\n#pragma mark -\n\n@implementation MASShortcutView {\n    NSButtonCell *_shortcutCell;\n    NSInteger _shortcutToolTipTag;\n    NSInteger _hintToolTipTag;\n    NSTrackingArea *_hintArea;\n    BOOL _acceptsFirstResponder;\n}\n\n#pragma mark -\n\n+ (Class)shortcutCellClass\n{\n    return [NSButtonCell class];\n}\n\n- (id)initWithFrame:(CGRect)frameRect\n{\n    self = [super initWithFrame:frameRect];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)coder\n{\n    self = [super initWithCoder:coder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (void)commonInit\n{\n    _shortcutCell = [[[self.class shortcutCellClass] alloc] init];\n    _shortcutCell.buttonType = NSPushOnPushOffButton;\n    _shortcutCell.font = [[NSFontManager sharedFontManager] convertFont:_shortcutCell.font toSize:MASButtonFontSize];\n    _shortcutValidator = [MASShortcutValidator sharedValidator];\n    _enabled = YES;\n    _showsDeleteButton = YES;\n    _acceptsFirstResponder = NO;\n    [self resetShortcutCellStyle];\n}\n\n- (void)dealloc\n{\n    [self activateEventMonitoring:NO];\n    [self activateResignObserver:NO];\n}\n\n#pragma mark - Public accessors\n\n- (void)setEnabled:(BOOL)flag\n{\n    if (_enabled != flag) {\n        _enabled = flag;\n        [self updateTrackingAreas];\n        self.recording = NO;\n        [self invalidateIntrinsicContentSize];\n        [self setNeedsDisplay:YES];\n    }\n}\n\n- (void)setStyle:(MASShortcutViewStyle)newStyle\n{\n    if (_style != newStyle) {\n        _style = newStyle;\n        [self resetShortcutCellStyle];\n        [self invalidateIntrinsicContentSize];\n        [self setNeedsDisplay:YES];\n    }\n}\n\n- (void)resetShortcutCellStyle\n{\n    switch (_style) {\n        case MASShortcutViewStyleDefault: {\n            _shortcutCell.bezelStyle = NSRoundRectBezelStyle;\n            break;\n        }\n        case MASShortcutViewStyleTexturedRect: {\n            _shortcutCell.bezelStyle = NSTexturedRoundedBezelStyle;\n            break;\n        }\n        case MASShortcutViewStyleRounded: {\n            _shortcutCell.bezelStyle = NSRoundedBezelStyle;\n            break;\n        }\n        case MASShortcutViewStyleFlat: {\n            self.wantsLayer = YES;\n            _shortcutCell.backgroundColor = [NSColor clearColor];\n            _shortcutCell.bordered = NO;\n            break;\n        }\n    }\n}\n\n- (void)setRecording:(BOOL)flag\n{\n    // Only one recorder can be active at the moment\n    static MASShortcutView *currentRecorder = nil;\n    if (flag && (currentRecorder != self)) {\n        currentRecorder.recording = NO;\n        currentRecorder = flag ? self : nil;\n    }\n    \n    // Only enabled view supports recording\n    if (flag && !self.enabled) return;\n\n    // Only care about changes in state\n    if (flag == _recording) return;\n\n    _recording = flag;\n    self.shortcutPlaceholder = nil;\n    [self resetToolTips];\n    [self activateEventMonitoring:_recording];\n    [self activateResignObserver:_recording];\n    [self invalidateIntrinsicContentSize];\n    [self setNeedsDisplay:YES];\n\n    // Give VoiceOver users feedback on the result. Requires at least 10.9 to run.\n    // We’re silencing the “tautological compare” warning here so that if someone\n    // takes the naked source files and compiles them with -Wall, the following\n    // NSAccessibilityPriorityKey comparison doesn’t cause a warning. See:\n    // https://github.com/shpakovski/MASShortcut/issues/76\n    #pragma clang diagnostic push\n    #pragma clang diagnostic ignored \"-Wtautological-compare\"\n    if (_recording == NO && (&NSAccessibilityPriorityKey != NULL)) {\n        NSString* msg = _shortcutValue ?\n                         MASLocalizedString(@\"Shortcut set\", @\"VoiceOver: Shortcut set\") :\n                         MASLocalizedString(@\"Shortcut cleared\", @\"VoiceOver: Shortcut cleared\");\n        NSDictionary *announcementInfo = @{\n            NSAccessibilityAnnouncementKey : msg,\n            NSAccessibilityPriorityKey : @(NSAccessibilityPriorityHigh),\n        };\n        NSAccessibilityPostNotificationWithUserInfo(self, NSAccessibilityAnnouncementRequestedNotification, announcementInfo);\n    }\n    #pragma clang diagnostic pop\n}\n\n- (void)setShortcutValue:(MASShortcut *)shortcutValue\n{\n    _shortcutValue = shortcutValue;\n    [self resetToolTips];\n    [self invalidateIntrinsicContentSize];\n    [self setNeedsDisplay:YES];\n    [self propagateValue:shortcutValue forBinding:MASShortcutBinding];\n\n    if (self.shortcutValueChange) {\n        self.shortcutValueChange(self);\n    }\n}\n\n- (void)setShortcutPlaceholder:(NSString *)shortcutPlaceholder\n{\n    _shortcutPlaceholder = shortcutPlaceholder.copy;\n    [self invalidateIntrinsicContentSize];\n    [self setNeedsDisplay:YES];\n}\n\n#pragma mark - Appearance\n\n- (BOOL)allowsVibrancy\n{\n    return YES;\n}\n\n#pragma mark - Drawing\n\n- (BOOL)isFlipped\n{\n    return YES;\n}\n\n- (void)drawInRect:(CGRect)frame withTitle:(NSString *)title alignment:(NSTextAlignment)alignment state:(NSInteger)state\n{\n    _shortcutCell.title = title;\n    _shortcutCell.alignment = alignment;\n    _shortcutCell.state = state;\n    _shortcutCell.enabled = self.enabled;\n\n    switch (_style) {\n        case MASShortcutViewStyleDefault: {\n            [_shortcutCell drawWithFrame:frame inView:self];\n            break;\n        }\n        case MASShortcutViewStyleTexturedRect: {\n            [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self];\n            break;\n        }\n        case MASShortcutViewStyleRounded: {\n            [_shortcutCell drawWithFrame:CGRectOffset(frame, 0.0, 1.0) inView:self];\n            break;\n        }\n        case MASShortcutViewStyleFlat: {\n            [_shortcutCell drawWithFrame:frame inView:self];\n            break;\n        }\n    }\n}\n\n- (void)drawRect:(CGRect)dirtyRect\n{\n    if (self.shortcutValue) {\n        NSString *buttonTitle;\n        if (self.recording) {\n            buttonTitle = NSStringFromMASKeyCode(kMASShortcutGlyphEscape);\n        } else if (self.showsDeleteButton) {\n            buttonTitle = NSStringFromMASKeyCode(kMASShortcutGlyphClear);\n        }\n        if (buttonTitle != nil) {\n            [self drawInRect:self.bounds withTitle:buttonTitle alignment:NSRightTextAlignment state:NSOffState];\n        }\n        CGRect shortcutRect;\n        [self getShortcutRect:&shortcutRect hintRect:NULL];\n        NSString *title = (self.recording\n                           ? (_hinting\n                              ? MASLocalizedString(@\"Use Old Shortcut\", @\"Cancel action button for non-empty shortcut in recording state\")\n                              : (self.shortcutPlaceholder.length > 0\n                                 ? self.shortcutPlaceholder\n                                 : MASLocalizedString(@\"Type New Shortcut\", @\"Non-empty shortcut button in recording state\")))\n                           : _shortcutValue ? _shortcutValue.description : @\"\");\n        [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:self.isRecording ? NSOnState : NSOffState];\n    }\n    else {\n        if (self.recording)\n        {\n            [self drawInRect:self.bounds withTitle:NSStringFromMASKeyCode(kMASShortcutGlyphEscape) alignment:NSRightTextAlignment state:NSOffState];\n            \n            CGRect shortcutRect;\n            [self getShortcutRect:&shortcutRect hintRect:NULL];\n            NSString *title = (_hinting\n                               ? MASLocalizedString(@\"Cancel\", @\"Cancel action button in recording state\")\n                               : (self.shortcutPlaceholder.length > 0\n                                  ? self.shortcutPlaceholder\n                                  : MASLocalizedString(@\"Type Shortcut\", @\"Empty shortcut button in recording state\")));\n            [self drawInRect:shortcutRect withTitle:title alignment:NSCenterTextAlignment state:NSOnState];\n        }\n        else\n        {\n            [self drawInRect:self.bounds withTitle:MASLocalizedString(@\"Record Shortcut\", @\"Empty shortcut button in normal state\")\n                   alignment:NSCenterTextAlignment state:NSOffState];\n        }\n    }\n}\n\n\n- (NSSize)intrinsicContentSize\n{\n    NSSize cellSize = _shortcutCell.cellSize;\n\n    // Use a \"fake\" value for width.  Since determining the actual width requires information\n    // that is not determined until drawRect: is called, it doesn't seem feasible to properly\n    // calculate the intrinsic size without refactoring the code.  That would give better results,\n    // however.\n\n    // 120 is an arbitray number that seems to be wide enough for English localization.  This\n    // may need to be adjusted for other locales/languages.\n\n    // NOTE:  Simply returning cellSize results in a display that is sometimes correct\n    // and sometimes not, and changes based on whether the mouse is hovering or not.\n    return NSMakeSize(120, cellSize.height);\n}\n\n\n#pragma mark - Mouse handling\n\n- (void)getShortcutRect:(CGRect *)shortcutRectRef hintRect:(CGRect *)hintRectRef\n{\n    CGRect shortcutRect, hintRect;\n    CGFloat hintButtonWidth = MASHintButtonWidth;\n    switch (self.style) {\n        case MASShortcutViewStyleTexturedRect: hintButtonWidth += 2.0; break;\n        case MASShortcutViewStyleRounded: hintButtonWidth += 3.0; break;\n        case MASShortcutViewStyleFlat: hintButtonWidth -= 8.0 - (_shortcutCell.font.pointSize - MASButtonFontSize); break;\n        default: break;\n    }\n    CGRectDivide(self.bounds, &hintRect, &shortcutRect, hintButtonWidth, CGRectMaxXEdge);\n    if (shortcutRectRef)  *shortcutRectRef = shortcutRect;\n    if (hintRectRef) *hintRectRef = hintRect;\n}\n\n- (BOOL)locationInShortcutRect:(CGPoint)location\n{\n    CGRect shortcutRect;\n    [self getShortcutRect:&shortcutRect hintRect:NULL];\n    return CGRectContainsPoint(shortcutRect, [self convertPoint:location fromView:nil]);\n}\n\n- (BOOL)locationInHintRect:(CGPoint)location\n{\n    CGRect hintRect;\n    [self getShortcutRect:NULL hintRect:&hintRect];\n    return CGRectContainsPoint(hintRect, [self convertPoint:location fromView:nil]);\n}\n\n- (void)mouseDown:(NSEvent *)event\n{\n    if (self.enabled) {\n        if (self.shortcutValue) {\n            if (self.recording) {\n                if ([self locationInHintRect:event.locationInWindow]) {\n                    self.recording = NO;\n                }\n            }\n            else {\n                if ([self locationInShortcutRect:event.locationInWindow]) {\n                    self.recording = YES;\n                }\n                else {\n                    self.shortcutValue = nil;\n                }\n            }\n        }\n        else {\n            if (self.recording) {\n                if ([self locationInHintRect:event.locationInWindow]) {\n                    self.recording = NO;\n                }\n            }\n            else {\n                self.recording = YES;\n            }\n        }\n    }\n    else {\n        [super mouseDown:event];\n    }\n}\n\n#pragma mark - Handling mouse over\n\n- (void)updateTrackingAreas\n{\n    [super updateTrackingAreas];\n    \n    if (_hintArea) {\n        [self removeTrackingArea:_hintArea];\n        _hintArea = nil;\n    }\n    \n    // Forbid hinting if view is disabled\n    if (!self.enabled) return;\n    \n    CGRect hintRect;\n    [self getShortcutRect:NULL hintRect:&hintRect];\n    NSTrackingAreaOptions options = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways | NSTrackingAssumeInside);\n    _hintArea = [[NSTrackingArea alloc] initWithRect:hintRect options:options owner:self userInfo:nil];\n    [self addTrackingArea:_hintArea];\n}\n\n- (void)setHinting:(BOOL)flag\n{\n    if (_hinting != flag) {\n        _hinting = flag;\n        [self invalidateIntrinsicContentSize];\n        [self setNeedsDisplay:YES];\n    }\n}\n\n- (void)mouseEntered:(NSEvent *)event\n{\n    self.hinting = YES;\n}\n\n- (void)mouseExited:(NSEvent *)event\n{\n    self.hinting = NO;\n}\n\nvoid *kUserDataShortcut = &kUserDataShortcut;\nvoid *kUserDataHint = &kUserDataHint;\n\n- (void)resetToolTips\n{\n    if (_shortcutToolTipTag) {\n        [self removeToolTip:_shortcutToolTipTag];\n        _shortcutToolTipTag = 0;\n    }\n    if (_hintToolTipTag) {\n        [self removeToolTip:_hintToolTipTag];\n        _hintToolTipTag = 0;\n    }\n    \n    if ((self.shortcutValue == nil) || self.recording || !self.enabled) return;\n\n    CGRect shortcutRect, hintRect;\n    [self getShortcutRect:&shortcutRect hintRect:&hintRect];\n    _shortcutToolTipTag = [self addToolTipRect:shortcutRect owner:self userData:kUserDataShortcut];\n    _hintToolTipTag = [self addToolTipRect:hintRect owner:self userData:kUserDataHint];\n}\n\n- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(CGPoint)point userData:(void *)data\n{\n    if (data == kUserDataShortcut) {\n        return MASLocalizedString(@\"Click to record new shortcut\", @\"Tooltip for non-empty shortcut button\");\n    }\n    else if (data == kUserDataHint) {\n        return MASLocalizedString(@\"Delete shortcut\", @\"Tooltip for hint button near the non-empty shortcut\");\n    }\n    return @\"\";\n}\n\n#pragma mark - Event monitoring\n\n- (void)activateEventMonitoring:(BOOL)shouldActivate\n{\n    static BOOL isActive = NO;\n    if (isActive == shouldActivate) return;\n    isActive = shouldActivate;\n    \n    static id eventMonitor = nil;\n    if (shouldActivate) {\n        __unsafe_unretained MASShortcutView *weakSelf = self;\n        NSEventMask eventMask = (NSKeyDownMask | NSFlagsChangedMask);\n        eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^(NSEvent *event) {\n\n            // Create a shortcut from the event\n            MASShortcut *shortcut = [MASShortcut shortcutWithEvent:event];\n\n            // Tab key must pass through.\n            if (shortcut.keyCode == kVK_Tab){\n                return event;\n            }\n\n            // If the shortcut is a plain Delete or Backspace, clear the current shortcut and cancel recording\n            if (!shortcut.modifierFlags && ((shortcut.keyCode == kVK_Delete) || (shortcut.keyCode == kVK_ForwardDelete))) {\n                weakSelf.shortcutValue = nil;\n                weakSelf.recording = NO;\n                event = nil;\n            }\n\n            // If the shortcut is a plain Esc, cancel recording\n            else if (!shortcut.modifierFlags && shortcut.keyCode == kVK_Escape) {\n                weakSelf.recording = NO;\n                event = nil;\n            }\n\n            // If the shortcut is Cmd-W or Cmd-Q, cancel recording and pass the event through\n            else if ((shortcut.modifierFlags == NSCommandKeyMask) && (shortcut.keyCode == kVK_ANSI_W || shortcut.keyCode == kVK_ANSI_Q)) {\n                weakSelf.recording = NO;\n            }\n\n            else {\n                // Verify possible shortcut\n                if (shortcut.keyCodeString.length > 0) {\n                    if (!weakSelf.shortcutValidator || [weakSelf.shortcutValidator isShortcutValid:shortcut]) {\n                        // Verify that shortcut is not used\n                        NSString *explanation = nil;\n                        if ([weakSelf.shortcutValidator isShortcutAlreadyTakenBySystem:shortcut explanation:&explanation]) {\n                            // Prevent cancel of recording when Alert window is key\n                            [weakSelf activateResignObserver:NO];\n                            [weakSelf activateEventMonitoring:NO];\n                            NSString *format = MASLocalizedString(@\"The key combination %@ cannot be used\",\n                                                                 @\"Title for alert when shortcut is already used\");\n                            NSAlert* alert = [[NSAlert alloc]init];\n                            alert.alertStyle = NSCriticalAlertStyle;\n                            alert.informativeText = explanation;\n                            alert.messageText = [NSString stringWithFormat:format, shortcut];\n                            [alert addButtonWithTitle:MASLocalizedString(@\"OK\", @\"Alert button when shortcut is already used\")];\n\n                            [alert runModal];\n                            weakSelf.shortcutPlaceholder = nil;\n                            [weakSelf activateResignObserver:YES];\n                            [weakSelf activateEventMonitoring:YES];\n                        }\n                        else {\n                            weakSelf.shortcutValue = shortcut;\n                            weakSelf.recording = NO;\n                        }\n                    }\n                    else {\n                        // Key press with or without SHIFT is not valid input\n                        NSBeep();\n                    }\n                }\n                else {\n                    // User is playing with modifier keys\n                    weakSelf.shortcutPlaceholder = shortcut.modifierFlagsString;\n                }\n                event = nil;\n            }\n            return event;\n        }];\n    }\n    else {\n        [NSEvent removeMonitor:eventMonitor];\n    }\n}\n\n- (void)activateResignObserver:(BOOL)shouldActivate\n{\n    static BOOL isActive = NO;\n    if (isActive == shouldActivate) return;\n    isActive = shouldActivate;\n    \n    static id observer = nil;\n    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];\n    if (shouldActivate) {\n        __unsafe_unretained MASShortcutView *weakSelf = self;\n        observer = [notificationCenter addObserverForName:NSWindowDidResignKeyNotification object:self.window\n                                                queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) {\n                                                    weakSelf.recording = NO;\n                                                }];\n    }\n    else {\n        [notificationCenter removeObserver:observer];\n    }\n}\n\n#pragma mark Bindings\n\n// http://tomdalling.com/blog/cocoa/implementing-your-own-cocoa-bindings/\n-(void) propagateValue:(id)value forBinding:(NSString*)binding\n{\n    NSParameterAssert(binding != nil);\n\n    //WARNING: bindingInfo contains NSNull, so it must be accounted for\n    NSDictionary* bindingInfo = [self infoForBinding:binding];\n    if(!bindingInfo)\n        return; //there is no binding\n\n    //apply the value transformer, if one has been set\n    NSDictionary* bindingOptions = [bindingInfo objectForKey:NSOptionsKey];\n    if(bindingOptions){\n        NSValueTransformer* transformer = [bindingOptions valueForKey:NSValueTransformerBindingOption];\n        if(!transformer || (id)transformer == [NSNull null]){\n            NSString* transformerName = [bindingOptions valueForKey:NSValueTransformerNameBindingOption];\n            if(transformerName && (id)transformerName != [NSNull null]){\n                transformer = [NSValueTransformer valueTransformerForName:transformerName];\n            }\n        }\n\n        if(transformer && (id)transformer != [NSNull null]){\n            if([[transformer class] allowsReverseTransformation]){\n                value = [transformer reverseTransformedValue:value];\n            } else {\n                NSLog(@\"WARNING: binding \\\"%@\\\" has value transformer, but it doesn't allow reverse transformations in %s\", binding, __PRETTY_FUNCTION__);\n            }\n        }\n    }\n\n    id boundObject = [bindingInfo objectForKey:NSObservedObjectKey];\n    if(!boundObject || boundObject == [NSNull null]){\n        NSLog(@\"ERROR: NSObservedObjectKey was nil for binding \\\"%@\\\" in %s\", binding, __PRETTY_FUNCTION__);\n        return;\n    }\n\n    NSString* boundKeyPath = [bindingInfo objectForKey:NSObservedKeyPathKey];\n    if(!boundKeyPath || (id)boundKeyPath == [NSNull null]){\n        NSLog(@\"ERROR: NSObservedKeyPathKey was nil for binding \\\"%@\\\" in %s\", binding, __PRETTY_FUNCTION__);\n        return;\n    }\n\n    [boundObject setValue:value forKeyPath:boundKeyPath];\n}\n\n#pragma mark - Accessibility\n\n- (NSString *)accessibilityHelp\n{\n    return MASLocalizedString(@\"To record a new shortcut, click this button, and then type the\"\n                             @\" new shortcut, or press delete to clear an existing shortcut.\",\n                             @\"VoiceOver shortcut help\");\n}\n\n- (NSString *)accessibilityLabel\n{\n    NSString* title = _shortcutValue.description ?: @\"Empty\";\n    title = [title stringByAppendingFormat:@\" %@\", MASLocalizedString(@\"keyboard shortcut\", @\"VoiceOver title\")];\n    return title;\n}\n\n- (BOOL)accessibilityPerformPress\n{\n    if (self.isRecording == NO) {\n        self.recording = YES;\n        return YES;\n    }\n    else {\n        return NO;\n    }\n}\n\n- (NSString *)accessibilityRole\n{\n    return NSAccessibilityButtonRole;\n}\n\n- (BOOL)acceptsFirstResponder\n{\n    return _acceptsFirstResponder;\n}\n\n- (void)setAcceptsFirstResponder:(BOOL)value\n{\n    _acceptsFirstResponder = value;\n}\n\n- (BOOL)becomeFirstResponder\n{\n    [self invalidateIntrinsicContentSize];\n    [self setNeedsDisplay:YES];\n    return [super becomeFirstResponder];\n}\n\n- (BOOL)resignFirstResponder\n{\n    [self invalidateIntrinsicContentSize];\n    [self setNeedsDisplay:YES];\n    return [super resignFirstResponder];\n}\n\n- (void)drawFocusRingMask\n{\n    [_shortcutCell drawFocusRingMaskWithFrame:[self bounds] inView:self];\n}\n\n- (NSRect)focusRingMaskBounds\n{\n    return [self bounds];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/User Defaults Storage/MASDictionaryTransformer.h",
    "content": "extern NSString *const MASDictionaryTransformerName;\n\n/**\n Converts shortcuts for storage in user defaults.\n\n User defaults can’t stored custom types directly, they have to\n be serialized to `NSData` or some other supported type like an\n `NSDictionary`. In Cocoa Bindings, the conversion can be done\n using value transformers like this one.\n\n There’s a built-in transformer (`NSKeyedUnarchiveFromDataTransformerName`)\n that converts any `NSCoding` types to `NSData`, but with shortcuts\n it makes sense to use a dictionary instead – the defaults look better\n when inspected with the `defaults` command-line utility and the\n format is compatible with an older sortcut library called Shortcut\n Recorder.\n*/\n@interface MASDictionaryTransformer : NSValueTransformer\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/User Defaults Storage/MASDictionaryTransformer.m",
    "content": "#import \"MASDictionaryTransformer.h\"\n#import \"MASShortcut.h\"\n\nNSString *const MASDictionaryTransformerName = @\"MASDictionaryTransformer\";\n\nstatic NSString *const MASKeyCodeKey = @\"keyCode\";\nstatic NSString *const MASModifierFlagsKey = @\"modifierFlags\";\n\n@implementation MASDictionaryTransformer\n\n+ (BOOL) allowsReverseTransformation\n{\n    return YES;\n}\n\n// Storing nil values as an empty dictionary lets us differ between\n// “not available, use default value” and “explicitly set to none”.\n// See http://stackoverflow.com/questions/5540760 for details.\n- (NSDictionary*) reverseTransformedValue: (MASShortcut*) shortcut\n{\n    if (shortcut == nil) {\n        return [NSDictionary dictionary];\n    } else {\n        return @{\n            MASKeyCodeKey: @([shortcut keyCode]),\n            MASModifierFlagsKey: @([shortcut modifierFlags])\n        };\n    }\n}\n\n- (MASShortcut*) transformedValue: (NSDictionary*) dictionary\n{\n    // We have to be defensive here as the value may come from user defaults.\n    if (![dictionary isKindOfClass:[NSDictionary class]]) {\n        return nil;\n    }\n\n    id keyCodeBox = [dictionary objectForKey:MASKeyCodeKey];\n    id modifierFlagsBox = [dictionary objectForKey:MASModifierFlagsKey];\n\n    SEL integerValue = @selector(integerValue);\n    if (![keyCodeBox respondsToSelector:integerValue] || ![modifierFlagsBox respondsToSelector:integerValue]) {\n        return nil;\n    }\n\n    return [MASShortcut\n        shortcutWithKeyCode:[keyCodeBox integerValue]\n        modifierFlags:[modifierFlagsBox integerValue]];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/User Defaults Storage/MASShortcutBinder.h",
    "content": "#import \"MASShortcutMonitor.h\"\n\n/**\n Binds actions to user defaults keys.\n\n If you store shortcuts in user defaults (for example by binding\n a `MASShortcutView` to user defaults), you can use this class to\n connect an action directly to a user defaults key. If the shortcut\n stored under the key changes, the action will get automatically\n updated to the new one.\n\n This class is mostly a wrapper around a `MASShortcutMonitor`. It\n watches the changes in user defaults and updates the shortcut monitor\n accordingly with the new shortcuts.\n*/\n@interface MASShortcutBinder : NSObject\n\n/**\n A convenience shared instance.\n\n You may use it so that you don’t have to manage an instance by hand,\n but it’s perfectly fine to allocate and use a separate instance instead.\n*/\n+ (instancetype) sharedBinder;\n\n/**\n The underlying shortcut monitor.\n*/\n@property(strong) MASShortcutMonitor *shortcutMonitor;\n\n/**\n Binding options customizing the access to user defaults.\n\n As an example, you can use `NSValueTransformerNameBindingOption` to customize\n the storage format used for the shortcuts. By default the shortcuts are converted\n from `NSData` (`NSKeyedUnarchiveFromDataTransformerName`). Note that if the\n binder is to work with `MASShortcutView`, both object have to use the same storage\n format.\n*/\n@property(copy) NSDictionary *bindingOptions;\n\n/**\n Binds given action to a shortcut stored under the given defaults key.\n\n In other words, no matter what shortcut you store under the given key,\n pressing it will always trigger the given action.\n*/\n- (void) bindShortcutWithDefaultsKey: (NSString*) defaultsKeyName toAction: (dispatch_block_t) action;\n\n/**\n Disconnect the binding between user defaults and action.\n\n In other words, the shortcut stored under the given key will no longer trigger an action.\n*/\n- (void) breakBindingWithDefaultsKey: (NSString*) defaultsKeyName;\n\n/**\n Register default shortcuts in user defaults.\n\n This is a convenience frontent to `[NSUserDefaults registerDefaults]`.\n The dictionary should contain a map of user defaults’ keys to appropriate\n keyboard shortcuts. The shortcuts will be transformed according to\n `bindingOptions` and registered using `registerDefaults`.\n*/\n- (void) registerDefaultShortcuts: (NSDictionary*) defaultShortcuts;\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/Framework/User Defaults Storage/MASShortcutBinder.m",
    "content": "#import \"MASShortcutBinder.h\"\n#import \"MASShortcut.h\"\n\n@interface MASShortcutBinder ()\n@property(strong) NSMutableDictionary *actions;\n@property(strong) NSMutableDictionary *shortcuts;\n@end\n\n@implementation MASShortcutBinder\n\n#pragma mark Initialization\n\n- (id) init\n{\n    self = [super init];\n    [self setActions:[NSMutableDictionary dictionary]];\n    [self setShortcuts:[NSMutableDictionary dictionary]];\n    [self setShortcutMonitor:[MASShortcutMonitor sharedMonitor]];\n    [self setBindingOptions:@{NSValueTransformerNameBindingOption: NSKeyedUnarchiveFromDataTransformerName}];\n    return self;\n}\n\n- (void) dealloc\n{\n    for (NSString *bindingName in [_actions allKeys]) {\n        [self unbind:bindingName];\n    }\n}\n\n+ (instancetype) sharedBinder\n{\n    static dispatch_once_t once;\n    static MASShortcutBinder *sharedInstance;\n    dispatch_once(&once, ^{\n        sharedInstance = [[self alloc] init];\n    });\n    return sharedInstance;\n}\n\n#pragma mark Registration\n\n- (void) bindShortcutWithDefaultsKey: (NSString*) defaultsKeyName toAction: (dispatch_block_t) action\n{\n    NSAssert([defaultsKeyName rangeOfString:@\".\"].location == NSNotFound,\n        @\"Illegal character in binding name (“.”), please see http://git.io/x5YS.\");\n    NSAssert([defaultsKeyName rangeOfString:@\" \"].location == NSNotFound,\n        @\"Illegal character in binding name (“ ”), please see http://git.io/x5YS.\");\n    [_actions setObject:[action copy] forKey:defaultsKeyName];\n    [self bind:defaultsKeyName\n        toObject:[NSUserDefaultsController sharedUserDefaultsController]\n        withKeyPath:[@\"values.\" stringByAppendingString:defaultsKeyName]\n        options:_bindingOptions];\n}\n\n- (void) breakBindingWithDefaultsKey: (NSString*) defaultsKeyName\n{\n    [_shortcutMonitor unregisterShortcut:[_shortcuts objectForKey:defaultsKeyName]];\n    [_shortcuts removeObjectForKey:defaultsKeyName];\n    [_actions removeObjectForKey:defaultsKeyName];\n    [self unbind:defaultsKeyName];\n}\n\n- (void) registerDefaultShortcuts: (NSDictionary*) defaultShortcuts\n{\n    NSValueTransformer *transformer = [_bindingOptions valueForKey:NSValueTransformerBindingOption];\n    if (transformer == nil) {\n        NSString *transformerName = [_bindingOptions valueForKey:NSValueTransformerNameBindingOption];\n        if (transformerName) {\n            transformer = [NSValueTransformer valueTransformerForName:transformerName];\n        }\n    }\n\n    NSAssert(transformer != nil, @\"Can’t register default shortcuts without a transformer.\");\n\n    [defaultShortcuts enumerateKeysAndObjectsUsingBlock:^(NSString *defaultsKey, MASShortcut *shortcut, BOOL *stop) {\n        id value = [transformer reverseTransformedValue:shortcut];\n        [[NSUserDefaults standardUserDefaults] registerDefaults:@{defaultsKey:value}];\n    }];\n}\n\n#pragma mark Bindings\n\n- (BOOL) isRegisteredAction: (NSString*) name\n{\n    return !![_actions objectForKey:name];\n}\n\n- (id) valueForUndefinedKey: (NSString*) key\n{\n    return [self isRegisteredAction:key] ?\n        [_shortcuts objectForKey:key] :\n        [super valueForUndefinedKey:key];\n}\n\n- (void) setValue: (id) value forUndefinedKey: (NSString*) key\n{\n    if (![self isRegisteredAction:key]) {\n        [super setValue:value forUndefinedKey:key];\n        return;\n    }\n\n    MASShortcut *newShortcut = value;\n    MASShortcut *currentShortcut = [_shortcuts objectForKey:key];\n\n    // Unbind previous shortcut if any\n    if (currentShortcut != nil) {\n        [_shortcutMonitor unregisterShortcut:currentShortcut];\n    }\n\n    // Just deleting the old shortcut\n    if (newShortcut == nil) {\n        [_shortcuts removeObjectForKey:key];\n        return;\n    }\n\n    // Bind new shortcut\n    [_shortcuts setObject:newShortcut forKey:key];\n    [_shortcutMonitor registerShortcut:newShortcut withAction:[_actions objectForKey:key]];\n}\n\n@end\n"
  },
  {
    "path": "Pods/MASShortcut/LICENSE",
    "content": "Copyright (c) 2012-2013, Vadim Shpakovski\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Pods/MASShortcut/README.md",
    "content": "[![Build Status](https://travis-ci.org/shpakovski/MASShortcut.svg?branch=master)](https://travis-ci.org/shpakovski/MASShortcut)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n# Intro\n\nSome time ago Cocoa developers used a brilliant framework [ShortcutRecorder](http://wafflesoftware.net/shortcut/) for managing keyboard shortcuts in application preferences. However, it became incompatible with the new plugin architecture of Xcode 4.\n\nThe MASShortcut project introduces a modern API and user interface for recording, storing and using system-wide keyboard shortcuts.\n\n![Screenshot of the demo project](https://raw.githubusercontent.com/shpakovski/MASShortcut/master/Demo/screenshot.png \"This is how the demo looks like\")\n\nFeatures:\n\n* Record and display keyboard shortcuts\n* Watch for shortcuts and execute actions, system-wide\n* A nice, [documented API](http://cocoadocs.org/docsets/MASShortcut/)\n* Can be configured to be compatible with Shortcut Recorder\n* Can be installed both through CocoaPods and as a Git submodule\n* Mac App Store friendly\n* Works on OS X 10.10 and up\n* Hacking-friendly codebase covered with tests\n\nPartially done:\n\n* Accessibility support. There’s some basic accessibility code, testers and feedback welcome.\n* Localisation. The English and Czech localization should be complete, there’s basic support for German, French, Spanish, Italian, and Japanese. If you’re a native speaker in one of the mentioned languages, please test the localization and report issues or add missing strings.\n\nPull requests welcome :)\n\n# Installation\n\nYou can use [CocoaPods](http://cocoapods.org/), adding the following line to your Podfile:\n\n    pod 'MASShortcut'\n\nIf you want to stick to the 1.x branch, you can use the version smart match operator:\n\n    pod 'MASShortcut', '~> 1'\n\nYou can also install via [Carthage](https://github.com/Carthage/Carthage), or you can use Git submodules and link against the MASShortcut framework manually.\n\nTo build from the command line, type 'make release'. The framework will be created in a temporary directory and revealed in Finder when the build is complete.\n\n# Usage\n\nI hope, it is really easy:\n\n```objective-c\n#import <MASShortcut/Shortcut.h>\n\n// Drop a custom view into XIB, set its class to MASShortcutView\n// and its height to 19. If you select another appearance style,\n// look up the correct height values in MASShortcutView.h.\n@property (nonatomic, weak) IBOutlet MASShortcutView *shortcutView;\n\n// Pick a preference key to store the shortcut between launches\nstatic NSString *const kPreferenceGlobalShortcut = @\"GlobalShortcut\";\n\n// Associate the shortcut view with user defaults\nself.shortcutView.associatedUserDefaultsKey = kPreferenceGlobalShortcut;\n\n// Associate the preference key with an action\n[[MASShortcutBinder sharedBinder]\n    bindShortcutWithDefaultsKey:kPreferenceGlobalShortcut\n    toAction:^{\n    // Let me know if you find a better or a more convenient API.\n}];\n```\n\nYou can see a real usage example in the Demo target. Enjoy!\n\n# Shortcut Recorder Compatibility\n\nBy default, MASShortcut uses a different User Defaults storage format incompatible with Shortcut Recorder. But it’s easily possible to change that, so that you can replace Shortcut Recorder with MASShortcut without having to migrate the shortcuts previously stored by your apps. There are two parts of the story:\n\nIf you bind the recorder control (`MASShortcutView`) to User defaults, set the Value Transformer field in the Interface Builder to `MASDictionaryTransformer`. This makes sure the shortcuts are written in the Shortcut Recorder format.\n\nIf you use `MASShortcutBinder` to automatically load shortcuts from User Defaults, set the `bindingOptions` accordingly:\n\n```objective-c\n[[MASShortcutBinder sharedBinder] setBindingOptions:@{NSValueTransformerNameBindingOption:MASDictionaryTransformerName}];\n```\n\nThis makes sure that the shortcuts in the Shortcut Recorder format are loaded correctly.\n\n# Notifications\n\nBy registering for KVO notifications from `NSUserDefaultsController`, you can get a callback whenever a user changes the shortcut, allowing you to perform any UI updates, or other code handling tasks.\n\nThis is just as easy to implement:\n    \n```objective-c\n// Declare an ivar for key path in the user defaults controller\nNSString *_observableKeyPath;\n    \n// Make a global context reference\nvoid *kGlobalShortcutContext = &kGlobalShortcutContext;\n    \n// Implement when loading view\n_observableKeyPath = [@\"values.\" stringByAppendingString:kPreferenceGlobalShortcut];\n[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:_observableKeyPath\n                                                             options:NSKeyValueObservingOptionInitial\n                                                             context:kGlobalShortcutContext];\n\n// Capture the KVO change and do something\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)obj\n                        change:(NSDictionary *)change context:(void *)ctx\n{\n    if (ctx == kGlobalShortcutContext) {\n        NSLog(@\"Shortcut has changed\");\n    }\n    else {\n        [super observeValueForKeyPath:keyPath ofObject:obj change:change context:ctx];\n    }\n}\n\n// Do not forget to remove the observer\n[[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self\n                                                             forKeyPath:_observableKeyPath\n                                                                context:kGlobalShortcutContext];\n```\n\n# Using in Swift projects\n\n  1. Install as a Pod using the latest CocoaPods with Swift support.\n  2. Create a bridging header file [using the instructions here](http://swiftalicio.us/2014/11/using-cocoapods-from-swift/)\n  3. Your bridging header file should contain the following [two](https://github.com/shpakovski/MASShortcut/issues/36) imports:\n\n```objective-c\n#import <Cocoa/Cocoa.h>\n#import <MASShortcut/Shortcut.h>\n```\n\n# Copyright\n\nMASShortcut is licensed under the 2-clause BSD license.\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/cs.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Zrušit\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Kliknutím nahrajete novou zkratku\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Smazat zkratku\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"klávesová zkratka\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Nahrát zkratku\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"zkratka smazána\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"zkratka nastavena\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Mezerník\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Kombinace %@ se nedá použít\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Tato zkratka se nedá použít, protože už ji obsadil systém.\\nKdybyste na ní trvali, většina systémových zkratek se dá přenastavit v Předvolbách systému.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Tato zkratka se nedá použít, protože už je použita pro menu (%@).\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Pokud chcete nahrát novou zkratku, stiskněte toto tlačítko a následně vybranou zkratku. Stisknutím Delete vymažete stávající zkratku.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Stiskněte zkratku\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Stiskněte zkratku\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Vrátit se k původní\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/de.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"Abbrechen\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Klicken um neuen Kurzbefehl aufzunehmen\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Kurzbefehl Löschen\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"Kurzbefehl\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Kurzbefehl aufnehmen\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Kurzbefehl gelöscht\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Kurzbefehl gesetzt\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Leertaste\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Die Tastenkombination %@ kann nicht genutzt werden\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Diese Kombination kann nicht genutzt werden, weil sie bereits als systemweiter Kurzbefehl genutzt wird.\\nFalls du diese Tastenkombination wirklich benutzen willst, können die meisten Kurzbefehle in den Tastatur Systemeinstellungen geändert werden.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Dieser Kurzbefehl kann nicht genutzt werden, weil er bereits vom Menüpunkt „%@“ genutzt wird.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Drücke diesen Button, um einen neuen Kurzbefehl aufzunehmen. Tippe dann den neuen Kurzbefehl oder drücke Löschen, um den aktuellen Kurzbefehl zu löschen.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Neuen eingeben\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Kurzbefehl eingeben\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Alten nutzen\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/en.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Cancel\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Click to record new shortcut\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Delete shortcut\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"keyboard shortcut\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Record Shortcut\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Shortcut cleared\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Shortcut set\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Space\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"The key combination %@ cannot be used\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"This shortcut cannot be used because it is already used by the menu item ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Type New Shortcut\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Type Shortcut\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Use Old Shortcut\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/es.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"Cancelar\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Haga clic para grabar nuevo atajo\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Borrar atajo\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"atajo de teklado\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Grabar atajo\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Atajo borrado\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Atajo creado\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Espacio\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"La combinación de claves %@ no se puede utilizada\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Esta combinación no se puede utilizar debido a que ya es en us como atajo del sistema.\\nSi realmente desea utilizar esta combinación de teclas, la mayoría de los atajos se puede cambiar en el panel de Teclado y Ratón de Preferencias del Sistema.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Este atajo no se puede utilizar debido a que ya es utilizado por el elemento de menú '%@'.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Para grabar un nuevo atajo, haga clic en este botón, a continuar, escriba el nuevo atajo, o pulse borrar para qutar un atajo existente.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Escribir atajo\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Escribir atajo\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Usa atajo anterior\";"
  },
  {
    "path": "Pods/MASShortcut/Resources/fr.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"Annuler\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Cliquez pour enregistrer le raccourci\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Supprimer le raccourci\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"raccourci clavier\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Enregistrer le raccourci\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Raccourci supprimé\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Raccourci configuré\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Espace\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"La combinaison %@ ne peut être utilisée\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Cette combinaison de touches ne peut être utilisée parce qu’elle est réservée pour un raccourci du système.\\nSi vous désirez l’utiliser, la plupart des raccourcis peuvent être modifiés dans l’onglet Clavier, dans Préférences Système.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Ce raccourci ne peut être utilisé parce qu’il est déjà utilisé par le point de menu «%@».\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Pour enregistrer un nouveau raccourci, cliquez sur ce bouton et tapez le nouveau raccourci, ou bien, tapez sur «Supprimer» pour supprimer le raccourci configuré.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Saisir un raccourci\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Saisir un raccourci\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Revenir au raccourci précédent\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/it.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"Annulla\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Cliccare per registrare una nuova combinazione\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Cancella scorciatoia\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"Scorciatoia da tastiera\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Registra scorciatoia\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Scorciatoia rimossa\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Scorciatoia impostata\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Spazio\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Questa combinazione %@ di tasti non può essere usata\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Questa combinazione di tasti non può essere usata perchè è già usata da una scorciatoia da tastiera a livello di Sistema.\\nSe volete davvero usare questa combinazione di tasti, la maggior parte delle scorciatoie possono essere cambiate nel pannello Tastiera e Mouse delle Preferenze di Sistema.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Questa combinazione di tasti non può essere usata perchè è già usata dalla voce di menù ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Per registrare una nuova scorciatoia, cliccare su questo pulsante e poi inserire la muova scorciatoia o premere cancella per resettare una scorciatoia esistente.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Digita nuova\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Digita scorciatoia\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Usare vecchia\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/ja.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"キャンセルする\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"クリックしてショートカットを入力\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"ショートカットを削除\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"キーボードショートカット\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"ショートカットを入力\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"ショートカットが削除されました\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"ショートカットが設定されました\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"スペース\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"%@ はショートカットに設定できません\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"このショートカットは、システム全体で使用されているショートカットのため、設定することができません。\\nもしこのショートカットを使用したい場合、「システム環境設定」の「キーボード」、「マウス」のパネルから既に設定されているショートカットを変更してください。\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"このショートカットは、メニュー操作の「%@」で使われているため、設定できません。\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"このボタンをクリックし、ショートカットを入力すると、新しいショートカットが設定されます。また、削除ボタンをおすと、ショートカットが削除されます。\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"ショートカットを入力\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"ショートカットを入力\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"古いショートカットを使用\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/ko.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"취소\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"클릭해 단축 키를 입력\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"단축키 삭제\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"키보드 단축키\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"좋아\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"단축키 입력\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"단축키　삭제됨\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"단축키　설정됨\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"스페이스 바\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"%@ 단축키로 설정할 수 없습니다\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"이 결합은 시스템 전체에서 사용 때문에 단축키로 설정 할 수 없습니다.\\n단축키를 사용하고 싶으면 시스템 환경 설정의 키보드, 마우스 패널에서 이미 설정되어있는 단축키를 변경하십시오.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"이 단축키는 ‘%@’ 메뉴 아이템에 사용되고 있기 때문에 설정할 수 없습니다.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"이 버튼을 클릭하고 단축키를 입력하면 새로운 단축키가 설정됩니다. 또한 삭제 버튼을 누르면  단축키가 삭제됩니다.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"새 단축키 입력\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"단축키 입력\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"오래된 단축키를 사용\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/nl.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Verbreken\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Druk om een nieuwe sneltoets in te voeren\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Verwijder sneltoets\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"sneltoets\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Sneltoets opnemen\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Sneltoets verwijderd\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Sneltoets zetten\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Spatie\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"De sneltoetsencombinatie kan niet worden gebruikt\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Deze combinatie kan niet worden gebruikt want hij wordt al gebruikt door een systeembreed sneltoets.\\nAls je deze combinatie echt wilt gebruiken, kun je de meeste sneltoetsen binnen Toetsenbordinstellingen veranderen.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Deze sneltoets kan niet worden gebruikt want hij wordt al gebruikt door het menu item ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Om nieuwe sneltoets op te nemen, druk op deze knop, en voer een nieuwe sneltoets in, of druk op verwijder om bestaande sneltoets te verwijderen.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Voer Nieuwe Sneltoets in\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Voer Sneltoets in\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Gebruik Oude Sneltoets\";"
  },
  {
    "path": "Pods/MASShortcut/Resources/pl.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Anuluj\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Kliknij, by ustawić nowy skrót\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Usuń skrót\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"skrót klawiszowy\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Utwórz skrót\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Skrót usunięty\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Skrót ustawiony\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Spacja\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Nie można użyć kombinacji klawiszy %@\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Nie można użyć tej kombinacji, ponieważ jest już zajęta przez skrót systemowy.\\nMożesz to zmienić w panelu Klawiatura w Preferencjach systemowych.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Ten skrót nie może być użyty, ponieważ w menu ma już przypisaną funkcję ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Aby ustawić nowy skrót, użyj tego przycisku, a następnie wpisz nowy skrót albo naciśnij klawisz delete, by usunąć istniejący skrót\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Wpisz nowy skrót\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Wpisz skrót\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Użyj starego skrótu\";"
  },
  {
    "path": "Pods/MASShortcut/Resources/pt.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Cancelar\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" =\"Clique para gravar o atalho\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Apagar atalho\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"atalho de teclado\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Gravar Atalho\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Atalho limpo\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Atalho definido\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Espaço\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"A combinação de teclas “%@” não pode ser usada\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Esta combinação não pode ser usada porque ela já é usada por um atalho global do sistema.\\nA maioria dos atalhos pode ser alterada no painel Teclado das Preferências do Sistema, caso realmente deseje usar esta combinação.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Este atalho não pode ser usado porque ele já é usado pelo item de menu “%@”.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Para gravar um atalho novo, clique neste botão e digite o novo atalho ou pressione apagar para limpar um atalho existente.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Digite o atalho\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Digite o atalho\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Usar atalho antigo\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/ru.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"Отмена\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Нажмите для записи сочетания клавиш\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Удалить горячую клавишу\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"сочетание клавиш\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"ОК\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Ввести сочетание\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Сочетание клавиш удалено\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Сочетание клавиш назначено\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Пробел\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Нельзя использовать сочетание клавиш %@\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Нельзя использовать это сочетание клавиш, потому что оно уже используется в системе.\\n Если вы хотите использовать это сочетание, измените существующее системное сочетание клавиш через панель Клавиатура в Cистемных настройках.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Нельзя использовать это сочетание, потому что оно уже связано с элементом ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"Чтобы назначить новое сочетание клавиш, нажмите эту кнопку и введите новое сочетание, или нажмите \\\"Удалить\\\", чтобы удалить действующее сочетание клавиш.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Введите сочетание\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Введите сочетание\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Вернуть старое\";"
  },
  {
    "path": "Pods/MASShortcut/Resources/sv.lproj/Localizable.strings",
    "content": "/* Cancel action button in recording state */\n\"Cancel\" = \"Avbryt\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"Klicka för att registrera ny kortkommando\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"Ta bort en kortkommando\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"Tangentbordskortkommando\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"OK\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"Registrera kortkommando\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"Kortkommando rensas\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"Kortkommando uppsättning\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"Utrymme\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"Tangentkombinationen %@ kan inte användas\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"Den här kombinationen kan inte användas eftersom den redan används som en tangentbordskortkommando. Om du verkligen vill använda den här tangentkombinationen kan de flesta genvägar ändras under Tangentbord & Mus i Systeminställningar.\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"Denna kortkommando kan inte användas eftersom det redan används av ett menyalternativ ‘%@’.\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"För att registrera en ny kortkommando, klicka på den här knappen och skriv sedan in den nya kortkommando, eller tryck på radera för att rensa en befintlig kortkommando.\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"Skriv Ny Kortkommando\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"Skriv Kortkommando\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"Använd Gammal Kortkommando\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/zh-Hans.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"取消\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"点击以记录新快捷键\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"删除快捷键\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"键盘快捷键\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"好\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"记录快捷键\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"快捷键已清除\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"快捷键已设置\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"空格键\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"按键组合“%@”无法使用\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"当前按键组合无法使用，因为它已经用作其他系统全局快捷键。\\n如果您真的想使用这个按键组合，大部分系统全局快捷键能在“系统偏好设置”里的“键盘”和“鼠标”面板中重设。\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"当前快捷键无法使用，因为它已用作菜单项“%@”的快捷键。\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"若要记录新的快捷键，单击此按钮，然后键入新的快捷键，或者按“delete键”删除已经存在的快捷键。\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"键入新快捷键\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"键入快捷键\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"还原快捷键\";\n"
  },
  {
    "path": "Pods/MASShortcut/Resources/zh-Hant.lproj/Localizable.strings",
    "content": "﻿/* Cancel action button in recording state */\n\"Cancel\" = \"取消\";\n\n/* Tooltip for non-empty shortcut button */\n\"Click to record new shortcut\" = \"點選以記錄新快捷鍵\";\n\n/* Tooltip for hint button near the non-empty shortcut */\n\"Delete shortcut\" = \"刪除快捷鍵\";\n\n/* VoiceOver title */\n\"keyboard shortcut\" = \"鍵盤快捷鍵\";\n\n/* Alert button when shortcut is already used */\n\"OK\" = \"好\";\n\n/* Empty shortcut button in normal state */\n\"Record Shortcut\" = \"記錄快捷鍵\";\n\n/* VoiceOver: Shortcut cleared */\n\"Shortcut cleared\" = \"快捷鍵已清除\";\n\n/* VoiceOver: Shortcut set */\n\"Shortcut set\" = \"快捷鍵已設定\";\n\n/* Shortcut glyph name for SPACE key */\n\"Space\" = \"空格鍵\";\n\n/* Title for alert when shortcut is already used */\n\"The key combination %@ cannot be used\" = \"按鍵組合“%@”無法使用\";\n\n/* Message for alert when shortcut is already used by the system */\n\"This combination cannot be used because it is already used by a system-wide keyboard shortcut.\\nIf you really want to use this key combination, most shortcuts can be changed in the Keyboard & Mouse panel in System Preferences.\" = \"當前按鍵組合無法使用，因為它已經用作其他系統全局快捷鍵。\\n如果您真的想使用這個按鍵組合，大部分系統全局快捷鍵能在“系統偏好設定”裡的“鍵盤”和“滑鼠”面板中重設。\";\n\n/* Message for alert when shortcut is already used */\n\"This shortcut cannot be used because it is already used by the menu item ‘%@’.\" = \"當前快捷鍵無法使用，因為它已用作選單項“%@”的快捷鍵。\";\n\n/* VoiceOver shortcut help */\n\"To record a new shortcut, click this button, and then type the new shortcut, or press delete to clear an existing shortcut.\" = \"若要記錄新的快捷鍵，單擊此按鈕，然後鍵入新的快捷鍵，或者按“delete鍵”刪除已經存在的快捷鍵。\";\n\n/* Non-empty shortcut button in recording state */\n\"Type New Shortcut\" = \"鍵入新快捷鍵\";\n\n/* Empty shortcut button in recording state */\n\"Type Shortcut\" = \"鍵入快捷鍵\";\n\n/* Cancel action button for non-empty shortcut in recording state */\n\"Use Old Shortcut\" = \"還原快捷鍵\";\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t013BAC24F7AC722E59517CB110A9E685 /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 403ABCCF5634DCD99A376EAA601F828E /* HTTPMethod.swift */; };\n\t\t017170EB9F2450569816AB0FF2E6D541 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5FCDE3BD3C3E02C0A0B3D529BF6982 /* CombineLatest.swift */; };\n\t\t022F83EC88B467A88CBB491D7C98FA7E /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F927D22EA76A49C54C44827DD1CE5A /* UITabBar+Rx.swift */; };\n\t\t02AEF100BA92B652E6E48EF58B479533 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4A797B2A249C56CB61DB60A3FEA31FD2 /* en.lproj */; };\n\t\t037CEEDED76C75AB19A6A015D66C1322 /* RxCollectionViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9215F3DCBD2FE1BDADCEF5D05219A48 /* RxCollectionViewDelegateProxy.swift */; };\n\t\t06185F389644D5BD1C84259027C533D5 /* UICollectionView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D49EC557FA27872611535147AB5D700C /* UICollectionView+Rx.swift */; };\n\t\t0722A6B0D2DE0B9620F5C9659CB679D8 /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A2C23CF743A94075196D7A4F419F5A4 /* Debounce.swift */; };\n\t\t07326CA68F757A1C82495BB52A92BD5C /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE91EC45C71C190D532DC351F5E724D /* CompositeDisposable.swift */; };\n\t\t080F0457EB8E6A9F2841FB0D77AEEF42 /* RxCollectionViewDataSourcePrefetchingProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78275DA82CA025902C1D6FAF39BC9403 /* RxCollectionViewDataSourcePrefetchingProxy.swift */; };\n\t\t08FE05B1BA0A6D9CE971027E0480350A /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EB8536183BE6472CDCC5817172688EF /* AnonymousDisposable.swift */; };\n\t\t091B8980E4EFE8B81548A8B0369DF1F7 /* UIPickerView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608BE9EFB078FCC2348EF2782C265D92 /* UIPickerView+Rx.swift */; };\n\t\t0A1849775CF90D514963187D3A771CF8 /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F78589C2F1DDF07DF58CD22F6835B19 /* Combine.swift */; };\n\t\t0A20A09C199A4692A8EA72497B3D504A /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD2535A24AA927A5965AF73264678A3 /* Catch.swift */; };\n\t\t0A4DF5D6FC29A34C999E1ECBB53C696B /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530CEAEC9F4BC5F2EC9C9534779927A3 /* RxMutableBox.swift */; };\n\t\t0A8A30C3BF493120607DD0157A560065 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD39BD9C1B852EC7AC7CD7D77D1E606F /* ObserveOn.swift */; };\n\t\t0A900DF17E3B64F08AF673E9A0DDD697 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26DA8062B81F764A6EEA6168DF6337AB /* OperationQueue+Alamofire.swift */; };\n\t\t0CA982442C8027B672202D753260BAC9 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 77B5C856C653A9586105526C4341767A /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0D8B936D823A959DDE9005A1C1D89487 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CECC6752E3DD709B29A4ED0461B7BF82 /* Disposables.swift */; };\n\t\t0E7C902AB09DA1CA05D07D36BD55C73E /* Enumerated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31234D4C5E912BD05D37874E7E89A233 /* Enumerated.swift */; };\n\t\t0EEDE530AD4098CC0660A78E2852DA6A /* MASKeyMasks.h in Headers */ = {isa = PBXBuildFile; fileRef = 867FD5BBBCAC1E98FE144867305F8FEF /* MASKeyMasks.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0FB5F248B62BC1F0113E53461E807AE5 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D9E4509154BFFEBEA9AEA0C935EC9E /* SubjectType.swift */; };\n\t\t0FE468D23725DEF3BB913C80A61F9B1B /* RxPickerViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 961D7CAE484B6E4929A7BE5B048D29B5 /* RxPickerViewDataSourceType.swift */; };\n\t\t10993D369AADB3E2BCA4E966DE514C09 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0791E5EB9ADBB88CEE0BCD83DA9502C /* SchedulerServices+Emulation.swift */; };\n\t\t109ADA4349083858A198CA863E457E37 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F2EB184269284B56190B6EE5A7E5CC3 /* DisposeBag.swift */; };\n\t\t11B06B47E4CB24A05B1299D730643803 /* ObservableType+PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA3BEB86C50C2AAE9CCEDB0171CFC56 /* ObservableType+PrimitiveSequence.swift */; };\n\t\t1208E81DA8B532D0646D627B50290EB6 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8A09F0F8EDB0B1A568AA29A33D62EA /* AFError.swift */; };\n\t\t128376A37733CDCD9870A39DE261904E /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ED0DC48A18FD32A95BE8B28D715172C /* UISearchController+Rx.swift */; };\n\t\t12DF0C4E73CEC6118673050B236C7799 /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 73327356D8055C270C5AFBAEE0D202DD /* MASKeyCodes.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t12E8D9F9C1A9B4FC7669C18954BC4798 /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0E4BDE3E30AF8C9062AFAD9C3AEA28 /* ControlEvent+Driver.swift */; };\n\t\t14403B39AC36562E41D4768CCF3540B1 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC41D63AA5F0A525ACB78573334AB97C /* CombineLatest+arity.swift */; };\n\t\t14C185529F30494F6B6F0DFA9AEDDC05 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73118DDBDD8A625213B479BD40C4B9CE /* TakeLast.swift */; };\n\t\t14E31D647AFA8F0FBE3793EF61872247 /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FF8B675AE7A3F0AB7CDE7C48E8082A /* ScheduledItemType.swift */; };\n\t\t16C263170733039596369C8D4F89077A /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC8F5BC5CABB65CCD832B9821F532DBD /* InfiniteSequence.swift */; };\n\t\t19D605A3233499828FB6B790869F3E9C /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5102E62600D264D29633030E490AAE6 /* NetworkReachabilityManager.swift */; };\n\t\t1A630AD9EFDB068A1544BD51CA5E99B7 /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080201197B517655700BD33F44B1A602 /* Dematerialize.swift */; };\n\t\t1AECEBA213A2C9E6EC56C2C1358849E4 /* MASShortcut.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A4A724DBFF9C1C260A76A4B104F3B1E /* MASShortcut.m */; };\n\t\t1B341070BA8EB97021BE7C152639CBF5 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A2828DE92C9CEECE9FB19F2EE763305 /* VirtualTimeScheduler.swift */; };\n\t\t1C0A940E6D4FD420BEC04B9F16914D71 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11DD125BCF1FDD4E34715800EC2F295F /* RecursiveLock.swift */; };\n\t\t1C11628696BD0C889E0A4FC6CA4B6922 /* GCDWebServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A0680C8640FDF225CF2A27A4204628 /* GCDWebServer-dummy.m */; };\n\t\t1D5606C6BD48C543FA0DB2C82B8791B7 /* GCDWebServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B400BB6631F1C9F8534BE1CEF160097E /* GCDWebServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1DF080CB9D37CB063C6FEC09BBF8F238 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F893DD80BE166F23DB8567A0940B0FEE /* Timer.swift */; };\n\t\t1EC23A9ACE471AAE845CE9ACD4588932 /* Infallible+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2FFFF24B3AC3570742D7F2CCF2FE3C5 /* Infallible+Zip+arity.swift */; };\n\t\t1ECDFBCA376564682426B5D8AC70393C /* RxTableViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADC06A8D8266504D3FD0F38F5F1A87AD /* RxTableViewDataSourceProxy.swift */; };\n\t\t1FAEB66513E2610FE37D99FDD8F9E46D /* GCDWebServerStreamedResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = AE4742C0047EC328BE64C1DF6D868CEF /* GCDWebServerStreamedResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1FDEA9EB6CAF8FB09C98CEBE607DCFB6 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4177B545582D09C0D653414E6353741 /* SectionedViewDataSourceType.swift */; };\n\t\t212EDC48B68107BEA9247F3464CE696E /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8305C9D0B89A4CE30258C61DDD5A342 /* StringEncoding+Alamofire.swift */; };\n\t\t218C14EAE5AA31C30314AE0289B732A0 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D1B54DDFE366EA8E657D1CFA2A5349 /* Protected.swift */; };\n\t\t221F057199246D7709DD91C950746B7B /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C1C25377D5ADEBBE1E5B44FD42F2BF8 /* GCDWebServerMultiPartFormRequest.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t2375AD3B88ECB4A1C01F9F70DCFB05E7 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 718741562429DAE6AA6DC455ED6883D4 /* Errors.swift */; };\n\t\t239AC2D5500F4E4FB04BC341A1335DF7 /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DAFFC9484B606CC3A8583B2085B7957 /* SerialDisposable.swift */; };\n\t\t23CF55A9FA514BDCA0B46320D4ED5DEC /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1816E3DFE7F11350A74B0C1F878F7FC /* RxCocoa.swift */; };\n\t\t2453CFD81C667B99753FF8354AA82C60 /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA5F27AAEF9B366933CB017942EFAA8 /* HistoricalScheduler.swift */; };\n\t\t262C2E49711CEA356F7C2031AE074C8A /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FC23633FFFBBD0FA165FB284958F8C /* RecursiveScheduler.swift */; };\n\t\t262EBFD1844224838811BD9E1726CD73 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA187A944BB7C96464B1E79E6D12F90F /* AppKit.framework */; };\n\t\t26900F59621365F9EF08DB37C7E07C06 /* RxScrollViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B58732AA1AF7EA39B29A8BE85721F26 /* RxScrollViewDelegateProxy.swift */; };\n\t\t27C5636F69D717D7745A0235D715E4FB /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FF704B43D944C2399606B76A430F1A6 /* Platform.Linux.swift */; };\n\t\t27E59A11A2743B0595CDE3A08675EAE1 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41ADA85A38ECDBBD122B707DA599E641 /* DispatchQueue+Alamofire.swift */; };\n\t\t2862DA4097D964B745862F00BB45759D /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EB5DBBABE4FD6FFF0223AC1BC4674DB /* KVORepresentable+Swift.swift */; };\n\t\t2B540E502B0EE71D93636BA94B9F0817 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD89974F6EA342767735D559995D3FA /* Zip+arity.swift */; };\n\t\t2BD53F1C421E9938A099F3F45C84FBAD /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2586C5A6499D4E9A6B62C1CF5804DE66 /* Platform.Linux.swift */; };\n\t\t2C8A055494092F137EDB2E3BDCA74DFC /* Maybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5219820998BC7D8238F0F05F90A3D96F /* Maybe.swift */; };\n\t\t2CD9AC66F1727C363449C4072DA57F89 /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4338C646A92E1539E9BED963FC618602 /* ObservableType.swift */; };\n\t\t2D890B63806F7465912098B60052B092 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408AEB2CFB972D5D82E41BB027E6686C /* SerialDispatchQueueScheduler.swift */; };\n\t\t2E0722133679D5C422D0EC5ACB8B23A1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t2F835E1CFB72A43AC17728C6105B9635 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F401550E51DCC5F5746B99EC564065B /* SharedSequence.swift */; };\n\t\t2FD49578803778A2F094C0B21FEE332C /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8565AD8EBB9A4E532AF93D887B586876 /* Cancelable.swift */; };\n\t\t30536C64EAA45BE64894B48D74144B1E /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29E3014CE53E3127CCD38149E2060C76 /* DispatchQueue+Extensions.swift */; };\n\t\t313170D278E51360492948E6BB704EA7 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9A3F0ED147035005ABA4D679F9E36A7B /* ru.lproj */; };\n\t\t3212BC4884F26AE9244A7548691A0CE0 /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = D570E112B81800B30A1165D0BC68DB8A /* Delay.swift */; };\n\t\t325A6428E460396F0B0CB9B6FE10EEC4 /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 321FC2ED515952B66BACDB8CAC130EB4 /* it.lproj */; };\n\t\t332D9AE4473773687AA9155EF16A80D8 /* MASHotKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 8937D9E4BB1CD1D979DFF21019B4D814 /* MASHotKey.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t34C033CDDD8217EE4221E9BDFFC23086 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B151536C20EA366FDBE99C5A8BB7A5 /* MainScheduler.swift */; };\n\t\t3596F8FDA81BECFE1B05B50500447638 /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70C13D2EC9B57E48D64BD7ABC49F9D6 /* KVORepresentable+CoreGraphics.swift */; };\n\t\t35A428176550E4AA2BB98CDDEE2AFF99 /* Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E4505859B317DCDCC426973F6C7153D /* Signal.swift */; };\n\t\t3685E20BBC5AFEA3BC80FE12732AB269 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = C40D7DCF882E3A5609EDE1602335E721 /* GCDWebServerResponse.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t36DED9F6B7737F022FB0B01ECE2BB88E /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 0555618E1BBA944D30E358F0700CDD8B /* GCDWebServerFunctions.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t381FF05F8B4F611EE9C2FDBE4457BB89 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7045A3758C33721435A4135DBC6A8AA /* SessionDelegate.swift */; };\n\t\t38A45D6FD7DCA41AC0C9CD58EDBB57CB /* UITextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4BB8686A6F85698D8AC03A77D188340 /* UITextView+Rx.swift */; };\n\t\t39988540E9F936FE5085117BB8F32FAC /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3A89F3DBB03CFC012C901EB6D452A3B /* PriorityQueue.swift */; };\n\t\t3AB06F4DB0A01BA8F6662D0EDC495981 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F97D53A26324CAC07AB16E21B963CF9A /* InvocableScheduledItem.swift */; };\n\t\t3BAE1C06A091DFA7A91F93BD40BD41B9 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 127B3965CEBAEBFB395F0D10B7C255FB /* Throttle.swift */; };\n\t\t3BBEC4A24B60E2276CBC26E555F64F41 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = AB7765E1848A0449B3E3267F17DDE12E /* GCDWebServerDataResponse.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t3D8428BE717C8E76FA50C1D8B93561EE /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04A3FEA575D65278CDB553AA231A0CF6 /* DisposeBase.swift */; };\n\t\t3E2FF4CBA1E2C3A36060CB61A25F80F7 /* BRLOptionParser-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1389D4639C0D9038BA081FA8DC1CD646 /* BRLOptionParser-dummy.m */; };\n\t\t3E6A74677BA3612A449B323631B44559 /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C713517A8C0251C9EEB925D43C63A544 /* ObservableType+Extensions.swift */; };\n\t\t42DBD7750A47DE5273041BDEE8850195 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD90405BE5311F3F3A8CFCFABCCF3560 /* Multicast.swift */; };\n\t\t4319C0B97542219FCA256B790FE90C1C /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4504CA755CE81F89F9F165BF93126D21 /* es.lproj */; };\n\t\t432B3CB444984CCCFB4EF37E2D762F05 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636937DE6DA6CE01D7E94282A16BC9D9 /* Observable.swift */; };\n\t\t43BC914A79B9230DA50C9D476DE5114D /* WKWebView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDCA53BCCEFF4720A955F8202537A982 /* WKWebView+Rx.swift */; };\n\t\t4407E13BF761D53607A7B419BE64458B /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DBE368EA1C6F7EBE80E08054C9BC6AE /* TextInput.swift */; };\n\t\t440BDCF5820801BC8A6D740C48EEAB8E /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B23D7AFD516825208E6CE9B362989DB /* Queue.swift */; };\n\t\t447B98FAB75F9B738B72DA92A3C581D6 /* RxPickerViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC44E7C397DF9B77CEF6F5C86EFCE92A /* RxPickerViewDataSourceProxy.swift */; };\n\t\t44C45DEC66DB1FBBA5F850E79057DC13 /* TakeWithPredicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6327835932D3C270A640C0C76A860EB8 /* TakeWithPredicate.swift */; };\n\t\t44D30DA4840EF46F1C4BCEA6179AAE60 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA23B9C3D142FEFFA05E4F37B1A976AE /* ElementAt.swift */; };\n\t\t45B8CC1C61E7A0BB28CFA8CE7C12FEBC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7453403FEE25F56521DBB8A39EA0204 /* MultipartFormData.swift */; };\n\t\t4673A5004D211FA68BB8506B9A323034 /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B304846A96173EC0E0631D07751C0893 /* Sink.swift */; };\n\t\t4728113A1BA4AE948E1B2FB610A473B4 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45BF55923F2D3657D9D5420E606B641F /* Repeat.swift */; };\n\t\t47E487EF80C53073DBFE5F5FD6BCFF0E /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD07F15ADFC693A5C730840EA2B42015 /* AsyncSubject.swift */; };\n\t\t47FDBBBD2704901588C3A7C56BBC502D /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90E9219489B97BDFE17BA3231CC465FC /* ServerTrustEvaluation.swift */; };\n\t\t4892C3EBD345FAE187A5E15D7FA19CBE /* GCDWebServerFileRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 962EFFE0B39AFE334DBCAF81B4DBFE56 /* GCDWebServerFileRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4940AB8BC3936DEBDC02BF49FE5E97A1 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 392538EA12C4E3008D6EF1ABB226B3BF /* GCDWebServerFileRequest.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t4953376F75EEA98570C65CFC41E0A154 /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474547C10494F37402A98A0BFC7E6288 /* RxSearchControllerDelegateProxy.swift */; };\n\t\t4A33F1A7BD2AD1F318E081E17B0AA80F /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 200825C8579BF340304A9767D679EC35 /* InvocableType.swift */; };\n\t\t4AEC050FA7D5ED52FDA9DF50EA3560DF /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ED9E80778846168B6F3F867C04F6AA /* ParameterEncoder.swift */; };\n\t\t4B9CC90686F274845EBBB82F230C11EE /* Infallible+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF4A8984BD7018149BDA495C7EA5FE28 /* Infallible+Operators.swift */; };\n\t\t4BEC411F5B170048C65D315C87832600 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52626495FA7375A2A4753E3EC16FB26C /* AsyncLock.swift */; };\n\t\t4BF6073DF04E6CD2C3BD8D2C552D7E65 /* UISlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 466B399C2E7FFAA61B709F2AB447ECDF /* UISlider+Rx.swift */; };\n\t\t4C3A9F4F5A688009D660C0FA5E5D81BB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t4C6CC049B53AF49050AD6428C5B50AB0 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6B674A528A68BF8E6AB4A5F747B05B8 /* NopDisposable.swift */; };\n\t\t4C88ED296D3687C973B0472D047CE3E8 /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 111E9F3F4997D0ACA2E0BCDAF269904C /* SchedulerType.swift */; };\n\t\t4D15DB973A043E9B4A47B724738A2A5F /* MASShortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = A2B9727C5385989526550D8E1AC4649A /* MASShortcut.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4D6504A580F9D6278452D19FD3DD35BC /* PublishRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA7211C3393B6E1ED0E57C4CCF5F5005 /* PublishRelay.swift */; };\n\t\t4E095DE808150F9350BB9CB3C99A37B2 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 638797412ABBF2F7725016AF4B056309 /* _RXObjCRuntime.m */; };\n\t\t4EC10410410410FF3A33C6015FD5927D /* ShareReplayScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72D91E08E6C75E1F0DBACD4FF3CA2F55 /* ShareReplayScope.swift */; };\n\t\t516E4177ED65653EA9DAADBA3CF3FBED /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC4C66DE7DB1A4B525929AEF699AC3CE /* OperationQueueScheduler.swift */; };\n\t\t519260344D4291AA4C1CEAD7711B1489 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33BBD4B03778E41A59C1A3F64AAB876C /* Deferred.swift */; };\n\t\t51B830516D57359FAB42031193E47CB1 /* RxCollectionViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D1BF03B3F26978B85F2E44EBE18FC1 /* RxCollectionViewDataSourceType.swift */; };\n\t\t5263ED302CD55D6C365476F9B20AD5D1 /* MASShortcutMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 24121C8FA3C10947BE50901868F9198A /* MASShortcutMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t52CB53A7C3EF4BD88F73996450B73AA7 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44775F4816D20EB134F1DBAB43BE0B3A /* Filter.swift */; };\n\t\t535519D2B25D1784AA6D6A9BDE60C759 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4786526A5AD085C95AC191C7253C591 /* Switch.swift */; };\n\t\t543010884F5B7C1F2920A0DF33A3A9D1 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA62A0165A7A8D001536C62FD5E2392 /* SynchronizedUnsubscribeType.swift */; };\n\t\t54FFBD61CC8FA5DD12646A7FFAAFE425 /* RxRelay-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DDC82F5641636881356BF49166C8DF3 /* RxRelay-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t563C41694A1B06EF34752E894297D3FA /* MASShortcut-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B668707F7C66384A3BB8BC4FE3F41E6 /* MASShortcut-dummy.m */; };\n\t\t58D3BBBF801B54CC74FAAC0374F1948D /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35662841C2AAA3188CD9ADFDC38880F /* NSTextStorage+Rx.swift */; };\n\t\t5989329B01C0737EFDB490C5A771FDC2 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = DC40BD5F1E0BFED23CB5A6AE57FA4443 /* GCDWebServerURLEncodedFormRequest.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t5BF5F916582D2EE625A9F0F32ECE709A /* MASShortcut-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 930EB20F00FF48CAF9B19505BC219504 /* MASShortcut-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t5CDF229542C4FC347E9D1DFDBAC8B230 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32777B9FE68F64D911474F7B7595C94C /* Scan.swift */; };\n\t\t5E3681E1F77D4A9B58F332348935EE8C /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2096522151041770121528F182B6F42D /* Range.swift */; };\n\t\t5F7CE7907DC769D3E61980B80D20A275 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C7F789300668AEDFA53AEA1392C48B /* Concat.swift */; };\n\t\t601A69113478A1336ADA98C7658D2355 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 273C90965AA81CCFE4CDA40530425746 /* Take.swift */; };\n\t\t60FBA126D0D250DE50F4DD26041E4A9C /* RxTableViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D418B4DEE726BA9D5A912D8F1FBF0888 /* RxTableViewDataSourceType.swift */; };\n\t\t611ACC0E723AF0E572160BC75133A9E6 /* UIGestureRecognizer+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D87FAE60EB40AC65B2E5000C6B82DFEB /* UIGestureRecognizer+Rx.swift */; };\n\t\t62DF258CA1EA9A41A99B93052A72DAB0 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AD4414199F479D544CBF1FFF3FB45E4 /* _RXDelegateProxy.m */; };\n\t\t63257249A72693C87BF365F343DA1D36 /* ko.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A254689F2908346AD7387F063C24B41A /* ko.lproj */; };\n\t\t63CE2D43072C461D8DE926F0B9EC2E97 /* RxPickerViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D41ECF1E34CC3D83A32F7896831100 /* RxPickerViewDelegateProxy.swift */; };\n\t\t64F43894B4404E7BDE27A5C8BE96E0AE /* Completable+AndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A111C3B36368413B50627674BB48E859 /* Completable+AndThen.swift */; };\n\t\t652118C36365C28E76826357E309EADE /* Infallible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370A313E34AF66CB8D7437ABDC3FB7F8 /* Infallible.swift */; };\n\t\t6546D728B69398F93B506845141EBD61 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0CDE6403F2AF9E108FF190F90FA9FF /* EventMonitor.swift */; };\n\t\t65EA84D8C4EA09B4455BC6C221D2A940 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 72A57876EDEB24ADDFE06DD482CE250C /* Pods-ShadowsocksX-NGTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t66207468882614FB8CE9896DC4250F13 /* Infallible+Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = 161437331F54761E08F028DD14CDC21E /* Infallible+Create.swift */; };\n\t\t665FBE569EDC9AF24C721F6B9C7241EC /* MASShortcutBinder.h in Headers */ = {isa = PBXBuildFile; fileRef = A18A7F7794D2CC58900E95F6644D63E8 /* MASShortcutBinder.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t666EC5C8356E6D4448A2FE7BEE77AD88 /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A32434EC299FDE302FFF9F31EB8735D0 /* RedirectHandler.swift */; };\n\t\t66B26C6CAE737EC21F4BA1F1851B69C5 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2C25316E1BF4F3230E3412417481E6 /* Result+Alamofire.swift */; };\n\t\t6809229B402FC6C91774DA8664AD4F2F /* GCDWebServerRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = A4395BE2A0C53A82170A01602870453A /* GCDWebServerRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t695A83FEFDFE24858DDC37BD64DBBA33 /* Binder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4412635C50524157DDF38FA0CB197F4A /* Binder.swift */; };\n\t\t69D750E3DAB2F11E37761A204A145883 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661DD8158386E15481E17DE6E2FA1882 /* Timeout.swift */; };\n\t\t6A2F2216A64E4B4E0FD6215A2F5E692D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t6A3972E7F1ACA4CEE36E0AA3B2BA34FB /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C0FB7A81FC88101C56EABF826BD78F5 /* Reactive.swift */; };\n\t\t6A5300346FF40392C6A4B5908AA9C027 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F666DF6A38D74980DF6F191509F4971 /* RxCocoaObjCRuntimeError+Extensions.swift */; };\n\t\t6AE407A4FB6C3D6ADD862CC6E3067A17 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 996DFC2DB5C2F37F0E623EB885F5DEB5 /* Session.swift */; };\n\t\t6B105A67121436E162ADE05A682BEA71 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CB05B6D60934D955FE0D75C2339A114 /* Amb.swift */; };\n\t\t6BDF6DD0C73F197EC93643F477997B40 /* UISearchBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2888FA81FD2BE4D3B068BCE4AFDC9A93 /* UISearchBar+Rx.swift */; };\n\t\t6C08F6A77889651626583100F560153D /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF8D2E7C64775F0DD477127B5EC2E0AB /* RequestTaskMap.swift */; };\n\t\t6C1064F34CFE15C3DB0E923D9D170E0C /* UIBarButtonItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB340F626B32E3AF98F1E13658FB46E2 /* UIBarButtonItem+Rx.swift */; };\n\t\t6CA2AE8DA8D630D83FAED6FC2F081967 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A0B431980745BE7A67D566D79E240A /* HistoricalSchedulerTimeConverter.swift */; };\n\t\t6CD3A3F8ABC5FCE23D15CE6823840010 /* RxTabBarControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D9FF9E1CBB62DA6FC1910AA45EB039 /* RxTabBarControllerDelegateProxy.swift */; };\n\t\t6CDC5000511AB1CF616FEBB8A856AE58 /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCCC3232579F890A62A86540F6600BE6 /* Bag+Rx.swift */; };\n\t\t6D5BDAE5D8D991B874AD4D7FF2EA7C8C /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA0A6C3DB39AD5C25FF5B1A9F554E228 /* Lock.swift */; };\n\t\t6E54F64E8DA73F4B0B46C216F9F93F63 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80B5C55F7279E38D15E19E9DEDDEDE7B /* RequestInterceptor.swift */; };\n\t\t6E75ECF4BDC7AF83E3151274539DFF93 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C96F1CEB77C6CB8A9D2A7682406E7AE9 /* DispatchQueue+Extensions.swift */; };\n\t\t6FD62C6E23DE07DF1291500FEFC19354 /* BehaviorRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D796FDCC7398C88D7B835BD89700D56 /* BehaviorRelay.swift */; };\n\t\t70359E1C7BAA76860EA35A607CCC4309 /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB7AE66363DEA0FFF31BA0AD1EB9340 /* DelegateProxyType.swift */; };\n\t\t7094648D68C944D337CE86C10F8EEB04 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B2BCE49AE180E28B89BBBE037DF32A2F /* zh-Hans.lproj */; };\n\t\t72E6FED1FBFB7D269B435A3802528AA1 /* MASShortcutValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E796A67AE756E845646324A31731334 /* MASShortcutValidator.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t72EC2712926E6D28B52360D9AC41668F /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AA7CC35C97B4BDF08E2E5CE20955E0 /* AlamofireExtended.swift */; };\n\t\t73E48515343BD4E57358BAD9F3B2F590 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAABDBC186233AEF9876B5A4F009C8B8 /* Platform.Darwin.swift */; };\n\t\t741E51A8D9DE26331ABB938B3BD5751A /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 494FD3BF9675BD2ADCE4731FED65B5FF /* AddRef.swift */; };\n\t\t75917BCA0645283EC7D9CC3ADEE6DB4F /* BehaviorRelay+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98EF0EFA057CC202BD041F55B091661A /* BehaviorRelay+Driver.swift */; };\n\t\t77093BBAB8F2F51540322CB14BD2C178 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1177638C48D2FB13DDFB46A70CD35D /* BehaviorSubject.swift */; };\n\t\t77260113D5ADF7B45DAE46C549580AFD /* UIRefreshControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506B13C445D67D7231C25641361EE5A1 /* UIRefreshControl+Rx.swift */; };\n\t\t774C726DE2716860799DAEAD0B801A94 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = D894FDA92A29CEECD7D1E50C263F1777 /* Reduce.swift */; };\n\t\t7813074001D6CD69B3A1EBAF59379E58 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A18EEA4857408358F9A8E6ED8AF8829 /* Observable+Bind.swift */; };\n\t\t786C836C43BD6428332A4001EE13816F /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5554F4E6979C7DDD1E00F81CB94D474D /* RecursiveLock.swift */; };\n\t\t7885432DE1DDE9F2A4607033B2808E5B /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EB7F9271D4EAE5B4A31D5D0194BECC /* GroupBy.swift */; };\n\t\t7B0FB5B7BF42B15FDF1FCE073D8C4C21 /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D247C19100F15D54BFF5D93804C65E /* AsSingle.swift */; };\n\t\t7B99EC9A5D3CF7B6DE0330773143F15F /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B00E954AA2FCFDF5ACDEC8CD8C6941E /* ObserverType.swift */; };\n\t\t7BD242803D2ADF6E50A27C3542C8695D /* NSSlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5874107EF4581DA493B60BBCFE422D1C /* NSSlider+Rx.swift */; };\n\t\t7BFBC9F9818BC849C72D672D6B6E4B75 /* RxNavigationControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52DFCC55A239674DEF17871D293D227C /* RxNavigationControllerDelegateProxy.swift */; };\n\t\t7CF0187F571D299FE14788318D720152 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 864BF009AFF7BFF4D8B68869FC885957 /* StartWith.swift */; };\n\t\t7D3DD4A8BB36733BA15868F7FB8C56CE /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 10E99E50E2994DB7AD9AEBDEF1A2F72B /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7D5AE7E56AC7636F1D00076095F57745 /* GCDWebServerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D0B40D5A184825074ECC549693CAF02 /* GCDWebServerConnection.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7E8BC075464E9C355B763973CA6C08D2 /* UINavigationController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D742A8B753D54115AD3C6D293B64276 /* UINavigationController+Rx.swift */; };\n\t\t805003984E8CFD3375B935DC772A7BF3 /* MASShortcutView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C73921B2C710D3814A33EF328D04D20 /* MASShortcutView.m */; };\n\t\t809C371060C874FBEF8FECDF197D74E3 /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = FDF7D102C3DA0493A530D68E569DA7CF /* sv.lproj */; };\n\t\t80C7348602C99C09226B1241C02D4754 /* MASShortcutView.h in Headers */ = {isa = PBXBuildFile; fileRef = A2EEB1D58595D58C5DC8978116BE0648 /* MASShortcutView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t815908B08BEA64FC0E5641D046D43CB6 /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EB9FE74C8220E21EC9A5A77098E9152 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t82764E2E2DA3FD699FC5B659ED35D9AE /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = FAB6166D07AACCBF2B4A5FFC66F22602 /* pt.lproj */; };\n\t\t830F06C3D23016D62112E4BA1C22A766 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 683395CCE980D15405934DC5E2BCD682 /* LockOwnerType.swift */; };\n\t\t8314F89A5274810933307BC20E85D3B0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t83470A9EFB9948DED806CC1D1233D21C /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07B4CEF97C27B2FE6205EE1D720BFB39 /* Skip.swift */; };\n\t\t844134211AB7B26FACFFF74B58B81C02 /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17F9F190DDBE93E38A56D8405CBFA664 /* UIButton+Rx.swift */; };\n\t\t8450D728709DB935952A5A59650DB926 /* MASDictionaryTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 353B178196A1B3A383089B3D1006F66A /* MASDictionaryTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t84E576015933A4F6F431759174C62956 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764F518EAB30C5EA82C03A5607ED7AF /* Error.swift */; };\n\t\t85CD565FB8198B084806FE075B268AB5 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C119A4F639217703B4B382419AF9D4EF /* NSObject+Rx.swift */; };\n\t\t872E07F59296D07A405BAB9C36936AC8 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB63C0EAF763E45BC31AAB9802F87995 /* DelegateProxy.swift */; };\n\t\t8819CBF35F9919DFC3C17016DF3ACE46 /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C78EDD95C0B56A70BE237D148A1726CA /* UIApplication+Rx.swift */; };\n\t\t88665F16CDF39BC2A50C6619169E6EDF /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 62F5D09616527A0713F24DF416BEC64F /* Carbon.framework */; };\n\t\t88F5FF298C4C3D2CDCA5EB7B0BE2B52C /* GCDWebServerResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 89066EEDE0D03A9B328DADDC9344CC13 /* GCDWebServerResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t896AD4C4865ECEA0A8344B54BBA3B9E1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t8AA937910F87915DE700CAB6C868689E /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEEC0450A3B1A48A304AE8BF1DC03429 /* Notifications.swift */; };\n\t\t8B67845A8F56DF49F8B22B1BB63C5E10 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4673D1BC54F57F490E2D3352F6BA1B73 /* VirtualTimeConverterType.swift */; };\n\t\t8B7EEE0E899778DA279E64E26E38FB30 /* RxTextViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531091EE9FF408558B83A1E053360F67 /* RxTextViewDelegateProxy.swift */; };\n\t\t8BEDC2C0D907FBB47A65EE0E01DE2A59 /* GCDWebServerDataRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 36E9C273C636D7A0C559787BD1FABA68 /* GCDWebServerDataRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t8CE605907DC8FA1F2E4751F939A4E604 /* UIControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C1FFDE936B5B805CB094F77E95A88FC /* UIControl+Rx.swift */; };\n\t\t8EB4272CE33A59083F0DC9746C0F71D0 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F0007682E9947D6BFA4DA24D30F6CBF2 /* RxSwift-dummy.m */; };\n\t\t8EEA6795ED2806C80FBE6A00B615CB76 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D96D37A7C37C05D7DEEAE9B3944CC4DD /* PriorityQueue.swift */; };\n\t\t8F66042610AE99F62D17E50EF0C83B0D /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = F961756C2E9DE7614DBA1271483EB245 /* Never.swift */; };\n\t\t901D8E9CC22C5E7FDB218557EBBB3559 /* GCDWebServerDataResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = C21721CAB3BC76F0D7582BD636DB821D /* GCDWebServerDataResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t90429156F020B4490158F6686EEFCB02 /* Date+Dispatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11E6B29B9CB879F29AFEBD980D3AFBF /* Date+Dispatch.swift */; };\n\t\t90B5B048AE70F82175F8A3DB72EF601E /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE717EAC81EE595FC7AE3C1A3C6D06A6 /* Buffer.swift */; };\n\t\t911448B2EDA2FF880108F77642797A88 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48CB9D3553F121F84DBB750A8FBE0F3D /* ResponseSerialization.swift */; };\n\t\t9131DD9E2CB7420C156461E56835AE6E /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFD92A4EF88D0A6B34E86A6A7CE2436D /* RxSwift.framework */; };\n\t\t9141315B460BE4CD3030B62BE7692B73 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 960C49C6C3C5E2554CA3CD8EB86B61AC /* Queue.swift */; };\n\t\t91B837CE0DCD8EDB300FCDFFA1279162 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3425B3045259FEA3A238D183DEEE520B /* HTTPHeaders.swift */; };\n\t\t91C85BAD47B39F365F260E74AB24693D /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B5D8A52DE9A6385138A6D20CB5527DDB /* zh-Hant.lproj */; };\n\t\t9281E701873CD72C35440865226A1A8B /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C10AA3C311345DB3616BCE827B69C55 /* Pods-ShadowsocksX-NGTests-dummy.m */; };\n\t\t934592C980EE09EEE5F4B5074C6A56D8 /* PublishRelay+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758B67811993E4C5163D7637EDBB6CFD /* PublishRelay+Signal.swift */; };\n\t\t9360BB098EFD18F90BA16149E8EF8A34 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA0D236EFCE9E4E77F9A2B2A0AF3FC4 /* Merge.swift */; };\n\t\t9389C4BF3F440F2503FFEB8BBC8975C8 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B1F34EB08D07E2AF230CDA30F361889D /* ja.lproj */; };\n\t\t953EC9012B7246D01EA866100FAEA023 /* RxPickerViewAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F979292485788BE53E5871123C74EB10 /* RxPickerViewAdapter.swift */; };\n\t\t96E6F7A2D012051B29BC9147340E5117 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\t9806F1246774ADD50F50D3F1624EB0EB /* UITabBarController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D4701E49CFDE5F411CDFD316EDD3C70 /* UITabBarController+Rx.swift */; };\n\t\t99210D61FFF596695086F3E51D893204 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D6BD38BB9E0F241C3C82A118E7F253 /* ControlProperty+Driver.swift */; };\n\t\t999CAB83E4F6D824DF56B2B755C0B588 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = A14B9E97BE00B01372727FA8DA9B10A3 /* _RXKVOObserver.m */; };\n\t\t99ABB4C207FE146C78313E8A9A581FD6 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BC543740C092C697A08396093A0F7BD /* GCDWebServerFileResponse.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\t99E2AEBB5C39DB1661C5C03DDAA451EC /* Infallible+CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40573DCBFB24CA15F7D6C33B5C73162F /* Infallible+CombineLatest+arity.swift */; };\n\t\t9A1CDAE2E9AFFFDBC654855D4A8C6D36 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 817D9055D7659CAC86800D119F65E0F4 /* CFNetwork.framework */; };\n\t\t9AA31D499392F8C3E63FE70C8DE816ED /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 95F05E167015F6A202D2BEB9437AE766 /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t9AC6705C60E05CAB6115BA7603BDC0F6 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B98DA4C08DC1A12B2789714C6CDEFFA /* Bag.swift */; };\n\t\t9B1D8A7798D8A6F518FC9AF9725431D0 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE6768B8A7BED83ED5C93BB3439EFFEF /* URLConvertible+URLRequestConvertible.swift */; };\n\t\t9C3D3F75523B1B1BB4B3051C01F8F6FE /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3677CB82C594C5820F17431AA45C5C87 /* Zip+Collection.swift */; };\n\t\t9D05E77AB8415BB11EC5C5FB6FD62276 /* UITextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877FA6BB936631CD8F2CA0DFFF6EFC9C /* UITextField+Rx.swift */; };\n\t\t9D5CD154B7C49DA0BCBFF996CA9A6E62 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = AADC2D51259367D2BB2C73816E5A35CD /* RetryWhen.swift */; };\n\t\t9E9A7DA26421695F48AA96DA35B813B4 /* RxTableViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5B1AE9FCFABDD97172220DFDFE618E5 /* RxTableViewDelegateProxy.swift */; };\n\t\t9F77A1FFC61AF7C54E88B7436893C91B /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3949A4BE0C4C31915E5A812146DB23B9 /* DistinctUntilChanged.swift */; };\n\t\t9F794FB773B632DAC0416008A8EC3F45 /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0D4493458E5817BA46B4318626487F6 /* ScheduledDisposable.swift */; };\n\t\t9FC8EA2F7B3939D69D1469F9046B166A /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855607DC318E2CF3120B3C70565140A0 /* Window.swift */; };\n\t\t9FED70D1E1FBFB80E974E999EF732258 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B85D80911EDFC7DD402EBEB3A05169A /* RetryPolicy.swift */; };\n\t\tA0F9BB688F14F5B350A388BA60C184A0 /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4618A8C418D70264404BBAF10EE3A1F4 /* ObservableConvertibleType.swift */; };\n\t\tA1CB4107AB9FDEC58E3A7C0C14B4AB79 /* UIDatePicker+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46A83A815027A06FB7A8AB2CEDF56368 /* UIDatePicker+Rx.swift */; };\n\t\tA24E8834A85F99EF471C495AD4EFACAB /* RxRelay.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FBD8075FDD277652161C8676E945DE6A /* RxRelay.framework */; };\n\t\tA2526FE80C9370555D66A0A33EA22E44 /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE18F7CA6E337EA48867C7D92143B6F9 /* NotificationCenter+Rx.swift */; };\n\t\tA2F246B7FCDC421BE6098866AA1509C9 /* MASShortcutView+Bindings.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C471325C18D493A8244DEB1563B18B6 /* MASShortcutView+Bindings.m */; };\n\t\tA34F81BE4A40B0C6EF378FBB8F240C66 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 6985BD62945B0A86382437BC1758C282 /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA3D78B5A2E0E6B987B021DA58CA55BEB /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE18557905075BFBE5AFBE3A0D9287F4 /* PublishSubject.swift */; };\n\t\tA4CE525F7E6904D7D244727C90DBDBE2 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBC071EBDAC90F82FF4D25D024A5AACF /* Sample.swift */; };\n\t\tA525A6AE79BA19A9BDEA467D31477916 /* NSTextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C81F8C45A4C248E266304541A86B5A8 /* NSTextField+Rx.swift */; };\n\t\tA5BE980B95C08EDFEBEC17E0433A4A2E /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B37E46EBF28CB6542B58754F09D8AAA /* RxTarget.swift */; };\n\t\tA5DC2335899B03F0130A9C739319C92A /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = A20673B8CBA1827BCAE8A9CDEAF0CDC5 /* SwitchIfEmpty.swift */; };\n\t\tA6652D3942752A05ED133DB77C955216 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE4AAE5FF0F7FEDE2C8D5FB08A1AE4F /* DelaySubscription.swift */; };\n\t\tA7A81BFC5D65FDB665AC19E78D4F21B6 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314A2DB247EA6781CE45C5C146496327 /* ToArray.swift */; };\n\t\tA8DBBA1BD18472113BBE931A3F949659 /* Infallible+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C45F96BE0AE01F3BB2C90370A73616 /* Infallible+Bind.swift */; };\n\t\tA8EEAAF6FACD8832BE7E4A6331ED57E4 /* ControlEvent+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C3A35E7DD83A1437478608A9F2EF44C /* ControlEvent+Signal.swift */; };\n\t\tA9AFA432B293A80CF9B1ABD1285A4705 /* AtomicInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = A269EEED1FC8BFDA5FCB004DC335F5C8 /* AtomicInt.swift */; };\n\t\tA9DD82DFCFA49DC81169D82415DE7B94 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54CB24891D5C94C81CAED6F6D1D4FAB /* Rx.swift */; };\n\t\tA9DFF7177D374AF79EEAD9F34B66569A /* NSButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFC3F4E49698472F1AA8DE21B1BD0F2 /* NSButton+Rx.swift */; };\n\t\tA9E6EFE85136C81C4AD5BF1CC1B990FD /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FEFD09344E88FFE590FC0A7146C0D32 /* BinaryDisposable.swift */; };\n\t\tAA5CBA43C0BF98751988A758EB180BA6 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8663196F6A9678BFC77A8E46F8666C75 /* ScheduledItem.swift */; };\n\t\tAB83592C5AA99079DA59151D2ACDFBE2 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14C791F6C2C8320DE732C78C55306A1 /* ObservableConvertibleType+Driver.swift */; };\n\t\tABA85887A41495358C83CE3F3030EDEA /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32EC506B43DB4AE47634A8AEE18D9E8C /* CachedResponseHandler.swift */; };\n\t\tABDF69C30364D8B9BDFDA8D82A797396 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB051CDFBF3B30AA181F5BF12F48FD3A /* ConcurrentDispatchQueueScheduler.swift */; };\n\t\tAC9540D461C3407AB049AEDB94B82375 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E50B8D09D21C042020DA82FA315C59 /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tADF86969180231C97A14929F02866A1E /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = C798C591985DFD0B008AAEEBF78EF979 /* DefaultIfEmpty.swift */; };\n\t\tAE143D6485273A676FF9FBF637EE32B3 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED0602BE820AA0F7B2D99CBFED4C1F0 /* Create.swift */; };\n\t\tAEA40BB1875D2E7B7DCB5E63E672033B /* UITableView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E7C258B34B55C44CAA679574F0B5E1 /* UITableView+Rx.swift */; };\n\t\tAECCE1EAA0757255BC4D722A53202DB0 /* GCDWebServer.h in Headers */ = {isa = PBXBuildFile; fileRef = C771BA2A255CC372CD2AB83291BD3E1C /* GCDWebServer.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tAED84FBEE9189CFC8A946DDC2BFCB2BE /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 74E6FB11E3F38127740B54FF3C72D1EF /* _RX.m */; };\n\t\tB1501E5B044C314A7E3E08D5172CE6C4 /* MASLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 46DA81F6288F2733B7F27CCDE97EA2C4 /* MASLocalization.m */; };\n\t\tB21C782362344F1FBCA4C5792EC1DED4 /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C417EB740CAC7F2602C6D8880E7737 /* PrimitiveSequence+Zip+arity.swift */; };\n\t\tB2246BF06902F6B9264919F779968CCB /* RxTableViewDataSourcePrefetchingProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15539256AFFEE061C9DE9660B995B25 /* RxTableViewDataSourcePrefetchingProxy.swift */; };\n\t\tB261ED81ABD31C88EAC460E27E453FAE /* NSTextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5800B274C19C06FB1CA12AC039704852 /* NSTextView+Rx.swift */; };\n\t\tB28F09A584B9F1BBF2EFD17B072A5CE1 /* UIStepper+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2134E06DD0F0E19694ADD2E46E9EF0 /* UIStepper+Rx.swift */; };\n\t\tB3C0F4C71E972214529455424C69E544 /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFD30F9BBDEB87F6ADD6C3AAF8DE6E30 /* GroupedObservable.swift */; };\n\t\tB3E529B0C5581EFBE667B478A97681F6 /* Pods-ShadowsocksX-NG-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D60357581333E7EC56952E31B2991366 /* Pods-ShadowsocksX-NG-dummy.m */; };\n\t\tB47372436C56EE24B909DE97D5005A64 /* GCDWebServerFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = DD31B6D267ADAB9B30F51F821C60554A /* GCDWebServerFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tB4E0DA5CB21C859040F39077A2731701 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF9FA6B1D40855A99145762147C1690 /* ImmediateSchedulerType.swift */; };\n\t\tB59F717CE3CD531818EAFE88FBB454AA /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB62C29E42A50AB4AA5C6DED19DA376D /* InfiniteSequence.swift */; };\n\t\tB6634C3C7216D0A7B063174C16BA1922 /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280A80C3BD890370005C094FC4C3DC12 /* PrimitiveSequence.swift */; };\n\t\tB7B31CEFFD225FE0DE33DA0CAAFB46BB /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636D1EE61F0E0E367F486461F8E0DF54 /* AnonymousObserver.swift */; };\n\t\tB82E2164A69C0D6D3A21B76EFF96F083 /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18636DE7B757847E9D7B9E45CA10DE2 /* SharedSequence+Operators.swift */; };\n\t\tB8B7E2AC4972978F6894F9C22936CA42 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E698A2854CB4D9E919B55523EB57D1A /* Driver.swift */; };\n\t\tB90A504C57627AFCC56F0608D321FB31 /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A94A0417121D2C31F7167E4A79EC5313 /* nl.lproj */; };\n\t\tB936FB1A1779B971BCE58D1CFB84036B /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCF992D22D15D6CF73AF4D310FEE871C /* SingleAssignmentDisposable.swift */; };\n\t\tB9C2804D9E9FD66CF22595DBFED0DC79 /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A8B6DADE1F343EA5319D5964E84B71 /* SubscribeOn.swift */; };\n\t\tBAB6CF7AB28DA0D4BCBC2CF5F53D51AE /* UIScrollView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 441E899D371A5638D8CBD0A21A8CCA61 /* UIScrollView+Rx.swift */; };\n\t\tBAC5C3D7F895C6A95B5EA70D1C4BB998 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 222E861679233A0833D6C2F8079146E7 /* DispatchQueueConfiguration.swift */; };\n\t\tBACB203DEE570915EDEC3E701158A173 /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D680C4252D37F732EE2D1BB9AB911DA /* AsMaybe.swift */; };\n\t\tBB15F798287F7447B78B4D49522030C4 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BC06E9EC97DF3F5E3AB732D978BD66B /* SwiftSupport.swift */; };\n\t\tBB322452A0B606428489BA2B2F6D3715 /* NSControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFFAAB92EFEC042FEE2F851EF9C6CC0 /* NSControl+Rx.swift */; };\n\t\tBC03F491551F314E102DEB2F96110609 /* ObservableConvertibleType+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DCF3854C69F5239CE7E89C1FCFAA51 /* ObservableConvertibleType+Signal.swift */; };\n\t\tBC184A6D6502B7B4B308496F5172E4FE /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A61E2BD71E9AE873207EFE8994362B /* SynchronizedOnType.swift */; };\n\t\tBD379AB5D6DF4FF97EF15732D9635186 /* GCDWebServerURLEncodedFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 97319F4B64360DC3D794BD7B57BC9936 /* GCDWebServerURLEncodedFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tBD386D2A7F6652D62B9E75803D3AAD3B /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BDFA1D8F5CB80DCE3773C11691B223D /* Bag.swift */; };\n\t\tBEF81EB8E8A3FB2B8519CDF1C6DEDA1E /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68D133622632E3F0C62D1F74D188EA7E /* CombineLatest+Collection.swift */; };\n\t\tBF1EB892BE3CF9CDFA0DAC7F9392435C /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E3DADB00C8898A4A01F4DF1034F96C /* GCDWebServerRequest.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tC09F690FF2734763D8D2838B0BA14B0F /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E4C0551E43C5CE2E6F3BD09C18890BFD /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC0ACE318CA3576826A53026F9C253E0B /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97E5FCD7744551B43A8C353FD79E774 /* RefCountDisposable.swift */; };\n\t\tC0E1B20534F498B9891E956388D79209 /* NSView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4028B836251B6DD18772CF35047686A /* NSView+Rx.swift */; };\n\t\tC0EA3A392A5229080E52F9FDF969FDC8 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE63CBE5D3B0C2D25184C45E1B8C885 /* Completable.swift */; };\n\t\tC1C5B050B55C15103ABC81769551A283 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D09EFC8E8E0DD0BACEB39FA20E08331 /* Response.swift */; };\n\t\tC1F1DB6A9CBDE584D09BA1613AAD4F9D /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E656BCAB89EA23EC58A161ACF0DAE68 /* Alamofire.swift */; };\n\t\tC33311F020C5777D0CB7E0F61E4FED8D /* Shortcut.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B9491CF676F85A85C4F0987D38F9051 /* Shortcut.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC341FC8944C28CCA39FB9AC4B0F23763 /* GCDWebServerHTTPStatusCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 57BEC3094A7FB642608645E131DA83D4 /* GCDWebServerHTTPStatusCodes.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC3D17F4F92CD46A4285A92D1FD6AA4B1 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B68B5F9FDDB0D41979766C1D549A8780 /* fr.lproj */; };\n\t\tC4CD2007BF8F2B0B5125A85B1C43AD24 /* ReplayRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 485A8E801F2DA21AB5D16808AE1B4887 /* ReplayRelay.swift */; };\n\t\tC60C9B7447C5D9555611004E27093043 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87A94DCCD78781BAE448DEA818B26DE4 /* SharedSequence+Operators+arity.swift */; };\n\t\tC6D5A4B4028B2C43380C9FA58BD5C8CA /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 06A09DBC68AE0A93F94442D71EBF343F /* Alamofire-dummy.m */; };\n\t\tC7A325790D6CB1C3545FE9E688545C56 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA0C023ECBE853C3AFE12E6702B6D1CD /* BooleanDisposable.swift */; };\n\t\tC81FF014587AC7E1A51D4F3F2C6F72EA /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D93775EA307729314581C5C539C487 /* ReplaySubject.swift */; };\n\t\tC83DA2E174587856EBBAAA1763F6D483 /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A33670952794CBD825EC26F1A98DBF /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC8422B20017685DE0D693EC679FF8BF6 /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F202B17AB2C7DC4FEC3F1CF2B5FD57 /* KVORepresentable.swift */; };\n\t\tCA391E5CE794FA6D964DC2DFC8B8E109 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B00813C768C553C089DAF0C1900799B /* NSObject+Rx+KVORepresentable.swift */; };\n\t\tCC9F7F2B397CCCC5397750D0B139E373 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BFF21F894144F23E9F778185A1EBC4 /* Utils.swift */; };\n\t\tCCE2D9FB50D6084FD48013ED3474F992 /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5158C591583049B150EC9F57DC2FA656 /* Optional.swift */; };\n\t\tCD782D1189ADBAA42D087B87D53838A0 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFEE31FDCAA3B9A85119C45EE5BF376 /* GCDWebServerDataRequest.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tCE622A228B2F310835326CCF0B83F031 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3623071AC720B9C13DD1043F7052A73 /* SynchronizedDisposeType.swift */; };\n\t\tCEA50BEC377AEE2AAA9DB5B71DEA418C /* BRLOptionParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 31F9576864749334961DE762B01B777C /* BRLOptionParser.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tD03F1F02DE8606E6057D57866611BEBF /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CF5ADA01C91A2DF993314D6CC9C63D3 /* MultipartUpload.swift */; };\n\t\tD0B9EA4DC98653D58DEAE9629A2F0285 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1D0AF20D0BF5465039BB88836A959B6 /* SkipUntil.swift */; };\n\t\tD0C4275AF3346D1C08B187D04D9606F2 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E801F2049749D5BA709EAE3A2028661 /* Platform.Darwin.swift */; };\n\t\tD13BDCB5C86CD4018E19F1DA207BA61A /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C793DFE7002D416E900642C76CEEBD75 /* CurrentThreadScheduler.swift */; };\n\t\tD14066FAE94E304798E43651E5886D13 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF8CD0A416163A50B72AAF4B0C4A124 /* ParameterEncoding.swift */; };\n\t\tD21D80287E6B1C56E0BE86B1E3F08249 /* Decode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D99DA86D8CBFFCB2E7FD40BC42568F3 /* Decode.swift */; };\n\t\tD251A0235B97F9217D50C5A1C7C5F311 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB5B580FE6B602D602E607C7BC7C470 /* URLSession+Rx.swift */; };\n\t\tD260B45339932BAA56D7024048E2D155 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 1410700BFA8AF785CCF9919941F9930C /* GCDWebServerConnection.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tD31FC7FDD450C4CDD633ECBAD27C6221 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A2A589A608DD00CA24C86BCD46E62 /* URLEncodedFormEncoder.swift */; };\n\t\tD33C1AD2E019F48235F734A00CE7C24C /* GCDWebServerFileResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E73C4E3CAF9AD8FAE2EA9130D6A37E /* GCDWebServerFileResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD37A995029438A503B62B1D2ACFE9247 /* MASShortcut.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 230F8208BE63C052A548A7D41A1158B2 /* MASShortcut.bundle */; };\n\t\tD557532ED179C1F26074DCD602EF357D /* cs.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 18B45BFB16E63DDF1AFB6C167D70D1C2 /* cs.lproj */; };\n\t\tD574A95C82CDFCC40442A4C5A20645D9 /* Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3E96B8BC40FDC92B51E51B50F126573 /* Single.swift */; };\n\t\tD57542063237724C1CA2962EAC1764C7 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172B845C32EEB48FD9EF1A11CC432D51 /* Sequence.swift */; };\n\t\tD597C1B3CBDE4896A022E9422A4F4874 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 555231B7293881D7D76CA80C82AABA2B /* Debug.swift */; };\n\t\tD5E020763D69E9336EB398ACD48FEBB0 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 199E49652A8B30754D25980910F956E1 /* GCDWebServerErrorResponse.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tD5EAAFB6FAD77A8F0699345149BA3CBB /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47291D90953698297410B0C37E619402 /* URLRequest+Alamofire.swift */; };\n\t\tD6389E438CF72863B7F4832592B60428 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65D8FEBF2028BCC7758A666F2A35989A /* Empty.swift */; };\n\t\tD661EA5F16B11BEE347BAE35961A3AD2 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 558A95B0EAE7FAFDFCC334A1E9277C19 /* TailRecursiveSink.swift */; };\n\t\tD9884F11DD4FAA059A45CBBBC68E090F /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25AD05D537735CCA21E1986D98F830E /* RxCollectionViewReactiveArrayDataSource.swift */; };\n\t\tDAB6B67BBE65A9ECA898A563CACF442A /* RxWKNavigationDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AC418FEB3CC60F42D6A18E6151C871A /* RxWKNavigationDelegateProxy.swift */; };\n\t\tDADE159BB4CF9E438FC5DEF80822A710 /* MASHotKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BE4993AB90D97D332E61EB54E0C3C9A /* MASHotKey.m */; };\n\t\tDBFA45EBB79E16D7B6780CDA789B0D08 /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904A920F44C4C4A18874A6A62A3ED759 /* SkipWhile.swift */; };\n\t\tDC627AFC5B585686898B014184AFCABD /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E101994FDA2210D6CD7972A656C511F /* AuthenticationInterceptor.swift */; };\n\t\tDC708FA8C70373D522CB885D4451F3D0 /* RxTabBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66D1DACD1512DCFE82BC525C443DA8A5 /* RxTabBarDelegateProxy.swift */; };\n\t\tDCC8DE3CDC74A5E38864303C8C2404EF /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8BA32B7F7B571C37D44747CBB93955 /* ObserverBase.swift */; };\n\t\tDD24A504D1BB91B71B67B4A93A92F1DA /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A126CA25C01C17FEF1E4B62108855349 /* ConcurrentMainScheduler.swift */; };\n\t\tDD7EC76A4EB8C3A1741CD5B77B57E0A4 /* UISwitch+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3622945DEBFCB14514027A236BDFC74C /* UISwitch+Rx.swift */; };\n\t\tDDA573352B48255CA674E8BB62C306C6 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE3AAA7586F734974B628C45E2310229 /* Using.swift */; };\n\t\tDE76073247081964D8DA688F13021B62 /* UISegmentedControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39E7221D0BA332CC5AC5DD0A7C16C92 /* UISegmentedControl+Rx.swift */; };\n\t\tDF3FD63D6A37C12FDB09B8CA5AE80AC3 /* GCDWebServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 10F2E7253B70490BD80C987E65C522AC /* GCDWebServerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };\n\t\tE03556E8EC8DA4FF0DE3ED6F86BD7C51 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\tE06F7DEDC12A706F1AA7067CA7D58BD8 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8369906FA14B85B8271089FAAA1E4694 /* Disposable.swift */; };\n\t\tE0AF255AB2AFA980F44645355BB7828C /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BAD385D5CDC39C1AE6584A123D2DFC4 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE1AD1FE46FE8F693F913FEC190210A59 /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4752AFB18B745CA95D95FB7457EAA1C4 /* RxCocoa-dummy.m */; };\n\t\tE26E725D6366FA3AE20B95802F54C4B6 /* WithUnretained.swift in Sources */ = {isa = PBXBuildFile; fileRef = 897003218412D0C779A54DAAD7D2A4EE /* WithUnretained.swift */; };\n\t\tE3EE570AEF6808660B0542591285D354 /* RxRelay-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1718F5B8FAF3CE57AE64B5F53589493F /* RxRelay-dummy.m */; };\n\t\tE46EB73E26A44700E41C3CD2F1E847FD /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE7CD3C7A16D2E9341BBBAB18D5D8DC /* Event.swift */; };\n\t\tE52E9DB2E0EB574ED157EB478E60D13D /* Pods-proxy_conf_helper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8752D17209EE8AAD7681107D6444113F /* Pods-proxy_conf_helper-dummy.m */; };\n\t\tE5A162C30F57D3A21BD9D74BC97E782E /* First.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543DFE92FBC6235F6826EF38928A7C08 /* First.swift */; };\n\t\tE5F1157CAB86D8C0C166874A6E826739 /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4618B5826B29CA49F53BD36B1570602 /* Materialize.swift */; };\n\t\tE5F3CF900C793B92F327E2F4BDF8A8AB /* MASLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 82A2597C8D9860F95F40565C0631A47D /* MASLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE8064C59B797763270D65097B4CD075B /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAC6355D5B0FD94083A74B4602AF9D2 /* ObservableConvertibleType+SharedSequence.swift */; };\n\t\tE816A86AE437A96B389D73C115778CFA /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9EBFDB861299F7DC1241C7FCFF00DD /* NSObject+Rx+RawRepresentable.swift */; };\n\t\tE83CDC839BC5CA753A57BE04CB66F85D /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2505B197F74151D018080608E6576C6C /* ConnectableObservableType.swift */; };\n\t\tE84DB9453D7F43DCEC20FDFB5F1CDFD6 /* RxSearchBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345AE1A0C847584A14AD381D5E476AB9 /* RxSearchBarDelegateProxy.swift */; };\n\t\tE9B95D42F4510C79E2D8A8CFA251CD49 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 55F5FEB17D952CAA64A6B7DE90D7E47D /* GCDWebServer.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tE9C69CBF2B72EC9A5031BA6FF30BC251 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 886072F083033D493924A8BE652713ED /* Generate.swift */; };\n\t\tE9FD5789C7C4946FC504E7C679BDD156 /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878F666B9410A53C5BBE1778D1B2CCE /* ControlProperty.swift */; };\n\t\tEA82A6A287EA96119DF03722AB2F25B8 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1467E6A8A0A5B978108FDFC868000E /* Just.swift */; };\n\t\tEB8C4B9D8DFF39ECFE8538B73F5717F7 /* CompactMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6415209F9685A39C6C1018082155EA5 /* CompactMap.swift */; };\n\t\tEC388029B45DC677A2412CF1617E4DF1 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF91750DCDE73B687E4BA164856BE224 /* SystemConfiguration.framework */; };\n\t\tED82861E104428E8C3FA8D1B2618C875 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FDB60114950AF3BF06EF9DA0AF9E5AC /* Producer.swift */; };\n\t\tEDC93BD7B9262119AE145E4C7A9D0212 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9029CBEE1EB8EBFDFCC3F55CEC98E088 /* Request.swift */; };\n\t\tEDD85DAC7DC88B01D5A2C20969416C9B /* BRLOptionParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 68C9C3CF6142E1B32695BC562ECAC427 /* BRLOptionParser.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tF01A39BF2122BF11990A88015EF45A48 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CD95085BFAA31431686824B236DB9319 /* Pods-ShadowsocksX-NG-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF07EC9B60B1FB76D9F64FE2BC62A87DF /* MASShortcutView+Bindings.h in Headers */ = {isa = PBXBuildFile; fileRef = B5AEEDAA3124911175E2336A08227588 /* MASShortcutView+Bindings.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF0F3224FF592F9BA2A044A2FC2BD4CCD /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 151A22449BAFE60147DA302082A00FA1 /* Validation.swift */; };\n\t\tF186B25E38062738E07F219D0289CBFA /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 684F8C697CD894D0F5680EE542AC32E9 /* ItemEvents.swift */; };\n\t\tF1A73AB066B6EC8C012F4044B542568D /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 494A67061DAFFD52534BC4699A8DF637 /* Map.swift */; };\n\t\tF1F7AF19C5D50FB5BCD1D357FB9A5946 /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E5F518C62FDAA5A762312C37D1CB101 /* Do.swift */; };\n\t\tF2AB55CF962B7EBDE26DD970C282CEDE /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B265FABD755D21851D1C166921BB4A24 /* RxTableViewReactiveArrayDataSource.swift */; };\n\t\tF44EF6685A8C029EAC293DE9FADC3794 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DA6A1DA8589C7192C8BFDBC3F4A9913 /* ControlTarget.swift */; };\n\t\tF45717BF2118BB61C328A1F67CFE9238 /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7F46244A2FF95EF2B228E2F76529358 /* Driver+Subscription.swift */; };\n\t\tF4C5E42370FEF310E72D2A8DAD2993FB /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EE873D31D9227598B067D9426D366009 /* pl.lproj */; };\n\t\tF515F0E56CBF807E49797455E495074C /* MASShortcutMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 605C26B2F1FFA16F0E85E33F5CC526EC /* MASShortcutMonitor.m */; };\n\t\tF5C3C227785D45C44F1FA8157EF99C71 /* GCDWebServerErrorResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EE8B6717B73CE07A9FAC17FFCB1BA91 /* GCDWebServerErrorResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF5E8D9EC4166B35C084791CAEFF2404C /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = A49E3489F755F888C3405824694827BF /* WithLatestFrom.swift */; };\n\t\tF621486B5084C21DA2498C0FC6A85E02 /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840A431555445FF451B4B74E7A8DDCF4 /* AnyObserver.swift */; };\n\t\tF654788A27A296CD2C1F104B4C897EF0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */; };\n\t\tF6F5712CC3ED7DD4D51BA12747FCDE6E /* MASDictionaryTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = F6460C30C5328ED85A1103897C8CB63C /* MASDictionaryTransformer.m */; };\n\t\tF70EF854395CDE981A8336E4FF0310FE /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83FE5C08C0F9F63C9A7D2B71EF9F0864 /* URLSessionConfiguration+Alamofire.swift */; };\n\t\tF71DB74D923AB8F40A88103BDC5ABFA6 /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B33DD3F11E0587A32ECE709173E4EF /* RxTextStorageDelegateProxy.swift */; };\n\t\tF7DAD2EF3F86BC40F7D4F2EE49362418 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE48A7C993FBD43A674E228A900457B /* GCDWebServerStreamedResponse.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0\"; }; };\n\t\tF89A75BE493264635F9977B0A9233617 /* ObservableConvertibleType+Infallible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 834EB5666F2D27EDBD25C600C80DF7CE /* ObservableConvertibleType+Infallible.swift */; };\n\t\tF8C1D484E959F9ADD96E9CD2F3B045B0 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8976DA3C1E5870E7B74F26E219A9885 /* Observable+Bind.swift */; };\n\t\tF8EC0962127455A9E5ABEA1B2D0C91D7 /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89A41E2A66DF6A8547AFAB72FE74B6A2 /* UIActivityIndicatorView+Rx.swift */; };\n\t\tF9872C7244CA7C80D5E402B3922DB009 /* SchedulerType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53EB3CB0FCC5ABA4F18B576E6BA4EB1F /* SchedulerType+SharedSequence.swift */; };\n\t\tF9C743AF2433172C84F9365D8DE8CBF3 /* MASShortcutValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 726DEA3A84065F8E12FDE5617447B366 /* MASShortcutValidator.m */; };\n\t\tFA547DB169BA1CB0759702BA51F1C52E /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAFB048690381EFB0893639F33D3C764 /* SubscriptionDisposable.swift */; };\n\t\tFAEF22DB65A2C18EAF044623FF4ECA43 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2B10B3F59B2394712B672A72C5827F0 /* SingleAsync.swift */; };\n\t\tFB3AD79C536DC201CED66150778FA691 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFD92A4EF88D0A6B34E86A6A7CE2436D /* RxSwift.framework */; };\n\t\tFB425C8625656D7AE2AFD1F8A78713B0 /* MASShortcutBinder.m in Sources */ = {isa = PBXBuildFile; fileRef = 46002374E8C8C6F2127C7C9A6DFEF743 /* MASShortcutBinder.m */; };\n\t\tFC22B1E68007E6AC40CC8DF2DF5E0AB6 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA0DBB3C5358A6E4EF0C16145BB0F7E /* Zip.swift */; };\n\t\tFCBF7F9DA53A194F0653EE7E00B57BC8 /* GCDWebServerMultiPartFormRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = D157799A728D6FFED669C62E86BABD73 /* GCDWebServerMultiPartFormRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tFD397CD62192F67DF9C2088CC5EBE409 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38724BD70D1712C03FA9B7A4C417144D /* ControlEvent.swift */; };\n\t\tFDEBCA25E0674ADFB66FA6256FF6486F /* RxCollectionViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5BD2C8DB205D16490D3804A6CAB6C50 /* RxCollectionViewDataSourceProxy.swift */; };\n\t\tFF36522388E5964B78AD72A59721AADC /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8F90CD66F125C28F8983AFCFA7DF6607 /* de.lproj */; };\n\t\tFFF63A18CD673B6821ED19EB164316C9 /* Signal+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12318B6E6BA8040BCC422023A5ABEF27 /* Signal+Subscription.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1CA90026A2A030CD980CB1E78050B63A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4622BFEF3DC16E8BD15EEFC30D4D0084;\n\t\t\tremoteInfo = RxRelay;\n\t\t};\n\t\t290D7A27821274F88F50BA4027E877B0 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 00F92A6698B766C4479D7B608F28D680;\n\t\t\tremoteInfo = BRLOptionParser;\n\t\t};\n\t\t3A3C6F9E9E958812D1FF93C9737FE5B1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EA9EA43B3B503823EE36C60D9C8A865F;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t3DE69038DEBF7AC72F345377CCA1A457 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 73C37A16ECCEAD845651DCDEE95675BE;\n\t\t\tremoteInfo = \"MASShortcut-MASShortcut\";\n\t\t};\n\t\t6C21C08D1A9E4A42298C1E83946EFBF6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EAAA1AD3A8A1B59AB91319EE40752C6D;\n\t\t\tremoteInfo = Alamofire;\n\t\t};\n\t\t7569E9B350638EBD714C781E38F158A8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = E9FDECF69808DB0491D4B4C08CF920DC;\n\t\t\tremoteInfo = \"Pods-ShadowsocksX-NG\";\n\t\t};\n\t\t809667767BFFB7D46B762AD5F006A069 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EA9EA43B3B503823EE36C60D9C8A865F;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t93C581FCCE9BCA693063DEB0CB18943C /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4622BFEF3DC16E8BD15EEFC30D4D0084;\n\t\t\tremoteInfo = RxRelay;\n\t\t};\n\t\t95ED7E1E76F66FF2AFA473A3D49F574E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EA9EA43B3B503823EE36C60D9C8A865F;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\tA5DE8E8EE1A9A5D27FEA05AD1FF38C1E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7AD0C6DCDC9CEC8A3C7C10C7FEE07BE6;\n\t\t\tremoteInfo = RxCocoa;\n\t\t};\n\t\tB0B5FA86CABF29A7785405416D374CDA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2B2B481A164695722839BD581D442457;\n\t\t\tremoteInfo = MASShortcut;\n\t\t};\n\t\tE627335D42AC0ADFBA7B40BFD314B204 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = AD904F32069787EFB2DFFE05EB82F5BD;\n\t\t\tremoteInfo = GCDWebServer;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t04A3FEA575D65278CDB553AA231A0CF6 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = \"<group>\"; };\n\t\t0555618E1BBA944D30E358F0700CDD8B /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFunctions.m; path = GCDWebServer/Core/GCDWebServerFunctions.m; sourceTree = \"<group>\"; };\n\t\t06A09DBC68AE0A93F94442D71EBF343F /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Alamofire-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t07B4CEF97C27B2FE6205EE1D720BFB39 /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = \"<group>\"; };\n\t\t080201197B517655700BD33F44B1A602 /* Dematerialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dematerialize.swift; path = RxSwift/Observables/Dematerialize.swift; sourceTree = \"<group>\"; };\n\t\t09A0680C8640FDF225CF2A27A4204628 /* GCDWebServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"GCDWebServer-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t0A18EEA4857408358F9A8E6ED8AF8829 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Observable+Bind.swift\"; path = \"RxRelay/Observable+Bind.swift\"; sourceTree = \"<group>\"; };\n\t\t0B98DA4C08DC1A12B2789714C6CDEFFA /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = \"<group>\"; };\n\t\t0BC06E9EC97DF3F5E3AB732D978BD66B /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = RxSwift/SwiftSupport/SwiftSupport.swift; sourceTree = \"<group>\"; };\n\t\t0C0FB7A81FC88101C56EABF826BD78F5 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = \"<group>\"; };\n\t\t0C1C25377D5ADEBBE1E5B44FD42F2BF8 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerMultiPartFormRequest.m; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.m; sourceTree = \"<group>\"; };\n\t\t0CB05B6D60934D955FE0D75C2339A114 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Amb.swift; sourceTree = \"<group>\"; };\n\t\t0D09EFC8E8E0DD0BACEB39FA20E08331 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = \"<group>\"; };\n\t\t0E5F518C62FDAA5A762312C37D1CB101 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = \"<group>\"; };\n\t\t0F2EB184269284B56190B6EE5A7E5CC3 /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = \"<group>\"; };\n\t\t10E99E50E2994DB7AD9AEBDEF1A2F72B /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Alamofire-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t10F2E7253B70490BD80C987E65C522AC /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerPrivate.h; path = GCDWebServer/Core/GCDWebServerPrivate.h; sourceTree = \"<group>\"; };\n\t\t111E9F3F4997D0ACA2E0BCDAF269904C /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = \"<group>\"; };\n\t\t11DD125BCF1FDD4E34715800EC2F295F /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = \"<group>\"; };\n\t\t11F97CBA2FD3653262BC227DD1340D90 /* Pods-proxy_conf_helper-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-proxy_conf_helper-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t12318B6E6BA8040BCC422023A5ABEF27 /* Signal+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Signal+Subscription.swift\"; path = \"RxCocoa/Traits/Signal/Signal+Subscription.swift\"; sourceTree = \"<group>\"; };\n\t\t127B3965CEBAEBFB395F0D10B7C255FB /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Throttle.swift; sourceTree = \"<group>\"; };\n\t\t1389D4639C0D9038BA081FA8DC1CD646 /* BRLOptionParser-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"BRLOptionParser-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t1410700BFA8AF785CCF9919941F9930C /* GCDWebServerConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerConnection.m; path = GCDWebServer/Core/GCDWebServerConnection.m; sourceTree = \"<group>\"; };\n\t\t151A22449BAFE60147DA302082A00FA1 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = \"<group>\"; };\n\t\t161437331F54761E08F028DD14CDC21E /* Infallible+Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Infallible+Create.swift\"; path = \"RxSwift/Traits/Infallible/Infallible+Create.swift\"; sourceTree = \"<group>\"; };\n\t\t1718F5B8FAF3CE57AE64B5F53589493F /* RxRelay-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxRelay-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t172B845C32EEB48FD9EF1A11CC432D51 /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Sequence.swift; sourceTree = \"<group>\"; };\n\t\t17A8B6DADE1F343EA5319D5964E84B71 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/SubscribeOn.swift; sourceTree = \"<group>\"; };\n\t\t17F9F190DDBE93E38A56D8405CBFA664 /* UIButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIButton+Rx.swift\"; path = \"RxCocoa/iOS/UIButton+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t18B45BFB16E63DDF1AFB6C167D70D1C2 /* cs.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = cs.lproj; path = Resources/cs.lproj; sourceTree = \"<group>\"; };\n\t\t196DA983244F60766BA272090829A16E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-ShadowsocksX-NGTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t199E49652A8B30754D25980910F956E1 /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerErrorResponse.m; path = GCDWebServer/Responses/GCDWebServerErrorResponse.m; sourceTree = \"<group>\"; };\n\t\t19AA7CC35C97B4BDF08E2E5CE20955E0 /* AlamofireExtended.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AlamofireExtended.swift; path = Source/AlamofireExtended.swift; sourceTree = \"<group>\"; };\n\t\t19FF8B675AE7A3F0AB7CDE7C48E8082A /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = \"<group>\"; };\n\t\t1A2C716EE769E98BF094D14B243A42C2 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Alamofire-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t1AA3BEB86C50C2AAE9CCEDB0171CFC56 /* ObservableType+PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableType+PrimitiveSequence.swift\"; path = \"RxSwift/Traits/PrimitiveSequence/ObservableType+PrimitiveSequence.swift\"; sourceTree = \"<group>\"; };\n\t\t1B2134E06DD0F0E19694ADD2E46E9EF0 /* UIStepper+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIStepper+Rx.swift\"; path = \"RxCocoa/iOS/UIStepper+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t1C10AA3C311345DB3616BCE827B69C55 /* Pods-ShadowsocksX-NGTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-ShadowsocksX-NGTests-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t1CD2535A24AA927A5965AF73264678A3 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Catch.swift; sourceTree = \"<group>\"; };\n\t\t1DBE368EA1C6F7EBE80E08054C9BC6AE /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = \"<group>\"; };\n\t\t1EA29F7E0E65B6A9619DB77448844EC1 /* Pods-ShadowsocksX-NG.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-ShadowsocksX-NG.modulemap\"; sourceTree = \"<group>\"; };\n\t\t1EB8536183BE6472CDCC5817172688EF /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = \"<group>\"; };\n\t\t1FA62A0165A7A8D001536C62FD5E2392 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = \"<group>\"; };\n\t\t200825C8579BF340304A9767D679EC35 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = \"<group>\"; };\n\t\t2094BFBE78A2839B3C673A3E450C77FC /* GCDWebServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.release.xcconfig; sourceTree = \"<group>\"; };\n\t\t2096522151041770121528F182B6F42D /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Range.swift; sourceTree = \"<group>\"; };\n\t\t21F927D22EA76A49C54C44827DD1CE5A /* UITabBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITabBar+Rx.swift\"; path = \"RxCocoa/iOS/UITabBar+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t222E861679233A0833D6C2F8079146E7 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = \"<group>\"; };\n\t\t22ADD736785A6DE33628551E25AC889A /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-ShadowsocksX-NGTests-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t22D41ECF1E34CC3D83A32F7896831100 /* RxPickerViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t230F8208BE63C052A548A7D41A1158B2 /* MASShortcut.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MASShortcut.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t24121C8FA3C10947BE50901868F9198A /* MASShortcutMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutMonitor.h; path = Framework/Monitoring/MASShortcutMonitor.h; sourceTree = \"<group>\"; };\n\t\t2505B197F74151D018080608E6576C6C /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = \"<group>\"; };\n\t\t2586C5A6499D4E9A6B62C1CF5804DE66 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = \"<group>\"; };\n\t\t26A8810424438A12E7ADBFB3E068C658 /* MASShortcut.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MASShortcut.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t26DA8062B81F764A6EEA6168DF6337AB /* OperationQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"OperationQueue+Alamofire.swift\"; path = \"Source/OperationQueue+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\t273C90965AA81CCFE4CDA40530425746 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = \"<group>\"; };\n\t\t280A80C3BD890370005C094FC4C3DC12 /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift; sourceTree = \"<group>\"; };\n\t\t2888FA81FD2BE4D3B068BCE4AFDC9A93 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISearchBar+Rx.swift\"; path = \"RxCocoa/iOS/UISearchBar+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t28F6CED61832E1CE6BA74AA90F7E45EE /* RxSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.release.xcconfig; sourceTree = \"<group>\"; };\n\t\t29BFF21F894144F23E9F778185A1EBC4 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = RxRelay/Utils.swift; sourceTree = \"<group>\"; };\n\t\t29E3014CE53E3127CCD38149E2060C76 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Extensions.swift\"; path = \"Platform/DispatchQueue+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t2A11F032AFA3310A3EEE63E67481B01E /* Pods-ShadowsocksX-NG-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-ShadowsocksX-NG-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t2AE63CBE5D3B0C2D25184C45E1B8C885 /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Completable.swift; path = RxSwift/Traits/PrimitiveSequence/Completable.swift; sourceTree = \"<group>\"; };\n\t\t2BDFA1D8F5CB80DCE3773C11691B223D /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = \"<group>\"; };\n\t\t2C81F8C45A4C248E266304541A86B5A8 /* NSTextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSTextField+Rx.swift\"; path = \"RxCocoa/macOS/NSTextField+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t2CFE9D0E45288EBBAF865D7685C2B983 /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-ShadowsocksX-NGTests-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t2DDC82F5641636881356BF49166C8DF3 /* RxRelay-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxRelay-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t2E101994FDA2210D6CD7972A656C511F /* AuthenticationInterceptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AuthenticationInterceptor.swift; path = Source/AuthenticationInterceptor.swift; sourceTree = \"<group>\"; };\n\t\t2E656BCAB89EA23EC58A161ACF0DAE68 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = \"<group>\"; };\n\t\t2F138B6C28378A801D2186B22E1E6224 /* RxCocoa.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t2FEFD09344E88FFE590FC0A7146C0D32 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = \"<group>\"; };\n\t\t30E50B8D09D21C042020DA82FA315C59 /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = \"<group>\"; };\n\t\t31234D4C5E912BD05D37874E7E89A233 /* Enumerated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Enumerated.swift; path = RxSwift/Observables/Enumerated.swift; sourceTree = \"<group>\"; };\n\t\t314A2DB247EA6781CE45C5C146496327 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/ToArray.swift; sourceTree = \"<group>\"; };\n\t\t31F9576864749334961DE762B01B777C /* BRLOptionParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BRLOptionParser.h; path = BRLOptionParser/BRLOptionParser.h; sourceTree = \"<group>\"; };\n\t\t321FC2ED515952B66BACDB8CAC130EB4 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = it.lproj; path = Resources/it.lproj; sourceTree = \"<group>\"; };\n\t\t32777B9FE68F64D911474F7B7595C94C /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Scan.swift; sourceTree = \"<group>\"; };\n\t\t32EC506B43DB4AE47634A8AEE18D9E8C /* CachedResponseHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedResponseHandler.swift; path = Source/CachedResponseHandler.swift; sourceTree = \"<group>\"; };\n\t\t336A70440B171C2C6AEE66F83620273A /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Alamofire.modulemap; sourceTree = \"<group>\"; };\n\t\t33BBD4B03778E41A59C1A3F64AAB876C /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Deferred.swift; sourceTree = \"<group>\"; };\n\t\t3425B3045259FEA3A238D183DEEE520B /* HTTPHeaders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPHeaders.swift; path = Source/HTTPHeaders.swift; sourceTree = \"<group>\"; };\n\t\t345AE1A0C847584A14AD381D5E476AB9 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t353B178196A1B3A383089B3D1006F66A /* MASDictionaryTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASDictionaryTransformer.h; path = \"Framework/User Defaults Storage/MASDictionaryTransformer.h\"; sourceTree = \"<group>\"; };\n\t\t3622945DEBFCB14514027A236BDFC74C /* UISwitch+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISwitch+Rx.swift\"; path = \"RxCocoa/iOS/UISwitch+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t3677CB82C594C5820F17431AA45C5C87 /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Zip+Collection.swift\"; path = \"RxSwift/Observables/Zip+Collection.swift\"; sourceTree = \"<group>\"; };\n\t\t3685B6DE4DF41097400DA11AA41A500B /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxSwift-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t36C45F96BE0AE01F3BB2C90370A73616 /* Infallible+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Infallible+Bind.swift\"; path = \"RxCocoa/Common/Infallible+Bind.swift\"; sourceTree = \"<group>\"; };\n\t\t36E9C273C636D7A0C559787BD1FABA68 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataRequest.h; path = GCDWebServer/Requests/GCDWebServerDataRequest.h; sourceTree = \"<group>\"; };\n\t\t370A313E34AF66CB8D7437ABDC3FB7F8 /* Infallible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Infallible.swift; path = RxSwift/Traits/Infallible/Infallible.swift; sourceTree = \"<group>\"; };\n\t\t38724BD70D1712C03FA9B7A4C417144D /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Traits/ControlEvent.swift; sourceTree = \"<group>\"; };\n\t\t38A0B431980745BE7A67D566D79E240A /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = \"<group>\"; };\n\t\t38A6B331CD11EA3ADC9BE7CFD5DE99DA /* RxRelay.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RxRelay.modulemap; sourceTree = \"<group>\"; };\n\t\t392538EA12C4E3008D6EF1ABB226B3BF /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileRequest.m; path = GCDWebServer/Requests/GCDWebServerFileRequest.m; sourceTree = \"<group>\"; };\n\t\t3949A4BE0C4C31915E5A812146DB23B9 /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/DistinctUntilChanged.swift; sourceTree = \"<group>\"; };\n\t\t39D9FF9E1CBB62DA6FC1910AA45EB039 /* RxTabBarControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t3AC418FEB3CC60F42D6A18E6151C871A /* RxWKNavigationDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxWKNavigationDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxWKNavigationDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t3B85D80911EDFC7DD402EBEB3A05169A /* RetryPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryPolicy.swift; path = Source/RetryPolicy.swift; sourceTree = \"<group>\"; };\n\t\t3BAD385D5CDC39C1AE6584A123D2DFC4 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = \"<group>\"; };\n\t\t3BE91EC45C71C190D532DC351F5E724D /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = \"<group>\"; };\n\t\t3ED0602BE820AA0F7B2D99CBFED4C1F0 /* Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Create.swift; path = RxSwift/Observables/Create.swift; sourceTree = \"<group>\"; };\n\t\t403ABCCF5634DCD99A376EAA601F828E /* HTTPMethod.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPMethod.swift; path = Source/HTTPMethod.swift; sourceTree = \"<group>\"; };\n\t\t40573DCBFB24CA15F7D6C33B5C73162F /* Infallible+CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Infallible+CombineLatest+arity.swift\"; path = \"RxSwift/Traits/Infallible/Infallible+CombineLatest+arity.swift\"; sourceTree = \"<group>\"; };\n\t\t408AEB2CFB972D5D82E41BB027E6686C /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\t40FC23633FFFBBD0FA165FB284958F8C /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = \"<group>\"; };\n\t\t41ADA85A38ECDBBD122B707DA599E641 /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Alamofire.swift\"; path = \"Source/DispatchQueue+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\t4338C646A92E1539E9BED963FC618602 /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = \"<group>\"; };\n\t\t43D1B54DDFE366EA8E657D1CFA2A5349 /* Protected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Protected.swift; path = Source/Protected.swift; sourceTree = \"<group>\"; };\n\t\t4412635C50524157DDF38FA0CB197F4A /* Binder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Binder.swift; path = RxSwift/Binder.swift; sourceTree = \"<group>\"; };\n\t\t441E899D371A5638D8CBD0A21A8CCA61 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIScrollView+Rx.swift\"; path = \"RxCocoa/iOS/UIScrollView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t44775F4816D20EB134F1DBAB43BE0B3A /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Filter.swift; sourceTree = \"<group>\"; };\n\t\t44D9E4509154BFFEBEA9AEA0C935EC9E /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = \"<group>\"; };\n\t\t4504CA755CE81F89F9F165BF93126D21 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = es.lproj; path = Resources/es.lproj; sourceTree = \"<group>\"; };\n\t\t45BF55923F2D3657D9D5420E606B641F /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Repeat.swift; sourceTree = \"<group>\"; };\n\t\t46002374E8C8C6F2127C7C9A6DFEF743 /* MASShortcutBinder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutBinder.m; path = \"Framework/User Defaults Storage/MASShortcutBinder.m\"; sourceTree = \"<group>\"; };\n\t\t4618A8C418D70264404BBAF10EE3A1F4 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = \"<group>\"; };\n\t\t466B399C2E7FFAA61B709F2AB447ECDF /* UISlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISlider+Rx.swift\"; path = \"RxCocoa/iOS/UISlider+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t4673D1BC54F57F490E2D3352F6BA1B73 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = \"<group>\"; };\n\t\t46A83A815027A06FB7A8AB2CEDF56368 /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIDatePicker+Rx.swift\"; path = \"RxCocoa/iOS/UIDatePicker+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t46DA81F6288F2733B7F27CCDE97EA2C4 /* MASLocalization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLocalization.m; path = Framework/UI/MASLocalization.m; sourceTree = \"<group>\"; };\n\t\t47291D90953698297410B0C37E619402 /* URLRequest+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLRequest+Alamofire.swift\"; path = \"Source/URLRequest+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\t474547C10494F37402A98A0BFC7E6288 /* RxSearchControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t4752AFB18B745CA95D95FB7457EAA1C4 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxCocoa-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t4764F518EAB30C5EA82C03A5607ED7AF /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = \"<group>\"; };\n\t\t47EB7F9271D4EAE5B4A31D5D0194BECC /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/GroupBy.swift; sourceTree = \"<group>\"; };\n\t\t485A8E801F2DA21AB5D16808AE1B4887 /* ReplayRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplayRelay.swift; path = RxRelay/ReplayRelay.swift; sourceTree = \"<group>\"; };\n\t\t48CB9D3553F121F84DBB750A8FBE0F3D /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = \"<group>\"; };\n\t\t4946CBDE2CD13F181402416264EBF61D /* RxSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"RxSwift-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t494A67061DAFFD52534BC4699A8DF637 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Map.swift; sourceTree = \"<group>\"; };\n\t\t494FD3BF9675BD2ADCE4731FED65B5FF /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/AddRef.swift; sourceTree = \"<group>\"; };\n\t\t4A70BE8C07BCE9C6D6F47AC73225C959 /* Pods-proxy_conf_helper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-proxy_conf_helper.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t4A797B2A249C56CB61DB60A3FEA31FD2 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = Resources/en.lproj; sourceTree = \"<group>\"; };\n\t\t4C0E4BDE3E30AF8C9062AFAD9C3AEA28 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ControlEvent+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ControlEvent+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\t4C9EBFDB861299F7DC1241C7FCFF00DD /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx+RawRepresentable.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift\"; sourceTree = \"<group>\"; };\n\t\t4E0CDE6403F2AF9E108FF190F90FA9FF /* EventMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EventMonitor.swift; path = Source/EventMonitor.swift; sourceTree = \"<group>\"; };\n\t\t4F401550E51DCC5F5746B99EC564065B /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = \"<group>\"; };\n\t\t4FDB60114950AF3BF06EF9DA0AF9E5AC /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Producer.swift; sourceTree = \"<group>\"; };\n\t\t4FF704B43D944C2399606B76A430F1A6 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = \"<group>\"; };\n\t\t506B13C445D67D7231C25641361EE5A1 /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIRefreshControl+Rx.swift\"; path = \"RxCocoa/iOS/UIRefreshControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t5158C591583049B150EC9F57DC2FA656 /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Optional.swift; sourceTree = \"<group>\"; };\n\t\t51E7C258B34B55C44CAA679574F0B5E1 /* UITableView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITableView+Rx.swift\"; path = \"RxCocoa/iOS/UITableView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t5219820998BC7D8238F0F05F90A3D96F /* Maybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Maybe.swift; path = RxSwift/Traits/PrimitiveSequence/Maybe.swift; sourceTree = \"<group>\"; };\n\t\t52626495FA7375A2A4753E3EC16FB26C /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = \"<group>\"; };\n\t\t52786C2AA26607ED32FA242D407DEC3D /* RxRelay-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"RxRelay-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t52DFCC55A239674DEF17871D293D227C /* RxNavigationControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxNavigationControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxNavigationControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t530CEAEC9F4BC5F2EC9C9534779927A3 /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = \"<group>\"; };\n\t\t531091EE9FF408558B83A1E053360F67 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t53EB3CB0FCC5ABA4F18B576E6BA4EB1F /* SchedulerType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SchedulerType+SharedSequence.swift\"; path = \"RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift\"; sourceTree = \"<group>\"; };\n\t\t543DFE92FBC6235F6826EF38928A7C08 /* First.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = First.swift; path = RxSwift/Observables/First.swift; sourceTree = \"<group>\"; };\n\t\t54F202B17AB2C7DC4FEC3F1CF2B5FD57 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = \"<group>\"; };\n\t\t555231B7293881D7D76CA80C82AABA2B /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = \"<group>\"; };\n\t\t5554F4E6979C7DDD1E00F81CB94D474D /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = \"<group>\"; };\n\t\t558A95B0EAE7FAFDFCC334A1E9277C19 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = \"<group>\"; };\n\t\t55F5FEB17D952CAA64A6B7DE90D7E47D /* GCDWebServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServer.m; path = GCDWebServer/Core/GCDWebServer.m; sourceTree = \"<group>\"; };\n\t\t57BEC3094A7FB642608645E131DA83D4 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerHTTPStatusCodes.h; path = GCDWebServer/Core/GCDWebServerHTTPStatusCodes.h; sourceTree = \"<group>\"; };\n\t\t5800B274C19C06FB1CA12AC039704852 /* NSTextView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSTextView+Rx.swift\"; path = \"RxCocoa/macOS/NSTextView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t5874107EF4581DA493B60BBCFE422D1C /* NSSlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSSlider+Rx.swift\"; path = \"RxCocoa/macOS/NSSlider+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t5878F666B9410A53C5BBE1778D1B2CCE /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Traits/ControlProperty.swift; sourceTree = \"<group>\"; };\n\t\t5BC543740C092C697A08396093A0F7BD /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerFileResponse.m; path = GCDWebServer/Responses/GCDWebServerFileResponse.m; sourceTree = \"<group>\"; };\n\t\t5C0C485AB4EA81F3E9128F65E9AC66CA /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-ShadowsocksX-NGTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5CA0D236EFCE9E4E77F9A2B2A0AF3FC4 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Merge.swift; sourceTree = \"<group>\"; };\n\t\t5CE7CD3C7A16D2E9341BBBAB18D5D8DC /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = \"<group>\"; };\n\t\t5D0A2A589A608DD00CA24C86BCD46E62 /* URLEncodedFormEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLEncodedFormEncoder.swift; path = Source/URLEncodedFormEncoder.swift; sourceTree = \"<group>\"; };\n\t\t5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5D99DA86D8CBFFCB2E7FD40BC42568F3 /* Decode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Decode.swift; path = RxSwift/Observables/Decode.swift; sourceTree = \"<group>\"; };\n\t\t5DA6A1DA8589C7192C8BFDBC3F4A9913 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = \"<group>\"; };\n\t\t5E698A2854CB4D9E919B55523EB57D1A /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = \"<group>\"; };\n\t\t5EE446AD8C625612BFF0E37E4419E0FD /* BRLOptionParser.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t605C26B2F1FFA16F0E85E33F5CC526EC /* MASShortcutMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutMonitor.m; path = Framework/Monitoring/MASShortcutMonitor.m; sourceTree = \"<group>\"; };\n\t\t608BE9EFB078FCC2348EF2782C265D92 /* UIPickerView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIPickerView+Rx.swift\"; path = \"RxCocoa/iOS/UIPickerView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t61C23DB60A84900CD4BDA2F5EE2A0865 /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-proxy_conf_helper.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t62F5D09616527A0713F24DF416BEC64F /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = DEVELOPER_DIR; };\n\t\t6327835932D3C270A640C0C76A860EB8 /* TakeWithPredicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWithPredicate.swift; path = RxSwift/Observables/TakeWithPredicate.swift; sourceTree = \"<group>\"; };\n\t\t636937DE6DA6CE01D7E94282A16BC9D9 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = \"<group>\"; };\n\t\t636D1EE61F0E0E367F486461F8E0DF54 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = \"<group>\"; };\n\t\t638797412ABBF2F7725016AF4B056309 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = \"<group>\"; };\n\t\t65D8FEBF2028BCC7758A666F2A35989A /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Empty.swift; sourceTree = \"<group>\"; };\n\t\t661DD8158386E15481E17DE6E2FA1882 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = \"<group>\"; };\n\t\t66C7F789300668AEDFA53AEA1392C48B /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Concat.swift; sourceTree = \"<group>\"; };\n\t\t66D1DACD1512DCFE82BC525C443DA8A5 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t683395CCE980D15405934DC5E2BCD682 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = \"<group>\"; };\n\t\t684F8C697CD894D0F5680EE542AC32E9 /* ItemEvents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ItemEvents.swift; path = RxCocoa/iOS/Events/ItemEvents.swift; sourceTree = \"<group>\"; };\n\t\t68C9C3CF6142E1B32695BC562ECAC427 /* BRLOptionParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BRLOptionParser.m; path = BRLOptionParser/BRLOptionParser.m; sourceTree = \"<group>\"; };\n\t\t68D133622632E3F0C62D1F74D188EA7E /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"CombineLatest+Collection.swift\"; path = \"RxSwift/Observables/CombineLatest+Collection.swift\"; sourceTree = \"<group>\"; };\n\t\t6985BD62945B0A86382437BC1758C282 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = \"<group>\"; };\n\t\t6A2828DE92C9CEECE9FB19F2EE763305 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = \"<group>\"; };\n\t\t6AD4414199F479D544CBF1FFF3FB45E4 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = \"<group>\"; };\n\t\t6B37E46EBF28CB6542B58754F09D8AAA /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = \"<group>\"; };\n\t\t6B668707F7C66384A3BB8BC4FE3F41E6 /* MASShortcut-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"MASShortcut-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t6B9491CF676F85A85C4F0987D38F9051 /* Shortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Shortcut.h; path = Framework/Shortcut.h; sourceTree = \"<group>\"; };\n\t\t6D0B40D5A184825074ECC549693CAF02 /* GCDWebServerConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerConnection.h; path = GCDWebServer/Core/GCDWebServerConnection.h; sourceTree = \"<group>\"; };\n\t\t6D742A8B753D54115AD3C6D293B64276 /* UINavigationController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UINavigationController+Rx.swift\"; path = \"RxCocoa/iOS/UINavigationController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t6D8A09F0F8EDB0B1A568AA29A33D62EA /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = \"<group>\"; };\n\t\t6DA5F27AAEF9B366933CB017942EFAA8 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = \"<group>\"; };\n\t\t6DAFFC9484B606CC3A8583B2085B7957 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = \"<group>\"; };\n\t\t6DFC3F4E49698472F1AA8DE21B1BD0F2 /* NSButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSButton+Rx.swift\"; path = \"RxCocoa/macOS/NSButton+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t6EB5DBBABE4FD6FFF0223AC1BC4674DB /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"KVORepresentable+Swift.swift\"; path = \"RxCocoa/Foundation/KVORepresentable+Swift.swift\"; sourceTree = \"<group>\"; };\n\t\t70C291AA3C3CEE619534F472C4F04882 /* MASShortcut.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t718741562429DAE6AA6DC455ED6883D4 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = \"<group>\"; };\n\t\t726DEA3A84065F8E12FDE5617447B366 /* MASShortcutValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutValidator.m; path = Framework/Model/MASShortcutValidator.m; sourceTree = \"<group>\"; };\n\t\t72A57876EDEB24ADDFE06DD482CE250C /* Pods-ShadowsocksX-NGTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-ShadowsocksX-NGTests-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t72D91E08E6C75E1F0DBACD4FF3CA2F55 /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = \"<group>\"; };\n\t\t73118DDBDD8A625213B479BD40C4B9CE /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/TakeLast.swift; sourceTree = \"<group>\"; };\n\t\t73327356D8055C270C5AFBAEE0D202DD /* MASKeyCodes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/Model/MASKeyCodes.h; sourceTree = \"<group>\"; };\n\t\t74656C1BF53AED56A45CDA8600A787D1 /* Pods-proxy_conf_helper-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-proxy_conf_helper-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t74E6FB11E3F38127740B54FF3C72D1EF /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = \"<group>\"; };\n\t\t758B67811993E4C5163D7637EDBB6CFD /* PublishRelay+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"PublishRelay+Signal.swift\"; path = \"RxCocoa/Traits/Signal/PublishRelay+Signal.swift\"; sourceTree = \"<group>\"; };\n\t\t75EA425CE2A4DBDDEB580C7303DD2454 /* Alamofire.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t7720FEFA630547FDE17C156840E36CC6 /* MASShortcut-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"MASShortcut-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t77B5C856C653A9586105526C4341767A /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxSwift-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t77E73C4E3CAF9AD8FAE2EA9130D6A37E /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileResponse.h; path = GCDWebServer/Responses/GCDWebServerFileResponse.h; sourceTree = \"<group>\"; };\n\t\t78275DA82CA025902C1D6FAF39BC9403 /* RxCollectionViewDataSourcePrefetchingProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourcePrefetchingProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDataSourcePrefetchingProxy.swift; sourceTree = \"<group>\"; };\n\t\t7A4A724DBFF9C1C260A76A4B104F3B1E /* MASShortcut.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcut.m; path = Framework/Model/MASShortcut.m; sourceTree = \"<group>\"; };\n\t\t7B00813C768C553C089DAF0C1900799B /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx+KVORepresentable.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift\"; sourceTree = \"<group>\"; };\n\t\t7B00E954AA2FCFDF5ACDEC8CD8C6941E /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = \"<group>\"; };\n\t\t7B58732AA1AF7EA39B29A8BE85721F26 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxScrollViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t7BE4993AB90D97D332E61EB54E0C3C9A /* MASHotKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASHotKey.m; path = Framework/Monitoring/MASHotKey.m; sourceTree = \"<group>\"; };\n\t\t7C471325C18D493A8244DEB1563B18B6 /* MASShortcutView+Bindings.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"MASShortcutView+Bindings.m\"; path = \"Framework/UI/MASShortcutView+Bindings.m\"; sourceTree = \"<group>\"; };\n\t\t7C73921B2C710D3814A33EF328D04D20 /* MASShortcutView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASShortcutView.m; path = Framework/UI/MASShortcutView.m; sourceTree = \"<group>\"; };\n\t\t7D680C4252D37F732EE2D1BB9AB911DA /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/AsMaybe.swift; sourceTree = \"<group>\"; };\n\t\t7DF9FA6B1D40855A99145762147C1690 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = \"<group>\"; };\n\t\t7DFEE31FDCAA3B9A85119C45EE5BF376 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataRequest.m; path = GCDWebServer/Requests/GCDWebServerDataRequest.m; sourceTree = \"<group>\"; };\n\t\t7EB9FE74C8220E21EC9A5A77098E9152 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = \"<group>\"; };\n\t\t809C5FAB588354C9BA37DC3EAB8CB45C /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t80B5C55F7279E38D15E19E9DEDDEDE7B /* RequestInterceptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestInterceptor.swift; path = Source/RequestInterceptor.swift; sourceTree = \"<group>\"; };\n\t\t817D9055D7659CAC86800D119F65E0F4 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };\n\t\t82A2597C8D9860F95F40565C0631A47D /* MASLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLocalization.h; path = Framework/UI/MASLocalization.h; sourceTree = \"<group>\"; };\n\t\t834EB5666F2D27EDBD25C600C80DF7CE /* ObservableConvertibleType+Infallible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+Infallible.swift\"; path = \"RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift\"; sourceTree = \"<group>\"; };\n\t\t8369906FA14B85B8271089FAAA1E4694 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = \"<group>\"; };\n\t\t83899FE1EDE6090C8B2F4703A7895330 /* Pods-ShadowsocksX-NGTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = \"Pods-ShadowsocksX-NGTests.modulemap\"; sourceTree = \"<group>\"; };\n\t\t83FE5C08C0F9F63C9A7D2B71EF9F0864 /* URLSessionConfiguration+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLSessionConfiguration+Alamofire.swift\"; path = \"Source/URLSessionConfiguration+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\t840A431555445FF451B4B74E7A8DDCF4 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = \"<group>\"; };\n\t\t848DD5BA5CA758D1F00A7F6F947019EB /* Alamofire.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.release.xcconfig; sourceTree = \"<group>\"; };\n\t\t855607DC318E2CF3120B3C70565140A0 /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Window.swift; sourceTree = \"<group>\"; };\n\t\t8565AD8EBB9A4E532AF93D887B586876 /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = \"<group>\"; };\n\t\t864BF009AFF7BFF4D8B68869FC885957 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/StartWith.swift; sourceTree = \"<group>\"; };\n\t\t8663196F6A9678BFC77A8E46F8666C75 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = \"<group>\"; };\n\t\t866C21955F27EBD7A49148F5E63A6E7E /* libBRLOptionParser.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBRLOptionParser.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t867FD5BBBCAC1E98FE144867305F8FEF /* MASKeyMasks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASKeyMasks.h; path = Framework/Model/MASKeyMasks.h; sourceTree = \"<group>\"; };\n\t\t8752D17209EE8AAD7681107D6444113F /* Pods-proxy_conf_helper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-proxy_conf_helper-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t877FA6BB936631CD8F2CA0DFFF6EFC9C /* UITextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITextField+Rx.swift\"; path = \"RxCocoa/iOS/UITextField+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t87A94DCCD78781BAE448DEA818B26DE4 /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SharedSequence+Operators+arity.swift\"; path = \"RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift\"; sourceTree = \"<group>\"; };\n\t\t886072F083033D493924A8BE652713ED /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = \"<group>\"; };\n\t\t89066EEDE0D03A9B328DADDC9344CC13 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerResponse.h; path = GCDWebServer/Core/GCDWebServerResponse.h; sourceTree = \"<group>\"; };\n\t\t8937D9E4BB1CD1D979DFF21019B4D814 /* MASHotKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASHotKey.h; path = Framework/Monitoring/MASHotKey.h; sourceTree = \"<group>\"; };\n\t\t897003218412D0C779A54DAAD7D2A4EE /* WithUnretained.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithUnretained.swift; path = RxSwift/Observables/WithUnretained.swift; sourceTree = \"<group>\"; };\n\t\t89A41E2A66DF6A8547AFAB72FE74B6A2 /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIActivityIndicatorView+Rx.swift\"; path = \"RxCocoa/iOS/UIActivityIndicatorView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t8A2C23CF743A94075196D7A4F419F5A4 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = \"<group>\"; };\n\t\t8AE4AAE5FF0F7FEDE2C8D5FB08A1AE4F /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = \"<group>\"; };\n\t\t8C1810C471075F4E78D93E645BD7F63B /* MASShortcut.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MASShortcut.modulemap; sourceTree = \"<group>\"; };\n\t\t8D796FDCC7398C88D7B835BD89700D56 /* BehaviorRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorRelay.swift; path = RxRelay/BehaviorRelay.swift; sourceTree = \"<group>\"; };\n\t\t8E4505859B317DCDCC426973F6C7153D /* Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Signal.swift; path = RxCocoa/Traits/Signal/Signal.swift; sourceTree = \"<group>\"; };\n\t\t8E796A67AE756E845646324A31731334 /* MASShortcutValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutValidator.h; path = Framework/Model/MASShortcutValidator.h; sourceTree = \"<group>\"; };\n\t\t8E801F2049749D5BA709EAE3A2028661 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = \"<group>\"; };\n\t\t8ED0DC48A18FD32A95BE8B28D715172C /* UISearchController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISearchController+Rx.swift\"; path = \"RxCocoa/iOS/UISearchController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t8F90CD66F125C28F8983AFCFA7DF6607 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = de.lproj; path = Resources/de.lproj; sourceTree = \"<group>\"; };\n\t\t9029CBEE1EB8EBFDFCC3F55CEC98E088 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = \"<group>\"; };\n\t\t904A920F44C4C4A18874A6A62A3ED759 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/SkipWhile.swift; sourceTree = \"<group>\"; };\n\t\t90E9219489B97BDFE17BA3231CC465FC /* ServerTrustEvaluation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustEvaluation.swift; path = Source/ServerTrustEvaluation.swift; sourceTree = \"<group>\"; };\n\t\t92B4BB091693150E5B1FCC6987683C6F /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-ShadowsocksX-NG.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t930EB20F00FF48CAF9B19505BC219504 /* MASShortcut-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"MASShortcut-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t95A61E2BD71E9AE873207EFE8994362B /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = \"<group>\"; };\n\t\t95B33DD3F11E0587A32ECE709173E4EF /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextStorageDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t95F05E167015F6A202D2BEB9437AE766 /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = \"<group>\"; };\n\t\t960C49C6C3C5E2554CA3CD8EB86B61AC /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = \"<group>\"; };\n\t\t961D7CAE484B6E4929A7BE5B048D29B5 /* RxPickerViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxPickerViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\t962EFFE0B39AFE334DBCAF81B4DBFE56 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFileRequest.h; path = GCDWebServer/Requests/GCDWebServerFileRequest.h; sourceTree = \"<group>\"; };\n\t\t96C80DBAD0A8D59912E005E60636A935 /* Pods-ShadowsocksX-NG-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-ShadowsocksX-NG-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t96D93775EA307729314581C5C539C487 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = \"<group>\"; };\n\t\t97319F4B64360DC3D794BD7B57BC9936 /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerURLEncodedFormRequest.h; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.h; sourceTree = \"<group>\"; };\n\t\t97D6BD38BB9E0F241C3C82A118E7F253 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ControlProperty+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ControlProperty+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\t98B151536C20EA366FDBE99C5A8BB7A5 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = \"<group>\"; };\n\t\t98EF0EFA057CC202BD041F55B091661A /* BehaviorRelay+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"BehaviorRelay+Driver.swift\"; path = \"RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\t996DFC2DB5C2F37F0E623EB885F5DEB5 /* Session.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Session.swift; path = Source/Session.swift; sourceTree = \"<group>\"; };\n\t\t9A3F0ED147035005ABA4D679F9E36A7B /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ru.lproj; path = Resources/ru.lproj; sourceTree = \"<group>\"; };\n\t\t9A71B9958F30759ED2645E0DF9ADF314 /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-ShadowsocksX-NG.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t9B23D7AFD516825208E6CE9B362989DB /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = \"<group>\"; };\n\t\t9C1FFDE936B5B805CB094F77E95A88FC /* UIControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIControl+Rx.swift\"; path = \"RxCocoa/iOS/UIControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t9C3A35E7DD83A1437478608A9F2EF44C /* ControlEvent+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ControlEvent+Signal.swift\"; path = \"RxCocoa/Traits/Signal/ControlEvent+Signal.swift\"; sourceTree = \"<group>\"; };\n\t\t9CF5ADA01C91A2DF993314D6CC9C63D3 /* MultipartUpload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartUpload.swift; path = Source/MultipartUpload.swift; sourceTree = \"<group>\"; };\n\t\t9D407239EE1987EFBB2A7EB11F70BFCF /* BRLOptionParser-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"BRLOptionParser-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t9D4701E49CFDE5F411CDFD316EDD3C70 /* UITabBarController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITabBarController+Rx.swift\"; path = \"RxCocoa/iOS/UITabBarController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t9EE8B6717B73CE07A9FAC17FFCB1BA91 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerErrorResponse.h; path = GCDWebServer/Responses/GCDWebServerErrorResponse.h; sourceTree = \"<group>\"; };\n\t\t9EF2C4A08C5514586AFFBB5AE22A99ED /* ResourceBundle-MASShortcut-MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"ResourceBundle-MASShortcut-MASShortcut-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t9F666DF6A38D74980DF6F191509F4971 /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"RxCocoaObjCRuntimeError+Extensions.swift\"; path = \"RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t9F78589C2F1DDF07DF58CD22F6835B19 /* Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Combine.swift; path = Source/Combine.swift; sourceTree = \"<group>\"; };\n\t\t9FA0DBB3C5358A6E4EF0C16145BB0F7E /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Zip.swift; sourceTree = \"<group>\"; };\n\t\tA01C872DE26A61BFEF081FC71E72A0D0 /* RxRelay-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxRelay-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tA0791E5EB9ADBB88CEE0BCD83DA9502C /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SchedulerServices+Emulation.swift\"; path = \"RxSwift/Schedulers/SchedulerServices+Emulation.swift\"; sourceTree = \"<group>\"; };\n\t\tA111C3B36368413B50627674BB48E859 /* Completable+AndThen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Completable+AndThen.swift\"; path = \"RxSwift/Traits/PrimitiveSequence/Completable+AndThen.swift\"; sourceTree = \"<group>\"; };\n\t\tA126CA25C01C17FEF1E4B62108855349 /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = \"<group>\"; };\n\t\tA14B9E97BE00B01372727FA8DA9B10A3 /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = \"<group>\"; };\n\t\tA18A7F7794D2CC58900E95F6644D63E8 /* MASShortcutBinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutBinder.h; path = \"Framework/User Defaults Storage/MASShortcutBinder.h\"; sourceTree = \"<group>\"; };\n\t\tA1D0AF20D0BF5465039BB88836A959B6 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = \"<group>\"; };\n\t\tA20673B8CBA1827BCAE8A9CDEAF0CDC5 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/SwitchIfEmpty.swift; sourceTree = \"<group>\"; };\n\t\tA254689F2908346AD7387F063C24B41A /* ko.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ko.lproj; path = Resources/ko.lproj; sourceTree = \"<group>\"; };\n\t\tA269EEED1FC8BFDA5FCB004DC335F5C8 /* AtomicInt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AtomicInt.swift; path = Platform/AtomicInt.swift; sourceTree = \"<group>\"; };\n\t\tA2738BBB0867C27512A99A3C9DBB2F1E /* GCDWebServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"GCDWebServer-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tA2B10B3F59B2394712B672A72C5827F0 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = \"<group>\"; };\n\t\tA2B9727C5385989526550D8E1AC4649A /* MASShortcut.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcut.h; path = Framework/Model/MASShortcut.h; sourceTree = \"<group>\"; };\n\t\tA2EEB1D58595D58C5DC8978116BE0648 /* MASShortcutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASShortcutView.h; path = Framework/UI/MASShortcutView.h; sourceTree = \"<group>\"; };\n\t\tA2FFFF24B3AC3570742D7F2CCF2FE3C5 /* Infallible+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Infallible+Zip+arity.swift\"; path = \"RxSwift/Traits/Infallible/Infallible+Zip+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tA32434EC299FDE302FFF9F31EB8735D0 /* RedirectHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RedirectHandler.swift; path = Source/RedirectHandler.swift; sourceTree = \"<group>\"; };\n\t\tA3A89F3DBB03CFC012C901EB6D452A3B /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = \"<group>\"; };\n\t\tA3E96B8BC40FDC92B51E51B50F126573 /* Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Single.swift; path = RxSwift/Traits/PrimitiveSequence/Single.swift; sourceTree = \"<group>\"; };\n\t\tA4177B545582D09C0D653414E6353741 /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\tA4395BE2A0C53A82170A01602870453A /* GCDWebServerRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerRequest.h; path = GCDWebServer/Core/GCDWebServerRequest.h; sourceTree = \"<group>\"; };\n\t\tA49E3489F755F888C3405824694827BF /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/WithLatestFrom.swift; sourceTree = \"<group>\"; };\n\t\tA4BB8686A6F85698D8AC03A77D188340 /* UITextView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITextView+Rx.swift\"; path = \"RxCocoa/iOS/UITextView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tA6415209F9685A39C6C1018082155EA5 /* CompactMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompactMap.swift; path = RxSwift/Observables/CompactMap.swift; sourceTree = \"<group>\"; };\n\t\tA8A33670952794CBD825EC26F1A98DBF /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = \"<group>\"; };\n\t\tA8C417EB740CAC7F2602C6D8880E7737 /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"PrimitiveSequence+Zip+arity.swift\"; path = \"RxSwift/Traits/PrimitiveSequence/PrimitiveSequence+Zip+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tA907FA326D15CD08847B63032F80EB64 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-ShadowsocksX-NG-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tA94A0417121D2C31F7167E4A79EC5313 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = nl.lproj; path = Resources/nl.lproj; sourceTree = \"<group>\"; };\n\t\tAADC2D51259367D2BB2C73816E5A35CD /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/RetryWhen.swift; sourceTree = \"<group>\"; };\n\t\tAAFFAAB92EFEC042FEE2F851EF9C6CC0 /* NSControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSControl+Rx.swift\"; path = \"RxCocoa/macOS/NSControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tAB7765E1848A0449B3E3267F17DDE12E /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerDataResponse.m; path = GCDWebServer/Responses/GCDWebServerDataResponse.m; sourceTree = \"<group>\"; };\n\t\tABD89974F6EA342767735D559995D3FA /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Zip+arity.swift\"; path = \"RxSwift/Observables/Zip+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tAC4C66DE7DB1A4B525929AEF699AC3CE /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\tADC06A8D8266504D3FD0F38F5F1A87AD /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\tAE4742C0047EC328BE64C1DF6D868CEF /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerStreamedResponse.h; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.h; sourceTree = \"<group>\"; };\n\t\tAE6768B8A7BED83ED5C93BB3439EFFEF /* URLConvertible+URLRequestConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLConvertible+URLRequestConvertible.swift\"; path = \"Source/URLConvertible+URLRequestConvertible.swift\"; sourceTree = \"<group>\"; };\n\t\tAF22EDE51D4C2AF18359CE03247D06F1 /* RxCocoa.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.release.xcconfig; sourceTree = \"<group>\"; };\n\t\tB1816E3DFE7F11350A74B0C1F878F7FC /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = \"<group>\"; };\n\t\tB1F34EB08D07E2AF230CDA30F361889D /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ja.lproj; path = Resources/ja.lproj; sourceTree = \"<group>\"; };\n\t\tB25AD05D537735CCA21E1986D98F830E /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift; sourceTree = \"<group>\"; };\n\t\tB265FABD755D21851D1C166921BB4A24 /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift; sourceTree = \"<group>\"; };\n\t\tB2BCE49AE180E28B89BBBE037DF32A2F /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = \"zh-Hans.lproj\"; path = \"Resources/zh-Hans.lproj\"; sourceTree = \"<group>\"; };\n\t\tB304846A96173EC0E0631D07751C0893 /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Sink.swift; sourceTree = \"<group>\"; };\n\t\tB400BB6631F1C9F8534BE1CEF160097E /* GCDWebServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"GCDWebServer-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tB5AEEDAA3124911175E2336A08227588 /* MASShortcutView+Bindings.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"MASShortcutView+Bindings.h\"; path = \"Framework/UI/MASShortcutView+Bindings.h\"; sourceTree = \"<group>\"; };\n\t\tB5B1AE9FCFABDD97172220DFDFE618E5 /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tB5D8A52DE9A6385138A6D20CB5527DDB /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = \"zh-Hant.lproj\"; path = \"Resources/zh-Hant.lproj\"; sourceTree = \"<group>\"; };\n\t\tB68B5F9FDDB0D41979766C1D549A8780 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fr.lproj; path = Resources/fr.lproj; sourceTree = \"<group>\"; };\n\t\tB68C1052A3B51DBCF7D960F898AAFA95 /* GCDWebServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCDWebServer.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB7045A3758C33721435A4135DBC6A8AA /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = \"<group>\"; };\n\t\tB797965188D07FBBF91BA7F69EC21D39 /* Pods-ShadowsocksX-NGTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-ShadowsocksX-NGTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tB81749D1C6130BC14B2386B76041124F /* GCDWebServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GCDWebServer.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tB8D247C19100F15D54BFF5D93804C65E /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/AsSingle.swift; sourceTree = \"<group>\"; };\n\t\tB9215F3DCBD2FE1BDADCEF5D05219A48 /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tB97E5FCD7744551B43A8C353FD79E774 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = \"<group>\"; };\n\t\tBB1177638C48D2FB13DDFB46A70CD35D /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = \"<group>\"; };\n\t\tBB63C0EAF763E45BC31AAB9802F87995 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tBC41D63AA5F0A525ACB78573334AB97C /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"CombineLatest+arity.swift\"; path = \"RxSwift/Observables/CombineLatest+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tBC432FD48A5932251F1CAFBC4BF74894 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBE717EAC81EE595FC7AE3C1A3C6D06A6 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = \"<group>\"; };\n\t\tBEEC0450A3B1A48A304AE8BF1DC03429 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = \"<group>\"; };\n\t\tBF07A24C96313F878506258234883CC8 /* GCDWebServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"GCDWebServer-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tBF25DE5F0433D7BA7D6F91A5F113542A /* RxRelay.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxRelay.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tBFD92A4EF88D0A6B34E86A6A7CE2436D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC0D1BF03B3F26978B85F2E44EBE18FC1 /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\tC119A4F639217703B4B382419AF9D4EF /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tC15539256AFFEE061C9DE9660B995B25 /* RxTableViewDataSourcePrefetchingProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourcePrefetchingProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourcePrefetchingProxy.swift; sourceTree = \"<group>\"; };\n\t\tC21721CAB3BC76F0D7582BD636DB821D /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerDataResponse.h; path = GCDWebServer/Responses/GCDWebServerDataResponse.h; sourceTree = \"<group>\"; };\n\t\tC3B6C103B3C3936D11BF01C71C0EE380 /* BRLOptionParser.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BRLOptionParser.release.xcconfig; sourceTree = \"<group>\"; };\n\t\tC3DCF3854C69F5239CE7E89C1FCFAA51 /* ObservableConvertibleType+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+Signal.swift\"; path = \"RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift\"; sourceTree = \"<group>\"; };\n\t\tC4028B836251B6DD18772CF35047686A /* NSView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSView+Rx.swift\"; path = \"RxCocoa/macOS/NSView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tC40D7DCF882E3A5609EDE1602335E721 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerResponse.m; path = GCDWebServer/Core/GCDWebServerResponse.m; sourceTree = \"<group>\"; };\n\t\tC535813B1010A4B0BEBADE15AD42DC2E /* MASShortcut-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"MASShortcut-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tC5BD2C8DB205D16490D3804A6CAB6C50 /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\tC70C13D2EC9B57E48D64BD7ABC49F9D6 /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"KVORepresentable+CoreGraphics.swift\"; path = \"RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift\"; sourceTree = \"<group>\"; };\n\t\tC713517A8C0251C9EEB925D43C63A544 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableType+Extensions.swift\"; path = \"RxSwift/ObservableType+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\tC771BA2A255CC372CD2AB83291BD3E1C /* GCDWebServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServer.h; path = GCDWebServer/Core/GCDWebServer.h; sourceTree = \"<group>\"; };\n\t\tC78EDD95C0B56A70BE237D148A1726CA /* UIApplication+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIApplication+Rx.swift\"; path = \"RxCocoa/iOS/UIApplication+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tC793DFE7002D416E900642C76CEEBD75 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = \"<group>\"; };\n\t\tC798C591985DFD0B008AAEEBF78EF979 /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = \"<group>\"; };\n\t\tC8305C9D0B89A4CE30258C61DDD5A342 /* StringEncoding+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"StringEncoding+Alamofire.swift\"; path = \"Source/StringEncoding+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\tC96F1CEB77C6CB8A9D2A7682406E7AE9 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Extensions.swift\"; path = \"Platform/DispatchQueue+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\tCA0A6C3DB39AD5C25FF5B1A9F554E228 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = \"<group>\"; };\n\t\tCA7211C3393B6E1ED0E57C4CCF5F5005 /* PublishRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishRelay.swift; path = RxRelay/PublishRelay.swift; sourceTree = \"<group>\"; };\n\t\tCB340F626B32E3AF98F1E13658FB46E2 /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIBarButtonItem+Rx.swift\"; path = \"RxCocoa/iOS/UIBarButtonItem+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tCCCC3232579F890A62A86540F6600BE6 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Bag+Rx.swift\"; path = \"RxSwift/Extensions/Bag+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tCD2C25316E1BF4F3230E3412417481E6 /* Result+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Result+Alamofire.swift\"; path = \"Source/Result+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\tCD90405BE5311F3F3A8CFCFABCCF3560 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Multicast.swift; sourceTree = \"<group>\"; };\n\t\tCD95085BFAA31431686824B236DB9319 /* Pods-ShadowsocksX-NG-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-ShadowsocksX-NG-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tCE8BA32B7F7B571C37D44747CBB93955 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = \"<group>\"; };\n\t\tCECC6752E3DD709B29A4ED0461B7BF82 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = \"<group>\"; };\n\t\tD157799A728D6FFED669C62E86BABD73 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerMultiPartFormRequest.h; path = GCDWebServer/Requests/GCDWebServerMultiPartFormRequest.h; sourceTree = \"<group>\"; };\n\t\tD18636DE7B757847E9D7B9E45CA10DE2 /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SharedSequence+Operators.swift\"; path = \"RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift\"; sourceTree = \"<group>\"; };\n\t\tD231BAD0830AAA293F76CB7428ADA704 /* MASShortcut.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MASShortcut.release.xcconfig; sourceTree = \"<group>\"; };\n\t\tD418B4DEE726BA9D5A912D8F1FBF0888 /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\tD48183AD5F98D081078429EF56451DFF /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD49EC557FA27872611535147AB5D700C /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UICollectionView+Rx.swift\"; path = \"RxCocoa/iOS/UICollectionView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD4E3DADB00C8898A4A01F4DF1034F96C /* GCDWebServerRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerRequest.m; path = GCDWebServer/Core/GCDWebServerRequest.m; sourceTree = \"<group>\"; };\n\t\tD54CB24891D5C94C81CAED6F6D1D4FAB /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = \"<group>\"; };\n\t\tD570E112B81800B30A1165D0BC68DB8A /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = \"<group>\"; };\n\t\tD60357581333E7EC56952E31B2991366 /* Pods-ShadowsocksX-NG-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-ShadowsocksX-NG-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tD64C89D84E4BDDCF85E57BDA0153F0B1 /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RxSwift.modulemap; sourceTree = \"<group>\"; };\n\t\tD70A973E907BDE134197952FF14301CE /* RxRelay.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxRelay.release.xcconfig; sourceTree = \"<group>\"; };\n\t\tD7453403FEE25F56521DBB8A39EA0204 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = \"<group>\"; };\n\t\tD7ED9E80778846168B6F3F867C04F6AA /* ParameterEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoder.swift; path = Source/ParameterEncoder.swift; sourceTree = \"<group>\"; };\n\t\tD7F46244A2FF95EF2B228E2F76529358 /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Driver+Subscription.swift\"; path = \"RxCocoa/Traits/Driver/Driver+Subscription.swift\"; sourceTree = \"<group>\"; };\n\t\tD87FAE60EB40AC65B2E5000C6B82DFEB /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIGestureRecognizer+Rx.swift\"; path = \"RxCocoa/iOS/UIGestureRecognizer+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD894FDA92A29CEECD7D1E50C263F1777 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = \"<group>\"; };\n\t\tD896F6A68919914B3302027C15449A1D /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD8C88B0B7BFE785BC9B00D1C53FDC003 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-proxy_conf_helper.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD96D37A7C37C05D7DEEAE9B3944CC4DD /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = \"<group>\"; };\n\t\tDA23B9C3D142FEFFA05E4F37B1A976AE /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/ElementAt.swift; sourceTree = \"<group>\"; };\n\t\tDAE48A7C993FBD43A674E228A900457B /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerStreamedResponse.m; path = GCDWebServer/Responses/GCDWebServerStreamedResponse.m; sourceTree = \"<group>\"; };\n\t\tDAFB048690381EFB0893639F33D3C764 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = \"<group>\"; };\n\t\tDB051CDFBF3B30AA181F5BF12F48FD3A /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\tDBB7AE66363DEA0FFF31BA0AD1EB9340 /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = \"<group>\"; };\n\t\tDC40BD5F1E0BFED23CB5A6AE57FA4443 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDWebServerURLEncodedFormRequest.m; path = GCDWebServer/Requests/GCDWebServerURLEncodedFormRequest.m; sourceTree = \"<group>\"; };\n\t\tDD31B6D267ADAB9B30F51F821C60554A /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDWebServerFunctions.h; path = GCDWebServer/Core/GCDWebServerFunctions.h; sourceTree = \"<group>\"; };\n\t\tDE18F7CA6E337EA48867C7D92143B6F9 /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NotificationCenter+Rx.swift\"; path = \"RxCocoa/Foundation/NotificationCenter+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tDE719264DC0248D1CA1E5F7821C8381D /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxCocoa-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tDFA75B434E18E0DA5F6DEB758B437261 /* GCDWebServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GCDWebServer.modulemap; sourceTree = \"<group>\"; };\n\t\tDFAC6355D5B0FD94083A74B4602AF9D2 /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+SharedSequence.swift\"; path = \"RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift\"; sourceTree = \"<group>\"; };\n\t\tE14C791F6C2C8320DE732C78C55306A1 /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\tE35662841C2AAA3188CD9ADFDC38880F /* NSTextStorage+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSTextStorage+Rx.swift\"; path = \"RxCocoa/iOS/NSTextStorage+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tE39E7221D0BA332CC5AC5DD0A7C16C92 /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISegmentedControl+Rx.swift\"; path = \"RxCocoa/iOS/UISegmentedControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tE4618B5826B29CA49F53BD36B1570602 /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = \"<group>\"; };\n\t\tE4C0551E43C5CE2E6F3BD09C18890BFD /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxCocoa-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tE5635498728E3B4005A42A385330D7CC /* RxCocoa-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"RxCocoa-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tE6B674A528A68BF8E6AB4A5F747B05B8 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = \"<group>\"; };\n\t\tE8976DA3C1E5870E7B74F26E219A9885 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Observable+Bind.swift\"; path = \"RxCocoa/Common/Observable+Bind.swift\"; sourceTree = \"<group>\"; };\n\t\tEA0C023ECBE853C3AFE12E6702B6D1CD /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = \"<group>\"; };\n\t\tEA187A944BB7C96464B1E79E6D12F90F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEAB5B580FE6B602D602E607C7BC7C470 /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLSession+Rx.swift\"; path = \"RxCocoa/Foundation/URLSession+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tEB62C29E42A50AB4AA5C6DED19DA376D /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = \"<group>\"; };\n\t\tEBC071EBDAC90F82FF4D25D024A5AACF /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Sample.swift; sourceTree = \"<group>\"; };\n\t\tEC44E7C397DF9B77CEF6F5C86EFCE92A /* RxPickerViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\tEC8F5BC5CABB65CCD832B9821F532DBD /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = \"<group>\"; };\n\t\tECF8CD0A416163A50B72AAF4B0C4A124 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = \"<group>\"; };\n\t\tEE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEE873D31D9227598B067D9426D366009 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pl.lproj; path = Resources/pl.lproj; sourceTree = \"<group>\"; };\n\t\tEF4A8984BD7018149BDA495C7EA5FE28 /* Infallible+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Infallible+Operators.swift\"; path = \"RxSwift/Traits/Infallible/Infallible+Operators.swift\"; sourceTree = \"<group>\"; };\n\t\tEF8D2E7C64775F0DD477127B5EC2E0AB /* RequestTaskMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestTaskMap.swift; path = Source/RequestTaskMap.swift; sourceTree = \"<group>\"; };\n\t\tEF91750DCDE73B687E4BA164856BE224 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEFD30F9BBDEB87F6ADD6C3AAF8DE6E30 /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = \"<group>\"; };\n\t\tF0007682E9947D6BFA4DA24D30F6CBF2 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxSwift-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tF0D4493458E5817BA46B4318626487F6 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = \"<group>\"; };\n\t\tF11E6B29B9CB879F29AFEBD980D3AFBF /* Date+Dispatch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Date+Dispatch.swift\"; path = \"RxSwift/Date+Dispatch.swift\"; sourceTree = \"<group>\"; };\n\t\tF17C7E34E699CD1435A12B207C1A125D /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RxCocoa.modulemap; sourceTree = \"<group>\"; };\n\t\tF3623071AC720B9C13DD1043F7052A73 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = \"<group>\"; };\n\t\tF4786526A5AD085C95AC191C7253C591 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Switch.swift; sourceTree = \"<group>\"; };\n\t\tF5102E62600D264D29633030E490AAE6 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = \"<group>\"; };\n\t\tF57A5448A0A790BED406AB47ED75D7B1 /* Alamofire-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Alamofire-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF6460C30C5328ED85A1103897C8CB63C /* MASDictionaryTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASDictionaryTransformer.m; path = \"Framework/User Defaults Storage/MASDictionaryTransformer.m\"; sourceTree = \"<group>\"; };\n\t\tF893DD80BE166F23DB8567A0940B0FEE /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = \"<group>\"; };\n\t\tF961756C2E9DE7614DBA1271483EB245 /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = \"<group>\"; };\n\t\tF979292485788BE53E5871123C74EB10 /* RxPickerViewAdapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewAdapter.swift; path = RxCocoa/iOS/DataSources/RxPickerViewAdapter.swift; sourceTree = \"<group>\"; };\n\t\tF97D53A26324CAC07AB16E21B963CF9A /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = \"<group>\"; };\n\t\tFA1467E6A8A0A5B978108FDFC868000E /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Just.swift; sourceTree = \"<group>\"; };\n\t\tFAABDBC186233AEF9876B5A4F009C8B8 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = \"<group>\"; };\n\t\tFAB6166D07AACCBF2B4A5FFC66F22602 /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pt.lproj; path = Resources/pt.lproj; sourceTree = \"<group>\"; };\n\t\tFB50A95F3BC6DC12244F2B76ABEBB9BD /* Pods-ShadowsocksX-NG-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-ShadowsocksX-NG-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tFBD8075FDD277652161C8676E945DE6A /* RxRelay.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxRelay.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFCF992D22D15D6CF73AF4D310FEE871C /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = \"<group>\"; };\n\t\tFD07F15ADFC693A5C730840EA2B42015 /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = \"<group>\"; };\n\t\tFD39BD9C1B852EC7AC7CD7D77D1E606F /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/ObserveOn.swift; sourceTree = \"<group>\"; };\n\t\tFDCA53BCCEFF4720A955F8202537A982 /* WKWebView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"WKWebView+Rx.swift\"; path = \"RxCocoa/iOS/WKWebView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tFDF7D102C3DA0493A530D68E569DA7CF /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = sv.lproj; path = Resources/sv.lproj; sourceTree = \"<group>\"; };\n\t\tFE18557905075BFBE5AFBE3A0D9287F4 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = \"<group>\"; };\n\t\tFE3AAA7586F734974B628C45E2310229 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Using.swift; sourceTree = \"<group>\"; };\n\t\tFE6138E84780096ADB31F55549931FC6 /* RxSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.debug.xcconfig; sourceTree = \"<group>\"; };\n\t\tFF5FCDE3BD3C3E02C0A0B3D529BF6982 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/CombineLatest.swift; sourceTree = \"<group>\"; };\n\t\tFF8B264DFE802855D5D67E7CDDABFC3C /* RxRelay.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxRelay.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1514A9A36FD5740CCE236AFAF1DAC5C6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t44ABA0E4566A87964594C3AB0F7D2048 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6E9985F3EEB339730D49B3D0181E6029 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2E0722133679D5C422D0EC5ACB8B23A1 /* Cocoa.framework in Frameworks */,\n\t\t\t\tA24E8834A85F99EF471C495AD4EFACAB /* RxRelay.framework in Frameworks */,\n\t\t\t\t9131DD9E2CB7420C156461E56835AE6E /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7B690F32F695B6718D43BA3D3544C78C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8314F89A5274810933307BC20E85D3B0 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB3C5909F9901CF3F5237F1832E214556 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6A2F2216A64E4B4E0FD6215A2F5E692D /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBA30161BB5D2E74710CBABFCC20E409F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF654788A27A296CD2C1F104B4C897EF0 /* Cocoa.framework in Frameworks */,\n\t\t\t\tFB3AD79C536DC201CED66150778FA691 /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC2D4774AB2F0BFB25B60914F66C457AC /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE03556E8EC8DA4FF0DE3ED6F86BD7C51 /* Cocoa.framework in Frameworks */,\n\t\t\t\tEC388029B45DC677A2412CF1617E4DF1 /* SystemConfiguration.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDA3A32D96D94A82A8FFE804468C37DB4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t262EBFD1844224838811BD9E1726CD73 /* AppKit.framework in Frameworks */,\n\t\t\t\t88665F16CDF39BC2A50C6619169E6EDF /* Carbon.framework in Frameworks */,\n\t\t\t\t96E6F7A2D012051B29BC9147340E5117 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE4B8CC1E36A98FF4D8BDAC84442F0DCE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9A1CDAE2E9AFFFDBC654855D4A8C6D36 /* CFNetwork.framework in Frameworks */,\n\t\t\t\t4C3A9F4F5A688009D660C0FA5E5D81BB /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEE0D52842751CED2CD0BD2633A30FEA4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF4AB20C615B7CE4E912D4031FF0A52C8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t896AD4C4865ECEA0A8344B54BBA3B9E1 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t016ECA8DBDA1E03C02AE6CE07B9C7B28 /* Pods-ShadowsocksX-NGTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83899FE1EDE6090C8B2F4703A7895330 /* Pods-ShadowsocksX-NGTests.modulemap */,\n\t\t\t\t22ADD736785A6DE33628551E25AC889A /* Pods-ShadowsocksX-NGTests-acknowledgements.markdown */,\n\t\t\t\t2CFE9D0E45288EBBAF865D7685C2B983 /* Pods-ShadowsocksX-NGTests-acknowledgements.plist */,\n\t\t\t\t1C10AA3C311345DB3616BCE827B69C55 /* Pods-ShadowsocksX-NGTests-dummy.m */,\n\t\t\t\tB797965188D07FBBF91BA7F69EC21D39 /* Pods-ShadowsocksX-NGTests-Info.plist */,\n\t\t\t\t72A57876EDEB24ADDFE06DD482CE250C /* Pods-ShadowsocksX-NGTests-umbrella.h */,\n\t\t\t\t196DA983244F60766BA272090829A16E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */,\n\t\t\t\t5C0C485AB4EA81F3E9128F65E9AC66CA /* Pods-ShadowsocksX-NGTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-ShadowsocksX-NGTests\";\n\t\t\tpath = \"Target Support Files/Pods-ShadowsocksX-NGTests\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0AE53B8F7176B22FFD63627F9D926CAF /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t336A70440B171C2C6AEE66F83620273A /* Alamofire.modulemap */,\n\t\t\t\t06A09DBC68AE0A93F94442D71EBF343F /* Alamofire-dummy.m */,\n\t\t\t\tF57A5448A0A790BED406AB47ED75D7B1 /* Alamofire-Info.plist */,\n\t\t\t\t1A2C716EE769E98BF094D14B243A42C2 /* Alamofire-prefix.pch */,\n\t\t\t\t10E99E50E2994DB7AD9AEBDEF1A2F72B /* Alamofire-umbrella.h */,\n\t\t\t\t75EA425CE2A4DBDDEB580C7303DD2454 /* Alamofire.debug.xcconfig */,\n\t\t\t\t848DD5BA5CA758D1F00A7F6F947019EB /* Alamofire.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Alamofire\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t14F38608C29A913E1DD0D624DE663510 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2FBE37D8419906C6110EC34FC53F14BE /* Alamofire */,\n\t\t\t\tD20BAD07D23FBA7AA269B9FA80FE8BF3 /* BRLOptionParser */,\n\t\t\t\t25954B3ABFDB5497C48E76FDE256C24A /* GCDWebServer */,\n\t\t\t\tD71126DFC6989B0EEE224402B0C7852C /* MASShortcut */,\n\t\t\t\tAF01C03E9E6BF3B668D35EEF202AD7A0 /* RxCocoa */,\n\t\t\t\t6B3DE0B21DFC168E060A8E9C9EC74C3A /* RxRelay */,\n\t\t\t\t62066982AA2FE77C183DF3046C898E34 /* RxSwift */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t165807E7BFFB1F57C0BA71AD827D588F /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1389D4639C0D9038BA081FA8DC1CD646 /* BRLOptionParser-dummy.m */,\n\t\t\t\t9D407239EE1987EFBB2A7EB11F70BFCF /* BRLOptionParser-prefix.pch */,\n\t\t\t\t5EE446AD8C625612BFF0E37E4419E0FD /* BRLOptionParser.debug.xcconfig */,\n\t\t\t\tC3B6C103B3C3936D11BF01C71C0EE380 /* BRLOptionParser.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/BRLOptionParser\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t25954B3ABFDB5497C48E76FDE256C24A /* GCDWebServer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D5BF41D87EA0E33C1D9986ADA4BDA51 /* Core */,\n\t\t\t\tF7E043D77B41FA3B6662AD3E792046E8 /* Support Files */,\n\t\t\t);\n\t\t\tpath = GCDWebServer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2FBE37D8419906C6110EC34FC53F14BE /* Alamofire */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6D8A09F0F8EDB0B1A568AA29A33D62EA /* AFError.swift */,\n\t\t\t\t2E656BCAB89EA23EC58A161ACF0DAE68 /* Alamofire.swift */,\n\t\t\t\t19AA7CC35C97B4BDF08E2E5CE20955E0 /* AlamofireExtended.swift */,\n\t\t\t\t2E101994FDA2210D6CD7972A656C511F /* AuthenticationInterceptor.swift */,\n\t\t\t\t32EC506B43DB4AE47634A8AEE18D9E8C /* CachedResponseHandler.swift */,\n\t\t\t\t9F78589C2F1DDF07DF58CD22F6835B19 /* Combine.swift */,\n\t\t\t\t41ADA85A38ECDBBD122B707DA599E641 /* DispatchQueue+Alamofire.swift */,\n\t\t\t\t4E0CDE6403F2AF9E108FF190F90FA9FF /* EventMonitor.swift */,\n\t\t\t\t3425B3045259FEA3A238D183DEEE520B /* HTTPHeaders.swift */,\n\t\t\t\t403ABCCF5634DCD99A376EAA601F828E /* HTTPMethod.swift */,\n\t\t\t\tD7453403FEE25F56521DBB8A39EA0204 /* MultipartFormData.swift */,\n\t\t\t\t9CF5ADA01C91A2DF993314D6CC9C63D3 /* MultipartUpload.swift */,\n\t\t\t\tF5102E62600D264D29633030E490AAE6 /* NetworkReachabilityManager.swift */,\n\t\t\t\tBEEC0450A3B1A48A304AE8BF1DC03429 /* Notifications.swift */,\n\t\t\t\t26DA8062B81F764A6EEA6168DF6337AB /* OperationQueue+Alamofire.swift */,\n\t\t\t\tD7ED9E80778846168B6F3F867C04F6AA /* ParameterEncoder.swift */,\n\t\t\t\tECF8CD0A416163A50B72AAF4B0C4A124 /* ParameterEncoding.swift */,\n\t\t\t\t43D1B54DDFE366EA8E657D1CFA2A5349 /* Protected.swift */,\n\t\t\t\tA32434EC299FDE302FFF9F31EB8735D0 /* RedirectHandler.swift */,\n\t\t\t\t9029CBEE1EB8EBFDFCC3F55CEC98E088 /* Request.swift */,\n\t\t\t\t80B5C55F7279E38D15E19E9DEDDEDE7B /* RequestInterceptor.swift */,\n\t\t\t\tEF8D2E7C64775F0DD477127B5EC2E0AB /* RequestTaskMap.swift */,\n\t\t\t\t0D09EFC8E8E0DD0BACEB39FA20E08331 /* Response.swift */,\n\t\t\t\t48CB9D3553F121F84DBB750A8FBE0F3D /* ResponseSerialization.swift */,\n\t\t\t\tCD2C25316E1BF4F3230E3412417481E6 /* Result+Alamofire.swift */,\n\t\t\t\t3B85D80911EDFC7DD402EBEB3A05169A /* RetryPolicy.swift */,\n\t\t\t\t90E9219489B97BDFE17BA3231CC465FC /* ServerTrustEvaluation.swift */,\n\t\t\t\t996DFC2DB5C2F37F0E623EB885F5DEB5 /* Session.swift */,\n\t\t\t\tB7045A3758C33721435A4135DBC6A8AA /* SessionDelegate.swift */,\n\t\t\t\tC8305C9D0B89A4CE30258C61DDD5A342 /* StringEncoding+Alamofire.swift */,\n\t\t\t\tAE6768B8A7BED83ED5C93BB3439EFFEF /* URLConvertible+URLRequestConvertible.swift */,\n\t\t\t\t5D0A2A589A608DD00CA24C86BCD46E62 /* URLEncodedFormEncoder.swift */,\n\t\t\t\t47291D90953698297410B0C37E619402 /* URLRequest+Alamofire.swift */,\n\t\t\t\t83FE5C08C0F9F63C9A7D2B71EF9F0864 /* URLSessionConfiguration+Alamofire.swift */,\n\t\t\t\t151A22449BAFE60147DA302082A00FA1 /* Validation.swift */,\n\t\t\t\t0AE53B8F7176B22FFD63627F9D926CAF /* Support Files */,\n\t\t\t);\n\t\t\tpath = Alamofire;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t493933EC245DE8B9BF6A90C4A901306A /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA1DDAA49ED6DA408AC4F6220754154E6 /* Pods-proxy_conf_helper */,\n\t\t\t\tB364CCC64531E6C6BC03A50131504939 /* Pods-ShadowsocksX-NG */,\n\t\t\t\t016ECA8DBDA1E03C02AE6CE07B9C7B28 /* Pods-ShadowsocksX-NGTests */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4AE2520FB25EC7AF2FA83B8E69D00ED0 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8C1810C471075F4E78D93E645BD7F63B /* MASShortcut.modulemap */,\n\t\t\t\t6B668707F7C66384A3BB8BC4FE3F41E6 /* MASShortcut-dummy.m */,\n\t\t\t\tC535813B1010A4B0BEBADE15AD42DC2E /* MASShortcut-Info.plist */,\n\t\t\t\t7720FEFA630547FDE17C156840E36CC6 /* MASShortcut-prefix.pch */,\n\t\t\t\t930EB20F00FF48CAF9B19505BC219504 /* MASShortcut-umbrella.h */,\n\t\t\t\t70C291AA3C3CEE619534F472C4F04882 /* MASShortcut.debug.xcconfig */,\n\t\t\t\tD231BAD0830AAA293F76CB7428ADA704 /* MASShortcut.release.xcconfig */,\n\t\t\t\t9EF2C4A08C5514586AFFBB5AE22A99ED /* ResourceBundle-MASShortcut-MASShortcut-Info.plist */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/MASShortcut\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4C712514E3CDE5A583F0DA94CB23FB65 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFBD8075FDD277652161C8676E945DE6A /* RxRelay.framework */,\n\t\t\t\tBFD92A4EF88D0A6B34E86A6A7CE2436D /* RxSwift.framework */,\n\t\t\t\tEE196A86A60DA3C09134F038D0679871 /* OS X */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E0AA8A2AD4F95EB8CD37C35E2FC5D26 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD64C89D84E4BDDCF85E57BDA0153F0B1 /* RxSwift.modulemap */,\n\t\t\t\tF0007682E9947D6BFA4DA24D30F6CBF2 /* RxSwift-dummy.m */,\n\t\t\t\t4946CBDE2CD13F181402416264EBF61D /* RxSwift-Info.plist */,\n\t\t\t\t3685B6DE4DF41097400DA11AA41A500B /* RxSwift-prefix.pch */,\n\t\t\t\t77B5C856C653A9586105526C4341767A /* RxSwift-umbrella.h */,\n\t\t\t\tFE6138E84780096ADB31F55549931FC6 /* RxSwift.debug.xcconfig */,\n\t\t\t\t28F6CED61832E1CE6BA74AA90F7E45EE /* RxSwift.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxSwift\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5E93897366D3A44BA737EB9FE037DDB1 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF17C7E34E699CD1435A12B207C1A125D /* RxCocoa.modulemap */,\n\t\t\t\t4752AFB18B745CA95D95FB7457EAA1C4 /* RxCocoa-dummy.m */,\n\t\t\t\tE5635498728E3B4005A42A385330D7CC /* RxCocoa-Info.plist */,\n\t\t\t\tDE719264DC0248D1CA1E5F7821C8381D /* RxCocoa-prefix.pch */,\n\t\t\t\tE4C0551E43C5CE2E6F3BD09C18890BFD /* RxCocoa-umbrella.h */,\n\t\t\t\t2F138B6C28378A801D2186B22E1E6224 /* RxCocoa.debug.xcconfig */,\n\t\t\t\tAF22EDE51D4C2AF18359CE03247D06F1 /* RxCocoa.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxCocoa\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t62066982AA2FE77C183DF3046C898E34 /* RxSwift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t494FD3BF9675BD2ADCE4731FED65B5FF /* AddRef.swift */,\n\t\t\t\t0CB05B6D60934D955FE0D75C2339A114 /* Amb.swift */,\n\t\t\t\t1EB8536183BE6472CDCC5817172688EF /* AnonymousDisposable.swift */,\n\t\t\t\t636D1EE61F0E0E367F486461F8E0DF54 /* AnonymousObserver.swift */,\n\t\t\t\t840A431555445FF451B4B74E7A8DDCF4 /* AnyObserver.swift */,\n\t\t\t\t7D680C4252D37F732EE2D1BB9AB911DA /* AsMaybe.swift */,\n\t\t\t\tB8D247C19100F15D54BFF5D93804C65E /* AsSingle.swift */,\n\t\t\t\t52626495FA7375A2A4753E3EC16FB26C /* AsyncLock.swift */,\n\t\t\t\tFD07F15ADFC693A5C730840EA2B42015 /* AsyncSubject.swift */,\n\t\t\t\tA269EEED1FC8BFDA5FCB004DC335F5C8 /* AtomicInt.swift */,\n\t\t\t\t0B98DA4C08DC1A12B2789714C6CDEFFA /* Bag.swift */,\n\t\t\t\tCCCC3232579F890A62A86540F6600BE6 /* Bag+Rx.swift */,\n\t\t\t\tBB1177638C48D2FB13DDFB46A70CD35D /* BehaviorSubject.swift */,\n\t\t\t\t2FEFD09344E88FFE590FC0A7146C0D32 /* BinaryDisposable.swift */,\n\t\t\t\t4412635C50524157DDF38FA0CB197F4A /* Binder.swift */,\n\t\t\t\tEA0C023ECBE853C3AFE12E6702B6D1CD /* BooleanDisposable.swift */,\n\t\t\t\tBE717EAC81EE595FC7AE3C1A3C6D06A6 /* Buffer.swift */,\n\t\t\t\t8565AD8EBB9A4E532AF93D887B586876 /* Cancelable.swift */,\n\t\t\t\t1CD2535A24AA927A5965AF73264678A3 /* Catch.swift */,\n\t\t\t\tFF5FCDE3BD3C3E02C0A0B3D529BF6982 /* CombineLatest.swift */,\n\t\t\t\tBC41D63AA5F0A525ACB78573334AB97C /* CombineLatest+arity.swift */,\n\t\t\t\t68D133622632E3F0C62D1F74D188EA7E /* CombineLatest+Collection.swift */,\n\t\t\t\tA6415209F9685A39C6C1018082155EA5 /* CompactMap.swift */,\n\t\t\t\t2AE63CBE5D3B0C2D25184C45E1B8C885 /* Completable.swift */,\n\t\t\t\tA111C3B36368413B50627674BB48E859 /* Completable+AndThen.swift */,\n\t\t\t\t3BE91EC45C71C190D532DC351F5E724D /* CompositeDisposable.swift */,\n\t\t\t\t66C7F789300668AEDFA53AEA1392C48B /* Concat.swift */,\n\t\t\t\tDB051CDFBF3B30AA181F5BF12F48FD3A /* ConcurrentDispatchQueueScheduler.swift */,\n\t\t\t\tA126CA25C01C17FEF1E4B62108855349 /* ConcurrentMainScheduler.swift */,\n\t\t\t\t2505B197F74151D018080608E6576C6C /* ConnectableObservableType.swift */,\n\t\t\t\t3ED0602BE820AA0F7B2D99CBFED4C1F0 /* Create.swift */,\n\t\t\t\tC793DFE7002D416E900642C76CEEBD75 /* CurrentThreadScheduler.swift */,\n\t\t\t\tF11E6B29B9CB879F29AFEBD980D3AFBF /* Date+Dispatch.swift */,\n\t\t\t\t8A2C23CF743A94075196D7A4F419F5A4 /* Debounce.swift */,\n\t\t\t\t555231B7293881D7D76CA80C82AABA2B /* Debug.swift */,\n\t\t\t\t5D99DA86D8CBFFCB2E7FD40BC42568F3 /* Decode.swift */,\n\t\t\t\tC798C591985DFD0B008AAEEBF78EF979 /* DefaultIfEmpty.swift */,\n\t\t\t\t33BBD4B03778E41A59C1A3F64AAB876C /* Deferred.swift */,\n\t\t\t\tD570E112B81800B30A1165D0BC68DB8A /* Delay.swift */,\n\t\t\t\t8AE4AAE5FF0F7FEDE2C8D5FB08A1AE4F /* DelaySubscription.swift */,\n\t\t\t\t080201197B517655700BD33F44B1A602 /* Dematerialize.swift */,\n\t\t\t\tC96F1CEB77C6CB8A9D2A7682406E7AE9 /* DispatchQueue+Extensions.swift */,\n\t\t\t\t222E861679233A0833D6C2F8079146E7 /* DispatchQueueConfiguration.swift */,\n\t\t\t\t8369906FA14B85B8271089FAAA1E4694 /* Disposable.swift */,\n\t\t\t\tCECC6752E3DD709B29A4ED0461B7BF82 /* Disposables.swift */,\n\t\t\t\t0F2EB184269284B56190B6EE5A7E5CC3 /* DisposeBag.swift */,\n\t\t\t\t04A3FEA575D65278CDB553AA231A0CF6 /* DisposeBase.swift */,\n\t\t\t\t3949A4BE0C4C31915E5A812146DB23B9 /* DistinctUntilChanged.swift */,\n\t\t\t\t0E5F518C62FDAA5A762312C37D1CB101 /* Do.swift */,\n\t\t\t\tDA23B9C3D142FEFFA05E4F37B1A976AE /* ElementAt.swift */,\n\t\t\t\t65D8FEBF2028BCC7758A666F2A35989A /* Empty.swift */,\n\t\t\t\t31234D4C5E912BD05D37874E7E89A233 /* Enumerated.swift */,\n\t\t\t\t4764F518EAB30C5EA82C03A5607ED7AF /* Error.swift */,\n\t\t\t\t718741562429DAE6AA6DC455ED6883D4 /* Errors.swift */,\n\t\t\t\t5CE7CD3C7A16D2E9341BBBAB18D5D8DC /* Event.swift */,\n\t\t\t\t44775F4816D20EB134F1DBAB43BE0B3A /* Filter.swift */,\n\t\t\t\t543DFE92FBC6235F6826EF38928A7C08 /* First.swift */,\n\t\t\t\t886072F083033D493924A8BE652713ED /* Generate.swift */,\n\t\t\t\t47EB7F9271D4EAE5B4A31D5D0194BECC /* GroupBy.swift */,\n\t\t\t\tEFD30F9BBDEB87F6ADD6C3AAF8DE6E30 /* GroupedObservable.swift */,\n\t\t\t\t6DA5F27AAEF9B366933CB017942EFAA8 /* HistoricalScheduler.swift */,\n\t\t\t\t38A0B431980745BE7A67D566D79E240A /* HistoricalSchedulerTimeConverter.swift */,\n\t\t\t\t7DF9FA6B1D40855A99145762147C1690 /* ImmediateSchedulerType.swift */,\n\t\t\t\t370A313E34AF66CB8D7437ABDC3FB7F8 /* Infallible.swift */,\n\t\t\t\t40573DCBFB24CA15F7D6C33B5C73162F /* Infallible+CombineLatest+arity.swift */,\n\t\t\t\t161437331F54761E08F028DD14CDC21E /* Infallible+Create.swift */,\n\t\t\t\tEF4A8984BD7018149BDA495C7EA5FE28 /* Infallible+Operators.swift */,\n\t\t\t\tA2FFFF24B3AC3570742D7F2CCF2FE3C5 /* Infallible+Zip+arity.swift */,\n\t\t\t\tEB62C29E42A50AB4AA5C6DED19DA376D /* InfiniteSequence.swift */,\n\t\t\t\tF97D53A26324CAC07AB16E21B963CF9A /* InvocableScheduledItem.swift */,\n\t\t\t\t200825C8579BF340304A9767D679EC35 /* InvocableType.swift */,\n\t\t\t\tFA1467E6A8A0A5B978108FDFC868000E /* Just.swift */,\n\t\t\t\tCA0A6C3DB39AD5C25FF5B1A9F554E228 /* Lock.swift */,\n\t\t\t\t683395CCE980D15405934DC5E2BCD682 /* LockOwnerType.swift */,\n\t\t\t\t98B151536C20EA366FDBE99C5A8BB7A5 /* MainScheduler.swift */,\n\t\t\t\t494A67061DAFFD52534BC4699A8DF637 /* Map.swift */,\n\t\t\t\tE4618B5826B29CA49F53BD36B1570602 /* Materialize.swift */,\n\t\t\t\t5219820998BC7D8238F0F05F90A3D96F /* Maybe.swift */,\n\t\t\t\t5CA0D236EFCE9E4E77F9A2B2A0AF3FC4 /* Merge.swift */,\n\t\t\t\tCD90405BE5311F3F3A8CFCFABCCF3560 /* Multicast.swift */,\n\t\t\t\tF961756C2E9DE7614DBA1271483EB245 /* Never.swift */,\n\t\t\t\tE6B674A528A68BF8E6AB4A5F747B05B8 /* NopDisposable.swift */,\n\t\t\t\t636937DE6DA6CE01D7E94282A16BC9D9 /* Observable.swift */,\n\t\t\t\t4618A8C418D70264404BBAF10EE3A1F4 /* ObservableConvertibleType.swift */,\n\t\t\t\t834EB5666F2D27EDBD25C600C80DF7CE /* ObservableConvertibleType+Infallible.swift */,\n\t\t\t\t4338C646A92E1539E9BED963FC618602 /* ObservableType.swift */,\n\t\t\t\tC713517A8C0251C9EEB925D43C63A544 /* ObservableType+Extensions.swift */,\n\t\t\t\t1AA3BEB86C50C2AAE9CCEDB0171CFC56 /* ObservableType+PrimitiveSequence.swift */,\n\t\t\t\tFD39BD9C1B852EC7AC7CD7D77D1E606F /* ObserveOn.swift */,\n\t\t\t\tCE8BA32B7F7B571C37D44747CBB93955 /* ObserverBase.swift */,\n\t\t\t\t7B00E954AA2FCFDF5ACDEC8CD8C6941E /* ObserverType.swift */,\n\t\t\t\tAC4C66DE7DB1A4B525929AEF699AC3CE /* OperationQueueScheduler.swift */,\n\t\t\t\t5158C591583049B150EC9F57DC2FA656 /* Optional.swift */,\n\t\t\t\tFAABDBC186233AEF9876B5A4F009C8B8 /* Platform.Darwin.swift */,\n\t\t\t\t4FF704B43D944C2399606B76A430F1A6 /* Platform.Linux.swift */,\n\t\t\t\t280A80C3BD890370005C094FC4C3DC12 /* PrimitiveSequence.swift */,\n\t\t\t\tA8C417EB740CAC7F2602C6D8880E7737 /* PrimitiveSequence+Zip+arity.swift */,\n\t\t\t\tD96D37A7C37C05D7DEEAE9B3944CC4DD /* PriorityQueue.swift */,\n\t\t\t\t4FDB60114950AF3BF06EF9DA0AF9E5AC /* Producer.swift */,\n\t\t\t\tFE18557905075BFBE5AFBE3A0D9287F4 /* PublishSubject.swift */,\n\t\t\t\t960C49C6C3C5E2554CA3CD8EB86B61AC /* Queue.swift */,\n\t\t\t\t2096522151041770121528F182B6F42D /* Range.swift */,\n\t\t\t\t0C0FB7A81FC88101C56EABF826BD78F5 /* Reactive.swift */,\n\t\t\t\t11DD125BCF1FDD4E34715800EC2F295F /* RecursiveLock.swift */,\n\t\t\t\t40FC23633FFFBBD0FA165FB284958F8C /* RecursiveScheduler.swift */,\n\t\t\t\tD894FDA92A29CEECD7D1E50C263F1777 /* Reduce.swift */,\n\t\t\t\tB97E5FCD7744551B43A8C353FD79E774 /* RefCountDisposable.swift */,\n\t\t\t\t45BF55923F2D3657D9D5420E606B641F /* Repeat.swift */,\n\t\t\t\t96D93775EA307729314581C5C539C487 /* ReplaySubject.swift */,\n\t\t\t\tAADC2D51259367D2BB2C73816E5A35CD /* RetryWhen.swift */,\n\t\t\t\tD54CB24891D5C94C81CAED6F6D1D4FAB /* Rx.swift */,\n\t\t\t\t530CEAEC9F4BC5F2EC9C9534779927A3 /* RxMutableBox.swift */,\n\t\t\t\tEBC071EBDAC90F82FF4D25D024A5AACF /* Sample.swift */,\n\t\t\t\t32777B9FE68F64D911474F7B7595C94C /* Scan.swift */,\n\t\t\t\tF0D4493458E5817BA46B4318626487F6 /* ScheduledDisposable.swift */,\n\t\t\t\t8663196F6A9678BFC77A8E46F8666C75 /* ScheduledItem.swift */,\n\t\t\t\t19FF8B675AE7A3F0AB7CDE7C48E8082A /* ScheduledItemType.swift */,\n\t\t\t\tA0791E5EB9ADBB88CEE0BCD83DA9502C /* SchedulerServices+Emulation.swift */,\n\t\t\t\t111E9F3F4997D0ACA2E0BCDAF269904C /* SchedulerType.swift */,\n\t\t\t\t172B845C32EEB48FD9EF1A11CC432D51 /* Sequence.swift */,\n\t\t\t\t408AEB2CFB972D5D82E41BB027E6686C /* SerialDispatchQueueScheduler.swift */,\n\t\t\t\t6DAFFC9484B606CC3A8583B2085B7957 /* SerialDisposable.swift */,\n\t\t\t\t72D91E08E6C75E1F0DBACD4FF3CA2F55 /* ShareReplayScope.swift */,\n\t\t\t\tA3E96B8BC40FDC92B51E51B50F126573 /* Single.swift */,\n\t\t\t\tFCF992D22D15D6CF73AF4D310FEE871C /* SingleAssignmentDisposable.swift */,\n\t\t\t\tA2B10B3F59B2394712B672A72C5827F0 /* SingleAsync.swift */,\n\t\t\t\tB304846A96173EC0E0631D07751C0893 /* Sink.swift */,\n\t\t\t\t07B4CEF97C27B2FE6205EE1D720BFB39 /* Skip.swift */,\n\t\t\t\tA1D0AF20D0BF5465039BB88836A959B6 /* SkipUntil.swift */,\n\t\t\t\t904A920F44C4C4A18874A6A62A3ED759 /* SkipWhile.swift */,\n\t\t\t\t864BF009AFF7BFF4D8B68869FC885957 /* StartWith.swift */,\n\t\t\t\t44D9E4509154BFFEBEA9AEA0C935EC9E /* SubjectType.swift */,\n\t\t\t\t17A8B6DADE1F343EA5319D5964E84B71 /* SubscribeOn.swift */,\n\t\t\t\tDAFB048690381EFB0893639F33D3C764 /* SubscriptionDisposable.swift */,\n\t\t\t\t0BC06E9EC97DF3F5E3AB732D978BD66B /* SwiftSupport.swift */,\n\t\t\t\tF4786526A5AD085C95AC191C7253C591 /* Switch.swift */,\n\t\t\t\tA20673B8CBA1827BCAE8A9CDEAF0CDC5 /* SwitchIfEmpty.swift */,\n\t\t\t\tF3623071AC720B9C13DD1043F7052A73 /* SynchronizedDisposeType.swift */,\n\t\t\t\t95A61E2BD71E9AE873207EFE8994362B /* SynchronizedOnType.swift */,\n\t\t\t\t1FA62A0165A7A8D001536C62FD5E2392 /* SynchronizedUnsubscribeType.swift */,\n\t\t\t\t558A95B0EAE7FAFDFCC334A1E9277C19 /* TailRecursiveSink.swift */,\n\t\t\t\t273C90965AA81CCFE4CDA40530425746 /* Take.swift */,\n\t\t\t\t73118DDBDD8A625213B479BD40C4B9CE /* TakeLast.swift */,\n\t\t\t\t6327835932D3C270A640C0C76A860EB8 /* TakeWithPredicate.swift */,\n\t\t\t\t127B3965CEBAEBFB395F0D10B7C255FB /* Throttle.swift */,\n\t\t\t\t661DD8158386E15481E17DE6E2FA1882 /* Timeout.swift */,\n\t\t\t\tF893DD80BE166F23DB8567A0940B0FEE /* Timer.swift */,\n\t\t\t\t314A2DB247EA6781CE45C5C146496327 /* ToArray.swift */,\n\t\t\t\tFE3AAA7586F734974B628C45E2310229 /* Using.swift */,\n\t\t\t\t4673D1BC54F57F490E2D3352F6BA1B73 /* VirtualTimeConverterType.swift */,\n\t\t\t\t6A2828DE92C9CEECE9FB19F2EE763305 /* VirtualTimeScheduler.swift */,\n\t\t\t\t855607DC318E2CF3120B3C70565140A0 /* Window.swift */,\n\t\t\t\tA49E3489F755F888C3405824694827BF /* WithLatestFrom.swift */,\n\t\t\t\t897003218412D0C779A54DAAD7D2A4EE /* WithUnretained.swift */,\n\t\t\t\t9FA0DBB3C5358A6E4EF0C16145BB0F7E /* Zip.swift */,\n\t\t\t\tABD89974F6EA342767735D559995D3FA /* Zip+arity.swift */,\n\t\t\t\t3677CB82C594C5820F17431AA45C5C87 /* Zip+Collection.swift */,\n\t\t\t\t5E0AA8A2AD4F95EB8CD37C35E2FC5D26 /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxSwift;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6B3DE0B21DFC168E060A8E9C9EC74C3A /* RxRelay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D796FDCC7398C88D7B835BD89700D56 /* BehaviorRelay.swift */,\n\t\t\t\t0A18EEA4857408358F9A8E6ED8AF8829 /* Observable+Bind.swift */,\n\t\t\t\tCA7211C3393B6E1ED0E57C4CCF5F5005 /* PublishRelay.swift */,\n\t\t\t\t485A8E801F2DA21AB5D16808AE1B4887 /* ReplayRelay.swift */,\n\t\t\t\t29BFF21F894144F23E9F778185A1EBC4 /* Utils.swift */,\n\t\t\t\tE9E177E10E9704C8136B4410D7F621DB /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxRelay;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7D5BF41D87EA0E33C1D9986ADA4BDA51 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC771BA2A255CC372CD2AB83291BD3E1C /* GCDWebServer.h */,\n\t\t\t\t55F5FEB17D952CAA64A6B7DE90D7E47D /* GCDWebServer.m */,\n\t\t\t\t6D0B40D5A184825074ECC549693CAF02 /* GCDWebServerConnection.h */,\n\t\t\t\t1410700BFA8AF785CCF9919941F9930C /* GCDWebServerConnection.m */,\n\t\t\t\t36E9C273C636D7A0C559787BD1FABA68 /* GCDWebServerDataRequest.h */,\n\t\t\t\t7DFEE31FDCAA3B9A85119C45EE5BF376 /* GCDWebServerDataRequest.m */,\n\t\t\t\tC21721CAB3BC76F0D7582BD636DB821D /* GCDWebServerDataResponse.h */,\n\t\t\t\tAB7765E1848A0449B3E3267F17DDE12E /* GCDWebServerDataResponse.m */,\n\t\t\t\t9EE8B6717B73CE07A9FAC17FFCB1BA91 /* GCDWebServerErrorResponse.h */,\n\t\t\t\t199E49652A8B30754D25980910F956E1 /* GCDWebServerErrorResponse.m */,\n\t\t\t\t962EFFE0B39AFE334DBCAF81B4DBFE56 /* GCDWebServerFileRequest.h */,\n\t\t\t\t392538EA12C4E3008D6EF1ABB226B3BF /* GCDWebServerFileRequest.m */,\n\t\t\t\t77E73C4E3CAF9AD8FAE2EA9130D6A37E /* GCDWebServerFileResponse.h */,\n\t\t\t\t5BC543740C092C697A08396093A0F7BD /* GCDWebServerFileResponse.m */,\n\t\t\t\tDD31B6D267ADAB9B30F51F821C60554A /* GCDWebServerFunctions.h */,\n\t\t\t\t0555618E1BBA944D30E358F0700CDD8B /* GCDWebServerFunctions.m */,\n\t\t\t\t57BEC3094A7FB642608645E131DA83D4 /* GCDWebServerHTTPStatusCodes.h */,\n\t\t\t\tD157799A728D6FFED669C62E86BABD73 /* GCDWebServerMultiPartFormRequest.h */,\n\t\t\t\t0C1C25377D5ADEBBE1E5B44FD42F2BF8 /* GCDWebServerMultiPartFormRequest.m */,\n\t\t\t\t10F2E7253B70490BD80C987E65C522AC /* GCDWebServerPrivate.h */,\n\t\t\t\tA4395BE2A0C53A82170A01602870453A /* GCDWebServerRequest.h */,\n\t\t\t\tD4E3DADB00C8898A4A01F4DF1034F96C /* GCDWebServerRequest.m */,\n\t\t\t\t89066EEDE0D03A9B328DADDC9344CC13 /* GCDWebServerResponse.h */,\n\t\t\t\tC40D7DCF882E3A5609EDE1602335E721 /* GCDWebServerResponse.m */,\n\t\t\t\tAE4742C0047EC328BE64C1DF6D868CEF /* GCDWebServerStreamedResponse.h */,\n\t\t\t\tDAE48A7C993FBD43A674E228A900457B /* GCDWebServerStreamedResponse.m */,\n\t\t\t\t97319F4B64360DC3D794BD7B57BC9936 /* GCDWebServerURLEncodedFormRequest.h */,\n\t\t\t\tDC40BD5F1E0BFED23CB5A6AE57FA4443 /* GCDWebServerURLEncodedFormRequest.m */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9D9694B208E8690D485FD95D4A4C8CAA /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t18B45BFB16E63DDF1AFB6C167D70D1C2 /* cs.lproj */,\n\t\t\t\t8F90CD66F125C28F8983AFCFA7DF6607 /* de.lproj */,\n\t\t\t\t4A797B2A249C56CB61DB60A3FEA31FD2 /* en.lproj */,\n\t\t\t\t4504CA755CE81F89F9F165BF93126D21 /* es.lproj */,\n\t\t\t\tB68B5F9FDDB0D41979766C1D549A8780 /* fr.lproj */,\n\t\t\t\t321FC2ED515952B66BACDB8CAC130EB4 /* it.lproj */,\n\t\t\t\tB1F34EB08D07E2AF230CDA30F361889D /* ja.lproj */,\n\t\t\t\tA254689F2908346AD7387F063C24B41A /* ko.lproj */,\n\t\t\t\tA94A0417121D2C31F7167E4A79EC5313 /* nl.lproj */,\n\t\t\t\tEE873D31D9227598B067D9426D366009 /* pl.lproj */,\n\t\t\t\tFAB6166D07AACCBF2B4A5FFC66F22602 /* pt.lproj */,\n\t\t\t\t9A3F0ED147035005ABA4D679F9E36A7B /* ru.lproj */,\n\t\t\t\tFDF7D102C3DA0493A530D68E569DA7CF /* sv.lproj */,\n\t\t\t\tB2BCE49AE180E28B89BBBE037DF32A2F /* zh-Hans.lproj */,\n\t\t\t\tB5D8A52DE9A6385138A6D20CB5527DDB /* zh-Hant.lproj */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA1DDAA49ED6DA408AC4F6220754154E6 /* Pods-proxy_conf_helper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t74656C1BF53AED56A45CDA8600A787D1 /* Pods-proxy_conf_helper-acknowledgements.markdown */,\n\t\t\t\t11F97CBA2FD3653262BC227DD1340D90 /* Pods-proxy_conf_helper-acknowledgements.plist */,\n\t\t\t\t8752D17209EE8AAD7681107D6444113F /* Pods-proxy_conf_helper-dummy.m */,\n\t\t\t\tD8C88B0B7BFE785BC9B00D1C53FDC003 /* Pods-proxy_conf_helper.debug.xcconfig */,\n\t\t\t\t4A70BE8C07BCE9C6D6F47AC73225C959 /* Pods-proxy_conf_helper.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-proxy_conf_helper\";\n\t\t\tpath = \"Target Support Files/Pods-proxy_conf_helper\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAF01C03E9E6BF3B668D35EEF202AD7A0 /* RxCocoa */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BAD385D5CDC39C1AE6584A123D2DFC4 /* _RX.h */,\n\t\t\t\t74E6FB11E3F38127740B54FF3C72D1EF /* _RX.m */,\n\t\t\t\t30E50B8D09D21C042020DA82FA315C59 /* _RXDelegateProxy.h */,\n\t\t\t\t6AD4414199F479D544CBF1FFF3FB45E4 /* _RXDelegateProxy.m */,\n\t\t\t\tA8A33670952794CBD825EC26F1A98DBF /* _RXKVOObserver.h */,\n\t\t\t\tA14B9E97BE00B01372727FA8DA9B10A3 /* _RXKVOObserver.m */,\n\t\t\t\t6985BD62945B0A86382437BC1758C282 /* _RXObjCRuntime.h */,\n\t\t\t\t638797412ABBF2F7725016AF4B056309 /* _RXObjCRuntime.m */,\n\t\t\t\t2BDFA1D8F5CB80DCE3773C11691B223D /* Bag.swift */,\n\t\t\t\t98EF0EFA057CC202BD041F55B091661A /* BehaviorRelay+Driver.swift */,\n\t\t\t\t38724BD70D1712C03FA9B7A4C417144D /* ControlEvent.swift */,\n\t\t\t\t4C0E4BDE3E30AF8C9062AFAD9C3AEA28 /* ControlEvent+Driver.swift */,\n\t\t\t\t9C3A35E7DD83A1437478608A9F2EF44C /* ControlEvent+Signal.swift */,\n\t\t\t\t5878F666B9410A53C5BBE1778D1B2CCE /* ControlProperty.swift */,\n\t\t\t\t97D6BD38BB9E0F241C3C82A118E7F253 /* ControlProperty+Driver.swift */,\n\t\t\t\t5DA6A1DA8589C7192C8BFDBC3F4A9913 /* ControlTarget.swift */,\n\t\t\t\tBB63C0EAF763E45BC31AAB9802F87995 /* DelegateProxy.swift */,\n\t\t\t\tDBB7AE66363DEA0FFF31BA0AD1EB9340 /* DelegateProxyType.swift */,\n\t\t\t\t29E3014CE53E3127CCD38149E2060C76 /* DispatchQueue+Extensions.swift */,\n\t\t\t\t5E698A2854CB4D9E919B55523EB57D1A /* Driver.swift */,\n\t\t\t\tD7F46244A2FF95EF2B228E2F76529358 /* Driver+Subscription.swift */,\n\t\t\t\t36C45F96BE0AE01F3BB2C90370A73616 /* Infallible+Bind.swift */,\n\t\t\t\tEC8F5BC5CABB65CCD832B9821F532DBD /* InfiniteSequence.swift */,\n\t\t\t\t684F8C697CD894D0F5680EE542AC32E9 /* ItemEvents.swift */,\n\t\t\t\t54F202B17AB2C7DC4FEC3F1CF2B5FD57 /* KVORepresentable.swift */,\n\t\t\t\tC70C13D2EC9B57E48D64BD7ABC49F9D6 /* KVORepresentable+CoreGraphics.swift */,\n\t\t\t\t6EB5DBBABE4FD6FFF0223AC1BC4674DB /* KVORepresentable+Swift.swift */,\n\t\t\t\tDE18F7CA6E337EA48867C7D92143B6F9 /* NotificationCenter+Rx.swift */,\n\t\t\t\t6DFC3F4E49698472F1AA8DE21B1BD0F2 /* NSButton+Rx.swift */,\n\t\t\t\tAAFFAAB92EFEC042FEE2F851EF9C6CC0 /* NSControl+Rx.swift */,\n\t\t\t\tC119A4F639217703B4B382419AF9D4EF /* NSObject+Rx.swift */,\n\t\t\t\t7B00813C768C553C089DAF0C1900799B /* NSObject+Rx+KVORepresentable.swift */,\n\t\t\t\t4C9EBFDB861299F7DC1241C7FCFF00DD /* NSObject+Rx+RawRepresentable.swift */,\n\t\t\t\t5874107EF4581DA493B60BBCFE422D1C /* NSSlider+Rx.swift */,\n\t\t\t\t2C81F8C45A4C248E266304541A86B5A8 /* NSTextField+Rx.swift */,\n\t\t\t\tE35662841C2AAA3188CD9ADFDC38880F /* NSTextStorage+Rx.swift */,\n\t\t\t\t5800B274C19C06FB1CA12AC039704852 /* NSTextView+Rx.swift */,\n\t\t\t\tC4028B836251B6DD18772CF35047686A /* NSView+Rx.swift */,\n\t\t\t\tE8976DA3C1E5870E7B74F26E219A9885 /* Observable+Bind.swift */,\n\t\t\t\tE14C791F6C2C8320DE732C78C55306A1 /* ObservableConvertibleType+Driver.swift */,\n\t\t\t\tDFAC6355D5B0FD94083A74B4602AF9D2 /* ObservableConvertibleType+SharedSequence.swift */,\n\t\t\t\tC3DCF3854C69F5239CE7E89C1FCFAA51 /* ObservableConvertibleType+Signal.swift */,\n\t\t\t\t8E801F2049749D5BA709EAE3A2028661 /* Platform.Darwin.swift */,\n\t\t\t\t2586C5A6499D4E9A6B62C1CF5804DE66 /* Platform.Linux.swift */,\n\t\t\t\tA3A89F3DBB03CFC012C901EB6D452A3B /* PriorityQueue.swift */,\n\t\t\t\t758B67811993E4C5163D7637EDBB6CFD /* PublishRelay+Signal.swift */,\n\t\t\t\t9B23D7AFD516825208E6CE9B362989DB /* Queue.swift */,\n\t\t\t\t5554F4E6979C7DDD1E00F81CB94D474D /* RecursiveLock.swift */,\n\t\t\t\t7EB9FE74C8220E21EC9A5A77098E9152 /* RxCocoa.h */,\n\t\t\t\tB1816E3DFE7F11350A74B0C1F878F7FC /* RxCocoa.swift */,\n\t\t\t\t9F666DF6A38D74980DF6F191509F4971 /* RxCocoaObjCRuntimeError+Extensions.swift */,\n\t\t\t\t95F05E167015F6A202D2BEB9437AE766 /* RxCocoaRuntime.h */,\n\t\t\t\t78275DA82CA025902C1D6FAF39BC9403 /* RxCollectionViewDataSourcePrefetchingProxy.swift */,\n\t\t\t\tC5BD2C8DB205D16490D3804A6CAB6C50 /* RxCollectionViewDataSourceProxy.swift */,\n\t\t\t\tC0D1BF03B3F26978B85F2E44EBE18FC1 /* RxCollectionViewDataSourceType.swift */,\n\t\t\t\tB9215F3DCBD2FE1BDADCEF5D05219A48 /* RxCollectionViewDelegateProxy.swift */,\n\t\t\t\tB25AD05D537735CCA21E1986D98F830E /* RxCollectionViewReactiveArrayDataSource.swift */,\n\t\t\t\t52DFCC55A239674DEF17871D293D227C /* RxNavigationControllerDelegateProxy.swift */,\n\t\t\t\tF979292485788BE53E5871123C74EB10 /* RxPickerViewAdapter.swift */,\n\t\t\t\tEC44E7C397DF9B77CEF6F5C86EFCE92A /* RxPickerViewDataSourceProxy.swift */,\n\t\t\t\t961D7CAE484B6E4929A7BE5B048D29B5 /* RxPickerViewDataSourceType.swift */,\n\t\t\t\t22D41ECF1E34CC3D83A32F7896831100 /* RxPickerViewDelegateProxy.swift */,\n\t\t\t\t7B58732AA1AF7EA39B29A8BE85721F26 /* RxScrollViewDelegateProxy.swift */,\n\t\t\t\t345AE1A0C847584A14AD381D5E476AB9 /* RxSearchBarDelegateProxy.swift */,\n\t\t\t\t474547C10494F37402A98A0BFC7E6288 /* RxSearchControllerDelegateProxy.swift */,\n\t\t\t\t39D9FF9E1CBB62DA6FC1910AA45EB039 /* RxTabBarControllerDelegateProxy.swift */,\n\t\t\t\t66D1DACD1512DCFE82BC525C443DA8A5 /* RxTabBarDelegateProxy.swift */,\n\t\t\t\tC15539256AFFEE061C9DE9660B995B25 /* RxTableViewDataSourcePrefetchingProxy.swift */,\n\t\t\t\tADC06A8D8266504D3FD0F38F5F1A87AD /* RxTableViewDataSourceProxy.swift */,\n\t\t\t\tD418B4DEE726BA9D5A912D8F1FBF0888 /* RxTableViewDataSourceType.swift */,\n\t\t\t\tB5B1AE9FCFABDD97172220DFDFE618E5 /* RxTableViewDelegateProxy.swift */,\n\t\t\t\tB265FABD755D21851D1C166921BB4A24 /* RxTableViewReactiveArrayDataSource.swift */,\n\t\t\t\t6B37E46EBF28CB6542B58754F09D8AAA /* RxTarget.swift */,\n\t\t\t\t95B33DD3F11E0587A32ECE709173E4EF /* RxTextStorageDelegateProxy.swift */,\n\t\t\t\t531091EE9FF408558B83A1E053360F67 /* RxTextViewDelegateProxy.swift */,\n\t\t\t\t3AC418FEB3CC60F42D6A18E6151C871A /* RxWKNavigationDelegateProxy.swift */,\n\t\t\t\t53EB3CB0FCC5ABA4F18B576E6BA4EB1F /* SchedulerType+SharedSequence.swift */,\n\t\t\t\tA4177B545582D09C0D653414E6353741 /* SectionedViewDataSourceType.swift */,\n\t\t\t\t4F401550E51DCC5F5746B99EC564065B /* SharedSequence.swift */,\n\t\t\t\tD18636DE7B757847E9D7B9E45CA10DE2 /* SharedSequence+Operators.swift */,\n\t\t\t\t87A94DCCD78781BAE448DEA818B26DE4 /* SharedSequence+Operators+arity.swift */,\n\t\t\t\t8E4505859B317DCDCC426973F6C7153D /* Signal.swift */,\n\t\t\t\t12318B6E6BA8040BCC422023A5ABEF27 /* Signal+Subscription.swift */,\n\t\t\t\t1DBE368EA1C6F7EBE80E08054C9BC6AE /* TextInput.swift */,\n\t\t\t\t89A41E2A66DF6A8547AFAB72FE74B6A2 /* UIActivityIndicatorView+Rx.swift */,\n\t\t\t\tC78EDD95C0B56A70BE237D148A1726CA /* UIApplication+Rx.swift */,\n\t\t\t\tCB340F626B32E3AF98F1E13658FB46E2 /* UIBarButtonItem+Rx.swift */,\n\t\t\t\t17F9F190DDBE93E38A56D8405CBFA664 /* UIButton+Rx.swift */,\n\t\t\t\tD49EC557FA27872611535147AB5D700C /* UICollectionView+Rx.swift */,\n\t\t\t\t9C1FFDE936B5B805CB094F77E95A88FC /* UIControl+Rx.swift */,\n\t\t\t\t46A83A815027A06FB7A8AB2CEDF56368 /* UIDatePicker+Rx.swift */,\n\t\t\t\tD87FAE60EB40AC65B2E5000C6B82DFEB /* UIGestureRecognizer+Rx.swift */,\n\t\t\t\t6D742A8B753D54115AD3C6D293B64276 /* UINavigationController+Rx.swift */,\n\t\t\t\t608BE9EFB078FCC2348EF2782C265D92 /* UIPickerView+Rx.swift */,\n\t\t\t\t506B13C445D67D7231C25641361EE5A1 /* UIRefreshControl+Rx.swift */,\n\t\t\t\t441E899D371A5638D8CBD0A21A8CCA61 /* UIScrollView+Rx.swift */,\n\t\t\t\t2888FA81FD2BE4D3B068BCE4AFDC9A93 /* UISearchBar+Rx.swift */,\n\t\t\t\t8ED0DC48A18FD32A95BE8B28D715172C /* UISearchController+Rx.swift */,\n\t\t\t\tE39E7221D0BA332CC5AC5DD0A7C16C92 /* UISegmentedControl+Rx.swift */,\n\t\t\t\t466B399C2E7FFAA61B709F2AB447ECDF /* UISlider+Rx.swift */,\n\t\t\t\t1B2134E06DD0F0E19694ADD2E46E9EF0 /* UIStepper+Rx.swift */,\n\t\t\t\t3622945DEBFCB14514027A236BDFC74C /* UISwitch+Rx.swift */,\n\t\t\t\t21F927D22EA76A49C54C44827DD1CE5A /* UITabBar+Rx.swift */,\n\t\t\t\t9D4701E49CFDE5F411CDFD316EDD3C70 /* UITabBarController+Rx.swift */,\n\t\t\t\t51E7C258B34B55C44CAA679574F0B5E1 /* UITableView+Rx.swift */,\n\t\t\t\t877FA6BB936631CD8F2CA0DFFF6EFC9C /* UITextField+Rx.swift */,\n\t\t\t\tA4BB8686A6F85698D8AC03A77D188340 /* UITextView+Rx.swift */,\n\t\t\t\tEAB5B580FE6B602D602E607C7BC7C470 /* URLSession+Rx.swift */,\n\t\t\t\tFDCA53BCCEFF4720A955F8202537A982 /* WKWebView+Rx.swift */,\n\t\t\t\t5E93897366D3A44BA737EB9FE037DDB1 /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxCocoa;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB364CCC64531E6C6BC03A50131504939 /* Pods-ShadowsocksX-NG */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1EA29F7E0E65B6A9619DB77448844EC1 /* Pods-ShadowsocksX-NG.modulemap */,\n\t\t\t\tA907FA326D15CD08847B63032F80EB64 /* Pods-ShadowsocksX-NG-acknowledgements.markdown */,\n\t\t\t\tFB50A95F3BC6DC12244F2B76ABEBB9BD /* Pods-ShadowsocksX-NG-acknowledgements.plist */,\n\t\t\t\tD60357581333E7EC56952E31B2991366 /* Pods-ShadowsocksX-NG-dummy.m */,\n\t\t\t\t2A11F032AFA3310A3EEE63E67481B01E /* Pods-ShadowsocksX-NG-frameworks.sh */,\n\t\t\t\t96C80DBAD0A8D59912E005E60636A935 /* Pods-ShadowsocksX-NG-Info.plist */,\n\t\t\t\tCD95085BFAA31431686824B236DB9319 /* Pods-ShadowsocksX-NG-umbrella.h */,\n\t\t\t\t9A71B9958F30759ED2645E0DF9ADF314 /* Pods-ShadowsocksX-NG.debug.xcconfig */,\n\t\t\t\t92B4BB091693150E5B1FCC6987683C6F /* Pods-ShadowsocksX-NG.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-ShadowsocksX-NG\";\n\t\t\tpath = \"Target Support Files/Pods-ShadowsocksX-NG\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCF1408CF629C7361332E53B88F7BD30C = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,\n\t\t\t\t4C712514E3CDE5A583F0DA94CB23FB65 /* Frameworks */,\n\t\t\t\t14F38608C29A913E1DD0D624DE663510 /* Pods */,\n\t\t\t\tE786B58AC38A5957ED28E1C47257C01E /* Products */,\n\t\t\t\t493933EC245DE8B9BF6A90C4A901306A /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD20BAD07D23FBA7AA269B9FA80FE8BF3 /* BRLOptionParser */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t31F9576864749334961DE762B01B777C /* BRLOptionParser.h */,\n\t\t\t\t68C9C3CF6142E1B32695BC562ECAC427 /* BRLOptionParser.m */,\n\t\t\t\t165807E7BFFB1F57C0BA71AD827D588F /* Support Files */,\n\t\t\t);\n\t\t\tpath = BRLOptionParser;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD71126DFC6989B0EEE224402B0C7852C /* MASShortcut */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t353B178196A1B3A383089B3D1006F66A /* MASDictionaryTransformer.h */,\n\t\t\t\tF6460C30C5328ED85A1103897C8CB63C /* MASDictionaryTransformer.m */,\n\t\t\t\t8937D9E4BB1CD1D979DFF21019B4D814 /* MASHotKey.h */,\n\t\t\t\t7BE4993AB90D97D332E61EB54E0C3C9A /* MASHotKey.m */,\n\t\t\t\t73327356D8055C270C5AFBAEE0D202DD /* MASKeyCodes.h */,\n\t\t\t\t867FD5BBBCAC1E98FE144867305F8FEF /* MASKeyMasks.h */,\n\t\t\t\t82A2597C8D9860F95F40565C0631A47D /* MASLocalization.h */,\n\t\t\t\t46DA81F6288F2733B7F27CCDE97EA2C4 /* MASLocalization.m */,\n\t\t\t\tA2B9727C5385989526550D8E1AC4649A /* MASShortcut.h */,\n\t\t\t\t7A4A724DBFF9C1C260A76A4B104F3B1E /* MASShortcut.m */,\n\t\t\t\tA18A7F7794D2CC58900E95F6644D63E8 /* MASShortcutBinder.h */,\n\t\t\t\t46002374E8C8C6F2127C7C9A6DFEF743 /* MASShortcutBinder.m */,\n\t\t\t\t24121C8FA3C10947BE50901868F9198A /* MASShortcutMonitor.h */,\n\t\t\t\t605C26B2F1FFA16F0E85E33F5CC526EC /* MASShortcutMonitor.m */,\n\t\t\t\t8E796A67AE756E845646324A31731334 /* MASShortcutValidator.h */,\n\t\t\t\t726DEA3A84065F8E12FDE5617447B366 /* MASShortcutValidator.m */,\n\t\t\t\tA2EEB1D58595D58C5DC8978116BE0648 /* MASShortcutView.h */,\n\t\t\t\t7C73921B2C710D3814A33EF328D04D20 /* MASShortcutView.m */,\n\t\t\t\tB5AEEDAA3124911175E2336A08227588 /* MASShortcutView+Bindings.h */,\n\t\t\t\t7C471325C18D493A8244DEB1563B18B6 /* MASShortcutView+Bindings.m */,\n\t\t\t\t6B9491CF676F85A85C4F0987D38F9051 /* Shortcut.h */,\n\t\t\t\t9D9694B208E8690D485FD95D4A4C8CAA /* Resources */,\n\t\t\t\t4AE2520FB25EC7AF2FA83B8E69D00ED0 /* Support Files */,\n\t\t\t);\n\t\t\tpath = MASShortcut;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE786B58AC38A5957ED28E1C47257C01E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */,\n\t\t\t\tB68C1052A3B51DBCF7D960F898AAFA95 /* GCDWebServer.framework */,\n\t\t\t\t866C21955F27EBD7A49148F5E63A6E7E /* libBRLOptionParser.a */,\n\t\t\t\t61C23DB60A84900CD4BDA2F5EE2A0865 /* libPods-proxy_conf_helper.a */,\n\t\t\t\t230F8208BE63C052A548A7D41A1158B2 /* MASShortcut.bundle */,\n\t\t\t\t26A8810424438A12E7ADBFB3E068C658 /* MASShortcut.framework */,\n\t\t\t\tD896F6A68919914B3302027C15449A1D /* Pods_ShadowsocksX_NG.framework */,\n\t\t\t\tD48183AD5F98D081078429EF56451DFF /* Pods_ShadowsocksX_NGTests.framework */,\n\t\t\t\tBC432FD48A5932251F1CAFBC4BF74894 /* RxCocoa.framework */,\n\t\t\t\tFF8B264DFE802855D5D67E7CDDABFC3C /* RxRelay.framework */,\n\t\t\t\t809C5FAB588354C9BA37DC3EAB8CB45C /* RxSwift.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE9E177E10E9704C8136B4410D7F621DB /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t38A6B331CD11EA3ADC9BE7CFD5DE99DA /* RxRelay.modulemap */,\n\t\t\t\t1718F5B8FAF3CE57AE64B5F53589493F /* RxRelay-dummy.m */,\n\t\t\t\t52786C2AA26607ED32FA242D407DEC3D /* RxRelay-Info.plist */,\n\t\t\t\tA01C872DE26A61BFEF081FC71E72A0D0 /* RxRelay-prefix.pch */,\n\t\t\t\t2DDC82F5641636881356BF49166C8DF3 /* RxRelay-umbrella.h */,\n\t\t\t\tBF25DE5F0433D7BA7D6F91A5F113542A /* RxRelay.debug.xcconfig */,\n\t\t\t\tD70A973E907BDE134197952FF14301CE /* RxRelay.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxRelay\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEE196A86A60DA3C09134F038D0679871 /* OS X */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEA187A944BB7C96464B1E79E6D12F90F /* AppKit.framework */,\n\t\t\t\t62F5D09616527A0713F24DF416BEC64F /* Carbon.framework */,\n\t\t\t\t817D9055D7659CAC86800D119F65E0F4 /* CFNetwork.framework */,\n\t\t\t\tEE6672D913C4CDAB5BAC161BDC483A67 /* Cocoa.framework */,\n\t\t\t\tEF91750DCDE73B687E4BA164856BE224 /* SystemConfiguration.framework */,\n\t\t\t);\n\t\t\tname = \"OS X\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF7E043D77B41FA3B6662AD3E792046E8 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDFA75B434E18E0DA5F6DEB758B437261 /* GCDWebServer.modulemap */,\n\t\t\t\t09A0680C8640FDF225CF2A27A4204628 /* GCDWebServer-dummy.m */,\n\t\t\t\tA2738BBB0867C27512A99A3C9DBB2F1E /* GCDWebServer-Info.plist */,\n\t\t\t\tBF07A24C96313F878506258234883CC8 /* GCDWebServer-prefix.pch */,\n\t\t\t\tB400BB6631F1C9F8534BE1CEF160097E /* GCDWebServer-umbrella.h */,\n\t\t\t\tB81749D1C6130BC14B2386B76041124F /* GCDWebServer.debug.xcconfig */,\n\t\t\t\t2094BFBE78A2839B3C673A3E450C77FC /* GCDWebServer.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/GCDWebServer\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t00CE41EA22C241610DE8C8369C5F8DCC /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t65EA84D8C4EA09B4455BC6C221D2A940 /* Pods-ShadowsocksX-NGTests-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4066ADE1EACF598A77B29ECDD1BC4736 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0CA982442C8027B672202D753260BAC9 /* RxSwift-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t578CC080DFCED687B046D6BDE4585CCB /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t54FFBD61CC8FA5DD12646A7FFAAFE425 /* RxRelay-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5C92B9BF5BDADA4C1E469E82F4E59CC5 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8450D728709DB935952A5A59650DB926 /* MASDictionaryTransformer.h in Headers */,\n\t\t\t\t332D9AE4473773687AA9155EF16A80D8 /* MASHotKey.h in Headers */,\n\t\t\t\t12DF0C4E73CEC6118673050B236C7799 /* MASKeyCodes.h in Headers */,\n\t\t\t\t0EEDE530AD4098CC0660A78E2852DA6A /* MASKeyMasks.h in Headers */,\n\t\t\t\tE5F3CF900C793B92F327E2F4BDF8A8AB /* MASLocalization.h in Headers */,\n\t\t\t\t5BF5F916582D2EE625A9F0F32ECE709A /* MASShortcut-umbrella.h in Headers */,\n\t\t\t\t4D15DB973A043E9B4A47B724738A2A5F /* MASShortcut.h in Headers */,\n\t\t\t\t665FBE569EDC9AF24C721F6B9C7241EC /* MASShortcutBinder.h in Headers */,\n\t\t\t\t5263ED302CD55D6C365476F9B20AD5D1 /* MASShortcutMonitor.h in Headers */,\n\t\t\t\t72E6FED1FBFB7D269B435A3802528AA1 /* MASShortcutValidator.h in Headers */,\n\t\t\t\tF07EC9B60B1FB76D9F64FE2BC62A87DF /* MASShortcutView+Bindings.h in Headers */,\n\t\t\t\t80C7348602C99C09226B1241C02D4754 /* MASShortcutView.h in Headers */,\n\t\t\t\tC33311F020C5777D0CB7E0F61E4FED8D /* Shortcut.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6584631C190AE58FF259F0472DDC1232 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6D5EE38D1C1016BBF38E27BDF0AE819C /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCEA50BEC377AEE2AAA9DB5B71DEA418C /* BRLOptionParser.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6E03461CB76B22AB26BB407943C2763E /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE0AF255AB2AFA980F44645355BB7828C /* _RX.h in Headers */,\n\t\t\t\tAC9540D461C3407AB049AEDB94B82375 /* _RXDelegateProxy.h in Headers */,\n\t\t\t\tC83DA2E174587856EBBAAA1763F6D483 /* _RXKVOObserver.h in Headers */,\n\t\t\t\tA34F81BE4A40B0C6EF378FBB8F240C66 /* _RXObjCRuntime.h in Headers */,\n\t\t\t\tC09F690FF2734763D8D2838B0BA14B0F /* RxCocoa-umbrella.h in Headers */,\n\t\t\t\t815908B08BEA64FC0E5641D046D43CB6 /* RxCocoa.h in Headers */,\n\t\t\t\t9AA31D499392F8C3E63FE70C8DE816ED /* RxCocoaRuntime.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8070B01910C64B9AFD0DB550EDE38D6B /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7D3DD4A8BB36733BA15868F7FB8C56CE /* Alamofire-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8AC5AA6FFC615596F505AD8BD785D837 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1D5606C6BD48C543FA0DB2C82B8791B7 /* GCDWebServer-umbrella.h in Headers */,\n\t\t\t\tAECCE1EAA0757255BC4D722A53202DB0 /* GCDWebServer.h in Headers */,\n\t\t\t\t7D5AE7E56AC7636F1D00076095F57745 /* GCDWebServerConnection.h in Headers */,\n\t\t\t\t8BEDC2C0D907FBB47A65EE0E01DE2A59 /* GCDWebServerDataRequest.h in Headers */,\n\t\t\t\t901D8E9CC22C5E7FDB218557EBBB3559 /* GCDWebServerDataResponse.h in Headers */,\n\t\t\t\tF5C3C227785D45C44F1FA8157EF99C71 /* GCDWebServerErrorResponse.h in Headers */,\n\t\t\t\t4892C3EBD345FAE187A5E15D7FA19CBE /* GCDWebServerFileRequest.h in Headers */,\n\t\t\t\tD33C1AD2E019F48235F734A00CE7C24C /* GCDWebServerFileResponse.h in Headers */,\n\t\t\t\tB47372436C56EE24B909DE97D5005A64 /* GCDWebServerFunctions.h in Headers */,\n\t\t\t\tC341FC8944C28CCA39FB9AC4B0F23763 /* GCDWebServerHTTPStatusCodes.h in Headers */,\n\t\t\t\tFCBF7F9DA53A194F0653EE7E00B57BC8 /* GCDWebServerMultiPartFormRequest.h in Headers */,\n\t\t\t\tDF3FD63D6A37C12FDB09B8CA5AE80AC3 /* GCDWebServerPrivate.h in Headers */,\n\t\t\t\t6809229B402FC6C91774DA8664AD4F2F /* GCDWebServerRequest.h in Headers */,\n\t\t\t\t88F5FF298C4C3D2CDCA5EB7B0BE2B52C /* GCDWebServerResponse.h in Headers */,\n\t\t\t\t1FAEB66513E2610FE37D99FDD8F9E46D /* GCDWebServerStreamedResponse.h in Headers */,\n\t\t\t\tBD379AB5D6DF4FF97EF15732D9635186 /* GCDWebServerURLEncodedFormRequest.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE23D293CACB5C453B56EBB9A0CC37588 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF01A39BF2122BF11990A88015EF45A48 /* Pods-ShadowsocksX-NG-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t00F92A6698B766C4479D7B608F28D680 /* BRLOptionParser */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6D442598AC59E49374231C4242255CA3 /* Build configuration list for PBXNativeTarget \"BRLOptionParser\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6D5EE38D1C1016BBF38E27BDF0AE819C /* Headers */,\n\t\t\t\tDFF2B5F26ABB5074146BB93EA5DBE095 /* Sources */,\n\t\t\t\tEE0D52842751CED2CD0BD2633A30FEA4 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = BRLOptionParser;\n\t\t\tproductName = BRLOptionParser;\n\t\t\tproductReference = 866C21955F27EBD7A49148F5E63A6E7E /* libBRLOptionParser.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t2B2B481A164695722839BD581D442457 /* MASShortcut */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = E888D466E966B416D89BA302F582A3F5 /* Build configuration list for PBXNativeTarget \"MASShortcut\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5C92B9BF5BDADA4C1E469E82F4E59CC5 /* Headers */,\n\t\t\t\t7A815F2E1A9D4EFD8C4C4BD6D7DC1BCA /* Sources */,\n\t\t\t\tDA3A32D96D94A82A8FFE804468C37DB4 /* Frameworks */,\n\t\t\t\tE8A034F83F762D640CA494BF8161ED87 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t53637CA92B734D4013B9F99E7AAA9808 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = MASShortcut;\n\t\t\tproductName = MASShortcut;\n\t\t\tproductReference = 26A8810424438A12E7ADBFB3E068C658 /* MASShortcut.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t2E91F9FD8B0C7DA58DD330CBF2096926 /* Pods-ShadowsocksX-NGTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 84B5ECA69733DA3FEDC652649E6E42C5 /* Build configuration list for PBXNativeTarget \"Pods-ShadowsocksX-NGTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t00CE41EA22C241610DE8C8369C5F8DCC /* Headers */,\n\t\t\t\tF0A91985F4DA9728630FB9ABC81A8CC1 /* Sources */,\n\t\t\t\tF4AB20C615B7CE4E912D4031FF0A52C8 /* Frameworks */,\n\t\t\t\t8FA2F274BF94CAE07E4B856B3E2F5D77 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tFF103DE3A0523E2D55DE3D845DD9F0E2 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-ShadowsocksX-NGTests\";\n\t\t\tproductName = \"Pods-ShadowsocksX-NGTests\";\n\t\t\tproductReference = D48183AD5F98D081078429EF56451DFF /* Pods_ShadowsocksX_NGTests.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t4622BFEF3DC16E8BD15EEFC30D4D0084 /* RxRelay */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3797157A80385C2407F752CEE1BFEB21 /* Build configuration list for PBXNativeTarget \"RxRelay\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t578CC080DFCED687B046D6BDE4585CCB /* Headers */,\n\t\t\t\tFEE82C527A384A55B52EF357FAA16C22 /* Sources */,\n\t\t\t\tBA30161BB5D2E74710CBABFCC20E409F /* Frameworks */,\n\t\t\t\tA151D550DD2C543F68445FDB753EF8EF /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t232E22686FEEB70180F984222B39F949 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxRelay;\n\t\t\tproductName = RxRelay;\n\t\t\tproductReference = FF8B264DFE802855D5D67E7CDDABFC3C /* RxRelay.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t73C37A16ECCEAD845651DCDEE95675BE /* MASShortcut-MASShortcut */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1C26E77821938498151B66E4B3FAFDB5 /* Build configuration list for PBXNativeTarget \"MASShortcut-MASShortcut\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3DC69F9E1AADA4EC8478D34D6CE9F516 /* Sources */,\n\t\t\t\t1514A9A36FD5740CCE236AFAF1DAC5C6 /* Frameworks */,\n\t\t\t\tB729EA1E27F34F10BAEB7F33DC42599A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"MASShortcut-MASShortcut\";\n\t\t\tproductName = \"MASShortcut-MASShortcut\";\n\t\t\tproductReference = 230F8208BE63C052A548A7D41A1158B2 /* MASShortcut.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\t7AD0C6DCDC9CEC8A3C7C10C7FEE07BE6 /* RxCocoa */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = ABE56D8D3781109924A96BB7837ED223 /* Build configuration list for PBXNativeTarget \"RxCocoa\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6E03461CB76B22AB26BB407943C2763E /* Headers */,\n\t\t\t\tCCF785ECCCE66AF314E3E51FEE3B8E42 /* Sources */,\n\t\t\t\t6E9985F3EEB339730D49B3D0181E6029 /* Frameworks */,\n\t\t\t\tEE0DFE66B52C1DA23E421D65B412E5CC /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t16E7E2DB71489A3B3A809EE95AF55896 /* PBXTargetDependency */,\n\t\t\t\tF1208697A3C80B8117E54FA1B0E859B1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxCocoa;\n\t\t\tproductName = RxCocoa;\n\t\t\tproductReference = BC432FD48A5932251F1CAFBC4BF74894 /* RxCocoa.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t9155E0B9A1C6F689BA4B61F3B690FDA1 /* Pods-proxy_conf_helper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0D501A92E69AF80E7786DD9C0D172BEC /* Build configuration list for PBXNativeTarget \"Pods-proxy_conf_helper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6584631C190AE58FF259F0472DDC1232 /* Headers */,\n\t\t\t\t19D1B24F4E402839324A4B4FE36492FB /* Sources */,\n\t\t\t\t44ABA0E4566A87964594C3AB0F7D2048 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t79DC5AF6E7C88EC75AD6D91A9FF3E011 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-proxy_conf_helper\";\n\t\t\tproductName = \"Pods-proxy_conf_helper\";\n\t\t\tproductReference = 61C23DB60A84900CD4BDA2F5EE2A0865 /* libPods-proxy_conf_helper.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tAD904F32069787EFB2DFFE05EB82F5BD /* GCDWebServer */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 690C9430B03B92419AFA4555712EC873 /* Build configuration list for PBXNativeTarget \"GCDWebServer\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8AC5AA6FFC615596F505AD8BD785D837 /* Headers */,\n\t\t\t\tA169CD366B0A64342FFF6E09CEC61622 /* Sources */,\n\t\t\t\tC2D4774AB2F0BFB25B60914F66C457AC /* Frameworks */,\n\t\t\t\tAE499806FA299FC184E575472A14EE39 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = GCDWebServer;\n\t\t\tproductName = GCDWebServer;\n\t\t\tproductReference = B68C1052A3B51DBCF7D960F898AAFA95 /* GCDWebServer.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tE9FDECF69808DB0491D4B4C08CF920DC /* Pods-ShadowsocksX-NG */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 975822F53DB5EF99EE2C5EA67BC503C9 /* Build configuration list for PBXNativeTarget \"Pods-ShadowsocksX-NG\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE23D293CACB5C453B56EBB9A0CC37588 /* Headers */,\n\t\t\t\t53C1A57011F61182535EA4555B7EE67A /* Sources */,\n\t\t\t\t7B690F32F695B6718D43BA3D3544C78C /* Frameworks */,\n\t\t\t\tE61A0FC1D432BA45188126B9155D697E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t18247C9B740C16AA1A1F647B7676E673 /* PBXTargetDependency */,\n\t\t\t\tD38F26CBE0B158CB00FD29413295EBDB /* PBXTargetDependency */,\n\t\t\t\tB2D17789138C47D21E16F60C47053226 /* PBXTargetDependency */,\n\t\t\t\t41031387B219D54FF7673356F1696E11 /* PBXTargetDependency */,\n\t\t\t\t7DABF5696F48F5C2D50C0A3DE25289EE /* PBXTargetDependency */,\n\t\t\t\t0403456DEA90C0614E5AFBAE92D06199 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-ShadowsocksX-NG\";\n\t\t\tproductName = \"Pods-ShadowsocksX-NG\";\n\t\t\tproductReference = D896F6A68919914B3302027C15449A1D /* Pods_ShadowsocksX_NG.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tEA9EA43B3B503823EE36C60D9C8A865F /* RxSwift */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6331D6AD3A4489B8CBA44A44D38FD80A /* Build configuration list for PBXNativeTarget \"RxSwift\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4066ADE1EACF598A77B29ECDD1BC4736 /* Headers */,\n\t\t\t\t17A2675A401E7A47A2A85F5E0DE8CFFB /* Sources */,\n\t\t\t\tB3C5909F9901CF3F5237F1832E214556 /* Frameworks */,\n\t\t\t\t046A991884442073662E8396D30686EE /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RxSwift;\n\t\t\tproductName = RxSwift;\n\t\t\tproductReference = 809C5FAB588354C9BA37DC3EAB8CB45C /* RxSwift.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tEAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 78E219AC01CD5AFED663C9AB28280801 /* Build configuration list for PBXNativeTarget \"Alamofire\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8070B01910C64B9AFD0DB550EDE38D6B /* Headers */,\n\t\t\t\t2C8326877F6A9617C2FBE9BD15D95B59 /* Sources */,\n\t\t\t\tE4B8CC1E36A98FF4D8BDAC84442F0DCE /* Frameworks */,\n\t\t\t\t9BCA7D105D531AE5DAF34FB86A2E623A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Alamofire;\n\t\t\tproductName = Alamofire;\n\t\t\tproductReference = 5D797E9A5C5782CE845840781FA1CC81 /* Alamofire.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tBFDFE7DC352907FC980B868725387E98 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1100;\n\t\t\t\tLastUpgradeCheck = 1250;\n\t\t\t};\n\t\t\tbuildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = CF1408CF629C7361332E53B88F7BD30C;\n\t\t\tproductRefGroup = E786B58AC38A5957ED28E1C47257C01E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tEAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */,\n\t\t\t\t00F92A6698B766C4479D7B608F28D680 /* BRLOptionParser */,\n\t\t\t\tAD904F32069787EFB2DFFE05EB82F5BD /* GCDWebServer */,\n\t\t\t\t2B2B481A164695722839BD581D442457 /* MASShortcut */,\n\t\t\t\t73C37A16ECCEAD845651DCDEE95675BE /* MASShortcut-MASShortcut */,\n\t\t\t\t9155E0B9A1C6F689BA4B61F3B690FDA1 /* Pods-proxy_conf_helper */,\n\t\t\t\tE9FDECF69808DB0491D4B4C08CF920DC /* Pods-ShadowsocksX-NG */,\n\t\t\t\t2E91F9FD8B0C7DA58DD330CBF2096926 /* Pods-ShadowsocksX-NGTests */,\n\t\t\t\t7AD0C6DCDC9CEC8A3C7C10C7FEE07BE6 /* RxCocoa */,\n\t\t\t\t4622BFEF3DC16E8BD15EEFC30D4D0084 /* RxRelay */,\n\t\t\t\tEA9EA43B3B503823EE36C60D9C8A865F /* RxSwift */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t046A991884442073662E8396D30686EE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8FA2F274BF94CAE07E4B856B3E2F5D77 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9BCA7D105D531AE5DAF34FB86A2E623A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA151D550DD2C543F68445FDB753EF8EF /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAE499806FA299FC184E575472A14EE39 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB729EA1E27F34F10BAEB7F33DC42599A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD557532ED179C1F26074DCD602EF357D /* cs.lproj in Resources */,\n\t\t\t\tFF36522388E5964B78AD72A59721AADC /* de.lproj in Resources */,\n\t\t\t\t02AEF100BA92B652E6E48EF58B479533 /* en.lproj in Resources */,\n\t\t\t\t4319C0B97542219FCA256B790FE90C1C /* es.lproj in Resources */,\n\t\t\t\tC3D17F4F92CD46A4285A92D1FD6AA4B1 /* fr.lproj in Resources */,\n\t\t\t\t325A6428E460396F0B0CB9B6FE10EEC4 /* it.lproj in Resources */,\n\t\t\t\t9389C4BF3F440F2503FFEB8BBC8975C8 /* ja.lproj in Resources */,\n\t\t\t\t63257249A72693C87BF365F343DA1D36 /* ko.lproj in Resources */,\n\t\t\t\tB90A504C57627AFCC56F0608D321FB31 /* nl.lproj in Resources */,\n\t\t\t\tF4C5E42370FEF310E72D2A8DAD2993FB /* pl.lproj in Resources */,\n\t\t\t\t82764E2E2DA3FD699FC5B659ED35D9AE /* pt.lproj in Resources */,\n\t\t\t\t313170D278E51360492948E6BB704EA7 /* ru.lproj in Resources */,\n\t\t\t\t809C371060C874FBEF8FECDF197D74E3 /* sv.lproj in Resources */,\n\t\t\t\t7094648D68C944D337CE86C10F8EEB04 /* zh-Hans.lproj in Resources */,\n\t\t\t\t91C85BAD47B39F365F260E74AB24693D /* zh-Hant.lproj in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE61A0FC1D432BA45188126B9155D697E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE8A034F83F762D640CA494BF8161ED87 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD37A995029438A503B62B1D2ACFE9247 /* MASShortcut.bundle in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEE0DFE66B52C1DA23E421D65B412E5CC /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t17A2675A401E7A47A2A85F5E0DE8CFFB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t741E51A8D9DE26331ABB938B3BD5751A /* AddRef.swift in Sources */,\n\t\t\t\t6B105A67121436E162ADE05A682BEA71 /* Amb.swift in Sources */,\n\t\t\t\t08FE05B1BA0A6D9CE971027E0480350A /* AnonymousDisposable.swift in Sources */,\n\t\t\t\tB7B31CEFFD225FE0DE33DA0CAAFB46BB /* AnonymousObserver.swift in Sources */,\n\t\t\t\tF621486B5084C21DA2498C0FC6A85E02 /* AnyObserver.swift in Sources */,\n\t\t\t\tBACB203DEE570915EDEC3E701158A173 /* AsMaybe.swift in Sources */,\n\t\t\t\t7B0FB5B7BF42B15FDF1FCE073D8C4C21 /* AsSingle.swift in Sources */,\n\t\t\t\t4BEC411F5B170048C65D315C87832600 /* AsyncLock.swift in Sources */,\n\t\t\t\t47E487EF80C53073DBFE5F5FD6BCFF0E /* AsyncSubject.swift in Sources */,\n\t\t\t\tA9AFA432B293A80CF9B1ABD1285A4705 /* AtomicInt.swift in Sources */,\n\t\t\t\t6CDC5000511AB1CF616FEBB8A856AE58 /* Bag+Rx.swift in Sources */,\n\t\t\t\t9AC6705C60E05CAB6115BA7603BDC0F6 /* Bag.swift in Sources */,\n\t\t\t\t77093BBAB8F2F51540322CB14BD2C178 /* BehaviorSubject.swift in Sources */,\n\t\t\t\tA9E6EFE85136C81C4AD5BF1CC1B990FD /* BinaryDisposable.swift in Sources */,\n\t\t\t\t695A83FEFDFE24858DDC37BD64DBBA33 /* Binder.swift in Sources */,\n\t\t\t\tC7A325790D6CB1C3545FE9E688545C56 /* BooleanDisposable.swift in Sources */,\n\t\t\t\t90B5B048AE70F82175F8A3DB72EF601E /* Buffer.swift in Sources */,\n\t\t\t\t2FD49578803778A2F094C0B21FEE332C /* Cancelable.swift in Sources */,\n\t\t\t\t0A20A09C199A4692A8EA72497B3D504A /* Catch.swift in Sources */,\n\t\t\t\t14403B39AC36562E41D4768CCF3540B1 /* CombineLatest+arity.swift in Sources */,\n\t\t\t\tBEF81EB8E8A3FB2B8519CDF1C6DEDA1E /* CombineLatest+Collection.swift in Sources */,\n\t\t\t\t017170EB9F2450569816AB0FF2E6D541 /* CombineLatest.swift in Sources */,\n\t\t\t\tEB8C4B9D8DFF39ECFE8538B73F5717F7 /* CompactMap.swift in Sources */,\n\t\t\t\t64F43894B4404E7BDE27A5C8BE96E0AE /* Completable+AndThen.swift in Sources */,\n\t\t\t\tC0EA3A392A5229080E52F9FDF969FDC8 /* Completable.swift in Sources */,\n\t\t\t\t07326CA68F757A1C82495BB52A92BD5C /* CompositeDisposable.swift in Sources */,\n\t\t\t\t5F7CE7907DC769D3E61980B80D20A275 /* Concat.swift in Sources */,\n\t\t\t\tABDF69C30364D8B9BDFDA8D82A797396 /* ConcurrentDispatchQueueScheduler.swift in Sources */,\n\t\t\t\tDD24A504D1BB91B71B67B4A93A92F1DA /* ConcurrentMainScheduler.swift in Sources */,\n\t\t\t\tE83CDC839BC5CA753A57BE04CB66F85D /* ConnectableObservableType.swift in Sources */,\n\t\t\t\tAE143D6485273A676FF9FBF637EE32B3 /* Create.swift in Sources */,\n\t\t\t\tD13BDCB5C86CD4018E19F1DA207BA61A /* CurrentThreadScheduler.swift in Sources */,\n\t\t\t\t90429156F020B4490158F6686EEFCB02 /* Date+Dispatch.swift in Sources */,\n\t\t\t\t0722A6B0D2DE0B9620F5C9659CB679D8 /* Debounce.swift in Sources */,\n\t\t\t\tD597C1B3CBDE4896A022E9422A4F4874 /* Debug.swift in Sources */,\n\t\t\t\tD21D80287E6B1C56E0BE86B1E3F08249 /* Decode.swift in Sources */,\n\t\t\t\tADF86969180231C97A14929F02866A1E /* DefaultIfEmpty.swift in Sources */,\n\t\t\t\t519260344D4291AA4C1CEAD7711B1489 /* Deferred.swift in Sources */,\n\t\t\t\t3212BC4884F26AE9244A7548691A0CE0 /* Delay.swift in Sources */,\n\t\t\t\tA6652D3942752A05ED133DB77C955216 /* DelaySubscription.swift in Sources */,\n\t\t\t\t1A630AD9EFDB068A1544BD51CA5E99B7 /* Dematerialize.swift in Sources */,\n\t\t\t\t6E75ECF4BDC7AF83E3151274539DFF93 /* DispatchQueue+Extensions.swift in Sources */,\n\t\t\t\tBAC5C3D7F895C6A95B5EA70D1C4BB998 /* DispatchQueueConfiguration.swift in Sources */,\n\t\t\t\tE06F7DEDC12A706F1AA7067CA7D58BD8 /* Disposable.swift in Sources */,\n\t\t\t\t0D8B936D823A959DDE9005A1C1D89487 /* Disposables.swift in Sources */,\n\t\t\t\t109ADA4349083858A198CA863E457E37 /* DisposeBag.swift in Sources */,\n\t\t\t\t3D8428BE717C8E76FA50C1D8B93561EE /* DisposeBase.swift in Sources */,\n\t\t\t\t9F77A1FFC61AF7C54E88B7436893C91B /* DistinctUntilChanged.swift in Sources */,\n\t\t\t\tF1F7AF19C5D50FB5BCD1D357FB9A5946 /* Do.swift in Sources */,\n\t\t\t\t44D30DA4840EF46F1C4BCEA6179AAE60 /* ElementAt.swift in Sources */,\n\t\t\t\tD6389E438CF72863B7F4832592B60428 /* Empty.swift in Sources */,\n\t\t\t\t0E7C902AB09DA1CA05D07D36BD55C73E /* Enumerated.swift in Sources */,\n\t\t\t\t84E576015933A4F6F431759174C62956 /* Error.swift in Sources */,\n\t\t\t\t2375AD3B88ECB4A1C01F9F70DCFB05E7 /* Errors.swift in Sources */,\n\t\t\t\tE46EB73E26A44700E41C3CD2F1E847FD /* Event.swift in Sources */,\n\t\t\t\t52CB53A7C3EF4BD88F73996450B73AA7 /* Filter.swift in Sources */,\n\t\t\t\tE5A162C30F57D3A21BD9D74BC97E782E /* First.swift in Sources */,\n\t\t\t\tE9C69CBF2B72EC9A5031BA6FF30BC251 /* Generate.swift in Sources */,\n\t\t\t\t7885432DE1DDE9F2A4607033B2808E5B /* GroupBy.swift in Sources */,\n\t\t\t\tB3C0F4C71E972214529455424C69E544 /* GroupedObservable.swift in Sources */,\n\t\t\t\t2453CFD81C667B99753FF8354AA82C60 /* HistoricalScheduler.swift in Sources */,\n\t\t\t\t6CA2AE8DA8D630D83FAED6FC2F081967 /* HistoricalSchedulerTimeConverter.swift in Sources */,\n\t\t\t\tB4E0DA5CB21C859040F39077A2731701 /* ImmediateSchedulerType.swift in Sources */,\n\t\t\t\t99E2AEBB5C39DB1661C5C03DDAA451EC /* Infallible+CombineLatest+arity.swift in Sources */,\n\t\t\t\t66207468882614FB8CE9896DC4250F13 /* Infallible+Create.swift in Sources */,\n\t\t\t\t4B9CC90686F274845EBBB82F230C11EE /* Infallible+Operators.swift in Sources */,\n\t\t\t\t1EC23A9ACE471AAE845CE9ACD4588932 /* Infallible+Zip+arity.swift in Sources */,\n\t\t\t\t652118C36365C28E76826357E309EADE /* Infallible.swift in Sources */,\n\t\t\t\tB59F717CE3CD531818EAFE88FBB454AA /* InfiniteSequence.swift in Sources */,\n\t\t\t\t3AB06F4DB0A01BA8F6662D0EDC495981 /* InvocableScheduledItem.swift in Sources */,\n\t\t\t\t4A33F1A7BD2AD1F318E081E17B0AA80F /* InvocableType.swift in Sources */,\n\t\t\t\tEA82A6A287EA96119DF03722AB2F25B8 /* Just.swift in Sources */,\n\t\t\t\t6D5BDAE5D8D991B874AD4D7FF2EA7C8C /* Lock.swift in Sources */,\n\t\t\t\t830F06C3D23016D62112E4BA1C22A766 /* LockOwnerType.swift in Sources */,\n\t\t\t\t34C033CDDD8217EE4221E9BDFFC23086 /* MainScheduler.swift in Sources */,\n\t\t\t\tF1A73AB066B6EC8C012F4044B542568D /* Map.swift in Sources */,\n\t\t\t\tE5F1157CAB86D8C0C166874A6E826739 /* Materialize.swift in Sources */,\n\t\t\t\t2C8A055494092F137EDB2E3BDCA74DFC /* Maybe.swift in Sources */,\n\t\t\t\t9360BB098EFD18F90BA16149E8EF8A34 /* Merge.swift in Sources */,\n\t\t\t\t42DBD7750A47DE5273041BDEE8850195 /* Multicast.swift in Sources */,\n\t\t\t\t8F66042610AE99F62D17E50EF0C83B0D /* Never.swift in Sources */,\n\t\t\t\t4C6CC049B53AF49050AD6428C5B50AB0 /* NopDisposable.swift in Sources */,\n\t\t\t\t432B3CB444984CCCFB4EF37E2D762F05 /* Observable.swift in Sources */,\n\t\t\t\tF89A75BE493264635F9977B0A9233617 /* ObservableConvertibleType+Infallible.swift in Sources */,\n\t\t\t\tA0F9BB688F14F5B350A388BA60C184A0 /* ObservableConvertibleType.swift in Sources */,\n\t\t\t\t3E6A74677BA3612A449B323631B44559 /* ObservableType+Extensions.swift in Sources */,\n\t\t\t\t11B06B47E4CB24A05B1299D730643803 /* ObservableType+PrimitiveSequence.swift in Sources */,\n\t\t\t\t2CD9AC66F1727C363449C4072DA57F89 /* ObservableType.swift in Sources */,\n\t\t\t\t0A8A30C3BF493120607DD0157A560065 /* ObserveOn.swift in Sources */,\n\t\t\t\tDCC8DE3CDC74A5E38864303C8C2404EF /* ObserverBase.swift in Sources */,\n\t\t\t\t7B99EC9A5D3CF7B6DE0330773143F15F /* ObserverType.swift in Sources */,\n\t\t\t\t516E4177ED65653EA9DAADBA3CF3FBED /* OperationQueueScheduler.swift in Sources */,\n\t\t\t\tCCE2D9FB50D6084FD48013ED3474F992 /* Optional.swift in Sources */,\n\t\t\t\t73E48515343BD4E57358BAD9F3B2F590 /* Platform.Darwin.swift in Sources */,\n\t\t\t\t27C5636F69D717D7745A0235D715E4FB /* Platform.Linux.swift in Sources */,\n\t\t\t\tB21C782362344F1FBCA4C5792EC1DED4 /* PrimitiveSequence+Zip+arity.swift in Sources */,\n\t\t\t\tB6634C3C7216D0A7B063174C16BA1922 /* PrimitiveSequence.swift in Sources */,\n\t\t\t\t8EEA6795ED2806C80FBE6A00B615CB76 /* PriorityQueue.swift in Sources */,\n\t\t\t\tED82861E104428E8C3FA8D1B2618C875 /* Producer.swift in Sources */,\n\t\t\t\tA3D78B5A2E0E6B987B021DA58CA55BEB /* PublishSubject.swift in Sources */,\n\t\t\t\t9141315B460BE4CD3030B62BE7692B73 /* Queue.swift in Sources */,\n\t\t\t\t5E3681E1F77D4A9B58F332348935EE8C /* Range.swift in Sources */,\n\t\t\t\t6A3972E7F1ACA4CEE36E0AA3B2BA34FB /* Reactive.swift in Sources */,\n\t\t\t\t1C0A940E6D4FD420BEC04B9F16914D71 /* RecursiveLock.swift in Sources */,\n\t\t\t\t262C2E49711CEA356F7C2031AE074C8A /* RecursiveScheduler.swift in Sources */,\n\t\t\t\t774C726DE2716860799DAEAD0B801A94 /* Reduce.swift in Sources */,\n\t\t\t\tC0ACE318CA3576826A53026F9C253E0B /* RefCountDisposable.swift in Sources */,\n\t\t\t\t4728113A1BA4AE948E1B2FB610A473B4 /* Repeat.swift in Sources */,\n\t\t\t\tC81FF014587AC7E1A51D4F3F2C6F72EA /* ReplaySubject.swift in Sources */,\n\t\t\t\t9D5CD154B7C49DA0BCBFF996CA9A6E62 /* RetryWhen.swift in Sources */,\n\t\t\t\tA9DD82DFCFA49DC81169D82415DE7B94 /* Rx.swift in Sources */,\n\t\t\t\t0A4DF5D6FC29A34C999E1ECBB53C696B /* RxMutableBox.swift in Sources */,\n\t\t\t\t8EB4272CE33A59083F0DC9746C0F71D0 /* RxSwift-dummy.m in Sources */,\n\t\t\t\tA4CE525F7E6904D7D244727C90DBDBE2 /* Sample.swift in Sources */,\n\t\t\t\t5CDF229542C4FC347E9D1DFDBAC8B230 /* Scan.swift in Sources */,\n\t\t\t\t9F794FB773B632DAC0416008A8EC3F45 /* ScheduledDisposable.swift in Sources */,\n\t\t\t\tAA5CBA43C0BF98751988A758EB180BA6 /* ScheduledItem.swift in Sources */,\n\t\t\t\t14E31D647AFA8F0FBE3793EF61872247 /* ScheduledItemType.swift in Sources */,\n\t\t\t\t10993D369AADB3E2BCA4E966DE514C09 /* SchedulerServices+Emulation.swift in Sources */,\n\t\t\t\t4C88ED296D3687C973B0472D047CE3E8 /* SchedulerType.swift in Sources */,\n\t\t\t\tD57542063237724C1CA2962EAC1764C7 /* Sequence.swift in Sources */,\n\t\t\t\t2D890B63806F7465912098B60052B092 /* SerialDispatchQueueScheduler.swift in Sources */,\n\t\t\t\t239AC2D5500F4E4FB04BC341A1335DF7 /* SerialDisposable.swift in Sources */,\n\t\t\t\t4EC10410410410FF3A33C6015FD5927D /* ShareReplayScope.swift in Sources */,\n\t\t\t\tD574A95C82CDFCC40442A4C5A20645D9 /* Single.swift in Sources */,\n\t\t\t\tB936FB1A1779B971BCE58D1CFB84036B /* SingleAssignmentDisposable.swift in Sources */,\n\t\t\t\tFAEF22DB65A2C18EAF044623FF4ECA43 /* SingleAsync.swift in Sources */,\n\t\t\t\t4673A5004D211FA68BB8506B9A323034 /* Sink.swift in Sources */,\n\t\t\t\t83470A9EFB9948DED806CC1D1233D21C /* Skip.swift in Sources */,\n\t\t\t\tD0B9EA4DC98653D58DEAE9629A2F0285 /* SkipUntil.swift in Sources */,\n\t\t\t\tDBFA45EBB79E16D7B6780CDA789B0D08 /* SkipWhile.swift in Sources */,\n\t\t\t\t7CF0187F571D299FE14788318D720152 /* StartWith.swift in Sources */,\n\t\t\t\t0FB5F248B62BC1F0113E53461E807AE5 /* SubjectType.swift in Sources */,\n\t\t\t\tB9C2804D9E9FD66CF22595DBFED0DC79 /* SubscribeOn.swift in Sources */,\n\t\t\t\tFA547DB169BA1CB0759702BA51F1C52E /* SubscriptionDisposable.swift in Sources */,\n\t\t\t\tBB15F798287F7447B78B4D49522030C4 /* SwiftSupport.swift in Sources */,\n\t\t\t\t535519D2B25D1784AA6D6A9BDE60C759 /* Switch.swift in Sources */,\n\t\t\t\tA5DC2335899B03F0130A9C739319C92A /* SwitchIfEmpty.swift in Sources */,\n\t\t\t\tCE622A228B2F310835326CCF0B83F031 /* SynchronizedDisposeType.swift in Sources */,\n\t\t\t\tBC184A6D6502B7B4B308496F5172E4FE /* SynchronizedOnType.swift in Sources */,\n\t\t\t\t543010884F5B7C1F2920A0DF33A3A9D1 /* SynchronizedUnsubscribeType.swift in Sources */,\n\t\t\t\tD661EA5F16B11BEE347BAE35961A3AD2 /* TailRecursiveSink.swift in Sources */,\n\t\t\t\t601A69113478A1336ADA98C7658D2355 /* Take.swift in Sources */,\n\t\t\t\t14C185529F30494F6B6F0DFA9AEDDC05 /* TakeLast.swift in Sources */,\n\t\t\t\t44C45DEC66DB1FBBA5F850E79057DC13 /* TakeWithPredicate.swift in Sources */,\n\t\t\t\t3BAE1C06A091DFA7A91F93BD40BD41B9 /* Throttle.swift in Sources */,\n\t\t\t\t69D750E3DAB2F11E37761A204A145883 /* Timeout.swift in Sources */,\n\t\t\t\t1DF080CB9D37CB063C6FEC09BBF8F238 /* Timer.swift in Sources */,\n\t\t\t\tA7A81BFC5D65FDB665AC19E78D4F21B6 /* ToArray.swift in Sources */,\n\t\t\t\tDDA573352B48255CA674E8BB62C306C6 /* Using.swift in Sources */,\n\t\t\t\t8B67845A8F56DF49F8B22B1BB63C5E10 /* VirtualTimeConverterType.swift in Sources */,\n\t\t\t\t1B341070BA8EB97021BE7C152639CBF5 /* VirtualTimeScheduler.swift in Sources */,\n\t\t\t\t9FC8EA2F7B3939D69D1469F9046B166A /* Window.swift in Sources */,\n\t\t\t\tF5E8D9EC4166B35C084791CAEFF2404C /* WithLatestFrom.swift in Sources */,\n\t\t\t\tE26E725D6366FA3AE20B95802F54C4B6 /* WithUnretained.swift in Sources */,\n\t\t\t\t2B540E502B0EE71D93636BA94B9F0817 /* Zip+arity.swift in Sources */,\n\t\t\t\t9C3D3F75523B1B1BB4B3051C01F8F6FE /* Zip+Collection.swift in Sources */,\n\t\t\t\tFC22B1E68007E6AC40CC8DF2DF5E0AB6 /* Zip.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t19D1B24F4E402839324A4B4FE36492FB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE52E9DB2E0EB574ED157EB478E60D13D /* Pods-proxy_conf_helper-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2C8326877F6A9617C2FBE9BD15D95B59 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1208E81DA8B532D0646D627B50290EB6 /* AFError.swift in Sources */,\n\t\t\t\tC6D5A4B4028B2C43380C9FA58BD5C8CA /* Alamofire-dummy.m in Sources */,\n\t\t\t\tC1F1DB6A9CBDE584D09BA1613AAD4F9D /* Alamofire.swift in Sources */,\n\t\t\t\t72EC2712926E6D28B52360D9AC41668F /* AlamofireExtended.swift in Sources */,\n\t\t\t\tDC627AFC5B585686898B014184AFCABD /* AuthenticationInterceptor.swift in Sources */,\n\t\t\t\tABA85887A41495358C83CE3F3030EDEA /* CachedResponseHandler.swift in Sources */,\n\t\t\t\t0A1849775CF90D514963187D3A771CF8 /* Combine.swift in Sources */,\n\t\t\t\t27E59A11A2743B0595CDE3A08675EAE1 /* DispatchQueue+Alamofire.swift in Sources */,\n\t\t\t\t6546D728B69398F93B506845141EBD61 /* EventMonitor.swift in Sources */,\n\t\t\t\t91B837CE0DCD8EDB300FCDFFA1279162 /* HTTPHeaders.swift in Sources */,\n\t\t\t\t013BAC24F7AC722E59517CB110A9E685 /* HTTPMethod.swift in Sources */,\n\t\t\t\t45B8CC1C61E7A0BB28CFA8CE7C12FEBC /* MultipartFormData.swift in Sources */,\n\t\t\t\tD03F1F02DE8606E6057D57866611BEBF /* MultipartUpload.swift in Sources */,\n\t\t\t\t19D605A3233499828FB6B790869F3E9C /* NetworkReachabilityManager.swift in Sources */,\n\t\t\t\t8AA937910F87915DE700CAB6C868689E /* Notifications.swift in Sources */,\n\t\t\t\t0A900DF17E3B64F08AF673E9A0DDD697 /* OperationQueue+Alamofire.swift in Sources */,\n\t\t\t\t4AEC050FA7D5ED52FDA9DF50EA3560DF /* ParameterEncoder.swift in Sources */,\n\t\t\t\tD14066FAE94E304798E43651E5886D13 /* ParameterEncoding.swift in Sources */,\n\t\t\t\t218C14EAE5AA31C30314AE0289B732A0 /* Protected.swift in Sources */,\n\t\t\t\t666EC5C8356E6D4448A2FE7BEE77AD88 /* RedirectHandler.swift in Sources */,\n\t\t\t\tEDC93BD7B9262119AE145E4C7A9D0212 /* Request.swift in Sources */,\n\t\t\t\t6E54F64E8DA73F4B0B46C216F9F93F63 /* RequestInterceptor.swift in Sources */,\n\t\t\t\t6C08F6A77889651626583100F560153D /* RequestTaskMap.swift in Sources */,\n\t\t\t\tC1C5B050B55C15103ABC81769551A283 /* Response.swift in Sources */,\n\t\t\t\t911448B2EDA2FF880108F77642797A88 /* ResponseSerialization.swift in Sources */,\n\t\t\t\t66B26C6CAE737EC21F4BA1F1851B69C5 /* Result+Alamofire.swift in Sources */,\n\t\t\t\t9FED70D1E1FBFB80E974E999EF732258 /* RetryPolicy.swift in Sources */,\n\t\t\t\t47FDBBBD2704901588C3A7C56BBC502D /* ServerTrustEvaluation.swift in Sources */,\n\t\t\t\t6AE407A4FB6C3D6ADD862CC6E3067A17 /* Session.swift in Sources */,\n\t\t\t\t381FF05F8B4F611EE9C2FDBE4457BB89 /* SessionDelegate.swift in Sources */,\n\t\t\t\t212EDC48B68107BEA9247F3464CE696E /* StringEncoding+Alamofire.swift in Sources */,\n\t\t\t\t9B1D8A7798D8A6F518FC9AF9725431D0 /* URLConvertible+URLRequestConvertible.swift in Sources */,\n\t\t\t\tD31FC7FDD450C4CDD633ECBAD27C6221 /* URLEncodedFormEncoder.swift in Sources */,\n\t\t\t\tD5EAAFB6FAD77A8F0699345149BA3CBB /* URLRequest+Alamofire.swift in Sources */,\n\t\t\t\tF70EF854395CDE981A8336E4FF0310FE /* URLSessionConfiguration+Alamofire.swift in Sources */,\n\t\t\t\tF0F3224FF592F9BA2A044A2FC2BD4CCD /* Validation.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3DC69F9E1AADA4EC8478D34D6CE9F516 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t53C1A57011F61182535EA4555B7EE67A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB3E529B0C5581EFBE667B478A97681F6 /* Pods-ShadowsocksX-NG-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A815F2E1A9D4EFD8C4C4BD6D7DC1BCA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF6F5712CC3ED7DD4D51BA12747FCDE6E /* MASDictionaryTransformer.m in Sources */,\n\t\t\t\tDADE159BB4CF9E438FC5DEF80822A710 /* MASHotKey.m in Sources */,\n\t\t\t\tB1501E5B044C314A7E3E08D5172CE6C4 /* MASLocalization.m in Sources */,\n\t\t\t\t563C41694A1B06EF34752E894297D3FA /* MASShortcut-dummy.m in Sources */,\n\t\t\t\t1AECEBA213A2C9E6EC56C2C1358849E4 /* MASShortcut.m in Sources */,\n\t\t\t\tFB425C8625656D7AE2AFD1F8A78713B0 /* MASShortcutBinder.m in Sources */,\n\t\t\t\tF515F0E56CBF807E49797455E495074C /* MASShortcutMonitor.m in Sources */,\n\t\t\t\tF9C743AF2433172C84F9365D8DE8CBF3 /* MASShortcutValidator.m in Sources */,\n\t\t\t\tA2F246B7FCDC421BE6098866AA1509C9 /* MASShortcutView+Bindings.m in Sources */,\n\t\t\t\t805003984E8CFD3375B935DC772A7BF3 /* MASShortcutView.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA169CD366B0A64342FFF6E09CEC61622 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1C11628696BD0C889E0A4FC6CA4B6922 /* GCDWebServer-dummy.m in Sources */,\n\t\t\t\tE9B95D42F4510C79E2D8A8CFA251CD49 /* GCDWebServer.m in Sources */,\n\t\t\t\tD260B45339932BAA56D7024048E2D155 /* GCDWebServerConnection.m in Sources */,\n\t\t\t\tCD782D1189ADBAA42D087B87D53838A0 /* GCDWebServerDataRequest.m in Sources */,\n\t\t\t\t3BBEC4A24B60E2276CBC26E555F64F41 /* GCDWebServerDataResponse.m in Sources */,\n\t\t\t\tD5E020763D69E9336EB398ACD48FEBB0 /* GCDWebServerErrorResponse.m in Sources */,\n\t\t\t\t4940AB8BC3936DEBDC02BF49FE5E97A1 /* GCDWebServerFileRequest.m in Sources */,\n\t\t\t\t99ABB4C207FE146C78313E8A9A581FD6 /* GCDWebServerFileResponse.m in Sources */,\n\t\t\t\t36DED9F6B7737F022FB0B01ECE2BB88E /* GCDWebServerFunctions.m in Sources */,\n\t\t\t\t221F057199246D7709DD91C950746B7B /* GCDWebServerMultiPartFormRequest.m in Sources */,\n\t\t\t\tBF1EB892BE3CF9CDFA0DAC7F9392435C /* GCDWebServerRequest.m in Sources */,\n\t\t\t\t3685E20BBC5AFEA3BC80FE12732AB269 /* GCDWebServerResponse.m in Sources */,\n\t\t\t\tF7DAD2EF3F86BC40F7D4F2EE49362418 /* GCDWebServerStreamedResponse.m in Sources */,\n\t\t\t\t5989329B01C0737EFDB490C5A771FDC2 /* GCDWebServerURLEncodedFormRequest.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCCF785ECCCE66AF314E3E51FEE3B8E42 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAED84FBEE9189CFC8A946DDC2BFCB2BE /* _RX.m in Sources */,\n\t\t\t\t62DF258CA1EA9A41A99B93052A72DAB0 /* _RXDelegateProxy.m in Sources */,\n\t\t\t\t999CAB83E4F6D824DF56B2B755C0B588 /* _RXKVOObserver.m in Sources */,\n\t\t\t\t4E095DE808150F9350BB9CB3C99A37B2 /* _RXObjCRuntime.m in Sources */,\n\t\t\t\tBD386D2A7F6652D62B9E75803D3AAD3B /* Bag.swift in Sources */,\n\t\t\t\t75917BCA0645283EC7D9CC3ADEE6DB4F /* BehaviorRelay+Driver.swift in Sources */,\n\t\t\t\t12E8D9F9C1A9B4FC7669C18954BC4798 /* ControlEvent+Driver.swift in Sources */,\n\t\t\t\tA8EEAAF6FACD8832BE7E4A6331ED57E4 /* ControlEvent+Signal.swift in Sources */,\n\t\t\t\tFD397CD62192F67DF9C2088CC5EBE409 /* ControlEvent.swift in Sources */,\n\t\t\t\t99210D61FFF596695086F3E51D893204 /* ControlProperty+Driver.swift in Sources */,\n\t\t\t\tE9FD5789C7C4946FC504E7C679BDD156 /* ControlProperty.swift in Sources */,\n\t\t\t\tF44EF6685A8C029EAC293DE9FADC3794 /* ControlTarget.swift in Sources */,\n\t\t\t\t872E07F59296D07A405BAB9C36936AC8 /* DelegateProxy.swift in Sources */,\n\t\t\t\t70359E1C7BAA76860EA35A607CCC4309 /* DelegateProxyType.swift in Sources */,\n\t\t\t\t30536C64EAA45BE64894B48D74144B1E /* DispatchQueue+Extensions.swift in Sources */,\n\t\t\t\tF45717BF2118BB61C328A1F67CFE9238 /* Driver+Subscription.swift in Sources */,\n\t\t\t\tB8B7E2AC4972978F6894F9C22936CA42 /* Driver.swift in Sources */,\n\t\t\t\tA8DBBA1BD18472113BBE931A3F949659 /* Infallible+Bind.swift in Sources */,\n\t\t\t\t16C263170733039596369C8D4F89077A /* InfiniteSequence.swift in Sources */,\n\t\t\t\tF186B25E38062738E07F219D0289CBFA /* ItemEvents.swift in Sources */,\n\t\t\t\t3596F8FDA81BECFE1B05B50500447638 /* KVORepresentable+CoreGraphics.swift in Sources */,\n\t\t\t\t2862DA4097D964B745862F00BB45759D /* KVORepresentable+Swift.swift in Sources */,\n\t\t\t\tC8422B20017685DE0D693EC679FF8BF6 /* KVORepresentable.swift in Sources */,\n\t\t\t\tA2526FE80C9370555D66A0A33EA22E44 /* NotificationCenter+Rx.swift in Sources */,\n\t\t\t\tA9DFF7177D374AF79EEAD9F34B66569A /* NSButton+Rx.swift in Sources */,\n\t\t\t\tBB322452A0B606428489BA2B2F6D3715 /* NSControl+Rx.swift in Sources */,\n\t\t\t\tCA391E5CE794FA6D964DC2DFC8B8E109 /* NSObject+Rx+KVORepresentable.swift in Sources */,\n\t\t\t\tE816A86AE437A96B389D73C115778CFA /* NSObject+Rx+RawRepresentable.swift in Sources */,\n\t\t\t\t85CD565FB8198B084806FE075B268AB5 /* NSObject+Rx.swift in Sources */,\n\t\t\t\t7BD242803D2ADF6E50A27C3542C8695D /* NSSlider+Rx.swift in Sources */,\n\t\t\t\tA525A6AE79BA19A9BDEA467D31477916 /* NSTextField+Rx.swift in Sources */,\n\t\t\t\t58D3BBBF801B54CC74FAAC0374F1948D /* NSTextStorage+Rx.swift in Sources */,\n\t\t\t\tB261ED81ABD31C88EAC460E27E453FAE /* NSTextView+Rx.swift in Sources */,\n\t\t\t\tC0E1B20534F498B9891E956388D79209 /* NSView+Rx.swift in Sources */,\n\t\t\t\tF8C1D484E959F9ADD96E9CD2F3B045B0 /* Observable+Bind.swift in Sources */,\n\t\t\t\tAB83592C5AA99079DA59151D2ACDFBE2 /* ObservableConvertibleType+Driver.swift in Sources */,\n\t\t\t\tE8064C59B797763270D65097B4CD075B /* ObservableConvertibleType+SharedSequence.swift in Sources */,\n\t\t\t\tBC03F491551F314E102DEB2F96110609 /* ObservableConvertibleType+Signal.swift in Sources */,\n\t\t\t\tD0C4275AF3346D1C08B187D04D9606F2 /* Platform.Darwin.swift in Sources */,\n\t\t\t\t2BD53F1C421E9938A099F3F45C84FBAD /* Platform.Linux.swift in Sources */,\n\t\t\t\t39988540E9F936FE5085117BB8F32FAC /* PriorityQueue.swift in Sources */,\n\t\t\t\t934592C980EE09EEE5F4B5074C6A56D8 /* PublishRelay+Signal.swift in Sources */,\n\t\t\t\t440BDCF5820801BC8A6D740C48EEAB8E /* Queue.swift in Sources */,\n\t\t\t\t786C836C43BD6428332A4001EE13816F /* RecursiveLock.swift in Sources */,\n\t\t\t\tE1AD1FE46FE8F693F913FEC190210A59 /* RxCocoa-dummy.m in Sources */,\n\t\t\t\t23CF55A9FA514BDCA0B46320D4ED5DEC /* RxCocoa.swift in Sources */,\n\t\t\t\t6A5300346FF40392C6A4B5908AA9C027 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */,\n\t\t\t\t080F0457EB8E6A9F2841FB0D77AEEF42 /* RxCollectionViewDataSourcePrefetchingProxy.swift in Sources */,\n\t\t\t\tFDEBCA25E0674ADFB66FA6256FF6486F /* RxCollectionViewDataSourceProxy.swift in Sources */,\n\t\t\t\t51B830516D57359FAB42031193E47CB1 /* RxCollectionViewDataSourceType.swift in Sources */,\n\t\t\t\t037CEEDED76C75AB19A6A015D66C1322 /* RxCollectionViewDelegateProxy.swift in Sources */,\n\t\t\t\tD9884F11DD4FAA059A45CBBBC68E090F /* RxCollectionViewReactiveArrayDataSource.swift in Sources */,\n\t\t\t\t7BFBC9F9818BC849C72D672D6B6E4B75 /* RxNavigationControllerDelegateProxy.swift in Sources */,\n\t\t\t\t953EC9012B7246D01EA866100FAEA023 /* RxPickerViewAdapter.swift in Sources */,\n\t\t\t\t447B98FAB75F9B738B72DA92A3C581D6 /* RxPickerViewDataSourceProxy.swift in Sources */,\n\t\t\t\t0FE468D23725DEF3BB913C80A61F9B1B /* RxPickerViewDataSourceType.swift in Sources */,\n\t\t\t\t63CE2D43072C461D8DE926F0B9EC2E97 /* RxPickerViewDelegateProxy.swift in Sources */,\n\t\t\t\t26900F59621365F9EF08DB37C7E07C06 /* RxScrollViewDelegateProxy.swift in Sources */,\n\t\t\t\tE84DB9453D7F43DCEC20FDFB5F1CDFD6 /* RxSearchBarDelegateProxy.swift in Sources */,\n\t\t\t\t4953376F75EEA98570C65CFC41E0A154 /* RxSearchControllerDelegateProxy.swift in Sources */,\n\t\t\t\t6CD3A3F8ABC5FCE23D15CE6823840010 /* RxTabBarControllerDelegateProxy.swift in Sources */,\n\t\t\t\tDC708FA8C70373D522CB885D4451F3D0 /* RxTabBarDelegateProxy.swift in Sources */,\n\t\t\t\tB2246BF06902F6B9264919F779968CCB /* RxTableViewDataSourcePrefetchingProxy.swift in Sources */,\n\t\t\t\t1ECDFBCA376564682426B5D8AC70393C /* RxTableViewDataSourceProxy.swift in Sources */,\n\t\t\t\t60FBA126D0D250DE50F4DD26041E4A9C /* RxTableViewDataSourceType.swift in Sources */,\n\t\t\t\t9E9A7DA26421695F48AA96DA35B813B4 /* RxTableViewDelegateProxy.swift in Sources */,\n\t\t\t\tF2AB55CF962B7EBDE26DD970C282CEDE /* RxTableViewReactiveArrayDataSource.swift in Sources */,\n\t\t\t\tA5BE980B95C08EDFEBEC17E0433A4A2E /* RxTarget.swift in Sources */,\n\t\t\t\tF71DB74D923AB8F40A88103BDC5ABFA6 /* RxTextStorageDelegateProxy.swift in Sources */,\n\t\t\t\t8B7EEE0E899778DA279E64E26E38FB30 /* RxTextViewDelegateProxy.swift in Sources */,\n\t\t\t\tDAB6B67BBE65A9ECA898A563CACF442A /* RxWKNavigationDelegateProxy.swift in Sources */,\n\t\t\t\tF9872C7244CA7C80D5E402B3922DB009 /* SchedulerType+SharedSequence.swift in Sources */,\n\t\t\t\t1FDEA9EB6CAF8FB09C98CEBE607DCFB6 /* SectionedViewDataSourceType.swift in Sources */,\n\t\t\t\tC60C9B7447C5D9555611004E27093043 /* SharedSequence+Operators+arity.swift in Sources */,\n\t\t\t\tB82E2164A69C0D6D3A21B76EFF96F083 /* SharedSequence+Operators.swift in Sources */,\n\t\t\t\t2F835E1CFB72A43AC17728C6105B9635 /* SharedSequence.swift in Sources */,\n\t\t\t\tFFF63A18CD673B6821ED19EB164316C9 /* Signal+Subscription.swift in Sources */,\n\t\t\t\t35A428176550E4AA2BB98CDDEE2AFF99 /* Signal.swift in Sources */,\n\t\t\t\t4407E13BF761D53607A7B419BE64458B /* TextInput.swift in Sources */,\n\t\t\t\tF8EC0962127455A9E5ABEA1B2D0C91D7 /* UIActivityIndicatorView+Rx.swift in Sources */,\n\t\t\t\t8819CBF35F9919DFC3C17016DF3ACE46 /* UIApplication+Rx.swift in Sources */,\n\t\t\t\t6C1064F34CFE15C3DB0E923D9D170E0C /* UIBarButtonItem+Rx.swift in Sources */,\n\t\t\t\t844134211AB7B26FACFFF74B58B81C02 /* UIButton+Rx.swift in Sources */,\n\t\t\t\t06185F389644D5BD1C84259027C533D5 /* UICollectionView+Rx.swift in Sources */,\n\t\t\t\t8CE605907DC8FA1F2E4751F939A4E604 /* UIControl+Rx.swift in Sources */,\n\t\t\t\tA1CB4107AB9FDEC58E3A7C0C14B4AB79 /* UIDatePicker+Rx.swift in Sources */,\n\t\t\t\t611ACC0E723AF0E572160BC75133A9E6 /* UIGestureRecognizer+Rx.swift in Sources */,\n\t\t\t\t7E8BC075464E9C355B763973CA6C08D2 /* UINavigationController+Rx.swift in Sources */,\n\t\t\t\t091B8980E4EFE8B81548A8B0369DF1F7 /* UIPickerView+Rx.swift in Sources */,\n\t\t\t\t77260113D5ADF7B45DAE46C549580AFD /* UIRefreshControl+Rx.swift in Sources */,\n\t\t\t\tBAB6CF7AB28DA0D4BCBC2CF5F53D51AE /* UIScrollView+Rx.swift in Sources */,\n\t\t\t\t6BDF6DD0C73F197EC93643F477997B40 /* UISearchBar+Rx.swift in Sources */,\n\t\t\t\t128376A37733CDCD9870A39DE261904E /* UISearchController+Rx.swift in Sources */,\n\t\t\t\tDE76073247081964D8DA688F13021B62 /* UISegmentedControl+Rx.swift in Sources */,\n\t\t\t\t4BF6073DF04E6CD2C3BD8D2C552D7E65 /* UISlider+Rx.swift in Sources */,\n\t\t\t\tB28F09A584B9F1BBF2EFD17B072A5CE1 /* UIStepper+Rx.swift in Sources */,\n\t\t\t\tDD7EC76A4EB8C3A1741CD5B77B57E0A4 /* UISwitch+Rx.swift in Sources */,\n\t\t\t\t022F83EC88B467A88CBB491D7C98FA7E /* UITabBar+Rx.swift in Sources */,\n\t\t\t\t9806F1246774ADD50F50D3F1624EB0EB /* UITabBarController+Rx.swift in Sources */,\n\t\t\t\tAEA40BB1875D2E7B7DCB5E63E672033B /* UITableView+Rx.swift in Sources */,\n\t\t\t\t9D05E77AB8415BB11EC5C5FB6FD62276 /* UITextField+Rx.swift in Sources */,\n\t\t\t\t38A45D6FD7DCA41AC0C9CD58EDBB57CB /* UITextView+Rx.swift in Sources */,\n\t\t\t\tD251A0235B97F9217D50C5A1C7C5F311 /* URLSession+Rx.swift in Sources */,\n\t\t\t\t43BC914A79B9230DA50C9D476DE5114D /* WKWebView+Rx.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDFF2B5F26ABB5074146BB93EA5DBE095 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3E2FF4CBA1E2C3A36060CB61A25F80F7 /* BRLOptionParser-dummy.m in Sources */,\n\t\t\t\tEDD85DAC7DC88B01D5A2C20969416C9B /* BRLOptionParser.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF0A91985F4DA9728630FB9ABC81A8CC1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9281E701873CD72C35440865226A1A8B /* Pods-ShadowsocksX-NGTests-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFEE82C527A384A55B52EF357FAA16C22 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6FD62C6E23DE07DF1291500FEFC19354 /* BehaviorRelay.swift in Sources */,\n\t\t\t\t7813074001D6CD69B3A1EBAF59379E58 /* Observable+Bind.swift in Sources */,\n\t\t\t\t4D6504A580F9D6278452D19FD3DD35BC /* PublishRelay.swift in Sources */,\n\t\t\t\tC4CD2007BF8F2B0B5125A85B1C43AD24 /* ReplayRelay.swift in Sources */,\n\t\t\t\tE3EE570AEF6808660B0542591285D354 /* RxRelay-dummy.m in Sources */,\n\t\t\t\tCC9F7F2B397CCCC5397750D0B139E373 /* Utils.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t0403456DEA90C0614E5AFBAE92D06199 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = EA9EA43B3B503823EE36C60D9C8A865F /* RxSwift */;\n\t\t\ttargetProxy = 3A3C6F9E9E958812D1FF93C9737FE5B1 /* PBXContainerItemProxy */;\n\t\t};\n\t\t16E7E2DB71489A3B3A809EE95AF55896 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxRelay;\n\t\t\ttarget = 4622BFEF3DC16E8BD15EEFC30D4D0084 /* RxRelay */;\n\t\t\ttargetProxy = 93C581FCCE9BCA693063DEB0CB18943C /* PBXContainerItemProxy */;\n\t\t};\n\t\t18247C9B740C16AA1A1F647B7676E673 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Alamofire;\n\t\t\ttarget = EAAA1AD3A8A1B59AB91319EE40752C6D /* Alamofire */;\n\t\t\ttargetProxy = 6C21C08D1A9E4A42298C1E83946EFBF6 /* PBXContainerItemProxy */;\n\t\t};\n\t\t232E22686FEEB70180F984222B39F949 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = EA9EA43B3B503823EE36C60D9C8A865F /* RxSwift */;\n\t\t\ttargetProxy = 95ED7E1E76F66FF2AFA473A3D49F574E /* PBXContainerItemProxy */;\n\t\t};\n\t\t41031387B219D54FF7673356F1696E11 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxCocoa;\n\t\t\ttarget = 7AD0C6DCDC9CEC8A3C7C10C7FEE07BE6 /* RxCocoa */;\n\t\t\ttargetProxy = A5DE8E8EE1A9A5D27FEA05AD1FF38C1E /* PBXContainerItemProxy */;\n\t\t};\n\t\t53637CA92B734D4013B9F99E7AAA9808 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"MASShortcut-MASShortcut\";\n\t\t\ttarget = 73C37A16ECCEAD845651DCDEE95675BE /* MASShortcut-MASShortcut */;\n\t\t\ttargetProxy = 3DE69038DEBF7AC72F345377CCA1A457 /* PBXContainerItemProxy */;\n\t\t};\n\t\t79DC5AF6E7C88EC75AD6D91A9FF3E011 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = BRLOptionParser;\n\t\t\ttarget = 00F92A6698B766C4479D7B608F28D680 /* BRLOptionParser */;\n\t\t\ttargetProxy = 290D7A27821274F88F50BA4027E877B0 /* PBXContainerItemProxy */;\n\t\t};\n\t\t7DABF5696F48F5C2D50C0A3DE25289EE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxRelay;\n\t\t\ttarget = 4622BFEF3DC16E8BD15EEFC30D4D0084 /* RxRelay */;\n\t\t\ttargetProxy = 1CA90026A2A030CD980CB1E78050B63A /* PBXContainerItemProxy */;\n\t\t};\n\t\tB2D17789138C47D21E16F60C47053226 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = MASShortcut;\n\t\t\ttarget = 2B2B481A164695722839BD581D442457 /* MASShortcut */;\n\t\t\ttargetProxy = B0B5FA86CABF29A7785405416D374CDA /* PBXContainerItemProxy */;\n\t\t};\n\t\tD38F26CBE0B158CB00FD29413295EBDB /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = GCDWebServer;\n\t\t\ttarget = AD904F32069787EFB2DFFE05EB82F5BD /* GCDWebServer */;\n\t\t\ttargetProxy = E627335D42AC0ADFBA7B40BFD314B204 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF1208697A3C80B8117E54FA1B0E859B1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = EA9EA43B3B503823EE36C60D9C8A865F /* RxSwift */;\n\t\t\ttargetProxy = 809667767BFFB7D46B762AD5F006A069 /* PBXContainerItemProxy */;\n\t\t};\n\t\tFF103DE3A0523E2D55DE3D845DD9F0E2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"Pods-ShadowsocksX-NG\";\n\t\t\ttarget = E9FDECF69808DB0491D4B4C08CF920DC /* Pods-ShadowsocksX-NG */;\n\t\t\ttargetProxy = 7569E9B350638EBD714C781E38F158A8 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t12B0FE32A40DD86F2B679BA026ED60EB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 4A70BE8C07BCE9C6D6F47AC73225C959 /* Pods-proxy_conf_helper.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1B9B12FB7A187E6EA55EABA8BB6F0938 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = FE6138E84780096ADB31F55549931FC6 /* RxSwift.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxSwift/RxSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxSwift/RxSwift-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxSwift/RxSwift.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxSwift;\n\t\t\t\tPRODUCT_NAME = RxSwift;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2539F7AA518E214ED06639F251D62C91 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2094BFBE78A2839B3C673A3E450C77FC /* GCDWebServer.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/GCDWebServer/GCDWebServer-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/GCDWebServer/GCDWebServer-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/GCDWebServer/GCDWebServer.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = GCDWebServer;\n\t\t\t\tPRODUCT_NAME = GCDWebServer;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2B85D48D53650AE64148B523322A5F29 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2F138B6C28378A801D2186B22E1E6224 /* RxCocoa.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxCocoa/RxCocoa-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxCocoa/RxCocoa-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxCocoa/RxCocoa.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxCocoa;\n\t\t\t\tPRODUCT_NAME = RxCocoa;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3AFB1C88E05301BC48B8F2B048ED1025 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = AF22EDE51D4C2AF18359CE03247D06F1 /* RxCocoa.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxCocoa/RxCocoa-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxCocoa/RxCocoa-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxCocoa/RxCocoa.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxCocoa;\n\t\t\t\tPRODUCT_NAME = RxCocoa;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t3C142CA6AB0CA7F833124C32A76D5882 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9A71B9958F30759ED2645E0DF9ADF314 /* Pods-ShadowsocksX-NG.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t435521A8C1A030B456A3602B835F915D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 70C291AA3C3CEE619534F472C4F04882 /* MASShortcut.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCONFIGURATION_BUILD_DIR = \"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut\";\n\t\t\t\tIBSC_MODULE = MASShortcut;\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MASShortcut/ResourceBundle-MASShortcut-MASShortcut-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_NAME = MASShortcut;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t464AFC3D045DAC93B8A74739B86B31AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5EE446AD8C625612BFF0E37E4419E0FD /* BRLOptionParser.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPRODUCT_MODULE_NAME = BRLOptionParser;\n\t\t\t\tPRODUCT_NAME = BRLOptionParser;\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5E5046922B2BADEB6AE175DCA2A5C450 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_DEBUG=1\",\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8492155DEB6029C10D570132B7564FA2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B81749D1C6130BC14B2386B76041124F /* GCDWebServer.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/GCDWebServer/GCDWebServer-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/GCDWebServer/GCDWebServer-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/GCDWebServer/GCDWebServer.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = GCDWebServer;\n\t\t\t\tPRODUCT_NAME = GCDWebServer;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8D11F123E993591D305166C07349A576 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 196DA983244F60766BA272090829A16E /* Pods-ShadowsocksX-NGTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8F694BB186184267497C5B29EBD5F103 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 75EA425CE2A4DBDDEB580C7303DD2454 /* Alamofire.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Alamofire/Alamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Alamofire/Alamofire-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Alamofire/Alamofire.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = Alamofire;\n\t\t\t\tPRODUCT_NAME = Alamofire;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.3;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t90EDC1405B8CA8EDAD433A863FDD47C4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D70A973E907BDE134197952FF14301CE /* RxRelay.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxRelay/RxRelay-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxRelay/RxRelay-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxRelay/RxRelay.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxRelay;\n\t\t\t\tPRODUCT_NAME = RxRelay;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9570335934A831709D5FDB644D8144D9 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5C0C485AB4EA81F3E9128F65E9AC66CA /* Pods-ShadowsocksX-NGTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t992C0F3AEB140A12268A0B7AB779808B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 92B4BB091693150E5B1FCC6987683C6F /* Pods-ShadowsocksX-NG.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap\";\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9A282D83C54CDCBE99AC3D556E781819 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D231BAD0830AAA293F76CB7428ADA704 /* MASShortcut.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCONFIGURATION_BUILD_DIR = \"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MASShortcut\";\n\t\t\t\tIBSC_MODULE = MASShortcut;\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MASShortcut/ResourceBundle-MASShortcut-MASShortcut-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Bundles\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_NAME = MASShortcut;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA977C7C72501F07BFFC97CA3F19F344F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C3B6C103B3C3936D11BF01C71C0EE380 /* BRLOptionParser.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPRODUCT_MODULE_NAME = BRLOptionParser;\n\t\t\t\tPRODUCT_NAME = BRLOptionParser;\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAE5F5BC820C835E9310C556B3D39E167 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 70C291AA3C3CEE619534F472C4F04882 /* MASShortcut.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MASShortcut/MASShortcut-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MASShortcut/MASShortcut-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/MASShortcut/MASShortcut.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = MASShortcut;\n\t\t\t\tPRODUCT_NAME = MASShortcut;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD256BAA9A69C64A728E66C27D53FDD4B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_RELEASE=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tDDA9EC41D966236C68CB4AB50CCF2287 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 848DD5BA5CA758D1F00A7F6F947019EB /* Alamofire.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Alamofire/Alamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Alamofire/Alamofire-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Alamofire/Alamofire.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = Alamofire;\n\t\t\t\tPRODUCT_NAME = Alamofire;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.3;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tDF12A32B61F9AC9FC15D4FEE49C27C64 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D231BAD0830AAA293F76CB7428ADA704 /* MASShortcut.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MASShortcut/MASShortcut-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MASShortcut/MASShortcut-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/MASShortcut/MASShortcut.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = MASShortcut;\n\t\t\t\tPRODUCT_NAME = MASShortcut;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE50DD4E0C6E58142D33757B5C9E7B75C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BF25DE5F0433D7BA7D6F91A5F113542A /* RxRelay.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxRelay/RxRelay-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxRelay/RxRelay-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxRelay/RxRelay.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxRelay;\n\t\t\t\tPRODUCT_NAME = RxRelay;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF2D56CB7664FC6CD92EB5B8E9298A5E7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 28F6CED61832E1CE6BA74AA90F7E45EE /* RxSwift.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxSwift/RxSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxSwift/RxSwift-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxSwift/RxSwift.modulemap\";\n\t\t\t\tPRODUCT_MODULE_NAME = RxSwift;\n\t\t\t\tPRODUCT_NAME = RxSwift;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 5.1;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF6B84B253DE1626F094BD37FC42474DF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D8C88B0B7BFE785BC9B00D1C53FDC003 /* Pods-proxy_conf_helper.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tEXECUTABLE_PREFIX = lib;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0D501A92E69AF80E7786DD9C0D172BEC /* Build configuration list for PBXNativeTarget \"Pods-proxy_conf_helper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF6B84B253DE1626F094BD37FC42474DF /* Debug */,\n\t\t\t\t12B0FE32A40DD86F2B679BA026ED60EB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1C26E77821938498151B66E4B3FAFDB5 /* Build configuration list for PBXNativeTarget \"MASShortcut-MASShortcut\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t435521A8C1A030B456A3602B835F915D /* Debug */,\n\t\t\t\t9A282D83C54CDCBE99AC3D556E781819 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t3797157A80385C2407F752CEE1BFEB21 /* Build configuration list for PBXNativeTarget \"RxRelay\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE50DD4E0C6E58142D33757B5C9E7B75C /* Debug */,\n\t\t\t\t90EDC1405B8CA8EDAD433A863FDD47C4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5E5046922B2BADEB6AE175DCA2A5C450 /* Debug */,\n\t\t\t\tD256BAA9A69C64A728E66C27D53FDD4B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6331D6AD3A4489B8CBA44A44D38FD80A /* Build configuration list for PBXNativeTarget \"RxSwift\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1B9B12FB7A187E6EA55EABA8BB6F0938 /* Debug */,\n\t\t\t\tF2D56CB7664FC6CD92EB5B8E9298A5E7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t690C9430B03B92419AFA4555712EC873 /* Build configuration list for PBXNativeTarget \"GCDWebServer\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8492155DEB6029C10D570132B7564FA2 /* Debug */,\n\t\t\t\t2539F7AA518E214ED06639F251D62C91 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6D442598AC59E49374231C4242255CA3 /* Build configuration list for PBXNativeTarget \"BRLOptionParser\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t464AFC3D045DAC93B8A74739B86B31AE /* Debug */,\n\t\t\t\tA977C7C72501F07BFFC97CA3F19F344F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t78E219AC01CD5AFED663C9AB28280801 /* Build configuration list for PBXNativeTarget \"Alamofire\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8F694BB186184267497C5B29EBD5F103 /* Debug */,\n\t\t\t\tDDA9EC41D966236C68CB4AB50CCF2287 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t84B5ECA69733DA3FEDC652649E6E42C5 /* Build configuration list for PBXNativeTarget \"Pods-ShadowsocksX-NGTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8D11F123E993591D305166C07349A576 /* Debug */,\n\t\t\t\t9570335934A831709D5FDB644D8144D9 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t975822F53DB5EF99EE2C5EA67BC503C9 /* Build configuration list for PBXNativeTarget \"Pods-ShadowsocksX-NG\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3C142CA6AB0CA7F833124C32A76D5882 /* Debug */,\n\t\t\t\t992C0F3AEB140A12268A0B7AB779808B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tABE56D8D3781109924A96BB7837ED223 /* Build configuration list for PBXNativeTarget \"RxCocoa\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2B85D48D53650AE64148B523322A5F29 /* Debug */,\n\t\t\t\t3AFB1C88E05301BC48B8F2B048ED1025 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tE888D466E966B416D89BA302F582A3F5 /* Build configuration list for PBXNativeTarget \"MASShortcut\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAE5F5BC820C835E9310C556B3D39E167 /* Debug */,\n\t\t\t\tDF12A32B61F9AC9FC15D4FEE49C27C64 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;\n}\n"
  },
  {
    "path": "Pods/RxCocoa/LICENSE.md",
    "content": "**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/Bag.swift",
    "content": "//\n//  Bag.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Swift\n\nlet arrayDictionaryMaxSize = 30\n\nstruct BagKey {\n    /**\n    Unique identifier for object added to `Bag`.\n     \n    It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz,\n     it would take ~150 years of continuous running time for it to overflow.\n    */\n    fileprivate let rawValue: UInt64\n}\n\n/**\nData structure that represents a bag of elements typed `T`.\n\nSingle element can be stored multiple times.\n\nTime and space complexity of insertion and deletion is O(n). \n\nIt is suitable for storing small number of elements.\n*/\nstruct Bag<T> : CustomDebugStringConvertible {\n    /// Type of identifier for inserted elements.\n    typealias KeyType = BagKey\n    \n    typealias Entry = (key: BagKey, value: T)\n \n    private var _nextKey: BagKey = BagKey(rawValue: 0)\n\n    // data\n\n    // first fill inline variables\n    var _key0: BagKey?\n    var _value0: T?\n\n    // then fill \"array dictionary\"\n    var _pairs = ContiguousArray<Entry>()\n\n    // last is sparse dictionary\n    var _dictionary: [BagKey: T]?\n\n    var _onlyFastPath = true\n\n    /// Creates new empty `Bag`.\n    init() {\n    }\n    \n    /**\n    Inserts `value` into bag.\n    \n    - parameter element: Element to insert.\n    - returns: Key that can be used to remove element from bag.\n    */\n    mutating func insert(_ element: T) -> BagKey {\n        let key = _nextKey\n\n        _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1)\n\n        if _key0 == nil {\n            _key0 = key\n            _value0 = element\n            return key\n        }\n\n        _onlyFastPath = false\n\n        if _dictionary != nil {\n            _dictionary![key] = element\n            return key\n        }\n\n        if _pairs.count < arrayDictionaryMaxSize {\n            _pairs.append((key: key, value: element))\n            return key\n        }\n        \n        _dictionary = [key: element]\n        \n        return key\n    }\n    \n    /// - returns: Number of elements in bag.\n    var count: Int {\n        let dictionaryCount: Int = _dictionary?.count ?? 0\n        return (_value0 != nil ? 1 : 0) + _pairs.count + dictionaryCount\n    }\n    \n    /// Removes all elements from bag and clears capacity.\n    mutating func removeAll() {\n        _key0 = nil\n        _value0 = nil\n\n        _pairs.removeAll(keepingCapacity: false)\n        _dictionary?.removeAll(keepingCapacity: false)\n    }\n    \n    /**\n    Removes element with a specific `key` from bag.\n    \n    - parameter key: Key that identifies element to remove from bag.\n    - returns: Element that bag contained, or nil in case element was already removed.\n    */\n    mutating func removeKey(_ key: BagKey) -> T? {\n        if _key0 == key {\n            _key0 = nil\n            let value = _value0!\n            _value0 = nil\n            return value\n        }\n\n        if let existingObject = _dictionary?.removeValue(forKey: key) {\n            return existingObject\n        }\n\n        for i in 0 ..< _pairs.count where _pairs[i].key == key {\n            let value = _pairs[i].value\n            _pairs.remove(at: i)\n            return value\n        }\n\n        return nil\n    }\n}\n\nextension Bag {\n    /// A textual representation of `self`, suitable for debugging.\n    var debugDescription : String {\n        \"\\(self.count) elements in Bag\"\n    }\n}\n\nextension Bag {\n    /// Enumerates elements inside the bag.\n    ///\n    /// - parameter action: Enumeration closure.\n    func forEach(_ action: (T) -> Void) {\n        if _onlyFastPath {\n            if let value0 = _value0 {\n                action(value0)\n            }\n            return\n        }\n\n        let value0 = _value0\n        let dictionary = _dictionary\n\n        if let value0 = value0 {\n            action(value0)\n        }\n\n        for i in 0 ..< _pairs.count {\n            action(_pairs[i].value)\n        }\n\n        if dictionary?.count ?? 0 > 0 {\n            for element in dictionary!.values {\n                action(element)\n            }\n        }\n    }\n}\n\nextension BagKey: Hashable {\n    func hash(into hasher: inout Hasher) {\n        hasher.combine(rawValue)\n    }\n}\n\nfunc ==(lhs: BagKey, rhs: BagKey) -> Bool {\n    lhs.rawValue == rhs.rawValue\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift",
    "content": "//\n//  InfiniteSequence.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence that repeats `repeatedValue` infinite number of times.\nstruct InfiniteSequence<Element> : Sequence {\n    typealias Iterator = AnyIterator<Element>\n    \n    private let repeatedValue: Element\n    \n    init(repeatedValue: Element) {\n        self.repeatedValue = repeatedValue\n    }\n    \n    func makeIterator() -> Iterator {\n        let repeatedValue = self.repeatedValue\n        return AnyIterator { repeatedValue }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift",
    "content": "//\n//  PriorityQueue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct PriorityQueue<Element> {\n    private let hasHigherPriority: (Element, Element) -> Bool\n    private let isEqual: (Element, Element) -> Bool\n\n    private var elements = [Element]()\n\n    init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) {\n        self.hasHigherPriority = hasHigherPriority\n        self.isEqual = isEqual\n    }\n\n    mutating func enqueue(_ element: Element) {\n        elements.append(element)\n        bubbleToHigherPriority(elements.count - 1)\n    }\n\n    func peek() -> Element? {\n        elements.first\n    }\n\n    var isEmpty: Bool {\n        elements.count == 0\n    }\n\n    mutating func dequeue() -> Element? {\n        guard let front = peek() else {\n            return nil\n        }\n\n        removeAt(0)\n\n        return front\n    }\n\n    mutating func remove(_ element: Element) {\n        for i in 0 ..< elements.count {\n            if self.isEqual(elements[i], element) {\n                removeAt(i)\n                return\n            }\n        }\n    }\n\n    private mutating func removeAt(_ index: Int) {\n        let removingLast = index == elements.count - 1\n        if !removingLast {\n            elements.swapAt(index, elements.count - 1)\n        }\n\n        _ = elements.popLast()\n\n        if !removingLast {\n            bubbleToHigherPriority(index)\n            bubbleToLowerPriority(index)\n        }\n    }\n\n    private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n\n        while unbalancedIndex > 0 {\n            let parentIndex = (unbalancedIndex - 1) / 2\n            guard self.hasHigherPriority(elements[unbalancedIndex], elements[parentIndex]) else { break }\n            elements.swapAt(unbalancedIndex, parentIndex)\n            unbalancedIndex = parentIndex\n        }\n    }\n\n    private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n        while true {\n            let leftChildIndex = unbalancedIndex * 2 + 1\n            let rightChildIndex = unbalancedIndex * 2 + 2\n\n            var highestPriorityIndex = unbalancedIndex\n\n            if leftChildIndex < elements.count && self.hasHigherPriority(elements[leftChildIndex], elements[highestPriorityIndex]) {\n                highestPriorityIndex = leftChildIndex\n            }\n\n            if rightChildIndex < elements.count && self.hasHigherPriority(elements[rightChildIndex], elements[highestPriorityIndex]) {\n                highestPriorityIndex = rightChildIndex\n            }\n\n            guard highestPriorityIndex != unbalancedIndex else { break }\n            elements.swapAt(highestPriorityIndex, unbalancedIndex)\n\n            unbalancedIndex = highestPriorityIndex\n        }\n    }\n}\n\nextension PriorityQueue : CustomDebugStringConvertible {\n    var debugDescription: String {\n        elements.debugDescription\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/Queue.swift",
    "content": "//\n//  Queue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nData structure that represents queue.\n\nComplexity of `enqueue`, `dequeue` is O(1) when number of operations is\naveraged over N operations.\n\nComplexity of `peek` is O(1).\n*/\nstruct Queue<T>: Sequence {\n    /// Type of generator.\n    typealias Generator = AnyIterator<T>\n\n    private let resizeFactor = 2\n    \n    private var storage: ContiguousArray<T?>\n    private var innerCount = 0\n    private var pushNextIndex = 0\n    private let initialCapacity: Int\n\n    /**\n    Creates new queue.\n    \n    - parameter capacity: Capacity of newly created queue.\n    */\n    init(capacity: Int) {\n        initialCapacity = capacity\n\n        storage = ContiguousArray<T?>(repeating: nil, count: capacity)\n    }\n    \n    private var dequeueIndex: Int {\n        let index = pushNextIndex - count\n        return index < 0 ? index + storage.count : index\n    }\n    \n    /// - returns: Is queue empty.\n    var isEmpty: Bool { count == 0 }\n    \n    /// - returns: Number of elements inside queue.\n    var count: Int { innerCount }\n    \n    /// - returns: Element in front of a list of elements to `dequeue`.\n    func peek() -> T {\n        precondition(count > 0)\n        \n        return storage[dequeueIndex]!\n    }\n    \n    mutating private func resizeTo(_ size: Int) {\n        var newStorage = ContiguousArray<T?>(repeating: nil, count: size)\n        \n        let count = self.count\n        \n        let dequeueIndex = self.dequeueIndex\n        let spaceToEndOfQueue = storage.count - dequeueIndex\n        \n        // first batch is from dequeue index to end of array\n        let countElementsInFirstBatch = Swift.min(count, spaceToEndOfQueue)\n        // second batch is wrapped from start of array to end of queue\n        let numberOfElementsInSecondBatch = count - countElementsInFirstBatch\n        \n        newStorage[0 ..< countElementsInFirstBatch] = storage[dequeueIndex ..< (dequeueIndex + countElementsInFirstBatch)]\n        newStorage[countElementsInFirstBatch ..< (countElementsInFirstBatch + numberOfElementsInSecondBatch)] = storage[0 ..< numberOfElementsInSecondBatch]\n        \n        self.innerCount = count\n        pushNextIndex = count\n        storage = newStorage\n    }\n    \n    /// Enqueues `element`.\n    ///\n    /// - parameter element: Element to enqueue.\n    mutating func enqueue(_ element: T) {\n        if count == storage.count {\n            resizeTo(Swift.max(storage.count, 1) * resizeFactor)\n        }\n        \n        storage[pushNextIndex] = element\n        pushNextIndex += 1\n        innerCount += 1\n        \n        if pushNextIndex >= storage.count {\n            pushNextIndex -= storage.count\n        }\n    }\n    \n    private mutating func dequeueElementOnly() -> T {\n        precondition(count > 0)\n        \n        let index = dequeueIndex\n\n        defer {\n            storage[index] = nil\n            innerCount -= 1\n        }\n\n        return storage[index]!\n    }\n\n    /// Dequeues element or throws an exception in case queue is empty.\n    ///\n    /// - returns: Dequeued element.\n    mutating func dequeue() -> T? {\n        if self.count == 0 {\n            return nil\n        }\n\n        defer {\n            let downsizeLimit = storage.count / (resizeFactor * resizeFactor)\n            if count < downsizeLimit && downsizeLimit >= initialCapacity {\n                resizeTo(storage.count / resizeFactor)\n            }\n        }\n\n        return dequeueElementOnly()\n    }\n    \n    /// - returns: Generator of contained elements.\n    func makeIterator() -> AnyIterator<T> {\n        var i = dequeueIndex\n        var innerCount = count\n\n        return AnyIterator {\n            if innerCount == 0 {\n                return nil\n            }\n\n            defer {\n                innerCount -= 1\n                i += 1\n            }\n\n            if i >= self.storage.count {\n                i -= self.storage.count\n            }\n\n            return self.storage[i]\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift",
    "content": "//\n//  DispatchQueue+Extensions.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 10/22/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n\nextension DispatchQueue {\n    private static var token: DispatchSpecificKey<()> = {\n        let key = DispatchSpecificKey<()>()\n        DispatchQueue.main.setSpecific(key: key, value: ())\n        return key\n    }()\n\n    static var isMain: Bool {\n        DispatchQueue.getSpecific(key: token) != nil\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/Platform.Darwin.swift",
    "content": "//\n//  Platform.Darwin.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)\n\n    import Darwin\n    import Foundation\n\n    extension Thread {\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying) {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n        }\n\n        static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n            \n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/Platform.Linux.swift",
    "content": "//\n//  Platform.Linux.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(Linux)\n\n    import Foundation\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: String) {\n            if let newValue = value {\n                Thread.current.threadDictionary[key] = newValue\n            }\n            else {\n                Thread.current.threadDictionary[key] = nil\n            }\n        }\n\n        static func getThreadLocalStorageValueForKey<T: AnyObject>(_ key: String) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/RecursiveLock.swift",
    "content": "//\n//  RecursiveLock.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/18/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n#if TRACE_RESOURCES\n    class RecursiveLock: NSRecursiveLock {\n        override init() {\n            _ = Resources.incrementTotal()\n            super.init()\n        }\n\n        override func lock() {\n            super.lock()\n            _ = Resources.incrementTotal()\n        }\n\n        override func unlock() {\n            super.unlock()\n            _ = Resources.decrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    }\n#else\n    typealias RecursiveLock = NSRecursiveLock\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/README.md",
    "content": "<p align=\"center\">\n<img src=\"assets/RxSwift_Logo.png\" width=\"35%\" alt=\"RxSwift Logo\" />\n<br />\n<a href=\"https://actions-badge.atrox.dev/ReactiveX/RxSwift/goto\" target=\"_blank\"><img src=\"https://github.com/ReactiveX/RxSwift/workflows/RxSwift/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n<img src=\"https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg\" alt=\"Supported Platforms: iOS, macOS, tvOS, watchOS & Linux\" />\n<br />\n<a href=\"https://cocoapods.org/pods/RxSwift\" alt=\"RxSwift on CocoaPods\" title=\"RxSwift on CocoaPods\"><img src=\"https://img.shields.io/cocoapods/v/RxSwift.svg\" /></a>\n<a href=\"https://github.com/Carthage/Carthage\" alt=\"RxSwift on Carthage\" title=\"RxSwift on Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" /></a>\n<a href=\"https://github.com/apple/swift-package-manager\" alt=\"RxSwift on Swift Package Manager\" title=\"RxSwift on Swift Package Manager\"><img src=\"https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg\" /></a>\n</p>\n\nRx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface, which lets you broadcast and subscribe to values and other events from an `Observable` stream.  \n\nRxSwift is the Swift-specific implementation of the [Reactive Extensions](http://reactivex.io) standard.\n\n<p align=\"center\"><img src=\"assets/example.png\" width=\"55%\" alt=\"RxSwift Observable Example of a price constantly changing and updating the app's UI\" /></p>\n\nWhile this version aims to stay true to the original spirit and naming conventions of Rx, this projects also aims to provide a true Swift-first API for Rx APIs.\n\nCross platform documentation can be found on [ReactiveX.io](http://reactivex.io/).\n\nLike other Rx implementation, RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of `Observable` objects and a suite of methods to transform and compose these pieces of asynchronous work.\n\nKVO observation, async operations, UI Events and other streams of data are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.\n\n## I came here because I want to ...\n\n###### ... understand\n\n* [why use rx?](Documentation/Why.md)\n* [the basics, getting started with RxSwift](Documentation/GettingStarted.md)\n* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, and `ControlProperty` ... and why do they exist?\n* [testing](Documentation/UnitTests.md)\n* [tips and common errors](Documentation/Tips.md)\n* [debugging](Documentation/GettingStarted.md#debugging)\n* [the math behind Rx](Documentation/MathBehindRx.md)\n* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)\n\n###### ... install\n\n* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation)\n\n###### ... hack around\n\n* with the example app. [Running Example App](Documentation/ExampleApp.md)\n* with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)\n\n###### ... interact\n\n* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[Join Slack Channel](http://slack.rxswift.org)\n* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)\n* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)\n* Help out [Check out contribution guide](CONTRIBUTING.md)\n\n###### ... compare\n\n* [with Combine and ReactiveSwift](Documentation/ComparisonWithOtherLibraries.md).\n\n###### ... understand the structure\n\nRxSwift is as compositional as the asynchronous work it drives. The core unit is RxSwift itself, while other dependencies can be added for UI Work, testing, and more.\n\nIt comprises five separate components depending on each other in the following way:\n\n```none\n┌──────────────┐    ┌──────────────┐\n│   RxCocoa    ├────▶   RxRelay    │\n└───────┬──────┘    └──────┬───────┘\n        │                  │        \n┌───────▼──────────────────▼───────┐\n│             RxSwift              │\n└───────▲──────────────────▲───────┘\n        │                  │        \n┌───────┴──────┐    ┌──────┴───────┐\n│    RxTest    │    │  RxBlocking  │\n└──────────────┘    └──────────────┘\n```\n\n* **RxSwift**: The core of RxSwift, providing the Rx standard as (mostly) defined by [ReactiveX](https://reactivex.io). It has no other dependencies.\n* **RxCocoa**: Provides Cocoa-specific capabilities for general iOS/macOS/watchOS & tvOS app development, such as Shared Sequences, Traits, and much more. It depends on both `RxSwift` and `RxRelay`.\n* **RxRelay**: Provides `PublishRelay`, `BehaviorRelay` and `ReplayRelay`, three [simple wrappers around Subjects](https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Subjects.md#relays). It depends on `RxSwift`. \n* **RxTest** and **RxBlocking**: Provides testing capabilities for Rx-based systems. It depends on `RxSwift`.\n\n## Usage\n\n<table>\n  <tr>\n    <th width=\"30%\">Here's an example</th>\n    <th width=\"30%\">In Action</th>\n  </tr>\n  <tr>\n    <td>Define search for GitHub repositories ...</td>\n    <th rowspan=\"9\"><img src=\"https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif\"></th>\n  </tr>\n  <tr>\n    <td><div class=\"highlight highlight-source-swift\"><pre>\nlet searchResults = searchBar.rx.text.orEmpty\n    .throttle(.milliseconds(300), scheduler: MainScheduler.instance)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> Observable&lt;[Repository]&gt; in\n        if query.isEmpty {\n            return .just([])\n        }\n        return searchGitHub(query)\n            .catchAndReturn([])\n    }\n    .observe(on: MainScheduler.instance)</pre></div></td>\n  </tr>\n  <tr>\n    <td>... then bind the results to your tableview</td>\n  </tr>\n  <tr>\n    <td width=\"30%\"><div class=\"highlight highlight-source-swift\"><pre>\nsearchResults\n    .bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) {\n        (index, repository: Repository, cell) in\n        cell.textLabel?.text = repository.name\n        cell.detailTextLabel?.text = repository.url\n    }\n    .disposed(by: disposeBag)</pre></div></td>\n  </tr>\n</table>\n\n\n## Requirements\n\n* Xcode 12.x\n* Swift 5.x\n\nFor Xcode 11 and below, [use RxSwift 5.x](https://github.com/ReactiveX/RxSwift/releases/tag/5.1.1).\n\n## Installation\n\nRxSwift doesn't contain any external dependencies.\n\nThese are currently the supported installation options:\n\n### Manual\n\nOpen Rx.xcworkspace, choose `RxExample` and hit run. This method will build everything and run the sample app\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'RxSwift', '6.2.0'\n    pod 'RxCocoa', '6.2.0'\nend\n\n# RxTest and RxBlocking make the most sense in the context of unit/integration tests\ntarget 'YOUR_TESTING_TARGET' do\n    pod 'RxBlocking', '6.2.0'\n    pod 'RxTest', '6.2.0'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n### XCFrameworks\n\nEach release starting with RxSwift 6 includes `*.xcframework` framework binaries.\n\nSimply drag the needed framework binaries to your **Frameworks, Libraries, and Embedded Content** section under your target's **General** tab.\n\n> **Note**: If you're using `RxCocoa`, be sure to also drag **RxCocoaRuntime.xcframework** before importing `RxCocoa`.\n\n<img src=\"https://raw.githubusercontent.com/ReactiveX/RxSwift/main/assets/xcframeworks.png\" alt=\"XCFrameworks instructions\" width=\"65%\">\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\nAdd this to `Cartfile`\n\n```\ngithub \"ReactiveX/RxSwift\" \"6.2.0\"\n```\n\n```bash\n$ carthage update\n```\n\n#### Carthage as a Static Library\n\nCarthage defaults to building RxSwift as a Dynamic Library. \n\nIf you wish to build RxSwift as a Static Library using Carthage you may use the script below to manually modify the framework type before building with Carthage:\n\n```bash\ncarthage update RxSwift --platform iOS --no-build\nsed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj\ncarthage build RxSwift --platform iOS\n```\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\n> **Note**: There is a critical cross-dependency bug affecting many projects including RxSwift in Swift Package Manager. We've [filed a bug (SR-12303)](https://bugs.swift.org/browse/SR-12303) in early 2020 but have no answer yet. Your mileage may vary. A partial workaround can be found [here](https://github.com/ReactiveX/RxSwift/issues/2127#issuecomment-717830502).\n\nCreate a `Package.swift` file.\n\n```swift\n// swift-tools-version:5.0\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"RxTestProject\",\n  dependencies: [\n    .package(url: \"https://github.com/ReactiveX/RxSwift.git\", .exact(\"6.2.0\"))\n  ],\n  targets: [\n    .target(name: \"RxTestProject\", dependencies: [\"RxSwift\", \"RxCocoa\"])\n  ]\n)\n```\n\n```bash\n$ swift build\n```\n\nTo build or test a module with RxTest dependency, set `TEST=1`.\n\n```bash\n$ TEST=1 swift test\n```\n\n### Manually using git submodules\n\n* Add RxSwift as a submodule\n\n```bash\n$ git submodule add git@github.com:ReactiveX/RxSwift.git\n```\n\n* Drag `Rx.xcodeproj` into Project Navigator\n* Go to `Project > Targets > Build Phases > Link Binary With Libraries`, click `+` and select `RxSwift`, `RxCocoa` and `RxRelay` targets\n\n## References\n\n* [http://reactivex.io/](http://reactivex.io/)\n* [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)\n* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift-reactive-programming-with-swift)\n* [RxSwift: Debunking the myth of hard (YouTube)](https://www.youtube.com/watch?v=GdvLP0ZAhhc)\n* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)\n* [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)\n* [Reactive Programming Overview (Jafar Husain from Netflix)](https://youtu.be/-8Y1-lE6NSA)\n* [Subject/Observer is Dual to Iterator (paper)](http://csl.stanford.edu/~christos/pldi2010.fit/meijer.duality.pdf)\n* [Rx standard sequence operators visualized (visualization tool)](http://rxmarbles.com/)\n* [Haskell](https://www.haskell.org/)\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift",
    "content": "//\n//  ControlTarget.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS) || os(macOS)\n\nimport RxSwift\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n\n    typealias Control = UIKit.UIControl\n#elseif os(macOS)\n    import Cocoa\n\n    typealias Control = Cocoa.NSControl\n#endif\n\n// This should be only used from `MainScheduler`\nfinal class ControlTarget: RxTarget {\n    typealias Callback = (Control) -> Void\n\n    let selector: Selector = #selector(ControlTarget.eventHandler(_:))\n\n    weak var control: Control?\n#if os(iOS) || os(tvOS)\n    let controlEvents: UIControl.Event\n#endif\n    var callback: Callback?\n    #if os(iOS) || os(tvOS)\n    init(control: Control, controlEvents: UIControl.Event, callback: @escaping Callback) {\n        MainScheduler.ensureRunningOnMainThread()\n\n        self.control = control\n        self.controlEvents = controlEvents\n        self.callback = callback\n\n        super.init()\n\n        control.addTarget(self, action: selector, for: controlEvents)\n\n        let method = self.method(for: selector)\n        if method == nil {\n            rxFatalError(\"Can't find method\")\n        }\n    }\n#elseif os(macOS)\n    init(control: Control, callback: @escaping Callback) {\n        MainScheduler.ensureRunningOnMainThread()\n\n        self.control = control\n        self.callback = callback\n\n        super.init()\n\n        control.target = self\n        control.action = self.selector\n\n        let method = self.method(for: self.selector)\n        if method == nil {\n            rxFatalError(\"Can't find method\")\n        }\n    }\n#endif\n\n    @objc func eventHandler(_ sender: Control!) {\n        if let callback = self.callback, let control = self.control {\n            callback(control)\n        }\n    }\n\n    override func dispose() {\n        super.dispose()\n#if os(iOS) || os(tvOS)\n        self.control?.removeTarget(self, action: self.selector, for: self.controlEvents)\n#elseif os(macOS)\n        self.control?.target = nil\n        self.control?.action = nil\n#endif\n        self.callback = nil\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift",
    "content": "//\n//  DelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n    import RxSwift\n    #if SWIFT_PACKAGE && !os(Linux)\n        import RxCocoaRuntime\n    #endif\n\n    /// Base class for `DelegateProxyType` protocol.\n    ///\n    /// This implementation is not thread safe and can be used only from one thread (Main thread).\n    open class DelegateProxy<P: AnyObject, D>: _RXDelegateProxy {\n        public typealias ParentObject = P\n        public typealias Delegate = D\n\n        private var _sentMessageForSelector = [Selector: MessageDispatcher]()\n        private var _methodInvokedForSelector = [Selector: MessageDispatcher]()\n\n        /// Parent object associated with delegate proxy.\n        private weak var _parentObject: ParentObject?\n\n        private let _currentDelegateFor: (ParentObject) -> AnyObject?\n        private let _setCurrentDelegateTo: (AnyObject?, ParentObject) -> Void\n\n        /// Initializes new instance.\n        ///\n        /// - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object.\n        public init<Proxy: DelegateProxyType>(parentObject: ParentObject, delegateProxy: Proxy.Type)\n            where Proxy: DelegateProxy<ParentObject, Delegate>, Proxy.ParentObject == ParentObject, Proxy.Delegate == Delegate {\n            self._parentObject = parentObject\n            self._currentDelegateFor = delegateProxy._currentDelegate\n            self._setCurrentDelegateTo = delegateProxy._setCurrentDelegate\n\n            MainScheduler.ensureRunningOnMainThread()\n            #if TRACE_RESOURCES\n                _ = Resources.incrementTotal()\n            #endif\n            super.init()\n        }\n\n        /**\n         Returns observable sequence of invocations of delegate methods. Elements are sent *before method is invoked*.\n\n         Only methods that have `void` return value can be observed using this method because\n         those methods are used as a notification mechanism. It doesn't matter if they are optional\n         or not. Observing is performed by installing a hidden associated `PublishSubject` that is\n         used to dispatch messages to observers.\n\n         Delegate methods that have non `void` return value can't be observed directly using this method\n         because:\n         * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism\n         * there is no sensible automatic way to determine a default return value\n\n         In case observing of delegate methods that have return type is required, it can be done by\n         manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method.\n\n         e.g.\n\n             // delegate proxy part (RxScrollViewDelegateProxy)\n\n             let internalSubject = PublishSubject<CGPoint>\n\n             public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool {\n                 internalSubject.on(.next(arg1))\n                 return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue\n             }\n\n         ....\n\n             // reactive property implementation in a real class (`UIScrollView`)\n             public var property: Observable<CGPoint> {\n                 let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n                 return proxy.internalSubject.asObservable()\n             }\n\n         **In case calling this method prints \"Delegate proxy is already implementing `\\(selector)`,\n         a more performant way of registering might exist.\", that means that manual observing method\n         is required analog to the example above because delegate method has already been implemented.**\n\n         - parameter selector: Selector used to filter observed invocations of delegate methods.\n         - returns: Observable sequence of arguments passed to `selector` method.\n         */\n        open func sentMessage(_ selector: Selector) -> Observable<[Any]> {\n            MainScheduler.ensureRunningOnMainThread()\n\n            let subject = self._sentMessageForSelector[selector]\n\n            if let subject = subject {\n                return subject.asObservable()\n            }\n            else {\n                let subject = MessageDispatcher(selector: selector, delegateProxy: self)\n                self._sentMessageForSelector[selector] = subject\n                return subject.asObservable()\n            }\n        }\n\n        /**\n         Returns observable sequence of invoked delegate methods. Elements are sent *after method is invoked*.\n\n         Only methods that have `void` return value can be observed using this method because\n         those methods are used as a notification mechanism. It doesn't matter if they are optional\n         or not. Observing is performed by installing a hidden associated `PublishSubject` that is\n         used to dispatch messages to observers.\n\n         Delegate methods that have non `void` return value can't be observed directly using this method\n         because:\n         * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism\n         * there is no sensible automatic way to determine a default return value\n\n         In case observing of delegate methods that have return type is required, it can be done by\n         manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method.\n\n         e.g.\n\n             // delegate proxy part (RxScrollViewDelegateProxy)\n\n             let internalSubject = PublishSubject<CGPoint>\n\n             public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool {\n                 internalSubject.on(.next(arg1))\n                 return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue\n             }\n\n         ....\n\n             // reactive property implementation in a real class (`UIScrollView`)\n             public var property: Observable<CGPoint> {\n                 let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n                 return proxy.internalSubject.asObservable()\n             }\n\n         **In case calling this method prints \"Delegate proxy is already implementing `\\(selector)`,\n         a more performant way of registering might exist.\", that means that manual observing method\n         is required analog to the example above because delegate method has already been implemented.**\n\n         - parameter selector: Selector used to filter observed invocations of delegate methods.\n         - returns: Observable sequence of arguments passed to `selector` method.\n         */\n        open func methodInvoked(_ selector: Selector) -> Observable<[Any]> {\n            MainScheduler.ensureRunningOnMainThread()\n\n            let subject = self._methodInvokedForSelector[selector]\n\n            if let subject = subject {\n                return subject.asObservable()\n            }\n            else {\n                let subject = MessageDispatcher(selector: selector, delegateProxy: self)\n                self._methodInvokedForSelector[selector] = subject\n                return subject.asObservable()\n            }\n        }\n\n        fileprivate func checkSelectorIsObservable(_ selector: Selector) {\n            MainScheduler.ensureRunningOnMainThread()\n\n            if self.hasWiredImplementation(for: selector) {\n                print(\"⚠️ Delegate proxy is already implementing `\\(selector)`, a more performant way of registering might exist.\")\n                return\n            }\n\n            if self.voidDelegateMethodsContain(selector) {\n                return\n            }\n\n            // In case `_forwardToDelegate` is `nil`, it is assumed the check is being done prematurely.\n            if !(self._forwardToDelegate?.responds(to: selector) ?? true) {\n                print(\"⚠️ Using delegate proxy dynamic interception method but the target delegate object doesn't respond to the requested selector. \" +\n                    \"In case pure Swift delegate proxy is being used please use manual observing method by using`PublishSubject`s. \" +\n                    \" (selector: `\\(selector)`, forwardToDelegate: `\\(self._forwardToDelegate ?? self)`)\")\n            }\n        }\n\n        // proxy\n\n        open override func _sentMessage(_ selector: Selector, withArguments arguments: [Any]) {\n            self._sentMessageForSelector[selector]?.on(.next(arguments))\n        }\n\n        open override func _methodInvoked(_ selector: Selector, withArguments arguments: [Any]) {\n            self._methodInvokedForSelector[selector]?.on(.next(arguments))\n        }\n\n        /// Returns reference of normal delegate that receives all forwarded messages\n        /// through `self`.\n        ///\n        /// - returns: Value of reference if set or nil.\n        open func forwardToDelegate() -> Delegate? {\n            return castOptionalOrFatalError(self._forwardToDelegate)\n        }\n\n        /// Sets reference of normal delegate that receives all forwarded messages\n        /// through `self`.\n        ///\n        /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.\n        /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`.\n        open func setForwardToDelegate(_ delegate: Delegate?, retainDelegate: Bool) {\n            #if DEBUG // 4.0 all configurations\n                MainScheduler.ensureRunningOnMainThread()\n            #endif\n            self._setForwardToDelegate(delegate, retainDelegate: retainDelegate)\n\n            let sentSelectors: [Selector] = self._sentMessageForSelector.values.filter { $0.hasObservers }.map { $0.selector }\n            let invokedSelectors: [Selector] = self._methodInvokedForSelector.values.filter { $0.hasObservers }.map { $0.selector }\n            let allUsedSelectors = sentSelectors + invokedSelectors\n\n            for selector in Set(allUsedSelectors) {\n                self.checkSelectorIsObservable(selector)\n            }\n\n            self.reset()\n        }\n\n        private func hasObservers(selector: Selector) -> Bool {\n            return (self._sentMessageForSelector[selector]?.hasObservers ?? false)\n                || (self._methodInvokedForSelector[selector]?.hasObservers ?? false)\n        }\n\n        override open func responds(to aSelector: Selector!) -> Bool {\n            return super.responds(to: aSelector)\n                || (self._forwardToDelegate?.responds(to: aSelector) ?? false)\n                || (self.voidDelegateMethodsContain(aSelector) && self.hasObservers(selector: aSelector))\n        }\n\n        fileprivate func reset() {\n            guard let parentObject = self._parentObject else { return }\n\n            let maybeCurrentDelegate = self._currentDelegateFor(parentObject)\n\n            if maybeCurrentDelegate === self {\n                self._setCurrentDelegateTo(nil, parentObject)\n                self._setCurrentDelegateTo(castOrFatalError(self), parentObject)\n            }\n        }\n\n        deinit {\n            for v in self._sentMessageForSelector.values {\n                v.on(.completed)\n            }\n            for v in self._methodInvokedForSelector.values {\n                v.on(.completed)\n            }\n            #if TRACE_RESOURCES\n                _ = Resources.decrementTotal()\n            #endif\n        }\n    \n\n    }\n\n    private let mainScheduler = MainScheduler()\n\n    private final class MessageDispatcher {\n        private let dispatcher: PublishSubject<[Any]>\n        private let result: Observable<[Any]>\n\n        fileprivate let selector: Selector\n\n        init<P, D>(selector: Selector, delegateProxy _delegateProxy: DelegateProxy<P, D>) {\n            weak var weakDelegateProxy = _delegateProxy\n\n            let dispatcher = PublishSubject<[Any]>()\n            self.dispatcher = dispatcher\n            self.selector = selector\n\n            self.result = dispatcher\n                .do(onSubscribed: { weakDelegateProxy?.checkSelectorIsObservable(selector); weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() })\n                .share()\n                .subscribe(on: mainScheduler)\n        }\n\n        var on: (Event<[Any]>) -> Void {\n            return self.dispatcher.on\n        }\n\n        var hasObservers: Bool {\n            return self.dispatcher.hasObservers\n        }\n\n        func asObservable() -> Observable<[Any]> {\n            return self.result\n        }\n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift",
    "content": "//\n//  DelegateProxyType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n    import Foundation\n    import RxSwift\n\n/**\n`DelegateProxyType` protocol enables using both normal delegates and Rx observable sequences with\nviews that can have only one delegate/datasource registered.\n\n`Proxies` store information about observers, subscriptions and delegates\nfor specific views.\n\nType implementing `DelegateProxyType` should never be initialized directly.\n\nTo fetch initialized instance of type implementing `DelegateProxyType`, `proxy` method\nshould be used.\n\nThis is more or less how it works.\n\n\n\n      +-------------------------------------------+\n      |                                           |                           \n      | UIView subclass (UIScrollView)            |                           \n      |                                           |\n      +-----------+-------------------------------+                           \n                  |                                                           \n                  | Delegate                                                  \n                  |                                                           \n                  |                                                           \n      +-----------v-------------------------------+                           \n      |                                           |                           \n      | Delegate proxy : DelegateProxyType        +-----+---->  Observable<T1>\n      |                , UIScrollViewDelegate     |     |\n      +-----------+-------------------------------+     +---->  Observable<T2>\n                  |                                     |                     \n                  |                                     +---->  Observable<T3>\n                  |                                     |                     \n                  | forwards events                     |\n                  | to custom delegate                  |\n                  |                                     v                     \n      +-----------v-------------------------------+                           \n      |                                           |                           \n      | Custom delegate (UIScrollViewDelegate)    |                           \n      |                                           |\n      +-------------------------------------------+                           \n\n\nSince RxCocoa needs to automagically create those Proxys and because views that have delegates can be hierarchical\n\n     UITableView : UIScrollView : UIView\n\n.. and corresponding delegates are also hierarchical\n\n     UITableViewDelegate : UIScrollViewDelegate : NSObject\n\n... this mechanism can be extended by using the following snippet in `registerKnownImplementations` or in some other\n     part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching).\n\n    RxScrollViewDelegateProxy.register { RxTableViewDelegateProxy(parentObject: $0) }\n\n*/\npublic protocol DelegateProxyType: AnyObject {\n    associatedtype ParentObject: AnyObject\n    associatedtype Delegate\n    \n    /// It is require that enumerate call `register` of the extended DelegateProxy subclasses here.\n    static func registerKnownImplementations()\n\n    /// Unique identifier for delegate\n    static var identifier: UnsafeRawPointer { get }\n\n    /// Returns designated delegate property for object.\n    ///\n    /// Objects can have multiple delegate properties.\n    ///\n    /// Each delegate property needs to have it's own type implementing `DelegateProxyType`.\n    ///\n    /// It's abstract method.\n    ///\n    /// - parameter object: Object that has delegate property.\n    /// - returns: Value of delegate property.\n    static func currentDelegate(for object: ParentObject) -> Delegate?\n\n    /// Sets designated delegate property for object.\n    ///\n    /// Objects can have multiple delegate properties.\n    ///\n    /// Each delegate property needs to have it's own type implementing `DelegateProxyType`.\n    ///\n    /// It's abstract method.\n    ///\n    /// - parameter toObject: Object that has delegate property.\n    /// - parameter delegate: Delegate value.\n    static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject)\n\n    /// Returns reference of normal delegate that receives all forwarded messages\n    /// through `self`.\n    ///\n    /// - returns: Value of reference if set or nil.\n    func forwardToDelegate() -> Delegate?\n\n    /// Sets reference of normal delegate that receives all forwarded messages\n    /// through `self`.\n    ///\n    /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.\n    /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`.\n    func setForwardToDelegate(_ forwardToDelegate: Delegate?, retainDelegate: Bool)\n}\n\n// default implementations\nextension DelegateProxyType {\n    /// Unique identifier for delegate\n    public static var identifier: UnsafeRawPointer {\n        let delegateIdentifier = ObjectIdentifier(Delegate.self)\n        let integerIdentifier = Int(bitPattern: delegateIdentifier)\n        return UnsafeRawPointer(bitPattern: integerIdentifier)!\n    }\n}\n\n// workaround of Delegate: class\nextension DelegateProxyType {\n    static func _currentDelegate(for object: ParentObject) -> AnyObject? {\n        currentDelegate(for: object).map { $0 as AnyObject }\n    }\n    \n    static func _setCurrentDelegate(_ delegate: AnyObject?, to object: ParentObject) {\n        setCurrentDelegate(castOptionalOrFatalError(delegate), to: object)\n    }\n    \n    func _forwardToDelegate() -> AnyObject? {\n        self.forwardToDelegate().map { $0 as AnyObject }\n    }\n    \n    func _setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) {\n        self.setForwardToDelegate(castOptionalOrFatalError(forwardToDelegate), retainDelegate: retainDelegate)\n    }\n}\n\nextension DelegateProxyType {\n\n    /// Store DelegateProxy subclass to factory.\n    /// When make 'Rx*DelegateProxy' subclass, call 'Rx*DelegateProxySubclass.register(for:_)' 1 time, or use it in DelegateProxyFactory\n    /// 'Rx*DelegateProxy' can have one subclass implementation per concrete ParentObject type.\n    /// Should call it from concrete DelegateProxy type, not generic.\n    public static func register<Parent>(make: @escaping (Parent) -> Self) {\n        self.factory.extend(make: make)\n    }\n\n    /// Creates new proxy for target object.\n    /// Should not call this function directory, use 'DelegateProxy.proxy(for:)'\n    public static func createProxy(for object: AnyObject) -> Self {\n        castOrFatalError(factory.createProxy(for: object))\n    }\n\n    /// Returns existing proxy for object or installs new instance of delegate proxy.\n    ///\n    /// - parameter object: Target object on which to install delegate proxy.\n    /// - returns: Installed instance of delegate proxy.\n    ///\n    ///\n    ///     extension Reactive where Base: UISearchBar {\n    ///\n    ///         public var delegate: DelegateProxy<UISearchBar, UISearchBarDelegate> {\n    ///            return RxSearchBarDelegateProxy.proxy(for: base)\n    ///         }\n    ///\n    ///         public var text: ControlProperty<String> {\n    ///             let source: Observable<String> = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))\n    ///             ...\n    ///         }\n    ///     }\n    public static func proxy(for object: ParentObject) -> Self {\n        MainScheduler.ensureRunningOnMainThread()\n\n        let maybeProxy = self.assignedProxy(for: object)\n\n        let proxy: AnyObject\n        if let existingProxy = maybeProxy {\n            proxy = existingProxy\n        }\n        else {\n            proxy = castOrFatalError(self.createProxy(for: object))\n            self.assignProxy(proxy, toObject: object)\n            assert(self.assignedProxy(for: object) === proxy)\n        }\n        let currentDelegate = self._currentDelegate(for: object)\n        let delegateProxy: Self = castOrFatalError(proxy)\n\n        if currentDelegate !== delegateProxy {\n            delegateProxy._setForwardToDelegate(currentDelegate, retainDelegate: false)\n            assert(delegateProxy._forwardToDelegate() === currentDelegate)\n            self._setCurrentDelegate(proxy, to: object)\n            assert(self._currentDelegate(for: object) === proxy)\n            assert(delegateProxy._forwardToDelegate() === currentDelegate)\n        }\n\n        return delegateProxy\n    }\n\n    /// Sets forward delegate for `DelegateProxyType` associated with a specific object and return disposable that can be used to unset the forward to delegate.\n    /// Using this method will also make sure that potential original object cached selectors are cleared and will report any accidental forward delegate mutations.\n    ///\n    /// - parameter forwardDelegate: Delegate object to set.\n    /// - parameter retainDelegate: Retain `forwardDelegate` while it's being set.\n    /// - parameter onProxyForObject: Object that has `delegate` property.\n    /// - returns: Disposable object that can be used to clear forward delegate.\n    public static func installForwardDelegate(_ forwardDelegate: Delegate, retainDelegate: Bool, onProxyForObject object: ParentObject) -> Disposable {\n        weak var weakForwardDelegate: AnyObject? = forwardDelegate as AnyObject\n        let proxy = self.proxy(for: object)\n\n        assert(proxy._forwardToDelegate() === nil, \"This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.\\n\" +\n            \"If you are ok with this, try to set delegate (data source) to `nil` in front of this operation.\\n\" +\n            \" This is the source object value: \\(object)\\n\" +\n            \" This is the original delegate (data source) value: \\(proxy.forwardToDelegate()!)\\n\" +\n            \"Hint: Maybe delegate was already set in xib or storyboard and now it's being overwritten in code.\\n\")\n\n        proxy.setForwardToDelegate(forwardDelegate, retainDelegate: retainDelegate)\n\n        return Disposables.create {\n            MainScheduler.ensureRunningOnMainThread()\n\n            let delegate: AnyObject? = weakForwardDelegate\n\n            assert(delegate == nil || proxy._forwardToDelegate() === delegate, \"Delegate was changed from time it was first set. Current \\(String(describing: proxy.forwardToDelegate())), and it should have been \\(proxy)\")\n\n            proxy.setForwardToDelegate(nil, retainDelegate: retainDelegate)\n        }\n    }\n}\n\n\n// private extensions\nextension DelegateProxyType {\n    private static var factory: DelegateProxyFactory {\n        DelegateProxyFactory.sharedFactory(for: self)\n    }\n\n    private static func assignedProxy(for object: ParentObject) -> AnyObject? {\n        let maybeDelegate = objc_getAssociatedObject(object, self.identifier)\n        return castOptionalOrFatalError(maybeDelegate)\n    }\n\n    private static func assignProxy(_ proxy: AnyObject, toObject object: ParentObject) {\n        objc_setAssociatedObject(object, self.identifier, proxy, .OBJC_ASSOCIATION_RETAIN)\n    }\n}\n\n/// Describes an object that has a delegate.\npublic protocol HasDelegate: AnyObject {\n    /// Delegate type\n    associatedtype Delegate\n\n    /// Delegate\n    var delegate: Delegate? { get set }\n}\n\nextension DelegateProxyType where ParentObject: HasDelegate, Self.Delegate == ParentObject.Delegate {\n    public static func currentDelegate(for object: ParentObject) -> Delegate? {\n        object.delegate\n    }\n\n    public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n}\n\n/// Describes an object that has a data source.\npublic protocol HasDataSource: AnyObject {\n    /// Data source type\n    associatedtype DataSource\n\n    /// Data source\n    var dataSource: DataSource? { get set }\n}\n\nextension DelegateProxyType where ParentObject: HasDataSource, Self.Delegate == ParentObject.DataSource {\n    public static func currentDelegate(for object: ParentObject) -> Delegate? {\n        object.dataSource\n    }\n\n    public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) {\n        object.dataSource = delegate\n    }\n}\n\n/// Describes an object that has a prefetch data source.\n@available(iOS 10.0, tvOS 10.0, *)\npublic protocol HasPrefetchDataSource: AnyObject {\n    /// Prefetch data source type\n    associatedtype PrefetchDataSource\n\n    /// Prefetch data source\n    var prefetchDataSource: PrefetchDataSource? { get set }\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nextension DelegateProxyType where ParentObject: HasPrefetchDataSource, Self.Delegate == ParentObject.PrefetchDataSource {\n    public static func currentDelegate(for object: ParentObject) -> Delegate? {\n        object.prefetchDataSource\n    }\n\n    public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) {\n        object.prefetchDataSource = delegate\n    }\n}\n\n    #if os(iOS) || os(tvOS)\n        import UIKit\n\n        extension ObservableType {\n            func subscribeProxyDataSource<DelegateProxy: DelegateProxyType>(ofObject object: DelegateProxy.ParentObject, dataSource: DelegateProxy.Delegate, retainDataSource: Bool, binding: @escaping (DelegateProxy, Event<Element>) -> Void)\n                -> Disposable\n                where DelegateProxy.ParentObject: UIView\n                , DelegateProxy.Delegate: AnyObject {\n                let proxy = DelegateProxy.proxy(for: object)\n                let unregisterDelegate = DelegateProxy.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object)\n\n                // Do not perform layoutIfNeeded if the object is still not in the view heirarchy\n                if object.window != nil {\n                    // this is needed to flush any delayed old state (https://github.com/RxSwiftCommunity/RxDataSources/pull/75)\n                    object.layoutIfNeeded()\n                }\n\n                let subscription = self.asObservable()\n                    .observe(on:MainScheduler())\n                    .catch { error in\n                        bindingError(error)\n                        return Observable.empty()\n                    }\n                    // source can never end, otherwise it would release the subscriber, and deallocate the data source\n                    .concat(Observable.never())\n                    .take(until: object.rx.deallocated)\n                    .subscribe { [weak object] (event: Event<Element>) in\n\n                        if let object = object {\n                            assert(proxy === DelegateProxy.currentDelegate(for: object), \"Proxy changed from the time it was first set.\\nOriginal: \\(proxy)\\nExisting: \\(String(describing: DelegateProxy.currentDelegate(for: object)))\")\n                        }\n                        \n                        binding(proxy, event)\n                        \n                        switch event {\n                        case .error(let error):\n                            bindingError(error)\n                            unregisterDelegate.dispose()\n                        case .completed:\n                            unregisterDelegate.dispose()\n                        default:\n                            break\n                        }\n                    }\n                    \n                return Disposables.create { [weak object] in\n                    subscription.dispose()\n\n                    if object?.window != nil {\n                        object?.layoutIfNeeded()\n                    }\n\n                    unregisterDelegate.dispose()\n                }\n            }\n        }\n\n    #endif\n\n    /**\n\n     To add delegate proxy subclasses call `DelegateProxySubclass.register()` in `registerKnownImplementations` or in some other\n     part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching).\n\n         class RxScrollViewDelegateProxy: DelegateProxy {\n             public static func registerKnownImplementations() {\n                 self.register { RxTableViewDelegateProxy(parentObject: $0) }\n         }\n         ...\n\n\n     */\n    private class DelegateProxyFactory {\n        private static var _sharedFactories: [UnsafeRawPointer: DelegateProxyFactory] = [:]\n\n        fileprivate static func sharedFactory<DelegateProxy: DelegateProxyType>(for proxyType: DelegateProxy.Type) -> DelegateProxyFactory {\n            MainScheduler.ensureRunningOnMainThread()\n            let identifier = DelegateProxy.identifier\n            if let factory = _sharedFactories[identifier] {\n                return factory\n            }\n            let factory = DelegateProxyFactory(for: proxyType)\n            _sharedFactories[identifier] = factory\n            DelegateProxy.registerKnownImplementations()\n            return factory\n        }\n\n        private var _factories: [ObjectIdentifier: ((AnyObject) -> AnyObject)]\n        private var _delegateProxyType: Any.Type\n        private var _identifier: UnsafeRawPointer\n\n        private init<DelegateProxy: DelegateProxyType>(for proxyType: DelegateProxy.Type) {\n            self._factories = [:]\n            self._delegateProxyType = proxyType\n            self._identifier = proxyType.identifier\n        }\n\n        fileprivate func extend<DelegateProxy: DelegateProxyType, ParentObject>(make: @escaping (ParentObject) -> DelegateProxy) {\n                MainScheduler.ensureRunningOnMainThread()\n                precondition(self._identifier == DelegateProxy.identifier, \"Delegate proxy has inconsistent identifier\")\n                guard self._factories[ObjectIdentifier(ParentObject.self)] == nil else {\n                    rxFatalError(\"The factory of \\(ParentObject.self) is duplicated. DelegateProxy is not allowed of duplicated base object type.\")\n                }\n                self._factories[ObjectIdentifier(ParentObject.self)] = { make(castOrFatalError($0)) }\n        }\n\n        fileprivate func createProxy(for object: AnyObject) -> AnyObject {\n            MainScheduler.ensureRunningOnMainThread()\n            var maybeMirror: Mirror? = Mirror(reflecting: object)\n            while let mirror = maybeMirror {\n                if let factory = self._factories[ObjectIdentifier(mirror.subjectType)] {\n                    return factory(object)\n                }\n                maybeMirror = mirror.superclassMirror\n            }\n            rxFatalError(\"DelegateProxy has no factory of \\(object). Implement DelegateProxy subclass for \\(object) first.\")\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/Infallible+Bind.swift",
    "content": "//\n//  Infallible+Bind.swift\n//  RxCocoa\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension InfallibleType {\n    /**\n     Creates new subscription and sends elements to observer(s).\n     In this form, it's equivalent to the `subscribe` method, but it better conveys intent, and enables\n     writing more consistent binding code.\n     - parameter to: Observers to receives events.\n     - returns: Disposable object that can be used to unsubscribe the observers.\n     */\n    public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {\n        self.subscribe { event in\n            observers.forEach { $0.on(event) }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to observer(s).\n     In this form, it's equivalent to the `subscribe` method, but it better conveys intent, and enables\n     writing more consistent binding code.\n     - parameter to: Observers to receives events.\n     - returns: Disposable object that can be used to unsubscribe the observers.\n     */\n    public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element? {\n        self.map { $0 as Element? }\n            .subscribe { event in\n                observers.forEach { $0.on(event) }\n            }\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function.\n\n    - parameter to: Function used to bind elements from `self`.\n    - returns: Object representing subscription.\n    */\n    public func bind<Result>(to binder: (Self) -> Result) -> Result {\n        binder(self)\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n    after `self` is passed.\n\n        public func bind<R1, R2>(to binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n            return binder(self)(curriedArgument)\n        }\n\n    - parameter to: Function used to bind elements from `self`.\n    - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n    - returns: Object representing subscription.\n    */\n    public func bind<R1, R2>(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n        binder(self)(curriedArgument)\n    }\n\n    /**\n    Subscribes an element handler to an observable sequence.\n    In case error occurs in debug mode, `fatalError` will be raised.\n    In case error occurs in release mode, `error` will be logged.\n\n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func bind(onNext: @escaping (Element) -> Void) -> Disposable {\n        self.subscribe(onNext: onNext)\n    }\n\n    /**\n    Creates new subscription and sends elements to `BehaviorRelay`.\n\n    - parameter relay: Target relay for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n    */\n    public func bind(to relays: BehaviorRelay<Element>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `BehaviorRelay`.\n\n     - parameter relay: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func bind(to relays: BehaviorRelay<Element?>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n    Creates new subscription and sends elements to `PublishRelay`.\n\n    - parameter relay: Target relay for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n    */\n    public func bind(to relays: PublishRelay<Element>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `PublishRelay`.\n\n     - parameter relay: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func bind(to relays: PublishRelay<Element?>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n    Creates new subscription and sends elements to `ReplayRelay`.\n\n    - parameter relay: Target relay for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n    */\n    public func bind(to relays: ReplayRelay<Element>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `ReplayRelay`.\n\n     - parameter relay: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func bind(to relays: ReplayRelay<Element?>...) -> Disposable {\n        return self.subscribe(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift",
    "content": "//\n//  Observable+Bind.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ObservableType {\n    /**\n     Creates new subscription and sends elements to observer(s).\n     In this form, it's equivalent to the `subscribe` method, but it better conveys intent, and enables\n     writing more consistent binding code.\n     - parameter to: Observers to receives events.\n     - returns: Disposable object that can be used to unsubscribe the observers.\n     */\n    public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {\n        self.subscribe { event in\n            observers.forEach { $0.on(event) }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to observer(s).\n     In this form, it's equivalent to the `subscribe` method, but it better conveys intent, and enables\n     writing more consistent binding code.\n     - parameter to: Observers to receives events.\n     - returns: Disposable object that can be used to unsubscribe the observers.\n     */\n    public func bind<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element? {\n        self.map { $0 as Element? }\n            .subscribe { event in\n                observers.forEach { $0.on(event) }\n            }\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function.\n\n    - parameter to: Function used to bind elements from `self`.\n    - returns: Object representing subscription.\n    */\n    public func bind<Result>(to binder: (Self) -> Result) -> Result {\n        binder(self)\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n    after `self` is passed.\n\n        public func bind<R1, R2>(to binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n            return binder(self)(curriedArgument)\n        }\n\n    - parameter to: Function used to bind elements from `self`.\n    - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n    - returns: Object representing subscription.\n    */\n    public func bind<R1, R2>(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n        binder(self)(curriedArgument)\n    }\n    \n    /**\n    Subscribes an element handler to an observable sequence.\n    In case error occurs in debug mode, `fatalError` will be raised.\n    In case error occurs in release mode, `error` will be logged.\n\n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n    - parameter object: The object to provide an unretained reference on.\n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func bind<Object: AnyObject>(\n        with object: Object,\n        onNext: @escaping (Object, Element) -> Void\n    ) -> Disposable {\n        self.subscribe(onNext: { [weak object] in\n            guard let object = object else { return }\n            onNext(object, $0)\n        },\n        onError: { error in\n            rxFatalErrorInDebug(\"Binding error: \\(error)\")\n        })\n    }\n    \n    /**\n    Subscribes an element handler to an observable sequence.\n    In case error occurs in debug mode, `fatalError` will be raised.\n    In case error occurs in release mode, `error` will be logged.\n\n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func bind(onNext: @escaping (Element) -> Void) -> Disposable {\n        self.subscribe(onNext: onNext,\n                       onError: { error in\n                        rxFatalErrorInDebug(\"Binding error: \\(error)\")\n                       })\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift",
    "content": "//\n//  RxCocoaObjCRuntimeError+Extensions.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/9/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux)\n    import RxCocoaRuntime\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n    /// RxCocoa ObjC runtime interception mechanism.\n    public enum RxCocoaInterceptionMechanism {\n        /// Unknown message interception mechanism.\n        case unknown\n        /// Key value observing interception mechanism.\n        case kvo\n    }\n\n    /// RxCocoa ObjC runtime modification errors.\n    public enum RxCocoaObjCRuntimeError\n        : Swift.Error\n        , CustomDebugStringConvertible {\n        /// Unknown error has occurred.\n        case unknown(target: AnyObject)\n\n        /**\n        If the object is reporting a different class then it's real class, that means that there is probably\n        already some interception mechanism in place or something weird is happening.\n\n        The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`.\n\n        This error is easily resolved by just using `sentMessage` observing before `observe`.\n\n        The reason why the other way around could create issues is because KVO will unregister it's interceptor\n        class and restore original class. Unfortunately that will happen no matter was there another interceptor\n        subclass registered in hierarchy or not.\n\n        Failure scenario:\n        * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)\n        * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)\n        * then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO)\n\n        The reason why changing order of observing works is because any interception method on unregistration \n        should return object's original real class (if that doesn't happen then it's really easy to argue that's a bug\n        in that interception mechanism).\n\n        This library won't remove registered interceptor even if there aren't any observers left because\n        it's highly unlikely it would have any benefit in real world use cases, and it's even more\n        dangerous.\n        */\n        case objectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism)\n\n        /// Trying to observe messages for selector that isn't implemented.\n        case selectorNotImplemented(target: AnyObject)\n\n        /// Core Foundation classes are usually toll free bridged. Those classes crash the program in case\n        /// `object_setClass` is performed on them.\n        ///\n        /// There is a possibility to just swizzle methods on original object, but since those won't be usual use\n        /// cases for this library, then an error will just be reported for now.\n        case cantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject)\n\n        /// Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only\n        /// happen in scenarios where multiple interception libraries are used.\n        ///\n        /// To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and\n        /// it's meta-class.\n        case threadingCollisionWithOtherInterceptionMechanism(target: AnyObject)\n\n        /// For some reason saving original method implementation under RX namespace failed.\n        case savingOriginalForwardingMethodFailed(target: AnyObject)\n\n        /// Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\n        case replacingMethodWithForwardingImplementation(target: AnyObject)\n\n        /// Attempt to intercept one of the performance sensitive methods:\n        ///    * class\n        ///    * respondsToSelector:\n        ///    * methodSignatureForSelector:\n        ///    * forwardingTargetForSelector:\n        case observingPerformanceSensitiveMessages(target: AnyObject)\n\n        /// Message implementation has unsupported return type (for example large struct). The reason why this is a error\n        /// is because in some cases intercepting sent messages requires replacing implementation with `_objc_msgForward_stret`\n        /// instead of `_objc_msgForward`.\n        ///\n        /// The unsupported cases should be fairly uncommon.\n        case observingMessagesWithUnsupportedReturnType(target: AnyObject)\n    }\n\n    extension RxCocoaObjCRuntimeError {\n        /// A textual representation of `self`, suitable for debugging.\n        public var debugDescription: String {\n            switch self {\n            case let .unknown(target):\n                return \"Unknown error occurred.\\nTarget: `\\(target)`\"\n            case let .objectMessagesAlreadyBeingIntercepted(target, interceptionMechanism):\n                let interceptionMechanismDescription = interceptionMechanism == .kvo ? \"KVO\" : \"other interception mechanism\"\n                return \"Collision between RxCocoa interception mechanism and \\(interceptionMechanismDescription).\"\n                    + \" To resolve this conflict please use this interception mechanism first.\\nTarget: \\(target)\"\n            case let .selectorNotImplemented(target):\n                return \"Trying to observe messages for selector that isn't implemented.\\nTarget: \\(target)\"\n            case let .cantInterceptCoreFoundationTollFreeBridgedObjects(target):\n                return \"Interception of messages sent to Core Foundation isn't supported.\\nTarget: \\(target)\"\n            case let .threadingCollisionWithOtherInterceptionMechanism(target):\n                return \"Detected a conflict while modifying ObjC runtime.\\nTarget: \\(target)\"\n            case let .savingOriginalForwardingMethodFailed(target):\n                return \"Saving original method implementation failed.\\nTarget: \\(target)\"\n            case let .replacingMethodWithForwardingImplementation(target):\n                return \"Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\\nTarget: \\(target)\"\n            case let .observingPerformanceSensitiveMessages(target):\n                return \"Attempt to intercept one of the performance sensitive methods. \\nTarget: \\(target)\"\n            case let .observingMessagesWithUnsupportedReturnType(target):\n                return \"Attempt to intercept a method with unsupported return type. \\nTarget: \\(target)\"\n            }\n        }\n    }\n    \n    // MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError`\n\n    extension Error {\n        func rxCocoaErrorForTarget(_ target: AnyObject) -> RxCocoaObjCRuntimeError {\n            let error = self as NSError\n            \n            if error.domain == RXObjCRuntimeErrorDomain {\n                let errorCode = RXObjCRuntimeError(rawValue: error.code) ?? .unknown\n                \n                switch errorCode {\n                case .unknown:\n                    return .unknown(target: target)\n                case .objectMessagesAlreadyBeingIntercepted:\n                    let isKVO = (error.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false\n                    return .objectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .kvo : .unknown)\n                case .selectorNotImplemented:\n                    return .selectorNotImplemented(target: target)\n                case .cantInterceptCoreFoundationTollFreeBridgedObjects:\n                    return .cantInterceptCoreFoundationTollFreeBridgedObjects(target: target)\n                case .threadingCollisionWithOtherInterceptionMechanism:\n                    return .threadingCollisionWithOtherInterceptionMechanism(target: target)\n                case .savingOriginalForwardingMethodFailed:\n                    return .savingOriginalForwardingMethodFailed(target: target)\n                case .replacingMethodWithForwardingImplementation:\n                    return .replacingMethodWithForwardingImplementation(target: target)\n                case .observingPerformanceSensitiveMessages:\n                    return .observingPerformanceSensitiveMessages(target: target)\n                case .observingMessagesWithUnsupportedReturnType:\n                    return .observingMessagesWithUnsupportedReturnType(target: target)\n                @unknown default:\n                    fatalError(\"Unhandled Objective C Runtime Error\")\n                }\n            }\n            \n            return RxCocoaObjCRuntimeError.unknown(target: target)\n        }\n    }\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/RxTarget.swift",
    "content": "//\n//  RxTarget.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nimport RxSwift\n\nclass RxTarget : NSObject\n               , Disposable {\n    \n    private var retainSelf: RxTarget?\n    \n    override init() {\n        super.init()\n        self.retainSelf = self\n\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n\n#if DEBUG\n        MainScheduler.ensureRunningOnMainThread()\n#endif\n    }\n    \n    func dispose() {\n#if DEBUG\n        MainScheduler.ensureRunningOnMainThread()\n#endif\n        self.retainSelf = nil\n    }\n\n#if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n#endif\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift",
    "content": "//\n//  SectionedViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 1/10/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n/// Data source with access to underlying sectioned model.\npublic protocol SectionedViewDataSourceType {\n    /// Returns model at index path.\n    ///\n    /// In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown.\n\n    /// - parameter indexPath: Model index path\n    /// - returns: Model at index path.\n    func model(at indexPath: IndexPath) throws -> Any\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/TextInput.swift",
    "content": "//\n//  TextInput.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n\n    /// Represents text input with reactive extensions.\n    public struct TextInput<Base: UITextInput> {\n        /// Base text input to extend.\n        public let base: Base\n\n        /// Reactive wrapper for `text` property.\n        public let text: ControlProperty<String?>\n\n        /// Initializes new text input.\n        ///\n        /// - parameter base: Base object.\n        /// - parameter text: Textual control property.\n        public init(base: Base, text: ControlProperty<String?>) {\n            self.base = base\n            self.text = text\n        }\n    }\n\n    extension Reactive where Base: UITextField {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: base, text: self.text)\n        }\n    }\n\n    extension Reactive where Base: UITextView {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: base, text: self.text)\n        }\n    }\n\n#endif\n\n#if os(macOS)\n    import Cocoa\n\n    /// Represents text input with reactive extensions.\n    public struct TextInput<Base: NSTextInputClient> {\n        /// Base text input to extend.\n        public let base: Base\n\n        /// Reactive wrapper for `text` property.\n        public let text: ControlProperty<String?>\n\n        /// Initializes new text input.\n        ///\n        /// - parameter base: Base object.\n        /// - parameter text: Textual control property.\n        public init(base: Base, text: ControlProperty<String?>) {\n            self.base = base\n            self.text = text\n        }\n    }\n\n    extension Reactive where Base: NSTextField, Base: NSTextInputClient {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: self.base, text: self.text)\n        }\n    }\n\n#endif\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift",
    "content": "//\n//  KVORepresentable+CoreGraphics.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport RxSwift\nimport CoreGraphics\n\nimport Foundation\n\n#if arch(x86_64) || arch(arm64)\n\tlet CGRectType = \"{CGRect={CGPoint=dd}{CGSize=dd}}\"\n    let CGSizeType = \"{CGSize=dd}\"\n    let CGPointType = \"{CGPoint=dd}\"\n#elseif arch(i386) || arch(arm) || os(watchOS)\n    let CGRectType = \"{CGRect={CGPoint=ff}{CGSize=ff}}\"\n    let CGSizeType = \"{CGSize=ff}\"\n    let CGPointType = \"{CGPoint=ff}\"\n#endif\n\nextension CGRect : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGRectType) != 0 {\n            return nil\n        }\n        var typedValue = CGRect(x: 0, y: 0, width: 0, height: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\nextension CGPoint : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGPointType) != 0 {\n            return nil\n        }\n        var typedValue = CGPoint(x: 0, y: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\nextension CGSize : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGSizeType) != 0 {\n            return nil\n        }\n        var typedValue = CGSize(width: 0, height: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+Swift.swift",
    "content": "//\n//  KVORepresentable+Swift.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension Int : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int32Value)\n    }\n}\n\nextension Int32 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int32Value)\n    }\n}\n\nextension Int64 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int64Value)\n    }\n}\n\nextension UInt : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uintValue)\n    }\n}\n\nextension UInt32 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uint32Value)\n    }\n}\n\nextension UInt64 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uint64Value)\n    }\n}\n\nextension Bool : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.boolValue)\n    }\n}\n\n\nextension RawRepresentable where RawValue: KVORepresentable {\n    /// Constructs `Self` using optional KVO value.\n    init?(KVOValue: RawValue.KVOType?) {\n        guard let KVOValue = KVOValue else {\n            return nil\n        }\n\n        guard let rawValue = RawValue(KVOValue: KVOValue) else {\n            return nil\n        }\n\n        self.init(rawValue: rawValue)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift",
    "content": "//\n//  KVORepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Type that is KVO representable (KVO mechanism can be used to observe it).\npublic protocol KVORepresentable {\n    /// Associated KVO type.\n    associatedtype KVOType\n\n    /// Constructs `Self` using KVO value.\n    init?(KVOValue: KVOType)\n}\n\nextension KVORepresentable {\n    /// Initializes `KVORepresentable` with optional value.\n    init?(KVOValue: KVOType?) {\n        guard let KVOValue = KVOValue else {\n            return nil\n        }\n\n        self.init(KVOValue: KVOValue)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift",
    "content": "//\n//  NSObject+Rx+KVORepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport Foundation\nimport RxSwift\n\n/// Key value observing options\npublic struct KeyValueObservingOptions: OptionSet {\n    /// Raw value\n    public let rawValue: UInt\n\n    public init(rawValue: UInt) {\n        self.rawValue = rawValue\n    }\n\n    /// Whether a sequence element should be sent to the observer immediately, before the subscribe method even returns.\n    public static let initial = KeyValueObservingOptions(rawValue: 1 << 0)\n    /// Whether to send updated values.\n    public static let new = KeyValueObservingOptions(rawValue: 1 << 1)\n}\n\nextension Reactive where Base: NSObject {\n\n    /**\n     Specialization of generic `observe` method.\n\n     This is a special overload because to observe values of some type (for example `Int`), first values of KVO type\n     need to be observed (`NSNumber`), and then converted to result type.\n\n     For more information take a look at `observe` method.\n     */\n    public func observe<Element: KVORepresentable>(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<Element?> {\n        return self.observe(Element.KVOType.self, keyPath, options: options, retainSelf: retainSelf)\n            .map(Element.init)\n    }\n}\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n    // KVO\n    extension Reactive where Base: NSObject {\n        /**\n        Specialization of generic `observeWeakly` method.\n\n        For more information take a look at `observeWeakly` method.\n        */\n        public func observeWeakly<Element: KVORepresentable>(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<Element?> {\n            return self.observeWeakly(Element.KVOType.self, keyPath, options: options)\n                .map(Element.init)\n        }\n    }\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift",
    "content": "//\n//  NSObject+Rx+RawRepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/9/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport RxSwift\n\nimport Foundation\n\nextension Reactive where Base: NSObject {\n    /**\n     Specialization of generic `observe` method.\n\n     This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.\n     \n     It is useful for observing bridged ObjC enum values.\n\n     For more information take a look at `observe` method.\n     */\n    public func observe<Element: RawRepresentable>(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<Element?> where Element.RawValue: KVORepresentable {\n        return self.observe(Element.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)\n            .map(Element.init)\n    }\n}\n\n#if !DISABLE_SWIZZLING\n\n    // observeWeakly + RawRepresentable\n    extension Reactive where Base: NSObject {\n\n        /**\n         Specialization of generic `observeWeakly` method.\n\n         This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.\n     \n         It is useful for observing bridged ObjC enum values.\n\n         For more information take a look at `observeWeakly` method.\n         */\n        public func observeWeakly<Element: RawRepresentable>(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<Element?> where Element.RawValue: KVORepresentable {\n            return self.observeWeakly(Element.RawValue.KVOType.self, keyPath, options: options)\n                .map(Element.init)\n        }\n    }\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift",
    "content": "//\n//  NSObject+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport Foundation\nimport RxSwift\n#if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux)\n    import RxCocoaRuntime\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\nprivate var deallocatingSubjectTriggerContext: UInt8 = 0\nprivate var deallocatingSubjectContext: UInt8 = 0\n#endif\nprivate var deallocatedSubjectTriggerContext: UInt8 = 0\nprivate var deallocatedSubjectContext: UInt8 = 0\n\n#if !os(Linux)\n\n/**\nKVO is a tricky mechanism.\n\nWhen observing child in a ownership hierarchy, usually retaining observing target is wanted behavior.\nWhen observing parent in a ownership hierarchy, usually retaining target isn't wanter behavior.\n\nKVO with weak references is especially tricky. For it to work, some kind of swizzling is required.\nThat can be done by\n    * replacing object class dynamically (like KVO does)\n    * by swizzling `dealloc` method on all instances for a class.\n    * some third method ...\n\nBoth approaches can fail in certain scenarios:\n    * problems arise when swizzlers return original object class (like KVO does when nobody is observing)\n    * Problems can arise because replacing dealloc method isn't atomic operation (get implementation,\n    set implementation).\n\nSecond approach is chosen. It can fail in case there are multiple libraries dynamically trying\nto replace dealloc method. In case that isn't the case, it should be ok.\n*/\nextension Reactive where Base: NSObject {\n\n\n    /**\n     Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set.\n\n     `observe` is just a simple and performant wrapper around KVO mechanism.\n\n     * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`)\n     * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)\n     * the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc.\n\n     If support for weak properties is needed or observing arbitrary or unknown relationships in the\n     ownership tree, `observeWeakly` is the preferred option.\n\n     - parameter keyPath: Key path of property names to observe.\n     - parameter options: KVO mechanism notification options.\n     - parameter retainSelf: Retains self during observation if set `true`.\n     - returns: Observable sequence of objects on `keyPath`.\n     */\n    public func observe<Element>(_ type: Element.Type,\n                                 _ keyPath: String,\n                                 options: KeyValueObservingOptions = [.new, .initial],\n                                 retainSelf: Bool = true) -> Observable<Element?> {\n        KVOObservable(object: self.base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()\n    }\n\n    /**\n    Observes values at the provided key path using the provided options.\n\n     - parameter keyPath: A key path between the object and one of its properties.\n     - parameter options: Key-value observation options, defaults to `.new` and `.initial`.\n\n     - note: When the object is deallocated, a completion event is emitted.\n\n     - returns: An observable emitting value changes at the provided key path.\n    */\n    public func observe<Element>(_ keyPath: KeyPath<Base, Element>,\n                                 options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable<Element> {\n        Observable<Element>.create { [weak base] observer in\n            let observation = base?.observe(keyPath, options: options) { obj, _ in\n                observer.on(.next(obj[keyPath: keyPath]))\n            }\n\n            return Disposables.create { observation?.invalidate() }\n        }\n        .take(until: base.rx.deallocated)\n    }\n}\n\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n// KVO\nextension Reactive where Base: NSObject {\n    /**\n     Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`.\n\n     It can be used in all cases where `observe` can be used and additionally\n\n     * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown\n     * it can be used to observe `weak` properties\n\n     **Since it needs to intercept object deallocation process it needs to perform swizzling of `dealloc` method on observed object.**\n\n     - parameter keyPath: Key path of property names to observe.\n     - parameter options: KVO mechanism notification options.\n     - returns: Observable sequence of objects on `keyPath`.\n     */\n    public func observeWeakly<Element>(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<Element?> {\n        return observeWeaklyKeyPathFor(self.base, keyPath: keyPath, options: options)\n            .map { n in\n                return n as? Element\n            }\n    }\n}\n#endif\n\n// Dealloc\nextension Reactive where Base: AnyObject {\n    \n    /**\n    Observable sequence of object deallocated events.\n    \n    After object is deallocated one `()` element will be produced and sequence will immediately complete.\n    \n    - returns: Observable sequence of object deallocated events.\n    */\n    public var deallocated: Observable<Void> {\n        return self.synchronized {\n            if let deallocObservable = objc_getAssociatedObject(self.base, &deallocatedSubjectContext) as? DeallocObservable {\n                return deallocObservable.subject\n            }\n\n            let deallocObservable = DeallocObservable()\n\n            objc_setAssociatedObject(self.base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            return deallocObservable.subject\n        }\n    }\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    /**\n     Observable sequence of message arguments that completes when object is deallocated.\n     \n     Each element is produced before message is invoked on target object. `methodInvoked`\n     exists in case observing of invoked messages is needed.\n\n     In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n     \n     In case some argument is `nil`, instance of `NSNull()` will be sent.\n\n     - returns: Observable sequence of arguments passed to `selector` method.\n     */\n    public func sentMessage(_ selector: Selector) -> Observable<[Any]> {\n        return self.synchronized {\n            // in case of dealloc selector replay subject behavior needs to be used\n            if selector == deallocSelector {\n                return self.deallocating.map { _ in [] }\n            }\n\n            do {\n                let proxy: MessageSentProxy = try self.registerMessageInterceptor(selector)\n                return proxy.messageSent.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    /**\n     Observable sequence of message arguments that completes when object is deallocated.\n\n     Each element is produced after message is invoked on target object. `sentMessage`\n     exists in case interception of sent messages before they were invoked is needed.\n\n     In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n\n     In case some argument is `nil`, instance of `NSNull()` will be sent.\n\n     - returns: Observable sequence of arguments passed to `selector` method.\n     */\n    public func methodInvoked(_ selector: Selector) -> Observable<[Any]> {\n        return self.synchronized {\n            // in case of dealloc selector replay subject behavior needs to be used\n            if selector == deallocSelector {\n                return self.deallocated.map { _ in [] }\n            }\n\n\n            do {\n                let proxy: MessageSentProxy = try self.registerMessageInterceptor(selector)\n                return proxy.methodInvoked.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of object deallocating events.\n    \n    When `dealloc` message is sent to `self` one `()` element will be produced and after object is deallocated sequence\n    will immediately complete.\n     \n    In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n    \n    - returns: Observable sequence of object deallocating events.\n    */\n    public var deallocating: Observable<()> {\n        return self.synchronized {\n            do {\n                let proxy: DeallocatingProxy = try self.registerMessageInterceptor(deallocSelector)\n                return proxy.messageSent.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    private func registerMessageInterceptor<T: MessageInterceptorSubject>(_ selector: Selector) throws -> T {\n        let rxSelector = RX_selector(selector)\n        let selectorReference = RX_reference_from_selector(rxSelector)\n\n        let subject: T\n        if let existingSubject = objc_getAssociatedObject(self.base, selectorReference) as? T {\n            subject = existingSubject\n        }\n        else {\n            subject = T()\n            objc_setAssociatedObject(\n                self.base,\n                selectorReference,\n                subject,\n                .OBJC_ASSOCIATION_RETAIN_NONATOMIC\n            )\n        }\n\n        if subject.isActive {\n            return subject\n        }\n\n        var error: NSError?\n        let targetImplementation = RX_ensure_observing(self.base, selector, &error)\n        if targetImplementation == nil {\n            throw error?.rxCocoaErrorForTarget(self.base) ?? RxCocoaError.unknown\n        }\n\n        subject.targetImplementation = targetImplementation!\n\n        return subject\n    }\n#endif\n}\n\n// MARK: Message interceptors\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    private protocol MessageInterceptorSubject: AnyObject {\n        init()\n\n        var isActive: Bool {\n            get\n        }\n\n        var targetImplementation: IMP { get set }\n    }\n\n    private final class DeallocatingProxy\n        : MessageInterceptorSubject\n        , RXDeallocatingObserver {\n        typealias Element = ()\n\n        let messageSent = ReplaySubject<()>.create(bufferSize: 1)\n\n        @objc var targetImplementation: IMP = RX_default_target_implementation()\n\n        var isActive: Bool {\n            return self.targetImplementation != RX_default_target_implementation()\n        }\n\n        init() {\n        }\n\n        @objc func deallocating() {\n            self.messageSent.on(.next(()))\n        }\n\n        deinit {\n            self.messageSent.on(.completed)\n        }\n    }\n\n    private final class MessageSentProxy\n        : MessageInterceptorSubject\n        , RXMessageSentObserver {\n        typealias Element = [AnyObject]\n\n        let messageSent = PublishSubject<[Any]>()\n        let methodInvoked = PublishSubject<[Any]>()\n\n        @objc var targetImplementation: IMP = RX_default_target_implementation()\n\n        var isActive: Bool {\n            return self.targetImplementation != RX_default_target_implementation()\n        }\n\n        init() {\n        }\n\n        @objc func messageSent(withArguments arguments: [Any]) {\n            self.messageSent.on(.next(arguments))\n        }\n\n        @objc func methodInvoked(withArguments arguments: [Any]) {\n            self.methodInvoked.on(.next(arguments))\n        }\n\n        deinit {\n            self.messageSent.on(.completed)\n            self.methodInvoked.on(.completed)\n        }\n    }\n\n#endif\n\n\nprivate final class DeallocObservable {\n    let subject = ReplaySubject<Void>.create(bufferSize:1)\n\n    init() {\n    }\n\n    deinit {\n        self.subject.on(.next(()))\n        self.subject.on(.completed)\n    }\n}\n\n// MARK: KVO\n\n#if !os(Linux)\n\nprivate protocol KVOObservableProtocol {\n    var target: AnyObject { get }\n    var keyPath: String { get }\n    var retainTarget: Bool { get }\n    var options: KeyValueObservingOptions { get }\n}\n\nprivate final class KVOObserver\n    : _RXKVOObserver\n    , Disposable {\n    typealias Callback = (Any?) -> Void\n\n    var retainSelf: KVOObserver?\n\n    init(parent: KVOObservableProtocol, callback: @escaping Callback) {\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n\n        super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options.nsOptions, callback: callback)\n        self.retainSelf = self\n    }\n\n    override func dispose() {\n        super.dispose()\n        self.retainSelf = nil\n    }\n\n    deinit {\n        #if TRACE_RESOURCES\n            _ = Resources.decrementTotal()\n        #endif\n    }\n}\n\nprivate final class KVOObservable<Element>\n    : ObservableType\n    , KVOObservableProtocol {\n    typealias Element = Element?\n\n    unowned var target: AnyObject\n    var strongTarget: AnyObject?\n\n    var keyPath: String\n    var options: KeyValueObservingOptions\n    var retainTarget: Bool\n\n    init(object: AnyObject, keyPath: String, options: KeyValueObservingOptions, retainTarget: Bool) {\n        self.target = object\n        self.keyPath = keyPath\n        self.options = options\n        self.retainTarget = retainTarget\n        if retainTarget {\n            self.strongTarget = object\n        }\n    }\n\n    func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element? {\n        let observer = KVOObserver(parent: self) { value in\n            if value as? NSNull != nil {\n                observer.on(.next(nil))\n                return\n            }\n            observer.on(.next(value as? Element))\n        }\n\n        return Disposables.create(with: observer.dispose)\n    }\n\n}\n\nprivate extension KeyValueObservingOptions {\n    var nsOptions: NSKeyValueObservingOptions {\n        var result: UInt = 0\n        if self.contains(.new) {\n            result |= NSKeyValueObservingOptions.new.rawValue\n        }\n        if self.contains(.initial) {\n            result |= NSKeyValueObservingOptions.initial.rawValue\n        }\n        \n        return NSKeyValueObservingOptions(rawValue: result)\n    }\n}\n\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    private func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: KeyValueObservingOptions) -> Observable<AnyObject?> {\n        let components = keyPath.components(separatedBy: \".\").filter { $0 != \"self\" }\n\n        let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options)\n            .finishWithNilWhenDealloc(target)\n\n        if !options.isDisjoint(with: .initial) {\n            return observable\n        }\n        else {\n            return observable\n                .skip(1)\n        }\n    }\n\n    // This should work correctly\n    // Identifiers can't contain `,`, so the only place where `,` can appear\n    // is as a delimiter.\n    // This means there is `W` as element in an array of property attributes.\n    private func isWeakProperty(_ properyRuntimeInfo: String) -> Bool {\n        properyRuntimeInfo.range(of: \",W,\") != nil\n    }\n\n    private extension ObservableType where Element == AnyObject? {\n        func finishWithNilWhenDealloc(_ target: NSObject)\n            -> Observable<AnyObject?> {\n                let deallocating = target.rx.deallocating\n\n                return deallocating\n                    .map { _ in\n                        return Observable.just(nil)\n                    }\n                    .startWith(self.asObservable())\n                    .switchLatest()\n        }\n    }\n\n    private func observeWeaklyKeyPathFor(\n        _ target: NSObject,\n        keyPathSections: [String],\n        options: KeyValueObservingOptions\n        ) -> Observable<AnyObject?> {\n\n        weak var weakTarget: AnyObject? = target\n\n        let propertyName = keyPathSections[0]\n        let remainingPaths = Array(keyPathSections[1..<keyPathSections.count])\n\n        let property = class_getProperty(object_getClass(target), propertyName)\n        if property == nil {\n            return Observable.error(RxCocoaError.invalidPropertyName(object: target, propertyName: propertyName))\n        }\n        let propertyAttributes = property_getAttributes(property!)\n\n        // should dealloc hook be in place if week property, or just create strong reference because it doesn't matter\n        let isWeak = isWeakProperty(propertyAttributes.map(String.init) ?? \"\")\n        let propertyObservable = KVOObservable(object: target, keyPath: propertyName, options: options.union(.initial), retainTarget: false) as KVOObservable<AnyObject>\n\n        // KVO recursion for value changes\n        return propertyObservable\n            .flatMapLatest { (nextTarget: AnyObject?) -> Observable<AnyObject?> in\n                if nextTarget == nil {\n                    return Observable.just(nil)\n                }\n                let nextObject = nextTarget! as? NSObject\n\n                let strongTarget: AnyObject? = weakTarget\n\n                if nextObject == nil {\n                    return Observable.error(RxCocoaError.invalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName))\n                }\n\n                // if target is alive, then send change\n                // if it's deallocated, don't send anything\n                if strongTarget == nil {\n                    return Observable.empty()\n                }\n\n                let nextElementsObservable = keyPathSections.count == 1\n                    ? Observable.just(nextTarget)\n                    : observeWeaklyKeyPathFor(nextObject!, keyPathSections: remainingPaths, options: options)\n                \n                if isWeak {\n                    return nextElementsObservable\n                        .finishWithNilWhenDealloc(nextObject!)\n                }\n                else {\n                    return nextElementsObservable\n                }\n        }\n    }\n#endif\n\n// MARK: Constants\n\nprivate let deallocSelector = NSSelectorFromString(\"dealloc\")\n\n// MARK: AnyObject + Reactive\n\nextension Reactive where Base: AnyObject {\n    func synchronized<T>( _ action: () -> T) -> T {\n        objc_sync_enter(self.base)\n        let result = action()\n        objc_sync_exit(self.base)\n        return result\n    }\n}\n\nextension Reactive where Base: AnyObject {\n    /**\n     Helper to make sure that `Observable` returned from `createCachedObservable` is only created once.\n     This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`.\n     */\n    func lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {\n        if let value = objc_getAssociatedObject(self.base, key) {\n            return value as! T\n        }\n        \n        let observable = createCachedObservable()\n        \n        objc_setAssociatedObject(self.base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        \n        return observable\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift",
    "content": "//\n//  NotificationCenter+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\n\nextension Reactive where Base: NotificationCenter {\n    /**\n    Transforms notifications posted to notification center to observable sequence of notifications.\n    \n    - parameter name: Optional name used to filter notifications.\n    - parameter object: Optional object used to filter notifications.\n    - returns: Observable sequence of posted notifications.\n    */\n    public func notification(_ name: Notification.Name?, object: AnyObject? = nil) -> Observable<Notification> {\n        return Observable.create { [weak object] observer in\n            let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in\n                observer.on(.next(notification))\n            }\n            \n            return Disposables.create {\n                self.base.removeObserver(nsObserver)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift",
    "content": "//\n//  URLSession+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\n\n#if canImport(FoundationNetworking)\nimport FoundationNetworking\n#endif\n\n/// RxCocoa URL errors.\npublic enum RxCocoaURLError\n    : Swift.Error {\n    /// Unknown error occurred.\n    case unknown\n    /// Response is not NSHTTPURLResponse\n    case nonHTTPResponse(response: URLResponse)\n    /// Response is not successful. (not in `200 ..< 300` range)\n    case httpRequestFailed(response: HTTPURLResponse, data: Data?)\n    /// Deserialization error.\n    case deserializationError(error: Swift.Error)\n}\n\nextension RxCocoaURLError\n    : CustomDebugStringConvertible {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error has occurred.\"\n        case let .nonHTTPResponse(response):\n            return \"Response is not NSHTTPURLResponse `\\(response)`.\"\n        case let .httpRequestFailed(response, _):\n            return \"HTTP request failed with `\\(response.statusCode)`.\"\n        case let .deserializationError(error):\n            return \"Error during deserialization of the response: \\(error)\"\n        }\n    }\n}\n\nprivate func escapeTerminalString(_ value: String) -> String {\n    return value.replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\", options:[], range: nil)\n}\n\nprivate func convertURLRequestToCurlCommand(_ request: URLRequest) -> String {\n    let method = request.httpMethod ?? \"GET\"\n    var returnValue = \"curl -X \\(method) \"\n\n    if let httpBody = request.httpBody {\n        let maybeBody = String(data: httpBody, encoding: String.Encoding.utf8)\n        if let body = maybeBody {\n            returnValue += \"-d \\\"\\(escapeTerminalString(body))\\\" \"\n        }\n    }\n\n    for (key, value) in request.allHTTPHeaderFields ?? [:] {\n        let escapedKey = escapeTerminalString(key as String)\n        let escapedValue = escapeTerminalString(value as String)\n        returnValue += \"\\n    -H \\\"\\(escapedKey): \\(escapedValue)\\\" \"\n    }\n\n    let URLString = request.url?.absoluteString ?? \"<unknown url>\"\n\n    returnValue += \"\\n\\\"\\(escapeTerminalString(URLString))\\\"\"\n\n    returnValue += \" -i -v\"\n\n    return returnValue\n}\n\nprivate func convertResponseToString(_ response: URLResponse?, _ error: NSError?, _ interval: TimeInterval) -> String {\n    let ms = Int(interval * 1000)\n\n    if let response = response as? HTTPURLResponse {\n        if 200 ..< 300 ~= response.statusCode {\n            return \"Success (\\(ms)ms): Status \\(response.statusCode)\"\n        }\n        else {\n            return \"Failure (\\(ms)ms): Status \\(response.statusCode)\"\n        }\n    }\n\n    if let error = error {\n        if error.domain == NSURLErrorDomain && error.code == NSURLErrorCancelled {\n            return \"Canceled (\\(ms)ms)\"\n        }\n        return \"Failure (\\(ms)ms): NSError > \\(error)\"\n    }\n\n    return \"<Unhandled response from server>\"\n}\n\nextension Reactive where Base: URLSession {\n    /**\n    Observable sequence of responses for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of URL responses.\n    */\n    public func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {\n        return Observable.create { observer in\n\n            // smart compiler should be able to optimize this out\n            let d: Date?\n\n            if URLSession.rx.shouldLogRequest(request) {\n                d = Date()\n            }\n            else {\n               d = nil\n            }\n\n            let task = self.base.dataTask(with: request) { data, response, error in\n\n                if URLSession.rx.shouldLogRequest(request) {\n                    let interval = Date().timeIntervalSince(d ?? Date())\n                    print(convertURLRequestToCurlCommand(request))\n                    #if os(Linux)\n                        print(convertResponseToString(response, error.flatMap { $0 as NSError }, interval))\n                    #else\n                        print(convertResponseToString(response, error.map { $0 as NSError }, interval))\n                    #endif\n                }\n                \n                guard let response = response, let data = data else {\n                    observer.on(.error(error ?? RxCocoaURLError.unknown))\n                    return\n                }\n\n                guard let httpResponse = response as? HTTPURLResponse else {\n                    observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))\n                    return\n                }\n\n                observer.on(.next((httpResponse, data)))\n                observer.on(.completed)\n            }\n\n            task.resume()\n\n            return Disposables.create(with: task.cancel)\n        }\n    }\n\n    /**\n    Observable sequence of response data for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of response data.\n    */\n    public func data(request: URLRequest) -> Observable<Data> {\n        return self.response(request: request).map { pair -> Data in\n            if 200 ..< 300 ~= pair.0.statusCode {\n                return pair.1\n            }\n            else {\n                throw RxCocoaURLError.httpRequestFailed(response: pair.0, data: pair.1)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of response JSON for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    If there is an error during JSON deserialization observable sequence will fail with that error.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of response JSON.\n    */\n    public func json(request: URLRequest, options: JSONSerialization.ReadingOptions = []) -> Observable<Any> {\n        return self.data(request: request).map { data -> Any in\n            do {\n                return try JSONSerialization.jsonObject(with: data, options: options)\n            } catch let error {\n                throw RxCocoaURLError.deserializationError(error: error)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of response JSON for GET request with `URL`.\n     \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    If there is an error during JSON deserialization observable sequence will fail with that error.\n    \n    - parameter url: URL of `NSURLRequest` request.\n    - returns: Observable sequence of response JSON.\n    */\n    public func json(url: Foundation.URL) -> Observable<Any> {\n        self.json(request: URLRequest(url: url))\n    }\n}\n\nextension Reactive where Base == URLSession {\n    /// Log URL requests to standard output in curl format.\n    public static var shouldLogRequest: (URLRequest) -> Bool = { _ in\n        #if DEBUG\n            return true\n        #else\n            return false\n        #endif\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RX.m",
    "content": "//\n//  _RX.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RX.h\"\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXDelegateProxy.m",
    "content": "//\n//  _RXDelegateProxy.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RXDelegateProxy.h\"\n#import \"include/_RX.h\"\n#import \"include/_RXObjCRuntime.h\"\n\n@interface _RXDelegateProxy () {\n    id __weak __forwardToDelegate;\n}\n\n@property (nonatomic, strong) id strongForwardDelegate;\n\n@end\n\nstatic NSMutableDictionary *voidSelectorsPerClass = nil;\n\n@implementation _RXDelegateProxy\n\n+(NSSet*)collectVoidSelectorsForProtocol:(Protocol *)protocol {\n    NSMutableSet *selectors = [NSMutableSet set];\n\n    unsigned int protocolMethodCount = 0;\n    struct objc_method_description *pMethods = protocol_copyMethodDescriptionList(protocol, NO, YES, &protocolMethodCount);\n\n    for (unsigned int i = 0; i < protocolMethodCount; ++i) {\n        struct objc_method_description method = pMethods[i];\n        if (RX_is_method_with_description_void(method)) {\n            [selectors addObject:SEL_VALUE(method.name)];\n        }\n    }\n            \n    free(pMethods);\n\n    unsigned int numberOfBaseProtocols = 0;\n    Protocol * __unsafe_unretained * pSubprotocols = protocol_copyProtocolList(protocol, &numberOfBaseProtocols);\n\n    for (unsigned int i = 0; i < numberOfBaseProtocols; ++i) {\n        [selectors unionSet:[self collectVoidSelectorsForProtocol:pSubprotocols[i]]];\n    }\n    \n    free(pSubprotocols);\n\n    return selectors;\n}\n\n+(void)initialize {\n    @synchronized (_RXDelegateProxy.class) {\n        if (voidSelectorsPerClass == nil) {\n            voidSelectorsPerClass = [[NSMutableDictionary alloc] init];\n        }\n\n        NSMutableSet *voidSelectors = [NSMutableSet set];\n\n#define CLASS_HIERARCHY_MAX_DEPTH 100\n\n        NSInteger  classHierarchyDepth = 0;\n        Class      targetClass         = NULL;\n\n        for (classHierarchyDepth = 0, targetClass = self;\n             classHierarchyDepth < CLASS_HIERARCHY_MAX_DEPTH && targetClass != nil;\n             ++classHierarchyDepth, targetClass = class_getSuperclass(targetClass)\n        ) {\n            unsigned int count;\n            Protocol *__unsafe_unretained *pProtocols = class_copyProtocolList(targetClass, &count);\n            \n            for (unsigned int i = 0; i < count; i++) {\n                NSSet *selectorsForProtocol = [self collectVoidSelectorsForProtocol:pProtocols[i]];\n                [voidSelectors unionSet:selectorsForProtocol];\n            }\n            \n            free(pProtocols);\n        }\n\n        if (classHierarchyDepth == CLASS_HIERARCHY_MAX_DEPTH) {\n            NSLog(@\"Detected weird class hierarchy with depth over %d. Starting with this class -> %@\", CLASS_HIERARCHY_MAX_DEPTH, self);\n#if DEBUG\n            abort();\n#endif\n        }\n        \n        voidSelectorsPerClass[CLASS_VALUE(self)] = voidSelectors;\n    }\n}\n\n-(id)_forwardToDelegate {\n    return __forwardToDelegate;\n}\n\n-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate {\n    __forwardToDelegate = forwardToDelegate;\n    if (retainDelegate) {\n        self.strongForwardDelegate = forwardToDelegate;\n    }\n    else {\n        self.strongForwardDelegate = nil;\n    }\n}\n\n-(BOOL)hasWiredImplementationForSelector:(SEL)selector {\n    return [super respondsToSelector:selector];\n}\n\n-(BOOL)voidDelegateMethodsContain:(SEL)selector {\n    @synchronized(_RXDelegateProxy.class) {\n        NSSet *voidSelectors = voidSelectorsPerClass[CLASS_VALUE(self.class)];\n        NSAssert(voidSelectors != nil, @\"Set of allowed methods not initialized\");\n        return [voidSelectors containsObject:SEL_VALUE(selector)];\n    }\n}\n\n-(void)forwardInvocation:(NSInvocation *)anInvocation {\n    BOOL isVoid = RX_is_method_signature_void(anInvocation.methodSignature);\n    NSArray *arguments = nil;\n    if (isVoid) {\n        arguments = RX_extract_arguments(anInvocation);\n        [self _sentMessage:anInvocation.selector withArguments:arguments];\n    }\n    \n    if (self._forwardToDelegate && [self._forwardToDelegate respondsToSelector:anInvocation.selector]) {\n        [anInvocation invokeWithTarget:self._forwardToDelegate];\n    }\n\n    if (isVoid) {\n        [self _methodInvoked:anInvocation.selector withArguments:arguments];\n    }\n}\n\n// abstract method\n-(void)_sentMessage:(SEL)selector withArguments:(NSArray *)arguments {\n\n}\n\n// abstract method\n-(void)_methodInvoked:(SEL)selector withArguments:(NSArray *)arguments {\n\n}\n\n-(void)dealloc {\n}\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m",
    "content": "//\n//  _RXKVOObserver.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RXKVOObserver.h\"\n\n@interface _RXKVOObserver ()\n\n@property (nonatomic, unsafe_unretained) id            target;\n@property (nonatomic, strong           ) id            retainedTarget;\n@property (nonatomic, copy             ) NSString     *keyPath;\n@property (nonatomic, copy             ) void (^callback)(id);\n\n@end\n\n@implementation _RXKVOObserver\n\n-(instancetype)initWithTarget:(id)target\n                 retainTarget:(BOOL)retainTarget\n                      keyPath:(NSString*)keyPath\n                      options:(NSKeyValueObservingOptions)options\n                     callback:(void (^)(id))callback {\n    self = [super init];\n    if (!self) return nil;\n    \n    self.target = target;\n    if (retainTarget) {\n        self.retainedTarget = target;\n    }\n    self.keyPath = keyPath;\n    self.callback = callback;\n    \n    [self.target addObserver:self forKeyPath:self.keyPath options:options context:nil];\n    \n    return self;\n}\n\n-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {\n    @synchronized(self) {\n        self.callback(change[NSKeyValueChangeNewKey]);\n    }\n}\n\n-(void)dispose {\n    [self.target removeObserver:self forKeyPath:self.keyPath context:nil];\n    self.target = nil;\n    self.retainedTarget = nil;\n}\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m",
    "content": "//\n//  _RXObjCRuntime.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <pthread.h>\n#import <Foundation/Foundation.h>\n#import <objc/runtime.h>\n#import <objc/message.h>\n#import <libkern/OSAtomic.h>\n#import <stdatomic.h>\n\n#import \"include/_RX.h\"\n#import \"include/_RXObjCRuntime.h\"\n\n// self + cmd\n#define HIDDEN_ARGUMENT_COUNT   2\n\n#if !DISABLE_SWIZZLING\n\n#define NSErrorParam NSError *__autoreleasing __nullable * __nullable\n\n@class RXObjCRuntime;\n\nBOOL RXAbortOnThreadingHazard = NO;\n\ntypedef NSInvocation       *NSInvocationRef;\ntypedef NSMethodSignature  *NSMethodSignatureRef;\ntypedef unsigned char       rx_uchar;\ntypedef unsigned short      rx_ushort;\ntypedef unsigned int        rx_uint;\ntypedef unsigned long       rx_ulong;\ntypedef id (^rx_block)(id);\ntypedef BOOL (^RXInterceptWithOptimizedObserver)(RXObjCRuntime * __nonnull self, Class __nonnull class, SEL __nonnull selector, NSErrorParam error);\n\nstatic CFTypeID  defaultTypeID;\nstatic SEL       deallocSelector;\n\nstatic int RxSwizzlingTargetClassKey = 0;\n\n#if TRACE_RESOURCES\n_Atomic static int32_t numberOInterceptedMethods = 0;\n_Atomic static int32_t numberOfForwardedMethods = 0;\n#endif\n\n#define THREADING_HAZARD(class) \\\n    NSLog(@\"There was a problem swizzling on `%@`.\\nYou have probably two libraries performing swizzling in runtime.\\nWe didn't want to crash your program, but this is not good ...\\nYou an solve this problem by either not using swizzling in this library, removing one of those other libraries, or making sure that swizzling parts are synchronized (only perform them on main thread).\\nAnd yes, this message will self destruct when you clear the console, and since it's non deterministic, the problem could still exist and it will be hard for you to reproduce it.\", NSStringFromClass(class)); ABORT_IN_DEBUG if (RXAbortOnThreadingHazard) { abort(); }\n\n#define ALWAYS(condition, message) if (!(condition)) { [NSException raise:@\"RX Invalid Operator\" format:@\"%@\", message]; }\n#define ALWAYS_WITH_INFO(condition, message) NSAssert((condition), @\"%@ [%@] > %@\", NSStringFromClass(class), NSStringFromSelector(selector), (message))\n#define C_ALWAYS(condition, message) NSCAssert((condition), @\"%@ [%@] > %@\", NSStringFromClass(class), NSStringFromSelector(selector), (message))\n\n#define RX_PREFIX @\"_RX_namespace_\"\n\n#define RX_ARG_id(value)           ((value) ?: [NSNull null])\n#define RX_ARG_char(value)         [NSNumber numberWithChar:value]\n#define RX_ARG_short(value)        [NSNumber numberWithShort:value]\n#define RX_ARG_int(value)          [NSNumber numberWithInt:value]\n#define RX_ARG_long(value)         [NSNumber numberWithLong:value]\n#define RX_ARG_BOOL(value)         [NSNumber numberWithBool:value]\n#define RX_ARG_SEL(value)          [NSNumber valueWithPointer:value]\n#define RX_ARG_rx_uchar(value)     [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_ushort(value)    [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_uint(value)      [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_ulong(value)     [NSNumber numberWithUnsignedLong:value]\n#define RX_ARG_rx_block(value)     ((id)(value) ?: [NSNull null])\n#define RX_ARG_float(value)        [NSNumber numberWithFloat:value]\n#define RX_ARG_double(value)       [NSNumber numberWithDouble:value]\n\ntypedef struct supported_type {\n    const char *encoding;\n} supported_type_t;\n\nstatic supported_type_t supported_types[] = {\n    { .encoding = @encode(void)},\n    { .encoding = @encode(id)},\n    { .encoding = @encode(Class)},\n    { .encoding = @encode(void (^)(void))},\n    { .encoding = @encode(char)},\n    { .encoding = @encode(short)},\n    { .encoding = @encode(int)},\n    { .encoding = @encode(long)},\n    { .encoding = @encode(long long)},\n    { .encoding = @encode(unsigned char)},\n    { .encoding = @encode(unsigned short)},\n    { .encoding = @encode(unsigned int)},\n    { .encoding = @encode(unsigned long)},\n    { .encoding = @encode(unsigned long long)},\n    { .encoding = @encode(float)},\n    { .encoding = @encode(double)},\n    { .encoding = @encode(BOOL)},\n    { .encoding = @encode(const char*)},\n};\n\nNSString * __nonnull const RXObjCRuntimeErrorDomain   = @\"RXObjCRuntimeErrorDomain\";\nNSString * __nonnull const RXObjCRuntimeErrorIsKVOKey = @\"RXObjCRuntimeErrorIsKVOKey\";\n\nBOOL RX_return_type_is_supported(const char *type) {\n    if (type == nil) {\n        return NO;\n    }\n\n    for (int i = 0; i < sizeof(supported_types) / sizeof(supported_type_t); ++i) {\n        if (supported_types[i].encoding[0] != type[0]) {\n            continue;\n        }\n        if (strcmp(supported_types[i].encoding, type) == 0) {\n            return YES;\n        }\n    }\n\n    return NO;\n}\n\nstatic BOOL RX_method_has_supported_return_type(Method method) {\n    const char *rawEncoding = method_getTypeEncoding(method);\n    ALWAYS(rawEncoding != nil, @\"Example encoding method is nil.\");\n\n    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:rawEncoding];\n    ALWAYS(methodSignature != nil, @\"Method signature method is nil.\");\n\n    return RX_return_type_is_supported(methodSignature.methodReturnType);\n}\n\nSEL __nonnull RX_selector(SEL __nonnull selector) {\n    NSString *selectorString = NSStringFromSelector(selector);\n    return NSSelectorFromString([RX_PREFIX stringByAppendingString:selectorString]);\n}\n\n#endif\n\nBOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature) {\n    const char *methodReturnType = methodSignature.methodReturnType;\n    return strcmp(methodReturnType, @encode(void)) == 0;\n}\n\nBOOL RX_is_method_with_description_void(struct objc_method_description method) {\n    return strncmp(method.types, @encode(void), 1) == 0;\n}\n\nid __nonnull RX_extract_argument_at_index(NSInvocation * __nonnull invocation, NSUInteger index) {\n    const char *argumentType = [invocation.methodSignature getArgumentTypeAtIndex:index];\n    \n#define RETURN_VALUE(type) \\\n    else if (strcmp(argumentType, @encode(type)) == 0) {\\\n        type val = 0; \\\n        [invocation getArgument:&val atIndex:index]; \\\n        return @(val); \\\n    }\n\n    // Skip const type qualifier.\n    if (argumentType[0] == 'r') {\n        argumentType++;\n    }\n    \n    if (strcmp(argumentType, @encode(id)) == 0\n        || strcmp(argumentType, @encode(Class)) == 0\n        || strcmp(argumentType, @encode(void (^)(void))) == 0\n    ) {\n        __unsafe_unretained id argument = nil;\n        [invocation getArgument:&argument atIndex:index];\n        return argument;\n    }\n    RETURN_VALUE(char)\n    RETURN_VALUE(short)\n    RETURN_VALUE(int)\n    RETURN_VALUE(long)\n    RETURN_VALUE(long long)\n    RETURN_VALUE(unsigned char)\n    RETURN_VALUE(unsigned short)\n    RETURN_VALUE(unsigned int)\n    RETURN_VALUE(unsigned long)\n    RETURN_VALUE(unsigned long long)\n    RETURN_VALUE(float)\n    RETURN_VALUE(double)\n    RETURN_VALUE(BOOL)\n    RETURN_VALUE(const char *)\n    else {\n        NSUInteger size = 0;\n        NSGetSizeAndAlignment(argumentType, &size, NULL);\n        NSCParameterAssert(size > 0);\n        uint8_t data[size];\n        [invocation getArgument:&data atIndex:index];\n        \n        return [NSValue valueWithBytes:&data objCType:argumentType];\n    }\n}\n\nNSArray *RX_extract_arguments(NSInvocation *invocation) {\n    NSUInteger numberOfArguments = invocation.methodSignature.numberOfArguments;\n    NSUInteger numberOfVisibleArguments = numberOfArguments - HIDDEN_ARGUMENT_COUNT;\n    \n    NSCParameterAssert(numberOfVisibleArguments >= 0);\n    \n    NSMutableArray *arguments = [NSMutableArray arrayWithCapacity:numberOfVisibleArguments];\n    \n    for (NSUInteger index = HIDDEN_ARGUMENT_COUNT; index < numberOfArguments; ++index) {\n        [arguments addObject:RX_extract_argument_at_index(invocation, index) ?: [NSNull null]];\n    }\n    \n    return arguments;\n}\n\nIMP __nonnull RX_default_target_implementation(void) {\n    return _objc_msgForward;\n}\n\n#if !DISABLE_SWIZZLING\n\nvoid * __nonnull RX_reference_from_selector(SEL __nonnull selector) {\n    return selector;\n}\n\nstatic BOOL RX_forward_invocation(id __nonnull __unsafe_unretained self, NSInvocation *invocation) {\n    SEL originalSelector = RX_selector(invocation.selector);\n\n    id<RXMessageSentObserver> messageSentObserver = objc_getAssociatedObject(self, originalSelector);\n\n    if (messageSentObserver != nil) {\n        NSArray *arguments = RX_extract_arguments(invocation);\n        [messageSentObserver messageSentWithArguments:arguments];\n    }\n\n    if ([self respondsToSelector:originalSelector]) {\n        invocation.selector = originalSelector;\n        [invocation invokeWithTarget:self];\n\n        if (messageSentObserver != nil) {\n            NSArray *arguments = RX_extract_arguments(invocation);\n            [messageSentObserver methodInvokedWithArguments:arguments];\n        }\n\n        return YES;\n    }\n\n    return NO;\n}\n\nstatic BOOL RX_responds_to_selector(id __nonnull __unsafe_unretained self, SEL selector) {\n    Class class = object_getClass(self);\n    if (class == nil) { return NO; }\n\n    Method m = class_getInstanceMethod(class, selector);\n    return m != nil;\n\n}\n\nstatic NSMethodSignatureRef RX_method_signature(id __nonnull __unsafe_unretained self, SEL selector) {\n    Class class = object_getClass(self);\n    if (class == nil) { return nil; }\n\n    Method method = class_getInstanceMethod(class, selector);\n    if (method == nil) { return nil; }\n\n    const char *encoding = method_getTypeEncoding(method);\n    if (encoding == nil) { return nil; }\n\n    return [NSMethodSignature signatureWithObjCTypes:encoding];\n}\n\nstatic NSString * __nonnull RX_method_encoding(Method __nonnull method) {\n    const char *typeEncoding = method_getTypeEncoding(method);\n    ALWAYS(typeEncoding != nil, @\"Method encoding is nil.\");\n\n    NSString *encoding = [NSString stringWithCString:typeEncoding encoding:NSASCIIStringEncoding];\n    ALWAYS(encoding != nil, @\"Can't convert encoding to NSString.\");\n    return encoding;\n}\n\n@interface RXObjCRuntime: NSObject\n\n@property (nonatomic, assign) pthread_mutex_t lock;\n\n@property (nonatomic, strong) NSMutableSet<NSValue *> *classesThatSupportObservingByForwarding;\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, NSMutableSet<NSValue*> *> *forwardedSelectorsByClass;\n\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, Class> *dynamicSubclassByRealClass;\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, NSMutableDictionary<NSValue*, NSValue *>*> *interceptorIMPbySelectorsByClass;\n\n+(RXObjCRuntime*)instance;\n\n-(void)performLocked:(void (^)(RXObjCRuntime* __nonnull))action;\n-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error;\n-(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector\n                      ofClass:(Class __nonnull)class\n   newImplementationGenerator:(IMP(^)(void))newImplementationGenerator\nreplacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator\n                        error:(NSErrorParam)error;\n\n\n+(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration encodedAs:(SEL)selector;\n\n@end\n\n/**\n All API methods perform work on locked instance of `RXObjCRuntime`. In that way it's easy to prove\n that every action is properly locked.\n */\nIMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSErrorParam error) {\n    __block IMP targetImplementation = nil;\n    // Target is the second object that needs to be synchronized to TRY to make sure other swizzling framework\n    // won't do something in parallel.\n    // Even though this is too fine grained locking and more coarse grained locks should exist, this is just in case\n    // someone calls this method directly without any external lock.\n    @synchronized(target) {\n        // The only other resource that all other swizzling libraries have in common without introducing external\n        // dependencies is class object.\n        //\n        // It is polite to try to synchronize it in hope other unknown entities will also attempt to do so.\n        // It's like trying to figure out how to communicate with aliens without actually communicating,\n        // save for the fact that aliens are people, programmers, authors of swizzling libraries.\n        @synchronized([target class]) {\n            [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n                targetImplementation = [self ensurePrepared:target\n                                               forObserving:selector\n                                                      error:error];\n            }];\n        }\n    }\n\n    return targetImplementation;\n}\n\n// bodies\n\n#define FORWARD_BODY(invocation)                        if (RX_forward_invocation(self, NAME_CAT(_, 0, invocation))) { return; }\n\n#define RESPONDS_TO_SELECTOR_BODY(selector)             if (RX_responds_to_selector(self, NAME_CAT(_, 0, selector))) return YES;\n\n#define CLASS_BODY(...)                                 return actAsClass;\n\n#define METHOD_SIGNATURE_FOR_SELECTOR_BODY(selector)                                            \\\n    NSMethodSignatureRef methodSignature = RX_method_signature(self, NAME_CAT(_, 0, selector)); \\\n    if (methodSignature != nil) {                                                               \\\n        return methodSignature;                                                                 \\\n    }\n\n#define DEALLOCATING_BODY(...)                                                        \\\n    id<RXDeallocatingObserver> observer = objc_getAssociatedObject(self, rxSelector); \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                \\\n        [observer deallocating];                                                      \\\n    }\n\n#define OBSERVE_BODY(...)                                                              \\\n    id<RXMessageSentObserver> observer = objc_getAssociatedObject(self, rxSelector);   \\\n                                                                                       \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                 \\\n        [observer messageSentWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \\\n    }                                                                                  \\\n\n\n#define OBSERVE_INVOKED_BODY(...)                                                        \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                   \\\n        [observer methodInvokedWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \\\n    }                                                                                    \\\n\n\n#define BUILD_ARG_WRAPPER(type)                   RX_ARG_ ## type                                                     //RX_ARG_ ## type\n\n#define CAT(_1, _2, head, tail)                   RX_CAT2(head, tail)\n#define SEPARATE_BY_COMMA(_1, _2, head, tail)     head, tail\n#define SEPARATE_BY_SPACE(_1, _2, head, tail)     head tail\n#define SEPARATE_BY_UNDERSCORE(head, tail)        RX_CAT2(RX_CAT2(head, _), tail)\n\n#define UNDERSCORE_TYPE_CAT(_1, index, type)      RX_CAT2(_, type)                                                    // generates -> _type\n#define NAME_CAT(_1, index, type)                 SEPARATE_BY_UNDERSCORE(type, index)                                 // generates -> type_0\n#define TYPE_AND_NAME_CAT(_1, index, type)        type SEPARATE_BY_UNDERSCORE(type, index)                            // generates -> type type_0\n#define NOT_NULL_ARGUMENT_CAT(_1, index, type)    BUILD_ARG_WRAPPER(type)(NAME_CAT(_1, index, type))                  // generates -> ((id)(type_0) ?: [NSNull null])\n#define EXAMPLE_PARAMETER(_1, index, type)        RX_CAT2(_, type):(type)SEPARATE_BY_UNDERSCORE(type, index)          // generates -> _type:(type)type_0\n#define SELECTOR_PART(_1, index, type)            RX_CAT2(_, type:)                                                   // generates -> _type:\n\n#define COMMA_DELIMITED_ARGUMENTS(...)            RX_FOREACH(_, SEPARATE_BY_COMMA, NOT_NULL_ARGUMENT_CAT, ## __VA_ARGS__)\n#define ARGUMENTS(...)                            RX_FOREACH_COMMA(_, NAME_CAT, ## __VA_ARGS__)\n#define DECLARE_ARGUMENTS(...)                    RX_FOREACH_COMMA(_, TYPE_AND_NAME_CAT, ## __VA_ARGS__)\n\n// optimized observe methods\n\n#define GENERATE_SELECTOR_IDENTIFIER(...)         RX_CAT2(exampleSelector, RX_FOREACH(_, CAT, UNDERSCORE_TYPE_CAT, ## __VA_ARGS__))\n\n#define GENERATE_METHOD_IDENTIFIER(...)           RX_CAT2(swizzle, RX_FOREACH(_, CAT, UNDERSCORE_TYPE_CAT, ## __VA_ARGS__))\n\n#define GENERATE_OBSERVE_METHOD_DECLARATION(...)                                 \\\n    -(BOOL)GENERATE_METHOD_IDENTIFIER(__VA_ARGS__):(Class __nonnull)class        \\\n                                          selector:(SEL)selector                 \\\n                                             error:(NSErrorParam)error {         \\\n\n\n#define BUILD_EXAMPLE_METHOD(return_value, ...) \\\n    +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, EXAMPLE_PARAMETER, ## __VA_ARGS__)) {}\n\n#define BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ...) \\\n    RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, SELECTOR_PART, ## __VA_ARGS__))\n\n#define SWIZZLE_OBSERVE_METHOD_DEFINITIONS(return_value, ...) \\\n    BUILD_EXAMPLE_METHOD(return_value, ## __VA_ARGS__)                                                                                                  \\\n    SWIZZLE_METHOD(return_value, GENERATE_OBSERVE_METHOD_DECLARATION(return_value, ## __VA_ARGS__), OBSERVE_BODY, OBSERVE_INVOKED_BODY, ## __VA_ARGS__) \\\n\n#define SWIZZLE_OBSERVE_METHOD_BODY(return_value, ...)                                                                                                       \\\n       __unused SEL GENERATE_SELECTOR_IDENTIFIER(return_value, ## __VA_ARGS__) = @selector(BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ## __VA_ARGS__));                                           \\\n       [self registerOptimizedObserver:^BOOL(RXObjCRuntime * __nonnull self, Class __nonnull class,                                                     \\\n            SEL __nonnull selector, NSErrorParam error) {                                                                                               \\\n            return [self GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__):class selector:selector error:error];                                 \\\n       } encodedAs:GENERATE_SELECTOR_IDENTIFIER(return_value, ## __VA_ARGS__)];                                                                                                                    \\\n\n// infrastructure method\n\n#define NO_BODY(...)\n\n#define SWIZZLE_INFRASTRUCTURE_METHOD(return_value, method_name, parameters, method_selector, body, ...)               \\\n    SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSErrorParam)error        \\\n        {                                                                                                              \\\n            SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__)                                              \\\n\n\n// common base\n\n#define SWIZZLE_METHOD(return_value, method_prototype, body, invoked_body, ...)                                          \\\nmethod_prototype                                                                                                         \\\n    __unused SEL rxSelector = RX_selector(selector);                                                                     \\\n    IMP (^newImplementationGenerator)(void) = ^() {                                                                      \\\n        __block IMP thisIMP = nil;                                                                                       \\\n        id newImplementation = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__)) {               \\\n            body(__VA_ARGS__)                                                                                            \\\n                                                                                                                         \\\n            struct objc_super superInfo = {                                                                              \\\n                .receiver = self,                                                                                        \\\n                .super_class = class_getSuperclass(class)                                                                \\\n            };                                                                                                           \\\n                                                                                                                         \\\n            return_value (*msgSend)(struct objc_super *, SEL DECLARE_ARGUMENTS(__VA_ARGS__))                             \\\n                = (__typeof__(msgSend))objc_msgSendSuper;                                                                \\\n            @try {                                                                                                       \\\n              return msgSend(&superInfo, selector ARGUMENTS(__VA_ARGS__));                                               \\\n            }                                                                                                            \\\n            @finally { invoked_body(__VA_ARGS__) }                                                                       \\\n        };                                                                                                               \\\n                                                                                                                         \\\n        thisIMP = imp_implementationWithBlock(newImplementation);                                                        \\\n        return thisIMP;                                                                                                  \\\n    };                                                                                                                   \\\n                                                                                                                         \\\n    IMP (^replacementImplementationGenerator)(IMP) = ^(IMP originalImplementation) {                                     \\\n        __block return_value (*originalImplementationTyped)(__unsafe_unretained id, SEL DECLARE_ARGUMENTS(__VA_ARGS__) ) \\\n            = (__typeof__(originalImplementationTyped))(originalImplementation);                                         \\\n                                                                                                                         \\\n        __block IMP thisIMP = nil;                                                                                       \\\n        id implementationReplacement = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__) ) {      \\\n            body(__VA_ARGS__)                                                                                            \\\n            @try {                                                                                                       \\\n                return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__));                               \\\n            }                                                                                                            \\\n            @finally { invoked_body(__VA_ARGS__) }                                                                       \\\n        };                                                                                                               \\\n                                                                                                                         \\\n        thisIMP = imp_implementationWithBlock(implementationReplacement);                                                \\\n        return thisIMP;                                                                                                  \\\n    };                                                                                                                   \\\n                                                                                                                         \\\n    return [self ensureSwizzledSelector:selector                                                                         \\\n                                ofClass:class                                                                            \\\n             newImplementationGenerator:newImplementationGenerator                                                       \\\n     replacementImplementationGenerator:replacementImplementationGenerator                                               \\\n                                  error:error];                                                                          \\\n }                                                                                                                       \\\n\n\n@interface RXObjCRuntime (InfrastructureMethods)\n@end\n\n// MARK: Infrastructure Methods\n\n@implementation RXObjCRuntime (InfrastructureMethods)\n\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    void,\n    swizzleForwardInvocation,\n    ,\n    @selector(forwardInvocation:),\n    FORWARD_BODY,\n    NSInvocationRef\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    BOOL,\n    swizzleRespondsToSelector,\n    ,\n    @selector(respondsToSelector:),\n    RESPONDS_TO_SELECTOR_BODY,\n    SEL\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    Class __nonnull,\n    swizzleClass,\n    toActAs:(Class)actAsClass,\n    @selector(class),\n    CLASS_BODY\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    NSMethodSignatureRef,\n    swizzleMethodSignatureForSelector,\n    ,\n    @selector(methodSignatureForSelector:),\n    METHOD_SIGNATURE_FOR_SELECTOR_BODY,\n    SEL\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    void,\n    swizzleDeallocating,\n    ,\n    deallocSelector,\n    DEALLOCATING_BODY\n)\n\n@end\n\n// MARK: Optimized intercepting methods for specific combination of parameter types\n\n@interface RXObjCRuntime (swizzle)\n\n@end\n\n@implementation RXObjCRuntime(swizzle)\n\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void)\n\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, char)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, short)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, int)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, long)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, rx_uchar)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, rx_ushort)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, rx_uint)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, rx_ulong)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, rx_block)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, float)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, double)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, SEL)\n\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, id)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, char)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, short)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, int)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, long)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, rx_uchar)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, rx_ushort)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, rx_uint)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, rx_ulong)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, rx_block)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, float)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, double)\nSWIZZLE_OBSERVE_METHOD_DEFINITIONS(void, id, SEL)\n\n+(void)load {\n    SWIZZLE_OBSERVE_METHOD_BODY(void)\n\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, char)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, short)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, int)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, long)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, rx_uchar)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, rx_ushort)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, rx_uint)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, rx_ulong)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, rx_block)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, float)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, double)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, SEL)\n\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, id)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, char)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, short)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, int)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, long)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, rx_uchar)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, rx_ushort)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, rx_uint)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, rx_ulong)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, rx_block)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, float)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, double)\n    SWIZZLE_OBSERVE_METHOD_BODY(void, id, SEL)\n}\n\n@end\n\n// MARK: RXObjCRuntime\n\n@implementation RXObjCRuntime\n\nstatic RXObjCRuntime *_instance = nil;\nstatic NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimizedObserversByMethodEncoding = nil;\n\n+(RXObjCRuntime*)instance {\n    return _instance;\n}\n\n+(void)initialize {\n    _instance = [[RXObjCRuntime alloc] init];\n    defaultTypeID = CFGetTypeID((CFTypeRef)RXObjCRuntime.class); // just need a reference of some object not from CF\n    deallocSelector = NSSelectorFromString(@\"dealloc\");\n    NSAssert(_instance != nil, @\"Failed to initialize swizzling\");\n}\n\n-(instancetype)init {\n    self = [super init];\n    if (!self) return nil;\n\n    self.classesThatSupportObservingByForwarding = [NSMutableSet set];\n    self.forwardedSelectorsByClass = [NSMutableDictionary dictionary];\n\n    self.dynamicSubclassByRealClass = [NSMutableDictionary dictionary];\n    self.interceptorIMPbySelectorsByClass = [NSMutableDictionary dictionary];\n\n    pthread_mutexattr_t lock_attr;\n    pthread_mutexattr_init(&lock_attr);\n    pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);\n    pthread_mutex_init(&_lock, &lock_attr);\n    pthread_mutexattr_destroy(&lock_attr);\n    \n    return self;\n}\n\n-(void)performLocked:(void (^)(RXObjCRuntime* __nonnull))action {\n    pthread_mutex_lock(&_lock);\n    action(self);\n    pthread_mutex_unlock(&_lock);\n}\n\n+(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration encodedAs:(SEL)selector {\n    Method exampleEncodingMethod = class_getClassMethod(self, selector);\n    ALWAYS(exampleEncodingMethod != nil, @\"Example encoding method is nil.\");\n\n    NSString *methodEncoding = RX_method_encoding(exampleEncodingMethod);\n\n    if (optimizedObserversByMethodEncoding == nil) {\n        optimizedObserversByMethodEncoding = [NSMutableDictionary dictionary];\n    }\n\n    DLOG(@\"Added optimized method: %@ (%@)\", methodEncoding, NSStringFromSelector(selector));\n    ALWAYS(optimizedObserversByMethodEncoding[methodEncoding] == nil, @\"Optimized observer already registered\")\n    optimizedObserversByMethodEncoding[methodEncoding] = registration;\n}\n\n/**\n This is the main entry point for observing messages sent to arbitrary objects.\n */\n-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error {\n    Method instanceMethod = class_getInstanceMethod([target class], selector);\n    if (instanceMethod == nil) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSelectorNotImplemented\n                                       userInfo:nil], nil);\n    }\n\n    if (selector == @selector(class)\n    ||  selector == @selector(forwardingTargetForSelector:)\n    ||  selector == @selector(methodSignatureForSelector:)\n    ||  selector == @selector(respondsToSelector:)) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages\n                                       userInfo:nil], nil);\n    }\n\n    // For `dealloc` message, original implementation will be swizzled.\n    // This is a special case because observing `dealloc` message is performed when `observeWeakly` is used.\n    //\n    // Some toll free bridged classes don't handle `object_setClass` well and cause crashes.\n    //\n    // To make `deallocating` as robust as possible, original implementation will be replaced.\n    if (selector == deallocSelector) {\n        Class __nonnull deallocSwizzingTarget = [target class];\n        IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];\n        if (interceptorIMPForSelector != nil) {\n            return interceptorIMPForSelector;\n        }\n\n        if (![self swizzleDeallocating:deallocSwizzingTarget error:error]) {\n            return nil;\n        }\n\n        interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];\n        if (interceptorIMPForSelector != nil) {\n            return interceptorIMPForSelector;\n        }\n    }\n    else {\n        Class __nullable swizzlingImplementorClass = [self prepareTargetClassForObserving:target error:error];\n        if (swizzlingImplementorClass == nil) {\n            return nil;\n        }\n\n        NSString *methodEncoding = RX_method_encoding(instanceMethod);\n        RXInterceptWithOptimizedObserver optimizedIntercept = optimizedObserversByMethodEncoding[methodEncoding];\n\n        if (!RX_method_has_supported_return_type(instanceMethod)) {\n            RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                               code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType\n                                           userInfo:nil], nil);\n        }\n\n        // optimized interception method\n        if (optimizedIntercept != nil) {\n            IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:swizzlingImplementorClass];\n            if (interceptorIMPForSelector != nil) {\n                return interceptorIMPForSelector;\n            }\n\n            if (!optimizedIntercept(self, swizzlingImplementorClass, selector, error)) {\n                return nil;\n            }\n\n            interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:swizzlingImplementorClass];\n            if (interceptorIMPForSelector != nil) {\n                return interceptorIMPForSelector;\n            }\n        }\n        // default fallback to observing by forwarding messages\n        else {\n            if ([self forwardingSelector:selector forClass:swizzlingImplementorClass]) {\n                return RX_default_target_implementation();\n            }\n\n            if (![self observeByForwardingMessages:swizzlingImplementorClass\n                                          selector:selector\n                                            target:target\n                                             error:error]) {\n                return nil;\n            }\n\n            if ([self forwardingSelector:selector forClass:swizzlingImplementorClass]) {\n                return RX_default_target_implementation();\n            }\n        }\n    }\n\n    RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                       code:RXObjCRuntimeErrorUnknown\n                                   userInfo:nil], nil);\n}\n\n-(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NSErrorParam)error {\n    Class swizzlingClass = objc_getAssociatedObject(target, &RxSwizzlingTargetClassKey);\n    if (swizzlingClass != nil) {\n        return swizzlingClass;\n    }\n\n    Class __nonnull wannaBeClass = [target class];\n    /**\n     Core Foundation classes are usually toll free bridged. Those classes crash the program in case\n     `object_setClass` is performed on them.\n\n     There is a possibility to just swizzle methods on original object, but since those won't be usual use\n     cases for this library, then an error will just be reported for now.\n     */\n    BOOL isThisTollFreeFoundationClass = CFGetTypeID((CFTypeRef)target) != defaultTypeID;\n\n    if (isThisTollFreeFoundationClass) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects\n                                       userInfo:nil], nil);\n    }\n\n    /**\n     If the object is reporting a different class then what it's real class, that means that there is probably\n     already some interception mechanism in place or something weird is happening.\n     \n     Most common case when this would happen is when using KVO (`observe`) and `sentMessage`.\n\n     This error is easily resolved by just using `sentMessage` observing before `observe`.\n     \n     The reason why other way around could create issues is because KVO will unregister it's interceptor \n     class and restore original class. Unfortunately that will happen no matter was there another interceptor\n     subclass registered in hierarchy or not.\n     \n     Failure scenario:\n     * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)\n     * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)\n     * then unobserving with KVO will restore class to be `OriginalClass` -> failure point\n\n     The reason why changing order of observing works is because any interception method should return\n     object's original real class (if that doesn't happen then it's really easy to argue that's a bug\n     in that other library).\n     \n     This library won't remove registered interceptor even if there aren't any observers left because\n     it's highly unlikely it would have any benefit in real world use cases, and it's even more\n     dangerous.\n     */\n    if ([target class] != object_getClass(target)) {\n        BOOL isKVO = [target respondsToSelector:NSSelectorFromString(@\"_isKVOA\")];\n\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted\n                                       userInfo:@{\n                                                  RXObjCRuntimeErrorIsKVOKey : @(isKVO)\n                                                  }], nil);\n    }\n\n    Class __nullable dynamicFakeSubclass = [self ensureHasDynamicFakeSubclass:wannaBeClass error:error];\n\n    if (dynamicFakeSubclass == nil) {\n        return nil;\n    }\n\n    Class previousClass = object_setClass(target, dynamicFakeSubclass);\n    if (previousClass != wannaBeClass) {\n        THREADING_HAZARD(wannaBeClass);\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism\n                                       userInfo:nil], nil);\n    }\n\n    objc_setAssociatedObject(target, &RxSwizzlingTargetClassKey, dynamicFakeSubclass, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n    return dynamicFakeSubclass;\n}\n\n\n-(BOOL)forwardingSelector:(SEL)selector forClass:(Class __nonnull)class {\n    return [self.forwardedSelectorsByClass[CLASS_VALUE(class)] containsObject:SEL_VALUE(selector)];\n}\n\n-(void)registerForwardedSelector:(SEL)selector forClass:(Class __nonnull)class {\n    NSValue *classValue = CLASS_VALUE(class);\n\n    NSMutableSet<NSValue *> *forwardedSelectors = self.forwardedSelectorsByClass[classValue];\n\n    if (forwardedSelectors == nil) {\n        forwardedSelectors = [NSMutableSet set];\n        self.forwardedSelectorsByClass[classValue] = forwardedSelectors;\n    }\n\n    [forwardedSelectors addObject:SEL_VALUE(selector)];\n}\n\n-(BOOL)observeByForwardingMessages:(Class __nonnull)swizzlingImplementorClass\n                          selector:(SEL)selector\n                            target:(id __nonnull)target\n                             error:(NSErrorParam)error {\n    if (![self ensureForwardingMethodsAreSwizzled:swizzlingImplementorClass error:error]) {\n        return NO;\n    }\n\n    ALWAYS(![self forwardingSelector:selector forClass:swizzlingImplementorClass], @\"Already observing selector for class\");\n\n#if TRACE_RESOURCES\n    atomic_fetch_add(&numberOfForwardedMethods, 1);\n#endif\n    SEL rxSelector = RX_selector(selector);\n\n    Method instanceMethod = class_getInstanceMethod(swizzlingImplementorClass, selector);\n    ALWAYS(instanceMethod != nil, @\"Instance method is nil\");\n\n    const char* methodEncoding = method_getTypeEncoding(instanceMethod);\n    ALWAYS(methodEncoding != nil, @\"Method encoding is nil.\");\n    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:methodEncoding];\n    ALWAYS(methodSignature != nil, @\"Method signature is invalid.\");\n\n    IMP implementation = method_getImplementation(instanceMethod);\n\n    if (implementation == nil) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSelectorNotImplemented\n                                       userInfo:nil], NO);\n    }\n\n    if (!class_addMethod(swizzlingImplementorClass, rxSelector, implementation, methodEncoding)) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed\n                                       userInfo:nil], NO);\n    }\n\n    if (!class_addMethod(swizzlingImplementorClass, selector, _objc_msgForward, methodEncoding)) {\n        if (implementation != method_setImplementation(instanceMethod, _objc_msgForward)) {\n            THREADING_HAZARD(swizzlingImplementorClass);\n            RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                               code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation\n                                           userInfo:nil], NO);\n        }\n    }\n\n    DLOG(@\"Rx uses forwarding to observe `%@` for `%@`.\", NSStringFromSelector(selector), swizzlingImplementorClass);\n    [self registerForwardedSelector:selector forClass:swizzlingImplementorClass];\n\n    return YES;\n}\n\n/**\n If object don't have some weird behavior, claims it's the same class that runtime shows,\n then dynamic subclass is created (only this instance will have performance hit).\n \n In case something weird is detected, then original base class is being swizzled and all instances\n will have somewhat reduced performance.\n \n This is especially handy optimization for weak KVO. Nobody will swizzle for example `NSString`,\n but to know when instance of a `NSString` was deallocated, performance hit will be only felt on a \n single instance of `NSString`, not all instances of `NSString`s.\n */\n-(Class __nullable)ensureHasDynamicFakeSubclass:(Class __nonnull)class error:(NSErrorParam)error {\n    Class dynamicFakeSubclass = self.dynamicSubclassByRealClass[CLASS_VALUE(class)];\n    if (dynamicFakeSubclass != nil) {\n        return dynamicFakeSubclass;\n    }\n\n    NSString *dynamicFakeSubclassName = [RX_PREFIX stringByAppendingString:NSStringFromClass(class)];\n    const char *dynamicFakeSubclassNameRaw = dynamicFakeSubclassName.UTF8String;\n    dynamicFakeSubclass = objc_allocateClassPair(class, dynamicFakeSubclassNameRaw, 0);\n    ALWAYS(dynamicFakeSubclass != nil, @\"Class not generated\");\n\n    if (![self swizzleClass:dynamicFakeSubclass toActAs:class error:error]) {\n        return nil;\n    }\n\n    objc_registerClassPair(dynamicFakeSubclass);\n\n    [self.dynamicSubclassByRealClass setObject:dynamicFakeSubclass forKey:CLASS_VALUE(class)];\n    ALWAYS(self.dynamicSubclassByRealClass[CLASS_VALUE(class)] != nil, @\"Class not registered\");\n\n    return dynamicFakeSubclass;\n}\n\n-(BOOL)ensureForwardingMethodsAreSwizzled:(Class __nonnull)class error:(NSErrorParam)error {\n    NSValue *classValue = CLASS_VALUE(class);\n    if ([self.classesThatSupportObservingByForwarding containsObject:classValue]) {\n        return YES;\n    }\n\n    if (![self swizzleForwardInvocation:class error:error]) { return NO; }\n    if (![self swizzleMethodSignatureForSelector:class error:error]) { return NO; }\n    if (![self swizzleRespondsToSelector:class error:error]) { return NO; }\n\n    [self.classesThatSupportObservingByForwarding addObject:classValue];\n\n    return YES;\n}\n\n-(void)registerInterceptedSelector:(SEL)selector implementation:(IMP)implementation forClass:(Class)class {\n    NSValue * __nonnull classValue = CLASS_VALUE(class);\n    NSValue * __nonnull selectorValue = SEL_VALUE(selector);\n\n    NSMutableDictionary *swizzledIMPBySelectorsForClass = self.interceptorIMPbySelectorsByClass[classValue];\n\n    if (swizzledIMPBySelectorsForClass == nil) {\n        swizzledIMPBySelectorsForClass = [NSMutableDictionary dictionary];\n        self.interceptorIMPbySelectorsByClass[classValue] = swizzledIMPBySelectorsForClass;\n    }\n\n    swizzledIMPBySelectorsForClass[selectorValue] = IMP_VALUE(implementation);\n\n    ALWAYS([self interceptorImplementationForSelector:selector forClass:class] != nil, @\"Class should have been swizzled\");\n}\n\n-(IMP)interceptorImplementationForSelector:(SEL)selector forClass:(Class)class {\n    NSValue * __nonnull classValue = CLASS_VALUE(class);\n    NSValue * __nonnull selectorValue = SEL_VALUE(selector);\n\n    NSMutableDictionary *swizzledIMPBySelectorForClass = self.interceptorIMPbySelectorsByClass[classValue];\n\n    NSValue *impValue = swizzledIMPBySelectorForClass[selectorValue];\n    return impValue.pointerValue;\n}\n\n-(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector\n                      ofClass:(Class __nonnull)class\n   newImplementationGenerator:(IMP(^)(void))newImplementationGenerator\nreplacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator\n                        error:(NSErrorParam)error {\n    if ([self interceptorImplementationForSelector:selector forClass:class] != nil) {\n        DLOG(@\"Trying to register same intercept at least once, this sounds like a possible bug\");\n        return YES;\n    }\n\n#if TRACE_RESOURCES\n    atomic_fetch_add(&numberOInterceptedMethods, 1);\n#endif\n    \n    DLOG(@\"Rx is swizzling `%@` for `%@`\", NSStringFromSelector(selector), class);\n\n    Method existingMethod = class_getInstanceMethod(class, selector);\n    ALWAYS(existingMethod != nil, @\"Method doesn't exist\");\n\n    const char *encoding = method_getTypeEncoding(existingMethod);\n    ALWAYS(encoding != nil, @\"Encoding is nil\");\n\n    IMP newImplementation = newImplementationGenerator();\n\n    if (class_addMethod(class, selector, newImplementation, encoding)) {\n        // new method added, job done\n        [self registerInterceptedSelector:selector implementation:newImplementation forClass:class];\n\n        return YES;\n    }\n\n    imp_removeBlock(newImplementation);\n\n    // if add fails, that means that method already exists on targetClass\n    Method existingMethodOnTargetClass = existingMethod;\n\n    IMP originalImplementation = method_getImplementation(existingMethodOnTargetClass);\n    ALWAYS(originalImplementation != nil, @\"Method must exist.\");\n    IMP implementationReplacementIMP = replacementImplementationGenerator(originalImplementation);\n    ALWAYS(implementationReplacementIMP != nil, @\"Method must exist.\");\n    IMP originalImplementationAfterChange = method_setImplementation(existingMethodOnTargetClass, implementationReplacementIMP);\n    ALWAYS(originalImplementation != nil, @\"Method must exist.\");\n\n    // If method replacing failed, who knows what happened, better not trying again, otherwise program can get\n    // corrupted.\n    [self registerInterceptedSelector:selector implementation:implementationReplacementIMP forClass:class];\n\n    // ¯\\_(ツ)_/¯\n    if (originalImplementationAfterChange != originalImplementation) {\n        THREADING_HAZARD(class);\n        return NO;\n    }\n\n    return YES;\n}\n\n@end\n\n#if TRACE_RESOURCES\n\nNSInteger RX_number_of_dynamic_subclasses(void) {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.dynamicSubclassByRealClass.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_forwarding_enabled_classes(void) {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.classesThatSupportObservingByForwarding.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_intercepting_classes(void) {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.interceptorIMPbySelectorsByClass.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_forwarded_methods(void) {\n    return numberOfForwardedMethods;\n}\n\nNSInteger RX_number_of_swizzled_methods(void) {\n    return numberOInterceptedMethods;\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h",
    "content": "//\n//  RxCocoaRuntime.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"_RX.h\"\n#import \"_RXDelegateProxy.h\"\n#import \"_RXKVOObserver.h\"\n#import \"_RXObjCRuntime.h\"\n\n//! Project version number for RxCocoa.\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\n\n//! Project version string for RxCocoa.\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h",
    "content": "//\n//  _RX.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <objc/runtime.h>\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n#if        TRACE_RESOURCES >= 2\n#   define DLOG(...)         NSLog(__VA_ARGS__)\n#else\n#   define DLOG(...)\n#endif\n\n#if        DEBUG\n#   define ABORT_IN_DEBUG    abort();\n#else\n#   define ABORT_IN_DEBUG\n#endif\n\n\n#define SEL_VALUE(x)      [NSValue valueWithPointer:(x)]\n#define CLASS_VALUE(x)    [NSValue valueWithNonretainedObject:(x)]\n#define IMP_VALUE(x)      [NSValue valueWithPointer:(x)]\n\n/**\n Checks that the local `error` instance exists before assigning it's value by reference.\n This macro exists to work around static analysis warnings — `NSError` is always assumed to be `nullable`, even though we explicitly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details.\n */\n#define RX_THROW_ERROR(errorValue, returnValue) if (error != nil) { *error = (errorValue); } return (returnValue);\n\n#define RX_CAT2(_1, _2) _RX_CAT2(_1, _2)\n#define _RX_CAT2(_1, _2) _1 ## _2\n\n#define RX_ELEMENT_AT(n, ...) RX_CAT2(_RX_ELEMENT_AT_, n)(__VA_ARGS__)\n#define _RX_ELEMENT_AT_0(x, ...) x\n#define _RX_ELEMENT_AT_1(_0, x, ...) x\n#define _RX_ELEMENT_AT_2(_0, _1, x, ...) x\n#define _RX_ELEMENT_AT_3(_0, _1, _2, x, ...) x\n#define _RX_ELEMENT_AT_4(_0, _1, _2, _3, x, ...) x\n#define _RX_ELEMENT_AT_5(_0, _1, _2, _3, _4, x, ...) x\n#define _RX_ELEMENT_AT_6(_0, _1, _2, _3, _4, _5, x, ...) x\n\n#define RX_COUNT(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)\n#define RX_EMPTY(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 0, 0, 0, 0, 0, 0, 1)\n\n/**\n #define SUM(context, index, head, tail) head + tail\n #define MAP(context, index, element) (context)[index] * (element)\n\n RX_FOR(numbers, SUM, MAP, b0, b1, b2);\n\n (numbers)[0] * (b0) + (numbers)[1] * (b1) + (numbers[2]) * (b2)\n */\n\n#define RX_FOREACH(context, concat, map, ...) RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_CONCAT, _RX_FOREACH_MAP, context, concat, map, __VA_ARGS__)\n#define _RX_FOREACH_CONCAT(index, head, tail, context, concat, map, ...) concat(context, index, head, tail)\n#define _RX_FOREACH_MAP(index, context, concat, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))\n\n/**\n #define MAP(context, index, item) (context)[index] * (item)\n\n RX_FOR_COMMA(numbers, MAP, b0, b1);\n\n ,(numbers)[0] * b0, (numbers)[1] * b1\n */\n#define RX_FOREACH_COMMA(context, map, ...) RX_CAT2(_RX_FOREACH_COMMA_EMPTY_, RX_EMPTY(__VA_ARGS__))(context, map, ## __VA_ARGS__)\n#define _RX_FOREACH_COMMA_EMPTY_1(context, map, ...)\n#define _RX_FOREACH_COMMA_EMPTY_0(context, map, ...) , RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_COMMA_CONCAT, _RX_FOREACH_COMMA_MAP, context, map, __VA_ARGS__)\n#define _RX_FOREACH_COMMA_CONCAT(index, head, tail, context, map, ...) head, tail\n#define _RX_FOREACH_COMMA_MAP(index, context, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))\n\n// rx for\n\n#define RX_FOR_MAX(max, concat, map, ...) RX_CAT2(RX_FOR_, max)(concat, map, ## __VA_ARGS__)\n\n#define RX_FOR_0(concat, map, ...)\n#define RX_FOR_1(concat, map, ...) map(0, __VA_ARGS__)\n#define RX_FOR_2(concat, map, ...) concat(1, RX_FOR_1(concat, map, ## __VA_ARGS__), map(1, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_3(concat, map, ...) concat(2, RX_FOR_2(concat, map, ## __VA_ARGS__), map(2, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_4(concat, map, ...) concat(3, RX_FOR_3(concat, map, ## __VA_ARGS__), map(3, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_5(concat, map, ...) concat(4, RX_FOR_4(concat, map, ## __VA_ARGS__), map(4, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_6(concat, map, ...) concat(5, RX_FOR_5(concat, map, ## __VA_ARGS__), map(5, __VA_ARGS__), __VA_ARGS__)\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h",
    "content": "//\n//  _RXDelegateProxy.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface _RXDelegateProxy : NSObject\n\n@property (nonatomic, weak, readonly) id _forwardToDelegate;\n\n-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate NS_SWIFT_NAME(_setForwardToDelegate(_:retainDelegate:)) ;\n\n-(BOOL)hasWiredImplementationForSelector:(SEL)selector;\n-(BOOL)voidDelegateMethodsContain:(SEL)selector;\n\n-(void)_sentMessage:(SEL)selector withArguments:(NSArray*)arguments;\n-(void)_methodInvoked:(SEL)selector withArguments:(NSArray*)arguments;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h",
    "content": "//\n//  _RXKVOObserver.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n// Exists because if written in Swift, reading unowned is disabled during dealloc process\n@interface _RXKVOObserver : NSObject\n\n-(instancetype)initWithTarget:(id)target\n                 retainTarget:(BOOL)retainTarget\n                      keyPath:(NSString*)keyPath\n                      options:(NSKeyValueObservingOptions)options\n                     callback:(void (^)(id))callback;\n\n-(void)dispose;\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h",
    "content": "//\n//  _RXObjCRuntime.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#if !DISABLE_SWIZZLING\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n/**\n This flag controls `RELEASE` configuration behavior in case race was detecting while modifying\n ObjC runtime.\n\n In case this value is set to `YES`, after runtime race is detected, `abort()` will be called.\n Otherwise, only error will be reported using normal error reporting mechanism.\n\n In `DEBUG` mode `abort` will be always called in case race is detected.\n \n Races can't happen in case this is the only library modifying ObjC runtime, but in case there are multiple libraries\n changing ObjC runtime, race conditions can occur because there is no way to synchronize multiple libraries unaware of\n each other.\n\n To help remedy this situation this library will use `synchronized` on target object and it's meta-class, but\n there aren't any guarantees of how other libraries will behave.\n\n Default value is `NO`.\n\n */\nextern BOOL RXAbortOnThreadingHazard;\n\n/// Error domain for RXObjCRuntime.\nextern NSString * __nonnull const RXObjCRuntimeErrorDomain;\n\n/// `userInfo` key with additional information is interceptor probably KVO.\nextern NSString * __nonnull const RXObjCRuntimeErrorIsKVOKey;\n\ntypedef NS_ENUM(NSInteger, RXObjCRuntimeError) {\n    RXObjCRuntimeErrorUnknown                                           = 1,\n    RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted             = 2,\n    RXObjCRuntimeErrorSelectorNotImplemented                            = 3,\n    RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects = 4,\n    RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism  = 5,\n    RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed              = 6,\n    RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation       = 7,\n    RXObjCRuntimeErrorObservingPerformanceSensitiveMessages             = 8,\n    RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType        = 9,\n};\n\n/// Transforms normal selector into a selector with RX prefix.\nSEL _Nonnull RX_selector(SEL _Nonnull selector);\n\n/// Transforms selector into a unique pointer (because of Swift conversion rules)\nvoid * __nonnull RX_reference_from_selector(SEL __nonnull selector);\n\n/// Protocol that interception observers must implement.\n@protocol RXMessageSentObserver\n\n/// In case the same selector is being intercepted for a pair of base/sub classes,\n/// this property will differentiate between interceptors that need to fire.\n@property (nonatomic, assign, readonly) IMP __nonnull targetImplementation;\n\n-(void)messageSentWithArguments:(NSArray* __nonnull)arguments;\n-(void)methodInvokedWithArguments:(NSArray* __nonnull)arguments;\n\n@end\n\n/// Protocol that deallocating observer must implement.\n@protocol RXDeallocatingObserver\n\n/// In case the same selector is being intercepted for a pair of base/sub classes,\n/// this property will differentiate between interceptors that need to fire.\n@property (nonatomic, assign, readonly) IMP __nonnull targetImplementation;\n\n-(void)deallocating;\n\n@end\n\n/// Ensures interceptor is installed on target object.\nIMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError *__autoreleasing __nullable * __nullable error);\n\n#endif\n\n/// Extracts arguments for `invocation`.\nNSArray * __nonnull RX_extract_arguments(NSInvocation * __nonnull invocation);\n\n/// Returns `YES` in case method has `void` return type.\nBOOL RX_is_method_with_description_void(struct objc_method_description method);\n\n/// Returns `YES` in case methodSignature has `void` return type.\nBOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature);\n\n/// Default value for `RXInterceptionObserver.targetImplementation`.\nIMP __nonnull RX_default_target_implementation(void);\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/RxCocoa.h",
    "content": "//\n//  RxCocoa.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <RxCocoa/_RX.h>\n#import <RxCocoa/_RXDelegateProxy.h>\n#import <RxCocoa/_RXKVOObserver.h>\n#import <RxCocoa/_RXObjCRuntime.h>\n\n//! Project version number for RxCocoa.\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\n\n//! Project version string for RxCocoa.\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/RxCocoa.swift",
    "content": "//\n//  RxCocoa.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n// Importing RxCocoa also imports RxRelay\n@_exported import RxRelay\n\nimport RxSwift\n#if os(iOS)\n    import UIKit\n#endif\n\n/// RxCocoa errors.\npublic enum RxCocoaError\n    : Swift.Error\n    , CustomDebugStringConvertible {\n    /// Unknown error has occurred.\n    case unknown\n    /// Invalid operation was attempted.\n    case invalidOperation(object: Any)\n    /// Items are not yet bound to user interface but have been requested.\n    case itemsNotYetBound(object: Any)\n    /// Invalid KVO Path.\n    case invalidPropertyName(object: Any, propertyName: String)\n    /// Invalid object on key path.\n    case invalidObjectOnKeyPath(object: Any, sourceObject: AnyObject, propertyName: String)\n    /// Error during swizzling.\n    case errorDuringSwizzling\n    /// Casting error.\n    case castingError(object: Any, targetType: Any.Type)\n}\n\n\n// MARK: Debug descriptions\n\nextension RxCocoaError {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error occurred.\"\n        case let .invalidOperation(object):\n            return \"Invalid operation was attempted on `\\(object)`.\"\n        case let .itemsNotYetBound(object):\n            return \"Data source is set, but items are not yet bound to user interface for `\\(object)`.\"\n        case let .invalidPropertyName(object, propertyName):\n            return \"Object `\\(object)` doesn't have a property named `\\(propertyName)`.\"\n        case let .invalidObjectOnKeyPath(object, sourceObject, propertyName):\n            return \"Unobservable object `\\(object)` was observed as `\\(propertyName)` of `\\(sourceObject)`.\"\n        case .errorDuringSwizzling:\n            return \"Error during swizzling.\"\n        case let .castingError(object, targetType):\n            return \"Error casting `\\(object)` to `\\(targetType)`\"\n        }\n    }\n}\n\n\n\n// MARK: Error binding policies\n\nfunc bindingError(_ error: Swift.Error) {\n    let error = \"Binding error: \\(error)\"\n#if DEBUG\n    rxFatalError(error)\n#else\n    print(error)\n#endif\n}\n\n/// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass.\nfunc rxAbstractMethod(message: String = \"Abstract method\", file: StaticString = #file, line: UInt = #line) -> Swift.Never {\n    rxFatalError(message, file: file, line: line)\n}\n\nfunc rxFatalError(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> Swift.Never  {\n    // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.\n    fatalError(lastMessage(), file: file, line: line)\n}\n\nfunc rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {\n    #if DEBUG\n        fatalError(lastMessage(), file: file, line: line)\n    #else\n        print(\"\\(file):\\(line): \\(lastMessage())\")\n    #endif\n}\n\n// MARK: casts or fatal error\n\n// workaround for Swift compiler bug, cheers compiler team :)\nfunc castOptionalOrFatalError<T>(_ value: Any?) -> T? {\n    if value == nil {\n        return nil\n    }\n    let v: T = castOrFatalError(value)\n    return v\n}\n\nfunc castOrThrow<T>(_ resultType: T.Type, _ object: Any) throws -> T {\n    guard let returnValue = object as? T else {\n        throw RxCocoaError.castingError(object: object, targetType: resultType)\n    }\n\n    return returnValue\n}\n\nfunc castOptionalOrThrow<T>(_ resultType: T.Type, _ object: AnyObject) throws -> T? {\n    if NSNull().isEqual(object) {\n        return nil\n    }\n\n    guard let returnValue = object as? T else {\n        throw RxCocoaError.castingError(object: object, targetType: resultType)\n    }\n\n    return returnValue\n}\n\nfunc castOrFatalError<T>(_ value: AnyObject!, message: String) -> T {\n    let maybeResult: T? = value as? T\n    guard let result = maybeResult else {\n        rxFatalError(message)\n    }\n    \n    return result\n}\n\nfunc castOrFatalError<T>(_ value: Any!) -> T {\n    let maybeResult: T? = value as? T\n    guard let result = maybeResult else {\n        rxFatalError(\"Failure converting from \\(String(describing: value)) to \\(T.self)\")\n    }\n    \n    return result\n}\n\n// MARK: Error messages\n\nlet dataSourceNotSet = \"DataSource not set\"\nlet delegateNotSet = \"Delegate not set\"\n\n// MARK: Shared with RxSwift\n\nfunc rxFatalError(_ lastMessage: String) -> Never  {\n    // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.\n    fatalError(lastMessage)\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift",
    "content": "//\n//  ControlEvent.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/// A protocol that extends `ControlEvent`.\npublic protocol ControlEventType : ObservableType {\n\n    /// - returns: `ControlEvent` interface\n    func asControlEvent() -> ControlEvent<Element>\n}\n\n/**\n    A trait for `Observable`/`ObservableType` that represents an event on a UI element.\n\n    Properties:\n\n    - it doesn’t send any initial value on subscription,\n    - it `Complete`s the sequence when the control deallocates,\n    - it never errors out\n    - it delivers events on `MainScheduler.instance`.\n\n    **The implementation of `ControlEvent` will ensure that sequence of events is being subscribed on main scheduler\n     (`subscribe(on: ConcurrentMainScheduler.instance)` behavior).**\n\n    **It is the implementor’s responsibility to make sure that all other properties enumerated above are satisfied.**\n\n    **If they aren’t, using this trait will communicate wrong properties, and could potentially break someone’s code.**\n\n    **If the `events` observable sequence passed into the initializer doesn’t satisfy all enumerated\n     properties, don’t use this trait.**\n*/\npublic struct ControlEvent<PropertyType> : ControlEventType {\n    public typealias Element = PropertyType\n\n    let events: Observable<PropertyType>\n\n    /// Initializes control event with a observable sequence that represents events.\n    ///\n    /// - parameter events: Observable sequence that represents events.\n    /// - returns: Control event created with a observable sequence of events.\n    public init<Ev: ObservableType>(events: Ev) where Ev.Element == Element {\n        self.events = events.subscribe(on: ConcurrentMainScheduler.instance)\n    }\n\n    /// Subscribes an observer to control events.\n    ///\n    /// - parameter observer: Observer to subscribe to events.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control events.\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.events.subscribe(observer)\n    }\n\n    /// - returns: `Observable` interface.\n    public func asObservable() -> Observable<Element> {\n        self.events\n    }\n\n    /// - returns: `ControlEvent` interface.\n    public func asControlEvent() -> ControlEvent<Element> {\n        self\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift",
    "content": "//\n//  ControlProperty.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/// Protocol that enables extension of `ControlProperty`.\npublic protocol ControlPropertyType : ObservableType, ObserverType {\n\n    /// - returns: `ControlProperty` interface\n    func asControlProperty() -> ControlProperty<Element>\n}\n\n/**\n    Trait for `Observable`/`ObservableType` that represents property of UI element.\n \n    Sequence of values only represents initial control value and user initiated value changes.\n    Programmatic value changes won't be reported.\n\n    It's properties are:\n\n    - `shareReplay(1)` behavior\n        - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced\n    - it will `Complete` sequence on control being deallocated\n    - it never errors out\n    - it delivers events on `MainScheduler.instance`\n\n    **The implementation of `ControlProperty` will ensure that sequence of values is being subscribed on main scheduler\n    (`subscribe(on: ConcurrentMainScheduler.instance)` behavior).**\n\n    **It is implementor's responsibility to make sure that that all other properties enumerated above are satisfied.**\n\n    **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.**\n\n    **In case `values` observable sequence that is being passed into initializer doesn't satisfy all enumerated\n    properties, please don't use this trait.**\n*/\npublic struct ControlProperty<PropertyType> : ControlPropertyType {\n    public typealias Element = PropertyType\n\n    let values: Observable<PropertyType>\n    let valueSink: AnyObserver<PropertyType>\n\n    /// Initializes control property with a observable sequence that represents property values and observer that enables\n    /// binding values to property.\n    ///\n    /// - parameter values: Observable sequence that represents property values.\n    /// - parameter valueSink: Observer that enables binding values to control property.\n    /// - returns: Control property created with a observable sequence of values and an observer that enables binding values\n    /// to property.\n    public init<Values: ObservableType, Sink: ObserverType>(values: Values, valueSink: Sink) where Element == Values.Element, Element == Sink.Element {\n        self.values = values.subscribe(on: ConcurrentMainScheduler.instance)\n        self.valueSink = valueSink.asObserver()\n    }\n\n    /// Subscribes an observer to control property values.\n    ///\n    /// - parameter observer: Observer to subscribe to property values.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control property values.\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.values.subscribe(observer)\n    }\n\n    /// `ControlEvent` of user initiated value changes. Every time user updates control value change event\n    /// will be emitted from `changed` event.\n    ///\n    /// Programmatic changes to control value won't be reported.\n    ///\n    /// It contains all control property values except for first one.\n    ///\n    /// The name only implies that sequence element will be generated once user changes a value and not that\n    /// adjacent sequence values need to be different (e.g. because of interaction between programmatic and user updates,\n    /// or for any other reason).\n    public var changed: ControlEvent<PropertyType> {\n        ControlEvent(events: self.values.skip(1))\n    }\n\n    /// - returns: `Observable` interface.\n    public func asObservable() -> Observable<Element> {\n        self.values\n    }\n\n    /// - returns: `ControlProperty` interface.\n    public func asControlProperty() -> ControlProperty<Element> {\n        self\n    }\n\n    /// Binds event to user interface.\n    ///\n    /// - In case next element is received, it is being set to control value.\n    /// - In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output.\n    /// - In case sequence completes, nothing happens.\n    public func on(_ event: Event<Element>) {\n        switch event {\n        case .error(let error):\n            bindingError(error)\n        case .next:\n            self.valueSink.on(event)\n        case .completed:\n            self.valueSink.on(event)\n        }\n    }\n}\n\nextension ControlPropertyType where Element == String? {\n    /// Transforms control property of type `String?` into control property of type `String`.\n    public var orEmpty: ControlProperty<String> {\n        let original: ControlProperty<String?> = self.asControlProperty()\n\n        let values: Observable<String> = original.values.map { $0 ?? \"\" }\n        let valueSink: AnyObserver<String> = original.valueSink.mapObserver { $0 }\n        return ControlProperty<String>(values: values, valueSink: valueSink)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift",
    "content": "//\n//  BehaviorRelay+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/7/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\nimport RxRelay\n\nextension BehaviorRelay {\n    /// Converts `BehaviorRelay` to `Driver`.\n    ///\n    /// - returns: Observable sequence.\n    public func asDriver() -> Driver<Element> {\n        let source = self.asObservable()\n            .observe(on:DriverSharingStrategy.scheduler)\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift",
    "content": "//\n//  ControlEvent+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n    \nextension ControlEvent {\n    /// Converts `ControlEvent` to `Driver` trait.\n    ///\n    /// `ControlEvent` already can't fail, so no special case needs to be handled.\n    public func asDriver() -> Driver<Element> {\n        return self.asDriver { _ -> Driver<Element> in\n            #if DEBUG\n                rxFatalError(\"Somehow driver received error from a source that shouldn't fail.\")\n            #else\n                return Driver.empty()\n            #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift",
    "content": "//\n//  ControlProperty+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ControlProperty {\n    /// Converts `ControlProperty` to `Driver` trait.\n    ///\n    /// `ControlProperty` already can't fail, so no special case needs to be handled.\n    public func asDriver() -> Driver<Element> {\n        return self.asDriver { _ -> Driver<Element> in\n            #if DEBUG\n                rxFatalError(\"Somehow driver received error from a source that shouldn't fail.\")\n            #else\n                return Driver.empty()\n            #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift",
    "content": "//\n//  Driver+Subscription.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\nimport RxRelay\n\nprivate let errorMessage = \"`drive*` family of methods can be only called from `MainThread`.\\n\" +\n\"This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\\n\"\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    /**\n    Creates new subscription and sends elements to observer.\n    This method can be only called from `MainThread`.\n\n    In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n    - parameter observers: Observers that receives events.\n    - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    */\n    public func drive<Observer: ObserverType>(_ observers: Observer...) -> Disposable where Observer.Element == Element {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.asSharedSequence()\n                   .asObservable()\n                   .subscribe { e in\n                    observers.forEach { $0.on(e) }\n                   }\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n     This method can be only called from `MainThread`.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter observers: Observers that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func drive<Observer: ObserverType>(_ observers: Observer...) -> Disposable where Observer.Element == Element? {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.asSharedSequence()\n                   .asObservable()\n                   .map { $0 as Element? }\n                   .subscribe { e in\n                    observers.forEach { $0.on(e) }\n                   }\n    }\n\n    /**\n    Creates new subscription and sends elements to `BehaviorRelay`.\n    This method can be only called from `MainThread`.\n\n    - parameter relays: Target relays for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n    */\n    public func drive(_ relays: BehaviorRelay<Element>...) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.drive(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `BehaviorRelay`.\n     This method can be only called from `MainThread`.\n\n     - parameter relays: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func drive(_ relays: BehaviorRelay<Element?>...) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.drive(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n    Creates new subscription and sends elements to `ReplayRelay`.\n    This method can be only called from `MainThread`.\n\n    - parameter relays: Target relays for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n    */\n    public func drive(_ relays: ReplayRelay<Element>...) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.drive(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `ReplayRelay`.\n     This method can be only called from `MainThread`.\n\n     - parameter relays: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func drive(_ relays: ReplayRelay<Element?>...) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.drive(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function.\n    This method can be only called from `MainThread`.\n\n    - parameter with: Function used to bind elements from `self`.\n    - returns: Object representing subscription.\n    */\n    public func drive<Result>(_ transformation: (Observable<Element>) -> Result) -> Result {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return transformation(self.asObservable())\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n    after `self` is passed.\n\n        public func drive<R1, R2>(with: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n            return with(self)(curriedArgument)\n        }\n\n    This method can be only called from `MainThread`.\n\n    - parameter with: Function used to bind elements from `self`.\n    - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n    - returns: Object representing subscription.\n    */\n    public func drive<R1, R2>(_ with: (Observable<Element>) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return with(self.asObservable())(curriedArgument)\n    }\n    \n    /**\n    Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n    This method can be only called from `MainThread`.\n     \n    Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n    \n    Error callback is not exposed because `Driver` can't error out.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n    - parameter object: The object to provide an unretained reference on.\n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func drive<Object: AnyObject>(\n        with object: Object,\n        onNext: ((Object, Element) -> Void)? = nil,\n        onCompleted: ((Object) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.asObservable().subscribe(with: object, onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)\n    }\n    \n    /**\n    Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n    This method can be only called from `MainThread`.\n    \n    Error callback is not exposed because `Driver` can't error out.\n    \n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func drive(\n        onNext: ((Element) -> Void)? = nil,\n        onCompleted: (() -> Void)? = nil,\n        onDisposed: (() -> Void)? = nil\n    ) -> Disposable {\n        MainScheduler.ensureRunningOnMainThread(errorMessage: errorMessage)\n        return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)\n    }\n\n    /**\n    Subscribes to this `Driver` with a no-op.\n    This method can be only called from `MainThread`.\n\n    - note: This is an alias of `drive(onNext: nil, onCompleted: nil, onDisposed: nil)` used to fix an ambiguity bug in Swift: https://bugs.swift.org/browse/SR-13657\n\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func drive() -> Disposable {\n        drive(onNext: nil, onCompleted: nil, onDisposed: nil)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift",
    "content": "//\n//  Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/**\n Trait that represents observable sequence with following properties:\n\n - it never fails\n - it delivers events on `MainScheduler.instance`\n - `share(replay: 1, scope: .whileConnected)` sharing strategy\n \n Additional explanation:\n - all observers share sequence computation resources\n - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced\n - computation of elements is reference counted with respect to the number of observers\n - if there are no subscribers, it will release sequence computation resources\n\n In case trait that models event bus is required, please check `Signal`.\n\n `Driver<Element>` can be considered a builder pattern for observable sequences that drive the application.\n\n If observable sequence has produced at least one element, after new subscription is made last produced element will be\n immediately replayed on the same thread on which the subscription was made.\n\n When using `drive*`, `subscribe*` and `bind*` family of methods, they should always be called from main thread.\n\n If `drive*`, `subscribe*` and `bind*` are called from background thread, it is possible that initial replay\n will happen on background thread, and subsequent events will arrive on main thread.\n\n To find out more about traits and how to use them, please visit `Documentation/Traits.md`.\n */\npublic typealias Driver<Element> = SharedSequence<DriverSharingStrategy, Element>\n\npublic struct DriverSharingStrategy: SharingStrategyProtocol {\n    public static var scheduler: SchedulerType { SharingScheduler.make() }\n    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {\n        source.share(replay: 1, scope: .whileConnected)\n    }\n}\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    /// Adds `asDriver` to `SharingSequence` with `DriverSharingStrategy`.\n    public func asDriver() -> Driver<Element> {\n        self.asSharedSequence()\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift",
    "content": "//\n//  ObservableConvertibleType+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ObservableConvertibleType {\n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorJustReturn: Element) -> Driver<Element> {\n        let source = self\n            .asObservable()\n            .observe(on:DriverSharingStrategy.scheduler)\n            .catchAndReturn(onErrorJustReturn)\n        return Driver(source)\n    }\n    \n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorDriveWith: Driver<Element>) -> Driver<Element> {\n        let source = self\n            .asObservable()\n            .observe(on:DriverSharingStrategy.scheduler)\n            .catch { _ in\n                onErrorDriveWith.asObservable()\n            }\n        return Driver(source)\n    }\n\n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver<Element>) -> Driver<Element> {\n        let source = self\n            .asObservable()\n            .observe(on:DriverSharingStrategy.scheduler)\n            .catch { error in\n                onErrorRecover(error).asObservable()\n            }\n        return Driver(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift",
    "content": "//\n//  ObservableConvertibleType+SharedSequence.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/1/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ObservableConvertibleType {\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n     - returns: Driving observable sequence.\n     */\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorJustReturn: Element) -> SharedSequence<S, Element> {\n        let source = self\n            .asObservable()\n            .observe(on:S.scheduler)\n            .catchAndReturn(onErrorJustReturn)\n        return SharedSequence(source)\n    }\n\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorDriveWith: SharedSequence that provides elements of the sequence in case of error.\n     - returns: Driving observable sequence.\n     */\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorDriveWith: SharedSequence<S, Element>) -> SharedSequence<S, Element> {\n        let source = self\n            .asObservable()\n            .observe(on:S.scheduler)\n            .catch { _ in\n                onErrorDriveWith.asObservable()\n            }\n        return SharedSequence(source)\n    }\n\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.\n     - returns: Driving observable sequence.\n     */\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorRecover: @escaping (_ error: Swift.Error) -> SharedSequence<S, Element>) -> SharedSequence<S, Element> {\n        let source = self\n            .asObservable()\n            .observe(on:S.scheduler)\n            .catch { error in\n                onErrorRecover(error).asObservable()\n            }\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift",
    "content": "//\n//  SchedulerType+SharedSequence.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/27/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\npublic enum SharingScheduler {\n    /// Default scheduler used in SharedSequence based traits.\n    public private(set) static var make: () -> SchedulerType = { MainScheduler() }\n\n    /**\n     This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead\n     of main schedulers.\n\n     **This shouldn't be used in normal release builds.**\n    */\n    static public func mock(scheduler: SchedulerType, action: () throws -> Void) rethrows {\n        return try mock(makeScheduler: { scheduler }, action: action)\n    }\n\n    /**\n     This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead\n     of main schedulers.\n\n     **This shouldn't be used in normal release builds.**\n     */\n    static public func mock(makeScheduler: @escaping () -> SchedulerType, action: () throws -> Void) rethrows {\n        let originalMake = make\n        make = makeScheduler\n        defer {\n            make = originalMake\n        }\n\n        try action()\n\n        // If you remove this line , compiler buggy optimizations will change behavior of this code\n        _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(makeScheduler)\n        // Scary, I know\n    }\n}\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\nfunc _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: () -> SchedulerType) {\n    let a: Int32 = 1\n#if os(Linux)\n    let b = 314 + Int32(Glibc.random() & 1)\n#else\n    let b = 314 + Int32(arc4random() & 1)\n#endif\n    if a == b {\n        print(scheduler())\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  SharedSequence+Operators+arity.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n\n\n// 2\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.Element, O2.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.Element, O2.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element)>(source)\n    }\n}\n\n\n\n// 3\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.Element, O2.Element, O3.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.Element, O2.Element, O3.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element)>(source)\n    }\n}\n\n\n\n// 4\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element)>(source)\n    }\n}\n\n\n\n// 5\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)>(source)\n    }\n}\n\n\n\n// 6\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)>(source)\n    }\n}\n\n\n\n// 7\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)>(source)\n    }\n}\n\n\n\n// 8\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element) throws -> Element)\n        -> SharedSequence<O1.SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element) throws -> Element)\n        -> SharedSequence<SharingStrategy, Element> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, Element>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> SharedSequence<SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)>(source)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift",
    "content": "//\n//  SharedSequence+Operators.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n// MARK: map\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Projects each element of an observable sequence into a new form.\n    \n    - parameter selector: A transform function to apply to each source element.\n    - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n    */\n    public func map<Result>(_ selector: @escaping (Element) -> Result) -> SharedSequence<SharingStrategy, Result> {\n        let source = self\n            .asObservable()\n            .map(selector)\n        return SharedSequence<SharingStrategy, Result>(source)\n    }\n}\n\n// MARK: compactMap\nextension SharedSequenceConvertibleType {\n    \n    /**\n     Projects each element of an observable sequence into an optional form and filters all optional results.\n     \n     - parameter transform: A transform function to apply to each source element and which returns an element or nil.\n     - returns: An observable sequence whose elements are the result of filtering the transform function for each element of the source.\n     \n     */\n    public func compactMap<Result>(_ selector: @escaping (Element) -> Result?) -> SharedSequence<SharingStrategy, Result> {\n        let source = self\n            .asObservable()\n            .compactMap(selector)\n        return SharedSequence<SharingStrategy, Result>(source)\n    }\n}\n\n// MARK: filter\nextension SharedSequenceConvertibleType {\n    /**\n    Filters the elements of an observable sequence based on a predicate.\n    \n    - parameter predicate: A function to test each source element for a condition.\n    - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n    */\n    public func filter(_ predicate: @escaping (Element) -> Bool) -> SharedSequence<SharingStrategy, Element> {\n        let source = self\n            .asObservable()\n            .filter(predicate)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: switchLatest\nextension SharedSequenceConvertibleType where Element: SharedSequenceConvertibleType {\n    \n    /**\n    Transforms an observable sequence of observable sequences into an observable sequence\n    producing values only from the most recent observable sequence.\n    \n    Each time a new inner observable sequence is received, unsubscribe from the\n    previous inner observable sequence.\n    \n    - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n    */\n    public func switchLatest() -> SharedSequence<Element.SharingStrategy, Element.Element> {\n        let source: Observable<Element.Element> = self\n            .asObservable()\n            .map { $0.asSharedSequence() }\n            .switchLatest()\n        return SharedSequence<Element.SharingStrategy, Element.Element>(source)\n    }\n}\n\n// MARK: flatMapLatest\nextension SharedSequenceConvertibleType {\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<Sharing, Result>(_ selector: @escaping (Element) -> SharedSequence<Sharing, Result>)\n        -> SharedSequence<Sharing, Result> {\n        let source: Observable<Result> = self\n            .asObservable()\n            .flatMapLatest(selector)\n        return SharedSequence<Sharing, Result>(source)\n    }\n}\n\n// MARK: flatMapFirst\nextension SharedSequenceConvertibleType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     If element is received while there is some projected observable sequence being merged it will simply be ignored.\n\n     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.\n     */\n    public func flatMapFirst<Sharing, Result>(_ selector: @escaping (Element) -> SharedSequence<Sharing, Result>)\n        -> SharedSequence<Sharing, Result> {\n        let source: Observable<Result> = self\n            .asObservable()\n            .flatMapFirst(selector)\n        return SharedSequence<Sharing, Result>(source)\n    }\n}\n\n// MARK: do\nextension SharedSequenceConvertibleType {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter afterNext: Action to invoke for each element after the observable has passed an onNext event along to its downstream.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter afterCompleted: Action to invoke after graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((Element) -> Void)? = nil, afterNext: ((Element) -> Void)? = nil, onCompleted: (() -> Void)? = nil, afterCompleted: (() -> Void)? = nil, onSubscribe: (() -> Void)? = nil, onSubscribed: (() -> Void)? = nil, onDispose: (() -> Void)? = nil)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .do(onNext: onNext, afterNext: afterNext, onCompleted: onCompleted, afterCompleted: afterCompleted, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: debug\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Prints received events for all observers on standard output.\n    \n    - parameter identifier: Identifier that is printed together with event description to standard output.\n    - returns: An observable sequence whose events are printed to standard output.\n    */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function) -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: distinctUntilChanged\nextension SharedSequenceConvertibleType where Element: Equatable {\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to equality operator.\n    \n    - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.\n    */\n    public func distinctUntilChanged()\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })\n            \n        return SharedSequence(source)\n    }\n}\n\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.\n    \n    - parameter keySelector: A function to compute the comparison key for each element.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n    */\n    public func distinctUntilChanged<Key: Equatable>(_ keySelector: @escaping (Element) -> Key) -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .distinctUntilChanged(keySelector, comparer: { $0 == $1 })\n        return SharedSequence(source)\n    }\n   \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.\n    \n    - parameter comparer: Equality comparer for computed key values.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.\n    */\n    public func distinctUntilChanged(_ comparer: @escaping (Element, Element) -> Bool) -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .distinctUntilChanged({ $0 }, comparer: comparer)\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n    \n    - parameter keySelector: A function to compute the comparison key for each element.\n    - parameter comparer: Equality comparer for computed key values.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.\n    */\n    public func distinctUntilChanged<K>(_ keySelector: @escaping (Element) -> K, comparer: @escaping (K, K) -> Bool) -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .distinctUntilChanged(keySelector, comparer: comparer)\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\n\n// MARK: flatMap\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n    \n    - parameter selector: A transform function to apply to each element.\n    - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n    */\n    public func flatMap<Sharing, Result>(_ selector: @escaping (Element) -> SharedSequence<Sharing, Result>) -> SharedSequence<Sharing, Result> {\n        let source = self.asObservable()\n            .flatMap(selector)\n        \n        return SharedSequence(source)\n    }\n}\n\n// MARK: merge\nextension SharedSequenceConvertibleType {\n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<Collection: Swift.Collection>(_ sources: Collection) -> SharedSequence<SharingStrategy, Element>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n\n    /**\n     Merges elements from all observable sequences from array into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Array of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: [SharedSequence<SharingStrategy, Element>]) -> SharedSequence<SharingStrategy, Element> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n\n    /**\n     Merges elements from all observable sequences into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: SharedSequence<SharingStrategy, Element>...) -> SharedSequence<SharingStrategy, Element> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n    \n}\n\n// MARK: merge\nextension SharedSequenceConvertibleType where Element: SharedSequenceConvertibleType {\n    /**\n    Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.\n    \n    - returns: The observable sequence that merges the elements of the observable sequences.\n    */\n    public func merge() -> SharedSequence<Element.SharingStrategy, Element.Element> {\n        let source = self.asObservable()\n            .map { $0.asSharedSequence() }\n            .merge()\n        return SharedSequence<Element.SharingStrategy, Element.Element>(source)\n    }\n    \n    /**\n    Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n    \n    - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.\n    - returns: The observable sequence that merges the elements of the inner sequences.\n    */\n    public func merge(maxConcurrent: Int)\n        -> SharedSequence<Element.SharingStrategy, Element.Element> {\n        let source = self.asObservable()\n            .map { $0.asSharedSequence() }\n            .merge(maxConcurrent: maxConcurrent)\n        return SharedSequence<Element.SharingStrategy, Element.Element>(source)\n    }\n}\n\n// MARK: throttle\nextension SharedSequenceConvertibleType {\n    \n    /**\n     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.\n\n     This operator makes sure that no two elements are emitted in less then dueTime.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.\n     - returns: The throttled sequence.\n    */\n    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .throttle(dueTime, latest: latest, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n\n    /**\n    Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.\n    \n    - parameter dueTime: Throttling duration for each element.\n    - returns: The throttled sequence.\n    */\n    public func debounce(_ dueTime: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .debounce(dueTime, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: scan\nextension SharedSequenceConvertibleType {\n    /**\n    Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n    \n    For aggregation behavior with no intermediate results, see `reduce`.\n    \n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: An accumulator function to be invoked on each element.\n    - returns: An observable sequence containing the accumulated values.\n    */\n    public func scan<A>(_ seed: A, accumulator: @escaping (A, Element) -> A)\n        -> SharedSequence<SharingStrategy, A> {\n        let source = self.asObservable()\n            .scan(seed, accumulator: accumulator)\n        return SharedSequence<SharingStrategy, A>(source)\n    }\n}\n\n// MARK: concat\n\nextension SharedSequence {\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Sequence: Swift.Sequence>(_ sequence: Sequence) -> SharedSequence<SharingStrategy, Element>\n        where Sequence.Element == SharedSequence<SharingStrategy, Element> {\n            let source = Observable.concat(sequence.lazy.map { $0.asObservable() })\n            return SharedSequence<SharingStrategy, Element>(source)\n    }\n\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Collection: Swift.Collection>(_ collection: Collection) -> SharedSequence<SharingStrategy, Element>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.concat(collection.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\n// MARK: zip\n\nextension SharedSequence {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func zip<Collection: Swift.Collection, Result>(_ collection: Collection, resultSelector: @escaping ([Element]) throws -> Result) -> SharedSequence<SharingStrategy, Result>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() }, resultSelector: resultSelector)\n        return SharedSequence<SharingStrategy, Result>(source)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence all of the observable sequences have produced an element at a corresponding index.\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func zip<Collection: Swift.Collection>(_ collection: Collection) -> SharedSequence<SharingStrategy, [Element]>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n            let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() })\n            return SharedSequence<SharingStrategy, [Element]>(source)\n    }\n}\n\n// MARK: combineLatest\n\nextension SharedSequence {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func combineLatest<Collection: Swift.Collection, Result>(_ collection: Collection, resultSelector: @escaping ([Element]) throws -> Result) -> SharedSequence<SharingStrategy, Result>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.combineLatest(collection.map { $0.asObservable() }, resultSelector: resultSelector)\n        return SharedSequence<SharingStrategy, Result>(source)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func combineLatest<Collection: Swift.Collection>(_ collection: Collection) -> SharedSequence<SharingStrategy, [Element]>\n        where Collection.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.combineLatest(collection.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, [Element]>(source)\n    }\n}\n\n// MARK: - withUnretained\nextension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {\n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - parameter resultSelector: A function to combine the unretained referenced on `obj` and the value of the observable sequence.\n     - returns: An observable sequence that contains the result of `resultSelector` being called with an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject, Out>(\n        _ obj: Object,\n        resultSelector: @escaping (Object, Element) -> Out\n    ) -> SharedSequence<SharingStrategy, Out> {\n        SharedSequence(self.asObservable().withUnretained(obj, resultSelector: resultSelector))\n    }\n\n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - returns: An observable sequence of tuples that contains both an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject>(_ obj: Object) -> SharedSequence<SharingStrategy, (Object, Element)> {\n        withUnretained(obj) { ($0, $1) }\n    }\n}\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    @available(*, message: \"withUnretained has been deprecated for Driver. Consider using `drive(with:onNext:onCompleted:onDisposed:)`, instead\", unavailable)\n    public func withUnretained<Object: AnyObject, Out>(\n        _ obj: Object,\n        resultSelector: @escaping (Object, Element) -> Out\n    ) -> SharedSequence<SharingStrategy, Out> {\n        SharedSequence(self.asObservable().withUnretained(obj, resultSelector: resultSelector))\n    }\n    \n    @available(*, message: \"withUnretained has been deprecated for Driver. Consider using `drive(with:onNext:onCompleted:onDisposed:)`, instead\", unavailable)\n    public func withUnretained<Object: AnyObject>(_ obj: Object) -> SharedSequence<SharingStrategy, (Object, Element)> {\n        SharedSequence(self.asObservable().withUnretained(obj) { ($0, $1) })\n    }\n}\n\n// MARK: withLatestFrom\nextension SharedSequenceConvertibleType {\n\n    /**\n    Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.\n\n    - parameter second: Second observable source.\n    - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.\n    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n    */\n    public func withLatestFrom<SecondO: SharedSequenceConvertibleType, ResultType>(_ second: SecondO, resultSelector: @escaping (Element, SecondO.Element) -> ResultType) -> SharedSequence<SharingStrategy, ResultType> where SecondO.SharingStrategy == SharingStrategy {\n        let source = self.asObservable()\n            .withLatestFrom(second.asSharedSequence(), resultSelector: resultSelector)\n\n        return SharedSequence<SharingStrategy, ResultType>(source)\n    }\n\n    /**\n    Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element.\n\n    - parameter second: Second observable source.\n    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n    */\n    public func withLatestFrom<SecondO: SharedSequenceConvertibleType>(_ second: SecondO) -> SharedSequence<SharingStrategy, SecondO.Element> {\n        let source = self.asObservable()\n            .withLatestFrom(second.asSharedSequence())\n\n        return SharedSequence<SharingStrategy, SecondO.Element>(source)\n    }\n}\n\n// MARK: skip\nextension SharedSequenceConvertibleType {\n\n    /**\n     Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter count: The number of elements to skip before returning the remaining elements.\n     - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.\n     */\n    public func skip(_ count: Int)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .skip(count)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: startWith\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Prepends a value to an observable sequence.\n\n    - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)\n    \n    - parameter element: Element to prepend to the specified sequence.\n    - returns: The source sequence prepended with the specified values.\n    */\n    public func startWith(_ element: Element)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n                .startWith(element)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: delay\nextension SharedSequenceConvertibleType {\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, Element> {\n        let source = self.asObservable()\n            .delay(dueTime, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift",
    "content": "//\n//  SharedSequence.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/**\n    Trait that represents observable sequence that shares computation resources with following properties:\n\n    - it never fails\n    - it delivers events on `SharingStrategy.scheduler`\n    - sharing strategy is customizable using `SharingStrategy.share` behavior\n\n    `SharedSequence<Element>` can be considered a builder pattern for observable sequences that share computation resources.\n\n    To find out more about units and how to use them, please visit `Documentation/Traits.md`.\n*/\npublic struct SharedSequence<SharingStrategy: SharingStrategyProtocol, Element> : SharedSequenceConvertibleType, ObservableConvertibleType {\n    let source: Observable<Element>\n\n    init(_ source: Observable<Element>) {\n        self.source = SharingStrategy.share(source)\n    }\n\n    init(raw: Observable<Element>) {\n        self.source = raw\n    }\n\n    #if EXPANDABLE_SHARED_SEQUENCE\n    /**\n     This method is extension hook in case this unit needs to extended from outside the library.\n     \n     By defining `EXPANDABLE_SHARED_SEQUENCE` one agrees that it's up to them to ensure shared sequence\n     properties are preserved after extension.\n    */\n    public static func createUnsafe<Source: ObservableType>(source: Source) -> SharedSequence<SharingStrategy, Source.Element> {\n        SharedSequence<SharingStrategy, Source.Element>(raw: source.asObservable())\n    }\n    #endif\n\n    /**\n    - returns: Built observable sequence.\n    */\n    public func asObservable() -> Observable<Element> {\n        self.source\n    }\n\n    /**\n    - returns: `self`\n    */\n    public func asSharedSequence() -> SharedSequence<SharingStrategy, Element> {\n        self\n    }\n}\n\n/**\n Different `SharedSequence` sharing strategies must conform to this protocol.\n */\npublic protocol SharingStrategyProtocol {\n    /**\n     Scheduled on which all sequence events will be delivered.\n    */\n    static var scheduler: SchedulerType { get }\n\n    /**\n     Computation resources sharing strategy for multiple sequence observers.\n     \n     E.g. One can choose `share(replay:scope:)`\n     as sequence event sharing strategies, but also do something more exotic, like\n     implementing promises or lazy loading chains.\n    */\n    static func share<Element>(_ source: Observable<Element>) -> Observable<Element>\n}\n\n/**\nA type that can be converted to `SharedSequence`.\n*/\npublic protocol SharedSequenceConvertibleType : ObservableConvertibleType {\n    associatedtype SharingStrategy: SharingStrategyProtocol\n\n    /**\n    Converts self to `SharedSequence`.\n    */\n    func asSharedSequence() -> SharedSequence<SharingStrategy, Element>\n}\n\nextension SharedSequenceConvertibleType {\n    public func asObservable() -> Observable<Element> {\n        self.asSharedSequence().asObservable()\n    }\n}\n\n\nextension SharedSequence {\n\n    /**\n    Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n    - returns: An observable sequence with no elements.\n    */\n    public static func empty() -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(raw: Observable.empty().subscribe(on: SharingStrategy.scheduler))\n    }\n\n    /**\n    Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n    - returns: An observable sequence whose observers will never get called.\n    */\n    public static func never() -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(raw: Observable.never())\n    }\n\n    /**\n    Returns an observable sequence that contains a single element.\n\n    - parameter element: Single element in the resulting observable sequence.\n    - returns: An observable sequence containing the single specified element.\n    */\n    public static func just(_ element: Element) -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(raw: Observable.just(element).subscribe(on: SharingStrategy.scheduler))\n    }\n\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () -> SharedSequence<SharingStrategy, Element>)\n        -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(Observable.deferred { observableFactory().asObservable() })\n    }\n\n    /**\n    This method creates a new Observable instance with a variable number of elements.\n\n    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n    - parameter elements: Elements to generate.\n    - returns: The observable sequence whose elements are pulled from the given arguments.\n    */\n    public static func of(_ elements: Element ...) -> SharedSequence<SharingStrategy, Element> {\n        let source = Observable.from(elements, scheduler: SharingStrategy.scheduler)\n        return SharedSequence(raw: source)\n    }\n}\n\nextension SharedSequence {\n    \n    /**\n    This method converts an array to an observable sequence.\n     \n    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n    - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from(_ array: [Element]) -> SharedSequence<SharingStrategy, Element> {\n        let source = Observable.from(array, scheduler: SharingStrategy.scheduler)\n        return SharedSequence(raw: source)\n    }\n    \n    /**\n     This method converts a sequence to an observable sequence.\n     \n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n    */\n    public static func from<Sequence: Swift.Sequence>(_ sequence: Sequence) -> SharedSequence<SharingStrategy, Element> where Sequence.Element == Element {\n        let source = Observable.from(sequence, scheduler: SharingStrategy.scheduler)\n        return SharedSequence(raw: source)\n    }\n    \n    /**\n     This method converts a optional to an observable sequence.\n     \n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n     - parameter optional: Optional element in the resulting observable sequence.\n     \n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: Element?) -> SharedSequence<SharingStrategy, Element> {\n        let source = Observable.from(optional: optional, scheduler: SharingStrategy.scheduler)\n        return SharedSequence(raw: source)\n    }\n}\n\nextension SharedSequence where Element: RxAbstractInteger {\n    /**\n     Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.\n\n     - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)\n\n     - parameter period: Period for producing the values in the resulting sequence.\n     - returns: An observable sequence that produces a value after each period.\n     */\n    public static func interval(_ period: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(Observable.interval(period, scheduler: SharingStrategy.scheduler))\n    }\n}\n\n// MARK: timer\n\nextension SharedSequence where Element: RxAbstractInteger {\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter period: Period to produce subsequent values.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, Element> {\n        SharedSequence(Observable.timer(dueTime, period: period, scheduler: SharingStrategy.scheduler))\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/ControlEvent+Signal.swift",
    "content": "//\n//  ControlEvent+Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/1/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ControlEvent {\n    /// Converts `ControlEvent` to `Signal` trait.\n    ///\n    /// `ControlEvent` already can't fail, so no special case needs to be handled.\n    public func asSignal() -> Signal<Element> {\n        return self.asSignal { _ -> Signal<Element> in\n            #if DEBUG\n                rxFatalError(\"Somehow signal received error from a source that shouldn't fail.\")\n            #else\n                return Signal.empty()\n            #endif\n        }\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift",
    "content": "//\n//  ObservableConvertibleType+Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ObservableConvertibleType {\n    /**\n     Converts observable sequence to `Signal` trait.\n\n     - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorJustReturn: Element) -> Signal<Element> {\n        let source = self\n            .asObservable()\n            .observe(on: SignalSharingStrategy.scheduler)\n            .catchAndReturn(onErrorJustReturn)\n        return Signal(source)\n    }\n\n    /**\n     Converts observable sequence to `Signal` trait.\n\n     - parameter onErrorSignalWith: Signal that continues to emit the sequence in case of error.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorSignalWith: Signal<Element>) -> Signal<Element> {\n        let source = self\n            .asObservable()\n            .observe(on: SignalSharingStrategy.scheduler)\n            .catch { _ in\n                onErrorSignalWith.asObservable()\n            }\n        return Signal(source)\n    }\n\n    /**\n     Converts observable sequence to `Signal` trait.\n\n     - parameter onErrorRecover: Calculates signal that continues to emit the sequence in case of error.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorRecover: @escaping (_ error: Swift.Error) -> Signal<Element>) -> Signal<Element> {\n        let source = self\n            .asObservable()\n            .observe(on: SignalSharingStrategy.scheduler)\n            .catch { error in\n                onErrorRecover(error).asObservable()\n            }\n        return Signal(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift",
    "content": "//\n//  PublishRelay+Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 12/28/15.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\nimport RxRelay\n\nextension PublishRelay {\n    /// Converts `PublishRelay` to `Signal`.\n    ///\n    /// - returns: Observable sequence.\n    public func asSignal() -> Signal<Element> {\n        let source = self.asObservable()\n            .observe(on:SignalSharingStrategy.scheduler)\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/Signal+Subscription.swift",
    "content": "//\n//  Signal+Subscription.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\nimport RxRelay\n\nextension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter to: Observers that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func emit<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element {\n        return self.asSharedSequence()\n                   .asObservable()\n                   .subscribe { event in\n                    observers.forEach { $0.on(event) }\n                   }\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter to: Observers that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func emit<Observer: ObserverType>(to observers: Observer...) -> Disposable where Observer.Element == Element? {\n        return self.asSharedSequence()\n                   .asObservable()\n                   .map { $0 as Element? }\n                   .subscribe { event in\n                       observers.forEach { $0.on(event) }\n                   }\n    }\n\n    /**\n     Creates new subscription and sends elements to `BehaviorRelay`.\n     - parameter to: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: BehaviorRelay<Element>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n    \n    /**\n     Creates new subscription and sends elements to `BehaviorRelay`.\n     - parameter to: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: BehaviorRelay<Element?>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n    \n    /**\n     Creates new subscription and sends elements to `PublishRelay`.\n\n     - parameter to: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: PublishRelay<Element>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `PublishRelay`.\n\n     - parameter to: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: PublishRelay<Element?>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `ReplayRelay`.\n\n     - parameter to: Target relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: ReplayRelay<Element>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to `ReplayRelay`.\n\n     - parameter to: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the relay.\n     */\n    public func emit(to relays: ReplayRelay<Element?>...) -> Disposable {\n        return self.emit(onNext: { e in\n            relays.forEach { $0.accept(e) }\n        })\n    }\n    \n    /**\n     Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n\n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n\n     Error callback is not exposed because `Signal` can't error out.\n\n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func emit<Object: AnyObject>(\n        with object: Object,\n        onNext: ((Object, Element) -> Void)? = nil,\n        onCompleted: ((Object) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        self.asObservable().subscribe(\n            with: object,\n            onNext: onNext,\n            onCompleted: onCompleted,\n            onDisposed: onDisposed\n        )\n    }\n\n    /**\n     Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n\n     Error callback is not exposed because `Signal` can't error out.\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func emit(\n        onNext: ((Element) -> Void)? = nil,\n        onCompleted: (() -> Void)? = nil,\n        onDisposed: (() -> Void)? = nil\n    ) -> Disposable {\n        self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)\n    }\n\n    /**\n    Subscribes to this `Signal` with a no-op.\n    This method can be only called from `MainThread`.\n\n    - note: This is an alias of `emit(onNext: nil, onCompleted: nil, onDisposed: nil)` used to fix an ambiguity bug in Swift: https://bugs.swift.org/browse/SR-13657\n\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func emit() -> Disposable {\n        emit(onNext: nil, onCompleted: nil, onDisposed: nil)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift",
    "content": "//\n//  Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/**\n Trait that represents observable sequence with following properties:\n \n - it never fails\n - it delivers events on `MainScheduler.instance`\n - `share(scope: .whileConnected)` sharing strategy\n\n Additional explanation:\n - all observers share sequence computation resources\n - there is no replaying of sequence elements on new observer subscription\n - computation of elements is reference counted with respect to the number of observers\n - if there are no subscribers, it will release sequence computation resources\n\n In case trait that models state propagation is required, please check `Driver`.\n\n `Signal<Element>` can be considered a builder pattern for observable sequences that model imperative events part of the application.\n \n To find out more about units and how to use them, please visit `Documentation/Traits.md`.\n */\npublic typealias Signal<Element> = SharedSequence<SignalSharingStrategy, Element>\n\npublic struct SignalSharingStrategy: SharingStrategyProtocol {\n    public static var scheduler: SchedulerType { SharingScheduler.make() }\n    \n    public static func share<Element>(_ source: Observable<Element>) -> Observable<Element> {\n        source.share(scope: .whileConnected)\n    }\n}\n\nextension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {\n    /// Adds `asPublisher` to `SharingSequence` with `PublishSharingStrategy`.\n    public func asSignal() -> Signal<Element> {\n        self.asSharedSequence()\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift",
    "content": "//\n//  RxCollectionViewReactiveArrayDataSource.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n// objc monkey business\nclass _RxCollectionViewReactiveArrayDataSource\n    : NSObject\n    , UICollectionViewDataSource {\n    \n    @objc(numberOfSectionsInCollectionView:)\n    func numberOfSections(in: UICollectionView) -> Int {\n        1\n    }\n\n    func _collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        0\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        _collectionView(collectionView, numberOfItemsInSection: section)\n    }\n\n    fileprivate func _collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        rxAbstractMethod()\n    }\n\n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        _collectionView(collectionView, cellForItemAt: indexPath)\n    }\n}\n\nclass RxCollectionViewReactiveArrayDataSourceSequenceWrapper<Sequence: Swift.Sequence>\n    : RxCollectionViewReactiveArrayDataSource<Sequence.Element>\n    , RxCollectionViewDataSourceType {\n    typealias Element = Sequence\n\n    override init(cellFactory: @escaping CellFactory) {\n        super.init(cellFactory: cellFactory)\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, observedEvent: Event<Sequence>) {\n        Binder(self) { collectionViewDataSource, sectionModels in\n            let sections = Array(sectionModels)\n            collectionViewDataSource.collectionView(collectionView, observedElements: sections)\n        }.on(observedEvent)\n    }\n}\n\n\n// Please take a look at `DelegateProxyType.swift`\nclass RxCollectionViewReactiveArrayDataSource<Element>\n    : _RxCollectionViewReactiveArrayDataSource\n    , SectionedViewDataSourceType {\n    \n    typealias CellFactory = (UICollectionView, Int, Element) -> UICollectionViewCell\n    \n    var itemModels: [Element]?\n    \n    func modelAtIndex(_ index: Int) -> Element? {\n        itemModels?[index]\n    }\n\n    func model(at indexPath: IndexPath) throws -> Any {\n        precondition(indexPath.section == 0)\n        guard let item = itemModels?[indexPath.item] else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return item\n    }\n    \n    var cellFactory: CellFactory\n    \n    init(cellFactory: @escaping CellFactory) {\n        self.cellFactory = cellFactory\n    }\n    \n    // data source\n    \n    override func _collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        itemModels?.count ?? 0\n    }\n    \n    override func _collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        cellFactory(collectionView, indexPath.item, itemModels![indexPath.item])\n    }\n    \n    // reactive\n    \n    func collectionView(_ collectionView: UICollectionView, observedElements: [Element]) {\n        self.itemModels = observedElements\n        \n        collectionView.reloadData()\n\n        // workaround for http://stackoverflow.com/questions/39867325/ios-10-bug-uicollectionview-received-layout-attributes-for-a-cell-with-an-index\n        collectionView.collectionViewLayout.invalidateLayout()\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxPickerViewAdapter.swift",
    "content": "//\n//  RxPickerViewAdapter.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 12/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nclass RxPickerViewArrayDataSource<T>: NSObject, UIPickerViewDataSource, SectionedViewDataSourceType {\n    fileprivate var items: [T] = []\n    \n    func model(at indexPath: IndexPath) throws -> Any {\n        guard items.indices ~= indexPath.row else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return items[indexPath.row]\n    }\n\n    func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        1\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        items.count\n    }\n}\n\nclass RxPickerViewSequenceDataSource<Sequence: Swift.Sequence>\n    : RxPickerViewArrayDataSource<Sequence.Element>\n    , RxPickerViewDataSourceType {\n    typealias Element = Sequence\n\n    func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Sequence>) {\n        Binder(self) { dataSource, items in\n            dataSource.items = items\n            pickerView.reloadAllComponents()\n        }\n        .on(observedEvent.map(Array.init))\n    }\n}\n\nfinal class RxStringPickerViewAdapter<Sequence: Swift.Sequence>\n    : RxPickerViewSequenceDataSource<Sequence>\n    , UIPickerViewDelegate {\n    \n    typealias TitleForRow = (Int, Sequence.Element) -> String?\n    private let titleForRow: TitleForRow\n    \n    init(titleForRow: @escaping TitleForRow) {\n        self.titleForRow = titleForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {\n        titleForRow(row, items[row])\n    }\n}\n\nfinal class RxAttributedStringPickerViewAdapter<Sequence: Swift.Sequence>: RxPickerViewSequenceDataSource<Sequence>, UIPickerViewDelegate {\n    typealias AttributedTitleForRow = (Int, Sequence.Element) -> NSAttributedString?\n    private let attributedTitleForRow: AttributedTitleForRow\n    \n    init(attributedTitleForRow: @escaping AttributedTitleForRow) {\n        self.attributedTitleForRow = attributedTitleForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {\n        attributedTitleForRow(row, items[row])\n    }\n}\n\nfinal class RxPickerViewAdapter<Sequence: Swift.Sequence>: RxPickerViewSequenceDataSource<Sequence>, UIPickerViewDelegate {\n    typealias ViewForRow = (Int, Sequence.Element, UIView?) -> UIView\n    private let viewForRow: ViewForRow\n    \n    init(viewForRow: @escaping ViewForRow) {\n        self.viewForRow = viewForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {\n        viewForRow(row, items[row], view)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift",
    "content": "//\n//  RxTableViewReactiveArrayDataSource.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/26/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n// objc monkey business\nclass _RxTableViewReactiveArrayDataSource\n    : NSObject\n    , UITableViewDataSource {\n    \n    func numberOfSections(in tableView: UITableView) -> Int {\n        1\n    }\n   \n    func _tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        0\n    }\n    \n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        _tableView(tableView, numberOfRowsInSection: section)\n    }\n\n    fileprivate func _tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        rxAbstractMethod()\n    }\n\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        _tableView(tableView, cellForRowAt: indexPath)\n    }\n}\n\n\nclass RxTableViewReactiveArrayDataSourceSequenceWrapper<Sequence: Swift.Sequence>\n    : RxTableViewReactiveArrayDataSource<Sequence.Element>\n    , RxTableViewDataSourceType {\n    typealias Element = Sequence\n\n    override init(cellFactory: @escaping CellFactory) {\n        super.init(cellFactory: cellFactory)\n    }\n\n    func tableView(_ tableView: UITableView, observedEvent: Event<Sequence>) {\n        Binder(self) { tableViewDataSource, sectionModels in\n            let sections = Array(sectionModels)\n            tableViewDataSource.tableView(tableView, observedElements: sections)\n        }.on(observedEvent)\n    }\n}\n\n// Please take a look at `DelegateProxyType.swift`\nclass RxTableViewReactiveArrayDataSource<Element>\n    : _RxTableViewReactiveArrayDataSource\n    , SectionedViewDataSourceType {\n    typealias CellFactory = (UITableView, Int, Element) -> UITableViewCell\n    \n    var itemModels: [Element]?\n    \n    func modelAtIndex(_ index: Int) -> Element? {\n        itemModels?[index]\n    }\n\n    func model(at indexPath: IndexPath) throws -> Any {\n        precondition(indexPath.section == 0)\n        guard let item = itemModels?[indexPath.item] else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return item\n    }\n\n    let cellFactory: CellFactory\n    \n    init(cellFactory: @escaping CellFactory) {\n        self.cellFactory = cellFactory\n    }\n    \n    override func _tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        itemModels?.count ?? 0\n    }\n    \n    override func _tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        cellFactory(tableView, indexPath.item, itemModels![indexPath.row])\n    }\n    \n    // reactive\n    \n    func tableView(_ tableView: UITableView, observedElements: [Element]) {\n        self.itemModels = observedElements\n        \n        tableView.reloadData()\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift",
    "content": "//\n//  ItemEvents.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\npublic typealias ItemMovedEvent = (sourceIndex: IndexPath, destinationIndex: IndexPath)\npublic typealias WillDisplayCellEvent = (cell: UITableViewCell, indexPath: IndexPath)\npublic typealias DidEndDisplayingCellEvent = (cell: UITableViewCell, indexPath: IndexPath)\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift",
    "content": "//\n//  NSTextStorage+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 12/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    import RxSwift\n    import UIKit\n    \n    extension Reactive where Base: NSTextStorage {\n\n        /// Reactive wrapper for `delegate`.\n        ///\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<NSTextStorage, NSTextStorageDelegate> {\n            return RxTextStorageDelegateProxy.proxy(for: base)\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didProcessEditingRangeChangeInLength: Observable<(editedMask: NSTextStorage.EditActions, editedRange: NSRange, delta: Int)> {\n            return delegate\n                .methodInvoked(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:)))\n                .map { a in\n                    let editedMask = NSTextStorage.EditActions(rawValue: try castOrThrow(UInt.self, a[1]) )\n                    let editedRange = try castOrThrow(NSValue.self, a[2]).rangeValue\n                    let delta = try castOrThrow(Int.self, a[3])\n                    \n                    return (editedMask, editedRange, delta)\n                }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift",
    "content": "//\n//  RxCollectionViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/// Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxCollectionViewDataSourceType /*: UICollectionViewDataSource*/ {\n    \n    /// Type of elements that can be bound to collection view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter collectionView: Bound collection view.\n    /// - parameter observedEvent: Event\n    func collectionView(_ collectionView: UICollectionView, observedEvent: Event<Element>)\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxPickerViewDataSourceType.swift",
    "content": "//\n//  RxPickerViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 05/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \nimport UIKit\nimport RxSwift\n\n/// Marks data source as `UIPickerView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxPickerViewDataSourceType {\n    /// Type of elements that can be bound to picker view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter pickerView: Bound picker view.\n    /// - parameter observedEvent: Event\n    func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>)\n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift",
    "content": "//\n//  RxTableViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/26/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/// Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxTableViewDataSourceType /*: UITableViewDataSource*/ {\n    \n    /// Type of elements that can be bound to table view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter tableView: Bound table view.\n    /// - parameter observedEvent: Event\n    func tableView(_ tableView: UITableView, observedEvent: Event<Element>)\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourcePrefetchingProxy.swift",
    "content": "//\n//  RxCollectionViewDataSourcePrefetchingProxy.swift\n//  RxCocoa\n//\n//  Created by Rowan Livingstone on 2/15/18.\n//  Copyright © 2018 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n@available(iOS 10.0, tvOS 10.0, *)\nextension UICollectionView: HasPrefetchDataSource {\n    public typealias PrefetchDataSource = UICollectionViewDataSourcePrefetching\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nprivate let collectionViewPrefetchDataSourceNotSet = CollectionViewPrefetchDataSourceNotSet()\n\n@available(iOS 10.0, tvOS 10.0, *)\nprivate final class CollectionViewPrefetchDataSourceNotSet\n    : NSObject\n    , UICollectionViewDataSourcePrefetching {\n\n    func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {}\n\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nopen class RxCollectionViewDataSourcePrefetchingProxy\n    : DelegateProxy<UICollectionView, UICollectionViewDataSourcePrefetching>\n    , DelegateProxyType\n    , UICollectionViewDataSourcePrefetching {\n\n    /// Typed parent object.\n    public weak private(set) var collectionView: UICollectionView?\n\n    /// - parameter collectionView: Parent object for delegate proxy.\n    public init(collectionView: ParentObject) {\n        self.collectionView = collectionView\n        super.init(parentObject: collectionView, delegateProxy: RxCollectionViewDataSourcePrefetchingProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxCollectionViewDataSourcePrefetchingProxy(collectionView: $0) }\n    }\n\n    private var _prefetchItemsPublishSubject: PublishSubject<[IndexPath]>?\n\n    /// Optimized version used for observing prefetch items callbacks.\n    internal var prefetchItemsPublishSubject: PublishSubject<[IndexPath]> {\n        if let subject = _prefetchItemsPublishSubject {\n            return subject\n        }\n\n        let subject = PublishSubject<[IndexPath]>()\n        _prefetchItemsPublishSubject = subject\n\n        return subject\n    }\n\n    private weak var _requiredMethodsPrefetchDataSource: UICollectionViewDataSourcePrefetching? = collectionViewPrefetchDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {\n        if let subject = _prefetchItemsPublishSubject {\n            subject.on(.next(indexPaths))\n        }\n\n        (_requiredMethodsPrefetchDataSource ?? collectionViewPrefetchDataSourceNotSet).collectionView(collectionView, prefetchItemsAt: indexPaths)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UICollectionViewDataSourcePrefetching?, retainDelegate: Bool) {\n        _requiredMethodsPrefetchDataSource = forwardToDelegate ?? collectionViewPrefetchDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n\n    deinit {\n        if let subject = _prefetchItemsPublishSubject {\n            subject.on(.completed)\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift",
    "content": "//\n//  RxCollectionViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension UICollectionView: HasDataSource {\n    public typealias DataSource = UICollectionViewDataSource\n}\n\nprivate let collectionViewDataSourceNotSet = CollectionViewDataSourceNotSet()\n\nprivate final class CollectionViewDataSourceNotSet\n    : NSObject\n    , UICollectionViewDataSource {\n\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        0\n    }\n    \n    // The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:\n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        rxAbstractMethod(message: dataSourceNotSet)\n    }\n    \n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxCollectionViewDataSourceProxy\n    : DelegateProxy<UICollectionView, UICollectionViewDataSource>\n    , DelegateProxyType \n    , UICollectionViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var collectionView: UICollectionView?\n\n    /// - parameter collectionView: Parent object for delegate proxy.\n    public init(collectionView: ParentObject) {\n        self.collectionView = collectionView\n        super.init(parentObject: collectionView, delegateProxy: RxCollectionViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxCollectionViewDataSourceProxy(collectionView: $0) }\n    }\n\n    private weak var _requiredMethodsDataSource: UICollectionViewDataSource? = collectionViewDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, numberOfItemsInSection: section)\n    }\n    \n    /// Required delegate method implementation.\n    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, cellForItemAt: indexPath)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UICollectionViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate ?? collectionViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift",
    "content": "//\n//  RxCollectionViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxCollectionViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UICollectionViewDelegate\n    , UICollectionViewDelegateFlowLayout {\n\n    /// Typed parent object.\n    public weak private(set) var collectionView: UICollectionView?\n\n    /// Initializes `RxCollectionViewDelegateProxy`\n    ///\n    /// - parameter collectionView: Parent object for delegate proxy.\n    public init(collectionView: UICollectionView) {\n        self.collectionView = collectionView\n        super.init(scrollView: collectionView)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxNavigationControllerDelegateProxy.swift",
    "content": "//\n//  RxNavigationControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Diogo on 13/04/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n    import UIKit\n    import RxSwift\n\n    extension UINavigationController: HasDelegate {\n        public typealias Delegate = UINavigationControllerDelegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class RxNavigationControllerDelegateProxy\n        : DelegateProxy<UINavigationController, UINavigationControllerDelegate>\n        , DelegateProxyType \n        , UINavigationControllerDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var navigationController: UINavigationController?\n\n        /// - parameter navigationController: Parent object for delegate proxy.\n        public init(navigationController: ParentObject) {\n            self.navigationController = navigationController\n            super.init(parentObject: navigationController, delegateProxy: RxNavigationControllerDelegateProxy.self)\n        }\n\n        // Register known implementations\n        public static func registerKnownImplementations() {\n            self.register { RxNavigationControllerDelegateProxy(navigationController: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDataSourceProxy.swift",
    "content": "//\n//  RxPickerViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 05/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nextension UIPickerView: HasDataSource {\n    public typealias DataSource = UIPickerViewDataSource\n}\n\nprivate let pickerViewDataSourceNotSet = PickerViewDataSourceNotSet()\n\nfinal private class PickerViewDataSourceNotSet: NSObject, UIPickerViewDataSource {\n    func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        0\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        0\n    }\n}\n\n/// For more information take a look at `DelegateProxyType`.\npublic class RxPickerViewDataSourceProxy\n    : DelegateProxy<UIPickerView, UIPickerViewDataSource>\n    , DelegateProxyType\n    , UIPickerViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var pickerView: UIPickerView?\n\n    /// - parameter pickerView: Parent object for delegate proxy.\n    public init(pickerView: ParentObject) {\n        self.pickerView = pickerView\n        super.init(parentObject: pickerView, delegateProxy: RxPickerViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxPickerViewDataSourceProxy(pickerView: $0) }\n    }\n\n    private weak var _requiredMethodsDataSource: UIPickerViewDataSource? = pickerViewDataSourceNotSet\n\n    // MARK: UIPickerViewDataSource\n\n    /// Required delegate method implementation.\n    public func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        (_requiredMethodsDataSource ?? pickerViewDataSourceNotSet).numberOfComponents(in: pickerView)\n    }\n\n    /// Required delegate method implementation.\n    public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        (_requiredMethodsDataSource ?? pickerViewDataSourceNotSet).pickerView(pickerView, numberOfRowsInComponent: component)\n    }\n    \n    /// For more information take a look at `DelegateProxyType`.\n    public override func setForwardToDelegate(_ forwardToDelegate: UIPickerViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate ?? pickerViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift",
    "content": "//\n//  RxPickerViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n    import RxSwift\n    import UIKit\n\n    extension UIPickerView: HasDelegate {\n        public typealias Delegate = UIPickerViewDelegate\n    }\n\n    open class RxPickerViewDelegateProxy\n        : DelegateProxy<UIPickerView, UIPickerViewDelegate>\n        , DelegateProxyType \n        , UIPickerViewDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var pickerView: UIPickerView?\n\n        /// - parameter pickerView: Parent object for delegate proxy.\n        public init(pickerView: ParentObject) {\n            self.pickerView = pickerView\n            super.init(parentObject: pickerView, delegateProxy: RxPickerViewDelegateProxy.self)\n        }\n\n        // Register known implementationss\n        public static func registerKnownImplementations() {\n            self.register { RxPickerViewDelegateProxy(pickerView: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift",
    "content": "//\n//  RxScrollViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n    \nextension UIScrollView: HasDelegate {\n    public typealias Delegate = UIScrollViewDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxScrollViewDelegateProxy\n    : DelegateProxy<UIScrollView, UIScrollViewDelegate>\n    , DelegateProxyType \n    , UIScrollViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var scrollView: UIScrollView?\n\n    /// - parameter scrollView: Parent object for delegate proxy.\n    public init(scrollView: ParentObject) {\n        self.scrollView = scrollView\n        super.init(parentObject: scrollView, delegateProxy: RxScrollViewDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxScrollViewDelegateProxy(scrollView: $0) }\n        self.register { RxTableViewDelegateProxy(tableView: $0) }\n        self.register { RxCollectionViewDelegateProxy(collectionView: $0) }\n        self.register { RxTextViewDelegateProxy(textView: $0) }\n    }\n\n    private var _contentOffsetBehaviorSubject: BehaviorSubject<CGPoint>?\n    private var _contentOffsetPublishSubject: PublishSubject<()>?\n\n    /// Optimized version used for observing content offset changes.\n    internal var contentOffsetBehaviorSubject: BehaviorSubject<CGPoint> {\n        if let subject = _contentOffsetBehaviorSubject {\n            return subject\n        }\n\n        let subject = BehaviorSubject<CGPoint>(value: self.scrollView?.contentOffset ?? CGPoint.zero)\n        _contentOffsetBehaviorSubject = subject\n\n        return subject\n    }\n\n    /// Optimized version used for observing content offset changes.\n    internal var contentOffsetPublishSubject: PublishSubject<()> {\n        if let subject = _contentOffsetPublishSubject {\n            return subject\n        }\n\n        let subject = PublishSubject<()>()\n        _contentOffsetPublishSubject = subject\n\n        return subject\n    }\n    \n    // MARK: delegate methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    public func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        if let subject = _contentOffsetBehaviorSubject {\n            subject.on(.next(scrollView.contentOffset))\n        }\n        if let subject = _contentOffsetPublishSubject {\n            subject.on(.next(()))\n        }\n        self._forwardToDelegate?.scrollViewDidScroll?(scrollView)\n    }\n    \n    deinit {\n        if let subject = _contentOffsetBehaviorSubject {\n            subject.on(.completed)\n        }\n\n        if let subject = _contentOffsetPublishSubject {\n            subject.on(.completed)\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift",
    "content": "//\n//  RxSearchBarDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension UISearchBar: HasDelegate {\n    public typealias Delegate = UISearchBarDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxSearchBarDelegateProxy\n    : DelegateProxy<UISearchBar, UISearchBarDelegate>\n    , DelegateProxyType \n    , UISearchBarDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var searchBar: UISearchBar?\n\n    /// - parameter searchBar: Parent object for delegate proxy.\n    public init(searchBar: ParentObject) {\n        self.searchBar = searchBar\n        super.init(parentObject: searchBar, delegateProxy: RxSearchBarDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxSearchBarDelegateProxy(searchBar: $0) }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift",
    "content": "//\n//  RxSearchControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 3/17/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport RxSwift\nimport UIKit\n\nextension UISearchController: HasDelegate {\n    public typealias Delegate = UISearchControllerDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxSearchControllerDelegateProxy\n    : DelegateProxy<UISearchController, UISearchControllerDelegate>\n    , DelegateProxyType \n    , UISearchControllerDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var searchController: UISearchController?\n\n    /// - parameter searchController: Parent object for delegate proxy.\n    public init(searchController: UISearchController) {\n        self.searchController = searchController\n        super.init(parentObject: searchController, delegateProxy: RxSearchControllerDelegateProxy.self)\n    }\n    \n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxSearchControllerDelegateProxy(searchController: $0) }\n    }\n}\n   \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift",
    "content": "//\n//  RxTabBarControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Yusuke Kita on 2016/12/07.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension UITabBarController: HasDelegate {\n    public typealias Delegate = UITabBarControllerDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTabBarControllerDelegateProxy\n    : DelegateProxy<UITabBarController, UITabBarControllerDelegate>\n    , DelegateProxyType \n    , UITabBarControllerDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tabBar: UITabBarController?\n\n    /// - parameter tabBar: Parent object for delegate proxy.\n    public init(tabBar: ParentObject) {\n        self.tabBar = tabBar\n        super.init(parentObject: tabBar, delegateProxy: RxTabBarControllerDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTabBarControllerDelegateProxy(tabBar: $0) }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift",
    "content": "//\n//  RxTabBarDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Jesse Farless on 5/14/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension UITabBar: HasDelegate {\n    public typealias Delegate = UITabBarDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTabBarDelegateProxy\n    : DelegateProxy<UITabBar, UITabBarDelegate>\n    , DelegateProxyType \n    , UITabBarDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tabBar: UITabBar?\n\n    /// - parameter tabBar: Parent object for delegate proxy.\n    public init(tabBar: ParentObject) {\n        self.tabBar = tabBar\n        super.init(parentObject: tabBar, delegateProxy: RxTabBarDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTabBarDelegateProxy(tabBar: $0) }\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func currentDelegate(for object: ParentObject) -> UITabBarDelegate? {\n        object.delegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func setCurrentDelegate(_ delegate: UITabBarDelegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourcePrefetchingProxy.swift",
    "content": "//\n//  RxTableViewDataSourcePrefetchingProxy.swift\n//  RxCocoa\n//\n//  Created by Rowan Livingstone on 2/15/18.\n//  Copyright © 2018 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n@available(iOS 10.0, tvOS 10.0, *)\nextension UITableView: HasPrefetchDataSource {\n    public typealias PrefetchDataSource = UITableViewDataSourcePrefetching\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nprivate let tableViewPrefetchDataSourceNotSet = TableViewPrefetchDataSourceNotSet()\n\n@available(iOS 10.0, tvOS 10.0, *)\nprivate final class TableViewPrefetchDataSourceNotSet\n    : NSObject\n    , UITableViewDataSourcePrefetching {\n\n    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {}\n\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nopen class RxTableViewDataSourcePrefetchingProxy\n    : DelegateProxy<UITableView, UITableViewDataSourcePrefetching>\n    , DelegateProxyType\n    , UITableViewDataSourcePrefetching {\n\n    /// Typed parent object.\n    public weak private(set) var tableView: UITableView?\n\n    /// - parameter tableView: Parent object for delegate proxy.\n    public init(tableView: ParentObject) {\n        self.tableView = tableView\n        super.init(parentObject: tableView, delegateProxy: RxTableViewDataSourcePrefetchingProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTableViewDataSourcePrefetchingProxy(tableView: $0) }\n    }\n\n    private var _prefetchRowsPublishSubject: PublishSubject<[IndexPath]>?\n\n    /// Optimized version used for observing prefetch rows callbacks.\n    internal var prefetchRowsPublishSubject: PublishSubject<[IndexPath]> {\n        if let subject = _prefetchRowsPublishSubject {\n            return subject\n        }\n\n        let subject = PublishSubject<[IndexPath]>()\n        _prefetchRowsPublishSubject = subject\n\n        return subject\n    }\n\n    private weak var _requiredMethodsPrefetchDataSource: UITableViewDataSourcePrefetching? = tableViewPrefetchDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {\n        if let subject = _prefetchRowsPublishSubject {\n            subject.on(.next(indexPaths))\n        }\n\n        (_requiredMethodsPrefetchDataSource ?? tableViewPrefetchDataSourceNotSet).tableView(tableView, prefetchRowsAt: indexPaths)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UITableViewDataSourcePrefetching?, retainDelegate: Bool) {\n        _requiredMethodsPrefetchDataSource = forwardToDelegate ?? tableViewPrefetchDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n\n    deinit {\n        if let subject = _prefetchRowsPublishSubject {\n            subject.on(.completed)\n        }\n    }\n\n}\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift",
    "content": "//\n//  RxTableViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n    \nextension UITableView: HasDataSource {\n    public typealias DataSource = UITableViewDataSource\n}\n\nprivate let tableViewDataSourceNotSet = TableViewDataSourceNotSet()\n\nprivate final class TableViewDataSourceNotSet\n    : NSObject\n    , UITableViewDataSource {\n\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        0\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        rxAbstractMethod(message: dataSourceNotSet)\n    }\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTableViewDataSourceProxy\n    : DelegateProxy<UITableView, UITableViewDataSource>\n    , DelegateProxyType \n    , UITableViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var tableView: UITableView?\n\n    /// - parameter tableView: Parent object for delegate proxy.\n    public init(tableView: UITableView) {\n        self.tableView = tableView\n        super.init(parentObject: tableView, delegateProxy: RxTableViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTableViewDataSourceProxy(tableView: $0) }\n    }\n\n    private weak var _requiredMethodsDataSource: UITableViewDataSource? = tableViewDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, numberOfRowsInSection: section)\n    }\n\n    /// Required delegate method implementation.\n    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, cellForRowAt: indexPath)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UITableViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate  ?? tableViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift",
    "content": "//\n//  RxTableViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTableViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UITableViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tableView: UITableView?\n\n    /// - parameter tableView: Parent object for delegate proxy.\n    public init(tableView: UITableView) {\n        self.tableView = tableView\n        super.init(scrollView: tableView)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift",
    "content": "//\n//  RxTextStorageDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 12/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n    import RxSwift\n    import UIKit\n\n    extension NSTextStorage: HasDelegate {\n        public typealias Delegate = NSTextStorageDelegate\n    }\n\n    open class RxTextStorageDelegateProxy\n        : DelegateProxy<NSTextStorage, NSTextStorageDelegate>\n        , DelegateProxyType \n        , NSTextStorageDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var textStorage: NSTextStorage?\n\n        /// - parameter textStorage: Parent object for delegate proxy.\n        public init(textStorage: NSTextStorage) {\n            self.textStorage = textStorage\n            super.init(parentObject: textStorage, delegateProxy: RxTextStorageDelegateProxy.self)\n        }\n\n        // Register known implementations\n        public static func registerKnownImplementations() {\n            self.register { RxTextStorageDelegateProxy(textStorage: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift",
    "content": "//\n//  RxTextViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 7/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTextViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UITextViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var textView: UITextView?\n\n    /// - parameter textview: Parent object for delegate proxy.\n    public init(textView: UITextView) {\n        self.textView = textView\n        super.init(scrollView: textView)\n    }\n\n    // MARK: delegate methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    @objc open func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {\n        /**\n         We've had some issues with observing text changes. This is here just in case we need the same hack in future and that \n         we wouldn't need to change the public interface.\n        */\n        let forwardToDelegate = self.forwardToDelegate() as? UITextViewDelegate\n        return forwardToDelegate?.textView?(textView,\n            shouldChangeTextIn: range,\n            replacementText: text) ?? true\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxWKNavigationDelegateProxy.swift",
    "content": "//\n//  RxWKNavigationDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Giuseppe Lanza on 14/02/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(macOS)\n\nimport RxSwift\nimport WebKit\n\n@available(iOS 8.0, OSX 10.10, OSXApplicationExtension 10.10, *)\nopen class RxWKNavigationDelegateProxy\n    : DelegateProxy<WKWebView, WKNavigationDelegate>\n    , DelegateProxyType\n, WKNavigationDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var webView: WKWebView?\n\n    /// - parameter webView: Parent object for delegate proxy.\n    public init(webView: ParentObject) {\n        self.webView = webView\n        super.init(parentObject: webView, delegateProxy: RxWKNavigationDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxWKNavigationDelegateProxy(webView: $0) }\n    }\n    \n    public static func currentDelegate(for object: WKWebView) -> WKNavigationDelegate? {\n        object.navigationDelegate\n    }\n    \n    public static func setCurrentDelegate(_ delegate: WKNavigationDelegate?, to object: WKWebView) {\n        object.navigationDelegate = delegate\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift",
    "content": "//\n//  UIActivityIndicatorView+Rx.swift\n//  RxCocoa\n//\n//  Created by Ivan Persidskiy on 02/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UIActivityIndicatorView {\n    /// Bindable sink for `startAnimating()`, `stopAnimating()` methods.\n    public var isAnimating: Binder<Bool> {\n        Binder(self.base) { activityIndicator, active in\n            if active {\n                activityIndicator.startAnimating()\n            } else {\n                activityIndicator.stopAnimating()\n            }\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift",
    "content": "//\n//  UIApplication+Rx.swift\n//  RxCocoa\n//\n//  Created by Mads Bøgeskov on 18/01/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UIApplication {\n    /// Bindable sink for `isNetworkActivityIndicatorVisible`.\n    public var isNetworkActivityIndicatorVisible: Binder<Bool> {\n        return Binder(self.base) { application, active in\n            application.isNetworkActivityIndicatorVisible = active\n        }\n    }\n    \n    /// Reactive wrapper for `UIApplication.didEnterBackgroundNotification`\n    public static var didEnterBackground: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.didEnterBackgroundNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.willEnterForegroundNotification`\n    public static var willEnterForeground: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.didFinishLaunchingNotification`\n    public static var didFinishLaunching: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.didFinishLaunchingNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.didBecomeActiveNotification`\n    public static var didBecomeActive: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.didBecomeActiveNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.willResignActiveNotification`\n    public static var willResignActive: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.willResignActiveNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.didReceiveMemoryWarningNotification`\n    public static var didReceiveMemoryWarning: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.didReceiveMemoryWarningNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.willTerminateNotification`\n    public static var willTerminate: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.willTerminateNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.significantTimeChangeNotification`\n    public static var significantTimeChange: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.significantTimeChangeNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.backgroundRefreshStatusDidChangeNotification`\n    public static var backgroundRefreshStatusDidChange: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.backgroundRefreshStatusDidChangeNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.protectedDataWillBecomeUnavailableNotification`\n    public static var protectedDataWillBecomeUnavailable: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.protectedDataWillBecomeUnavailableNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.protectedDataDidBecomeAvailableNotification`\n    public static var protectedDataDidBecomeAvailable: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.protectedDataDidBecomeAvailableNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `UIApplication.userDidTakeScreenshotNotification`\n    public static var userDidTakeScreenshot: ControlEvent<Void> {\n        let source = NotificationCenter.default.rx.notification(UIApplication.userDidTakeScreenshotNotification).map { _ in }\n        \n        return ControlEvent(events: source)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift",
    "content": "//\n//  UIBarButtonItem+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nprivate var rx_tap_key: UInt8 = 0\n\nextension Reactive where Base: UIBarButtonItem {\n    /// Reactive wrapper for target action pattern on `self`.\n    public var tap: ControlEvent<()> {\n        let source = lazyInstanceObservable(&rx_tap_key) { () -> Observable<()> in\n            Observable.create { [weak control = self.base] observer in\n                guard let control = control else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n                let target = BarButtonItemTarget(barButtonItem: control) {\n                    observer.on(.next(()))\n                }\n                return target\n            }\n            .take(until: self.deallocated)\n            .share()\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n\n\n@objc\nfinal class BarButtonItemTarget: RxTarget {\n    typealias Callback = () -> Void\n    \n    weak var barButtonItem: UIBarButtonItem?\n    var callback: Callback!\n    \n    init(barButtonItem: UIBarButtonItem, callback: @escaping () -> Void) {\n        self.barButtonItem = barButtonItem\n        self.callback = callback\n        super.init()\n        barButtonItem.target = self\n        barButtonItem.action = #selector(BarButtonItemTarget.action(_:))\n    }\n    \n    override func dispose() {\n        super.dispose()\n#if DEBUG\n        MainScheduler.ensureRunningOnMainThread()\n#endif\n        \n        barButtonItem?.target = nil\n        barButtonItem?.action = nil\n        \n        callback = nil\n    }\n    \n    @objc func action(_ sender: AnyObject) {\n        callback()\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift",
    "content": "//\n//  UIButton+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UIButton {\n    \n    /// Reactive wrapper for `TouchUpInside` control event.\n    public var tap: ControlEvent<Void> {\n        controlEvent(.touchUpInside)\n    }\n}\n\n#endif\n\n#if os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UIButton {\n\n    /// Reactive wrapper for `PrimaryActionTriggered` control event.\n    public var primaryAction: ControlEvent<Void> {\n        controlEvent(.primaryActionTriggered)\n    }\n\n}\n\n#endif\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UIButton {\n    /// Reactive wrapper for `setTitle(_:for:)`\n    public func title(for controlState: UIControl.State = []) -> Binder<String?> {\n        Binder(self.base) { button, title in\n            button.setTitle(title, for: controlState)\n        }\n    }\n\n    /// Reactive wrapper for `setImage(_:for:)`\n    public func image(for controlState: UIControl.State = []) -> Binder<UIImage?> {\n        Binder(self.base) { button, image in\n            button.setImage(image, for: controlState)\n        }\n    }\n\n    /// Reactive wrapper for `setBackgroundImage(_:for:)`\n    public func backgroundImage(for controlState: UIControl.State = []) -> Binder<UIImage?> {\n        Binder(self.base) { button, image in\n            button.setBackgroundImage(image, for: controlState)\n        }\n    }\n    \n}\n#endif\n\n#if os(iOS) || os(tvOS)\n    import RxSwift\n    import UIKit\n    \n    extension Reactive where Base: UIButton {\n        /// Reactive wrapper for `setAttributedTitle(_:controlState:)`\n        public func attributedTitle(for controlState: UIControl.State = []) -> Binder<NSAttributedString?> {\n            return Binder(self.base) { button, attributedTitle -> Void in\n                button.setAttributedTitle(attributedTitle, for: controlState)\n            }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift",
    "content": "//\n//  UICollectionView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\n// Items\n\nextension Reactive where Base: UICollectionView {\n\n    /**\n    Binds sequences of elements to collection view items.\n    \n    - parameter source: Observable sequence of items.\n    - parameter cellFactory: Transform between sequence elements and view cells.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n    \n         let items = Observable.just([\n             1,\n             2,\n             3\n         ])\n\n         items\n         .bind(to: collectionView.rx.items) { (collectionView, row, element) in\n            let indexPath = IndexPath(row: row, section: 0)\n            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: \"Cell\", for: indexPath) as! NumberCell\n             cell.value?.text = \"\\(element) @ \\(row)\"\n             return cell\n         }\n         .disposed(by: disposeBag)\n    */\n    public func items<Sequence: Swift.Sequence, Source: ObservableType>\n        (_ source: Source)\n        -> (_ cellFactory: @escaping (UICollectionView, Int, Sequence.Element) -> UICollectionViewCell)\n        -> Disposable where Source.Element == Sequence {\n        return { cellFactory in\n            let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<Sequence>(cellFactory: cellFactory)\n            return self.items(dataSource: dataSource)(source)\n        }\n        \n    }\n    \n    /**\n    Binds sequences of elements to collection view items.\n    \n    - parameter cellIdentifier: Identifier used to dequeue cells.\n    - parameter source: Observable sequence of items.\n    - parameter configureCell: Transform between sequence elements and view cells.\n    - parameter cellType: Type of collection view cell.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n\n         let items = Observable.just([\n             1,\n             2,\n             3\n         ])\n\n         items\n             .bind(to: collectionView.rx.items(cellIdentifier: \"Cell\", cellType: NumberCell.self)) { (row, element, cell) in\n                cell.value?.text = \"\\(element) @ \\(row)\"\n             }\n             .disposed(by: disposeBag)\n    */\n    public func items<Sequence: Swift.Sequence, Cell: UICollectionViewCell, Source: ObservableType>\n        (cellIdentifier: String, cellType: Cell.Type = Cell.self)\n        -> (_ source: Source)\n        -> (_ configureCell: @escaping (Int, Sequence.Element, Cell) -> Void)\n        -> Disposable where Source.Element == Sequence {\n        return { source in\n            return { configureCell in\n                let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<Sequence> { cv, i, item in\n                    let indexPath = IndexPath(item: i, section: 0)\n                    let cell = cv.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! Cell\n                    configureCell(i, item, cell)\n                    return cell\n                }\n                    \n                return self.items(dataSource: dataSource)(source)\n            }\n        }\n    }\n\n    \n    /**\n    Binds sequences of elements to collection view items using a custom reactive data used to perform the transformation.\n    \n    - parameter dataSource: Data source used to transform elements to view cells.\n    - parameter source: Observable sequence of items.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n     \n         let dataSource = RxCollectionViewSectionedReloadDataSource<SectionModel<String, Double>>()\n\n         let items = Observable.just([\n             SectionModel(model: \"First section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ]),\n             SectionModel(model: \"Second section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ]),\n             SectionModel(model: \"Third section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ])\n         ])\n\n         dataSource.configureCell = { (dataSource, cv, indexPath, element) in\n             let cell = cv.dequeueReusableCell(withReuseIdentifier: \"Cell\", for: indexPath) as! NumberCell\n             cell.value?.text = \"\\(element) @ row \\(indexPath.row)\"\n             return cell\n         }\n\n         items\n            .bind(to: collectionView.rx.items(dataSource: dataSource))\n            .disposed(by: disposeBag)\n    */\n    public func items<\n            DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,\n            Source: ObservableType>\n        (dataSource: DataSource)\n        -> (_ source: Source)\n        -> Disposable where DataSource.Element == Source.Element\n          {\n        return { source in\n            // This is called for sideeffects only, and to make sure delegate proxy is in place when\n            // data source is being bound.\n            // This is needed because theoretically the data source subscription itself might\n            // call `self.rx.delegate`. If that happens, it might cause weird side effects since\n            // setting data source will set delegate, and UICollectionView might get into a weird state.\n            // Therefore it's better to set delegate proxy first, just to be sure.\n            _ = self.delegate\n            // Strong reference is needed because data source is in use until result subscription is disposed\n            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in\n                guard let collectionView = collectionView else {\n                    return\n                }\n                dataSource.collectionView(collectionView, observedEvent: event)\n            }\n        }\n    }\n}\n\nextension Reactive where Base: UICollectionView {\n    public typealias DisplayCollectionViewCellEvent = (cell: UICollectionViewCell, at: IndexPath)\n    public typealias DisplayCollectionViewSupplementaryViewEvent = (supplementaryView: UICollectionReusableView, elementKind: String, at: IndexPath)\n\n    /// Reactive wrapper for `dataSource`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var dataSource: DelegateProxy<UICollectionView, UICollectionViewDataSource> {\n        RxCollectionViewDataSourceProxy.proxy(for: base)\n    }\n    \n    /// Installs data source as forwarding delegate on `rx.dataSource`.\n    /// Data source won't be retained.\n    ///\n    /// It enables using normal delegate mechanism with reactive delegate mechanism.\n    ///\n    /// - parameter dataSource: Data source object.\n    /// - returns: Disposable object that can be used to unbind the data source.\n    public func setDataSource(_ dataSource: UICollectionViewDataSource)\n        -> Disposable {\n        RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n   \n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    public var itemSelected: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didDeselectItemAtIndexPath:)`.\n    public var itemDeselected: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n        }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didHighlightItemAt:)`.\n    public var itemHighlighted: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didHighlightItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didUnhighlightItemAt:)`.\n    public var itemUnhighlighted: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didUnhighlightItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView:willDisplay:forItemAt:`.\n    public var willDisplayCell: ControlEvent<DisplayCollectionViewCellEvent> {\n        let source: Observable<DisplayCollectionViewCellEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:willDisplay:forItemAt:)))\n            .map { a in\n                return (try castOrThrow(UICollectionViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:willDisplaySupplementaryView:forElementKind:at:)`.\n    public var willDisplaySupplementaryView: ControlEvent<DisplayCollectionViewSupplementaryViewEvent> {\n        let source: Observable<DisplayCollectionViewSupplementaryViewEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:willDisplaySupplementaryView:forElementKind:at:)))\n            .map { a in\n                return (try castOrThrow(UICollectionReusableView.self, a[1]),\n                        try castOrThrow(String.self, a[2]),\n                        try castOrThrow(IndexPath.self, a[3]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView:didEndDisplaying:forItemAt:`.\n    public var didEndDisplayingCell: ControlEvent<DisplayCollectionViewCellEvent> {\n        let source: Observable<DisplayCollectionViewCellEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didEndDisplaying:forItemAt:)))\n            .map { a in\n                return (try castOrThrow(UICollectionViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didEndDisplayingSupplementaryView:forElementOfKind:at:)`.\n    public var didEndDisplayingSupplementaryView: ControlEvent<DisplayCollectionViewSupplementaryViewEvent> {\n        let source: Observable<DisplayCollectionViewSupplementaryViewEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didEndDisplayingSupplementaryView:forElementOfKind:at:)))\n            .map { a in\n                return (try castOrThrow(UICollectionReusableView.self, a[1]),\n                        try castOrThrow(String.self, a[2]),\n                        try castOrThrow(IndexPath.self, a[3]))\n            }\n\n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    ///\n    /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    /// or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    ///\n    /// ```\n    ///     collectionView.rx.modelSelected(MyModel.self)\n    ///        .map { ...\n    /// ```\n    public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = itemSelected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    ///\n    /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    /// or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    ///\n    /// ```\n    ///     collectionView.rx.modelDeselected(MyModel.self)\n    ///        .map { ...\n    /// ```\n    public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = itemDeselected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n\n        return ControlEvent(events: source)\n    }\n    \n    /// Synchronous helper method for retrieving a model at indexPath through a reactive data source\n    public func model<T>(at indexPath: IndexPath) throws -> T {\n        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.itemsWith*` methods was used.\")\n        \n        let element = try dataSource.model(at: indexPath)\n\n        return try castOrThrow(T.self, element)\n    }\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nextension Reactive where Base: UICollectionView {\n\n    /// Reactive wrapper for `prefetchDataSource`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var prefetchDataSource: DelegateProxy<UICollectionView, UICollectionViewDataSourcePrefetching> {\n        RxCollectionViewDataSourcePrefetchingProxy.proxy(for: base)\n    }\n\n    /**\n     Installs prefetch data source as forwarding delegate on `rx.prefetchDataSource`.\n     Prefetch data source won't be retained.\n\n     It enables using normal delegate mechanism with reactive delegate mechanism.\n\n     - parameter prefetchDataSource: Prefetch data source object.\n     - returns: Disposable object that can be used to unbind the data source.\n     */\n    public func setPrefetchDataSource(_ prefetchDataSource: UICollectionViewDataSourcePrefetching)\n        -> Disposable {\n            return RxCollectionViewDataSourcePrefetchingProxy.installForwardDelegate(prefetchDataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n\n    /// Reactive wrapper for `prefetchDataSource` message `collectionView(_:prefetchItemsAt:)`.\n    public var prefetchItems: ControlEvent<[IndexPath]> {\n        let source = RxCollectionViewDataSourcePrefetchingProxy.proxy(for: base).prefetchItemsPublishSubject\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `prefetchDataSource` message `collectionView(_:cancelPrefetchingForItemsAt:)`.\n    public var cancelPrefetchingForItems: ControlEvent<[IndexPath]> {\n        let source = prefetchDataSource.methodInvoked(#selector(UICollectionViewDataSourcePrefetching.collectionView(_:cancelPrefetchingForItemsAt:)))\n            .map { a in\n                return try castOrThrow(Array<IndexPath>.self, a[1])\n        }\n\n        return ControlEvent(events: source)\n    }\n\n}\n#endif\n\n#if os(tvOS)\n\nextension Reactive where Base: UICollectionView {\n    \n    /// Reactive wrapper for `delegate` message `collectionView(_:didUpdateFocusInContext:withAnimationCoordinator:)`.\n    public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UICollectionViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {\n\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))\n            .map { a -> (context: UICollectionViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in\n                let context = try castOrThrow(UICollectionViewFocusUpdateContext.self, a[1])\n                let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2])\n                return (context: context, animationCoordinator: animationCoordinator)\n            }\n\n        return ControlEvent(events: source)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift",
    "content": "//\n//  UIControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UIControl {\n    /// Reactive wrapper for target action pattern.\n    ///\n    /// - parameter controlEvents: Filter for observed event types.\n    public func controlEvent(_ controlEvents: UIControl.Event) -> ControlEvent<()> {\n        let source: Observable<Void> = Observable.create { [weak control = self.base] observer in\n                MainScheduler.ensureRunningOnMainThread()\n\n                guard let control = control else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n\n                let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) { _ in\n                    observer.on(.next(()))\n                }\n\n                return Disposables.create(with: controlTarget.dispose)\n            }\n            .take(until: deallocated)\n\n        return ControlEvent(events: source)\n    }\n\n    /// Creates a `ControlProperty` that is triggered by target/action pattern value updates.\n    ///\n    /// - parameter controlEvents: Events that trigger value update sequence elements.\n    /// - parameter getter: Property value getter.\n    /// - parameter setter: Property value setter.\n    public func controlProperty<T>(\n        editingEvents: UIControl.Event,\n        getter: @escaping (Base) -> T,\n        setter: @escaping (Base, T) -> Void\n    ) -> ControlProperty<T> {\n        let source: Observable<T> = Observable.create { [weak weakControl = base] observer in\n                guard let control = weakControl else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n\n                observer.on(.next(getter(control)))\n\n                let controlTarget = ControlTarget(control: control, controlEvents: editingEvents) { _ in\n                    if let control = weakControl {\n                        observer.on(.next(getter(control)))\n                    }\n                }\n                \n                return Disposables.create(with: controlTarget.dispose)\n            }\n            .take(until: deallocated)\n\n        let bindingObserver = Binder(base, binding: setter)\n\n        return ControlProperty<T>(values: source, valueSink: bindingObserver)\n    }\n\n    /// This is a separate method to better communicate to public consumers that\n    /// an `editingEvent` needs to fire for control property to be updated.\n    internal func controlPropertyWithDefaultEvents<T>(\n        editingEvents: UIControl.Event = [.allEditingEvents, .valueChanged],\n        getter: @escaping (Base) -> T,\n        setter: @escaping (Base, T) -> Void\n        ) -> ControlProperty<T> {\n        return controlProperty(\n            editingEvents: editingEvents,\n            getter: getter,\n            setter: setter\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift",
    "content": "//\n//  UIDatePicker+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UIDatePicker {\n    /// Reactive wrapper for `date` property.\n    public var date: ControlProperty<Date> {\n        value\n    }\n\n    /// Reactive wrapper for `date` property.\n    public var value: ControlProperty<Date> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { datePicker in\n                datePicker.date\n            }, setter: { datePicker, value in\n                datePicker.date = value\n            }\n        )\n    }\n\n    /// Reactive wrapper for `countDownDuration` property.\n    public var countDownDuration: ControlProperty<TimeInterval> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { datePicker in\n                datePicker.countDownDuration\n            }, setter: { datePicker, value in\n                datePicker.countDownDuration = value\n            }\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift",
    "content": "//\n//  UIGestureRecognizer+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 10/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n// This should be only used from `MainScheduler`\nfinal class GestureTarget<Recognizer: UIGestureRecognizer>: RxTarget {\n    typealias Callback = (Recognizer) -> Void\n    \n    let selector = #selector(ControlTarget.eventHandler(_:))\n    \n    weak var gestureRecognizer: Recognizer?\n    var callback: Callback?\n    \n    init(_ gestureRecognizer: Recognizer, callback: @escaping Callback) {\n        self.gestureRecognizer = gestureRecognizer\n        self.callback = callback\n        \n        super.init()\n        \n        gestureRecognizer.addTarget(self, action: selector)\n\n        let method = self.method(for: selector)\n        if method == nil {\n            fatalError(\"Can't find method\")\n        }\n    }\n    \n    @objc func eventHandler(_ sender: UIGestureRecognizer) {\n        if let callback = self.callback, let gestureRecognizer = self.gestureRecognizer {\n            callback(gestureRecognizer)\n        }\n    }\n    \n    override func dispose() {\n        super.dispose()\n        \n        self.gestureRecognizer?.removeTarget(self, action: self.selector)\n        self.callback = nil\n    }\n}\n\nextension Reactive where Base: UIGestureRecognizer {\n    \n    /// Reactive wrapper for gesture recognizer events.\n    public var event: ControlEvent<Base> {\n        let source: Observable<Base> = Observable.create { [weak control = self.base] observer in\n            MainScheduler.ensureRunningOnMainThread()\n\n            guard let control = control else {\n                observer.on(.completed)\n                return Disposables.create()\n            }\n            \n            let observer = GestureTarget(control) { control in\n                observer.on(.next(control))\n            }\n            \n            return observer\n        }.take(until: deallocated)\n        \n        return ControlEvent(events: source)\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UINavigationController+Rx.swift",
    "content": "//\n//  UINavigationController+Rx.swift\n//  RxCocoa\n//\n//  Created by Diogo on 13/04/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UINavigationController {\n    public typealias ShowEvent = (viewController: UIViewController, animated: Bool)\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UINavigationController, UINavigationControllerDelegate> {\n        RxNavigationControllerDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for delegate method `navigationController(:willShow:animated:)`.\n    public var willShow: ControlEvent<ShowEvent> {\n        let source: Observable<ShowEvent> = delegate\n            .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:willShow:animated:)))\n            .map { arg in\n                let viewController = try castOrThrow(UIViewController.self, arg[1])\n                let animated = try castOrThrow(Bool.self, arg[2])\n                return (viewController, animated)\n        }\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for delegate method `navigationController(:didShow:animated:)`.\n    public var didShow: ControlEvent<ShowEvent> {\n        let source: Observable<ShowEvent> = delegate\n            .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:didShow:animated:)))\n            .map { arg in\n                let viewController = try castOrThrow(UIViewController.self, arg[1])\n                let animated = try castOrThrow(Bool.self, arg[2])\n                return (viewController, animated)\n        }\n        return ControlEvent(events: source)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift",
    "content": "//\n//  UIPickerView+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \n    import RxSwift\n    import UIKit\n\n    extension Reactive where Base: UIPickerView {\n\n        /// Reactive wrapper for `delegate`.\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UIPickerView, UIPickerViewDelegate> {\n            return RxPickerViewDelegateProxy.proxy(for: base)\n        }\n        \n        /// Installs delegate as forwarding delegate on `delegate`.\n        /// Delegate won't be retained.\n        ///\n        /// It enables using normal delegate mechanism with reactive delegate mechanism.\n        ///\n        /// - parameter delegate: Delegate object.\n        /// - returns: Disposable object that can be used to unbind the delegate.\n        public func setDelegate(_ delegate: UIPickerViewDelegate)\n            -> Disposable {\n                return RxPickerViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)\n        }\n        \n        /**\n         Reactive wrapper for `dataSource`.\n         \n         For more information take a look at `DelegateProxyType` protocol documentation.\n         */\n        public var dataSource: DelegateProxy<UIPickerView, UIPickerViewDataSource> {\n            return RxPickerViewDataSourceProxy.proxy(for: base)\n        }\n        \n        /**\n         Reactive wrapper for `delegate` message `pickerView:didSelectRow:inComponent:`.\n         */\n        public var itemSelected: ControlEvent<(row: Int, component: Int)> {\n            let source = delegate\n                .methodInvoked(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:)))\n                .map {\n                    return (row: try castOrThrow(Int.self, $0[1]), component: try castOrThrow(Int.self, $0[2]))\n                }\n            return ControlEvent(events: source)\n        }\n        \n        /**\n         Reactive wrapper for `delegate` message `pickerView:didSelectRow:inComponent:`.\n         \n         It can be only used when one of the `rx.itemTitles, rx.itemAttributedTitles, items(_ source: O)` methods is used to bind observable sequence,\n         or any other data source conforming to a `ViewDataSourceType` protocol.\n         \n         ```\n         pickerView.rx.modelSelected(MyModel.self)\n         .map { ...\n         ```\n         - parameter modelType: Type of a Model which bound to the dataSource\n         */\n        public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<[T]> {\n            let source = itemSelected.flatMap { [weak view = self.base as UIPickerView] _, component -> Observable<[T]> in\n                guard let view = view else {\n                    return Observable.empty()\n                }\n\n                let model: [T] = try (0 ..< view.numberOfComponents).map { component in\n                    let row = view.selectedRow(inComponent: component)\n                    return try view.rx.model(at: IndexPath(row: row, section: component))\n                }\n\n                return Observable.just(model)\n            }\n            \n            return ControlEvent(events: source)\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter titleForRow: Transform between sequence elements and row titles.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n            let items = Observable.just([\n                    \"First Item\",\n                    \"Second Item\",\n                    \"Third Item\"\n                ])\n         \n            items\n                .bind(to: pickerView.rx.itemTitles) { (row, element) in\n                    return element.title\n                }\n                .disposed(by: disposeBag)\n         \n         */\n        \n        public func itemTitles<Sequence: Swift.Sequence, Source: ObservableType>\n            (_ source: Source)\n            -> (_ titleForRow: @escaping (Int, Sequence.Element) -> String?)\n            -> Disposable where Source.Element == Sequence {\n                return { titleForRow in\n                    let adapter = RxStringPickerViewAdapter<Sequence>(titleForRow: titleForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter attributedTitleForRow: Transform between sequence elements and row attributed titles.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n         let items = Observable.just([\n                \"First Item\",\n                \"Second Item\",\n                \"Third Item\"\n            ])\n         \n         items\n            .bind(to: pickerView.rx.itemAttributedTitles) { (row, element) in\n                return NSAttributedString(string: element.title)\n            }\n            .disposed(by: disposeBag)\n        \n         */\n\n        public func itemAttributedTitles<Sequence: Swift.Sequence, Source: ObservableType>\n            (_ source: Source)\n            -> (_ attributedTitleForRow: @escaping (Int, Sequence.Element) -> NSAttributedString?)\n            -> Disposable where Source.Element == Sequence {\n                return { attributedTitleForRow in\n                    let adapter = RxAttributedStringPickerViewAdapter<Sequence>(attributedTitleForRow: attributedTitleForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter viewForRow: Transform between sequence elements and row views.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n         let items = Observable.just([\n                \"First Item\",\n                \"Second Item\",\n                \"Third Item\"\n            ])\n         \n         items\n            .bind(to: pickerView.rx.items) { (row, element, view) in\n                guard let myView = view as? MyView else {\n                    let view = MyView()\n                    view.configure(with: element)\n                    return view\n                }\n                myView.configure(with: element)\n                return myView\n            }\n            .disposed(by: disposeBag)\n         \n         */\n\n        public func items<Sequence: Swift.Sequence, Source: ObservableType>\n            (_ source: Source)\n            -> (_ viewForRow: @escaping (Int, Sequence.Element, UIView?) -> UIView)\n            -> Disposable where Source.Element == Sequence {\n                return { viewForRow in\n                    let adapter = RxPickerViewAdapter<Sequence>(viewForRow: viewForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows using a custom reactive adapter used to perform the transformation.\n         This method will retain the adapter for as long as the subscription isn't disposed (result `Disposable`\n         being disposed).\n         In case `source` observable sequence terminates successfully, the adapter will present latest element\n         until the subscription isn't disposed.\n         \n         - parameter adapter: Adapter used to transform elements to picker components.\n         - parameter source: Observable sequence of items.\n         - returns: Disposable object that can be used to unbind.\n         */\n        public func items<Source: ObservableType,\n                          Adapter: RxPickerViewDataSourceType & UIPickerViewDataSource & UIPickerViewDelegate>(adapter: Adapter)\n            -> (_ source: Source)\n            -> Disposable where Source.Element == Adapter.Element {\n                return { source in\n                    let delegateSubscription = self.setDelegate(adapter)\n                    let dataSourceSubscription = source.subscribeProxyDataSource(ofObject: self.base, dataSource: adapter, retainDataSource: true, binding: { [weak pickerView = self.base] (_: RxPickerViewDataSourceProxy, event) in\n                        guard let pickerView = pickerView else { return }\n                        adapter.pickerView(pickerView, observedEvent: event)\n                    })\n                    return Disposables.create(delegateSubscription, dataSourceSubscription)\n                }\n        }\n        \n        /**\n         Synchronous helper method for retrieving a model at indexPath through a reactive data source.\n         */\n        public func model<T>(at indexPath: IndexPath) throws -> T {\n            let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.itemTitles, rx.itemAttributedTitles, items(_ source: O)` methods was used.\")\n            \n            return castOrFatalError(try dataSource.model(at: indexPath))\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift",
    "content": "//\n//  UIRefreshControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Yosuke Ishikawa on 1/31/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UIRefreshControl {\n    /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.\n    public var isRefreshing: Binder<Bool> {\n        return Binder(self.base) { refreshControl, refresh in\n            if refresh {\n                refreshControl.beginRefreshing()\n            } else {\n                refreshControl.endRefreshing()\n            }\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift",
    "content": "//\n//  UIScrollView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/3/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n    import RxSwift\n    import UIKit\n\n    extension Reactive where Base: UIScrollView {\n        public typealias EndZoomEvent = (view: UIView?, scale: CGFloat)\n        public typealias WillEndDraggingEvent = (velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)\n\n        /// Reactive wrapper for `delegate`.\n        ///\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UIScrollView, UIScrollViewDelegate> {\n            return RxScrollViewDelegateProxy.proxy(for: base)\n        }\n        \n        /// Reactive wrapper for `contentOffset`.\n        public var contentOffset: ControlProperty<CGPoint> {\n            let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n\n            let bindingObserver = Binder(self.base) { scrollView, contentOffset in\n                scrollView.contentOffset = contentOffset\n            }\n\n            return ControlProperty(values: proxy.contentOffsetBehaviorSubject, valueSink: bindingObserver)\n        }\n\n        /// Reactive wrapper for delegate method `scrollViewDidScroll`\n        public var didScroll: ControlEvent<Void> {\n            let source = RxScrollViewDelegateProxy.proxy(for: base).contentOffsetPublishSubject\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillBeginDecelerating`\n        public var willBeginDecelerating: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginDecelerating(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n    \t\n    \t/// Reactive wrapper for delegate method `scrollViewDidEndDecelerating`\n    \tpublic var didEndDecelerating: ControlEvent<Void> {\n    \t\tlet source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndDecelerating(_:))).map { _ in }\n    \t\treturn ControlEvent(events: source)\n    \t}\n    \t\n        /// Reactive wrapper for delegate method `scrollViewWillBeginDragging`\n        public var willBeginDragging: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)`\n        public var willEndDragging: ControlEvent<WillEndDraggingEvent> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)))\n                .map { value -> WillEndDraggingEvent in\n                    let velocity = try castOrThrow(CGPoint.self, value[1])\n                    let targetContentOffsetValue = try castOrThrow(NSValue.self, value[2])\n\n                    guard let rawPointer = targetContentOffsetValue.pointerValue else { throw RxCocoaError.unknown }\n                    let typedPointer = rawPointer.bindMemory(to: CGPoint.self, capacity: MemoryLayout<CGPoint>.size)\n\n                    return (velocity, typedPointer)\n            }\n            return ControlEvent(events: source)\n        }\n        \n    \t/// Reactive wrapper for delegate method `scrollViewDidEndDragging(_:willDecelerate:)`\n        public var didEndDragging: ControlEvent<Bool> {\n    \t\tlet source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndDragging(_:willDecelerate:))).map { value -> Bool in\n    \t\t\treturn try castOrThrow(Bool.self, value[1])\n    \t\t}\n    \t\treturn ControlEvent(events: source)\n    \t}\n\n        /// Reactive wrapper for delegate method `scrollViewDidZoom`\n        public var didZoom: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidZoom)).map { _ in }\n            return ControlEvent(events: source)\n        }\n\n\n        /// Reactive wrapper for delegate method `scrollViewDidScrollToTop`\n        public var didScrollToTop: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidScrollToTop(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewDidEndScrollingAnimation`\n        public var didEndScrollingAnimation: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndScrollingAnimation(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillBeginZooming(_:with:)`\n        public var willBeginZooming: ControlEvent<UIView?> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginZooming(_:with:))).map { value -> UIView? in\n                return try castOptionalOrThrow(UIView.self, value[1] as AnyObject)\n            }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewDidEndZooming(_:with:atScale:)`\n        public var didEndZooming: ControlEvent<EndZoomEvent> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndZooming(_:with:atScale:))).map { value -> EndZoomEvent in\n                return (try castOptionalOrThrow(UIView.self, value[1] as AnyObject), try castOrThrow(CGFloat.self, value[2]))\n            }\n            return ControlEvent(events: source)\n        }\n\n        /// Installs delegate as forwarding delegate on `delegate`.\n        /// Delegate won't be retained.\n        ///\n        /// It enables using normal delegate mechanism with reactive delegate mechanism.\n        ///\n        /// - parameter delegate: Delegate object.\n        /// - returns: Disposable object that can be used to unbind the delegate.\n        public func setDelegate(_ delegate: UIScrollViewDelegate)\n            -> Disposable {\n            return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift",
    "content": "//\n//  UISearchBar+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UISearchBar {\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UISearchBar, UISearchBarDelegate> {\n        RxSearchBarDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for `text` property.\n    public var text: ControlProperty<String?> {\n        value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        let source: Observable<String?> = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable<String?> in\n            let text = searchBar?.text\n\n            let textDidChange = (searchBar?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())\n            let didEndEditing = (searchBar?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:))) ?? Observable.empty())\n            \n            return Observable.merge(textDidChange, didEndEditing)\n                    .map { _ in searchBar?.text ?? \"\" }\n                    .startWith(text)\n        }\n        \n        let bindingObserver = Binder(self.base) { (searchBar, text: String?) in\n            searchBar.text = text\n        }\n\n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n    /// Reactive wrapper for `selectedScopeButtonIndex` property.\n    public var selectedScopeButtonIndex: ControlProperty<Int> {\n        let source: Observable<Int> = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable<Int> in\n            let index = source?.selectedScopeButtonIndex ?? 0\n            \n            return (source?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())\n                .map { a in\n                    return try castOrThrow(Int.self, a[1])\n                }\n                .startWith(index)\n        }\n        \n        let bindingObserver = Binder(self.base) { (searchBar, index: Int) in\n            searchBar.selectedScopeButtonIndex = index\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n#if os(iOS)\n    /// Reactive wrapper for delegate method `searchBarCancelButtonClicked`.\n    public var cancelButtonClicked: ControlEvent<Void> {\n        let source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))\n            .map { _ in\n                return ()\n            }\n        return ControlEvent(events: source)\n    }\n\n\t/// Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`.\n\tpublic var bookmarkButtonClicked: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n\n\t/// Reactive wrapper for delegate method `searchBarResultsListButtonClicked`.\n\tpublic var resultsListButtonClicked: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n#endif\n\t\n    /// Reactive wrapper for delegate method `searchBarSearchButtonClicked`.\n    public var searchButtonClicked: ControlEvent<Void> {\n        let source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))\n            .map { _ in\n                return ()\n        }\n        return ControlEvent(events: source)\n    }\n\t\n\t/// Reactive wrapper for delegate method `searchBarTextDidBeginEditing`.\n\tpublic var textDidBeginEditing: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n\t\n\t/// Reactive wrapper for delegate method `searchBarTextDidEndEditing`.\n\tpublic var textDidEndEditing: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n  \n    /// Installs delegate as forwarding delegate on `delegate`.\n    /// Delegate won't be retained.\n    ///\n    /// It enables using normal delegate mechanism with reactive delegate mechanism.\n    ///\n    /// - parameter delegate: Delegate object.\n    /// - returns: Disposable object that can be used to unbind the delegate.\n    public func setDelegate(_ delegate: UISearchBarDelegate)\n        -> Disposable {\n        RxSearchBarDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift",
    "content": "//\n//  UISearchController+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 3/17/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \n    import RxSwift\n    import UIKit\n    \n    extension Reactive where Base: UISearchController {\n        /// Reactive wrapper for `delegate`.\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UISearchController, UISearchControllerDelegate> {\n            return RxSearchControllerDelegateProxy.proxy(for: base)\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didDismiss: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.didDismissSearchController(_:)))\n                .map { _ in }\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didPresent: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UISearchControllerDelegate.didPresentSearchController(_:)))\n                .map { _ in }\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var present: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.presentSearchController(_:)))\n                .map { _ in }\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var willDismiss: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UISearchControllerDelegate.willDismissSearchController(_:)))\n                .map { _ in }\n        }\n        \n        /// Reactive wrapper for `delegate` message.\n        public var willPresent: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.willPresentSearchController(_:)))\n                .map { _ in }\n        }\n        \n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift",
    "content": "//\n//  UISegmentedControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 8/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UISegmentedControl {\n    /// Reactive wrapper for `selectedSegmentIndex` property.\n    public var selectedSegmentIndex: ControlProperty<Int> {\n        value\n    }\n    \n    /// Reactive wrapper for `selectedSegmentIndex` property.\n    public var value: ControlProperty<Int> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { segmentedControl in\n                segmentedControl.selectedSegmentIndex\n            }, setter: { segmentedControl, value in\n                segmentedControl.selectedSegmentIndex = value\n            }\n        )\n    }\n    \n    /// Reactive wrapper for `setEnabled(_:forSegmentAt:)`\n    public func enabledForSegment(at index: Int) -> Binder<Bool> {\n        return Binder(self.base) { segmentedControl, segmentEnabled -> Void in\n            segmentedControl.setEnabled(segmentEnabled, forSegmentAt: index)\n        }\n    }\n    \n    /// Reactive wrapper for `setTitle(_:forSegmentAt:)`\n    public func titleForSegment(at index: Int) -> Binder<String?> {\n        return Binder(self.base) { segmentedControl, title -> Void in\n            segmentedControl.setTitle(title, forSegmentAt: index)\n        }\n    }\n    \n    /// Reactive wrapper for `setImage(_:forSegmentAt:)`\n    public func imageForSegment(at index: Int) -> Binder<UIImage?> {\n        return Binder(self.base) { segmentedControl, image -> Void in\n            segmentedControl.setImage(image, forSegmentAt: index)\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift",
    "content": "//\n//  UISlider+Rx.swift\n//  RxCocoa\n//\n//  Created by Alexander van der Werff on 28/05/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UISlider {\n    \n    /// Reactive wrapper for `value` property.\n    public var value: ControlProperty<Float> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { slider in\n                slider.value\n            }, setter: { slider, value in\n                slider.value = value\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift",
    "content": "//\n//  UIStepper+Rx.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 9/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UIStepper {\n    \n    /// Reactive wrapper for `value` property.\n    public var value: ControlProperty<Double> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { stepper in\n                stepper.value\n            }, setter: { stepper, value in\n                stepper.value = value\n            }\n        )\n    }\n}\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift",
    "content": "//\n//  UISwitch+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 8/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UISwitch {\n\n    /// Reactive wrapper for `isOn` property.\n    public var isOn: ControlProperty<Bool> {\n        value\n    }\n\n    /// Reactive wrapper for `isOn` property.\n    ///\n    /// ⚠️ Versions prior to iOS 10.2 were leaking `UISwitch`'s, so on those versions\n    /// underlying observable sequence won't complete when nothing holds a strong reference\n    /// to `UISwitch`.\n    public var value: ControlProperty<Bool> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { uiSwitch in\n                uiSwitch.isOn\n            }, setter: { uiSwitch, value in\n                uiSwitch.isOn = value\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift",
    "content": "//\n//  UITabBar+Rx.swift\n//  RxCocoa\n//\n//  Created by Jesse Farless on 5/13/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\n/**\n iOS only\n */\n#if os(iOS)\nextension Reactive where Base: UITabBar {\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:willBeginCustomizing:)`.\n    public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {\n        \n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UITabBarItem].self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didBeginCustomizing:)`.\n    public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UITabBarItem].self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:willEndCustomizing:changed:)`.\n    public var willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (([UITabBarItem], Bool)) in\n                let items = try castOrThrow([UITabBarItem].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (items, changed)\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didEndCustomizing:changed:)`.\n    public var didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (([UITabBarItem], Bool)) in\n                let items = try castOrThrow([UITabBarItem].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (items, changed)\n            }\n\n        return ControlEvent(events: source)\n    }\n\n}\n#endif\n\n/**\n iOS and tvOS\n */\n    \nextension Reactive where Base: UITabBar {\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UITabBar, UITabBarDelegate> {\n        RxTabBarDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didSelect:)`.\n    public var didSelectItem: ControlEvent<UITabBarItem> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didSelect:)))\n            .map { a in\n                return try castOrThrow(UITabBarItem.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITabBarController+Rx.swift",
    "content": "//\n//  UITabBarController+Rx.swift\n//  RxCocoa\n//\n//  Created by Yusuke Kita on 2016/12/07.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n    \n/**\n iOS only\n */\n#if os(iOS)\nextension Reactive where Base: UITabBarController {\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:willBeginCustomizing:`.\n    public var willBeginCustomizing: ControlEvent<[UIViewController]> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:willBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UIViewController].self, a[1])\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:willEndCustomizing:changed:`.\n    public var willEndCustomizing: ControlEvent<(viewControllers: [UIViewController], changed: Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:willEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (viewControllers: [UIViewController], changed: Bool) in\n                let viewControllers = try castOrThrow([UIViewController].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (viewControllers, changed)\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:didEndCustomizing:changed:`.\n    public var didEndCustomizing: ControlEvent<(viewControllers: [UIViewController], changed: Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:didEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (viewControllers: [UIViewController], changed: Bool) in\n                let viewControllers = try castOrThrow([UIViewController].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (viewControllers, changed)\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n#endif\n    \n/**\n iOS and tvOS\n */\n\n    extension Reactive where Base: UITabBarController {\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UITabBarController, UITabBarControllerDelegate> {\n        RxTabBarControllerDelegateProxy.proxy(for: base)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:didSelect:`.\n    public var didSelect: ControlEvent<UIViewController> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:didSelect:)))\n            .map { a in\n                return try castOrThrow(UIViewController.self, a[1])\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift",
    "content": "//\n//  UITableView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\n// Items\n\nextension Reactive where Base: UITableView {\n\n    /**\n    Binds sequences of elements to table view rows.\n    \n    - parameter source: Observable sequence of items.\n    - parameter cellFactory: Transform between sequence elements and view cells.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example:\n    \n         let items = Observable.just([\n             \"First Item\",\n             \"Second Item\",\n             \"Third Item\"\n         ])\n\n         items\n         .bind(to: tableView.rx.items) { (tableView, row, element) in\n             let cell = tableView.dequeueReusableCell(withIdentifier: \"Cell\")!\n             cell.textLabel?.text = \"\\(element) @ row \\(row)\"\n             return cell\n         }\n         .disposed(by: disposeBag)\n\n     */\n    public func items<Sequence: Swift.Sequence, Source: ObservableType>\n        (_ source: Source)\n        -> (_ cellFactory: @escaping (UITableView, Int, Sequence.Element) -> UITableViewCell)\n        -> Disposable\n        where Source.Element == Sequence {\n            return { cellFactory in\n                let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<Sequence>(cellFactory: cellFactory)\n                return self.items(dataSource: dataSource)(source)\n            }\n    }\n\n    /**\n    Binds sequences of elements to table view rows.\n    \n    - parameter cellIdentifier: Identifier used to dequeue cells.\n    - parameter source: Observable sequence of items.\n    - parameter configureCell: Transform between sequence elements and view cells.\n    - parameter cellType: Type of table view cell.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example:\n\n         let items = Observable.just([\n             \"First Item\",\n             \"Second Item\",\n             \"Third Item\"\n         ])\n\n         items\n             .bind(to: tableView.rx.items(cellIdentifier: \"Cell\", cellType: UITableViewCell.self)) { (row, element, cell) in\n                cell.textLabel?.text = \"\\(element) @ row \\(row)\"\n             }\n             .disposed(by: disposeBag)\n    */\n    public func items<Sequence: Swift.Sequence, Cell: UITableViewCell, Source: ObservableType>\n        (cellIdentifier: String, cellType: Cell.Type = Cell.self)\n        -> (_ source: Source)\n        -> (_ configureCell: @escaping (Int, Sequence.Element, Cell) -> Void)\n        -> Disposable\n        where Source.Element == Sequence {\n        return { source in\n            return { configureCell in\n                let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<Sequence> { tv, i, item in\n                    let indexPath = IndexPath(item: i, section: 0)\n                    let cell = tv.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! Cell\n                    configureCell(i, item, cell)\n                    return cell\n                }\n                return self.items(dataSource: dataSource)(source)\n            }\n        }\n    }\n\n\n    /**\n    Binds sequences of elements to table view rows using a custom reactive data used to perform the transformation.\n    This method will retain the data source for as long as the subscription isn't disposed (result `Disposable` \n    being disposed).\n    In case `source` observable sequence terminates successfully, the data source will present latest element\n    until the subscription isn't disposed.\n    \n    - parameter dataSource: Data source used to transform elements to view cells.\n    - parameter source: Observable sequence of items.\n    - returns: Disposable object that can be used to unbind.\n    */\n    public func items<\n            DataSource: RxTableViewDataSourceType & UITableViewDataSource,\n            Source: ObservableType>\n        (dataSource: DataSource)\n        -> (_ source: Source)\n        -> Disposable\n        where DataSource.Element == Source.Element {\n        return { source in\n            // This is called for sideeffects only, and to make sure delegate proxy is in place when\n            // data source is being bound.\n            // This is needed because theoretically the data source subscription itself might\n            // call `self.rx.delegate`. If that happens, it might cause weird side effects since\n            // setting data source will set delegate, and UITableView might get into a weird state.\n            // Therefore it's better to set delegate proxy first, just to be sure.\n            _ = self.delegate\n            // Strong reference is needed because data source is in use until result subscription is disposed\n            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource as UITableViewDataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in\n                guard let tableView = tableView else {\n                    return\n                }\n                dataSource.tableView(tableView, observedEvent: event)\n            }\n        }\n    }\n\n}\n\nextension Reactive where Base: UITableView {\n    /**\n    Reactive wrapper for `dataSource`.\n    \n    For more information take a look at `DelegateProxyType` protocol documentation.\n    */\n    public var dataSource: DelegateProxy<UITableView, UITableViewDataSource> {\n        RxTableViewDataSourceProxy.proxy(for: base)\n    }\n   \n    /**\n    Installs data source as forwarding delegate on `rx.dataSource`.\n    Data source won't be retained.\n    \n    It enables using normal delegate mechanism with reactive delegate mechanism.\n     \n    - parameter dataSource: Data source object.\n    - returns: Disposable object that can be used to unbind the data source.\n    */\n    public func setDataSource(_ dataSource: UITableViewDataSource)\n        -> Disposable {\n        RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n    \n    // events\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.\n    */\n    public var itemSelected: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.\n     */\n    public var itemDeselected: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n    \n    /**\n     Reactive wrapper for `delegate` message `tableView:didHighlightRowAt:`.\n     */\n    public var itemHighlighted: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didHighlightRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:didUnhighlightRowAt:`.\n     */\n    public var itemUnhighlighted: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didUnhighlightRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:accessoryButtonTappedForRowWithIndexPath:`.\n     */\n    public var itemAccessoryButtonTapped: ControlEvent<IndexPath> {\n        let source: Observable<IndexPath> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n    */\n    public var itemInserted: ControlEvent<IndexPath> {\n        let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))\n            .filter { a in\n                return UITableViewCell.EditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .insert\n            }\n            .map { a in\n                return (try castOrThrow(IndexPath.self, a[2]))\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n    */\n    public var itemDeleted: ControlEvent<IndexPath> {\n        let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))\n            .filter { a in\n                return UITableViewCell.EditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .delete\n            }\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[2])\n            }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:moveRowAtIndexPath:toIndexPath:`.\n    */\n    public var itemMoved: ControlEvent<ItemMovedEvent> {\n        let source: Observable<ItemMovedEvent> = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))\n            .map { a in\n                return (try castOrThrow(IndexPath.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:willDisplayCell:forRowAtIndexPath:`.\n    */\n    public var willDisplayCell: ControlEvent<WillDisplayCellEvent> {\n        let source: Observable<WillDisplayCellEvent> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))\n            .map { a in\n                return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:didEndDisplayingCell:forRowAtIndexPath:`.\n    */\n    public var didEndDisplayingCell: ControlEvent<DidEndDisplayingCellEvent> {\n        let source: Observable<DidEndDisplayingCellEvent> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))\n            .map { a in\n                return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.\n    \n    It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    \n     ```\n        tableView.rx.modelSelected(MyModel.self)\n            .map { ...\n     ```\n    */\n    public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = self.itemSelected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.\n\n     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n     or any other data source conforming to `SectionedViewDataSourceType` protocol.\n\n     ```\n        tableView.rx.modelDeselected(MyModel.self)\n            .map { ...\n     ```\n     */\n    public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n         let source: Observable<T> = self.itemDeselected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n             guard let view = view else {\n                 return Observable.empty()\n             }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n\n        return ControlEvent(events: source)\n    }\n    \n    /**\n     Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n     \n     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n     or any other data source conforming to `SectionedViewDataSourceType` protocol.\n     \n     ```\n        tableView.rx.modelDeleted(MyModel.self)\n            .map { ...\n     ```\n     */\n    public func modelDeleted<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = self.itemDeleted.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n            \n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n     Synchronous helper method for retrieving a model at indexPath through a reactive data source.\n     */\n    public func model<T>(at indexPath: IndexPath) throws -> T {\n        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.items*` methods was used.\")\n        \n        let element = try dataSource.model(at: indexPath)\n\n        return castOrFatalError(element)\n    }\n}\n\n@available(iOS 10.0, tvOS 10.0, *)\nextension Reactive where Base: UITableView {\n\n    /// Reactive wrapper for `prefetchDataSource`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var prefetchDataSource: DelegateProxy<UITableView, UITableViewDataSourcePrefetching> {\n        RxTableViewDataSourcePrefetchingProxy.proxy(for: base)\n    }\n\n    /**\n     Installs prefetch data source as forwarding delegate on `rx.prefetchDataSource`.\n     Prefetch data source won't be retained.\n\n     It enables using normal delegate mechanism with reactive delegate mechanism.\n\n     - parameter prefetchDataSource: Prefetch data source object.\n     - returns: Disposable object that can be used to unbind the data source.\n     */\n    public func setPrefetchDataSource(_ prefetchDataSource: UITableViewDataSourcePrefetching)\n        -> Disposable {\n            return RxTableViewDataSourcePrefetchingProxy.installForwardDelegate(prefetchDataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n\n    /// Reactive wrapper for `prefetchDataSource` message `tableView(_:prefetchRowsAt:)`.\n    public var prefetchRows: ControlEvent<[IndexPath]> {\n        let source = RxTableViewDataSourcePrefetchingProxy.proxy(for: base).prefetchRowsPublishSubject\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `prefetchDataSource` message `tableView(_:cancelPrefetchingForRowsAt:)`.\n    public var cancelPrefetchingForRows: ControlEvent<[IndexPath]> {\n        let source = prefetchDataSource.methodInvoked(#selector(UITableViewDataSourcePrefetching.tableView(_:cancelPrefetchingForRowsAt:)))\n            .map { a in\n                return try castOrThrow(Array<IndexPath>.self, a[1])\n        }\n\n        return ControlEvent(events: source)\n    }\n\n}\n#endif\n\n#if os(tvOS)\n    \n    extension Reactive where Base: UITableView {\n        \n        /**\n         Reactive wrapper for `delegate` message `tableView:didUpdateFocusInContext:withAnimationCoordinator:`.\n         */\n        public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UITableViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {\n            \n            let source = delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))\n                .map { a -> (context: UITableViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in\n                    let context = try castOrThrow(UITableViewFocusUpdateContext.self, a[1])\n                    let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2])\n                    return (context: context, animationCoordinator: animationCoordinator)\n            }\n            \n            return ControlEvent(events: source)\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift",
    "content": "//\n//  UITextField+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport RxSwift\nimport UIKit\n\nextension Reactive where Base: UITextField {\n    /// Reactive wrapper for `text` property.\n    public var text: ControlProperty<String?> {\n        value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { textField in\n                textField.text\n            },\n            setter: { textField, value in\n                // This check is important because setting text value always clears control state\n                // including marked text selection which is imporant for proper input \n                // when IME input method is used.\n                if textField.text != value {\n                    textField.text = value\n                }\n            }\n        )\n    }\n    \n    /// Bindable sink for `attributedText` property.\n    public var attributedText: ControlProperty<NSAttributedString?> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { textField in\n                textField.attributedText\n            },\n            setter: { textField, value in\n                // This check is important because setting text value always clears control state\n                // including marked text selection which is imporant for proper input\n                // when IME input method is used.\n                if textField.attributedText != value {\n                    textField.attributedText = value\n                }\n            }\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift",
    "content": "//\n//  UITextView+Rx.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 7/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\nimport RxSwift\n\nextension Reactive where Base: UITextView {\n    /// Reactive wrapper for `text` property\n    public var text: ControlProperty<String?> {\n        value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        let source: Observable<String?> = Observable.deferred { [weak textView = self.base] in\n            let text = textView?.text\n            \n            let textChanged = textView?.textStorage\n                // This project uses text storage notifications because\n                // that's the only way to catch autocorrect changes\n                // in all cases. Other suggestions are welcome.\n                .rx.didProcessEditingRangeChangeInLength\n                // This observe on is here because text storage\n                // will emit event while process is not completely done,\n                // so rebinding a value will cause an exception to be thrown.\n                .observe(on:MainScheduler.asyncInstance)\n                .map { _ in\n                    return textView?.textStorage.string\n                }\n                ?? Observable.empty()\n            \n            return textChanged\n                .startWith(text)\n        }\n\n        let bindingObserver = Binder(self.base) { (textView, text: String?) in\n            // This check is important because setting text value always clears control state\n            // including marked text selection which is imporant for proper input \n            // when IME input method is used.\n            if textView.text != text {\n                textView.text = text\n            }\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n    \n    /// Reactive wrapper for `attributedText` property.\n    public var attributedText: ControlProperty<NSAttributedString?> {\n        let source: Observable<NSAttributedString?> = Observable.deferred { [weak textView = self.base] in\n            let attributedText = textView?.attributedText\n            \n            let textChanged: Observable<NSAttributedString?> = textView?.textStorage\n                // This project uses text storage notifications because\n                // that's the only way to catch autocorrect changes\n                // in all cases. Other suggestions are welcome.\n                .rx.didProcessEditingRangeChangeInLength\n                // This observe on is here because attributedText storage\n                // will emit event while process is not completely done,\n                // so rebinding a value will cause an exception to be thrown.\n                .observe(on:MainScheduler.asyncInstance)\n                .map { _ in\n                    return textView?.attributedText\n                }\n                ?? Observable.empty()\n            \n            return textChanged\n                .startWith(attributedText)\n        }\n        \n        let bindingObserver = Binder(self.base) { (textView, attributedText: NSAttributedString?) in\n            // This check is important because setting text value always clears control state\n            // including marked text selection which is imporant for proper input\n            // when IME input method is used.\n            if textView.attributedText != attributedText {\n                textView.attributedText = attributedText\n            }\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didBeginEditing: ControlEvent<()> {\n       return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidBeginEditing(_:)))\n            .map { _ in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didEndEditing: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidEndEditing(_:)))\n            .map { _ in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didChange: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChange(_:)))\n            .map { _ in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didChangeSelection: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChangeSelection(_:)))\n            .map { _ in\n                return ()\n            })\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/WKWebView+Rx.swift",
    "content": "//\n//  WKWebView+Rx.swift\n//  RxCocoa\n//\n//  Created by Giuseppe Lanza on 14/02/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(macOS)\n\nimport RxSwift\nimport WebKit\n\n@available(iOS 8.0, OSX 10.10, OSXApplicationExtension 10.10, *)\nextension Reactive where Base: WKWebView {\n    \n    /// Reactive wrapper for `navigationDelegate`.\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var navigationDelegate: DelegateProxy<WKWebView, WKNavigationDelegate> {\n        RxWKNavigationDelegateProxy.proxy(for: base)\n    }\n    \n    /// Reactive wrapper for `navigationDelegate` message.\n    public var didCommit: Observable<WKNavigation> {\n        navigationDelegate\n            .methodInvoked(#selector(WKNavigationDelegate.webView(_:didCommit:)))\n            .map { a in try castOrThrow(WKNavigation.self, a[1]) }\n    }\n    \n    /// Reactive wrapper for `navigationDelegate` message.\n    public var didStartLoad: Observable<WKNavigation> {\n        navigationDelegate\n            .methodInvoked(#selector(WKNavigationDelegate.webView(_:didStartProvisionalNavigation:)))\n            .map { a in try castOrThrow(WKNavigation.self, a[1]) }\n    }\n\n    /// Reactive wrapper for `navigationDelegate` message.\n    public var didFinishLoad: Observable<WKNavigation> {\n        navigationDelegate\n            .methodInvoked(#selector(WKNavigationDelegate.webView(_:didFinish:)))\n            .map { a in try castOrThrow(WKNavigation.self, a[1]) }\n    }\n\n    /// Reactive wrapper for `navigationDelegate` message.\n    public var didFailLoad: Observable<(WKNavigation, Error)> {\n        navigationDelegate\n            .methodInvoked(#selector(WKNavigationDelegate.webView(_:didFail:withError:)))\n            .map { a in\n                (\n                    try castOrThrow(WKNavigation.self, a[1]),\n                    try castOrThrow(Error.self, a[2])\n                )\n            }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift",
    "content": "//\n//  NSButton+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n\nimport RxSwift\nimport Cocoa\n\nextension Reactive where Base: NSButton {\n    \n    /// Reactive wrapper for control event.\n    public var tap: ControlEvent<Void> {\n        self.controlEvent\n    }\n    \n    /// Reactive wrapper for `state` property`.\n    public var state: ControlProperty<NSControl.StateValue> {\n        return self.base.rx.controlProperty(\n            getter: { control in\n                return control.state\n            }, setter: { (control: NSButton, state: NSControl.StateValue) in\n                control.state = state\n            }\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSControl+Rx.swift",
    "content": "//\n//  NSControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n\nimport Cocoa\nimport RxSwift\n\nprivate var rx_value_key: UInt8 = 0\nprivate var rx_control_events_key: UInt8 = 0\n\nextension Reactive where Base: NSControl {\n\n    /// Reactive wrapper for control event.\n    public var controlEvent: ControlEvent<()> {\n        MainScheduler.ensureRunningOnMainThread()\n\n        let source = self.lazyInstanceObservable(&rx_control_events_key) { () -> Observable<Void> in\n            Observable.create { [weak control = self.base] observer in\n                MainScheduler.ensureRunningOnMainThread()\n\n                guard let control = control else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n\n                let observer = ControlTarget(control: control) { _ in\n                    observer.on(.next(()))\n                }\n                \n                return observer\n            }\n            .take(until: self.deallocated)\n\t\t\t.share()\n        }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Creates a `ControlProperty` that is triggered by target/action pattern value updates.\n    ///\n    /// - parameter getter: Property value getter.\n    /// - parameter setter: Property value setter.\n    public func controlProperty<T>(\n        getter: @escaping (Base) -> T,\n        setter: @escaping (Base, T) -> Void\n    ) -> ControlProperty<T> {\n        MainScheduler.ensureRunningOnMainThread()\n\n        let source = self.base.rx.lazyInstanceObservable(&rx_value_key) { () -> Observable<()> in\n                return Observable.create { [weak weakControl = self.base] (observer: AnyObserver<()>) in\n                    guard let control = weakControl else {\n                        observer.on(.completed)\n                        return Disposables.create()\n                    }\n\n                    observer.on(.next(()))\n\n                    let observer = ControlTarget(control: control) { _ in\n                        if weakControl != nil {\n                            observer.on(.next(()))\n                        }\n                    }\n\n                    return observer\n                }\n                .take(until: self.deallocated)\n                .share(replay: 1, scope: .whileConnected)\n            }\n            .flatMap { [weak base] _ -> Observable<T> in\n                guard let control = base else { return Observable.empty() }\n                return Observable.just(getter(control))\n            }\n\n        let bindingObserver = Binder(self.base, binding: setter)\n\n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n}\n\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift",
    "content": "//\n//  NSSlider+Rx.swift\n//  RxCocoa\n//\n//  Created by Junior B. on 24/05/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n\nimport RxSwift\nimport Cocoa\n\nextension Reactive where Base: NSSlider {\n    \n    /// Reactive wrapper for `value` property.\n    public var value: ControlProperty<Double> {\n        return self.base.rx.controlProperty(\n            getter: { control -> Double in\n                return control.doubleValue\n            },\n            setter: { control, value in\n                control.doubleValue = value\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSTextField+Rx.swift",
    "content": "//\n//  NSTextField+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n\nimport Cocoa\nimport RxSwift\n\n/// Delegate proxy for `NSTextField`.\n///\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTextFieldDelegateProxy\n    : DelegateProxy<NSTextField, NSTextFieldDelegate>\n    , DelegateProxyType \n    , NSTextFieldDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var textField: NSTextField?\n\n    /// Initializes `RxTextFieldDelegateProxy`\n    ///\n    /// - parameter textField: Parent object for delegate proxy.\n    init(textField: NSTextField) {\n        self.textField = textField\n        super.init(parentObject: textField, delegateProxy: RxTextFieldDelegateProxy.self)\n    }\n\n    public static func registerKnownImplementations() {\n        self.register { RxTextFieldDelegateProxy(textField: $0) }\n    }\n\n    fileprivate let textSubject = PublishSubject<String?>()\n\n    // MARK: Delegate methods\n    open func controlTextDidChange(_ notification: Notification) {\n        let textField: NSTextField = castOrFatalError(notification.object)\n        let nextValue = textField.stringValue\n        self.textSubject.on(.next(nextValue))\n        _forwardToDelegate?.controlTextDidChange?(notification)\n    }\n    \n    // MARK: Delegate proxy methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func currentDelegate(for object: ParentObject) -> NSTextFieldDelegate? {\n        object.delegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func setCurrentDelegate(_ delegate: NSTextFieldDelegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n    \n}\n\nextension Reactive where Base: NSTextField {\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<NSTextField, NSTextFieldDelegate> {\n        RxTextFieldDelegateProxy.proxy(for: self.base)\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var text: ControlProperty<String?> {\n        let delegate = RxTextFieldDelegateProxy.proxy(for: self.base)\n        \n        let source = Observable.deferred { [weak textField = self.base] in\n            delegate.textSubject.startWith(textField?.stringValue)\n        }.take(until: self.deallocated)\n\n        let observer = Binder(self.base) { (control, value: String?) in\n            control.stringValue = value ?? \"\"\n        }\n\n        return ControlProperty(values: source, valueSink: observer.asObserver())\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSTextView+Rx.swift",
    "content": "//\n//  NSTextView+Rx.swift\n//  RxCocoa\n//\n//  Created by Cee on 8/5/18.\n//  Copyright © 2018 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n\nimport Cocoa\nimport RxSwift\n\n/// Delegate proxy for `NSTextView`.\n///\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTextViewDelegateProxy: DelegateProxy<NSTextView, NSTextViewDelegate>, DelegateProxyType, NSTextViewDelegate {\n\n    #if compiler(>=5.2)\n    /// Typed parent object.\n    /// \n    /// - note: Since Swift 5.2 and Xcode 11.4, Apple have suddenly\n    ///         disallowed using `weak` for NSTextView. For more details\n    ///         see this GitHub Issue: https://git.io/JvSRn\n    public private(set) var textView: NSTextView?\n    #else\n    /// Typed parent object.\n    public weak private(set) var textView: NSTextView?\n    #endif\n\n    /// Initializes `RxTextViewDelegateProxy`\n    ///\n    /// - parameter textView: Parent object for delegate proxy.\n    init(textView: NSTextView) {\n        self.textView = textView\n        super.init(parentObject: textView, delegateProxy: RxTextViewDelegateProxy.self)\n    }\n\n    public static func registerKnownImplementations() {\n        self.register { RxTextViewDelegateProxy(textView: $0) }\n    }\n\n    fileprivate let textSubject = PublishSubject<String>()\n\n    // MARK: Delegate methods\n\n    open func textDidChange(_ notification: Notification) {\n        let textView: NSTextView = castOrFatalError(notification.object)\n        let nextValue = textView.string\n        self.textSubject.on(.next(nextValue))\n        self._forwardToDelegate?.textDidChange?(notification)\n    }\n\n    // MARK: Delegate proxy methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func currentDelegate(for object: ParentObject) -> NSTextViewDelegate? {\n        object.delegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func setCurrentDelegate(_ delegate: NSTextViewDelegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n\n}\n\nextension Reactive where Base: NSTextView {\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<NSTextView, NSTextViewDelegate> {\n        RxTextViewDelegateProxy.proxy(for: self.base)\n    }\n\n    /// Reactive wrapper for `string` property.\n    public var string: ControlProperty<String> {\n        let delegate = RxTextViewDelegateProxy.proxy(for: self.base)\n\n        let source = Observable.deferred { [weak textView = self.base] in\n            delegate.textSubject.startWith(textView?.string ?? \"\")\n        }.take(until: self.deallocated)\n\n        let observer = Binder(self.base) { control, value in\n            control.string = value\n        }\n\n        return ControlProperty(values: source, valueSink: observer.asObserver())\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift",
    "content": "//\n//  NSView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 12/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS)\n    import Cocoa\n    import RxSwift\n\n    extension Reactive where Base: NSView {\n        /// Bindable sink for `alphaValue` property.\n        public var alpha: Binder<CGFloat> {\n            return Binder(self.base) { view, value in\n                view.alphaValue = value\n            }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxRelay/LICENSE.md",
    "content": "**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/RxRelay/README.md",
    "content": "<p align=\"center\">\n<img src=\"assets/RxSwift_Logo.png\" width=\"35%\" alt=\"RxSwift Logo\" />\n<br />\n<a href=\"https://actions-badge.atrox.dev/ReactiveX/RxSwift/goto\" target=\"_blank\"><img src=\"https://github.com/ReactiveX/RxSwift/workflows/RxSwift/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n<img src=\"https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg\" alt=\"Supported Platforms: iOS, macOS, tvOS, watchOS & Linux\" />\n<br />\n<a href=\"https://cocoapods.org/pods/RxSwift\" alt=\"RxSwift on CocoaPods\" title=\"RxSwift on CocoaPods\"><img src=\"https://img.shields.io/cocoapods/v/RxSwift.svg\" /></a>\n<a href=\"https://github.com/Carthage/Carthage\" alt=\"RxSwift on Carthage\" title=\"RxSwift on Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" /></a>\n<a href=\"https://github.com/apple/swift-package-manager\" alt=\"RxSwift on Swift Package Manager\" title=\"RxSwift on Swift Package Manager\"><img src=\"https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg\" /></a>\n</p>\n\nRx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface, which lets you broadcast and subscribe to values and other events from an `Observable` stream.  \n\nRxSwift is the Swift-specific implementation of the [Reactive Extensions](http://reactivex.io) standard.\n\n<p align=\"center\"><img src=\"assets/example.png\" width=\"55%\" alt=\"RxSwift Observable Example of a price constantly changing and updating the app's UI\" /></p>\n\nWhile this version aims to stay true to the original spirit and naming conventions of Rx, this projects also aims to provide a true Swift-first API for Rx APIs.\n\nCross platform documentation can be found on [ReactiveX.io](http://reactivex.io/).\n\nLike other Rx implementation, RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of `Observable` objects and a suite of methods to transform and compose these pieces of asynchronous work.\n\nKVO observation, async operations, UI Events and other streams of data are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.\n\n## I came here because I want to ...\n\n###### ... understand\n\n* [why use rx?](Documentation/Why.md)\n* [the basics, getting started with RxSwift](Documentation/GettingStarted.md)\n* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, and `ControlProperty` ... and why do they exist?\n* [testing](Documentation/UnitTests.md)\n* [tips and common errors](Documentation/Tips.md)\n* [debugging](Documentation/GettingStarted.md#debugging)\n* [the math behind Rx](Documentation/MathBehindRx.md)\n* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)\n\n###### ... install\n\n* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation)\n\n###### ... hack around\n\n* with the example app. [Running Example App](Documentation/ExampleApp.md)\n* with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)\n\n###### ... interact\n\n* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[Join Slack Channel](http://slack.rxswift.org)\n* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)\n* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)\n* Help out [Check out contribution guide](CONTRIBUTING.md)\n\n###### ... compare\n\n* [with Combine and ReactiveSwift](Documentation/ComparisonWithOtherLibraries.md).\n\n###### ... understand the structure\n\nRxSwift is as compositional as the asynchronous work it drives. The core unit is RxSwift itself, while other dependencies can be added for UI Work, testing, and more.\n\nIt comprises five separate components depending on each other in the following way:\n\n```none\n┌──────────────┐    ┌──────────────┐\n│   RxCocoa    ├────▶   RxRelay    │\n└───────┬──────┘    └──────┬───────┘\n        │                  │        \n┌───────▼──────────────────▼───────┐\n│             RxSwift              │\n└───────▲──────────────────▲───────┘\n        │                  │        \n┌───────┴──────┐    ┌──────┴───────┐\n│    RxTest    │    │  RxBlocking  │\n└──────────────┘    └──────────────┘\n```\n\n* **RxSwift**: The core of RxSwift, providing the Rx standard as (mostly) defined by [ReactiveX](https://reactivex.io). It has no other dependencies.\n* **RxCocoa**: Provides Cocoa-specific capabilities for general iOS/macOS/watchOS & tvOS app development, such as Shared Sequences, Traits, and much more. It depends on both `RxSwift` and `RxRelay`.\n* **RxRelay**: Provides `PublishRelay`, `BehaviorRelay` and `ReplayRelay`, three [simple wrappers around Subjects](https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Subjects.md#relays). It depends on `RxSwift`. \n* **RxTest** and **RxBlocking**: Provides testing capabilities for Rx-based systems. It depends on `RxSwift`.\n\n## Usage\n\n<table>\n  <tr>\n    <th width=\"30%\">Here's an example</th>\n    <th width=\"30%\">In Action</th>\n  </tr>\n  <tr>\n    <td>Define search for GitHub repositories ...</td>\n    <th rowspan=\"9\"><img src=\"https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif\"></th>\n  </tr>\n  <tr>\n    <td><div class=\"highlight highlight-source-swift\"><pre>\nlet searchResults = searchBar.rx.text.orEmpty\n    .throttle(.milliseconds(300), scheduler: MainScheduler.instance)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> Observable&lt;[Repository]&gt; in\n        if query.isEmpty {\n            return .just([])\n        }\n        return searchGitHub(query)\n            .catchAndReturn([])\n    }\n    .observe(on: MainScheduler.instance)</pre></div></td>\n  </tr>\n  <tr>\n    <td>... then bind the results to your tableview</td>\n  </tr>\n  <tr>\n    <td width=\"30%\"><div class=\"highlight highlight-source-swift\"><pre>\nsearchResults\n    .bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) {\n        (index, repository: Repository, cell) in\n        cell.textLabel?.text = repository.name\n        cell.detailTextLabel?.text = repository.url\n    }\n    .disposed(by: disposeBag)</pre></div></td>\n  </tr>\n</table>\n\n\n## Requirements\n\n* Xcode 12.x\n* Swift 5.x\n\nFor Xcode 11 and below, [use RxSwift 5.x](https://github.com/ReactiveX/RxSwift/releases/tag/5.1.1).\n\n## Installation\n\nRxSwift doesn't contain any external dependencies.\n\nThese are currently the supported installation options:\n\n### Manual\n\nOpen Rx.xcworkspace, choose `RxExample` and hit run. This method will build everything and run the sample app\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'RxSwift', '6.2.0'\n    pod 'RxCocoa', '6.2.0'\nend\n\n# RxTest and RxBlocking make the most sense in the context of unit/integration tests\ntarget 'YOUR_TESTING_TARGET' do\n    pod 'RxBlocking', '6.2.0'\n    pod 'RxTest', '6.2.0'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n### XCFrameworks\n\nEach release starting with RxSwift 6 includes `*.xcframework` framework binaries.\n\nSimply drag the needed framework binaries to your **Frameworks, Libraries, and Embedded Content** section under your target's **General** tab.\n\n> **Note**: If you're using `RxCocoa`, be sure to also drag **RxCocoaRuntime.xcframework** before importing `RxCocoa`.\n\n<img src=\"https://raw.githubusercontent.com/ReactiveX/RxSwift/main/assets/xcframeworks.png\" alt=\"XCFrameworks instructions\" width=\"65%\">\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\nAdd this to `Cartfile`\n\n```\ngithub \"ReactiveX/RxSwift\" \"6.2.0\"\n```\n\n```bash\n$ carthage update\n```\n\n#### Carthage as a Static Library\n\nCarthage defaults to building RxSwift as a Dynamic Library. \n\nIf you wish to build RxSwift as a Static Library using Carthage you may use the script below to manually modify the framework type before building with Carthage:\n\n```bash\ncarthage update RxSwift --platform iOS --no-build\nsed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj\ncarthage build RxSwift --platform iOS\n```\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\n> **Note**: There is a critical cross-dependency bug affecting many projects including RxSwift in Swift Package Manager. We've [filed a bug (SR-12303)](https://bugs.swift.org/browse/SR-12303) in early 2020 but have no answer yet. Your mileage may vary. A partial workaround can be found [here](https://github.com/ReactiveX/RxSwift/issues/2127#issuecomment-717830502).\n\nCreate a `Package.swift` file.\n\n```swift\n// swift-tools-version:5.0\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"RxTestProject\",\n  dependencies: [\n    .package(url: \"https://github.com/ReactiveX/RxSwift.git\", .exact(\"6.2.0\"))\n  ],\n  targets: [\n    .target(name: \"RxTestProject\", dependencies: [\"RxSwift\", \"RxCocoa\"])\n  ]\n)\n```\n\n```bash\n$ swift build\n```\n\nTo build or test a module with RxTest dependency, set `TEST=1`.\n\n```bash\n$ TEST=1 swift test\n```\n\n### Manually using git submodules\n\n* Add RxSwift as a submodule\n\n```bash\n$ git submodule add git@github.com:ReactiveX/RxSwift.git\n```\n\n* Drag `Rx.xcodeproj` into Project Navigator\n* Go to `Project > Targets > Build Phases > Link Binary With Libraries`, click `+` and select `RxSwift`, `RxCocoa` and `RxRelay` targets\n\n## References\n\n* [http://reactivex.io/](http://reactivex.io/)\n* [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)\n* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift-reactive-programming-with-swift)\n* [RxSwift: Debunking the myth of hard (YouTube)](https://www.youtube.com/watch?v=GdvLP0ZAhhc)\n* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)\n* [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)\n* [Reactive Programming Overview (Jafar Husain from Netflix)](https://youtu.be/-8Y1-lE6NSA)\n* [Subject/Observer is Dual to Iterator (paper)](http://csl.stanford.edu/~christos/pldi2010.fit/meijer.duality.pdf)\n* [Rx standard sequence operators visualized (visualization tool)](http://rxmarbles.com/)\n* [Haskell](https://www.haskell.org/)\n"
  },
  {
    "path": "Pods/RxRelay/RxRelay/BehaviorRelay.swift",
    "content": "//\n//  BehaviorRelay.swift\n//  RxRelay\n//\n//  Created by Krunoslav Zaher on 10/7/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/// BehaviorRelay is a wrapper for `BehaviorSubject`.\n///\n/// Unlike `BehaviorSubject` it can't terminate with error or completed.\npublic final class BehaviorRelay<Element>: ObservableType {\n    private let subject: BehaviorSubject<Element>\n\n    /// Accepts `event` and emits it to subscribers\n    public func accept(_ event: Element) {\n        self.subject.onNext(event)\n    }\n\n    /// Current value of behavior subject\n    public var value: Element {\n        // this try! is ok because subject can't error out or be disposed\n        return try! self.subject.value()\n    }\n\n    /// Initializes behavior relay with initial value.\n    public init(value: Element) {\n        self.subject = BehaviorSubject(value: value)\n    }\n\n    /// Subscribes observer\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.subject.subscribe(observer)\n    }\n\n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<Element> {\n        self.subject.asObservable()\n    }\n}\n"
  },
  {
    "path": "Pods/RxRelay/RxRelay/Observable+Bind.swift",
    "content": "//\n//  Observable+Bind.swift\n//  RxRelay\n//\n//  Created by Shai Mishali on 09/04/2019.\n//  Copyright © 2019 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\nextension ObservableType {\n    /**\n     Creates new subscription and sends elements to publish relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target publish relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: PublishRelay<Element>...) -> Disposable {\n        bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to publish relay(s).\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter to: Target publish relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: PublishRelay<Element?>...) -> Disposable {\n        self.map { $0 as Element? }.bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to publish relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target publish relays for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    private func bind(to relays: [PublishRelay<Element>]) -> Disposable {\n        subscribe { e in\n            switch e {\n            case let .next(element):\n                relays.forEach {\n                    $0.accept(element)\n                }\n            case let .error(error):\n                rxFatalErrorInDebug(\"Binding error to publish relay: \\(error)\")\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to behavior relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target behavior relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: BehaviorRelay<Element>...) -> Disposable {\n        self.bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to behavior relay(s).\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter to: Target behavior relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: BehaviorRelay<Element?>...) -> Disposable {\n        self.map { $0 as Element? }.bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to behavior relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target behavior relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    private func bind(to relays: [BehaviorRelay<Element>]) -> Disposable {\n        subscribe { e in\n            switch e {\n            case let .next(element):\n                relays.forEach {\n                    $0.accept(element)\n                }\n            case let .error(error):\n                rxFatalErrorInDebug(\"Binding error to behavior relay: \\(error)\")\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to replay relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target replay relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: ReplayRelay<Element>...) -> Disposable {\n        self.bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to replay relay(s).\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter to: Target replay relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to relays: ReplayRelay<Element?>...) -> Disposable {\n        self.map { $0 as Element? }.bind(to: relays)\n    }\n\n    /**\n     Creates new subscription and sends elements to replay relay(s).\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n     - parameter to: Target replay relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    private func bind(to relays: [ReplayRelay<Element>]) -> Disposable {\n        subscribe { e in\n            switch e {\n            case let .next(element):\n                relays.forEach {\n                    $0.accept(element)\n                }\n            case let .error(error):\n                rxFatalErrorInDebug(\"Binding error to behavior relay: \\(error)\")\n            case .completed:\n                break\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxRelay/RxRelay/PublishRelay.swift",
    "content": "//\n//  PublishRelay.swift\n//  RxRelay\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/// PublishRelay is a wrapper for `PublishSubject`.\n///\n/// Unlike `PublishSubject` it can't terminate with error or completed.\npublic final class PublishRelay<Element>: ObservableType {\n    private let subject: PublishSubject<Element>\n    \n    // Accepts `event` and emits it to subscribers\n    public func accept(_ event: Element) {\n        self.subject.onNext(event)\n    }\n    \n    /// Initializes with internal empty subject.\n    public init() {\n        self.subject = PublishSubject()\n    }\n\n    /// Subscribes observer\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.subject.subscribe(observer)\n    }\n    \n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<Element> {\n        self.subject.asObservable()\n    }\n}\n"
  },
  {
    "path": "Pods/RxRelay/RxRelay/ReplayRelay.swift",
    "content": "//\n//  ReplayRelay.swift\n//  RxRelay\n//\n//  Created by Zsolt Kovacs on 12/22/19.\n//  Copyright © 2019 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/// ReplayRelay is a wrapper for `ReplaySubject`.\n///\n/// Unlike `ReplaySubject` it can't terminate with an error or complete.\npublic final class ReplayRelay<Element>: ObservableType {\n    private let subject: ReplaySubject<Element>\n\n    // Accepts `event` and emits it to subscribers\n    public func accept(_ event: Element) {\n        self.subject.onNext(event)\n    }\n\n    private init(subject: ReplaySubject<Element>) {\n        self.subject = subject\n    }\n\n    /// Creates new instance of `ReplayRelay` that replays at most `bufferSize` last elements sent to it.\n    ///\n    /// - parameter bufferSize: Maximal number of elements to replay to observers after subscription.\n    /// - returns: New instance of replay relay.\n    public static func create(bufferSize: Int) -> ReplayRelay<Element> {\n        ReplayRelay(subject: ReplaySubject.create(bufferSize: bufferSize))\n    }\n\n    /// Creates a new instance of `ReplayRelay` that buffers all the sent to it.\n    /// To avoid filling up memory, developer needs to make sure that the use case will only ever store a 'reasonable'\n    /// number of elements.\n    public static func createUnbound() -> ReplayRelay<Element> {\n        ReplayRelay(subject: ReplaySubject.createUnbounded())\n    }\n\n    /// Subscribes observer\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.subject.subscribe(observer)\n    }\n\n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<Element> {\n        self.subject.asObserver()\n    }\n}\n"
  },
  {
    "path": "Pods/RxRelay/RxRelay/Utils.swift",
    "content": "//\n//  Utils.swift\n//  RxRelay\n//\n//  Created by Shai Mishali on 09/04/2019.\n//  Copyright © 2019 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nfunc rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {\n    #if DEBUG\n    fatalError(lastMessage(), file: file, line: line)\n    #else\n    print(\"\\(file):\\(line): \\(lastMessage())\")\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/LICENSE.md",
    "content": "**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/RxSwift/Platform/AtomicInt.swift",
    "content": "//\n//  AtomicInt.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 10/28/18.\n//  Copyright © 2018 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nfinal class AtomicInt: NSLock {\n    fileprivate var value: Int32\n    public init(_ value: Int32 = 0) {\n        self.value = value\n    }\n}\n\n@discardableResult\n@inline(__always)\nfunc add(_ this: AtomicInt, _ value: Int32) -> Int32 {\n    this.lock()\n    let oldValue = this.value\n    this.value += value\n    this.unlock()\n    return oldValue\n}\n\n@discardableResult\n@inline(__always)\nfunc sub(_ this: AtomicInt, _ value: Int32) -> Int32 {\n    this.lock()\n    let oldValue = this.value\n    this.value -= value\n    this.unlock()\n    return oldValue\n}\n\n@discardableResult\n@inline(__always)\nfunc fetchOr(_ this: AtomicInt, _ mask: Int32) -> Int32 {\n    this.lock()\n    let oldValue = this.value\n    this.value |= mask\n    this.unlock()\n    return oldValue\n}\n\n@inline(__always)\nfunc load(_ this: AtomicInt) -> Int32 {\n    this.lock()\n    let oldValue = this.value\n    this.unlock()\n    return oldValue\n}\n\n@discardableResult\n@inline(__always)\nfunc increment(_ this: AtomicInt) -> Int32 {\n    add(this, 1)\n}\n\n@discardableResult\n@inline(__always)\nfunc decrement(_ this: AtomicInt) -> Int32 {\n    sub(this, 1)\n}\n\n@inline(__always)\nfunc isFlagSet(_ this: AtomicInt, _ mask: Int32) -> Bool {\n    (load(this) & mask) != 0\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/Bag.swift",
    "content": "//\n//  Bag.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Swift\n\nlet arrayDictionaryMaxSize = 30\n\nstruct BagKey {\n    /**\n    Unique identifier for object added to `Bag`.\n     \n    It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz,\n     it would take ~150 years of continuous running time for it to overflow.\n    */\n    fileprivate let rawValue: UInt64\n}\n\n/**\nData structure that represents a bag of elements typed `T`.\n\nSingle element can be stored multiple times.\n\nTime and space complexity of insertion and deletion is O(n). \n\nIt is suitable for storing small number of elements.\n*/\nstruct Bag<T> : CustomDebugStringConvertible {\n    /// Type of identifier for inserted elements.\n    typealias KeyType = BagKey\n    \n    typealias Entry = (key: BagKey, value: T)\n \n    private var _nextKey: BagKey = BagKey(rawValue: 0)\n\n    // data\n\n    // first fill inline variables\n    var _key0: BagKey?\n    var _value0: T?\n\n    // then fill \"array dictionary\"\n    var _pairs = ContiguousArray<Entry>()\n\n    // last is sparse dictionary\n    var _dictionary: [BagKey: T]?\n\n    var _onlyFastPath = true\n\n    /// Creates new empty `Bag`.\n    init() {\n    }\n    \n    /**\n    Inserts `value` into bag.\n    \n    - parameter element: Element to insert.\n    - returns: Key that can be used to remove element from bag.\n    */\n    mutating func insert(_ element: T) -> BagKey {\n        let key = _nextKey\n\n        _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1)\n\n        if _key0 == nil {\n            _key0 = key\n            _value0 = element\n            return key\n        }\n\n        _onlyFastPath = false\n\n        if _dictionary != nil {\n            _dictionary![key] = element\n            return key\n        }\n\n        if _pairs.count < arrayDictionaryMaxSize {\n            _pairs.append((key: key, value: element))\n            return key\n        }\n        \n        _dictionary = [key: element]\n        \n        return key\n    }\n    \n    /// - returns: Number of elements in bag.\n    var count: Int {\n        let dictionaryCount: Int = _dictionary?.count ?? 0\n        return (_value0 != nil ? 1 : 0) + _pairs.count + dictionaryCount\n    }\n    \n    /// Removes all elements from bag and clears capacity.\n    mutating func removeAll() {\n        _key0 = nil\n        _value0 = nil\n\n        _pairs.removeAll(keepingCapacity: false)\n        _dictionary?.removeAll(keepingCapacity: false)\n    }\n    \n    /**\n    Removes element with a specific `key` from bag.\n    \n    - parameter key: Key that identifies element to remove from bag.\n    - returns: Element that bag contained, or nil in case element was already removed.\n    */\n    mutating func removeKey(_ key: BagKey) -> T? {\n        if _key0 == key {\n            _key0 = nil\n            let value = _value0!\n            _value0 = nil\n            return value\n        }\n\n        if let existingObject = _dictionary?.removeValue(forKey: key) {\n            return existingObject\n        }\n\n        for i in 0 ..< _pairs.count where _pairs[i].key == key {\n            let value = _pairs[i].value\n            _pairs.remove(at: i)\n            return value\n        }\n\n        return nil\n    }\n}\n\nextension Bag {\n    /// A textual representation of `self`, suitable for debugging.\n    var debugDescription : String {\n        \"\\(self.count) elements in Bag\"\n    }\n}\n\nextension Bag {\n    /// Enumerates elements inside the bag.\n    ///\n    /// - parameter action: Enumeration closure.\n    func forEach(_ action: (T) -> Void) {\n        if _onlyFastPath {\n            if let value0 = _value0 {\n                action(value0)\n            }\n            return\n        }\n\n        let value0 = _value0\n        let dictionary = _dictionary\n\n        if let value0 = value0 {\n            action(value0)\n        }\n\n        for i in 0 ..< _pairs.count {\n            action(_pairs[i].value)\n        }\n\n        if dictionary?.count ?? 0 > 0 {\n            for element in dictionary!.values {\n                action(element)\n            }\n        }\n    }\n}\n\nextension BagKey: Hashable {\n    func hash(into hasher: inout Hasher) {\n        hasher.combine(rawValue)\n    }\n}\n\nfunc ==(lhs: BagKey, rhs: BagKey) -> Bool {\n    lhs.rawValue == rhs.rawValue\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift",
    "content": "//\n//  InfiniteSequence.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence that repeats `repeatedValue` infinite number of times.\nstruct InfiniteSequence<Element> : Sequence {\n    typealias Iterator = AnyIterator<Element>\n    \n    private let repeatedValue: Element\n    \n    init(repeatedValue: Element) {\n        self.repeatedValue = repeatedValue\n    }\n    \n    func makeIterator() -> Iterator {\n        let repeatedValue = self.repeatedValue\n        return AnyIterator { repeatedValue }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift",
    "content": "//\n//  PriorityQueue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct PriorityQueue<Element> {\n    private let hasHigherPriority: (Element, Element) -> Bool\n    private let isEqual: (Element, Element) -> Bool\n\n    private var elements = [Element]()\n\n    init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) {\n        self.hasHigherPriority = hasHigherPriority\n        self.isEqual = isEqual\n    }\n\n    mutating func enqueue(_ element: Element) {\n        elements.append(element)\n        bubbleToHigherPriority(elements.count - 1)\n    }\n\n    func peek() -> Element? {\n        elements.first\n    }\n\n    var isEmpty: Bool {\n        elements.count == 0\n    }\n\n    mutating func dequeue() -> Element? {\n        guard let front = peek() else {\n            return nil\n        }\n\n        removeAt(0)\n\n        return front\n    }\n\n    mutating func remove(_ element: Element) {\n        for i in 0 ..< elements.count {\n            if self.isEqual(elements[i], element) {\n                removeAt(i)\n                return\n            }\n        }\n    }\n\n    private mutating func removeAt(_ index: Int) {\n        let removingLast = index == elements.count - 1\n        if !removingLast {\n            elements.swapAt(index, elements.count - 1)\n        }\n\n        _ = elements.popLast()\n\n        if !removingLast {\n            bubbleToHigherPriority(index)\n            bubbleToLowerPriority(index)\n        }\n    }\n\n    private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n\n        while unbalancedIndex > 0 {\n            let parentIndex = (unbalancedIndex - 1) / 2\n            guard self.hasHigherPriority(elements[unbalancedIndex], elements[parentIndex]) else { break }\n            elements.swapAt(unbalancedIndex, parentIndex)\n            unbalancedIndex = parentIndex\n        }\n    }\n\n    private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n        while true {\n            let leftChildIndex = unbalancedIndex * 2 + 1\n            let rightChildIndex = unbalancedIndex * 2 + 2\n\n            var highestPriorityIndex = unbalancedIndex\n\n            if leftChildIndex < elements.count && self.hasHigherPriority(elements[leftChildIndex], elements[highestPriorityIndex]) {\n                highestPriorityIndex = leftChildIndex\n            }\n\n            if rightChildIndex < elements.count && self.hasHigherPriority(elements[rightChildIndex], elements[highestPriorityIndex]) {\n                highestPriorityIndex = rightChildIndex\n            }\n\n            guard highestPriorityIndex != unbalancedIndex else { break }\n            elements.swapAt(highestPriorityIndex, unbalancedIndex)\n\n            unbalancedIndex = highestPriorityIndex\n        }\n    }\n}\n\nextension PriorityQueue : CustomDebugStringConvertible {\n    var debugDescription: String {\n        elements.debugDescription\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/Queue.swift",
    "content": "//\n//  Queue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nData structure that represents queue.\n\nComplexity of `enqueue`, `dequeue` is O(1) when number of operations is\naveraged over N operations.\n\nComplexity of `peek` is O(1).\n*/\nstruct Queue<T>: Sequence {\n    /// Type of generator.\n    typealias Generator = AnyIterator<T>\n\n    private let resizeFactor = 2\n    \n    private var storage: ContiguousArray<T?>\n    private var innerCount = 0\n    private var pushNextIndex = 0\n    private let initialCapacity: Int\n\n    /**\n    Creates new queue.\n    \n    - parameter capacity: Capacity of newly created queue.\n    */\n    init(capacity: Int) {\n        initialCapacity = capacity\n\n        storage = ContiguousArray<T?>(repeating: nil, count: capacity)\n    }\n    \n    private var dequeueIndex: Int {\n        let index = pushNextIndex - count\n        return index < 0 ? index + storage.count : index\n    }\n    \n    /// - returns: Is queue empty.\n    var isEmpty: Bool { count == 0 }\n    \n    /// - returns: Number of elements inside queue.\n    var count: Int { innerCount }\n    \n    /// - returns: Element in front of a list of elements to `dequeue`.\n    func peek() -> T {\n        precondition(count > 0)\n        \n        return storage[dequeueIndex]!\n    }\n    \n    mutating private func resizeTo(_ size: Int) {\n        var newStorage = ContiguousArray<T?>(repeating: nil, count: size)\n        \n        let count = self.count\n        \n        let dequeueIndex = self.dequeueIndex\n        let spaceToEndOfQueue = storage.count - dequeueIndex\n        \n        // first batch is from dequeue index to end of array\n        let countElementsInFirstBatch = Swift.min(count, spaceToEndOfQueue)\n        // second batch is wrapped from start of array to end of queue\n        let numberOfElementsInSecondBatch = count - countElementsInFirstBatch\n        \n        newStorage[0 ..< countElementsInFirstBatch] = storage[dequeueIndex ..< (dequeueIndex + countElementsInFirstBatch)]\n        newStorage[countElementsInFirstBatch ..< (countElementsInFirstBatch + numberOfElementsInSecondBatch)] = storage[0 ..< numberOfElementsInSecondBatch]\n        \n        self.innerCount = count\n        pushNextIndex = count\n        storage = newStorage\n    }\n    \n    /// Enqueues `element`.\n    ///\n    /// - parameter element: Element to enqueue.\n    mutating func enqueue(_ element: T) {\n        if count == storage.count {\n            resizeTo(Swift.max(storage.count, 1) * resizeFactor)\n        }\n        \n        storage[pushNextIndex] = element\n        pushNextIndex += 1\n        innerCount += 1\n        \n        if pushNextIndex >= storage.count {\n            pushNextIndex -= storage.count\n        }\n    }\n    \n    private mutating func dequeueElementOnly() -> T {\n        precondition(count > 0)\n        \n        let index = dequeueIndex\n\n        defer {\n            storage[index] = nil\n            innerCount -= 1\n        }\n\n        return storage[index]!\n    }\n\n    /// Dequeues element or throws an exception in case queue is empty.\n    ///\n    /// - returns: Dequeued element.\n    mutating func dequeue() -> T? {\n        if self.count == 0 {\n            return nil\n        }\n\n        defer {\n            let downsizeLimit = storage.count / (resizeFactor * resizeFactor)\n            if count < downsizeLimit && downsizeLimit >= initialCapacity {\n                resizeTo(storage.count / resizeFactor)\n            }\n        }\n\n        return dequeueElementOnly()\n    }\n    \n    /// - returns: Generator of contained elements.\n    func makeIterator() -> AnyIterator<T> {\n        var i = dequeueIndex\n        var innerCount = count\n\n        return AnyIterator {\n            if innerCount == 0 {\n                return nil\n            }\n\n            defer {\n                innerCount -= 1\n                i += 1\n            }\n\n            if i >= self.storage.count {\n                i -= self.storage.count\n            }\n\n            return self.storage[i]\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DispatchQueue+Extensions.swift",
    "content": "//\n//  DispatchQueue+Extensions.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 10/22/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n\nextension DispatchQueue {\n    private static var token: DispatchSpecificKey<()> = {\n        let key = DispatchSpecificKey<()>()\n        DispatchQueue.main.setSpecific(key: key, value: ())\n        return key\n    }()\n\n    static var isMain: Bool {\n        DispatchQueue.getSpecific(key: token) != nil\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/Platform.Darwin.swift",
    "content": "//\n//  Platform.Darwin.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)\n\n    import Darwin\n    import Foundation\n\n    extension Thread {\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying) {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n        }\n\n        static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n            \n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/Platform/Platform.Linux.swift",
    "content": "//\n//  Platform.Linux.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(Linux)\n\n    import Foundation\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: String) {\n            if let newValue = value {\n                Thread.current.threadDictionary[key] = newValue\n            }\n            else {\n                Thread.current.threadDictionary[key] = nil\n            }\n        }\n\n        static func getThreadLocalStorageValueForKey<T: AnyObject>(_ key: String) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/Platform/RecursiveLock.swift",
    "content": "//\n//  RecursiveLock.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/18/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n#if TRACE_RESOURCES\n    class RecursiveLock: NSRecursiveLock {\n        override init() {\n            _ = Resources.incrementTotal()\n            super.init()\n        }\n\n        override func lock() {\n            super.lock()\n            _ = Resources.incrementTotal()\n        }\n\n        override func unlock() {\n            super.unlock()\n            _ = Resources.decrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    }\n#else\n    typealias RecursiveLock = NSRecursiveLock\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/README.md",
    "content": "<p align=\"center\">\n<img src=\"assets/RxSwift_Logo.png\" width=\"35%\" alt=\"RxSwift Logo\" />\n<br />\n<a href=\"https://actions-badge.atrox.dev/ReactiveX/RxSwift/goto\" target=\"_blank\"><img src=\"https://github.com/ReactiveX/RxSwift/workflows/RxSwift/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n<img src=\"https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg\" alt=\"Supported Platforms: iOS, macOS, tvOS, watchOS & Linux\" />\n<br />\n<a href=\"https://cocoapods.org/pods/RxSwift\" alt=\"RxSwift on CocoaPods\" title=\"RxSwift on CocoaPods\"><img src=\"https://img.shields.io/cocoapods/v/RxSwift.svg\" /></a>\n<a href=\"https://github.com/Carthage/Carthage\" alt=\"RxSwift on Carthage\" title=\"RxSwift on Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\" /></a>\n<a href=\"https://github.com/apple/swift-package-manager\" alt=\"RxSwift on Swift Package Manager\" title=\"RxSwift on Swift Package Manager\"><img src=\"https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg\" /></a>\n</p>\n\nRx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface, which lets you broadcast and subscribe to values and other events from an `Observable` stream.  \n\nRxSwift is the Swift-specific implementation of the [Reactive Extensions](http://reactivex.io) standard.\n\n<p align=\"center\"><img src=\"assets/example.png\" width=\"55%\" alt=\"RxSwift Observable Example of a price constantly changing and updating the app's UI\" /></p>\n\nWhile this version aims to stay true to the original spirit and naming conventions of Rx, this projects also aims to provide a true Swift-first API for Rx APIs.\n\nCross platform documentation can be found on [ReactiveX.io](http://reactivex.io/).\n\nLike other Rx implementation, RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of `Observable` objects and a suite of methods to transform and compose these pieces of asynchronous work.\n\nKVO observation, async operations, UI Events and other streams of data are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.\n\n## I came here because I want to ...\n\n###### ... understand\n\n* [why use rx?](Documentation/Why.md)\n* [the basics, getting started with RxSwift](Documentation/GettingStarted.md)\n* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, and `ControlProperty` ... and why do they exist?\n* [testing](Documentation/UnitTests.md)\n* [tips and common errors](Documentation/Tips.md)\n* [debugging](Documentation/GettingStarted.md#debugging)\n* [the math behind Rx](Documentation/MathBehindRx.md)\n* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)\n\n###### ... install\n\n* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation)\n\n###### ... hack around\n\n* with the example app. [Running Example App](Documentation/ExampleApp.md)\n* with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)\n\n###### ... interact\n\n* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[Join Slack Channel](http://slack.rxswift.org)\n* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)\n* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)\n* Help out [Check out contribution guide](CONTRIBUTING.md)\n\n###### ... compare\n\n* [with Combine and ReactiveSwift](Documentation/ComparisonWithOtherLibraries.md).\n\n###### ... understand the structure\n\nRxSwift is as compositional as the asynchronous work it drives. The core unit is RxSwift itself, while other dependencies can be added for UI Work, testing, and more.\n\nIt comprises five separate components depending on each other in the following way:\n\n```none\n┌──────────────┐    ┌──────────────┐\n│   RxCocoa    ├────▶   RxRelay    │\n└───────┬──────┘    └──────┬───────┘\n        │                  │        \n┌───────▼──────────────────▼───────┐\n│             RxSwift              │\n└───────▲──────────────────▲───────┘\n        │                  │        \n┌───────┴──────┐    ┌──────┴───────┐\n│    RxTest    │    │  RxBlocking  │\n└──────────────┘    └──────────────┘\n```\n\n* **RxSwift**: The core of RxSwift, providing the Rx standard as (mostly) defined by [ReactiveX](https://reactivex.io). It has no other dependencies.\n* **RxCocoa**: Provides Cocoa-specific capabilities for general iOS/macOS/watchOS & tvOS app development, such as Shared Sequences, Traits, and much more. It depends on both `RxSwift` and `RxRelay`.\n* **RxRelay**: Provides `PublishRelay`, `BehaviorRelay` and `ReplayRelay`, three [simple wrappers around Subjects](https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Subjects.md#relays). It depends on `RxSwift`. \n* **RxTest** and **RxBlocking**: Provides testing capabilities for Rx-based systems. It depends on `RxSwift`.\n\n## Usage\n\n<table>\n  <tr>\n    <th width=\"30%\">Here's an example</th>\n    <th width=\"30%\">In Action</th>\n  </tr>\n  <tr>\n    <td>Define search for GitHub repositories ...</td>\n    <th rowspan=\"9\"><img src=\"https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif\"></th>\n  </tr>\n  <tr>\n    <td><div class=\"highlight highlight-source-swift\"><pre>\nlet searchResults = searchBar.rx.text.orEmpty\n    .throttle(.milliseconds(300), scheduler: MainScheduler.instance)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> Observable&lt;[Repository]&gt; in\n        if query.isEmpty {\n            return .just([])\n        }\n        return searchGitHub(query)\n            .catchAndReturn([])\n    }\n    .observe(on: MainScheduler.instance)</pre></div></td>\n  </tr>\n  <tr>\n    <td>... then bind the results to your tableview</td>\n  </tr>\n  <tr>\n    <td width=\"30%\"><div class=\"highlight highlight-source-swift\"><pre>\nsearchResults\n    .bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) {\n        (index, repository: Repository, cell) in\n        cell.textLabel?.text = repository.name\n        cell.detailTextLabel?.text = repository.url\n    }\n    .disposed(by: disposeBag)</pre></div></td>\n  </tr>\n</table>\n\n\n## Requirements\n\n* Xcode 12.x\n* Swift 5.x\n\nFor Xcode 11 and below, [use RxSwift 5.x](https://github.com/ReactiveX/RxSwift/releases/tag/5.1.1).\n\n## Installation\n\nRxSwift doesn't contain any external dependencies.\n\nThese are currently the supported installation options:\n\n### Manual\n\nOpen Rx.xcworkspace, choose `RxExample` and hit run. This method will build everything and run the sample app\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'RxSwift', '6.2.0'\n    pod 'RxCocoa', '6.2.0'\nend\n\n# RxTest and RxBlocking make the most sense in the context of unit/integration tests\ntarget 'YOUR_TESTING_TARGET' do\n    pod 'RxBlocking', '6.2.0'\n    pod 'RxTest', '6.2.0'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n### XCFrameworks\n\nEach release starting with RxSwift 6 includes `*.xcframework` framework binaries.\n\nSimply drag the needed framework binaries to your **Frameworks, Libraries, and Embedded Content** section under your target's **General** tab.\n\n> **Note**: If you're using `RxCocoa`, be sure to also drag **RxCocoaRuntime.xcframework** before importing `RxCocoa`.\n\n<img src=\"https://raw.githubusercontent.com/ReactiveX/RxSwift/main/assets/xcframeworks.png\" alt=\"XCFrameworks instructions\" width=\"65%\">\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\nAdd this to `Cartfile`\n\n```\ngithub \"ReactiveX/RxSwift\" \"6.2.0\"\n```\n\n```bash\n$ carthage update\n```\n\n#### Carthage as a Static Library\n\nCarthage defaults to building RxSwift as a Dynamic Library. \n\nIf you wish to build RxSwift as a Static Library using Carthage you may use the script below to manually modify the framework type before building with Carthage:\n\n```bash\ncarthage update RxSwift --platform iOS --no-build\nsed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/RxSwift/Rx.xcodeproj/project.pbxproj\ncarthage build RxSwift --platform iOS\n```\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\n> **Note**: There is a critical cross-dependency bug affecting many projects including RxSwift in Swift Package Manager. We've [filed a bug (SR-12303)](https://bugs.swift.org/browse/SR-12303) in early 2020 but have no answer yet. Your mileage may vary. A partial workaround can be found [here](https://github.com/ReactiveX/RxSwift/issues/2127#issuecomment-717830502).\n\nCreate a `Package.swift` file.\n\n```swift\n// swift-tools-version:5.0\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"RxTestProject\",\n  dependencies: [\n    .package(url: \"https://github.com/ReactiveX/RxSwift.git\", .exact(\"6.2.0\"))\n  ],\n  targets: [\n    .target(name: \"RxTestProject\", dependencies: [\"RxSwift\", \"RxCocoa\"])\n  ]\n)\n```\n\n```bash\n$ swift build\n```\n\nTo build or test a module with RxTest dependency, set `TEST=1`.\n\n```bash\n$ TEST=1 swift test\n```\n\n### Manually using git submodules\n\n* Add RxSwift as a submodule\n\n```bash\n$ git submodule add git@github.com:ReactiveX/RxSwift.git\n```\n\n* Drag `Rx.xcodeproj` into Project Navigator\n* Go to `Project > Targets > Build Phases > Link Binary With Libraries`, click `+` and select `RxSwift`, `RxCocoa` and `RxRelay` targets\n\n## References\n\n* [http://reactivex.io/](http://reactivex.io/)\n* [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)\n* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift-reactive-programming-with-swift)\n* [RxSwift: Debunking the myth of hard (YouTube)](https://www.youtube.com/watch?v=GdvLP0ZAhhc)\n* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)\n* [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)\n* [Reactive Programming Overview (Jafar Husain from Netflix)](https://youtu.be/-8Y1-lE6NSA)\n* [Subject/Observer is Dual to Iterator (paper)](http://csl.stanford.edu/~christos/pldi2010.fit/meijer.duality.pdf)\n* [Rx standard sequence operators visualized (visualization tool)](http://rxmarbles.com/)\n* [Haskell](https://www.haskell.org/)\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/AnyObserver.swift",
    "content": "//\n//  AnyObserver.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// A type-erased `ObserverType`.\n///\n/// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type.\npublic struct AnyObserver<Element> : ObserverType {\n    /// Anonymous event handler type.\n    public typealias EventHandler = (Event<Element>) -> Void\n\n    private let observer: EventHandler\n\n    /// Construct an instance whose `on(event)` calls `eventHandler(event)`\n    ///\n    /// - parameter eventHandler: Event handler that observes sequences events.\n    public init(eventHandler: @escaping EventHandler) {\n        self.observer = eventHandler\n    }\n    \n    /// Construct an instance whose `on(event)` calls `observer.on(event)`\n    ///\n    /// - parameter observer: Observer that receives sequence events.\n    public init<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {\n        self.observer = observer.on\n    }\n    \n    /// Send `event` to this observer.\n    ///\n    /// - parameter event: Event instance.\n    public func on(_ event: Event<Element>) {\n        self.observer(event)\n    }\n\n    /// Erases type of observer and returns canonical observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<Element> {\n        self\n    }\n}\n\nextension AnyObserver {\n    /// Collection of `AnyObserver`s\n    typealias s = Bag<(Event<Element>) -> Void>\n}\n\nextension ObserverType {\n    /// Erases type of observer and returns canonical observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<Element> {\n        AnyObserver(self)\n    }\n\n    /// Transforms observer of type R to type E using custom transform method.\n    /// Each event sent to result observer is transformed and sent to `self`.\n    ///\n    /// - returns: observer that transforms events.\n    public func mapObserver<Result>(_ transform: @escaping (Result) throws -> Element) -> AnyObserver<Result> {\n        AnyObserver { e in\n            self.on(e.map(transform))\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Binder.swift",
    "content": "//\n//  Binder.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/17/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/**\n Observer that enforces interface binding rules:\n * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged)\n * ensures binding is performed on a specific scheduler\n\n `Binder` doesn't retain target and in case target is released, element isn't bound.\n \n By default it binds elements on main scheduler.\n */\npublic struct Binder<Value>: ObserverType {\n    public typealias Element = Value\n    \n    private let binding: (Event<Value>) -> Void\n\n    /// Initializes `Binder`\n    ///\n    /// - parameter target: Target object.\n    /// - parameter scheduler: Scheduler used to bind the events.\n    /// - parameter binding: Binding logic.\n    public init<Target: AnyObject>(_ target: Target, scheduler: ImmediateSchedulerType = MainScheduler(), binding: @escaping (Target, Value) -> Void) {\n        weak var weakTarget = target\n\n        self.binding = { event in\n            switch event {\n            case .next(let element):\n                _ = scheduler.schedule(element) { element in\n                    if let target = weakTarget {\n                        binding(target, element)\n                    }\n                    return Disposables.create()\n                }\n            case .error(let error):\n                rxFatalErrorInDebug(\"Binding error: \\(error)\")\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /// Binds next element to owner view as described in `binding`.\n    public func on(_ event: Event<Value>) {\n        self.binding(event)\n    }\n\n    /// Erases type of observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<Value> {\n        AnyObserver(eventHandler: self.on)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Cancelable.swift",
    "content": "//\n//  Cancelable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents disposable resource with state tracking.\npublic protocol Cancelable : Disposable {\n    /// Was resource disposed.\n    var isDisposed: Bool { get }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift",
    "content": "//\n//  AsyncLock.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nIn case nobody holds this lock, the work will be queued and executed immediately\non thread that is requesting lock.\n\nIn case there is somebody currently holding that lock, action will be enqueued.\nWhen owned of the lock finishes with it's processing, it will also execute\nand pending work.\n\nThat means that enqueued work could possibly be executed later on a different thread.\n*/\nfinal class AsyncLock<I: InvocableType>\n    : Disposable\n    , Lock\n    , SynchronizedDisposeType {\n    typealias Action = () -> Void\n    \n    private var _lock = SpinLock()\n    \n    private var queue: Queue<I> = Queue(capacity: 0)\n\n    private var isExecuting: Bool = false\n    private var hasFaulted: Bool = false\n\n    // lock {\n    func lock() {\n        self._lock.lock()\n    }\n\n    func unlock() {\n        self._lock.unlock()\n    }\n    // }\n\n    private func enqueue(_ action: I) -> I? {\n        self.lock(); defer { self.unlock() }\n        if self.hasFaulted {\n            return nil\n        }\n        \n        if self.isExecuting {\n            self.queue.enqueue(action)\n            return nil\n        }\n        \n        self.isExecuting = true\n        \n        return action\n    }\n\n    private func dequeue() -> I? {\n        self.lock(); defer { self.unlock() }\n        if !self.queue.isEmpty {\n            return self.queue.dequeue()\n        }\n        else {\n            self.isExecuting = false\n            return nil\n        }\n    }\n\n    func invoke(_ action: I) {\n        let firstEnqueuedAction = self.enqueue(action)\n        \n        if let firstEnqueuedAction = firstEnqueuedAction {\n            firstEnqueuedAction.invoke()\n        }\n        else {\n            // action is enqueued, it's somebody else's concern now\n            return\n        }\n        \n        while true {\n            let nextAction = self.dequeue()\n\n            if let nextAction = nextAction {\n                nextAction.invoke()\n            }\n            else {\n                return\n            }\n        }\n    }\n    \n    func dispose() {\n        self.synchronizedDispose()\n    }\n\n    func synchronized_dispose() {\n        self.queue = Queue(capacity: 0)\n        self.hasFaulted = true\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/Lock.swift",
    "content": "//\n//  Lock.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol Lock {\n    func lock()\n    func unlock()\n}\n\n// https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html\ntypealias SpinLock = RecursiveLock\n\nextension RecursiveLock : Lock {\n    @inline(__always)\n    final func performLocked<T>(_ action: () -> T) -> T {\n        self.lock(); defer { self.unlock() }\n        return action()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift",
    "content": "//\n//  LockOwnerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol LockOwnerType: AnyObject, Lock {\n    var lock: RecursiveLock { get }\n}\n\nextension LockOwnerType {\n    func lock() { self.lock.lock() }\n    func unlock() { self.lock.unlock() }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift",
    "content": "//\n//  SynchronizedDisposeType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedDisposeType: AnyObject, Disposable, Lock {\n    func synchronized_dispose()\n}\n\nextension SynchronizedDisposeType {\n    func synchronizedDispose() {\n        self.lock(); defer { self.unlock() }\n        self.synchronized_dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift",
    "content": "//\n//  SynchronizedOnType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedOnType: AnyObject, ObserverType, Lock {\n    func synchronized_on(_ event: Event<Element>)\n}\n\nextension SynchronizedOnType {\n    func synchronizedOn(_ event: Event<Element>) {\n        self.lock(); defer { self.unlock() }\n        self.synchronized_on(event)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift",
    "content": "//\n//  SynchronizedUnsubscribeType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedUnsubscribeType: AnyObject {\n    associatedtype DisposeKey\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey)\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ConnectableObservableType.swift",
    "content": "//\n//  ConnectableObservableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nRepresents an observable sequence wrapper that can be connected and disconnected from its underlying observable sequence.\n*/\npublic protocol ConnectableObservableType : ObservableType {\n    /**\n    Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.\n    \n    - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.\n    */\n    func connect() -> Disposable\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Date+Dispatch.swift",
    "content": "//\n//  Date+Dispatch.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/14/19.\n//  Copyright © 2019 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\nextension DispatchTimeInterval {\n    var convertToSecondsFactor: Double {\n        switch self {\n        case .nanoseconds: return 1_000_000_000.0\n        case .microseconds: return 1_000_000.0\n        case .milliseconds: return 1_000.0\n        case .seconds: return 1.0\n        case .never: fatalError()\n        @unknown default: fatalError()\n        }\n    }\n \n    func map(_ transform: (Int, Double) -> Int) -> DispatchTimeInterval {\n        switch self {\n        case .nanoseconds(let value): return .nanoseconds(transform(value, 1_000_000_000.0))\n        case .microseconds(let value): return .microseconds(transform(value, 1_000_000.0))\n        case .milliseconds(let value): return .milliseconds(transform(value, 1_000.0))\n        case .seconds(let value): return .seconds(transform(value, 1.0))\n        case .never: return .never\n        @unknown default: fatalError()\n        }\n    }\n    \n    var isNow: Bool {\n        switch self {\n        case .nanoseconds(let value), .microseconds(let value), .milliseconds(let value), .seconds(let value): return value == 0\n        case .never: return false\n        @unknown default: fatalError()\n        }\n    }\n    \n    internal func reduceWithSpanBetween(earlierDate: Date, laterDate: Date) -> DispatchTimeInterval {\n        return self.map { value, factor in\n            let interval = laterDate.timeIntervalSince(earlierDate)\n            let remainder = Double(value) - interval * factor\n            guard remainder > 0 else { return 0 }\n            return Int(remainder.rounded(.toNearestOrAwayFromZero))\n        }\n    }\n}\n\nextension Date {\n\n    internal func addingDispatchInterval(_ dispatchInterval: DispatchTimeInterval) -> Date {\n        switch dispatchInterval {\n        case .nanoseconds(let value), .microseconds(let value), .milliseconds(let value), .seconds(let value):\n            return self.addingTimeInterval(TimeInterval(value) / dispatchInterval.convertToSecondsFactor)\n        case .never: return Date.distantFuture\n        @unknown default: fatalError()\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposable.swift",
    "content": "//\n//  Disposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource.\npublic protocol Disposable {\n    /// Dispose resource.\n    func dispose()\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift",
    "content": "//\n//  AnonymousDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an Action-based disposable.\n///\n/// When dispose method is called, disposal action will be dereferenced.\nprivate final class AnonymousDisposable : DisposeBase, Cancelable {\n    public typealias DisposeAction = () -> Void\n\n    private let disposed = AtomicInt(0)\n    private var disposeAction: DisposeAction?\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        isFlagSet(self.disposed, 1)\n    }\n\n    /// Constructs a new disposable with the given action used for disposal.\n    ///\n    /// - parameter disposeAction: Disposal action which will be run upon calling `dispose`.\n    private init(_ disposeAction: @escaping DisposeAction) {\n        self.disposeAction = disposeAction\n        super.init()\n    }\n\n    // Non-deprecated version of the constructor, used by `Disposables.create(with:)`\n    fileprivate init(disposeAction: @escaping DisposeAction) {\n        self.disposeAction = disposeAction\n        super.init()\n    }\n\n    /// Calls the disposal action if and only if the current instance hasn't been disposed yet.\n    ///\n    /// After invoking disposal action, disposal action will be dereferenced.\n    fileprivate func dispose() {\n        if fetchOr(self.disposed, 1) == 0 {\n            if let action = self.disposeAction {\n                self.disposeAction = nil\n                action()\n            }\n        }\n    }\n}\n\nextension Disposables {\n\n    /// Constructs a new disposable with the given action used for disposal.\n    ///\n    /// - parameter dispose: Disposal action which will be run upon calling `dispose`.\n    public static func create(with dispose: @escaping () -> Void) -> Cancelable {\n        AnonymousDisposable(disposeAction: dispose)\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift",
    "content": "//\n//  BinaryDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents two disposable resources that are disposed together.\nprivate final class BinaryDisposable : DisposeBase, Cancelable {\n\n    private let disposed = AtomicInt(0)\n\n    // state\n    private var disposable1: Disposable?\n    private var disposable2: Disposable?\n\n    /// - returns: Was resource disposed.\n    var isDisposed: Bool {\n        isFlagSet(self.disposed, 1)\n    }\n\n    /// Constructs new binary disposable from two disposables.\n    ///\n    /// - parameter disposable1: First disposable\n    /// - parameter disposable2: Second disposable\n    init(_ disposable1: Disposable, _ disposable2: Disposable) {\n        self.disposable1 = disposable1\n        self.disposable2 = disposable2\n        super.init()\n    }\n\n    /// Calls the disposal action if and only if the current instance hasn't been disposed yet.\n    ///\n    /// After invoking disposal action, disposal action will be dereferenced.\n    func dispose() {\n        if fetchOr(self.disposed, 1) == 0 {\n            self.disposable1?.dispose()\n            self.disposable2?.dispose()\n            self.disposable1 = nil\n            self.disposable2 = nil\n        }\n    }\n}\n\nextension Disposables {\n\n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable {\n        BinaryDisposable(disposable1, disposable2)\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift",
    "content": "//\n//  BooleanDisposable.swift\n//  RxSwift\n//\n//  Created by Junior B. on 10/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource that can be checked for disposal status.\npublic final class BooleanDisposable : Cancelable {\n\n    internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true)\n    private var disposed = false\n    \n    /// Initializes a new instance of the `BooleanDisposable` class\n    public init() {\n    }\n    \n    /// Initializes a new instance of the `BooleanDisposable` class with given value\n    public init(isDisposed: Bool) {\n        self.disposed = isDisposed\n    }\n    \n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        self.disposed\n    }\n    \n    /// Sets the status to disposed, which can be observer through the `isDisposed` property.\n    public func dispose() {\n        self.disposed = true\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift",
    "content": "//\n//  CompositeDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a group of disposable resources that are disposed together.\npublic final class CompositeDisposable : DisposeBase, Cancelable {\n    /// Key used to remove disposable from composite disposable\n    public struct DisposeKey {\n        fileprivate let key: BagKey\n        fileprivate init(key: BagKey) {\n            self.key = key\n        }\n    }\n\n    private var lock = SpinLock()\n    \n    // state\n    private var disposables: Bag<Disposable>? = Bag()\n\n    public var isDisposed: Bool {\n        self.lock.performLocked { self.disposables == nil }\n    }\n    \n    public override init() {\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        _ = self.disposables!.insert(disposable1)\n        _ = self.disposables!.insert(disposable2)\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        _ = self.disposables!.insert(disposable1)\n        _ = self.disposables!.insert(disposable2)\n        _ = self.disposables!.insert(disposable3)\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposable4: Disposable, _ disposables: Disposable...) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        _ = self.disposables!.insert(disposable1)\n        _ = self.disposables!.insert(disposable2)\n        _ = self.disposables!.insert(disposable3)\n        _ = self.disposables!.insert(disposable4)\n        \n        for disposable in disposables {\n            _ = self.disposables!.insert(disposable)\n        }\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(disposables: [Disposable]) {\n        for disposable in disposables {\n            _ = self.disposables!.insert(disposable)\n        }\n    }\n\n    /**\n     Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n     \n     - parameter disposable: Disposable to add.\n     - returns: Key that can be used to remove disposable from composite disposable. In case dispose bag was already\n     disposed `nil` will be returned.\n     */\n    public func insert(_ disposable: Disposable) -> DisposeKey? {\n        let key = self._insert(disposable)\n        \n        if key == nil {\n            disposable.dispose()\n        }\n        \n        return key\n    }\n    \n    private func _insert(_ disposable: Disposable) -> DisposeKey? {\n        self.lock.performLocked {\n            let bagKey = self.disposables?.insert(disposable)\n            return bagKey.map(DisposeKey.init)\n        }\n    }\n    \n    /// - returns: Gets the number of disposables contained in the `CompositeDisposable`.\n    public var count: Int {\n        self.lock.performLocked { self.disposables?.count ?? 0 }\n    }\n    \n    /// Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable.\n    ///\n    /// - parameter disposeKey: Key used to identify disposable to be removed.\n    public func remove(for disposeKey: DisposeKey) {\n        self._remove(for: disposeKey)?.dispose()\n    }\n    \n    private func _remove(for disposeKey: DisposeKey) -> Disposable? {\n        self.lock.performLocked { self.disposables?.removeKey(disposeKey.key) }\n    }\n    \n    /// Disposes all disposables in the group and removes them from the group.\n    public func dispose() {\n        if let disposables = self._dispose() {\n            disposeAll(in: disposables)\n        }\n    }\n\n    private func _dispose() -> Bag<Disposable>? {\n        self.lock.performLocked {\n            let current = self.disposables\n            self.disposables = nil\n            return current\n        }\n    }\n}\n\nextension Disposables {\n\n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable {\n        CompositeDisposable(disposable1, disposable2, disposable3)\n    }\n    \n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable {\n        var disposables = disposables\n        disposables.append(disposable1)\n        disposables.append(disposable2)\n        disposables.append(disposable3)\n        return CompositeDisposable(disposables: disposables)\n    }\n    \n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposables: [Disposable]) -> Cancelable {\n        switch disposables.count {\n        case 2:\n            return Disposables.create(disposables[0], disposables[1])\n        default:\n            return CompositeDisposable(disposables: disposables)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/Disposables.swift",
    "content": "//\n//  Disposables.swift\n//  RxSwift\n//\n//  Created by Mohsen Ramezanpoor on 01/08/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n/// A collection of utility methods for common disposable operations.\npublic struct Disposables {\n    private init() {}\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift",
    "content": "//\n//  DisposeBag.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension Disposable {\n    /// Adds `self` to `bag`\n    ///\n    /// - parameter bag: `DisposeBag` to add `self` to.\n    public func disposed(by bag: DisposeBag) {\n        bag.insert(self)\n    }\n}\n\n/**\nThread safe bag that disposes added disposables on `deinit`.\n\nThis returns ARC (RAII) like resource management to `RxSwift`.\n\nIn case contained disposables need to be disposed, just put a different dispose bag\nor create a new one in its place.\n\n    self.existingDisposeBag = DisposeBag()\n\nIn case explicit disposal is necessary, there is also `CompositeDisposable`.\n*/\npublic final class DisposeBag: DisposeBase {\n    \n    private var lock = SpinLock()\n    \n    // state\n    private var disposables = [Disposable]()\n    private var isDisposed = false\n    \n    /// Constructs new empty dispose bag.\n    public override init() {\n        super.init()\n    }\n\n    /// Adds `disposable` to be disposed when dispose bag is being deinited.\n    ///\n    /// - parameter disposable: Disposable to add.\n    public func insert(_ disposable: Disposable) {\n        self._insert(disposable)?.dispose()\n    }\n    \n    private func _insert(_ disposable: Disposable) -> Disposable? {\n        self.lock.performLocked {\n            if self.isDisposed {\n                return disposable\n            }\n\n            self.disposables.append(disposable)\n\n            return nil\n        }\n    }\n\n    /// This is internal on purpose, take a look at `CompositeDisposable` instead.\n    private func dispose() {\n        let oldDisposables = self._dispose()\n\n        for disposable in oldDisposables {\n            disposable.dispose()\n        }\n    }\n\n    private func _dispose() -> [Disposable] {\n        self.lock.performLocked {\n            let disposables = self.disposables\n            \n            self.disposables.removeAll(keepingCapacity: false)\n            self.isDisposed = true\n            \n            return disposables\n        }\n    }\n    \n    deinit {\n        self.dispose()\n    }\n}\n\nextension DisposeBag {\n    /// Convenience init allows a list of disposables to be gathered for disposal.\n    public convenience init(disposing disposables: Disposable...) {\n        self.init()\n        self.disposables += disposables\n    }\n\n    /// Convenience init which utilizes a function builder to let you pass in a list of\n    /// disposables to make a DisposeBag of.\n    public convenience init(@DisposableBuilder builder: () -> [Disposable]) {\n      self.init(disposing: builder())\n    }\n\n    /// Convenience init allows an array of disposables to be gathered for disposal.\n    public convenience init(disposing disposables: [Disposable]) {\n        self.init()\n        self.disposables += disposables\n    }\n\n    /// Convenience function allows a list of disposables to be gathered for disposal.\n    public func insert(_ disposables: Disposable...) {\n        self.insert(disposables)\n    }\n\n    /// Convenience function allows a list of disposables to be gathered for disposal.\n    public func insert(@DisposableBuilder builder: () -> [Disposable]) {\n        self.insert(builder())\n    }\n\n    /// Convenience function allows an array of disposables to be gathered for disposal.\n    public func insert(_ disposables: [Disposable]) {\n        self.lock.performLocked {\n            if self.isDisposed {\n                disposables.forEach { $0.dispose() }\n            } else {\n                self.disposables += disposables\n            }\n        }\n    }\n\n    /// A function builder accepting a list of Disposables and returning them as an array.\n    #if swift(>=5.4)\n    @resultBuilder\n    public struct DisposableBuilder {\n      public static func buildBlock(_ disposables: Disposable...) -> [Disposable] {\n        return disposables\n      }\n    }\n    #else\n    @_functionBuilder\n    public struct DisposableBuilder {\n      public static func buildBlock(_ disposables: Disposable...) -> [Disposable] {\n        return disposables\n      }\n    }\n    #endif\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift",
    "content": "//\n//  DisposeBase.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Base class for all disposables.\npublic class DisposeBase {\n    init() {\n#if TRACE_RESOURCES\n    _ = Resources.incrementTotal()\n#endif\n    }\n    \n    deinit {\n#if TRACE_RESOURCES\n    _ = Resources.decrementTotal()\n#endif\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift",
    "content": "//\n//  NopDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable that does nothing on disposal.\n///\n/// Nop = No Operation\nprivate struct NopDisposable : Disposable {\n \n    fileprivate static let noOp: Disposable = NopDisposable()\n    \n    private init() {\n        \n    }\n    \n    /// Does nothing.\n    public func dispose() {\n    }\n}\n\nextension Disposables {\n    /**\n     Creates a disposable that does nothing on disposal.\n     */\n    static public func create() -> Disposable { NopDisposable.noOp }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift",
    "content": "//\n//  RefCountDisposable.swift\n//  RxSwift\n//\n//  Created by Junior B. on 10/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\npublic final class RefCountDisposable : DisposeBase, Cancelable {\n    private var lock = SpinLock()\n    private var disposable = nil as Disposable?\n    private var primaryDisposed = false\n    private var count = 0\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        self.lock.performLocked { self.disposable == nil }\n    }\n\n    /// Initializes a new instance of the `RefCountDisposable`.\n    public init(disposable: Disposable) {\n        self.disposable = disposable\n        super.init()\n    }\n\n    /**\n     Holds a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n\n     When getter is called, a dependent disposable contributing to the reference count that manages the underlying disposable's lifetime is returned.\n     */\n    public func retain() -> Disposable {\n        self.lock.performLocked {\n            if self.disposable != nil {\n                do {\n                    _ = try incrementChecked(&self.count)\n                } catch {\n                    rxFatalError(\"RefCountDisposable increment failed\")\n                }\n\n                return RefCountInnerDisposable(self)\n            } else {\n                return Disposables.create()\n            }\n        }\n    }\n\n    /// Disposes the underlying disposable only when all dependent disposables have been disposed.\n    public func dispose() {\n        let oldDisposable: Disposable? = self.lock.performLocked {\n            if let oldDisposable = self.disposable, !self.primaryDisposed {\n                self.primaryDisposed = true\n\n                if self.count == 0 {\n                    self.disposable = nil\n                    return oldDisposable\n                }\n            }\n\n            return nil\n        }\n\n        if let disposable = oldDisposable {\n            disposable.dispose()\n        }\n    }\n\n    fileprivate func release() {\n        let oldDisposable: Disposable? = self.lock.performLocked {\n            if let oldDisposable = self.disposable {\n                do {\n                    _ = try decrementChecked(&self.count)\n                } catch {\n                    rxFatalError(\"RefCountDisposable decrement on release failed\")\n                }\n\n                guard self.count >= 0 else {\n                    rxFatalError(\"RefCountDisposable counter is lower than 0\")\n                }\n\n                if self.primaryDisposed && self.count == 0 {\n                    self.disposable = nil\n                    return oldDisposable\n                }\n            }\n\n            return nil\n        }\n\n        if let disposable = oldDisposable {\n            disposable.dispose()\n        }\n    }\n}\n\ninternal final class RefCountInnerDisposable: DisposeBase, Disposable\n{\n    private let parent: RefCountDisposable\n    private let isDisposed = AtomicInt(0)\n\n    init(_ parent: RefCountDisposable) {\n        self.parent = parent\n        super.init()\n    }\n\n    internal func dispose()\n    {\n        if fetchOr(self.isDisposed, 1) == 0 {\n            self.parent.release()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift",
    "content": "//\n//  ScheduledDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprivate let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { sd in\n    sd.disposeInner()\n    return Disposables.create()\n}\n\n/// Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler.\npublic final class ScheduledDisposable : Cancelable {\n    public let scheduler: ImmediateSchedulerType\n\n    private let disposed = AtomicInt(0)\n\n    // state\n    private var disposable: Disposable?\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        isFlagSet(self.disposed, 1)\n    }\n\n    /**\n    Initializes a new instance of the `ScheduledDisposable` that uses a `scheduler` on which to dispose the `disposable`.\n\n    - parameter scheduler: Scheduler where the disposable resource will be disposed on.\n    - parameter disposable: Disposable resource to dispose on the given scheduler.\n    */\n    public init(scheduler: ImmediateSchedulerType, disposable: Disposable) {\n        self.scheduler = scheduler\n        self.disposable = disposable\n    }\n\n    /// Disposes the wrapped disposable on the provided scheduler.\n    public func dispose() {\n        _ = self.scheduler.schedule(self, action: disposeScheduledDisposable)\n    }\n\n    func disposeInner() {\n        if fetchOr(self.disposed, 1) == 0 {\n            self.disposable!.dispose()\n            self.disposable = nil\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift",
    "content": "//\n//  SerialDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource.\npublic final class SerialDisposable : DisposeBase, Cancelable {\n    private var lock = SpinLock()\n    \n    // state\n    private var current = nil as Disposable?\n    private var disposed = false\n    \n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        self.disposed\n    }\n    \n    /// Initializes a new instance of the `SerialDisposable`.\n    override public init() {\n        super.init()\n    }\n    \n    /**\n    Gets or sets the underlying disposable.\n    \n    Assigning this property disposes the previous disposable object.\n    \n    If the `SerialDisposable` has already been disposed, assignment to this property causes immediate disposal of the given disposable object.\n    */\n    public var disposable: Disposable {\n        get {\n            self.lock.performLocked {\n                self.current ?? Disposables.create()\n            }\n        }\n        set (newDisposable) {\n            let disposable: Disposable? = self.lock.performLocked {\n                if self.isDisposed {\n                    return newDisposable\n                }\n                else {\n                    let toDispose = self.current\n                    self.current = newDisposable\n                    return toDispose\n                }\n            }\n            \n            if let disposable = disposable {\n                disposable.dispose()\n            }\n        }\n    }\n    \n    /// Disposes the underlying disposable as well as all future replacements.\n    public func dispose() {\n        self._dispose()?.dispose()\n    }\n\n    private func _dispose() -> Disposable? {\n        self.lock.performLocked {\n            guard !self.isDisposed else { return nil }\n\n            self.disposed = true\n            let current = self.current\n            self.current = nil\n            return current\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift",
    "content": "//\n//  SingleAssignmentDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nRepresents a disposable resource which only allows a single assignment of its underlying disposable resource.\n\nIf an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an exception.\n*/\npublic final class SingleAssignmentDisposable : DisposeBase, Cancelable {\n\n    private enum DisposeState: Int32 {\n        case disposed = 1\n        case disposableSet = 2\n    }\n\n    // state\n    private let state = AtomicInt(0)\n    private var disposable = nil as Disposable?\n\n    /// - returns: A value that indicates whether the object is disposed.\n    public var isDisposed: Bool {\n        isFlagSet(self.state, DisposeState.disposed.rawValue)\n    }\n\n    /// Initializes a new instance of the `SingleAssignmentDisposable`.\n    public override init() {\n        super.init()\n    }\n\n    /// Gets or sets the underlying disposable. After disposal, the result of getting this property is undefined.\n    ///\n    /// **Throws exception if the `SingleAssignmentDisposable` has already been assigned to.**\n    public func setDisposable(_ disposable: Disposable) {\n        self.disposable = disposable\n\n        let previousState = fetchOr(self.state, DisposeState.disposableSet.rawValue)\n\n        if (previousState & DisposeState.disposableSet.rawValue) != 0 {\n            rxFatalError(\"oldState.disposable != nil\")\n        }\n\n        if (previousState & DisposeState.disposed.rawValue) != 0 {\n            disposable.dispose()\n            self.disposable = nil\n        }\n    }\n\n    /// Disposes the underlying disposable.\n    public func dispose() {\n        let previousState = fetchOr(self.state, DisposeState.disposed.rawValue)\n\n        if (previousState & DisposeState.disposed.rawValue) != 0 {\n            return\n        }\n\n        if (previousState & DisposeState.disposableSet.rawValue) != 0 {\n            guard let disposable = self.disposable else {\n                rxFatalError(\"Disposable not set\")\n            }\n            disposable.dispose()\n            self.disposable = nil\n        }\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift",
    "content": "//\n//  SubscriptionDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct SubscriptionDisposable<T: SynchronizedUnsubscribeType> : Disposable {\n    private let key: T.DisposeKey\n    private weak var owner: T?\n\n    init(owner: T, key: T.DisposeKey) {\n        self.owner = owner\n        self.key = key\n    }\n\n    func dispose() {\n        self.owner?.synchronizedUnsubscribe(self.key)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Errors.swift",
    "content": "//\n//  Errors.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nlet RxErrorDomain       = \"RxErrorDomain\"\nlet RxCompositeFailures = \"RxCompositeFailures\"\n\n/// Generic Rx error codes.\npublic enum RxError\n    : Swift.Error\n    , CustomDebugStringConvertible {\n    /// Unknown error occurred.\n    case unknown\n    /// Performing an action on disposed object.\n    case disposed(object: AnyObject)\n    /// Arithmetic overflow error.\n    case overflow\n    /// Argument out of range error.\n    case argumentOutOfRange\n    /// Sequence doesn't contain any elements.\n    case noElements\n    /// Sequence contains more than one element.\n    case moreThanOneElement\n    /// Timeout error.\n    case timeout\n}\n\nextension RxError {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error occurred.\"\n        case .disposed(let object):\n            return \"Object `\\(object)` was already disposed.\"\n        case .overflow:\n            return \"Arithmetic overflow occurred.\"\n        case .argumentOutOfRange:\n            return \"Argument out of range.\"\n        case .noElements:\n            return \"Sequence doesn't contain any elements.\"\n        case .moreThanOneElement:\n            return \"Sequence contains more than one element.\"\n        case .timeout:\n            return \"Sequence timeout.\"\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Event.swift",
    "content": "//\n//  Event.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a sequence event.\n///\n/// Sequence grammar: \n/// **next\\* (error | completed)**\n@frozen public enum Event<Element> {\n    /// Next element is produced.\n    case next(Element)\n\n    /// Sequence terminated with an error.\n    case error(Swift.Error)\n\n    /// Sequence completed successfully.\n    case completed\n}\n\nextension Event: CustomDebugStringConvertible {\n    /// Description of event.\n    public var debugDescription: String {\n        switch self {\n        case .next(let value):\n            return \"next(\\(value))\"\n        case .error(let error):\n            return \"error(\\(error))\"\n        case .completed:\n            return \"completed\"\n        }\n    }\n}\n\nextension Event {\n    /// Is `completed` or `error` event.\n    public var isStopEvent: Bool {\n        switch self {\n        case .next: return false\n        case .error, .completed: return true\n        }\n    }\n\n    /// If `next` event, returns element value.\n    public var element: Element? {\n        if case .next(let value) = self {\n            return value\n        }\n        return nil\n    }\n\n    /// If `error` event, returns error.\n    public var error: Swift.Error? {\n        if case .error(let error) = self {\n            return error\n        }\n        return nil\n    }\n\n    /// If `completed` event, returns `true`.\n    public var isCompleted: Bool {\n        if case .completed = self {\n            return true\n        }\n        return false\n    }\n}\n\nextension Event {\n    /// Maps sequence elements using transform. If error happens during the transform, `.error`\n    /// will be returned as value.\n    public func map<Result>(_ transform: (Element) throws -> Result) -> Event<Result> {\n        do {\n            switch self {\n            case let .next(element):\n                return .next(try transform(element))\n            case let .error(error):\n                return .error(error)\n            case .completed:\n                return .completed\n            }\n        }\n        catch let e {\n            return .error(e)\n        }\n    }\n}\n\n/// A type that can be converted to `Event<Element>`.\npublic protocol EventConvertible {\n    /// Type of element in event\n    associatedtype Element\n\n    /// Event representation of this instance\n    var event: Event<Element> { get }\n}\n\nextension Event: EventConvertible {\n    /// Event representation of this instance\n    public var event: Event<Element> { self }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift",
    "content": "//\n//  Bag+Rx.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/19/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n\n// MARK: forEach\n\n@inline(__always)\nfunc dispatch<Element>(_ bag: Bag<(Event<Element>) -> Void>, _ event: Event<Element>) {\n    bag._value0?(event)\n\n    if bag._onlyFastPath {\n        return\n    }\n\n    let pairs = bag._pairs\n    for i in 0 ..< pairs.count {\n        pairs[i].value(event)\n    }\n\n    if let dictionary = bag._dictionary {\n        for element in dictionary.values {\n            element(event)\n        }\n    }\n}\n\n/// Dispatches `dispose` to all disposables contained inside bag.\nfunc disposeAll(in bag: Bag<Disposable>) {\n    bag._value0?.dispose()\n\n    if bag._onlyFastPath {\n        return\n    }\n\n    let pairs = bag._pairs\n    for i in 0 ..< pairs.count {\n        pairs[i].value.dispose()\n    }\n\n    if let dictionary = bag._dictionary {\n        for element in dictionary.values {\n            element.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/GroupedObservable.swift",
    "content": "//\n//  GroupedObservable.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 01/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an observable sequence of elements that have a common key.\npublic struct GroupedObservable<Key, Element> : ObservableType {\n    /// Gets the common key.\n    public let key: Key\n\n    private let source: Observable<Element>\n\n    /// Initializes grouped observable sequence with key and source observable sequence.\n    ///\n    /// - parameter key: Grouped observable sequence key\n    /// - parameter source: Observable sequence that represents sequence of elements for the key\n    /// - returns: Grouped observable sequence of elements for the specific key\n    public init(key: Key, source: Observable<Element>) {\n        self.key = key\n        self.source = source\n    }\n\n    /// Subscribes `observer` to receive events for this sequence.\n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.source.subscribe(observer)\n    }\n\n    /// Converts `self` to `Observable` sequence. \n    public func asObservable() -> Observable<Element> {\n        self.source\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift",
    "content": "//\n//  ImmediateSchedulerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that immediately schedules units of work.\npublic protocol ImmediateSchedulerType {\n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable\n}\n\nextension ImmediateSchedulerType {\n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func scheduleRecursive<State>(_ state: State, action: @escaping (_ state: State, _ recurse: (State) -> Void) -> Void) -> Disposable {\n        let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)\n        \n        recursiveScheduler.schedule(state)\n        \n        return Disposables.create(with: recursiveScheduler.dispose)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observable.swift",
    "content": "//\n//  Observable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// A type-erased `ObservableType`. \n///\n/// It represents a push style sequence.\npublic class Observable<Element> : ObservableType {\n    init() {\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n    }\n    \n    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        rxAbstractMethod()\n    }\n    \n    public func asObservable() -> Observable<Element> { self }\n    \n    deinit {\n#if TRACE_RESOURCES\n        _ = Resources.decrementTotal()\n#endif\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableConvertibleType.swift",
    "content": "//\n//  ObservableConvertibleType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Type that can be converted to observable sequence (`Observable<Element>`).\npublic protocol ObservableConvertibleType {\n    /// Type of elements in sequence.\n    associatedtype Element\n\n    /// Converts `self` to `Observable` sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    func asObservable() -> Observable<Element>\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableType+Extensions.swift",
    "content": "//\n//  ObservableType+Extensions.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if DEBUG\n    import Foundation\n#endif\n\nextension ObservableType {\n    /**\n     Subscribes an event handler to an observable sequence.\n     \n     - parameter on: Action to invoke for each event in the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(_ on: @escaping (Event<Element>) -> Void) -> Disposable {\n        let observer = AnonymousObserver { e in\n            on(e)\n        }\n        return self.asObservable().subscribe(observer)\n    }\n    \n    /**\n     Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.\n     \n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe<Object: AnyObject>(\n        with object: Object,\n        onNext: ((Object, Element) -> Void)? = nil,\n        onError: ((Object, Swift.Error) -> Void)? = nil,\n        onCompleted: ((Object) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        subscribe(\n            onNext: { [weak object] in\n                guard let object = object else { return }\n                onNext?(object, $0)\n            },\n            onError: { [weak object] in\n                guard let object = object else { return }\n                onError?(object, $0)\n            },\n            onCompleted: { [weak object] in\n                guard let object = object else { return }\n                onCompleted?(object)\n            },\n            onDisposed: { [weak object] in\n                guard let object = object else { return }\n                onDisposed?(object)\n            }\n        )\n    }\n    \n    /**\n     Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(\n        onNext: ((Element) -> Void)? = nil,\n        onError: ((Swift.Error) -> Void)? = nil,\n        onCompleted: (() -> Void)? = nil,\n        onDisposed: (() -> Void)? = nil\n    ) -> Disposable {\n            let disposable: Disposable\n            \n            if let disposed = onDisposed {\n                disposable = Disposables.create(with: disposed)\n            }\n            else {\n                disposable = Disposables.create()\n            }\n            \n            #if DEBUG\n                let synchronizationTracker = SynchronizationTracker()\n            #endif\n            \n            let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []\n            \n            let observer = AnonymousObserver<Element> { event in\n                \n                #if DEBUG\n                    synchronizationTracker.register(synchronizationErrorMessage: .default)\n                    defer { synchronizationTracker.unregister() }\n                #endif\n                \n                switch event {\n                case .next(let value):\n                    onNext?(value)\n                case .error(let error):\n                    if let onError = onError {\n                        onError(error)\n                    }\n                    else {\n                        Hooks.defaultErrorHandler(callStack, error)\n                    }\n                    disposable.dispose()\n                case .completed:\n                    onCompleted?()\n                    disposable.dispose()\n                }\n            }\n            return Disposables.create(\n                self.asObservable().subscribe(observer),\n                disposable\n            )\n    }\n}\n\nimport Foundation\n\nextension Hooks {\n    public typealias DefaultErrorHandler = (_ subscriptionCallStack: [String], _ error: Error) -> Void\n    public typealias CustomCaptureSubscriptionCallstack = () -> [String]\n\n    private static let lock = RecursiveLock()\n    private static var _defaultErrorHandler: DefaultErrorHandler = { subscriptionCallStack, error in\n        #if DEBUG\n            let serializedCallStack = subscriptionCallStack.joined(separator: \"\\n\")\n            print(\"Unhandled error happened: \\(error)\")\n            if !serializedCallStack.isEmpty {\n                print(\"subscription called from:\\n\\(serializedCallStack)\")\n            }\n        #endif\n    }\n    private static var _customCaptureSubscriptionCallstack: CustomCaptureSubscriptionCallstack = {\n        #if DEBUG\n            return Thread.callStackSymbols\n        #else\n            return []\n        #endif\n    }\n\n    /// Error handler called in case onError handler wasn't provided.\n    public static var defaultErrorHandler: DefaultErrorHandler {\n        get {\n            lock.performLocked { _defaultErrorHandler }\n        }\n        set {\n            lock.performLocked { _defaultErrorHandler = newValue }\n        }\n    }\n    \n    /// Subscription callstack block to fetch custom callstack information.\n    public static var customCaptureSubscriptionCallstack: CustomCaptureSubscriptionCallstack {\n        get {\n            lock.performLocked { _customCaptureSubscriptionCallstack }\n        }\n        set {\n            lock.performLocked { _customCaptureSubscriptionCallstack = newValue }\n        }\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableType.swift",
    "content": "//\n//  ObservableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a push style sequence.\npublic protocol ObservableType: ObservableConvertibleType {\n    /**\n    Subscribes `observer` to receive events for this sequence.\n    \n    ### Grammar\n    \n    **Next\\* (Error | Completed)?**\n    \n    * sequences can produce zero or more elements so zero or more `Next` events can be sent to `observer`\n    * once an `Error` or `Completed` event is sent, the sequence terminates and can't produce any other elements\n    \n    It is possible that events are sent from different threads, but no two events can be sent concurrently to\n    `observer`.\n    \n    ### Resource Management\n    \n    When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements\n    will be freed.\n    \n    To cancel production of sequence elements and free resources immediately, call `dispose` on returned\n    subscription.\n    \n    - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n    */\n    func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element\n}\n\nextension ObservableType {\n    \n    /// Default implementation of converting `ObservableType` to `Observable`.\n    public func asObservable() -> Observable<Element> {\n        // temporary workaround\n        //return Observable.create(subscribe: self.subscribe)\n        Observable.create { o in self.subscribe(o) }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AddRef.swift",
    "content": "//\n//  AddRef.swift\n//  RxSwift\n//\n//  Created by Junior B. on 30/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nfinal class AddRefSink<Observer: ObserverType> : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    \n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .completed, .error:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n}\n\nfinal class AddRef<Element> : Producer<Element> {\n    \n    private let source: Observable<Element>\n    private let refCount: RefCountDisposable\n    \n    init(source: Observable<Element>, refCount: RefCountDisposable) {\n        self.source = source\n        self.refCount = refCount\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let releaseDisposable = self.refCount.retain()\n        let sink = AddRefSink(observer: observer, cancel: cancel)\n        let subscription = Disposables.create(releaseDisposable, self.source.subscribe(sink))\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Amb.swift",
    "content": "//\n//  Amb.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Propagates the observable sequence that reacts first.\n\n     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)\n\n     - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first.\n     */\n    public static func amb<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Observable<Element>\n        where Sequence.Element == Observable<Element> {\n        sequence.reduce(Observable<Sequence.Element.Element>.never()) { a, o in\n            a.amb(o.asObservable())\n        }\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Propagates the observable sequence that reacts first.\n\n     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)\n\n     - parameter right: Second observable sequence.\n     - returns: An observable sequence that surfaces either of the given sequences, whichever reacted first.\n     */\n    public func amb<O2: ObservableType>\n        (_ right: O2)\n        -> Observable<Element> where O2.Element == Element {\n        Amb(left: self.asObservable(), right: right.asObservable())\n    }\n}\n\nprivate enum AmbState {\n    case neither\n    case left\n    case right\n}\n\nfinal private class AmbObserver<Observer: ObserverType>: ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = AmbSink<Observer>\n    typealias This = AmbObserver<Observer>\n    typealias Sink = (This, Event<Element>) -> Void\n    \n    private let parent: Parent\n    fileprivate var sink: Sink\n    fileprivate var cancel: Disposable\n    \n    init(parent: Parent, cancel: Disposable, sink: @escaping Sink) {\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n        \n        self.parent = parent\n        self.sink = sink\n        self.cancel = cancel\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.sink(self, event)\n        if event.isStopEvent {\n            self.cancel.dispose()\n        }\n    }\n    \n    deinit {\n#if TRACE_RESOURCES\n        _ = Resources.decrementTotal()\n#endif\n    }\n}\n\nfinal private class AmbSink<Observer: ObserverType>: Sink<Observer> {\n    typealias Element = Observer.Element\n    typealias Parent = Amb<Element>\n    typealias AmbObserverType = AmbObserver<Observer>\n\n    private let parent: Parent\n    \n    private let lock = RecursiveLock()\n    // state\n    private var choice = AmbState.neither\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let disposeAll = Disposables.create(subscription1, subscription2)\n        \n        let forwardEvent = { (o: AmbObserverType, event: Event<Element>) -> Void in\n            self.forwardOn(event)\n            if event.isStopEvent {\n                self.dispose()\n            }\n        }\n\n        let decide = { (o: AmbObserverType, event: Event<Element>, me: AmbState, otherSubscription: Disposable) in\n            self.lock.performLocked {\n                if self.choice == .neither {\n                    self.choice = me\n                    o.sink = forwardEvent\n                    o.cancel = disposeAll\n                    otherSubscription.dispose()\n                }\n                \n                if self.choice == me {\n                    self.forwardOn(event)\n                    if event.isStopEvent {\n                        self.dispose()\n                    }\n                }\n            }\n        }\n        \n        let sink1 = AmbObserver(parent: self, cancel: subscription1) { o, e in\n            decide(o, e, .left, subscription2)\n        }\n        \n        let sink2 = AmbObserver(parent: self, cancel: subscription1) { o, e in\n            decide(o, e, .right, subscription1)\n        }\n        \n        subscription1.setDisposable(self.parent.left.subscribe(sink1))\n        subscription2.setDisposable(self.parent.right.subscribe(sink2))\n        \n        return disposeAll\n    }\n}\n\nfinal private class Amb<Element>: Producer<Element> {\n    fileprivate let left: Observable<Element>\n    fileprivate let right: Observable<Element>\n    \n    init(left: Observable<Element>, right: Observable<Element>) {\n        self.left = left\n        self.right = right\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = AmbSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AsMaybe.swift",
    "content": "//\n//  AsMaybe.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nprivate final class AsMaybeSink<Observer: ObserverType> : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element\n\n    private var element: Event<Element>?\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            if self.element != nil {\n                self.forwardOn(.error(RxError.moreThanOneElement))\n                self.dispose()\n            }\n\n            self.element = event\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if let element = self.element {\n                self.forwardOn(element)\n            }\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal class AsMaybe<Element>: Producer<Element> {\n    private let source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = AsMaybeSink(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AsSingle.swift",
    "content": "//\n//  AsSingle.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nprivate final class AsSingleSink<Observer: ObserverType> : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element\n\n    private var element: Event<Element>?\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            if self.element != nil {\n                self.forwardOn(.error(RxError.moreThanOneElement))\n                self.dispose()\n            }\n\n            self.element = event\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if let element = self.element {\n                self.forwardOn(element)\n                self.forwardOn(.completed)\n            }\n            else {\n                self.forwardOn(.error(RxError.noElements))\n            }\n            self.dispose()\n        }\n    }\n}\n\nfinal class AsSingle<Element>: Producer<Element> {\n    private let source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = AsSingleSink(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Buffer.swift",
    "content": "//\n//  Buffer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a buffer that's sent out when either it's full or a given amount of time has elapsed, using the specified scheduler to run timers.\n\n     A useful real-world analogy of this overload is the behavior of a ferry leaving the dock when all seats are taken, or at the scheduled time of departure, whichever event occurs first.\n\n     - seealso: [buffer operator on reactivex.io](http://reactivex.io/documentation/operators/buffer.html)\n\n     - parameter timeSpan: Maximum time length of a buffer.\n     - parameter count: Maximum element count of a buffer.\n     - parameter scheduler: Scheduler to run buffering timers on.\n     - returns: An observable sequence of buffers.\n     */\n    public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)\n        -> Observable<[Element]> {\n        BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)\n    }\n}\n\nfinal private class BufferTimeCount<Element>: Producer<[Element]> {\n    \n    fileprivate let timeSpan: RxTimeInterval\n    fileprivate let count: Int\n    fileprivate let scheduler: SchedulerType\n    fileprivate let source: Observable<Element>\n    \n    init(source: Observable<Element>, timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) {\n        self.source = source\n        self.timeSpan = timeSpan\n        self.count = count\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == [Element] {\n        let sink = BufferTimeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class BufferTimeCountSink<Element, Observer: ObserverType>\n    : Sink<Observer>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType where Observer.Element == [Element] {\n    typealias Parent = BufferTimeCount<Element>\n    \n    private let parent: Parent\n    \n    let lock = RecursiveLock()\n    \n    // state\n    private let timerD = SerialDisposable()\n    private var buffer = [Element]()\n    private var windowID = 0\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n \n    func run() -> Disposable {\n        self.createTimer(self.windowID)\n        return Disposables.create(timerD, parent.source.subscribe(self))\n    }\n    \n    func startNewWindowAndSendCurrentOne() {\n        self.windowID = self.windowID &+ 1\n        let windowID = self.windowID\n        \n        let buffer = self.buffer\n        self.buffer = []\n        self.forwardOn(.next(buffer))\n        \n        self.createTimer(windowID)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            self.buffer.append(element)\n            \n            if self.buffer.count == self.parent.count {\n                self.startNewWindowAndSendCurrentOne()\n            }\n            \n        case .error(let error):\n            self.buffer = []\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.next(self.buffer))\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n    \n    func createTimer(_ windowID: Int) {\n        if self.timerD.isDisposed {\n            return\n        }\n        \n        if self.windowID != windowID {\n            return\n        }\n\n        let nextTimer = SingleAssignmentDisposable()\n        \n        self.timerD.disposable = nextTimer\n\n        let disposable = self.parent.scheduler.scheduleRelative(windowID, dueTime: self.parent.timeSpan) { previousWindowID in\n            self.lock.performLocked {\n                if previousWindowID != self.windowID {\n                    return\n                }\n             \n                self.startNewWindowAndSendCurrentOne()\n            }\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(disposable)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Catch.swift",
    "content": "//\n//  Catch.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    public func `catch`(_ handler: @escaping (Swift.Error) throws -> Observable<Element>)\n        -> Observable<Element> {\n        Catch(source: self.asObservable(), handler: handler)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    @available(*, deprecated, renamed: \"catch(_:)\")\n    public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable<Element>)\n        -> Observable<Element> {\n        `catch`(handler)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    public func catchAndReturn(_ element: Element)\n        -> Observable<Element> {\n        Catch(source: self.asObservable(), handler: { _ in Observable.just(element) })\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    @available(*, deprecated, renamed: \"catchAndReturn(_:)\")\n    public func catchErrorJustReturn(_ element: Element)\n        -> Observable<Element> {\n        catchAndReturn(element)\n    }\n}\n\nextension ObservableType {\n    /**\n     Continues an observable sequence that is terminated by an error with the next observable sequence.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n     */\n    @available(*, deprecated, renamed: \"catch(onSuccess:onFailure:onDisposed:)\")\n    public static func catchError<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Observable<Element>\n        where Sequence.Element == Observable<Element> {\n        `catch`(sequence: sequence)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with the next observable sequence.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n     */\n    public static func `catch`<Sequence: Swift.Sequence>(sequence: Sequence) -> Observable<Element>\n        where Sequence.Element == Observable<Element> {\n        CatchSequence(sources: sequence)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Repeats the source observable sequence until it successfully terminates.\n\n     **This could potentially create an infinite sequence.**\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - returns: Observable sequence to repeat until it successfully terminates.\n     */\n    public func retry() -> Observable<Element> {\n        CatchSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()))\n    }\n\n    /**\n     Repeats the source observable sequence the specified number of times in case of an error or until it successfully terminates.\n\n     If you encounter an error and want it to retry once, then you must use `retry(2)`\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter maxAttemptCount: Maximum number of times to repeat the sequence.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n     */\n    public func retry(_ maxAttemptCount: Int)\n        -> Observable<Element> {\n        CatchSequence(sources: Swift.repeatElement(self.asObservable(), count: maxAttemptCount))\n    }\n}\n\n// catch with callback\n\nfinal private class CatchSinkProxy<Observer: ObserverType>: ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = CatchSink<Observer>\n    \n    private let parent: Parent\n    \n    init(parent: Parent) {\n        self.parent = parent\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.parent.forwardOn(event)\n        \n        switch event {\n        case .next:\n            break\n        case .error, .completed:\n            self.parent.dispose()\n        }\n    }\n}\n\nfinal private class CatchSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = Catch<Element>\n    \n    private let parent: Parent\n    private let subscription = SerialDisposable()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let d1 = SingleAssignmentDisposable()\n        self.subscription.disposable = d1\n        d1.setDisposable(self.parent.source.subscribe(self))\n\n        return self.subscription\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        case .error(let error):\n            do {\n                let catchSequence = try self.parent.handler(error)\n\n                let observer = CatchSinkProxy(parent: self)\n                \n                self.subscription.disposable = catchSequence.subscribe(observer)\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal private class Catch<Element>: Producer<Element> {\n    typealias Handler = (Swift.Error) throws -> Observable<Element>\n    \n    fileprivate let source: Observable<Element>\n    fileprivate let handler: Handler\n    \n    init(source: Observable<Element>, handler: @escaping Handler) {\n        self.source = source\n        self.handler = handler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = CatchSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// catch enumerable\n\nfinal private class CatchSequenceSink<Sequence: Swift.Sequence, Observer: ObserverType>\n    : TailRecursiveSink<Sequence, Observer>\n    , ObserverType where Sequence.Element: ObservableConvertibleType, Sequence.Element.Element == Observer.Element {\n    typealias Element = Observer.Element\n    typealias Parent = CatchSequence<Sequence>\n\n    private var lastError: Swift.Error?\n    \n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .error(let error):\n            self.lastError = error\n            self.schedule(.moveNext)\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n\n    override func subscribeToNext(_ source: Observable<Element>) -> Disposable {\n        source.subscribe(self)\n    }\n    \n    override func done() {\n        if let lastError = self.lastError {\n            self.forwardOn(.error(lastError))\n        }\n        else {\n            self.forwardOn(.completed)\n        }\n        \n        self.dispose()\n    }\n    \n    override func extract(_ observable: Observable<Element>) -> SequenceGenerator? {\n        if let onError = observable as? CatchSequence<Sequence> {\n            return (onError.sources.makeIterator(), nil)\n        }\n        else {\n            return nil\n        }\n    }\n}\n\nfinal private class CatchSequence<Sequence: Swift.Sequence>: Producer<Sequence.Element.Element> where Sequence.Element: ObservableConvertibleType {\n    typealias Element = Sequence.Element.Element\n    \n    let sources: Sequence\n    \n    init(sources: Sequence) {\n        self.sources = sources\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = CatchSequenceSink<Sequence, Observer>(observer: observer, cancel: cancel)\n        let subscription = sink.run((self.sources.makeIterator(), nil))\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift",
    "content": "//\n//  CombineLatest+Collection.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func combineLatest<Collection: Swift.Collection>(_ collection: Collection, resultSelector: @escaping ([Collection.Element.Element]) throws -> Element) -> Observable<Element>\n        where Collection.Element: ObservableType {\n        CombineLatestCollectionType(sources: collection, resultSelector: resultSelector)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.\n\n     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func combineLatest<Collection: Swift.Collection>(_ collection: Collection) -> Observable<[Element]>\n        where Collection.Element: ObservableType, Collection.Element.Element == Element {\n        CombineLatestCollectionType(sources: collection, resultSelector: { $0 })\n    }\n}\n\nfinal private class CombineLatestCollectionTypeSink<Collection: Swift.Collection, Observer: ObserverType>\n    : Sink<Observer> where Collection.Element: ObservableConvertibleType {\n    typealias Result = Observer.Element \n    typealias Parent = CombineLatestCollectionType<Collection, Result>\n    typealias SourceElement = Collection.Element.Element\n    \n    let parent: Parent\n    \n    let lock = RecursiveLock()\n\n    // state\n    var numberOfValues = 0\n    var values: [SourceElement?]\n    var isDone: [Bool]\n    var numberOfDone = 0\n    var subscriptions: [SingleAssignmentDisposable]\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.values = [SourceElement?](repeating: nil, count: parent.count)\n        self.isDone = [Bool](repeating: false, count: parent.count)\n        self.subscriptions = [SingleAssignmentDisposable]()\n        self.subscriptions.reserveCapacity(parent.count)\n        \n        for _ in 0 ..< parent.count {\n            self.subscriptions.append(SingleAssignmentDisposable())\n        }\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceElement>, atIndex: Int) {\n        self.lock.lock(); defer { self.lock.unlock() }\n        switch event {\n        case .next(let element):\n            if self.values[atIndex] == nil {\n                self.numberOfValues += 1\n            }\n            \n            self.values[atIndex] = element\n            \n            if self.numberOfValues < self.parent.count {\n                let numberOfOthersThatAreDone = self.numberOfDone - (self.isDone[atIndex] ? 1 : 0)\n                if numberOfOthersThatAreDone == self.parent.count - 1 {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n                return\n            }\n            \n            do {\n                let result = try self.parent.resultSelector(self.values.map { $0! })\n                self.forwardOn(.next(result))\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n            \n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            if self.isDone[atIndex] {\n                return\n            }\n            \n            self.isDone[atIndex] = true\n            self.numberOfDone += 1\n            \n            if self.numberOfDone == self.parent.count {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n            else {\n                self.subscriptions[atIndex].dispose()\n            }\n        }\n    }\n    \n    func run() -> Disposable {\n        var j = 0\n        for i in self.parent.sources {\n            let index = j\n            let source = i.asObservable()\n            let disposable = source.subscribe(AnyObserver { event in\n                self.on(event, atIndex: index)\n            })\n\n            self.subscriptions[j].setDisposable(disposable)\n            \n            j += 1\n        }\n\n        if self.parent.sources.isEmpty {\n            do {\n                let result = try self.parent.resultSelector([])\n                self.forwardOn(.next(result))\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        }\n        \n        return Disposables.create(subscriptions)\n    }\n}\n\nfinal private class CombineLatestCollectionType<Collection: Swift.Collection, Result>: Producer<Result> where Collection.Element: ObservableConvertibleType {\n    typealias ResultSelector = ([Collection.Element.Element]) throws -> Result\n    \n    let sources: Collection\n    let resultSelector: ResultSelector\n    let count: Int\n\n    init(sources: Collection, resultSelector: @escaping ResultSelector) {\n        self.sources = sources\n        self.resultSelector = resultSelector\n        self.count = self.sources.count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestCollectionTypeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  CombineLatest+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.Element, O2.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2)\n            -> Observable<(O1.Element, O2.Element)> {\n        return CombineLatest2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: { ($0, $1) }\n        )\n    }\n}\n\nfinal class CombineLatestSink2_<E1, E2, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest2<E1, E2, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 2, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n\n        return Disposables.create([\n                subscription1,\n                subscription2\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2)\n    }\n}\n\nfinal class CombineLatest2<E1, E2, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink2_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 3\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.Element, O2.Element, O3.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n            -> Observable<(O1.Element, O2.Element, O3.Element)> {\n        return CombineLatest3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: { ($0, $1, $2) }\n        )\n    }\n}\n\nfinal class CombineLatestSink3_<E1, E2, E3, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest3<E1, E2, E3, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 3, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3)\n    }\n}\n\nfinal class CombineLatest3<E1, E2, E3, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink3_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 4\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n            -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element)> {\n        return CombineLatest4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: { ($0, $1, $2, $3) }\n        )\n    }\n}\n\nfinal class CombineLatestSink4_<E1, E2, E3, E4, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest4<E1, E2, E3, E4, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n    var latestElement4: E4! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 4, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: self.lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self.latestElement4 = e }, this: subscription4)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n         subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3, self.latestElement4)\n    }\n}\n\nfinal class CombineLatest4<E1, E2, E3, E4, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink4_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 5\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n            -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)> {\n        return CombineLatest5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4) }\n        )\n    }\n}\n\nfinal class CombineLatestSink5_<E1, E2, E3, E4, E5, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest5<E1, E2, E3, E4, E5, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n    var latestElement4: E4! = nil\n    var latestElement5: E5! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 5, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: self.lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self.latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: self.lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self.latestElement5 = e }, this: subscription5)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n         subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n         subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3, self.latestElement4, self.latestElement5)\n    }\n}\n\nfinal class CombineLatest5<E1, E2, E3, E4, E5, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink5_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 6\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n            -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)> {\n        return CombineLatest6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5) }\n        )\n    }\n}\n\nfinal class CombineLatestSink6_<E1, E2, E3, E4, E5, E6, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest6<E1, E2, E3, E4, E5, E6, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n    var latestElement4: E4! = nil\n    var latestElement5: E5! = nil\n    var latestElement6: E6! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 6, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: self.lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self.latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: self.lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self.latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: self.lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self.latestElement6 = e }, this: subscription6)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n         subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n         subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n         subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3, self.latestElement4, self.latestElement5, self.latestElement6)\n    }\n}\n\nfinal class CombineLatest6<E1, E2, E3, E4, E5, E6, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink6_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 7\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n            -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)> {\n        return CombineLatest7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6) }\n        )\n    }\n}\n\nfinal class CombineLatestSink7_<E1, E2, E3, E4, E5, E6, E7, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest7<E1, E2, E3, E4, E5, E6, E7, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n    var latestElement4: E4! = nil\n    var latestElement5: E5! = nil\n    var latestElement6: E6! = nil\n    var latestElement7: E7! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 7, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: self.lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self.latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: self.lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self.latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: self.lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self.latestElement6 = e }, this: subscription6)\n        let observer7 = CombineLatestObserver(lock: self.lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self.latestElement7 = e }, this: subscription7)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n         subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n         subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n         subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n         subscription7.setDisposable(self.parent.source7.subscribe(observer7))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6,\n                subscription7\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3, self.latestElement4, self.latestElement5, self.latestElement6, self.latestElement7)\n    }\n}\n\nfinal class CombineLatest7<E1, E2, E3, E4, E5, E6, E7, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink7_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 8\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element) throws -> Element)\n            -> Observable<Element> {\n        return CombineLatest8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n            -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)> {\n        return CombineLatest8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6, $7) }\n        )\n    }\n}\n\nfinal class CombineLatestSink8_<E1, E2, E3, E4, E5, E6, E7, E8, Observer: ObserverType> : CombineLatestSink<Observer> {\n    typealias Result = Observer.Element\n    typealias Parent = CombineLatest8<E1, E2, E3, E4, E5, E6, E7, E8, Result>\n\n    let parent: Parent\n\n    var latestElement1: E1! = nil\n    var latestElement2: E2! = nil\n    var latestElement3: E3! = nil\n    var latestElement4: E4! = nil\n    var latestElement5: E5! = nil\n    var latestElement6: E6! = nil\n    var latestElement7: E7! = nil\n    var latestElement8: E8! = nil\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 8, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n        let subscription8 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: self.lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self.latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: self.lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self.latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: self.lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self.latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: self.lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self.latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: self.lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self.latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: self.lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self.latestElement6 = e }, this: subscription6)\n        let observer7 = CombineLatestObserver(lock: self.lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self.latestElement7 = e }, this: subscription7)\n        let observer8 = CombineLatestObserver(lock: self.lock, parent: self, index: 7, setLatestValue: { (e: E8) -> Void in self.latestElement8 = e }, this: subscription8)\n\n         subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n         subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n         subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n         subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n         subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n         subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n         subscription7.setDisposable(self.parent.source7.subscribe(observer7))\n         subscription8.setDisposable(self.parent.source8.subscribe(observer8))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6,\n                subscription7,\n                subscription8\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.latestElement1, self.latestElement2, self.latestElement3, self.latestElement4, self.latestElement5, self.latestElement6, self.latestElement7, self.latestElement8)\n    }\n}\n\nfinal class CombineLatest8<E1, E2, E3, E4, E5, E6, E7, E8, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7, E8) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n    let source8: Observable<E8>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, source8: Observable<E8>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n        self.source8 = source8\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = CombineLatestSink8_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest.swift",
    "content": "//\n//  CombineLatest.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol CombineLatestProtocol: AnyObject {\n    func next(_ index: Int)\n    func fail(_ error: Swift.Error)\n    func done(_ index: Int)\n}\n\nclass CombineLatestSink<Observer: ObserverType>\n    : Sink<Observer>\n    , CombineLatestProtocol {\n    typealias Element = Observer.Element \n   \n    let lock = RecursiveLock()\n\n    private let arity: Int\n    private var numberOfValues = 0\n    private var numberOfDone = 0\n    private var hasValue: [Bool]\n    private var isDone: [Bool]\n   \n    init(arity: Int, observer: Observer, cancel: Cancelable) {\n        self.arity = arity\n        self.hasValue = [Bool](repeating: false, count: arity)\n        self.isDone = [Bool](repeating: false, count: arity)\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func getResult() throws -> Element {\n        rxAbstractMethod()\n    }\n    \n    func next(_ index: Int) {\n        if !self.hasValue[index] {\n            self.hasValue[index] = true\n            self.numberOfValues += 1\n        }\n\n        if self.numberOfValues == self.arity {\n            do {\n                let result = try self.getResult()\n                self.forwardOn(.next(result))\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        }\n        else {\n            var allOthersDone = true\n\n            for i in 0 ..< self.arity {\n                if i != index && !self.isDone[i] {\n                    allOthersDone = false\n                    break\n                }\n            }\n            \n            if allOthersDone {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n    \n    func fail(_ error: Swift.Error) {\n        self.forwardOn(.error(error))\n        self.dispose()\n    }\n    \n    func done(_ index: Int) {\n        if self.isDone[index] {\n            return\n        }\n\n        self.isDone[index] = true\n        self.numberOfDone += 1\n\n        if self.numberOfDone == self.arity {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal class CombineLatestObserver<Element>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias ValueSetter = (Element) -> Void\n    \n    private let parent: CombineLatestProtocol\n    \n    let lock: RecursiveLock\n    private let index: Int\n    private let this: Disposable\n    private let setLatestValue: ValueSetter\n    \n    init(lock: RecursiveLock, parent: CombineLatestProtocol, index: Int, setLatestValue: @escaping ValueSetter, this: Disposable) {\n        self.lock = lock\n        self.parent = parent\n        self.index = index\n        self.this = this\n        self.setLatestValue = setLatestValue\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            self.setLatestValue(value)\n            self.parent.next(self.index)\n        case .error(let error):\n            self.this.dispose()\n            self.parent.fail(error)\n        case .completed:\n            self.this.dispose()\n            self.parent.done(self.index)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CompactMap.swift",
    "content": "//\n//  CompactMap.swift\n//  RxSwift\n//\n//  Created by Michael Long on 04/09/2019.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into an optional form and filters all optional results.\n\n     - parameter transform: A transform function to apply to each source element and which returns an element or nil.\n     - returns: An observable sequence whose elements are the result of filtering the transform function for each element of the source.\n\n     */\n    public func compactMap<Result>(_ transform: @escaping (Element) throws -> Result?)\n        -> Observable<Result> {\n        CompactMap(source: self.asObservable(), transform: transform)\n    }\n}\n\nfinal private class CompactMapSink<SourceType, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Transform = (SourceType) throws -> ResultType?\n\n    typealias ResultType = Observer.Element \n    typealias Element = SourceType\n\n    private let transform: Transform\n\n    init(transform: @escaping Transform, observer: Observer, cancel: Cancelable) {\n        self.transform = transform\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let element):\n            do {\n                if let mappedElement = try self.transform(element) {\n                    self.forwardOn(.next(mappedElement))\n                }\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class CompactMap<SourceType, ResultType>: Producer<ResultType> {\n    typealias Transform = (SourceType) throws -> ResultType?\n\n    private let source: Observable<SourceType>\n\n    private let transform: Transform\n\n    init(source: Observable<SourceType>, transform: @escaping Transform) {\n        self.source = source\n        self.transform = transform\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == ResultType {\n        let sink = CompactMapSink(transform: self.transform, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Concat.swift",
    "content": "//\n//  Concat.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func concat<Source: ObservableConvertibleType>(_ second: Source) -> Observable<Element> where Source.Element == Element {\n        Observable.concat([self.asObservable(), second.asObservable()])\n    }\n}\n\nextension ObservableType {\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Observable<Element>\n        where Sequence.Element == Observable<Element> {\n            return Concat(sources: sequence, count: nil)\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Collection: Swift.Collection>(_ collection: Collection) -> Observable<Element>\n        where Collection.Element == Observable<Element> {\n            return Concat(sources: collection, count: Int64(collection.count))\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat(_ sources: Observable<Element> ...) -> Observable<Element> {\n        Concat(sources: sources, count: Int64(sources.count))\n    }\n}\n\nfinal private class ConcatSink<Sequence: Swift.Sequence, Observer: ObserverType>\n    : TailRecursiveSink<Sequence, Observer>\n    , ObserverType where Sequence.Element: ObservableConvertibleType, Sequence.Element.Element == Observer.Element {\n    typealias Element = Observer.Element \n    \n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>){\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.schedule(.moveNext)\n        }\n    }\n\n    override func subscribeToNext(_ source: Observable<Element>) -> Disposable {\n        source.subscribe(self)\n    }\n    \n    override func extract(_ observable: Observable<Element>) -> SequenceGenerator? {\n        if let source = observable as? Concat<Sequence> {\n            return (source.sources.makeIterator(), source.count)\n        }\n        else {\n            return nil\n        }\n    }\n}\n\nfinal private class Concat<Sequence: Swift.Sequence>: Producer<Sequence.Element.Element> where Sequence.Element: ObservableConvertibleType {\n    typealias Element = Sequence.Element.Element\n    \n    fileprivate let sources: Sequence\n    fileprivate let count: IntMax?\n\n    init(sources: Sequence, count: IntMax?) {\n        self.sources = sources\n        self.count = count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ConcatSink<Sequence, Observer>(observer: observer, cancel: cancel)\n        let subscription = sink.run((self.sources.makeIterator(), self.count))\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Create.swift",
    "content": "//\n//  Create.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    // MARK: create\n\n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n\n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n\n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {\n        AnonymousObservable(subscribe)\n    }\n}\n\nfinal private class AnonymousObservableSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = AnonymousObservable<Element>\n\n    // state\n    private let isStopped = AtomicInt(0)\n\n    #if DEBUG\n        private let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        switch event {\n        case .next:\n            if load(self.isStopped) == 1 {\n                return\n            }\n            self.forwardOn(event)\n        case .error, .completed:\n            if fetchOr(self.isStopped, 1) == 0 {\n                self.forwardOn(event)\n                self.dispose()\n            }\n        }\n    }\n\n    func run(_ parent: Parent) -> Disposable {\n        parent.subscribeHandler(AnyObserver(self))\n    }\n}\n\nfinal private class AnonymousObservable<Element>: Producer<Element> {\n    typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable\n\n    let subscribeHandler: SubscribeHandler\n\n    init(_ subscribeHandler: @escaping SubscribeHandler) {\n        self.subscribeHandler = subscribeHandler\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)\n        let subscription = sink.run(self)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Debounce.swift",
    "content": "//\n//  Debounce.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/11/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n            return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal private class DebounceSink<Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = Observer.Element \n    typealias ParentType = Debounce<Element>\n\n    private let parent: ParentType\n\n    let lock = RecursiveLock()\n\n    // state\n    private var id = 0 as UInt64\n    private var value: Element?\n\n    let cancellable = SerialDisposable()\n\n    init(parent: ParentType, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription = self.parent.source.subscribe(self)\n\n        return Disposables.create(subscription, cancellable)\n    }\n\n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            self.id = self.id &+ 1\n            let currentId = self.id\n            self.value = element\n\n\n            let scheduler = self.parent.scheduler\n            let dueTime = self.parent.dueTime\n\n            let d = SingleAssignmentDisposable()\n            self.cancellable.disposable = d\n            d.setDisposable(scheduler.scheduleRelative(currentId, dueTime: dueTime, action: self.propagate))\n        case .error:\n            self.value = nil\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if let value = self.value {\n                self.value = nil\n                self.forwardOn(.next(value))\n            }\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n\n    func propagate(_ currentId: UInt64) -> Disposable {\n        self.lock.performLocked {\n            let originalValue = self.value\n\n            if let value = originalValue, self.id == currentId {\n                self.value = nil\n                self.forwardOn(.next(value))\n            }\n\n            return Disposables.create()\n        }\n    }\n}\n\nfinal private class Debounce<Element>: Producer<Element> {\n    fileprivate let source: Observable<Element>\n    fileprivate let dueTime: RxTimeInterval\n    fileprivate let scheduler: SchedulerType\n\n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.dueTime = dueTime\n        self.scheduler = scheduler\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = DebounceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Debug.swift",
    "content": "//\n//  Debug.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension ObservableType {\n\n    /**\n     Prints received events for all observers on standard output.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter identifier: Identifier that is printed together with event description to standard output.\n     - parameter trimOutput: Should output be trimmed to max 40 characters.\n     - returns: An observable sequence whose events are printed to standard output.\n     */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)\n        -> Observable<Element> {\n            return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function)\n    }\n}\n\nprivate let dateFormat = \"yyyy-MM-dd HH:mm:ss.SSS\"\n\nprivate func logEvent(_ identifier: String, dateFormat: DateFormatter, content: String) {\n    print(\"\\(dateFormat.string(from: Date())): \\(identifier) -> \\(content)\")\n}\n\nfinal private class DebugSink<Source: ObservableType, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == Source.Element {\n    typealias Element = Observer.Element \n    typealias Parent = Debug<Source>\n    \n    private let parent: Parent\n    private let timestampFormatter = DateFormatter()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.timestampFormatter.dateFormat = dateFormat\n\n        logEvent(self.parent.identifier, dateFormat: self.timestampFormatter, content: \"subscribed\")\n\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        let maxEventTextLength = 40\n        let eventText = \"\\(event)\"\n\n        let eventNormalized = (eventText.count > maxEventTextLength) && self.parent.trimOutput\n            ? String(eventText.prefix(maxEventTextLength / 2)) + \"...\" + String(eventText.suffix(maxEventTextLength / 2))\n            : eventText\n\n        logEvent(self.parent.identifier, dateFormat: self.timestampFormatter, content: \"Event \\(eventNormalized)\")\n\n        self.forwardOn(event)\n        if event.isStopEvent {\n            self.dispose()\n        }\n    }\n    \n    override func dispose() {\n        if !self.isDisposed {\n            logEvent(self.parent.identifier, dateFormat: self.timestampFormatter, content: \"isDisposed\")\n        }\n        super.dispose()\n    }\n}\n\nfinal private class Debug<Source: ObservableType>: Producer<Source.Element> {\n    fileprivate let identifier: String\n    fileprivate let trimOutput: Bool\n    private let source: Source\n\n    init(source: Source, identifier: String?, trimOutput: Bool, file: String, line: UInt, function: String) {\n        self.trimOutput = trimOutput\n        if let identifier = identifier {\n            self.identifier = identifier\n        }\n        else {\n            let trimmedFile: String\n            if let lastIndex = file.lastIndex(of: \"/\") {\n                trimmedFile = String(file[file.index(after: lastIndex) ..< file.endIndex])\n            }\n            else {\n                trimmedFile = file\n            }\n            self.identifier = \"\\(trimmedFile):\\(line) (\\(function))\"\n        }\n        self.source = source\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Source.Element {\n        let sink = DebugSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Decode.swift",
    "content": "//\n//  Decode.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 24/07/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic extension ObservableType where Element == Data {\n  /// Attempt to decode the emitted `Data` using a provided decoder.\n  ///\n  /// - parameter type: A `Decodable`-conforming type to attempt to decode to\n  /// - parameter decoder: A capable decoder, e.g. `JSONDecoder` or `PropertyListDecoder`\n  ///\n  /// - note: If using a custom decoder, it must conform to the `DataDecoder` protocol.\n  ///\n  /// - returns: An `Observable` of the decoded type\n  func decode<Item: Decodable,\n              Decoder: DataDecoder>(type: Item.Type,\n                                    decoder: Decoder) -> Observable<Item> {\n    map { try decoder.decode(type, from: $0) }\n  }\n}\n\n/// Represents an entity capable of decoding raw `Data`\n/// into a concrete `Decodable` type\npublic protocol DataDecoder {\n  func decode<Item: Decodable>(_ type: Item.Type, from data: Data) throws -> Item\n}\n\nextension JSONDecoder: DataDecoder {}\nextension PropertyListDecoder: DataDecoder {}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift",
    "content": "//\n//  DefaultIfEmpty.swift\n//  RxSwift\n//\n//  Created by sergdort on 23/12/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter default: Default element to be sent if the source does not emit any elements\n     - returns: An observable sequence which emits default element end completes in case the original sequence is empty\n     */\n    public func ifEmpty(default: Element) -> Observable<Element> {\n        DefaultIfEmpty(source: self.asObservable(), default: `default`)\n    }\n}\n\nfinal private class DefaultIfEmptySink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    private let `default`: Element\n    private var isEmpty = true\n    \n    init(default: Element, observer: Observer, cancel: Cancelable) {\n        self.default = `default`\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.isEmpty = false\n            self.forwardOn(event)\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if self.isEmpty {\n                self.forwardOn(.next(self.default))\n            }\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class DefaultIfEmpty<SourceType>: Producer<SourceType> {\n    private let source: Observable<SourceType>\n    private let `default`: SourceType\n    \n    init(source: Observable<SourceType>, `default`: SourceType) {\n        self.source = source\n        self.default = `default`\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceType {\n        let sink = DefaultIfEmptySink(default: self.default, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Deferred.swift",
    "content": "//\n//  Deferred.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>)\n        -> Observable<Element> {\n        Deferred(observableFactory: observableFactory)\n    }\n}\n\nfinal private class DeferredSink<Source: ObservableType, Observer: ObserverType>: Sink<Observer>, ObserverType where Source.Element == Observer.Element {\n    typealias Element = Observer.Element \n\n    private let observableFactory: () throws -> Source\n\n    init(observableFactory: @escaping () throws -> Source, observer: Observer, cancel: Cancelable) {\n        self.observableFactory = observableFactory\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        do {\n            let result = try self.observableFactory()\n            return result.subscribe(self)\n        }\n        catch let e {\n            self.forwardOn(.error(e))\n            self.dispose()\n            return Disposables.create()\n        }\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.forwardOn(event)\n        \n        switch event {\n        case .next:\n            break\n        case .error:\n            self.dispose()\n        case .completed:\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Deferred<Source: ObservableType>: Producer<Source.Element> {\n    typealias Factory = () throws -> Source\n    \n    private let observableFactory : Factory\n    \n    init(observableFactory: @escaping Factory) {\n        self.observableFactory = observableFactory\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable)\n             where Observer.Element == Source.Element {\n        let sink = DeferredSink(observableFactory: self.observableFactory, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Delay.swift",
    "content": "//\n//  Delay.swift\n//  RxSwift\n//\n//  Created by tarunon on 2016/02/09.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n            return Delay(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal private class DelaySink<Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType {\n    typealias Element = Observer.Element \n    typealias Source = Observable<Element>\n    typealias DisposeKey = Bag<Disposable>.KeyType\n    \n    private let lock = RecursiveLock()\n\n    private let dueTime: RxTimeInterval\n    private let scheduler: SchedulerType\n    \n    private let sourceSubscription = SingleAssignmentDisposable()\n    private let cancelable = SerialDisposable()\n\n    // is scheduled some action\n    private var active = false\n    // is \"run loop\" on different scheduler running\n    private var running = false\n    private var errorEvent: Event<Element>?\n\n    // state\n    private var queue = Queue<(eventTime: RxTime, event: Event<Element>)>(capacity: 0)\n    \n    init(observer: Observer, dueTime: RxTimeInterval, scheduler: SchedulerType, cancel: Cancelable) {\n        self.dueTime = dueTime\n        self.scheduler = scheduler\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    // All of these complications in this method are caused by the fact that \n    // error should be propagated immediately. Error can be potentially received on different\n    // scheduler so this process needs to be synchronized somehow.\n    //\n    // Another complication is that scheduler is potentially concurrent so internal queue is used.\n    func drainQueue(state: (), scheduler: AnyRecursiveScheduler<()>) {\n        self.lock.lock()    \n        let hasFailed = self.errorEvent != nil\n        if !hasFailed {\n            self.running = true\n        }\n        self.lock.unlock()  \n\n        if hasFailed {\n            return\n        }\n\n        var ranAtLeastOnce = false\n\n        while true {\n            self.lock.lock() \n            let errorEvent = self.errorEvent\n\n            let eventToForwardImmediately = ranAtLeastOnce ? nil : self.queue.dequeue()?.event\n            let nextEventToScheduleOriginalTime: Date? = ranAtLeastOnce && !self.queue.isEmpty ? self.queue.peek().eventTime : nil\n\n            if errorEvent == nil {\n                if eventToForwardImmediately != nil {\n                }\n                else if nextEventToScheduleOriginalTime != nil {\n                    self.running = false\n                }\n                else {\n                    self.running = false\n                    self.active = false\n                }\n            }\n            self.lock.unlock() \n\n            if let errorEvent = errorEvent {\n                self.forwardOn(errorEvent)\n                self.dispose()\n                return\n            }\n            else {\n                if let eventToForwardImmediately = eventToForwardImmediately {\n                    ranAtLeastOnce = true\n                    self.forwardOn(eventToForwardImmediately)\n                    if case .completed = eventToForwardImmediately {\n                        self.dispose()\n                        return\n                    }\n                }\n                else if let nextEventToScheduleOriginalTime = nextEventToScheduleOriginalTime {\n                    scheduler.schedule((), dueTime: self.dueTime.reduceWithSpanBetween(earlierDate: nextEventToScheduleOriginalTime, laterDate: self.scheduler.now))\n                    return\n                }\n                else {\n                    return\n                }\n            }\n        }\n    }\n    \n    func on(_ event: Event<Element>) {\n        if event.isStopEvent {\n            self.sourceSubscription.dispose()\n        }\n\n        switch event {\n        case .error:\n            self.lock.lock()    \n            let shouldSendImmediately = !self.running\n            self.queue = Queue(capacity: 0)\n            self.errorEvent = event\n            self.lock.unlock()  \n\n            if shouldSendImmediately {\n                self.forwardOn(event)\n                self.dispose()\n            }\n        default:\n            self.lock.lock()    \n            let shouldSchedule = !self.active\n            self.active = true\n            self.queue.enqueue((self.scheduler.now, event))\n            self.lock.unlock()  \n\n            if shouldSchedule {\n                self.cancelable.disposable = self.scheduler.scheduleRecursive((), dueTime: self.dueTime, action: self.drainQueue)\n            }\n        }\n    }\n    \n    func run(source: Observable<Element>) -> Disposable {\n        self.sourceSubscription.setDisposable(source.subscribe(self))\n        return Disposables.create(sourceSubscription, cancelable)\n    }\n}\n\nfinal private class Delay<Element>: Producer<Element> {\n    private let source: Observable<Element>\n    private let dueTime: RxTimeInterval\n    private let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.dueTime = dueTime\n        self.scheduler = scheduler\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = DelaySink(observer: observer, dueTime: self.dueTime, scheduler: self.scheduler, cancel: cancel)\n        let subscription = sink.run(source: self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift",
    "content": "//\n//  DelaySubscription.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the subscription.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: Time-shifted sequence.\n     */\n    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n        DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal private class DelaySubscriptionSink<Observer: ObserverType>\n    : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    \n    func on(_ event: Event<Element>) {\n        self.forwardOn(event)\n        if event.isStopEvent {\n            self.dispose()\n        }\n    }\n    \n}\n\nfinal private class DelaySubscription<Element>: Producer<Element> {\n    private let source: Observable<Element>\n    private let dueTime: RxTimeInterval\n    private let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.dueTime = dueTime\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = DelaySubscriptionSink(observer: observer, cancel: cancel)\n        let subscription = self.scheduler.scheduleRelative((), dueTime: self.dueTime) { _ in\n            return self.source.subscribe(sink)\n        }\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Dematerialize.swift",
    "content": "//\n//  Dematerialize.swift\n//  RxSwift\n//\n//  Created by Jamie Pinkham on 3/13/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where Element: EventConvertible {\n    /**\n     Convert any previously materialized Observable into it's original form.\n     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)\n     - returns: The dematerialized observable sequence.\n     */\n    public func dematerialize() -> Observable<Element.Element> {\n        Dematerialize(source: self.asObservable())\n    }\n\n}\n\nprivate final class DematerializeSink<T: EventConvertible, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == T.Element {\n    fileprivate func on(_ event: Event<T>) {\n        switch event {\n        case .next(let element):\n            self.forwardOn(element.event)\n            if element.event.isStopEvent {\n                self.dispose()\n            }\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Dematerialize<T: EventConvertible>: Producer<T.Element> {\n    private let source: Observable<T>\n\n    init(source: Observable<T>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == T.Element {\n        let sink = DematerializeSink<T, Observer>(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DistinctUntilChanged.swift",
    "content": "//\n//  DistinctUntilChanged.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where Element: Equatable {\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to equality operator.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.\n     */\n    public func distinctUntilChanged()\n        -> Observable<Element> {\n        self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })\n    }\n}\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n     */\n    public func distinctUntilChanged<Key: Equatable>(_ keySelector: @escaping (Element) throws -> Key)\n        -> Observable<Element> {\n        self.distinctUntilChanged(keySelector, comparer: { $0 == $1 })\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.\n     */\n    public func distinctUntilChanged(_ comparer: @escaping (Element, Element) throws -> Bool)\n        -> Observable<Element> {\n        self.distinctUntilChanged({ $0 }, comparer: comparer)\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.\n     */\n    public func distinctUntilChanged<K>(_ keySelector: @escaping (Element) throws -> K, comparer: @escaping (K, K) throws -> Bool)\n        -> Observable<Element> {\n            return DistinctUntilChanged(source: self.asObservable(), selector: keySelector, comparer: comparer)\n    }\n\n    /**\n    Returns an observable sequence that contains only contiguous elements with distinct values in the provided key path on each object.\n\n    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n    - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator on the provided key path\n    */\n    public func distinctUntilChanged<Property: Equatable>(at keyPath: KeyPath<Element, Property>) ->\n        Observable<Element> {\n        self.distinctUntilChanged { $0[keyPath: keyPath] == $1[keyPath: keyPath] }\n    }\n}\n\nfinal private class DistinctUntilChangedSink<Observer: ObserverType, Key>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    \n    private let parent: DistinctUntilChanged<Element, Key>\n    private var currentKey: Key?\n    \n    init(parent: DistinctUntilChanged<Element, Key>, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            do {\n                let key = try self.parent.selector(value)\n                var areEqual = false\n                if let currentKey = self.currentKey {\n                    areEqual = try self.parent.comparer(currentKey, key)\n                }\n                \n                if areEqual {\n                    return\n                }\n                \n                self.currentKey = key\n                \n                self.forwardOn(event)\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        case .error, .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class DistinctUntilChanged<Element, Key>: Producer<Element> {\n    typealias KeySelector = (Element) throws -> Key\n    typealias EqualityComparer = (Key, Key) throws -> Bool\n    \n    private let source: Observable<Element>\n    fileprivate let selector: KeySelector\n    fileprivate let comparer: EqualityComparer\n    \n    init(source: Observable<Element>, selector: @escaping KeySelector, comparer: @escaping EqualityComparer) {\n        self.source = source\n        self.selector = selector\n        self.comparer = comparer\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = DistinctUntilChangedSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Do.swift",
    "content": "//\n//  Do.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter afterNext: Action to invoke for each element after the observable has passed an onNext event along to its downstream.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter afterError: Action to invoke after errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter afterCompleted: Action to invoke after graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((Element) throws -> Void)? = nil, afterNext: ((Element) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, afterError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, afterCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> Void)? = nil, onSubscribed: (() -> Void)? = nil, onDispose: (() -> Void)? = nil)\n        -> Observable<Element> {\n            return Do(source: self.asObservable(), eventHandler: { e in\n                switch e {\n                case .next(let element):\n                    try onNext?(element)\n                case .error(let e):\n                    try onError?(e)\n                case .completed:\n                    try onCompleted?()\n                }\n            }, afterEventHandler: { e in\n                switch e {\n                case .next(let element):\n                    try afterNext?(element)\n                case .error(let e):\n                    try afterError?(e)\n                case .completed:\n                    try afterCompleted?()\n                }\n            }, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)\n    }\n}\n\nfinal private class DoSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias EventHandler = (Event<Element>) throws -> Void\n    typealias AfterEventHandler = (Event<Element>) throws -> Void\n    \n    private let eventHandler: EventHandler\n    private let afterEventHandler: AfterEventHandler\n    \n    init(eventHandler: @escaping EventHandler, afterEventHandler: @escaping AfterEventHandler, observer: Observer, cancel: Cancelable) {\n        self.eventHandler = eventHandler\n        self.afterEventHandler = afterEventHandler\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        do {\n            try self.eventHandler(event)\n            self.forwardOn(event)\n            try self.afterEventHandler(event)\n            if event.isStopEvent {\n                self.dispose()\n            }\n        }\n        catch let error {\n            self.forwardOn(.error(error))\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Do<Element>: Producer<Element> {\n    typealias EventHandler = (Event<Element>) throws -> Void\n    typealias AfterEventHandler = (Event<Element>) throws -> Void\n    \n    private let source: Observable<Element>\n    private let eventHandler: EventHandler\n    private let afterEventHandler: AfterEventHandler\n    private let onSubscribe: (() -> Void)?\n    private let onSubscribed: (() -> Void)?\n    private let onDispose: (() -> Void)?\n    \n    init(source: Observable<Element>, eventHandler: @escaping EventHandler, afterEventHandler: @escaping AfterEventHandler, onSubscribe: (() -> Void)?, onSubscribed: (() -> Void)?, onDispose: (() -> Void)?) {\n        self.source = source\n        self.eventHandler = eventHandler\n        self.afterEventHandler = afterEventHandler\n        self.onSubscribe = onSubscribe\n        self.onSubscribed = onSubscribed\n        self.onDispose = onDispose\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        self.onSubscribe?()\n        let sink = DoSink(eventHandler: self.eventHandler, afterEventHandler: self.afterEventHandler, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        self.onSubscribed?()\n        let onDispose = self.onDispose\n        let allSubscriptions = Disposables.create {\n            subscription.dispose()\n            onDispose?()\n        }\n        return (sink: sink, subscription: allSubscriptions)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ElementAt.swift",
    "content": "//\n//  ElementAt.swift\n//  RxSwift\n//\n//  Created by Junior B. on 21/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns a sequence emitting only element _n_ emitted by an Observable\n\n     - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)\n\n     - parameter index: The index of the required element (starting from 0).\n     - returns: An observable sequence that emits the desired element as its own sole emission.\n     */\n    @available(*, deprecated, renamed: \"element(at:)\")\n    public func elementAt(_ index: Int)\n        -> Observable<Element> {\n        element(at: index)\n    }\n\n    /**\n     Returns a sequence emitting only element _n_ emitted by an Observable\n\n     - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)\n\n     - parameter index: The index of the required element (starting from 0).\n     - returns: An observable sequence that emits the desired element as its own sole emission.\n     */\n    public func element(at index: Int)\n        -> Observable<Element> {\n        ElementAt(source: self.asObservable(), index: index, throwOnEmpty: true)\n    }\n}\n\nfinal private class ElementAtSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias SourceType = Observer.Element\n    typealias Parent = ElementAt<SourceType>\n    \n    let parent: Parent\n    var i: Int\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.i = parent.index\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next:\n\n            if self.i == 0 {\n                self.forwardOn(event)\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n            \n            do {\n                _ = try decrementChecked(&self.i)\n            } catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n                return\n            }\n            \n        case .error(let e):\n            self.forwardOn(.error(e))\n            self.dispose()\n        case .completed:\n            if self.parent.throwOnEmpty {\n                self.forwardOn(.error(RxError.argumentOutOfRange))\n            } else {\n                self.forwardOn(.completed)\n            }\n            \n            self.dispose()\n        }\n    }\n}\n\nfinal private class ElementAt<SourceType>: Producer<SourceType> {\n    let source: Observable<SourceType>\n    let throwOnEmpty: Bool\n    let index: Int\n    \n    init(source: Observable<SourceType>, index: Int, throwOnEmpty: Bool) {\n        if index < 0 {\n            rxFatalError(\"index can't be negative\")\n        }\n\n        self.source = source\n        self.index = index\n        self.throwOnEmpty = throwOnEmpty\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceType {\n        let sink = ElementAtSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Empty.swift",
    "content": "//\n//  Empty.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Observable<Element> {\n        EmptyProducer<Element>()\n    }\n}\n\nfinal private class EmptyProducer<Element>: Producer<Element> {\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Enumerated.swift",
    "content": "//\n//  Enumerated.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/6/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Enumerates the elements of an observable sequence.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - returns: An observable sequence that contains tuples of source sequence elements and their indexes.\n     */\n    public func enumerated()\n        -> Observable<(index: Int, element: Element)> {\n        Enumerated(source: self.asObservable())\n    }\n}\n\nfinal private class EnumeratedSink<Element, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == (index: Int, element: Element) {\n    var index = 0\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            do {\n                let nextIndex = try incrementChecked(&self.index)\n                let next = (index: nextIndex, element: value)\n                self.forwardOn(.next(next))\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Enumerated<Element>: Producer<(index: Int, element: Element)> {\n    private let source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == (index: Int, element: Element) {\n        let sink = EnumeratedSink<Element, Observer>(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Error.swift",
    "content": "//\n//  Error.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Observable<Element> {\n        ErrorProducer(error: error)\n    }\n}\n\nfinal private class ErrorProducer<Element>: Producer<Element> {\n    private let error: Swift.Error\n    \n    init(error: Swift.Error) {\n        self.error = error\n    }\n    \n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        observer.on(.error(self.error))\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Filter.swift",
    "content": "//\n//  Filter.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Filters the elements of an observable sequence based on a predicate.\n\n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n\n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (Element) throws -> Bool)\n        -> Observable<Element> {\n        Filter(source: self.asObservable(), predicate: predicate)\n    }\n}\n\nextension ObservableType {\n    /**\n     Skips elements and completes (or errors) when the observable sequence completes (or errors). Equivalent to filter that always returns false.\n\n     - seealso: [ignoreElements operator on reactivex.io](http://reactivex.io/documentation/operators/ignoreelements.html)\n\n     - returns: An observable sequence that skips all elements of the source sequence.\n     */\n    public func ignoreElements()\n        -> Observable<Never> {\n        self.flatMap { _ in Observable<Never>.empty() }\n    }\n}\n\nfinal private class FilterSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Predicate = (Element) throws -> Bool\n    typealias Element = Observer.Element\n    \n    private let predicate: Predicate\n    \n    init(predicate: @escaping Predicate, observer: Observer, cancel: Cancelable) {\n        self.predicate = predicate\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            do {\n                let satisfies = try self.predicate(value)\n                if satisfies {\n                    self.forwardOn(.next(value))\n                }\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .completed, .error:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Filter<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n    \n    private let source: Observable<Element>\n    private let predicate: Predicate\n    \n    init(source: Observable<Element>, predicate: @escaping Predicate) {\n        self.source = source\n        self.predicate = predicate\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = FilterSink(predicate: self.predicate, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/First.swift",
    "content": "//\n//  First.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/31/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nprivate final class FirstSink<Element, Observer: ObserverType> : Sink<Observer>, ObserverType where Observer.Element == Element? {\n    typealias Parent = First<Element>\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            self.forwardOn(.next(value))\n            self.forwardOn(.completed)\n            self.dispose()\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.next(nil))\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal class First<Element>: Producer<Element?> {\n    private let source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element? {\n        let sink = FirstSink(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Generate.swift",
    "content": "//\n//  Generate.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler\n     to run the loop send out observer messages.\n\n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n\n     - parameter initialState: Initial state.\n     - parameter condition: Condition to terminate generation (upon returning `false`).\n     - parameter iterate: Iteration step function.\n     - parameter scheduler: Scheduler on which to run the generator loop.\n     - returns: The generated sequence.\n     */\n    public static func generate(initialState: Element, condition: @escaping (Element) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (Element) throws -> Element) -> Observable<Element> {\n        Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler)\n    }\n}\n\nfinal private class GenerateSink<Sequence, Observer: ObserverType>: Sink<Observer> {\n    typealias Parent = Generate<Sequence, Observer.Element>\n    \n    private let parent: Parent\n    \n    private var state: Sequence\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.state = parent.initialState\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return self.parent.scheduler.scheduleRecursive(true) { isFirst, recurse -> Void in\n            do {\n                if !isFirst {\n                    self.state = try self.parent.iterate(self.state)\n                }\n                \n                if try self.parent.condition(self.state) {\n                    let result = try self.parent.resultSelector(self.state)\n                    self.forwardOn(.next(result))\n                    \n                    recurse(false)\n                }\n                else {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal private class Generate<Sequence, Element>: Producer<Element> {\n    fileprivate let initialState: Sequence\n    fileprivate let condition: (Sequence) throws -> Bool\n    fileprivate let iterate: (Sequence) throws -> Sequence\n    fileprivate let resultSelector: (Sequence) throws -> Element\n    fileprivate let scheduler: ImmediateSchedulerType\n    \n    init(initialState: Sequence, condition: @escaping (Sequence) throws -> Bool, iterate: @escaping (Sequence) throws -> Sequence, resultSelector: @escaping (Sequence) throws -> Element, scheduler: ImmediateSchedulerType) {\n        self.initialState = initialState\n        self.condition = condition\n        self.iterate = iterate\n        self.resultSelector = resultSelector\n        self.scheduler = scheduler\n        super.init()\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = GenerateSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/GroupBy.swift",
    "content": "//\n//  GroupBy.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 01/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /*\n     Groups the elements of an observable sequence according to a specified key selector function.\n\n     - seealso: [groupBy operator on reactivex.io](http://reactivex.io/documentation/operators/groupby.html)\n\n     - parameter keySelector: A function to extract the key for each element.\n     - returns: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     */\n    public func groupBy<Key: Hashable>(keySelector: @escaping (Element) throws -> Key)\n        -> Observable<GroupedObservable<Key, Element>> {\n        GroupBy(source: self.asObservable(), selector: keySelector)\n    }\n}\n\nfinal private class GroupedObservableImpl<Element>: Observable<Element> {\n    private var subject: PublishSubject<Element>\n    private var refCount: RefCountDisposable\n    \n    init(subject: PublishSubject<Element>, refCount: RefCountDisposable) {\n        self.subject = subject\n        self.refCount = refCount\n    }\n\n    override public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        let release = self.refCount.retain()\n        let subscription = self.subject.subscribe(observer)\n        return Disposables.create(release, subscription)\n    }\n}\n\n\nfinal private class GroupBySink<Key: Hashable, Element, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Observer.Element == GroupedObservable<Key, Element> {\n    typealias ResultType = Observer.Element \n    typealias Parent = GroupBy<Key, Element>\n\n    private let parent: Parent\n    private let subscription = SingleAssignmentDisposable()\n    private var refCountDisposable: RefCountDisposable!\n    private var groupedSubjectTable: [Key: PublishSubject<Element>]\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.groupedSubjectTable = [Key: PublishSubject<Element>]()\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        self.refCountDisposable = RefCountDisposable(disposable: self.subscription)\n        \n        self.subscription.setDisposable(self.parent.source.subscribe(self))\n        \n        return self.refCountDisposable\n    }\n    \n    private func onGroupEvent(key: Key, value: Element) {\n        if let writer = self.groupedSubjectTable[key] {\n            writer.on(.next(value))\n        } else {\n            let writer = PublishSubject<Element>()\n            self.groupedSubjectTable[key] = writer\n            \n            let group = GroupedObservable(\n                key: key,\n                source: GroupedObservableImpl(subject: writer, refCount: refCountDisposable)\n            )\n            \n            self.forwardOn(.next(group))\n            writer.on(.next(value))\n        }\n    }\n\n    final func on(_ event: Event<Element>) {\n        switch event {\n        case let .next(value):\n            do {\n                let groupKey = try self.parent.selector(value)\n                self.onGroupEvent(key: groupKey, value: value)\n            }\n            catch let e {\n                self.error(e)\n                return\n            }\n        case let .error(e):\n            self.error(e)\n        case .completed:\n            self.forwardOnGroups(event: .completed)\n            self.forwardOn(.completed)\n            self.subscription.dispose()\n            self.dispose()\n        }\n    }\n\n    final func error(_ error: Swift.Error) {\n        self.forwardOnGroups(event: .error(error))\n        self.forwardOn(.error(error))\n        self.subscription.dispose()\n        self.dispose()\n    }\n    \n    final func forwardOnGroups(event: Event<Element>) {\n        for writer in self.groupedSubjectTable.values {\n            writer.on(event)\n        }\n    }\n}\n\nfinal private class GroupBy<Key: Hashable, Element>: Producer<GroupedObservable<Key,Element>> {\n    typealias KeySelector = (Element) throws -> Key\n\n    fileprivate let source: Observable<Element>\n    fileprivate let selector: KeySelector\n    \n    init(source: Observable<Element>, selector: @escaping KeySelector) {\n        self.source = source\n        self.selector = selector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == GroupedObservable<Key,Element> {\n        let sink = GroupBySink(parent: self, observer: observer, cancel: cancel)\n        return (sink: sink, subscription: sink.run())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Just.swift",
    "content": "//\n//  Just.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element) -> Observable<Element> {\n        Just(element: element)\n    }\n\n    /**\n     Returns an observable sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting observable sequence.\n     - parameter scheduler: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> Observable<Element> {\n        JustScheduled(element: element, scheduler: scheduler)\n    }\n}\n\nfinal private class JustScheduledSink<Observer: ObserverType>: Sink<Observer> {\n    typealias Parent = JustScheduled<Observer.Element>\n\n    private let parent: Parent\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let scheduler = self.parent.scheduler\n        return scheduler.schedule(self.parent.element) { element in\n            self.forwardOn(.next(element))\n            return scheduler.schedule(()) { _ in\n                self.forwardOn(.completed)\n                self.dispose()\n                return Disposables.create()\n            }\n        }\n    }\n}\n\nfinal private class JustScheduled<Element>: Producer<Element> {\n    fileprivate let scheduler: ImmediateSchedulerType\n    fileprivate let element: Element\n\n    init(element: Element, scheduler: ImmediateSchedulerType) {\n        self.scheduler = scheduler\n        self.element = element\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class Just<Element>: Producer<Element> {\n    private let element: Element\n    \n    init(element: Element) {\n        self.element = element\n    }\n    \n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        observer.on(.next(self.element))\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Map.swift",
    "content": "//\n//  Map.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a new form.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n\n     */\n    public func map<Result>(_ transform: @escaping (Element) throws -> Result)\n        -> Observable<Result> {\n        Map(source: self.asObservable(), transform: transform)\n    }\n}\n\nfinal private class MapSink<SourceType, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Transform = (SourceType) throws -> ResultType\n\n    typealias ResultType = Observer.Element \n    typealias Element = SourceType\n\n    private let transform: Transform\n\n    init(transform: @escaping Transform, observer: Observer, cancel: Cancelable) {\n        self.transform = transform\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let element):\n            do {\n                let mappedElement = try self.transform(element)\n                self.forwardOn(.next(mappedElement))\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Map<SourceType, ResultType>: Producer<ResultType> {\n    typealias Transform = (SourceType) throws -> ResultType\n\n    private let source: Observable<SourceType>\n\n    private let transform: Transform\n\n    init(source: Observable<SourceType>, transform: @escaping Transform) {\n        self.source = source\n        self.transform = transform\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == ResultType {\n        let sink = MapSink(transform: self.transform, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Materialize.swift",
    "content": "//\n//  Materialize.swift\n//  RxSwift\n//\n//  Created by sergdort on 08/03/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Convert any Observable into an Observable of its events.\n     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)\n     - returns: An observable sequence that wraps events in an Event<E>. The returned Observable never errors, but it does complete after observing all of the events of the underlying Observable.\n     */\n    public func materialize() -> Observable<Event<Element>> {\n        Materialize(source: self.asObservable())\n    }\n}\n\nprivate final class MaterializeSink<Element, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == Event<Element> {\n\n    func on(_ event: Event<Element>) {\n        self.forwardOn(.next(event))\n        if event.isStopEvent {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Materialize<T>: Producer<Event<T>> {\n    private let source: Observable<T>\n\n    init(source: Observable<T>) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = MaterializeSink(observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Merge.swift",
    "content": "//\n//  Merge.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source)\n        -> Observable<Source.Element> {\n            return FlatMap(source: self.asObservable(), selector: selector)\n    }\n\n}\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     If element is received while there is some projected observable sequence being merged it will simply be ignored.\n\n     - seealso: [flatMapFirst operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.\n     */\n    public func flatMapFirst<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source)\n        -> Observable<Source.Element> {\n            return FlatMapFirst(source: self.asObservable(), selector: selector)\n    }\n}\n\nextension ObservableType where Element: ObservableConvertibleType {\n\n    /**\n     Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public func merge() -> Observable<Element.Element> {\n        Merge(source: self.asObservable())\n    }\n\n    /**\n     Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.\n     - returns: The observable sequence that merges the elements of the inner sequences.\n     */\n    public func merge(maxConcurrent: Int)\n        -> Observable<Element.Element> {\n        MergeLimited(source: self.asObservable(), maxConcurrent: maxConcurrent)\n    }\n}\n\nextension ObservableType where Element: ObservableConvertibleType {\n\n    /**\n     Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n     */\n    public func concat() -> Observable<Element.Element> {\n        self.merge(maxConcurrent: 1)\n    }\n}\n\nextension ObservableType {\n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<Collection: Swift.Collection>(_ sources: Collection) -> Observable<Element> where Collection.Element == Observable<Element> {\n        MergeArray(sources: Array(sources))\n    }\n\n    /**\n     Merges elements from all observable sequences from array into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Array of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: [Observable<Element>]) -> Observable<Element> {\n        MergeArray(sources: sources)\n    }\n\n    /**\n     Merges elements from all observable sequences into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: Observable<Element>...) -> Observable<Element> {\n        MergeArray(sources: sources)\n    }\n}\n\n// MARK: concatMap\n\nextension ObservableType {\n    /**\n     Projects each element of an observable sequence to an observable sequence and concatenates the resulting observable sequences into one observable sequence.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n     */\n    \n    public func concatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source)\n        -> Observable<Source.Element> {\n        return ConcatMap(source: self.asObservable(), selector: selector)\n    }\n}\n\nprivate final class MergeLimitedSinkIter<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where SourceSequence.Element == Observer.Element {\n    typealias Element = Observer.Element\n    typealias DisposeKey = CompositeDisposable.DisposeKey\n    typealias Parent = MergeLimitedSink<SourceElement, SourceSequence, Observer>\n    \n    private let parent: Parent\n    private let disposeKey: DisposeKey\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n    \n    init(parent: Parent, disposeKey: DisposeKey) {\n        self.parent = parent\n        self.disposeKey = disposeKey\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.forwardOn(event)\n        case .error:\n            self.parent.forwardOn(event)\n            self.parent.dispose()\n        case .completed:\n            self.parent.group.remove(for: self.disposeKey)\n            if let next = self.parent.queue.dequeue() {\n                self.parent.subscribe(next, group: self.parent.group)\n            }\n            else {\n                self.parent.activeCount -= 1\n                \n                if self.parent.stopped && self.parent.activeCount == 0 {\n                    self.parent.forwardOn(.completed)\n                    self.parent.dispose()\n                }\n            }\n        }\n    }\n}\n\nprivate final class ConcatMapSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>: MergeLimitedSink<SourceElement, SourceSequence, Observer> where Observer.Element == SourceSequence.Element {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n    \n    private let selector: Selector\n    \n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        self.selector = selector\n        super.init(maxConcurrent: 1, observer: observer, cancel: cancel)\n    }\n    \n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        try self.selector(element)\n    }\n}\n\nprivate final class MergeLimitedBasicSink<SourceSequence: ObservableConvertibleType, Observer: ObserverType>: MergeLimitedSink<SourceSequence, SourceSequence, Observer> where Observer.Element == SourceSequence.Element {\n    \n    override func performMap(_ element: SourceSequence) throws -> SourceSequence {\n        element\n    }\n}\n\nprivate class MergeLimitedSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Observer.Element == SourceSequence.Element {\n    typealias QueueType = Queue<SourceSequence>\n\n    let maxConcurrent: Int\n\n    let lock = RecursiveLock()\n\n    // state\n    var stopped = false\n    var activeCount = 0\n    var queue = QueueType(capacity: 2)\n    \n    let sourceSubscription = SingleAssignmentDisposable()\n    let group = CompositeDisposable()\n    \n    init(maxConcurrent: Int, observer: Observer, cancel: Cancelable) {\n        self.maxConcurrent = maxConcurrent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<SourceElement>) -> Disposable {\n        _ = self.group.insert(self.sourceSubscription)\n        \n        let disposable = source.subscribe(self)\n        self.sourceSubscription.setDisposable(disposable)\n        return self.group\n    }\n    \n    func subscribe(_ innerSource: SourceSequence, group: CompositeDisposable) {\n        let subscription = SingleAssignmentDisposable()\n        \n        let key = group.insert(subscription)\n        \n        if let key = key {\n            let observer = MergeLimitedSinkIter(parent: self, disposeKey: key)\n            \n            let disposable = innerSource.asObservable().subscribe(observer)\n            subscription.setDisposable(disposable)\n        }\n    }\n    \n    func performMap(_ element: SourceElement) throws -> SourceSequence {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {\n        self.lock.performLocked {\n            let subscribe: Bool\n            if self.activeCount < self.maxConcurrent {\n                self.activeCount += 1\n                subscribe = true\n            }\n            else {\n                do {\n                    let value = try self.performMap(element)\n                    self.queue.enqueue(value)\n                } catch {\n                    self.forwardOn(.error(error))\n                    self.dispose()\n                }\n                subscribe = false\n            }\n\n            if subscribe {\n                do {\n                    return try self.performMap(element)\n                } catch {\n                    self.forwardOn(.error(error))\n                    self.dispose()\n                }\n            }\n\n            return nil\n        }\n    }\n\n    func on(_ event: Event<SourceElement>) {\n        switch event {\n        case .next(let element):\n            if let sequence = self.nextElementArrived(element: element) {\n                self.subscribe(sequence, group: self.group)\n            }\n        case .error(let error):\n            self.lock.performLocked {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        case .completed:\n            self.lock.performLocked {\n                if self.activeCount == 0 {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n                else {\n                    self.sourceSubscription.dispose()\n                }\n\n                self.stopped = true\n            }\n        }\n    }\n}\n\nfinal private class MergeLimited<SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.Element> {\n    private let source: Observable<SourceSequence>\n    private let maxConcurrent: Int\n    \n    init(source: Observable<SourceSequence>, maxConcurrent: Int) {\n        self.source = source\n        self.maxConcurrent = maxConcurrent\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceSequence.Element {\n        let sink = MergeLimitedBasicSink<SourceSequence, Observer>(maxConcurrent: self.maxConcurrent, observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// MARK: Merge\n\nprivate final class MergeBasicSink<Source: ObservableConvertibleType, Observer: ObserverType> : MergeSink<Source, Source, Observer> where Observer.Element == Source.Element {\n    override func performMap(_ element: Source) throws -> Source {\n        element\n    }\n}\n\n// MARK: flatMap\n\nprivate final class FlatMapSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : MergeSink<SourceElement, SourceSequence, Observer> where Observer.Element == SourceSequence.Element {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let selector: Selector\n\n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        self.selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        try self.selector(element)\n    }\n}\n\n// MARK: FlatMapFirst\n\nprivate final class FlatMapFirstSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : MergeSink<SourceElement, SourceSequence, Observer> where Observer.Element == SourceSequence.Element {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let selector: Selector\n\n    override var subscribeNext: Bool {\n        self.activeCount == 0\n    }\n\n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        self.selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        try self.selector(element)\n    }\n}\n\nprivate final class MergeSinkIter<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : ObserverType where Observer.Element == SourceSequence.Element {\n    typealias Parent = MergeSink<SourceElement, SourceSequence, Observer>\n    typealias DisposeKey = CompositeDisposable.DisposeKey\n    typealias Element = Observer.Element\n    \n    private let parent: Parent\n    private let disposeKey: DisposeKey\n\n    init(parent: Parent, disposeKey: DisposeKey) {\n        self.parent = parent\n        self.disposeKey = disposeKey\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.parent.lock.performLocked {\n            switch event {\n            case .next(let value):\n                self.parent.forwardOn(.next(value))\n            case .error(let error):\n                self.parent.forwardOn(.error(error))\n                self.parent.dispose()\n            case .completed:\n                self.parent.group.remove(for: self.disposeKey)\n                self.parent.activeCount -= 1\n                self.parent.checkCompleted()\n            }\n        }\n    }\n}\n\n\nprivate class MergeSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Observer.Element == SourceSequence.Element {\n    typealias ResultType = Observer.Element\n    typealias Element = SourceElement\n\n    let lock = RecursiveLock()\n\n    var subscribeNext: Bool {\n        true\n    }\n\n    // state\n    let group = CompositeDisposable()\n    let sourceSubscription = SingleAssignmentDisposable()\n\n    var activeCount = 0\n    var stopped = false\n\n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func performMap(_ element: SourceElement) throws -> SourceSequence {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {\n        self.lock.performLocked {\n            if !self.subscribeNext {\n                return nil\n            }\n\n            do {\n                let value = try self.performMap(element)\n                self.activeCount += 1\n                return value\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n                return nil\n            }\n        }\n    }\n    \n    func on(_ event: Event<SourceElement>) {\n        switch event {\n        case .next(let element):\n            if let value = self.nextElementArrived(element: element) {\n                self.subscribeInner(value.asObservable())\n            }\n        case .error(let error):\n            self.lock.performLocked {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        case .completed:\n            self.lock.performLocked {\n                self.stopped = true\n                self.sourceSubscription.dispose()\n                self.checkCompleted()\n            }\n        }\n    }\n\n    func subscribeInner(_ source: Observable<Observer.Element>) {\n        let iterDisposable = SingleAssignmentDisposable()\n        if let disposeKey = self.group.insert(iterDisposable) {\n            let iter = MergeSinkIter(parent: self, disposeKey: disposeKey)\n            let subscription = source.subscribe(iter)\n            iterDisposable.setDisposable(subscription)\n        }\n    }\n\n    func run(_ sources: [Observable<Observer.Element>]) -> Disposable {\n        self.activeCount += sources.count\n\n        for source in sources {\n            self.subscribeInner(source)\n        }\n\n        self.stopped = true\n\n        self.checkCompleted()\n\n        return self.group\n    }\n\n    @inline(__always)\n    func checkCompleted() {\n        if self.stopped && self.activeCount == 0 {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n    \n    func run(_ source: Observable<SourceElement>) -> Disposable {\n        _ = self.group.insert(self.sourceSubscription)\n\n        let subscription = source.subscribe(self)\n        self.sourceSubscription.setDisposable(subscription)\n        \n        return self.group\n    }\n}\n\n// MARK: Producers\n\nfinal private class FlatMap<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.Element> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let source: Observable<SourceElement>\n    \n    private let selector: Selector\n\n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        self.source = source\n        self.selector = selector\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceSequence.Element {\n        let sink = FlatMapSink(selector: self.selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class FlatMapFirst<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.Element> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let source: Observable<SourceElement>\n\n    private let selector: Selector\n\n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        self.source = source\n        self.selector = selector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceSequence.Element {\n        let sink = FlatMapFirstSink<SourceElement, SourceSequence, Observer>(selector: self.selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal class ConcatMap<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.Element> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n    \n    private let source: Observable<SourceElement>\n    private let selector: Selector\n    \n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        self.source = source\n        self.selector = selector\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceSequence.Element {\n        let sink = ConcatMapSink<SourceElement, SourceSequence, Observer>(selector: self.selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal class Merge<SourceSequence: ObservableConvertibleType> : Producer<SourceSequence.Element> {\n    private let source: Observable<SourceSequence>\n\n    init(source: Observable<SourceSequence>) {\n        self.source = source\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == SourceSequence.Element {\n        let sink = MergeBasicSink<SourceSequence, Observer>(observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class MergeArray<Element>: Producer<Element> {\n    private let sources: [Observable<Element>]\n\n    init(sources: [Observable<Element>]) {\n        self.sources = sources\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = MergeBasicSink<Observable<Element>, Observer>(observer: observer, cancel: cancel)\n        let subscription = sink.run(self.sources)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Multicast.swift",
    "content": "//\n//  Multicast.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\n Represents an observable wrapper that can be connected and disconnected from its underlying observable sequence.\n */\npublic class ConnectableObservable<Element>\n    : Observable<Element>\n    , ConnectableObservableType {\n\n    /**\n     Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.\n\n     - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.\n     */\n    public func connect() -> Disposable {\n        rxAbstractMethod()\n    }\n}\n\nextension ObservableType {\n\n    /**\n    Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function.\n\n    Each subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's invocation.\n\n    For specializations with fixed subject types, see `publish` and `replay`.\n\n    - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n    - parameter subjectSelector: Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n    - parameter selector: Selector function which can use the multicasted source sequence subject to the policies enforced by the created subject.\n    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n    */\n    public func multicast<Subject: SubjectType, Result>(_ subjectSelector: @escaping () throws -> Subject, selector: @escaping (Observable<Subject.Element>) throws -> Observable<Result>)\n        -> Observable<Result> where Subject.Observer.Element == Element {\n        return Multicast(\n            source: self.asObservable(),\n            subjectSelector: subjectSelector,\n            selector: selector\n        )\n    }\n}\n\nextension ObservableType {\n\n    /**\n    Returns a connectable observable sequence that shares a single subscription to the underlying sequence.\n\n    This operator is a specialization of `multicast` using a `PublishSubject`.\n\n    - seealso: [publish operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n    */\n    public func publish() -> ConnectableObservable<Element> {\n        self.multicast { PublishSubject() }\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying bufferSize elements.\n\n     This operator is a specialization of `multicast` using a `ReplaySubject`.\n\n     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - parameter bufferSize: Maximum element count of the replay buffer.\n     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n     */\n    public func replay(_ bufferSize: Int)\n        -> ConnectableObservable<Element> {\n        self.multicast { ReplaySubject.create(bufferSize: bufferSize) }\n    }\n\n    /**\n     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying all elements.\n\n     This operator is a specialization of `multicast` using a `ReplaySubject`.\n\n     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n     */\n    public func replayAll()\n        -> ConnectableObservable<Element> {\n        self.multicast { ReplaySubject.createUnbounded() }\n    }\n}\n\nextension ConnectableObservableType {\n\n    /**\n    Returns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n\n    - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html)\n\n    - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n    */\n    public func refCount() -> Observable<Element> {\n        RefCount(source: self)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Multicasts the source sequence notifications through the specified subject to the resulting connectable observable.\n\n     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.\n\n     For specializations with fixed subject types, see `publish` and `replay`.\n\n     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n     - parameter subject: Subject to push source elements into.\n     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.\n     */\n    public func multicast<Subject: SubjectType>(_ subject: Subject)\n        -> ConnectableObservable<Subject.Element> where Subject.Observer.Element == Element {\n        ConnectableObservableAdapter(source: self.asObservable(), makeSubject: { subject })\n    }\n\n    /**\n     Multicasts the source sequence notifications through an instantiated subject to the resulting connectable observable.\n\n     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.\n\n     Subject is cleared on connection disposal or in case source sequence produces terminal event.\n\n     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n     - parameter makeSubject: Factory function used to instantiate a subject for each connection.\n     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.\n     */\n    public func multicast<Subject: SubjectType>(makeSubject: @escaping () -> Subject)\n        -> ConnectableObservable<Subject.Element> where Subject.Observer.Element == Element {\n        ConnectableObservableAdapter(source: self.asObservable(), makeSubject: makeSubject)\n    }\n}\n\nfinal private class Connection<Subject: SubjectType>: ObserverType, Disposable {\n    typealias Element = Subject.Observer.Element\n\n    private var lock: RecursiveLock\n    // state\n    private var parent: ConnectableObservableAdapter<Subject>?\n    private var subscription : Disposable?\n    private var subjectObserver: Subject.Observer\n\n    private let disposed = AtomicInt(0)\n\n    init(parent: ConnectableObservableAdapter<Subject>, subjectObserver: Subject.Observer, lock: RecursiveLock, subscription: Disposable) {\n        self.parent = parent\n        self.subscription = subscription\n        self.lock = lock\n        self.subjectObserver = subjectObserver\n    }\n\n    func on(_ event: Event<Subject.Observer.Element>) {\n        if isFlagSet(self.disposed, 1) {\n            return\n        }\n        if event.isStopEvent {\n            self.dispose()\n        }\n        self.subjectObserver.on(event)\n    }\n\n    func dispose() {\n        lock.lock(); defer { lock.unlock() }\n        fetchOr(self.disposed, 1)\n        guard let parent = self.parent else {\n            return\n        }\n\n        if parent.connection === self {\n            parent.connection = nil\n            parent.subject = nil\n        }\n        self.parent = nil\n\n        self.subscription?.dispose()\n        self.subscription = nil\n    }\n}\n\nfinal private class ConnectableObservableAdapter<Subject: SubjectType>\n    : ConnectableObservable<Subject.Element> {\n    typealias ConnectionType = Connection<Subject>\n\n    private let source: Observable<Subject.Observer.Element>\n    private let makeSubject: () -> Subject\n\n    fileprivate let lock = RecursiveLock()\n    fileprivate var subject: Subject?\n\n    // state\n    fileprivate var connection: ConnectionType?\n\n    init(source: Observable<Subject.Observer.Element>, makeSubject: @escaping () -> Subject) {\n        self.source = source\n        self.makeSubject = makeSubject\n        self.subject = nil\n        self.connection = nil\n    }\n\n    override func connect() -> Disposable {\n        return self.lock.performLocked {\n            if let connection = self.connection {\n                return connection\n            }\n\n            let singleAssignmentDisposable = SingleAssignmentDisposable()\n            let connection = Connection(parent: self, subjectObserver: self.lazySubject.asObserver(), lock: self.lock, subscription: singleAssignmentDisposable)\n            self.connection = connection\n            let subscription = self.source.subscribe(connection)\n            singleAssignmentDisposable.setDisposable(subscription)\n            return connection\n        }\n    }\n\n    private var lazySubject: Subject {\n        if let subject = self.subject {\n            return subject\n        }\n\n        let subject = self.makeSubject()\n        self.subject = subject\n        return subject\n    }\n\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Subject.Element {\n        self.lazySubject.subscribe(observer)\n    }\n}\n\nfinal private class RefCountSink<ConnectableSource: ConnectableObservableType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where ConnectableSource.Element == Observer.Element {\n    typealias Element = Observer.Element \n    typealias Parent = RefCount<ConnectableSource>\n\n    private let parent: Parent\n\n    private var connectionIdSnapshot: Int64 = -1\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription = self.parent.source.subscribe(self)\n        self.parent.lock.lock(); defer { self.parent.lock.unlock() }\n\n        self.connectionIdSnapshot = self.parent.connectionId\n\n        if self.isDisposed {\n            return Disposables.create()\n        }\n\n        if self.parent.count == 0 {\n            self.parent.count = 1\n            self.parent.connectableSubscription = self.parent.source.connect()\n        }\n        else {\n            self.parent.count += 1\n        }\n\n        return Disposables.create {\n            subscription.dispose()\n            self.parent.lock.lock(); defer { self.parent.lock.unlock() }\n            if self.parent.connectionId != self.connectionIdSnapshot {\n                return\n            }\n            if self.parent.count == 1 {\n                self.parent.count = 0\n                guard let connectableSubscription = self.parent.connectableSubscription else {\n                    return\n                }\n\n                connectableSubscription.dispose()\n                self.parent.connectableSubscription = nil\n            }\n            else if self.parent.count > 1 {\n                self.parent.count -= 1\n            }\n            else {\n                rxFatalError(\"Something went wrong with RefCount disposing mechanism\")\n            }\n        }\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .error, .completed:\n            self.parent.lock.lock()\n            if self.parent.connectionId == self.connectionIdSnapshot {\n                let connection = self.parent.connectableSubscription\n                defer { connection?.dispose() }\n                self.parent.count = 0\n                self.parent.connectionId = self.parent.connectionId &+ 1\n                self.parent.connectableSubscription = nil\n            }\n            self.parent.lock.unlock()\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class RefCount<ConnectableSource: ConnectableObservableType>: Producer<ConnectableSource.Element> {\n    fileprivate let lock = RecursiveLock()\n\n    // state\n    fileprivate var count = 0\n    fileprivate var connectionId: Int64 = 0\n    fileprivate var connectableSubscription = nil as Disposable?\n\n    fileprivate let source: ConnectableSource\n\n    init(source: ConnectableSource) {\n        self.source = source\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable)\n             where Observer.Element == ConnectableSource.Element {\n        let sink = RefCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class MulticastSink<Subject: SubjectType, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias ResultType = Element\n    typealias MutlicastType = Multicast<Subject, Observer.Element>\n\n    private let parent: MutlicastType\n\n    init(parent: MutlicastType, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        do {\n            let subject = try self.parent.subjectSelector()\n            let connectable = ConnectableObservableAdapter(source: self.parent.source, makeSubject: { subject })\n\n            let observable = try self.parent.selector(connectable)\n\n            let subscription = observable.subscribe(self)\n            let connection = connectable.connect()\n\n            return Disposables.create(subscription, connection)\n        }\n        catch let e {\n            self.forwardOn(.error(e))\n            self.dispose()\n            return Disposables.create()\n        }\n    }\n\n    func on(_ event: Event<ResultType>) {\n        self.forwardOn(event)\n        switch event {\n        case .next: break\n        case .error, .completed:\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Multicast<Subject: SubjectType, Result>: Producer<Result> {\n    typealias SubjectSelectorType = () throws -> Subject\n    typealias SelectorType = (Observable<Subject.Element>) throws -> Observable<Result>\n\n    fileprivate let source: Observable<Subject.Observer.Element>\n    fileprivate let subjectSelector: SubjectSelectorType\n    fileprivate let selector: SelectorType\n\n    init(source: Observable<Subject.Observer.Element>, subjectSelector: @escaping SubjectSelectorType, selector: @escaping SelectorType) {\n        self.source = source\n        self.subjectSelector = subjectSelector\n        self.selector = selector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = MulticastSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Never.swift",
    "content": "//\n//  Never.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Observable<Element> {\n        NeverProducer()\n    }\n}\n\nfinal private class NeverProducer<Element>: Producer<Element> {\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ObserveOn.swift",
    "content": "//\n//  ObserveOn.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    public func observe(on scheduler: ImmediateSchedulerType)\n        -> Observable<Element> {\n        guard let serialScheduler = scheduler as? SerialDispatchQueueScheduler else {\n            return ObserveOn(source: self.asObservable(), scheduler: scheduler)\n        }\n\n        return ObserveOnSerialDispatchQueue(source: self.asObservable(),\n                                            scheduler: serialScheduler)\n    }\n\n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    @available(*, deprecated, renamed: \"observe(on:)\")\n    public func observeOn(_ scheduler: ImmediateSchedulerType)\n        -> Observable<Element> {\n        observe(on: scheduler)\n    }\n}\n\nfinal private class ObserveOn<Element>: Producer<Element> {\n    let scheduler: ImmediateSchedulerType\n    let source: Observable<Element>\n\n    init(source: Observable<Element>, scheduler: ImmediateSchedulerType) {\n        self.scheduler = scheduler\n        self.source = source\n\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ObserveOnSink(scheduler: self.scheduler, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n\n#if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n#endif\n}\n\nenum ObserveOnState : Int32 {\n    // pump is not running\n    case stopped = 0\n    // pump is running\n    case running = 1\n}\n\nfinal private class ObserveOnSink<Observer: ObserverType>: ObserverBase<Observer.Element> {\n    typealias Element = Observer.Element \n\n    let scheduler: ImmediateSchedulerType\n\n    var lock = SpinLock()\n    let observer: Observer\n\n    // state\n    var state = ObserveOnState.stopped\n    var queue = Queue<Event<Element>>(capacity: 10)\n\n    let scheduleDisposable = SerialDisposable()\n    let cancel: Cancelable\n\n    init(scheduler: ImmediateSchedulerType, observer: Observer, cancel: Cancelable) {\n        self.scheduler = scheduler\n        self.observer = observer\n        self.cancel = cancel\n    }\n\n    override func onCore(_ event: Event<Element>) {\n        let shouldStart = self.lock.performLocked { () -> Bool in\n            self.queue.enqueue(event)\n\n            switch self.state {\n            case .stopped:\n                self.state = .running\n                return true\n            case .running:\n                return false\n            }\n        }\n\n        if shouldStart {\n            self.scheduleDisposable.disposable = self.scheduler.scheduleRecursive((), action: self.run)\n        }\n    }\n\n    func run(_ state: (), _ recurse: (()) -> Void) {\n        let (nextEvent, observer) = self.lock.performLocked { () -> (Event<Element>?, Observer) in\n            if !self.queue.isEmpty {\n                return (self.queue.dequeue(), self.observer)\n            }\n            else {\n                self.state = .stopped\n                return (nil, self.observer)\n            }\n        }\n\n        if let nextEvent = nextEvent, !self.cancel.isDisposed {\n            observer.on(nextEvent)\n            if nextEvent.isStopEvent {\n                self.dispose()\n            }\n        }\n        else {\n            return\n        }\n\n        let shouldContinue = self.shouldContinue_synchronized()\n\n        if shouldContinue {\n            recurse(())\n        }\n    }\n\n    func shouldContinue_synchronized() -> Bool {\n        self.lock.performLocked {\n            let isEmpty = self.queue.isEmpty\n            if isEmpty { self.state = .stopped }\n            return !isEmpty\n        }\n    }\n\n    override func dispose() {\n        super.dispose()\n\n        self.cancel.dispose()\n        self.scheduleDisposable.dispose()\n    }\n}\n\n#if TRACE_RESOURCES\n    private let numberOfSerialDispatchObservables = AtomicInt(0)\n    extension Resources {\n        /**\n         Counts number of `SerialDispatchQueueObservables`.\n\n         Purposed for unit tests.\n         */\n        public static var numberOfSerialDispatchQueueObservables: Int32 {\n            return load(numberOfSerialDispatchObservables)\n        }\n    }\n#endif\n\nfinal private class ObserveOnSerialDispatchQueueSink<Observer: ObserverType>: ObserverBase<Observer.Element> {\n    let scheduler: SerialDispatchQueueScheduler\n    let observer: Observer\n\n    let cancel: Cancelable\n\n    var cachedScheduleLambda: (((sink: ObserveOnSerialDispatchQueueSink<Observer>, event: Event<Element>)) -> Disposable)!\n\n    init(scheduler: SerialDispatchQueueScheduler, observer: Observer, cancel: Cancelable) {\n        self.scheduler = scheduler\n        self.observer = observer\n        self.cancel = cancel\n        super.init()\n\n        self.cachedScheduleLambda = { pair in\n            guard !cancel.isDisposed else { return Disposables.create() }\n\n            pair.sink.observer.on(pair.event)\n\n            if pair.event.isStopEvent {\n                pair.sink.dispose()\n            }\n\n            return Disposables.create()\n        }\n    }\n\n    override func onCore(_ event: Event<Element>) {\n        _ = self.scheduler.schedule((self, event), action: self.cachedScheduleLambda!)\n    }\n\n    override func dispose() {\n        super.dispose()\n\n        self.cancel.dispose()\n    }\n}\n\nfinal private class ObserveOnSerialDispatchQueue<Element>: Producer<Element> {\n    let scheduler: SerialDispatchQueueScheduler\n    let source: Observable<Element>\n\n    init(source: Observable<Element>, scheduler: SerialDispatchQueueScheduler) {\n        self.scheduler = scheduler\n        self.source = source\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n            _ = increment(numberOfSerialDispatchObservables)\n        #endif\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ObserveOnSerialDispatchQueueSink(scheduler: self.scheduler, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n        _ = decrement(numberOfSerialDispatchObservables)\n    }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Optional.swift",
    "content": "//\n//  Optional.swift\n//  RxSwift\n//\n//  Created by tarunon on 2016/12/13.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Converts a optional to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter optional: Optional element in the resulting observable sequence.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: Element?) -> Observable<Element> {\n        ObservableOptional(optional: optional)\n    }\n\n    /**\n     Converts a optional to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter optional: Optional element in the resulting observable sequence.\n     - parameter scheduler: Scheduler to send the optional element on.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: Element?, scheduler: ImmediateSchedulerType) -> Observable<Element> {\n        ObservableOptionalScheduled(optional: optional, scheduler: scheduler)\n    }\n}\n\nfinal private class ObservableOptionalScheduledSink<Observer: ObserverType>: Sink<Observer> {\n    typealias Element = Observer.Element \n    typealias Parent = ObservableOptionalScheduled<Element>\n\n    private let parent: Parent\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return self.parent.scheduler.schedule(self.parent.optional) { (optional: Element?) -> Disposable in\n            if let next = optional {\n                self.forwardOn(.next(next))\n                return self.parent.scheduler.schedule(()) { _ in\n                    self.forwardOn(.completed)\n                    self.dispose()\n                    return Disposables.create()\n                }\n            } else {\n                self.forwardOn(.completed)\n                self.dispose()\n                return Disposables.create()\n            }\n        }\n    }\n}\n\nfinal private class ObservableOptionalScheduled<Element>: Producer<Element> {\n    fileprivate let optional: Element?\n    fileprivate let scheduler: ImmediateSchedulerType\n\n    init(optional: Element?, scheduler: ImmediateSchedulerType) {\n        self.optional = optional\n        self.scheduler = scheduler\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ObservableOptionalScheduledSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class ObservableOptional<Element>: Producer<Element> {\n    private let optional: Element?\n    \n    init(optional: Element?) {\n        self.optional = optional\n    }\n    \n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if let element = self.optional {\n            observer.on(.next(element))\n        }\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Producer.swift",
    "content": "//\n//  Producer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass Producer<Element>: Observable<Element> {\n    override init() {\n        super.init()\n    }\n\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if !CurrentThreadScheduler.isScheduleRequired {\n            // The returned disposable needs to release all references once it was disposed.\n            let disposer = SinkDisposer()\n            let sinkAndSubscription = self.run(observer, cancel: disposer)\n            disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)\n\n            return disposer\n        }\n        else {\n            return CurrentThreadScheduler.instance.schedule(()) { _ in\n                let disposer = SinkDisposer()\n                let sinkAndSubscription = self.run(observer, cancel: disposer)\n                disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)\n\n                return disposer\n            }\n        }\n    }\n\n    func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        rxAbstractMethod()\n    }\n}\n\nprivate final class SinkDisposer: Cancelable {\n    private enum DisposeState: Int32 {\n        case disposed = 1\n        case sinkAndSubscriptionSet = 2\n    }\n\n    private let state = AtomicInt(0)\n    private var sink: Disposable?\n    private var subscription: Disposable?\n\n    var isDisposed: Bool {\n        isFlagSet(self.state, DisposeState.disposed.rawValue)\n    }\n\n    func setSinkAndSubscription(sink: Disposable, subscription: Disposable) {\n        self.sink = sink\n        self.subscription = subscription\n\n        let previousState = fetchOr(self.state, DisposeState.sinkAndSubscriptionSet.rawValue)\n        if (previousState & DisposeState.sinkAndSubscriptionSet.rawValue) != 0 {\n            rxFatalError(\"Sink and subscription were already set\")\n        }\n\n        if (previousState & DisposeState.disposed.rawValue) != 0 {\n            sink.dispose()\n            subscription.dispose()\n            self.sink = nil\n            self.subscription = nil\n        }\n    }\n\n    func dispose() {\n        let previousState = fetchOr(self.state, DisposeState.disposed.rawValue)\n\n        if (previousState & DisposeState.disposed.rawValue) != 0 {\n            return\n        }\n\n        if (previousState & DisposeState.sinkAndSubscriptionSet.rawValue) != 0 {\n            guard let sink = self.sink else {\n                rxFatalError(\"Sink not set\")\n            }\n            guard let subscription = self.subscription else {\n                rxFatalError(\"Subscription not set\")\n            }\n\n            sink.dispose()\n            subscription.dispose()\n\n            self.sink = nil\n            self.subscription = nil\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Range.swift",
    "content": "//\n//  Range.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where Element: RxAbstractInteger {\n    /**\n     Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages.\n\n     - seealso: [range operator on reactivex.io](http://reactivex.io/documentation/operators/range.html)\n\n     - parameter start: The value of the first integer in the sequence.\n     - parameter count: The number of sequential integers to generate.\n     - parameter scheduler: Scheduler to run the generator loop on.\n     - returns: An observable sequence that contains a range of sequential integral numbers.\n     */\n    public static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {\n        RangeProducer<Element>(start: start, count: count, scheduler: scheduler)\n    }\n}\n\nfinal private class RangeProducer<Element: RxAbstractInteger>: Producer<Element> {\n    fileprivate let start: Element\n    fileprivate let count: Element\n    fileprivate let scheduler: ImmediateSchedulerType\n\n    init(start: Element, count: Element, scheduler: ImmediateSchedulerType) {\n        guard count >= 0 else {\n            rxFatalError(\"count can't be negative\")\n        }\n\n        guard start &+ (count - 1) >= start || count == 0 else {\n            rxFatalError(\"overflow of count\")\n        }\n\n        self.start = start\n        self.count = count\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = RangeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class RangeSink<Observer: ObserverType>: Sink<Observer> where Observer.Element: RxAbstractInteger {\n    typealias Parent = RangeProducer<Observer.Element>\n    \n    private let parent: Parent\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return self.parent.scheduler.scheduleRecursive(0 as Observer.Element) { i, recurse in\n            if i < self.parent.count {\n                self.forwardOn(.next(self.parent.start + i))\n                recurse(i + 1)\n            }\n            else {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Reduce.swift",
    "content": "//\n//  Reduce.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\nextension ObservableType {\n    /**\n    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.\n\n    For aggregation behavior with incremental intermediate results, see `scan`.\n\n    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)\n\n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: A accumulator function to be invoked on each element.\n    - parameter mapResult: A function to transform the final accumulator value into the result value.\n    - returns: An observable sequence containing a single element with the final accumulator value.\n    */\n    public func reduce<A, Result>(_ seed: A, accumulator: @escaping (A, Element) throws -> A, mapResult: @escaping (A) throws -> Result)\n        -> Observable<Result> {\n        Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: mapResult)\n    }\n\n    /**\n    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.\n    \n    For aggregation behavior with incremental intermediate results, see `scan`.\n\n    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)\n    \n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: A accumulator function to be invoked on each element.\n    - returns: An observable sequence containing a single element with the final accumulator value.\n    */\n    public func reduce<A>(_ seed: A, accumulator: @escaping (A, Element) throws -> A)\n        -> Observable<A> {\n        Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: { $0 })\n    }\n}\n\nfinal private class ReduceSink<SourceType, AccumulateType, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias ResultType = Observer.Element \n    typealias Parent = Reduce<SourceType, AccumulateType, ResultType>\n    \n    private let parent: Parent\n    private var accumulation: AccumulateType\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.accumulation = parent.seed\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let value):\n            do {\n                self.accumulation = try self.parent.accumulator(self.accumulation, value)\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .error(let e):\n            self.forwardOn(.error(e))\n            self.dispose()\n        case .completed:\n            do {\n                let result = try self.parent.mapResult(self.accumulation)\n                self.forwardOn(.next(result))\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal private class Reduce<SourceType, AccumulateType, ResultType>: Producer<ResultType> {\n    typealias AccumulatorType = (AccumulateType, SourceType) throws -> AccumulateType\n    typealias ResultSelectorType = (AccumulateType) throws -> ResultType\n    \n    private let source: Observable<SourceType>\n    fileprivate let seed: AccumulateType\n    fileprivate let accumulator: AccumulatorType\n    fileprivate let mapResult: ResultSelectorType\n    \n    init(source: Observable<SourceType>, seed: AccumulateType, accumulator: @escaping AccumulatorType, mapResult: @escaping ResultSelectorType) {\n        self.source = source\n        self.seed = seed\n        self.accumulator = accumulator\n        self.mapResult = mapResult\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == ResultType {\n        let sink = ReduceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Repeat.swift",
    "content": "//\n//  Repeat.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages.\n\n     - seealso: [repeat operator on reactivex.io](http://reactivex.io/documentation/operators/repeat.html)\n\n     - parameter element: Element to repeat.\n     - parameter scheduler: Scheduler to run the producer loop on.\n     - returns: An observable sequence that repeats the given element infinitely.\n     */\n    public static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {\n        RepeatElement(element: element, scheduler: scheduler)\n    }\n}\n\nfinal private class RepeatElement<Element>: Producer<Element> {\n    fileprivate let element: Element\n    fileprivate let scheduler: ImmediateSchedulerType\n    \n    init(element: Element, scheduler: ImmediateSchedulerType) {\n        self.element = element\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class RepeatElementSink<Observer: ObserverType>: Sink<Observer> {\n    typealias Parent = RepeatElement<Observer.Element>\n    \n    private let parent: Parent\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return self.parent.scheduler.scheduleRecursive(self.parent.element) { e, recurse in\n            self.forwardOn(.next(e))\n            recurse(e)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/RetryWhen.swift",
    "content": "//\n//  RetryWhen.swift\n//  RxSwift\n//\n//  Created by Junior B. on 06/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retry<TriggerObservable: ObservableType, Error: Swift.Error>(when notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> Observable<Element> {\n        RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    @available(*, deprecated, renamed: \"retry(when:)\")\n    public func retryWhen<TriggerObservable: ObservableType, Error: Swift.Error>(_ notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> Observable<Element> {\n        retry(when: notificationHandler)\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retry<TriggerObservable: ObservableType>(when notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> Observable<Element> {\n        RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    @available(*, deprecated, renamed: \"retry(when:)\")\n    public func retryWhen<TriggerObservable: ObservableType>(_ notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> Observable<Element> {\n        RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)\n    }\n}\n\nfinal private class RetryTriggerSink<Sequence: Swift.Sequence, Observer: ObserverType, TriggerObservable: ObservableType, Error>\n    : ObserverType where Sequence.Element: ObservableType, Sequence.Element.Element == Observer.Element {\n    typealias Element = TriggerObservable.Element\n    \n    typealias Parent = RetryWhenSequenceSinkIter<Sequence, Observer, TriggerObservable, Error>\n    \n    private let parent: Parent\n\n    init(parent: Parent) {\n        self.parent = parent\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.parent.lastError = nil\n            self.parent.parent.schedule(.moveNext)\n        case .error(let e):\n            self.parent.parent.forwardOn(.error(e))\n            self.parent.parent.dispose()\n        case .completed:\n            self.parent.parent.forwardOn(.completed)\n            self.parent.parent.dispose()\n        }\n    }\n}\n\nfinal private class RetryWhenSequenceSinkIter<Sequence: Swift.Sequence, Observer: ObserverType, TriggerObservable: ObservableType, Error>\n    : ObserverType\n    , Disposable where Sequence.Element: ObservableType, Sequence.Element.Element == Observer.Element {\n    typealias Element = Observer.Element \n    typealias Parent = RetryWhenSequenceSink<Sequence, Observer, TriggerObservable, Error>\n\n    fileprivate let parent: Parent\n    private let errorHandlerSubscription = SingleAssignmentDisposable()\n    private let subscription: Disposable\n\n    init(parent: Parent, subscription: Disposable) {\n        self.parent = parent\n        self.subscription = subscription\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.forwardOn(event)\n        case .error(let error):\n            self.parent.lastError = error\n\n            if let failedWith = error as? Error {\n                // dispose current subscription\n                self.subscription.dispose()\n\n                let errorHandlerSubscription = self.parent.notifier.subscribe(RetryTriggerSink(parent: self))\n                self.errorHandlerSubscription.setDisposable(errorHandlerSubscription)\n                self.parent.errorSubject.on(.next(failedWith))\n            }\n            else {\n                self.parent.forwardOn(.error(error))\n                self.parent.dispose()\n            }\n        case .completed:\n            self.parent.forwardOn(event)\n            self.parent.dispose()\n        }\n    }\n\n    final func dispose() {\n        self.subscription.dispose()\n        self.errorHandlerSubscription.dispose()\n    }\n}\n\nfinal private class RetryWhenSequenceSink<Sequence: Swift.Sequence, Observer: ObserverType, TriggerObservable: ObservableType, Error>\n    : TailRecursiveSink<Sequence, Observer> where Sequence.Element: ObservableType, Sequence.Element.Element == Observer.Element {\n    typealias Element = Observer.Element \n    typealias Parent = RetryWhenSequence<Sequence, TriggerObservable, Error>\n    \n    let lock = RecursiveLock()\n    \n    private let parent: Parent\n    \n    fileprivate var lastError: Swift.Error?\n    fileprivate let errorSubject = PublishSubject<Error>()\n    private let handler: Observable<TriggerObservable.Element>\n    fileprivate let notifier = PublishSubject<TriggerObservable.Element>()\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.handler = parent.notificationHandler(self.errorSubject).asObservable()\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    override func done() {\n        if let lastError = self.lastError {\n            self.forwardOn(.error(lastError))\n            self.lastError = nil\n        }\n        else {\n            self.forwardOn(.completed)\n        }\n\n        self.dispose()\n    }\n    \n    override func extract(_ observable: Observable<Element>) -> SequenceGenerator? {\n        // It is important to always return `nil` here because there are sideffects in the `run` method\n        // that are dependant on particular `retryWhen` operator so single operator stack can't be reused in this\n        // case.\n        return nil\n    }\n\n    override func subscribeToNext(_ source: Observable<Element>) -> Disposable {\n        let subscription = SingleAssignmentDisposable()\n        let iter = RetryWhenSequenceSinkIter(parent: self, subscription: subscription)\n        subscription.setDisposable(source.subscribe(iter))\n        return iter\n    }\n\n    override func run(_ sources: SequenceGenerator) -> Disposable {\n        let triggerSubscription = self.handler.subscribe(self.notifier.asObserver())\n        let superSubscription = super.run(sources)\n        return Disposables.create(superSubscription, triggerSubscription)\n    }\n}\n\nfinal private class RetryWhenSequence<Sequence: Swift.Sequence, TriggerObservable: ObservableType, Error>: Producer<Sequence.Element.Element> where Sequence.Element: ObservableType {\n    typealias Element = Sequence.Element.Element\n    \n    private let sources: Sequence\n    fileprivate let notificationHandler: (Observable<Error>) -> TriggerObservable\n    \n    init(sources: Sequence, notificationHandler: @escaping (Observable<Error>) -> TriggerObservable) {\n        self.sources = sources\n        self.notificationHandler = notificationHandler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = RetryWhenSequenceSink<Sequence, Observer, TriggerObservable, Error>(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run((self.sources.makeIterator(), nil))\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sample.swift",
    "content": "//\n//  Sample.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Samples the source observable sequence using a sampler observable sequence producing sampling ticks.\n\n     Upon each sampling tick, the latest element (if any) in the source sequence during the last sampling interval is sent to the resulting sequence.\n\n     **In case there were no new elements between sampler ticks, you may provide a default value to be emitted, instead\n       to the resulting sequence otherwise no element is sent.**\n\n     - seealso: [sample operator on reactivex.io](http://reactivex.io/documentation/operators/sample.html)\n\n     - parameter sampler: Sampling tick sequence.\n     - parameter defaultValue: a value to return if there are no new elements between sampler ticks\n     - returns: Sampled observable sequence.\n     */\n    public func sample<Source: ObservableType>(_ sampler: Source, defaultValue: Element? = nil)\n        -> Observable<Element> {\n            return Sample(source: self.asObservable(), sampler: sampler.asObservable(), defaultValue: defaultValue)\n    }\n}\n\nfinal private class SamplerSink<Observer: ObserverType, SampleType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = SampleType\n    \n    typealias Parent = SampleSequenceSink<Observer, SampleType>\n    \n    private let parent: Parent\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n    \n    init(parent: Parent) {\n        self.parent = parent\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next, .completed:\n            if let element = parent.element ?? self.parent.defaultValue {\n                self.parent.element = nil\n                self.parent.forwardOn(.next(element))\n            }\n\n            if self.parent.atEnd {\n                self.parent.forwardOn(.completed)\n                self.parent.dispose()\n            }\n        case .error(let e):\n            self.parent.forwardOn(.error(e))\n            self.parent.dispose()\n        }\n    }\n}\n\nfinal private class SampleSequenceSink<Observer: ObserverType, SampleType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = Observer.Element \n    typealias Parent = Sample<Element, SampleType>\n    \n    fileprivate let parent: Parent\n    fileprivate let defaultValue: Element?\n\n    let lock = RecursiveLock()\n    \n    // state\n    fileprivate var element = nil as Element?\n    fileprivate var atEnd = false\n    \n    private let sourceSubscription = SingleAssignmentDisposable()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable, defaultValue: Element? = nil) {\n        self.parent = parent\n        self.defaultValue = defaultValue\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        self.sourceSubscription.setDisposable(self.parent.source.subscribe(self))\n        let samplerSubscription = self.parent.sampler.subscribe(SamplerSink(parent: self))\n        \n        return Disposables.create(sourceSubscription, samplerSubscription)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            self.element = element\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.atEnd = true\n            self.sourceSubscription.dispose()\n        }\n    }\n    \n}\n\nfinal private class Sample<Element, SampleType>: Producer<Element> {\n    fileprivate let source: Observable<Element>\n    fileprivate let sampler: Observable<SampleType>\n    fileprivate let defaultValue: Element?\n    \n    init(source: Observable<Element>, sampler: Observable<SampleType>, defaultValue: Element? = nil) {\n        self.source = source\n        self.sampler = sampler\n        self.defaultValue = defaultValue\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SampleSequenceSink(parent: self, observer: observer, cancel: cancel, defaultValue: self.defaultValue)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Scan.swift",
    "content": "//\n//  Scan.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n\n     For aggregation behavior with no intermediate results, see `reduce`.\n\n     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)\n\n     - parameter seed: The initial accumulator value.\n     - parameter accumulator: An accumulator function to be invoked on each element.\n     - returns: An observable sequence containing the accumulated values.\n     */\n    public func scan<A>(into seed: A, accumulator: @escaping (inout A, Element) throws -> Void)\n        -> Observable<A> {\n        Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)\n    }\n\n    /**\n     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n\n     For aggregation behavior with no intermediate results, see `reduce`.\n\n     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)\n\n     - parameter seed: The initial accumulator value.\n     - parameter accumulator: An accumulator function to be invoked on each element.\n     - returns: An observable sequence containing the accumulated values.\n     */\n    public func scan<A>(_ seed: A, accumulator: @escaping (A, Element) throws -> A)\n        -> Observable<A> {\n        return Scan(source: self.asObservable(), seed: seed) { acc, element in\n            let currentAcc = acc\n            acc = try accumulator(currentAcc, element)\n        }\n    }\n}\n\nfinal private class ScanSink<Element, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Accumulate = Observer.Element \n    typealias Parent = Scan<Element, Accumulate>\n\n    private let parent: Parent\n    private var accumulate: Accumulate\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.accumulate = parent.seed\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            do {\n                try self.parent.accumulator(&self.accumulate, element)\n                self.forwardOn(.next(self.accumulate))\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n    \n}\n\nfinal private class Scan<Element, Accumulate>: Producer<Accumulate> {\n    typealias Accumulator = (inout Accumulate, Element) throws -> Void\n    \n    private let source: Observable<Element>\n    fileprivate let seed: Accumulate\n    fileprivate let accumulator: Accumulator\n    \n    init(source: Observable<Element>, seed: Accumulate, accumulator: @escaping Accumulator) {\n        self.source = source\n        self.seed = seed\n        self.accumulator = accumulator\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Accumulate {\n        let sink = ScanSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sequence.swift",
    "content": "//\n//  Sequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    // MARK: of\n\n    /**\n     This method creates a new Observable instance with a variable number of elements.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter elements: Elements to generate.\n     - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediately on subscription.\n     - returns: The observable sequence whose elements are pulled from the given arguments.\n     */\n    public static func of(_ elements: Element ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {\n        ObservableSequence(elements: elements, scheduler: scheduler)\n    }\n}\n\nextension ObservableType {\n    /**\n     Converts an array to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from(_ array: [Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {\n        ObservableSequence(elements: array, scheduler: scheduler)\n    }\n\n    /**\n     Converts a sequence to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from<Sequence: Swift.Sequence>(_ sequence: Sequence, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> where Sequence.Element == Element {\n        ObservableSequence(elements: sequence, scheduler: scheduler)\n    }\n}\n\nfinal private class ObservableSequenceSink<Sequence: Swift.Sequence, Observer: ObserverType>: Sink<Observer> where Sequence.Element == Observer.Element {\n    typealias Parent = ObservableSequence<Sequence>\n\n    private let parent: Parent\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return self.parent.scheduler.scheduleRecursive(self.parent.elements.makeIterator()) { iterator, recurse in\n            var mutableIterator = iterator\n            if let next = mutableIterator.next() {\n                self.forwardOn(.next(next))\n                recurse(mutableIterator)\n            }\n            else {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal private class ObservableSequence<Sequence: Swift.Sequence>: Producer<Sequence.Element> {\n    fileprivate let elements: Sequence\n    fileprivate let scheduler: ImmediateSchedulerType\n\n    init(elements: Sequence, scheduler: ImmediateSchedulerType) {\n        self.elements = elements\n        self.scheduler = scheduler\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift",
    "content": "//\n//  ShareReplayScope.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/28/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Subject lifetime scope\npublic enum SubjectLifetimeScope {\n    /**\n     **Each connection will have it's own subject instance to store replay events.**\n     **Connections will be isolated from each another.**\n\n     Configures the underlying implementation to behave equivalent to.\n     \n     ```\n     source.multicast(makeSubject: { MySubject() }).refCount()\n     ```\n\n     **This is the recommended default.**\n\n     This has the following consequences:\n     * `retry` or `concat` operators will function as expected because terminating the sequence will clear internal state.\n     * Each connection to source observable sequence will use it's own subject.\n     * When the number of subscribers drops from 1 to 0 and connection to source sequence is disposed, subject will be cleared.\n\n     \n     ```\n     let xs = Observable.deferred { () -> Observable<TimeInterval> in\n             print(\"Performing work ...\")\n             return Observable.just(Date().timeIntervalSince1970)\n         }\n         .share(replay: 1, scope: .whileConnected)\n\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n\n     ```\n\n     Notice how time interval is different and `Performing work ...` is printed each time)\n     \n     ```\n     Performing work ...\n     next 1495998900.82141\n     completed\n\n     Performing work ...\n     next 1495998900.82359\n     completed\n\n     Performing work ...\n     next 1495998900.82444\n     completed\n\n\n     ```\n     \n     */\n    case whileConnected\n\n    /**\n     **One subject will store replay events for all connections to source.**\n     **Connections won't be isolated from each another.**\n\n     Configures the underlying implementation behave equivalent to.\n\n     ```\n     source.multicast(MySubject()).refCount()\n     ```\n     \n     This has the following consequences:\n     * Using `retry` or `concat` operators after this operator usually isn't advised.\n     * Each connection to source observable sequence will share the same subject.\n     * After number of subscribers drops from 1 to 0 and connection to source observable sequence is dispose, this operator will \n       continue holding a reference to the same subject.\n       If at some later moment a new observer initiates a new connection to source it can potentially receive\n       some of the stale events received during previous connection.\n     * After source sequence terminates any new observer will always immediately receive replayed elements and terminal event.\n       No new subscriptions to source observable sequence will be attempted.\n\n     ```\n     let xs = Observable.deferred { () -> Observable<TimeInterval> in\n             print(\"Performing work ...\")\n             return Observable.just(Date().timeIntervalSince1970)\n         }\n         .share(replay: 1, scope: .forever)\n\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     ```\n     \n     Notice how time interval is the same, replayed, and `Performing work ...` is printed only once\n     \n     ```\n     Performing work ...\n     next 1495999013.76356\n     completed\n\n     next 1495999013.76356\n     completed\n\n     next 1495999013.76356\n     completed\n     ```\n     \n    */\n    case forever\n}\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence that **shares a single subscription to the underlying sequence**, and immediately upon subscription replays  elements in buffer.\n     \n     This operator is equivalent to:\n     * `.whileConnected`\n     ```\n     // Each connection will have it's own subject instance to store replay events.\n     // Connections will be isolated from each another.\n     source.multicast(makeSubject: { Replay.create(bufferSize: replay) }).refCount()\n     ```\n     * `.forever`\n     ```\n     // One subject will store replay events for all connections to source.\n     // Connections won't be isolated from each another.\n     source.multicast(Replay.create(bufferSize: replay)).refCount()\n     ```\n     \n     It uses optimized versions of the operators for most common operations.\n\n     - parameter replay: Maximum element count of the replay buffer.\n     - parameter scope: Lifetime scope of sharing subject. For more information see `SubjectLifetimeScope` enum.\n\n     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n     */\n    public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected)\n        -> Observable<Element> {\n        switch scope {\n        case .forever:\n            switch replay {\n            case 0: return self.multicast(PublishSubject()).refCount()\n            default: return self.multicast(ReplaySubject.create(bufferSize: replay)).refCount()\n            }\n        case .whileConnected:\n            switch replay {\n            case 0: return ShareWhileConnected(source: self.asObservable())\n            case 1: return ShareReplay1WhileConnected(source: self.asObservable())\n            default: return self.multicast(makeSubject: { ReplaySubject.create(bufferSize: replay) }).refCount()\n            }\n        }\n    }\n}\n\nprivate final class ShareReplay1WhileConnectedConnection<Element>\n    : ObserverType\n    , SynchronizedUnsubscribeType {\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    typealias Parent = ShareReplay1WhileConnected<Element>\n    private let parent: Parent\n    private let subscription = SingleAssignmentDisposable()\n\n    private let lock: RecursiveLock\n    private var disposed: Bool = false\n    fileprivate var observers = Observers()\n    private var element: Element?\n\n    init(parent: Parent, lock: RecursiveLock) {\n        self.parent = parent\n        self.lock = lock\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    final func on(_ event: Event<Element>) {\n        let observers = self.lock.performLocked { self.synchronized_on(event) }\n        dispatch(observers, event)\n    }\n\n    final private func synchronized_on(_ event: Event<Element>) -> Observers {\n        if self.disposed {\n            return Observers()\n        }\n\n        switch event {\n        case .next(let element):\n            self.element = element\n            return self.observers\n        case .error, .completed:\n            let observers = self.observers\n            self.synchronized_dispose()\n            return observers\n        }\n    }\n\n    final func connect() {\n        self.subscription.setDisposable(self.parent.source.subscribe(self))\n    }\n\n    final func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked {\n            if let element = self.element {\n                observer.on(.next(element))\n            }\n\n            let disposeKey = self.observers.insert(observer.on)\n\n            return SubscriptionDisposable(owner: self, key: disposeKey)\n        }\n    }\n\n    final private func synchronized_dispose() {\n        self.disposed = true\n        if self.parent.connection === self {\n            self.parent.connection = nil\n        }\n        self.observers = Observers()\n    }\n\n    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        if self.lock.performLocked({ self.synchronized_unsubscribe(disposeKey) }) {\n            self.subscription.dispose()\n        }\n    }\n\n    @inline(__always)\n    final private func synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {\n        // if already unsubscribed, just return\n        if self.observers.removeKey(disposeKey) == nil {\n            return false\n        }\n\n        if self.observers.count == 0 {\n            self.synchronized_dispose()\n            return true\n        }\n\n        return false\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\n// optimized version of share replay for most common case\nfinal private class ShareReplay1WhileConnected<Element>\n    : Observable<Element> {\n\n    fileprivate typealias Connection = ShareReplay1WhileConnectedConnection<Element>\n\n    fileprivate let source: Observable<Element>\n\n    private let lock = RecursiveLock()\n\n    fileprivate var connection: Connection?\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.lock()\n        let connection = self.synchronized_subscribe(observer)\n        let count = connection.observers.count\n\n        let disposable = connection.synchronized_subscribe(observer)\n        self.lock.unlock()\n        \n        if count == 0 {\n            connection.connect()\n        }\n\n        return disposable\n    }\n\n    @inline(__always)\n    private func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Connection where Observer.Element == Element {\n        let connection: Connection\n\n        if let existingConnection = self.connection {\n            connection = existingConnection\n        }\n        else {\n            connection = ShareReplay1WhileConnectedConnection<Element>(\n                parent: self,\n                lock: self.lock)\n            self.connection = connection\n        }\n\n        return connection\n    }\n}\n\nprivate final class ShareWhileConnectedConnection<Element>\n    : ObserverType\n    , SynchronizedUnsubscribeType {\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    typealias Parent = ShareWhileConnected<Element>\n    private let parent: Parent\n    private let subscription = SingleAssignmentDisposable()\n\n    private let lock: RecursiveLock\n    private var disposed: Bool = false\n    fileprivate var observers = Observers()\n\n    init(parent: Parent, lock: RecursiveLock) {\n        self.parent = parent\n        self.lock = lock\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    final func on(_ event: Event<Element>) {\n        let observers = self.lock.performLocked { self.synchronized_on(event) }\n        dispatch(observers, event)\n    }\n\n    final private func synchronized_on(_ event: Event<Element>) -> Observers {\n        if self.disposed {\n            return Observers()\n        }\n\n        switch event {\n        case .next:\n            return self.observers\n        case .error, .completed:\n            let observers = self.observers\n            self.synchronized_dispose()\n            return observers\n        }\n    }\n\n    final func connect() {\n        self.subscription.setDisposable(self.parent.source.subscribe(self))\n    }\n\n    final func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked {\n            let disposeKey = self.observers.insert(observer.on)\n\n            return SubscriptionDisposable(owner: self, key: disposeKey)\n        }\n    }\n\n    final private func synchronized_dispose() {\n        self.disposed = true\n        if self.parent.connection === self {\n            self.parent.connection = nil\n        }\n        self.observers = Observers()\n    }\n\n    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        if self.lock.performLocked({ self.synchronized_unsubscribe(disposeKey) }) {\n            self.subscription.dispose()\n        }\n    }\n\n    @inline(__always)\n    final private func synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {\n        // if already unsubscribed, just return\n        if self.observers.removeKey(disposeKey) == nil {\n            return false\n        }\n\n        if self.observers.count == 0 {\n            self.synchronized_dispose()\n            return true\n        }\n\n        return false\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n    #endif\n}\n\n// optimized version of share replay for most common case\nfinal private class ShareWhileConnected<Element>\n    : Observable<Element> {\n\n    fileprivate typealias Connection = ShareWhileConnectedConnection<Element>\n\n    fileprivate let source: Observable<Element>\n\n    private let lock = RecursiveLock()\n\n    fileprivate var connection: Connection?\n\n    init(source: Observable<Element>) {\n        self.source = source\n    }\n\n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.lock()\n        let connection = self.synchronized_subscribe(observer)\n        let count = connection.observers.count\n\n        let disposable = connection.synchronized_subscribe(observer)\n        self.lock.unlock()\n\n        if count == 0 {\n            connection.connect()\n        }\n\n        return disposable\n    }\n\n    @inline(__always)\n    private func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Connection where Observer.Element == Element {\n        let connection: Connection\n\n        if let existingConnection = self.connection {\n            connection = existingConnection\n        }\n        else {\n            connection = ShareWhileConnectedConnection<Element>(\n                parent: self,\n                lock: self.lock)\n            self.connection = connection\n        }\n        \n        return connection\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SingleAsync.swift",
    "content": "//\n//  SingleAsync.swift\n//  RxSwift\n//\n//  Created by Junior B. on 09/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     The single operator is similar to first, but throws a `RxError.noElements` or `RxError.moreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.\n     */\n    public func single()\n        -> Observable<Element> {\n        SingleAsync(source: self.asObservable())\n    }\n\n    /**\n     The single operator is similar to first, but throws a `RxError.NoElements` or `RxError.MoreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.\n     */\n    public func single(_ predicate: @escaping (Element) throws -> Bool)\n        -> Observable<Element> {\n        SingleAsync(source: self.asObservable(), predicate: predicate)\n    }\n}\n\nprivate final class SingleAsyncSink<Observer: ObserverType> : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element\n    typealias Parent = SingleAsync<Element>\n    \n    private let parent: Parent\n    private var seenValue: Bool = false\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            do {\n                let forward = try self.parent.predicate?(value) ?? true\n                if !forward {\n                    return\n                }\n            }\n            catch let error {\n                self.forwardOn(.error(error as Swift.Error))\n                self.dispose()\n                return\n            }\n\n            if self.seenValue {\n                self.forwardOn(.error(RxError.moreThanOneElement))\n                self.dispose()\n                return\n            }\n\n            self.seenValue = true\n            self.forwardOn(.next(value))\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if self.seenValue {\n                self.forwardOn(.completed)\n            } else {\n                self.forwardOn(.error(RxError.noElements))\n            }\n            self.dispose()\n        }\n    }\n}\n\nfinal class SingleAsync<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n    \n    private let source: Observable<Element>\n    fileprivate let predicate: Predicate?\n    \n    init(source: Observable<Element>, predicate: Predicate? = nil) {\n        self.source = source\n        self.predicate = predicate\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SingleAsyncSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sink.swift",
    "content": "//\n//  Sink.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass Sink<Observer: ObserverType>: Disposable {\n    fileprivate let observer: Observer\n    fileprivate let cancel: Cancelable\n    private let disposed = AtomicInt(0)\n\n    #if DEBUG\n        private let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    init(observer: Observer, cancel: Cancelable) {\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n        self.observer = observer\n        self.cancel = cancel\n    }\n\n    final func forwardOn(_ event: Event<Observer.Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        if isFlagSet(self.disposed, 1) {\n            return\n        }\n        self.observer.on(event)\n    }\n\n    final func forwarder() -> SinkForward<Observer> {\n        SinkForward(forward: self)\n    }\n\n    final var isDisposed: Bool {\n        isFlagSet(self.disposed, 1)\n    }\n\n    func dispose() {\n        fetchOr(self.disposed, 1)\n        self.cancel.dispose()\n    }\n\n    deinit {\n#if TRACE_RESOURCES\n       _ =  Resources.decrementTotal()\n#endif\n    }\n}\n\nfinal class SinkForward<Observer: ObserverType>: ObserverType {\n    typealias Element = Observer.Element \n\n    private let forward: Sink<Observer>\n\n    init(forward: Sink<Observer>) {\n        self.forward = forward\n    }\n\n    final func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forward.observer.on(event)\n        case .error, .completed:\n            self.forward.observer.on(event)\n            self.forward.cancel.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Skip.swift",
    "content": "//\n//  Skip.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter count: The number of elements to skip before returning the remaining elements.\n     - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.\n     */\n    public func skip(_ count: Int)\n        -> Observable<Element> {\n        SkipCount(source: self.asObservable(), count: count)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter duration: Duration for skipping elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n     */\n    public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n        SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler)\n    }\n}\n\n// count version\n\nfinal private class SkipCountSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = SkipCount<Element>\n    \n    let parent: Parent\n    \n    var remaining: Int\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.remaining = parent.count\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            \n            if self.remaining <= 0 {\n                self.forwardOn(.next(value))\n            }\n            else {\n                self.remaining -= 1\n            }\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n}\n\nfinal private class SkipCount<Element>: Producer<Element> {\n    let source: Observable<Element>\n    let count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        self.source = source\n        self.count = count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SkipCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// time version\n\nfinal private class SkipTimeSink<Element, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == Element {\n    typealias Parent = SkipTime<Element>\n\n    let parent: Parent\n    \n    // state\n    var open = false\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if self.open {\n                self.forwardOn(.next(value))\n            }\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n    func tick() {\n        self.open = true\n    }\n    \n    func run() -> Disposable {\n        let disposeTimer = self.parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { _ in \n            self.tick()\n            return Disposables.create()\n        }\n        \n        let disposeSubscription = self.parent.source.subscribe(self)\n        \n        return Disposables.create(disposeTimer, disposeSubscription)\n    }\n}\n\nfinal private class SkipTime<Element>: Producer<Element> {\n    let source: Observable<Element>\n    let duration: RxTimeInterval\n    let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, duration: RxTimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.scheduler = scheduler\n        self.duration = duration\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SkipTimeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SkipUntil.swift",
    "content": "//\n//  SkipUntil.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/3/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns the elements from the source observable sequence that are emitted after the other observable sequence produces an element.\n\n     - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)\n\n     - parameter other: Observable sequence that starts propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.\n     */\n    public func skip<Source: ObservableType>(until other: Source)\n        -> Observable<Element> {\n        SkipUntil(source: self.asObservable(), other: other.asObservable())\n    }\n\n    /**\n     Returns the elements from the source observable sequence that are emitted after the other observable sequence produces an element.\n\n     - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)\n\n     - parameter other: Observable sequence that starts propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.\n     */\n    @available(*, deprecated, renamed: \"skip(until:)\")\n    public func skipUntil<Source: ObservableType>(_ other: Source)\n        -> Observable<Element> {\n        skip(until: other)\n    }\n}\n\nfinal private class SkipUntilSinkOther<Other, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Parent = SkipUntilSink<Other, Observer>\n    typealias Element = Other\n    \n    private let parent: Parent\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n    \n    let subscription = SingleAssignmentDisposable()\n\n    init(parent: Parent) {\n        self.parent = parent\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.forwardElements = true\n            self.subscription.dispose()\n        case .error(let e):\n            self.parent.forwardOn(.error(e))\n            self.parent.dispose()\n        case .completed:\n            self.subscription.dispose()\n        }\n    }\n    \n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n    #endif\n\n}\n\n\nfinal private class SkipUntilSink<Other, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = Observer.Element \n    typealias Parent = SkipUntil<Element, Other>\n    \n    let lock = RecursiveLock()\n    private let parent: Parent\n    fileprivate var forwardElements = false\n    \n    private let sourceSubscription = SingleAssignmentDisposable()\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            if self.forwardElements {\n                self.forwardOn(event)\n            }\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if self.forwardElements {\n                self.forwardOn(event)\n            }\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let sourceSubscription = self.parent.source.subscribe(self)\n        let otherObserver = SkipUntilSinkOther(parent: self)\n        let otherSubscription = self.parent.other.subscribe(otherObserver)\n        self.sourceSubscription.setDisposable(sourceSubscription)\n        otherObserver.subscription.setDisposable(otherSubscription)\n        \n        return Disposables.create(sourceSubscription, otherObserver.subscription)\n    }\n}\n\nfinal private class SkipUntil<Element, Other>: Producer<Element> {\n    \n    fileprivate let source: Observable<Element>\n    fileprivate let other: Observable<Other>\n    \n    init(source: Observable<Element>, other: Observable<Other>) {\n        self.source = source\n        self.other = other\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SkipUntilSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SkipWhile.swift",
    "content": "//\n//  SkipWhile.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/9/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n\n     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n     */\n    public func skip(while predicate: @escaping (Element) throws -> Bool) -> Observable<Element> {\n        SkipWhile(source: self.asObservable(), predicate: predicate)\n    }\n\n    /**\n     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n\n     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n     */\n    @available(*, deprecated, renamed: \"skip(while:)\")\n    public func skipWhile(_ predicate: @escaping (Element) throws -> Bool) -> Observable<Element> {\n        SkipWhile(source: self.asObservable(), predicate: predicate)\n    }\n}\n\nfinal private class SkipWhileSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = SkipWhile<Element>\n\n    private let parent: Parent\n    private var running = false\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if !self.running {\n                do {\n                    self.running = try !self.parent.predicate(value)\n                } catch let e {\n                    self.forwardOn(.error(e))\n                    self.dispose()\n                    return\n                }\n            }\n\n            if self.running {\n                self.forwardOn(.next(value))\n            }\n        case .error, .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class SkipWhile<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n\n    private let source: Observable<Element>\n    fileprivate let predicate: Predicate\n\n    init(source: Observable<Element>, predicate: @escaping Predicate) {\n        self.source = source\n        self.predicate = predicate\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SkipWhileSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/StartWith.swift",
    "content": "//\n//  StartWith.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Prepends a sequence of values to an observable sequence.\n\n     - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)\n\n     - parameter elements: Elements to prepend to the specified sequence.\n     - returns: The source sequence prepended with the specified values.\n     */\n    public func startWith(_ elements: Element ...)\n        -> Observable<Element> {\n            return StartWith(source: self.asObservable(), elements: elements)\n    }\n}\n\nfinal private class StartWith<Element>: Producer<Element> {\n    let elements: [Element]\n    let source: Observable<Element>\n\n    init(source: Observable<Element>, elements: [Element]) {\n        self.source = source\n        self.elements = elements\n        super.init()\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        for e in self.elements {\n            observer.on(.next(e))\n        }\n\n        return (sink: Disposables.create(), subscription: self.source.subscribe(observer))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SubscribeOn.swift",
    "content": "//\n//  SubscribeOn.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Wraps the source sequence in order to run its subscription and unsubscription logic on the specified\n     scheduler.\n\n     This operation is not commonly used.\n\n     This only performs the side-effects of subscription and unsubscription on the specified scheduler.\n\n     In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n     - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n\n     - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n     - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n     */\n    public func subscribe(on scheduler: ImmediateSchedulerType)\n        -> Observable<Element> {\n        SubscribeOn(source: self, scheduler: scheduler)\n    }\n\n    /**\n     Wraps the source sequence in order to run its subscription and unsubscription logic on the specified\n     scheduler.\n\n     This operation is not commonly used.\n\n     This only performs the side-effects of subscription and unsubscription on the specified scheduler.\n\n     In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n     - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n\n     - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n     - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n     */\n    @available(*, deprecated, renamed: \"subscribe(on:)\")\n    public func subscribeOn(_ scheduler: ImmediateSchedulerType)\n        -> Observable<Element> {\n        subscribe(on: scheduler)\n    }\n}\n\nfinal private class SubscribeOnSink<Ob: ObservableType, Observer: ObserverType>: Sink<Observer>, ObserverType where Ob.Element == Observer.Element {\n    typealias Element = Observer.Element \n    typealias Parent = SubscribeOn<Ob>\n    \n    let parent: Parent\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.forwardOn(event)\n        \n        if event.isStopEvent {\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let disposeEverything = SerialDisposable()\n        let cancelSchedule = SingleAssignmentDisposable()\n        \n        disposeEverything.disposable = cancelSchedule\n        \n        let disposeSchedule = self.parent.scheduler.schedule(()) { _ -> Disposable in\n            let subscription = self.parent.source.subscribe(self)\n            disposeEverything.disposable = ScheduledDisposable(scheduler: self.parent.scheduler, disposable: subscription)\n            return Disposables.create()\n        }\n\n        cancelSchedule.setDisposable(disposeSchedule)\n    \n        return disposeEverything\n    }\n}\n\nfinal private class SubscribeOn<Ob: ObservableType>: Producer<Ob.Element> {\n    let source: Ob\n    let scheduler: ImmediateSchedulerType\n    \n    init(source: Ob, scheduler: ImmediateSchedulerType) {\n        self.source = source\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Ob.Element {\n        let sink = SubscribeOnSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Switch.swift",
    "content": "//\n//  Switch.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<Source: ObservableConvertibleType>(_ selector: @escaping (Element) throws -> Source)\n        -> Observable<Source.Element> {\n        return FlatMapLatest(source: self.asObservable(), selector: selector)\n    }\n\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<Source: InfallibleType>(_ selector: @escaping (Element) throws -> Source)\n        -> Infallible<Source.Element> {\n        return Infallible(flatMapLatest(selector))\n    }\n}\n\nextension ObservableType where Element: ObservableConvertibleType {\n\n    /**\n     Transforms an observable sequence of observable sequences into an observable sequence\n     producing values only from the most recent observable sequence.\n\n     Each time a new inner observable sequence is received, unsubscribe from the\n     previous inner observable sequence.\n\n     - seealso: [switch operator on reactivex.io](http://reactivex.io/documentation/operators/switch.html)\n\n     - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func switchLatest() -> Observable<Element.Element> {\n        Switch(source: self.asObservable())\n    }\n}\n\nprivate class SwitchSink<SourceType, Source: ObservableConvertibleType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Source.Element == Observer.Element {\n    typealias Element = SourceType\n\n    private let subscriptions: SingleAssignmentDisposable = SingleAssignmentDisposable()\n    private let innerSubscription: SerialDisposable = SerialDisposable()\n\n    let lock = RecursiveLock()\n    \n    // state\n    fileprivate var stopped = false\n    fileprivate var latest = 0\n    fileprivate var hasLatest = false\n    \n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<SourceType>) -> Disposable {\n        let subscription = source.subscribe(self)\n        self.subscriptions.setDisposable(subscription)\n        return Disposables.create(subscriptions, innerSubscription)\n    }\n\n    func performMap(_ element: SourceType) throws -> Source {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: Element) -> (Int, Observable<Source.Element>)? {\n        self.lock.lock(); defer { self.lock.unlock() }\n\n        do {\n            let observable = try self.performMap(element).asObservable()\n            self.hasLatest = true\n            self.latest = self.latest &+ 1\n            return (self.latest, observable)\n        }\n        catch let error {\n            self.forwardOn(.error(error))\n            self.dispose()\n        }\n\n        return nil\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            if let (latest, observable) = self.nextElementArrived(element: element) {\n                let d = SingleAssignmentDisposable()\n                self.innerSubscription.disposable = d\n                   \n                let observer = SwitchSinkIter(parent: self, id: latest, this: d)\n                let disposable = observable.subscribe(observer)\n                d.setDisposable(disposable)\n            }\n        case .error(let error):\n            self.lock.lock(); defer { self.lock.unlock() }\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.lock.lock(); defer { self.lock.unlock() }\n            self.stopped = true\n            \n            self.subscriptions.dispose()\n            \n            if !self.hasLatest {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal private class SwitchSinkIter<SourceType, Source: ObservableConvertibleType, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where Source.Element == Observer.Element {\n    typealias Element = Source.Element\n    typealias Parent = SwitchSink<SourceType, Source, Observer>\n    \n    private let parent: Parent\n    private let id: Int\n    private let this: Disposable\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n\n    init(parent: Parent, id: Int, this: Disposable) {\n        self.parent = parent\n        self.id = id\n        self.this = this\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next: break\n        case .error, .completed:\n            self.this.dispose()\n        }\n        \n        if self.parent.latest != self.id {\n            return\n        }\n       \n        switch event {\n        case .next:\n            self.parent.forwardOn(event)\n        case .error:\n            self.parent.forwardOn(event)\n            self.parent.dispose()\n        case .completed:\n            self.parent.hasLatest = false\n            if self.parent.stopped {\n                self.parent.forwardOn(event)\n                self.parent.dispose()\n            }\n        }\n    }\n}\n\n// MARK: Specializations\n\nfinal private class SwitchIdentitySink<Source: ObservableConvertibleType, Observer: ObserverType>: SwitchSink<Source, Source, Observer>\n    where Observer.Element == Source.Element {\n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: Source) throws -> Source {\n        element\n    }\n}\n\nfinal private class MapSwitchSink<SourceType, Source: ObservableConvertibleType, Observer: ObserverType>: SwitchSink<SourceType, Source, Observer> where Observer.Element == Source.Element {\n    typealias Selector = (SourceType) throws -> Source\n\n    private let selector: Selector\n\n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        self.selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceType) throws -> Source {\n        try self.selector(element)\n    }\n}\n\n// MARK: Producers\n\nfinal private class Switch<Source: ObservableConvertibleType>: Producer<Source.Element> {\n    private let source: Observable<Source>\n    \n    init(source: Observable<Source>) {\n        self.source = source\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Source.Element {\n        let sink = SwitchIdentitySink<Source, Observer>(observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class FlatMapLatest<SourceType, Source: ObservableConvertibleType>: Producer<Source.Element> {\n    typealias Selector = (SourceType) throws -> Source\n\n    private let source: Observable<SourceType>\n    private let selector: Selector\n\n    init(source: Observable<SourceType>, selector: @escaping Selector) {\n        self.source = source\n        self.selector = selector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Source.Element {\n        let sink = MapSwitchSink<SourceType, Source, Observer>(selector: self.selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(self.source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SwitchIfEmpty.swift",
    "content": "//\n//  SwitchIfEmpty.swift\n//  RxSwift\n//\n//  Created by sergdort on 23/12/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter switchTo: Observable sequence being returned when source sequence is empty.\n     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.\n     */\n    public func ifEmpty(switchTo other: Observable<Element>) -> Observable<Element> {\n        SwitchIfEmpty(source: self.asObservable(), ifEmpty: other)\n    }\n}\n\nfinal private class SwitchIfEmpty<Element>: Producer<Element> {\n    \n    private let source: Observable<Element>\n    private let ifEmpty: Observable<Element>\n    \n    init(source: Observable<Element>, ifEmpty: Observable<Element>) {\n        self.source = source\n        self.ifEmpty = ifEmpty\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = SwitchIfEmptySink(ifEmpty: self.ifEmpty,\n                                     observer: observer,\n                                     cancel: cancel)\n        let subscription = sink.run(self.source.asObservable())\n        \n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class SwitchIfEmptySink<Observer: ObserverType>: Sink<Observer>\n    , ObserverType {\n    typealias Element = Observer.Element\n    \n    private let ifEmpty: Observable<Element>\n    private var isEmpty = true\n    private let ifEmptySubscription = SingleAssignmentDisposable()\n    \n    init(ifEmpty: Observable<Element>, observer: Observer, cancel: Cancelable) {\n        self.ifEmpty = ifEmpty\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<Observer.Element>) -> Disposable {\n        let subscription = source.subscribe(self)\n        return Disposables.create(subscription, ifEmptySubscription)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.isEmpty = false\n            self.forwardOn(event)\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            guard self.isEmpty else {\n                self.forwardOn(.completed)\n                self.dispose()\n                return\n            }\n            let ifEmptySink = SwitchIfEmptySinkIter(parent: self)\n            self.ifEmptySubscription.setDisposable(self.ifEmpty.subscribe(ifEmptySink))\n        }\n    }\n}\n\nfinal private class SwitchIfEmptySinkIter<Observer: ObserverType>\n    : ObserverType {\n    typealias Element = Observer.Element\n    typealias Parent = SwitchIfEmptySink<Observer>\n    \n    private let parent: Parent\n\n    init(parent: Parent) {\n        self.parent = parent\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.forwardOn(event)\n        case .error:\n            self.parent.forwardOn(event)\n            self.parent.dispose()\n        case .completed:\n            self.parent.forwardOn(event)\n            self.parent.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Take.swift",
    "content": "//\n//  Take.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a specified number of contiguous elements from the start of an observable sequence.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter count: The number of elements to return.\n     - returns: An observable sequence that contains the specified number of elements from the start of the input sequence.\n     */\n    public func take(_ count: Int)\n        -> Observable<Element> {\n        if count == 0 {\n            return Observable.empty()\n        }\n        else {\n            return TakeCount(source: self.asObservable(), count: count)\n        }\n    }\n}\n\nextension ObservableType {\n    /**\n     Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter duration: Duration for taking elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n     */\n    public func take(for duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n        TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler)\n    }\n\n    /**\n     Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter duration: Duration for taking elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n     */\n    @available(*, deprecated, renamed: \"take(for:scheduler:)\")\n    public func take(_ duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n        take(for: duration, scheduler: scheduler)\n    }\n}\n\n// count version\n\nfinal private class TakeCountSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = TakeCount<Element>\n    \n    private let parent: Parent\n    \n    private var remaining: Int\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.remaining = parent.count\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            \n            if self.remaining > 0 {\n                self.remaining -= 1\n                \n                self.forwardOn(.next(value))\n            \n                if self.remaining == 0 {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n            }\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n}\n\nfinal private class TakeCount<Element>: Producer<Element> {\n    private let source: Observable<Element>\n    fileprivate let count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        if count < 0 {\n            rxFatalError(\"count can't be negative\")\n        }\n        self.source = source\n        self.count = count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TakeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// time version\n\nfinal private class TakeTimeSink<Element, Observer: ObserverType>\n    : Sink<Observer>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType where Observer.Element == Element {\n    typealias Parent = TakeTime<Element>\n\n    private let parent: Parent\n    \n    let lock = RecursiveLock()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            self.forwardOn(.next(value))\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n    func tick() {\n        self.lock.performLocked {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let disposeTimer = self.parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { _ in\n            self.tick()\n            return Disposables.create()\n        }\n        \n        let disposeSubscription = self.parent.source.subscribe(self)\n        \n        return Disposables.create(disposeTimer, disposeSubscription)\n    }\n}\n\nfinal private class TakeTime<Element>: Producer<Element> {\n    typealias TimeInterval = RxTimeInterval\n    \n    fileprivate let source: Observable<Element>\n    fileprivate let duration: TimeInterval\n    fileprivate let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, duration: TimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.scheduler = scheduler\n        self.duration = duration\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TakeTimeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/TakeLast.swift",
    "content": "//\n//  TakeLast.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 25/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a specified number of contiguous elements from the end of an observable sequence.\n\n     This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n\n     - seealso: [takeLast operator on reactivex.io](http://reactivex.io/documentation/operators/takelast.html)\n\n     - parameter count: Number of elements to take from the end of the source sequence.\n     - returns: An observable sequence containing the specified number of elements from the end of the source sequence.\n     */\n    public func takeLast(_ count: Int)\n        -> Observable<Element> {\n        TakeLast(source: self.asObservable(), count: count)\n    }\n}\n\nfinal private class TakeLastSink<Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = TakeLast<Element>\n    \n    private let parent: Parent\n    \n    private var elements: Queue<Element>\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.elements = Queue<Element>(capacity: parent.count + 1)\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            self.elements.enqueue(value)\n            if self.elements.count > self.parent.count {\n                _ = self.elements.dequeue()\n            }\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            for e in self.elements {\n                self.forwardOn(.next(e))\n            }\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class TakeLast<Element>: Producer<Element> {\n    private let source: Observable<Element>\n    fileprivate let count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        if count < 0 {\n            rxFatalError(\"count can't be negative\")\n        }\n        self.source = source\n        self.count = count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TakeLastSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/TakeWithPredicate.swift",
    "content": "//\n//  TakeWithPredicate.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns the elements from the source observable sequence until the other observable sequence produces an element.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n     */\n    public func take<Source: ObservableType>(until other: Source)\n        -> Observable<Element> {\n        TakeUntil(source: self.asObservable(), other: other.asObservable())\n    }\n\n    /**\n     Returns elements from an observable sequence until the specified condition is true.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - parameter behavior: Whether or not to include the last element matching the predicate. Defaults to `exclusive`.\n\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test passes.\n     */\n    public func take(until predicate: @escaping (Element) throws -> Bool,\n                     behavior: TakeBehavior = .exclusive)\n        -> Observable<Element> {\n        TakeUntilPredicate(source: self.asObservable(),\n                           behavior: behavior,\n                           predicate: predicate)\n    }\n\n    /**\n     Returns elements from an observable sequence as long as a specified condition is true.\n\n     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n     */\n    public func take(while predicate: @escaping (Element) throws -> Bool,\n                     behavior: TakeBehavior = .exclusive)\n        -> Observable<Element> {\n        take(until: { try !predicate($0) }, behavior: behavior)\n    }\n\n    /**\n     Returns the elements from the source observable sequence until the other observable sequence produces an element.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n     */\n    @available(*, deprecated, renamed: \"take(until:)\")\n    public func takeUntil<Source: ObservableType>(_ other: Source)\n        -> Observable<Element> {\n        take(until: other)\n    }\n\n    /**\n     Returns elements from an observable sequence until the specified condition is true.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter behavior: Whether or not to include the last element matching the predicate.\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test passes.\n     */\n    @available(*, deprecated, renamed: \"take(until:behavior:)\")\n    public func takeUntil(_ behavior: TakeBehavior,\n                          predicate: @escaping (Element) throws -> Bool)\n        -> Observable<Element> {\n        take(until: predicate, behavior: behavior)\n    }\n\n    /**\n     Returns elements from an observable sequence as long as a specified condition is true.\n\n     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n     */\n    @available(*, deprecated, renamed: \"take(while:)\")\n    public func takeWhile(_ predicate: @escaping (Element) throws -> Bool)\n        -> Observable<Element> {\n        take(until: { try !predicate($0) }, behavior: .exclusive)\n    }\n}\n\n/// Behaviors for the take operator family.\npublic enum TakeBehavior {\n    /// Include the last element matching the predicate.\n    case inclusive\n\n    /// Exclude the last element matching the predicate.\n    case exclusive\n}\n\n// MARK: - TakeUntil Observable\nfinal private class TakeUntilSinkOther<Other, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Parent = TakeUntilSink<Other, Observer>\n    typealias Element = Other\n    \n    private let parent: Parent\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n    \n    fileprivate let subscription = SingleAssignmentDisposable()\n    \n    init(parent: Parent) {\n        self.parent = parent\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.parent.forwardOn(.completed)\n            self.parent.dispose()\n        case .error(let e):\n            self.parent.forwardOn(.error(e))\n            self.parent.dispose()\n        case .completed:\n            self.subscription.dispose()\n        }\n    }\n    \n#if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n#endif\n}\n\nfinal private class TakeUntilSink<Other, Observer: ObserverType>\n    : Sink<Observer>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType {\n    typealias Element = Observer.Element \n    typealias Parent = TakeUntil<Element, Other>\n    \n    private let parent: Parent\n \n    let lock = RecursiveLock()\n    \n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            self.forwardOn(event)\n        case .error:\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let otherObserver = TakeUntilSinkOther(parent: self)\n        let otherSubscription = self.parent.other.subscribe(otherObserver)\n        otherObserver.subscription.setDisposable(otherSubscription)\n        let sourceSubscription = self.parent.source.subscribe(self)\n        \n        return Disposables.create(sourceSubscription, otherObserver.subscription)\n    }\n}\n\nfinal private class TakeUntil<Element, Other>: Producer<Element> {\n    \n    fileprivate let source: Observable<Element>\n    fileprivate let other: Observable<Other>\n    \n    init(source: Observable<Element>, other: Observable<Other>) {\n        self.source = source\n        self.other = other\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TakeUntilSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// MARK: - TakeUntil Predicate\nfinal private class TakeUntilPredicateSink<Observer: ObserverType>\n    : Sink<Observer>, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = TakeUntilPredicate<Element>\n\n    private let parent: Parent\n    private var running = true\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if !self.running {\n                return\n            }\n\n            do {\n                self.running = try !self.parent.predicate(value)\n            } catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n                return\n            }\n\n            if self.running {\n                self.forwardOn(.next(value))\n            } else {\n                if self.parent.behavior == .inclusive {\n                    self.forwardOn(.next(value))\n                }\n\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        case .error, .completed:\n            self.forwardOn(event)\n            self.dispose()\n        }\n    }\n\n}\n\nfinal private class TakeUntilPredicate<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n\n    private let source: Observable<Element>\n    fileprivate let predicate: Predicate\n    fileprivate let behavior: TakeBehavior\n\n    init(source: Observable<Element>,\n         behavior: TakeBehavior,\n         predicate: @escaping Predicate) {\n        self.source = source\n        self.behavior = behavior\n        self.predicate = predicate\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TakeUntilPredicateSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Throttle.swift",
    "content": "//\n//  Throttle.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension ObservableType {\n\n    /**\n     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.\n\n     This operator makes sure that no two elements are emitted in less then dueTime.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)\n        -> Observable<Element> {\n        Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler)\n    }\n}\n\nfinal private class ThrottleSink<Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = Observer.Element \n    typealias ParentType = Throttle<Element>\n    \n    private let parent: ParentType\n    \n    let lock = RecursiveLock()\n    \n    // state\n    private var lastUnsentElement: Element?\n    private var lastSentTime: Date?\n    private var completed: Bool = false\n\n    let cancellable = SerialDisposable()\n    \n    init(parent: ParentType, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let subscription = self.parent.source.subscribe(self)\n        \n        return Disposables.create(subscription, cancellable)\n    }\n\n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            let now = self.parent.scheduler.now\n\n            let reducedScheduledTime: RxTimeInterval\n\n            if let lastSendingTime = self.lastSentTime {\n                reducedScheduledTime = self.parent.dueTime.reduceWithSpanBetween(earlierDate: lastSendingTime, laterDate: now)\n            }\n            else {\n                reducedScheduledTime = .nanoseconds(0)\n            }\n\n            if reducedScheduledTime.isNow {\n                self.sendNow(element: element)\n                return\n            }\n\n            if !self.parent.latest {\n                return\n            }\n\n            let isThereAlreadyInFlightRequest = self.lastUnsentElement != nil\n            \n            self.lastUnsentElement = element\n\n            if isThereAlreadyInFlightRequest {\n                return\n            }\n\n            let scheduler = self.parent.scheduler\n\n            let d = SingleAssignmentDisposable()\n            self.cancellable.disposable = d\n\n            d.setDisposable(scheduler.scheduleRelative(0, dueTime: reducedScheduledTime, action: self.propagate))\n        case .error:\n            self.lastUnsentElement = nil\n            self.forwardOn(event)\n            self.dispose()\n        case .completed:\n            if self.lastUnsentElement != nil {\n                self.completed = true\n            }\n            else {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n\n    private func sendNow(element: Element) {\n        self.lastUnsentElement = nil\n        self.forwardOn(.next(element))\n        // in case element processing takes a while, this should give some more room\n        self.lastSentTime = self.parent.scheduler.now\n    }\n    \n    func propagate(_: Int) -> Disposable {\n        self.lock.performLocked {\n            if let lastUnsentElement = self.lastUnsentElement {\n                self.sendNow(element: lastUnsentElement)\n            }\n\n            if self.completed {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n\n        return Disposables.create()\n    }\n}\n\nfinal private class Throttle<Element>: Producer<Element> {\n    fileprivate let source: Observable<Element>\n    fileprivate let dueTime: RxTimeInterval\n    fileprivate let latest: Bool\n    fileprivate let scheduler: SchedulerType\n\n    init(source: Observable<Element>, dueTime: RxTimeInterval, latest: Bool, scheduler: SchedulerType) {\n        self.source = source\n        self.dueTime = dueTime\n        self.latest = latest\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ThrottleSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Timeout.swift",
    "content": "//\n//  Timeout.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 13/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.\n\n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n\n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n            return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler)\n    }\n\n    /**\n     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.\n\n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n\n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter other: Sequence to return in case of a timeout.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: The source sequence switching to the other sequence in case of a timeout.\n     */\n    public func timeout<Source: ObservableConvertibleType>(_ dueTime: RxTimeInterval, other: Source, scheduler: SchedulerType)\n        -> Observable<Element> where Element == Source.Element {\n            return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler)\n    }\n}\n\nfinal private class TimeoutSink<Observer: ObserverType>: Sink<Observer>, LockOwnerType, ObserverType {\n    typealias Element = Observer.Element \n    typealias Parent = Timeout<Element>\n    \n    private let parent: Parent\n    \n    let lock = RecursiveLock()\n\n    private let timerD = SerialDisposable()\n    private let subscription = SerialDisposable()\n    \n    private var id = 0\n    private var switched = false\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let original = SingleAssignmentDisposable()\n        self.subscription.disposable = original\n        \n        self.createTimeoutTimer()\n        \n        original.setDisposable(self.parent.source.subscribe(self))\n        \n        return Disposables.create(subscription, timerD)\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            var onNextWins = false\n            \n            self.lock.performLocked {\n                onNextWins = !self.switched\n                if onNextWins {\n                    self.id = self.id &+ 1\n                }\n            }\n            \n            if onNextWins {\n                self.forwardOn(event)\n                self.createTimeoutTimer()\n            }\n        case .error, .completed:\n            var onEventWins = false\n            \n            self.lock.performLocked {\n                onEventWins = !self.switched\n                if onEventWins {\n                    self.id = self.id &+ 1\n                }\n            }\n            \n            if onEventWins {\n                self.forwardOn(event)\n                self.dispose()\n            }\n        }\n    }\n    \n    private func createTimeoutTimer() {\n        if self.timerD.isDisposed {\n            return\n        }\n        \n        let nextTimer = SingleAssignmentDisposable()\n        self.timerD.disposable = nextTimer\n        \n        let disposeSchedule = self.parent.scheduler.scheduleRelative(self.id, dueTime: self.parent.dueTime) { state in\n            \n            var timerWins = false\n            \n            self.lock.performLocked {\n                self.switched = (state == self.id)\n                timerWins = self.switched\n            }\n            \n            if timerWins {\n                self.subscription.disposable = self.parent.other.subscribe(self.forwarder())\n            }\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(disposeSchedule)\n    }\n}\n\n\nfinal private class Timeout<Element>: Producer<Element> {\n    fileprivate let source: Observable<Element>\n    fileprivate let dueTime: RxTimeInterval\n    fileprivate let other: Observable<Element>\n    fileprivate let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, other: Observable<Element>, scheduler: SchedulerType) {\n        self.source = source\n        self.dueTime = dueTime\n        self.other = other\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = TimeoutSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Timer.swift",
    "content": "//\n//  Timer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where Element: RxAbstractInteger {\n    /**\n     Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.\n\n     - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)\n\n     - parameter period: Period for producing the values in the resulting sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence that produces a value after each period.\n     */\n    public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<Element> {\n        return Timer(\n            dueTime: period,\n            period: period,\n            scheduler: scheduler\n        )\n    }\n}\n\nextension ObservableType where Element: RxAbstractInteger {\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter period: Period to produce subsequent values.\n     - parameter scheduler: Scheduler to run timers on.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)\n        -> Observable<Element> {\n        return Timer(\n            dueTime: dueTime,\n            period: period,\n            scheduler: scheduler\n        )\n    }\n}\n\nimport Foundation\n\nfinal private class TimerSink<Observer: ObserverType> : Sink<Observer> where Observer.Element : RxAbstractInteger  {\n    typealias Parent = Timer<Observer.Element>\n\n    private let parent: Parent\n    private let lock = RecursiveLock()\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return self.parent.scheduler.schedulePeriodic(0 as Observer.Element, startAfter: self.parent.dueTime, period: self.parent.period!) { state in\n            self.lock.performLocked {\n                self.forwardOn(.next(state))\n                return state &+ 1\n            }\n        }\n    }\n}\n\nfinal private class TimerOneOffSink<Observer: ObserverType>: Sink<Observer> where Observer.Element: RxAbstractInteger {\n    typealias Parent = Timer<Observer.Element>\n\n    private let parent: Parent\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return self.parent.scheduler.scheduleRelative(self, dueTime: self.parent.dueTime) { [unowned self] _ -> Disposable in\n            self.forwardOn(.next(0))\n            self.forwardOn(.completed)\n            self.dispose()\n\n            return Disposables.create()\n        }\n    }\n}\n\nfinal private class Timer<Element: RxAbstractInteger>: Producer<Element> {\n    fileprivate let scheduler: SchedulerType\n    fileprivate let dueTime: RxTimeInterval\n    fileprivate let period: RxTimeInterval?\n\n    init(dueTime: RxTimeInterval, period: RxTimeInterval?, scheduler: SchedulerType) {\n        self.scheduler = scheduler\n        self.dueTime = dueTime\n        self.period = period\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        if self.period != nil {\n            let sink = TimerSink(parent: self, observer: observer, cancel: cancel)\n            let subscription = sink.run()\n            return (sink: sink, subscription: subscription)\n        }\n        else {\n            let sink = TimerOneOffSink(parent: self, observer: observer, cancel: cancel)\n            let subscription = sink.run()\n            return (sink: sink, subscription: subscription)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ToArray.swift",
    "content": "//\n//  ToArray.swift\n//  RxSwift\n//\n//  Created by Junior B. on 20/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n    Converts an Observable into a Single that emits the whole sequence as a single array and then terminates.\n    \n    For aggregation behavior see `reduce`.\n\n    - seealso: [toArray operator on reactivex.io](http://reactivex.io/documentation/operators/to.html)\n    \n    - returns: A Single sequence containing all the emitted elements as array.\n    */\n    public func toArray()\n        -> Single<[Element]> {\n        PrimitiveSequence(raw: ToArray(source: self.asObservable()))\n    }\n}\n\nfinal private class ToArraySink<SourceType, Observer: ObserverType>: Sink<Observer>, ObserverType where Observer.Element == [SourceType] {\n    typealias Parent = ToArray<SourceType>\n    \n    let parent: Parent\n    var list = [SourceType]()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let value):\n            self.list.append(value)\n        case .error(let e):\n            self.forwardOn(.error(e))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.next(self.list))\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class ToArray<SourceType>: Producer<[SourceType]> {\n    let source: Observable<SourceType>\n\n    init(source: Observable<SourceType>) {\n        self.source = source\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == [SourceType] {\n        let sink = ToArraySink(parent: self, observer: observer, cancel: cancel)\n        let subscription = self.source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Using.swift",
    "content": "//\n//  Using.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n\n     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)\n\n     - parameter resourceFactory: Factory function to obtain a resource object.\n     - parameter observableFactory: Factory function to obtain an observable sequence that depends on the obtained resource.\n     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n     */\n    public static func using<Resource: Disposable>(_ resourceFactory: @escaping () throws -> Resource, observableFactory: @escaping (Resource) throws -> Observable<Element>) -> Observable<Element> {\n        Using(resourceFactory: resourceFactory, observableFactory: observableFactory)\n    }\n}\n\nfinal private class UsingSink<ResourceType: Disposable, Observer: ObserverType>: Sink<Observer>, ObserverType {\n    typealias SourceType = Observer.Element \n    typealias Parent = Using<SourceType, ResourceType>\n\n    private let parent: Parent\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        var disposable = Disposables.create()\n        \n        do {\n            let resource = try self.parent.resourceFactory()\n            disposable = resource\n            let source = try self.parent.observableFactory(resource)\n            \n            return Disposables.create(\n                source.subscribe(self),\n                disposable\n            )\n        } catch let error {\n            return Disposables.create(\n                Observable.error(error).subscribe(self),\n                disposable\n            )\n        }\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case let .next(value):\n            self.forwardOn(.next(value))\n        case let .error(error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal private class Using<SourceType, ResourceType: Disposable>: Producer<SourceType> {\n    \n    typealias Element = SourceType\n    \n    typealias ResourceFactory = () throws -> ResourceType\n    typealias ObservableFactory = (ResourceType) throws -> Observable<SourceType>\n    \n    fileprivate let resourceFactory: ResourceFactory\n    fileprivate let observableFactory: ObservableFactory\n    \n    \n    init(resourceFactory: @escaping ResourceFactory, observableFactory: @escaping ObservableFactory) {\n        self.resourceFactory = resourceFactory\n        self.observableFactory = observableFactory\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = UsingSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Window.swift",
    "content": "//\n//  Window.swift\n//  RxSwift\n//\n//  Created by Junior B. on 29/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a window that is completed when either it’s full or a given amount of time has elapsed.\n\n     - seealso: [window operator on reactivex.io](http://reactivex.io/documentation/operators/window.html)\n\n     - parameter timeSpan: Maximum time length of a window.\n     - parameter count: Maximum element count of a window.\n     - parameter scheduler: Scheduler to run windowing timers on.\n     - returns: An observable sequence of windows (instances of `Observable`).\n     */\n    public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)\n        -> Observable<Observable<Element>> {\n            return WindowTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)\n    }\n}\n\nfinal private class WindowTimeCountSink<Element, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where Observer.Element == Observable<Element> {\n    typealias Parent = WindowTimeCount<Element>\n    \n    private let parent: Parent\n    \n    let lock = RecursiveLock()\n    \n    private var subject = PublishSubject<Element>()\n    private var count = 0\n    private var windowId = 0\n    \n    private let timerD = SerialDisposable()\n    private let refCountDisposable: RefCountDisposable\n    private let groupDisposable = CompositeDisposable()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        \n        _ = self.groupDisposable.insert(self.timerD)\n        \n        self.refCountDisposable = RefCountDisposable(disposable: self.groupDisposable)\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        \n        self.forwardOn(.next(AddRef(source: self.subject, refCount: self.refCountDisposable).asObservable()))\n        self.createTimer(self.windowId)\n        \n        _ = self.groupDisposable.insert(self.parent.source.subscribe(self))\n        return self.refCountDisposable\n    }\n    \n    func startNewWindowAndCompleteCurrentOne() {\n        self.subject.on(.completed)\n        self.subject = PublishSubject<Element>()\n        \n        self.forwardOn(.next(AddRef(source: self.subject, refCount: self.refCountDisposable).asObservable()))\n    }\n\n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        var newWindow = false\n        var newId = 0\n        \n        switch event {\n        case .next(let element):\n            self.subject.on(.next(element))\n            \n            do {\n                _ = try incrementChecked(&self.count)\n            } catch let e {\n                self.subject.on(.error(e as Swift.Error))\n                self.dispose()\n            }\n            \n            if self.count == self.parent.count {\n                newWindow = true\n                self.count = 0\n                self.windowId += 1\n                newId = self.windowId\n                self.startNewWindowAndCompleteCurrentOne()\n            }\n            \n        case .error(let error):\n            self.subject.on(.error(error))\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            self.subject.on(.completed)\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n\n        if newWindow {\n            self.createTimer(newId)\n        }\n    }\n    \n    func createTimer(_ windowId: Int) {\n        if self.timerD.isDisposed {\n            return\n        }\n        \n        if self.windowId != windowId {\n            return\n        }\n\n        let nextTimer = SingleAssignmentDisposable()\n\n        self.timerD.disposable = nextTimer\n\n        let scheduledRelative = self.parent.scheduler.scheduleRelative(windowId, dueTime: self.parent.timeSpan) { previousWindowId in\n            \n            var newId = 0\n            \n            self.lock.performLocked {\n                if previousWindowId != self.windowId {\n                    return\n                }\n                \n                self.count = 0\n                self.windowId = self.windowId &+ 1\n                newId = self.windowId\n                self.startNewWindowAndCompleteCurrentOne()\n            }\n            \n            self.createTimer(newId)\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(scheduledRelative)\n    }\n}\n\nfinal private class WindowTimeCount<Element>: Producer<Observable<Element>> {\n    fileprivate let timeSpan: RxTimeInterval\n    fileprivate let count: Int\n    fileprivate let scheduler: SchedulerType\n    fileprivate let source: Observable<Element>\n    \n    init(source: Observable<Element>, timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) {\n        self.source = source\n        self.timeSpan = timeSpan\n        self.count = count\n        self.scheduler = scheduler\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Observable<Element> {\n        let sink = WindowTimeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift",
    "content": "//\n//  WithLatestFrom.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n     - note: Elements emitted by self before the second source has emitted any values will be omitted.\n\n     - parameter second: Second observable source.\n     - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<Source: ObservableConvertibleType, ResultType>(_ second: Source, resultSelector: @escaping (Element, Source.Element) throws -> ResultType) -> Observable<ResultType> {\n        WithLatestFrom(first: self.asObservable(), second: second.asObservable(), resultSelector: resultSelector)\n    }\n\n    /**\n     Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n     - note: Elements emitted by self before the second source has emitted any values will be omitted.\n\n     - parameter second: Second observable source.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<Source: ObservableConvertibleType>(_ second: Source) -> Observable<Source.Element> {\n        WithLatestFrom(first: self.asObservable(), second: second.asObservable(), resultSelector: { $1 })\n    }\n}\n\nfinal private class WithLatestFromSink<FirstType, SecondType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias ResultType = Observer.Element\n    typealias Parent = WithLatestFrom<FirstType, SecondType, ResultType>\n    typealias Element = FirstType\n    \n    private let parent: Parent\n    \n    fileprivate var lock = RecursiveLock()\n    fileprivate var latest: SecondType?\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let sndSubscription = SingleAssignmentDisposable()\n        let sndO = WithLatestFromSecond(parent: self, disposable: sndSubscription)\n        \n        sndSubscription.setDisposable(self.parent.second.subscribe(sndO))\n        let fstSubscription = self.parent.first.subscribe(self)\n\n        return Disposables.create(fstSubscription, sndSubscription)\n    }\n\n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case let .next(value):\n            guard let latest = self.latest else { return }\n            do {\n                let res = try self.parent.resultSelector(value, latest)\n                \n                self.forwardOn(.next(res))\n            } catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        case .completed:\n            self.forwardOn(.completed)\n            self.dispose()\n        case let .error(error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        }\n    }\n}\n\nfinal private class WithLatestFromSecond<FirstType, SecondType, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    \n    typealias ResultType = Observer.Element\n    typealias Parent = WithLatestFromSink<FirstType, SecondType, Observer>\n    typealias Element = SecondType\n    \n    private let parent: Parent\n    private let disposable: Disposable\n\n    var lock: RecursiveLock {\n        self.parent.lock\n    }\n\n    init(parent: Parent, disposable: Disposable) {\n        self.parent = parent\n        self.disposable = disposable\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case let .next(value):\n            self.parent.latest = value\n        case .completed:\n            self.disposable.dispose()\n        case let .error(error):\n            self.parent.forwardOn(.error(error))\n            self.parent.dispose()\n        }\n    }\n}\n\nfinal private class WithLatestFrom<FirstType, SecondType, ResultType>: Producer<ResultType> {\n    typealias ResultSelector = (FirstType, SecondType) throws -> ResultType\n    \n    fileprivate let first: Observable<FirstType>\n    fileprivate let second: Observable<SecondType>\n    fileprivate let resultSelector: ResultSelector\n\n    init(first: Observable<FirstType>, second: Observable<SecondType>, resultSelector: @escaping ResultSelector) {\n        self.first = first\n        self.second = second\n        self.resultSelector = resultSelector\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == ResultType {\n        let sink = WithLatestFromSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/WithUnretained.swift",
    "content": "//\n//  WithUnretained.swift\n//  RxSwift\n//\n//  Created by Vincent Pradeilles on 01/01/2021.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - parameter resultSelector: A function to combine the unretained referenced on `obj` and the value of the observable sequence.\n     - returns: An observable sequence that contains the result of `resultSelector` being called with an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject, Out>(\n        _ obj: Object,\n        resultSelector: @escaping (Object, Element) -> Out\n    ) -> Observable<Out> {\n        map { [weak obj] element -> Out in\n            guard let obj = obj else { throw UnretainedError.failedRetaining }\n\n            return resultSelector(obj, element)\n        }\n        .catch{ error -> Observable<Out> in\n            guard let unretainedError = error as? UnretainedError,\n                  unretainedError == .failedRetaining else {\n                return .error(error)\n            }\n\n            return .empty()\n        }\n    }\n\n    \n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - returns: An observable sequence of tuples that contains both an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject>(_ obj: Object) -> Observable<(Object, Element)> {\n        return withUnretained(obj) { ($0, $1) }\n    }\n}\n\nprivate enum UnretainedError: Swift.Error {\n    case failedRetaining\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift",
    "content": "//\n//  Zip+Collection.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func zip<Collection: Swift.Collection>(_ collection: Collection, resultSelector: @escaping ([Collection.Element.Element]) throws -> Element) -> Observable<Element>\n        where Collection.Element: ObservableType {\n        ZipCollectionType(sources: collection, resultSelector: resultSelector)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func zip<Collection: Swift.Collection>(_ collection: Collection) -> Observable<[Element]>\n        where Collection.Element: ObservableType, Collection.Element.Element == Element {\n        ZipCollectionType(sources: collection, resultSelector: { $0 })\n    }\n    \n}\n\nfinal private class ZipCollectionTypeSink<Collection: Swift.Collection, Observer: ObserverType>\n    : Sink<Observer> where Collection.Element: ObservableConvertibleType {\n    typealias Result = Observer.Element \n    typealias Parent = ZipCollectionType<Collection, Result>\n    typealias SourceElement = Collection.Element.Element\n    \n    private let parent: Parent\n    \n    private let lock = RecursiveLock()\n    \n    // state\n    private var numberOfValues = 0\n    private var values: [Queue<SourceElement>]\n    private var isDone: [Bool]\n    private var numberOfDone = 0\n    private var subscriptions: [SingleAssignmentDisposable]\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        self.values = [Queue<SourceElement>](repeating: Queue(capacity: 4), count: parent.count)\n        self.isDone = [Bool](repeating: false, count: parent.count)\n        self.subscriptions = [SingleAssignmentDisposable]()\n        self.subscriptions.reserveCapacity(parent.count)\n        \n        for _ in 0 ..< parent.count {\n            self.subscriptions.append(SingleAssignmentDisposable())\n        }\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceElement>, atIndex: Int) {\n        self.lock.lock(); defer { self.lock.unlock() }\n        switch event {\n        case .next(let element):\n            self.values[atIndex].enqueue(element)\n            \n            if self.values[atIndex].count == 1 {\n                self.numberOfValues += 1\n            }\n            \n            if self.numberOfValues < self.parent.count {\n                if self.numberOfDone == self.parent.count - 1 {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n                return\n            }\n            \n            do {\n                var arguments = [SourceElement]()\n                arguments.reserveCapacity(self.parent.count)\n                \n                // recalculate number of values\n                self.numberOfValues = 0\n                \n                for i in 0 ..< self.values.count {\n                    arguments.append(self.values[i].dequeue()!)\n                    if !self.values[i].isEmpty {\n                        self.numberOfValues += 1\n                    }\n                }\n                \n                let result = try self.parent.resultSelector(arguments)\n                self.forwardOn(.next(result))\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n            \n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .completed:\n            if self.isDone[atIndex] {\n                return\n            }\n            \n            self.isDone[atIndex] = true\n            self.numberOfDone += 1\n            \n            if self.numberOfDone == self.parent.count {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n            else {\n                self.subscriptions[atIndex].dispose()\n            }\n        }\n    }\n    \n    func run() -> Disposable {\n        var j = 0\n        for i in self.parent.sources {\n            let index = j\n            let source = i.asObservable()\n\n            let disposable = source.subscribe(AnyObserver { event in\n                self.on(event, atIndex: index)\n                })\n            self.subscriptions[j].setDisposable(disposable)\n            j += 1\n        }\n\n        if self.parent.sources.isEmpty {\n            self.forwardOn(.completed)\n        }\n        \n        return Disposables.create(subscriptions)\n    }\n}\n\nfinal private class ZipCollectionType<Collection: Swift.Collection, Result>: Producer<Result> where Collection.Element: ObservableConvertibleType {\n    typealias ResultSelector = ([Collection.Element.Element]) throws -> Result\n    \n    let sources: Collection\n    let resultSelector: ResultSelector\n    let count: Int\n    \n    init(sources: Collection, resultSelector: @escaping ResultSelector) {\n        self.sources = sources\n        self.resultSelector = resultSelector\n        self.count = self.sources.count\n    }\n    \n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipCollectionTypeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  Zip+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.Element, O2.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2)\n        -> Observable<(O1.Element, O2.Element)> {\n        return Zip2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: { ($0, $1) }\n        )\n    }\n}\n\nfinal class ZipSink2_<E1, E2, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip2<E1, E2, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 2, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n\n        return Disposables.create([\n           subscription1,\n           subscription2\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!)\n    }\n}\n\nfinal class Zip2<E1, E2, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink2_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 3\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.Element, O2.Element, O3.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> Observable<(O1.Element, O2.Element, O3.Element)> {\n        return Zip3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: { ($0, $1, $2) }\n        )\n    }\n}\n\nfinal class ZipSink3_<E1, E2, E3, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip3<E1, E2, E3, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 3, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!)\n    }\n}\n\nfinal class Zip3<E1, E2, E3, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink3_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 4\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element)> {\n        return Zip4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: { ($0, $1, $2, $3) }\n        )\n    }\n}\n\nfinal class ZipSink4_<E1, E2, E3, E4, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip4<E1, E2, E3, E4, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n    var values4: Queue<E4> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 4, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n        case 3: return !self.values4.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: self.lock, parent: self, index: 3, setNextValue: { self.values4.enqueue($0) }, this: subscription4)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n        subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!, self.values4.dequeue()!)\n    }\n}\n\nfinal class Zip4<E1, E2, E3, E4, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink4_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 5\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element)> {\n        return Zip5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4) }\n        )\n    }\n}\n\nfinal class ZipSink5_<E1, E2, E3, E4, E5, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip5<E1, E2, E3, E4, E5, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n    var values4: Queue<E4> = Queue(capacity: 2)\n    var values5: Queue<E5> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 5, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n        case 3: return !self.values4.isEmpty\n        case 4: return !self.values5.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: self.lock, parent: self, index: 3, setNextValue: { self.values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: self.lock, parent: self, index: 4, setNextValue: { self.values5.enqueue($0) }, this: subscription5)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n        subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n        subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!, self.values4.dequeue()!, self.values5.dequeue()!)\n    }\n}\n\nfinal class Zip5<E1, E2, E3, E4, E5, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink5_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 6\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element)> {\n        return Zip6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5) }\n        )\n    }\n}\n\nfinal class ZipSink6_<E1, E2, E3, E4, E5, E6, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip6<E1, E2, E3, E4, E5, E6, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n    var values4: Queue<E4> = Queue(capacity: 2)\n    var values5: Queue<E5> = Queue(capacity: 2)\n    var values6: Queue<E6> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 6, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n        case 3: return !self.values4.isEmpty\n        case 4: return !self.values5.isEmpty\n        case 5: return !self.values6.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: self.lock, parent: self, index: 3, setNextValue: { self.values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: self.lock, parent: self, index: 4, setNextValue: { self.values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: self.lock, parent: self, index: 5, setNextValue: { self.values6.enqueue($0) }, this: subscription6)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n        subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n        subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n        subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!, self.values4.dequeue()!, self.values5.dequeue()!, self.values6.dequeue()!)\n    }\n}\n\nfinal class Zip6<E1, E2, E3, E4, E5, E6, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink6_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 7\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element)> {\n        return Zip7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6) }\n        )\n    }\n}\n\nfinal class ZipSink7_<E1, E2, E3, E4, E5, E6, E7, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip7<E1, E2, E3, E4, E5, E6, E7, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n    var values4: Queue<E4> = Queue(capacity: 2)\n    var values5: Queue<E5> = Queue(capacity: 2)\n    var values6: Queue<E6> = Queue(capacity: 2)\n    var values7: Queue<E7> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 7, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n        case 3: return !self.values4.isEmpty\n        case 4: return !self.values5.isEmpty\n        case 5: return !self.values6.isEmpty\n        case 6: return !self.values7.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: self.lock, parent: self, index: 3, setNextValue: { self.values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: self.lock, parent: self, index: 4, setNextValue: { self.values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: self.lock, parent: self, index: 5, setNextValue: { self.values6.enqueue($0) }, this: subscription6)\n        let observer7 = ZipObserver(lock: self.lock, parent: self, index: 6, setNextValue: { self.values7.enqueue($0) }, this: subscription7)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n        subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n        subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n        subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n        subscription7.setDisposable(self.parent.source7.subscribe(observer7))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6,\n           subscription7\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!, self.values4.dequeue()!, self.values5.dequeue()!, self.values6.dequeue()!, self.values7.dequeue()!)\n    }\n}\n\nfinal class Zip7<E1, E2, E3, E4, E5, E6, E7, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink7_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 8\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element) throws -> Element)\n        -> Observable<Element> {\n        return Zip8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where Element == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> Observable<(O1.Element, O2.Element, O3.Element, O4.Element, O5.Element, O6.Element, O7.Element, O8.Element)> {\n        return Zip8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6, $7) }\n        )\n    }\n}\n\nfinal class ZipSink8_<E1, E2, E3, E4, E5, E6, E7, E8, Observer: ObserverType> : ZipSink<Observer> {\n    typealias Result = Observer.Element \n    typealias Parent = Zip8<E1, E2, E3, E4, E5, E6, E7, E8, Result>\n\n    let parent: Parent\n\n    var values1: Queue<E1> = Queue(capacity: 2)\n    var values2: Queue<E2> = Queue(capacity: 2)\n    var values3: Queue<E3> = Queue(capacity: 2)\n    var values4: Queue<E4> = Queue(capacity: 2)\n    var values5: Queue<E5> = Queue(capacity: 2)\n    var values6: Queue<E6> = Queue(capacity: 2)\n    var values7: Queue<E7> = Queue(capacity: 2)\n    var values8: Queue<E8> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(arity: 8, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch index {\n        case 0: return !self.values1.isEmpty\n        case 1: return !self.values2.isEmpty\n        case 2: return !self.values3.isEmpty\n        case 3: return !self.values4.isEmpty\n        case 4: return !self.values5.isEmpty\n        case 5: return !self.values6.isEmpty\n        case 6: return !self.values7.isEmpty\n        case 7: return !self.values8.isEmpty\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n        let subscription8 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: self.lock, parent: self, index: 0, setNextValue: { self.values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: self.lock, parent: self, index: 1, setNextValue: { self.values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: self.lock, parent: self, index: 2, setNextValue: { self.values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: self.lock, parent: self, index: 3, setNextValue: { self.values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: self.lock, parent: self, index: 4, setNextValue: { self.values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: self.lock, parent: self, index: 5, setNextValue: { self.values6.enqueue($0) }, this: subscription6)\n        let observer7 = ZipObserver(lock: self.lock, parent: self, index: 6, setNextValue: { self.values7.enqueue($0) }, this: subscription7)\n        let observer8 = ZipObserver(lock: self.lock, parent: self, index: 7, setNextValue: { self.values8.enqueue($0) }, this: subscription8)\n\n        subscription1.setDisposable(self.parent.source1.subscribe(observer1))\n        subscription2.setDisposable(self.parent.source2.subscribe(observer2))\n        subscription3.setDisposable(self.parent.source3.subscribe(observer3))\n        subscription4.setDisposable(self.parent.source4.subscribe(observer4))\n        subscription5.setDisposable(self.parent.source5.subscribe(observer5))\n        subscription6.setDisposable(self.parent.source6.subscribe(observer6))\n        subscription7.setDisposable(self.parent.source7.subscribe(observer7))\n        subscription8.setDisposable(self.parent.source8.subscribe(observer8))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6,\n           subscription7,\n           subscription8\n        ])\n    }\n\n    override func getResult() throws -> Result {\n        try self.parent.resultSelector(self.values1.dequeue()!, self.values2.dequeue()!, self.values3.dequeue()!, self.values4.dequeue()!, self.values5.dequeue()!, self.values6.dequeue()!, self.values7.dequeue()!, self.values8.dequeue()!)\n    }\n}\n\nfinal class Zip8<E1, E2, E3, E4, E5, E6, E7, E8, Result> : Producer<Result> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7, E8) throws -> Result\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n    let source8: Observable<E8>\n\n    let resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, source8: Observable<E8>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n        self.source8 = source8\n\n        self.resultSelector = resultSelector\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Result {\n        let sink = ZipSink8_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip.swift",
    "content": "//\n//  Zip.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol ZipSinkProtocol: AnyObject {\n    func next(_ index: Int)\n    func fail(_ error: Swift.Error)\n    func done(_ index: Int)\n}\n\nclass ZipSink<Observer: ObserverType> : Sink<Observer>, ZipSinkProtocol {\n    typealias Element = Observer.Element\n    \n    let arity: Int\n\n    let lock = RecursiveLock()\n\n    // state\n    private var isDone: [Bool]\n    \n    init(arity: Int, observer: Observer, cancel: Cancelable) {\n        self.isDone = [Bool](repeating: false, count: arity)\n        self.arity = arity\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func getResult() throws -> Element {\n        rxAbstractMethod()\n    }\n    \n    func hasElements(_ index: Int) -> Bool {\n        rxAbstractMethod()\n    }\n    \n    func next(_ index: Int) {\n        var hasValueAll = true\n        \n        for i in 0 ..< self.arity {\n            if !self.hasElements(i) {\n                hasValueAll = false\n                break\n            }\n        }\n        \n        if hasValueAll {\n            do {\n                let result = try self.getResult()\n                self.forwardOn(.next(result))\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                self.dispose()\n            }\n        }\n    }\n    \n    func fail(_ error: Swift.Error) {\n        self.forwardOn(.error(error))\n        self.dispose()\n    }\n    \n    func done(_ index: Int) {\n        self.isDone[index] = true\n        \n        var allDone = true\n        \n        for done in self.isDone where !done {\n            allDone = false\n            break\n        }\n        \n        if allDone {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal class ZipObserver<Element>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias ValueSetter = (Element) -> Void\n\n    private var parent: ZipSinkProtocol?\n    \n    let lock: RecursiveLock\n    \n    // state\n    private let index: Int\n    private let this: Disposable\n    private let setNextValue: ValueSetter\n    \n    init(lock: RecursiveLock, parent: ZipSinkProtocol, index: Int, setNextValue: @escaping ValueSetter, this: Disposable) {\n        self.lock = lock\n        self.parent = parent\n        self.index = index\n        self.this = this\n        self.setNextValue = setNextValue\n    }\n    \n    func on(_ event: Event<Element>) {\n        self.synchronizedOn(event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) {\n        if self.parent != nil {\n            switch event {\n            case .next:\n                break\n            case .error:\n                self.this.dispose()\n            case .completed:\n                self.this.dispose()\n            }\n        }\n        \n        if let parent = self.parent {\n            switch event {\n            case .next(let value):\n                self.setNextValue(value)\n                parent.next(self.index)\n            case .error(let error):\n                parent.fail(error)\n            case .completed:\n                parent.done(self.index)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObserverType.swift",
    "content": "//\n//  ObserverType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Supports push-style iteration over an observable sequence.\npublic protocol ObserverType {\n    /// The type of elements in sequence that observer can observe.\n    associatedtype Element\n\n    /// Notify observer about sequence event.\n    ///\n    /// - parameter event: Event that occurred.\n    func on(_ event: Event<Element>)\n}\n\n/// Convenience API extensions to provide alternate next, error, completed events\nextension ObserverType {\n    \n    /// Convenience method equivalent to `on(.next(element: Element))`\n    ///\n    /// - parameter element: Next element to send to observer(s)\n    public func onNext(_ element: Element) {\n        self.on(.next(element))\n    }\n    \n    /// Convenience method equivalent to `on(.completed)`\n    public func onCompleted() {\n        self.on(.completed)\n    }\n    \n    /// Convenience method equivalent to `on(.error(Swift.Error))`\n    /// - parameter error: Swift.Error to send to observer(s)\n    public func onError(_ error: Swift.Error) {\n        self.on(.error(error))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift",
    "content": "//\n//  AnonymousObserver.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nfinal class AnonymousObserver<Element>: ObserverBase<Element> {\n    typealias EventHandler = (Event<Element>) -> Void\n    \n    private let eventHandler : EventHandler\n    \n    init(_ eventHandler: @escaping EventHandler) {\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n        self.eventHandler = eventHandler\n    }\n\n    override func onCore(_ event: Event<Element>) {\n        self.eventHandler(event)\n    }\n    \n#if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n#endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/ObserverBase.swift",
    "content": "//\n//  ObserverBase.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass ObserverBase<Element> : Disposable, ObserverType {\n    private let isStopped = AtomicInt(0)\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            if load(self.isStopped) == 0 {\n                self.onCore(event)\n            }\n        case .error, .completed:\n            if fetchOr(self.isStopped, 1) == 0 {\n                self.onCore(event)\n            }\n        }\n    }\n\n    func onCore(_ event: Event<Element>) {\n        rxAbstractMethod()\n    }\n\n    func dispose() {\n        fetchOr(self.isStopped, 1)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift",
    "content": "//\n//  TailRecursiveSink.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nenum TailRecursiveSinkCommand {\n    case moveNext\n    case dispose\n}\n\n#if DEBUG || TRACE_RESOURCES\n    public var maxTailRecursiveSinkStackSize = 0\n#endif\n\n/// This class is usually used with `Generator` version of the operators.\nclass TailRecursiveSink<Sequence: Swift.Sequence, Observer: ObserverType>\n    : Sink<Observer>\n    , InvocableWithValueType where Sequence.Element: ObservableConvertibleType, Sequence.Element.Element == Observer.Element {\n    typealias Value = TailRecursiveSinkCommand\n    typealias Element = Observer.Element \n    typealias SequenceGenerator = (generator: Sequence.Iterator, remaining: IntMax?)\n\n    var generators: [SequenceGenerator] = []\n    var disposed = false\n    var subscription = SerialDisposable()\n\n    // this is thread safe object\n    var gate = AsyncLock<InvocableScheduledItem<TailRecursiveSink<Sequence, Observer>>>()\n\n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run(_ sources: SequenceGenerator) -> Disposable {\n        self.generators.append(sources)\n\n        self.schedule(.moveNext)\n\n        return self.subscription\n    }\n\n    func invoke(_ command: TailRecursiveSinkCommand) {\n        switch command {\n        case .dispose:\n            self.disposeCommand()\n        case .moveNext:\n            self.moveNextCommand()\n        }\n    }\n\n    // simple implementation for now\n    func schedule(_ command: TailRecursiveSinkCommand) {\n        self.gate.invoke(InvocableScheduledItem(invocable: self, state: command))\n    }\n\n    func done() {\n        self.forwardOn(.completed)\n        self.dispose()\n    }\n\n    func extract(_ observable: Observable<Element>) -> SequenceGenerator? {\n        rxAbstractMethod()\n    }\n\n    // should be done on gate locked\n\n    private func moveNextCommand() {\n        var next: Observable<Element>?\n\n        repeat {\n            guard let (g, left) = self.generators.last else {\n                break\n            }\n            \n            if self.isDisposed {\n                return\n            }\n\n            self.generators.removeLast()\n            \n            var e = g\n\n            guard let nextCandidate = e.next()?.asObservable() else {\n                continue\n            }\n\n            // `left` is a hint of how many elements are left in generator.\n            // In case this is the last element, then there is no need to push\n            // that generator on stack.\n            //\n            // This is an optimization used to make sure in tail recursive case\n            // there is no memory leak in case this operator is used to generate non terminating\n            // sequence.\n\n            if let knownOriginalLeft = left {\n                // `- 1` because generator.next() has just been called\n                if knownOriginalLeft - 1 >= 1 {\n                    self.generators.append((e, knownOriginalLeft - 1))\n                }\n            }\n            else {\n                self.generators.append((e, nil))\n            }\n\n            let nextGenerator = self.extract(nextCandidate)\n\n            if let nextGenerator = nextGenerator {\n                self.generators.append(nextGenerator)\n                #if DEBUG || TRACE_RESOURCES\n                    if maxTailRecursiveSinkStackSize < self.generators.count {\n                        maxTailRecursiveSinkStackSize = self.generators.count\n                    }\n                #endif\n            }\n            else {\n                next = nextCandidate\n            }\n        } while next == nil\n\n        guard let existingNext = next else {\n            self.done()\n            return\n        }\n\n        let disposable = SingleAssignmentDisposable()\n        self.subscription.disposable = disposable\n        disposable.setDisposable(self.subscribeToNext(existingNext))\n    }\n\n    func subscribeToNext(_ source: Observable<Element>) -> Disposable {\n        rxAbstractMethod()\n    }\n\n    func disposeCommand() {\n        self.disposed = true\n        self.generators.removeAll(keepingCapacity: false)\n    }\n\n    override func dispose() {\n        super.dispose()\n        \n        self.subscription.dispose()\n        self.gate.dispose()\n        \n        self.schedule(.dispose)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Reactive.swift",
    "content": "//\n//  Reactive.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 5/2/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n/**\n Use `Reactive` proxy as customization point for constrained protocol extensions.\n\n General pattern would be:\n\n // 1. Extend Reactive protocol with constrain on Base\n // Read as: Reactive Extension where Base is a SomeType\n extension Reactive where Base: SomeType {\n // 2. Put any specific reactive extension for SomeType here\n }\n\n With this approach we can have more specialized methods and properties using\n `Base` and not just specialized on common base type.\n\n `Binder`s are also automatically synthesized using `@dynamicMemberLookup` for writable reference properties of the reactive base.\n */\n\n@dynamicMemberLookup\npublic struct Reactive<Base> {\n    /// Base object to extend.\n    public let base: Base\n\n    /// Creates extensions with base object.\n    ///\n    /// - parameter base: Base object.\n    public init(_ base: Base) {\n        self.base = base\n    }\n\n    /// Automatically synthesized binder for a key path between the reactive\n    /// base and one of its properties\n    public subscript<Property>(dynamicMember keyPath: ReferenceWritableKeyPath<Base, Property>) -> Binder<Property> where Base: AnyObject {\n        Binder(self.base) { base, value in\n            base[keyPath: keyPath] = value\n        }\n    }\n}\n\n/// A type that has reactive extensions.\npublic protocol ReactiveCompatible {\n    /// Extended type\n    associatedtype ReactiveBase\n\n    /// Reactive extensions.\n    static var rx: Reactive<ReactiveBase>.Type { get set }\n\n    /// Reactive extensions.\n    var rx: Reactive<ReactiveBase> { get set }\n}\n\nextension ReactiveCompatible {\n    /// Reactive extensions.\n    public static var rx: Reactive<Self>.Type {\n        get { Reactive<Self>.self }\n        // this enables using Reactive to \"mutate\" base type\n        // swiftlint:disable:next unused_setter_value\n        set { }\n    }\n\n    /// Reactive extensions.\n    public var rx: Reactive<Self> {\n        get { Reactive(self) }\n        // this enables using Reactive to \"mutate\" base object\n        // swiftlint:disable:next unused_setter_value\n        set { }\n    }\n}\n\nimport Foundation\n\n/// Extend NSObject with `rx` proxy.\nextension NSObject: ReactiveCompatible { }\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Rx.swift",
    "content": "//\n//  Rx.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if TRACE_RESOURCES\n    private let resourceCount = AtomicInt(0)\n\n    /// Resource utilization information\n    public struct Resources {\n        /// Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.). This provides a simple way to detect leaks during development.\n        public static var total: Int32 {\n            load(resourceCount)\n        }\n\n        /// Increments `Resources.total` resource count.\n        ///\n        /// - returns: New resource count\n        public static func incrementTotal() -> Int32 {\n            increment(resourceCount)\n        }\n\n        /// Decrements `Resources.total` resource count\n        ///\n        /// - returns: New resource count\n        public static func decrementTotal() -> Int32 {\n            decrement(resourceCount)\n        }\n    }\n#endif\n\n/// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass.\nfunc rxAbstractMethod(file: StaticString = #file, line: UInt = #line) -> Swift.Never {\n    rxFatalError(\"Abstract method\", file: file, line: line)\n}\n\nfunc rxFatalError(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> Swift.Never  {\n    fatalError(lastMessage(), file: file, line: line)\n}\n\nfunc rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {\n    #if DEBUG\n        fatalError(lastMessage(), file: file, line: line)\n    #else\n        print(\"\\(file):\\(line): \\(lastMessage())\")\n    #endif\n}\n\nfunc incrementChecked(_ i: inout Int) throws -> Int {\n    if i == Int.max {\n        throw RxError.overflow\n    }\n    defer { i += 1 }\n    return i\n}\n\nfunc decrementChecked(_ i: inout Int) throws -> Int {\n    if i == Int.min {\n        throw RxError.overflow\n    }\n    defer { i -= 1 }\n    return i\n}\n\n#if DEBUG\n    import Foundation\n    final class SynchronizationTracker {\n        private let lock = RecursiveLock()\n\n        public enum SynchronizationErrorMessages: String {\n            case variable = \"Two different threads are trying to assign the same `Variable.value` unsynchronized.\\n    This is undefined behavior because the end result (variable value) is nondeterministic and depends on the \\n    operating system thread scheduler. This will cause random behavior of your program.\\n\"\n            case `default` = \"Two different unsynchronized threads are trying to send some event simultaneously.\\n    This is undefined behavior because the ordering of the effects caused by these events is nondeterministic and depends on the \\n    operating system thread scheduler. This will result in a random behavior of your program.\\n\"\n        }\n\n        private var threads = [UnsafeMutableRawPointer: Int]()\n\n        private func synchronizationError(_ message: String) {\n            #if FATAL_SYNCHRONIZATION\n                rxFatalError(message)\n            #else\n                print(message)\n            #endif\n        }\n        \n        func register(synchronizationErrorMessage: SynchronizationErrorMessages) {\n            self.lock.lock(); defer { self.lock.unlock() }\n            let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()\n            let count = (self.threads[pointer] ?? 0) + 1\n\n            if count > 1 {\n                self.synchronizationError(\n                    \"⚠️ Reentrancy anomaly was detected.\\n\" +\n                    \"  > Debugging: To debug this issue you can set a breakpoint in \\(#file):\\(#line) and observe the call stack.\\n\" +\n                    \"  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\\n\" +\n                    \"    This behavior breaks the grammar because there is overlapping between sequence events.\\n\" +\n                    \"    Observable sequence is trying to send an event before sending of previous event has finished.\\n\" +\n                    \"  > Interpretation: This could mean that there is some kind of unexpected cyclic dependency in your code,\\n\" +\n                    \"    or that the system is not behaving in the expected way.\\n\" +\n                    \"  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observe(on:MainScheduler.asyncInstance)`\\n\" +\n                    \"    or by enqueuing sequence events in some other way.\\n\"\n                )\n            }\n            \n            self.threads[pointer] = count\n\n            if self.threads.count > 1 {\n                self.synchronizationError(\n                    \"⚠️ Synchronization anomaly was detected.\\n\" +\n                    \"  > Debugging: To debug this issue you can set a breakpoint in \\(#file):\\(#line) and observe the call stack.\\n\" +\n                    \"  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\\n\" +\n                    \"    This behavior breaks the grammar because there is overlapping between sequence events.\\n\" +\n                    \"    Observable sequence is trying to send an event before sending of previous event has finished.\\n\" +\n                    \"  > Interpretation: \" + synchronizationErrorMessage.rawValue +\n                    \"  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observe(on:MainScheduler.asyncInstance)`\\n\" +\n                    \"    or by synchronizing sequence events in some other way.\\n\"\n                )\n            }\n        }\n\n        func unregister() {\n            self.lock.performLocked { \n                let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()\n                self.threads[pointer] = (self.threads[pointer] ?? 1) - 1\n                if self.threads[pointer] == 0 {\n                    self.threads[pointer] = nil\n                }\n            }\n        }\n    }\n\n#endif\n\n/// RxSwift global hooks\npublic enum Hooks {\n    \n    // Should capture call stack\n    public static var recordCallStackOnError: Bool = false\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/RxMutableBox.swift",
    "content": "//\n//  RxMutableBox.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(Linux)\n/// As Swift 5 was released, A patch to `Thread` for Linux\n/// changed `threadDictionary` to a `NSMutableDictionary` instead of\n/// a `Dictionary<String, Any>`: https://github.com/apple/swift-corelibs-foundation/pull/1762/files\n///\n/// This means that on Linux specifically, `RxMutableBox` must be a `NSObject`\n/// or it won't be possible to store it in `Thread.threadDictionary`.\n///\n/// For more information, read the discussion at:\n/// https://github.com/ReactiveX/RxSwift/issues/1911#issuecomment-479723298\nimport Foundation\n\n/// Creates mutable reference wrapper for any type.\nfinal class RxMutableBox<T>: NSObject {\n    /// Wrapped value\n    var value: T\n\n    /// Creates reference wrapper for `value`.\n    ///\n    /// - parameter value: Value to wrap.\n    init (_ value: T) {\n        self.value = value\n    }\n}\n#else\n/// Creates mutable reference wrapper for any type.\nfinal class RxMutableBox<T>: CustomDebugStringConvertible {\n    /// Wrapped value\n    var value: T\n    \n    /// Creates reference wrapper for `value`.\n    ///\n    /// - parameter value: Value to wrap.\n    init (_ value: T) {\n        self.value = value\n    }\n}\n\nextension RxMutableBox {\n    /// - returns: Box description.\n    var debugDescription: String {\n        \"MutatingBox(\\(self.value))\"\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/SchedulerType.swift",
    "content": "//\n//  SchedulerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n// Type that represents time interval in the context of RxSwift.\npublic typealias RxTimeInterval = DispatchTimeInterval\n\n/// Type that represents absolute time in the context of RxSwift.\npublic typealias RxTime = Date\n\n/// Represents an object that schedules units of work.\npublic protocol SchedulerType: ImmediateSchedulerType {\n\n    /// - returns: Current time.\n    var now : RxTime {\n        get\n    }\n\n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable\n \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable\n}\n\nextension SchedulerType {\n\n    /**\n    Periodic task will be emulated using recursive scheduling.\n\n    - parameter state: Initial state passed to the action upon the first iteration.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - returns: The disposable object used to cancel the scheduled recurring action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        let schedule = SchedulePeriodicRecursive(scheduler: self, startAfter: startAfter, period: period, action: action, state: state)\n            \n        return schedule.start()\n    }\n\n    func scheduleRecursive<State>(_ state: State, dueTime: RxTimeInterval, action: @escaping (State, AnyRecursiveScheduler<State>) -> Void) -> Disposable {\n        let scheduler = AnyRecursiveScheduler(scheduler: self, action: action)\n         \n        scheduler.schedule(state, dueTime: dueTime)\n            \n        return Disposables.create(with: scheduler.dispose)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift",
    "content": "//\n//  ConcurrentDispatchQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/5/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n/// Abstracts the work that needs to be performed on a specific `dispatch_queue_t`. You can also pass a serial dispatch queue, it shouldn't cause any problems.\n///\n/// This scheduler is suitable when some work needs to be performed in background.\npublic class ConcurrentDispatchQueueScheduler: SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n    \n    public var now : Date {\n        Date()\n    }\n\n    let configuration: DispatchQueueConfiguration\n    \n    /// Constructs new `ConcurrentDispatchQueueScheduler` that wraps `queue`.\n    ///\n    /// - parameter queue: Target dispatch queue.\n    /// - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n    public init(queue: DispatchQueue, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.configuration = DispatchQueueConfiguration(queue: queue, leeway: leeway)\n    }\n    \n    /// Convenience init for scheduler that wraps one of the global concurrent dispatch queues.\n    ///\n    /// - parameter qos: Target global dispatch queue, by quality of service class.\n    /// - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n    public convenience init(qos: DispatchQoS, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.init(queue: DispatchQueue(\n            label: \"rxswift.queue.\\(qos)\",\n            qos: qos,\n            attributes: [DispatchQueue.Attributes.concurrent],\n            target: nil),\n            leeway: leeway\n        )\n    }\n\n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.configuration.schedule(state, action: action)\n    }\n    \n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.configuration.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n    \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        self.configuration.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift",
    "content": "//\n//  ConcurrentMainScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n/**\nAbstracts work that needs to be performed on `MainThread`. In case `schedule` methods are called from main thread, it will perform action immediately without scheduling.\n\nThis scheduler is optimized for `subscribeOn` operator. If you want to observe observable sequence elements on main thread using `observeOn` operator,\n`MainScheduler` is more suitable for that purpose.\n*/\npublic final class ConcurrentMainScheduler : SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n\n    private let mainScheduler: MainScheduler\n    private let mainQueue: DispatchQueue\n\n    /// - returns: Current time.\n    public var now: Date {\n        self.mainScheduler.now as Date\n    }\n\n    private init(mainScheduler: MainScheduler) {\n        self.mainQueue = DispatchQueue.main\n        self.mainScheduler = mainScheduler\n    }\n\n    /// Singleton instance of `ConcurrentMainScheduler`\n    public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)\n\n    /**\n    Schedules an action to be executed immediately.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        if DispatchQueue.isMain {\n            return action(state)\n        }\n\n        let cancel = SingleAssignmentDisposable()\n\n        self.mainQueue.async {\n            if cancel.isDisposed {\n                return\n            }\n\n            cancel.setDisposable(action(state))\n        }\n\n        return cancel\n    }\n\n    /**\n    Schedules an action to be executed.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.mainScheduler.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n\n    /**\n    Schedules a periodic piece of work.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        self.mainScheduler.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift",
    "content": "//\n//  CurrentThreadScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n#if os(Linux)\n    fileprivate enum CurrentThreadSchedulerQueueKey {\n        fileprivate static let instance = \"RxSwift.CurrentThreadScheduler.Queue\"\n    }\n#else\n    private class CurrentThreadSchedulerQueueKey: NSObject, NSCopying {\n        static let instance = CurrentThreadSchedulerQueueKey()\n        private override init() {\n            super.init()\n        }\n\n        override var hash: Int {\n            return 0\n        }\n\n        public func copy(with zone: NSZone? = nil) -> Any {\n            return self\n        }\n    }\n#endif\n\n/// Represents an object that schedules units of work on the current thread.\n///\n/// This is the default scheduler for operators that generate elements.\n///\n/// This scheduler is also sometimes called `trampoline scheduler`.\npublic class CurrentThreadScheduler : ImmediateSchedulerType {\n    typealias ScheduleQueue = RxMutableBox<Queue<ScheduledItemType>>\n\n    /// The singleton instance of the current thread scheduler.\n    public static let instance = CurrentThreadScheduler()\n\n    private static var isScheduleRequiredKey: pthread_key_t = { () -> pthread_key_t in\n        let key = UnsafeMutablePointer<pthread_key_t>.allocate(capacity: 1)\n        defer { key.deallocate() }\n                                                               \n        guard pthread_key_create(key, nil) == 0 else {\n            rxFatalError(\"isScheduleRequired key creation failed\")\n        }\n\n        return key.pointee\n    }()\n\n    private static var scheduleInProgressSentinel: UnsafeRawPointer = { () -> UnsafeRawPointer in\n        return UnsafeRawPointer(UnsafeMutablePointer<Int>.allocate(capacity: 1))\n    }()\n\n    static var queue : ScheduleQueue? {\n        get {\n            return Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerQueueKey.instance)\n        }\n        set {\n            Thread.setThreadLocalStorageValue(newValue, forKey: CurrentThreadSchedulerQueueKey.instance)\n        }\n    }\n\n    /// Gets a value that indicates whether the caller must call a `schedule` method.\n    public static private(set) var isScheduleRequired: Bool {\n        get {\n            return pthread_getspecific(CurrentThreadScheduler.isScheduleRequiredKey) == nil\n        }\n        set(isScheduleRequired) {\n            if pthread_setspecific(CurrentThreadScheduler.isScheduleRequiredKey, isScheduleRequired ? nil : scheduleInProgressSentinel) != 0 {\n                rxFatalError(\"pthread_setspecific failed\")\n            }\n        }\n    }\n\n    /**\n    Schedules an action to be executed as soon as possible on current thread.\n\n    If this method is called on some thread that doesn't have `CurrentThreadScheduler` installed, scheduler will be\n    automatically installed and uninstalled after all work is performed.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        if CurrentThreadScheduler.isScheduleRequired {\n            CurrentThreadScheduler.isScheduleRequired = false\n\n            let disposable = action(state)\n\n            defer {\n                CurrentThreadScheduler.isScheduleRequired = true\n                CurrentThreadScheduler.queue = nil\n            }\n\n            guard let queue = CurrentThreadScheduler.queue else {\n                return disposable\n            }\n\n            while let latest = queue.value.dequeue() {\n                if latest.isDisposed {\n                    continue\n                }\n                latest.invoke()\n            }\n\n            return disposable\n        }\n\n        let existingQueue = CurrentThreadScheduler.queue\n\n        let queue: RxMutableBox<Queue<ScheduledItemType>>\n        if let existingQueue = existingQueue {\n            queue = existingQueue\n        }\n        else {\n            queue = RxMutableBox(Queue<ScheduledItemType>(capacity: 1))\n            CurrentThreadScheduler.queue = queue\n        }\n\n        let scheduledItem = ScheduledItem(action: action, state: state)\n        queue.value.enqueue(scheduledItem)\n\n        return scheduledItem\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift",
    "content": "//\n//  HistoricalScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n/// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time.\npublic class HistoricalScheduler : VirtualTimeScheduler<HistoricalSchedulerTimeConverter> {\n\n    /**\n      Creates a new historical scheduler with initial clock value.\n     \n     - parameter initialClock: Initial value for virtual clock.\n    */\n    public init(initialClock: RxTime = Date(timeIntervalSince1970: 0)) {\n        super.init(initialClock: initialClock, converter: HistoricalSchedulerTimeConverter())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift",
    "content": "//\n//  HistoricalSchedulerTimeConverter.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n/// Converts historical virtual time into real time.\n///\n/// Since historical virtual time is also measured in `Date`, this converter is identity function.\npublic struct HistoricalSchedulerTimeConverter : VirtualTimeConverterType {\n    /// Virtual time unit used that represents ticks of virtual clock.\n    public typealias VirtualTimeUnit = RxTime\n\n    /// Virtual time unit used to represent differences of virtual times.\n    public typealias VirtualTimeIntervalUnit = TimeInterval\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertFromVirtualTime(_ virtualTime: VirtualTimeUnit) -> RxTime {\n        virtualTime\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit {\n        time\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertFromVirtualTimeInterval(_ virtualTimeInterval: VirtualTimeIntervalUnit) -> TimeInterval {\n        virtualTimeInterval\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertToVirtualTimeInterval(_ timeInterval: TimeInterval) -> VirtualTimeIntervalUnit {\n        timeInterval\n    }\n\n    /**\n     Offsets `Date` by time interval.\n     \n     - parameter time: Time.\n     - parameter timeInterval: Time interval offset.\n     - returns: Time offsetted by time interval.\n    */\n    public func offsetVirtualTime(_ time: VirtualTimeUnit, offset: VirtualTimeIntervalUnit) -> VirtualTimeUnit {\n        time.addingTimeInterval(offset)\n    }\n\n    /// Compares two `Date`s.\n    public func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison {\n        switch lhs.compare(rhs as Date) {\n        case .orderedAscending:\n            return .lessThan\n        case .orderedSame:\n            return .equal\n        case .orderedDescending:\n            return .greaterThan\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift",
    "content": "//\n//  DispatchQueueConfiguration.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/23/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\nstruct DispatchQueueConfiguration {\n    let queue: DispatchQueue\n    let leeway: DispatchTimeInterval\n}\n\nextension DispatchQueueConfiguration {\n    func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let cancel = SingleAssignmentDisposable()\n\n        self.queue.async {\n            if cancel.isDisposed {\n                return\n            }\n\n\n            cancel.setDisposable(action(state))\n        }\n\n        return cancel\n    }\n\n    func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let deadline = DispatchTime.now() + dueTime\n\n        let compositeDisposable = CompositeDisposable()\n\n        let timer = DispatchSource.makeTimerSource(queue: self.queue)\n        timer.schedule(deadline: deadline, leeway: self.leeway)\n\n        // TODO:\n        // This looks horrible, and yes, it is.\n        // It looks like Apple has made a conceputal change here, and I'm unsure why.\n        // Need more info on this.\n        // It looks like just setting timer to fire and not holding a reference to it\n        // until deadline causes timer cancellation.\n        var timerReference: DispatchSourceTimer? = timer\n        let cancelTimer = Disposables.create {\n            timerReference?.cancel()\n            timerReference = nil\n        }\n\n        timer.setEventHandler(handler: {\n            if compositeDisposable.isDisposed {\n                return\n            }\n            _ = compositeDisposable.insert(action(state))\n            cancelTimer.dispose()\n        })\n        timer.resume()\n\n        _ = compositeDisposable.insert(cancelTimer)\n\n        return compositeDisposable\n    }\n\n    func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        let initial = DispatchTime.now() + startAfter\n\n        var timerState = state\n\n        let timer = DispatchSource.makeTimerSource(queue: self.queue)\n        timer.schedule(deadline: initial, repeating: period, leeway: self.leeway)\n        \n        // TODO:\n        // This looks horrible, and yes, it is.\n        // It looks like Apple has made a conceputal change here, and I'm unsure why.\n        // Need more info on this.\n        // It looks like just setting timer to fire and not holding a reference to it\n        // until deadline causes timer cancellation.\n        var timerReference: DispatchSourceTimer? = timer\n        let cancelTimer = Disposables.create {\n            timerReference?.cancel()\n            timerReference = nil\n        }\n\n        timer.setEventHandler(handler: {\n            if cancelTimer.isDisposed {\n                return\n            }\n            timerState = action(timerState)\n        })\n        timer.resume()\n        \n        return cancelTimer\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift",
    "content": "//\n//  InvocableScheduledItem.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct InvocableScheduledItem<I: InvocableWithValueType> : InvocableType {\n\n    let invocable: I\n    let state: I.Value\n\n    init(invocable: I, state: I.Value) {\n        self.invocable = invocable\n        self.state = state\n    }\n\n    func invoke() {\n        self.invocable.invoke(self.state)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift",
    "content": "//\n//  InvocableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol InvocableType {\n    func invoke()\n}\n\nprotocol InvocableWithValueType {\n    associatedtype Value\n\n    func invoke(_ value: Value)\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift",
    "content": "//\n//  ScheduledItem.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct ScheduledItem<T>\n    : ScheduledItemType\n    , InvocableType {\n    typealias Action = (T) -> Disposable\n    \n    private let action: Action\n    private let state: T\n\n    private let disposable = SingleAssignmentDisposable()\n\n    var isDisposed: Bool {\n        self.disposable.isDisposed\n    }\n    \n    init(action: @escaping Action, state: T) {\n        self.action = action\n        self.state = state\n    }\n    \n    func invoke() {\n         self.disposable.setDisposable(self.action(self.state))\n    }\n    \n    func dispose() {\n        self.disposable.dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift",
    "content": "//\n//  ScheduledItemType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol ScheduledItemType\n    : Cancelable\n    , InvocableType {\n    func invoke()\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift",
    "content": "//\n//  MainScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n#if !os(Linux)\n    import Foundation\n#endif\n\n/**\nAbstracts work that needs to be performed on `DispatchQueue.main`. In case `schedule` methods are called from `DispatchQueue.main`, it will perform action immediately without scheduling.\n\nThis scheduler is usually used to perform UI work.\n\nMain scheduler is a specialization of `SerialDispatchQueueScheduler`.\n\nThis scheduler is optimized for `observeOn` operator. To ensure observable sequence is subscribed on main thread using `subscribeOn`\noperator please use `ConcurrentMainScheduler` because it is more optimized for that purpose.\n*/\npublic final class MainScheduler : SerialDispatchQueueScheduler {\n\n    private let mainQueue: DispatchQueue\n\n    let numberEnqueued = AtomicInt(0)\n\n    /// Initializes new instance of `MainScheduler`.\n    public init() {\n        self.mainQueue = DispatchQueue.main\n        super.init(serialQueue: self.mainQueue)\n    }\n\n    /// Singleton instance of `MainScheduler`\n    public static let instance = MainScheduler()\n\n    /// Singleton instance of `MainScheduler` that always schedules work asynchronously\n    /// and doesn't perform optimizations for calls scheduled from main queue.\n    public static let asyncInstance = SerialDispatchQueueScheduler(serialQueue: DispatchQueue.main)\n\n    /// In case this method is called on a background thread it will throw an exception.\n    public class func ensureExecutingOnScheduler(errorMessage: String? = nil) {\n        if !DispatchQueue.isMain {\n            rxFatalError(errorMessage ?? \"Executing on background thread. Please use `MainScheduler.instance.schedule` to schedule work on main thread.\")\n        }\n    }\n\n    /// In case this method is running on a background thread it will throw an exception.\n    public class func ensureRunningOnMainThread(errorMessage: String? = nil) {\n        #if !os(Linux) // isMainThread is not implemented in Linux Foundation\n            guard Thread.isMainThread else {\n                rxFatalError(errorMessage ?? \"Running on background thread.\")\n            }\n        #endif\n    }\n\n    override func scheduleInternal<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let previousNumberEnqueued = increment(self.numberEnqueued)\n\n        if DispatchQueue.isMain && previousNumberEnqueued == 0 {\n            let disposable = action(state)\n            decrement(self.numberEnqueued)\n            return disposable\n        }\n\n        let cancel = SingleAssignmentDisposable()\n\n        self.mainQueue.async {\n            if !cancel.isDisposed {\n                cancel.setDisposable(action(state))\n            }\n\n            decrement(self.numberEnqueued)\n        }\n\n        return cancel\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift",
    "content": "//\n//  OperationQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n/// Abstracts the work that needs to be performed on a specific `NSOperationQueue`.\n///\n/// This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in background and you want to fine tune concurrent processing using `maxConcurrentOperationCount`.\npublic class OperationQueueScheduler: ImmediateSchedulerType {\n    public let operationQueue: OperationQueue\n    public let queuePriority: Operation.QueuePriority\n    \n    /// Constructs new instance of `OperationQueueScheduler` that performs work on `operationQueue`.\n    ///\n    /// - parameter operationQueue: Operation queue targeted to perform work on.\n    /// - parameter queuePriority: Queue priority which will be assigned to new operations.\n    public init(operationQueue: OperationQueue, queuePriority: Operation.QueuePriority = .normal) {\n        self.operationQueue = operationQueue\n        self.queuePriority = queuePriority\n    }\n    \n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let cancel = SingleAssignmentDisposable()\n\n        let operation = BlockOperation {\n            if cancel.isDisposed {\n                return\n            }\n\n\n            cancel.setDisposable(action(state))\n        }\n\n        operation.queuePriority = self.queuePriority\n\n        self.operationQueue.addOperation(operation)\n        \n        return cancel\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift",
    "content": "//\n//  RecursiveScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprivate enum ScheduleState {\n    case initial\n    case added(CompositeDisposable.DisposeKey)\n    case done\n}\n\n/// Type erased recursive scheduler.\nfinal class AnyRecursiveScheduler<State> {\n    \n    typealias Action =  (State, AnyRecursiveScheduler<State>) -> Void\n\n    private let lock = RecursiveLock()\n    \n    // state\n    private let group = CompositeDisposable()\n\n    private var scheduler: SchedulerType\n    private var action: Action?\n    \n    init(scheduler: SchedulerType, action: @escaping Action) {\n        self.action = action\n        self.scheduler = scheduler\n    }\n\n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the recursive action.\n    */\n    func schedule(_ state: State, dueTime: RxTimeInterval) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = self.scheduler.scheduleRelative(state, dueTime: dueTime) { state -> Disposable in\n            // best effort\n            if self.group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self.lock.performLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self.group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n\n                return self.action\n            }\n            \n            if let action = action {\n                action(state, self)\n            }\n            \n            return Disposables.create()\n        }\n            \n        self.lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n            case .initial:\n                if let removeKey = self.group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n            case .done:\n                break\n            }\n        }\n    }\n\n    /// Schedules an action to be executed recursively.\n    ///\n    /// - parameter state: State passed to the action to be executed.\n    func schedule(_ state: State) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = self.scheduler.schedule(state) { state -> Disposable in\n            // best effort\n            if self.group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self.lock.performLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self.group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n                \n                return self.action\n            }\n           \n            if let action = action {\n                action(state, self)\n            }\n            \n            return Disposables.create()\n        }\n        \n        self.lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n            case .initial:\n                if let removeKey = self.group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n            case .done:\n                break\n            }\n        }\n    }\n    \n    func dispose() {\n        self.lock.performLocked {\n            self.action = nil\n        }\n        self.group.dispose()\n    }\n}\n\n/// Type erased recursive scheduler.\nfinal class RecursiveImmediateScheduler<State> {\n    typealias Action =  (_ state: State, _ recurse: (State) -> Void) -> Void\n    \n    private var lock = SpinLock()\n    private let group = CompositeDisposable()\n    \n    private var action: Action?\n    private let scheduler: ImmediateSchedulerType\n    \n    init(action: @escaping Action, scheduler: ImmediateSchedulerType) {\n        self.action = action\n        self.scheduler = scheduler\n    }\n    \n    // immediate scheduling\n    \n    /// Schedules an action to be executed recursively.\n    ///\n    /// - parameter state: State passed to the action to be executed.\n    func schedule(_ state: State) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = self.scheduler.schedule(state) { state -> Disposable in\n            // best effort\n            if self.group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self.lock.performLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self.group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n\n                return self.action\n            }\n            \n            if let action = action {\n                action(state, self.schedule)\n            }\n            \n            return Disposables.create()\n        }\n        \n        self.lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n            case .initial:\n                if let removeKey = self.group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n            case .done:\n                break\n            }\n        }\n    }\n    \n    func dispose() {\n        self.lock.performLocked {\n            self.action = nil\n        }\n        self.group.dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift",
    "content": "//\n//  SchedulerServices+Emulation.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nenum SchedulePeriodicRecursiveCommand {\n    case tick\n    case dispatchStart\n}\n\nfinal class SchedulePeriodicRecursive<State> {\n    typealias RecursiveAction = (State) -> State\n    typealias RecursiveScheduler = AnyRecursiveScheduler<SchedulePeriodicRecursiveCommand>\n\n    private let scheduler: SchedulerType\n    private let startAfter: RxTimeInterval\n    private let period: RxTimeInterval\n    private let action: RecursiveAction\n\n    private var state: State\n    private let pendingTickCount = AtomicInt(0)\n\n    init(scheduler: SchedulerType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping RecursiveAction, state: State) {\n        self.scheduler = scheduler\n        self.startAfter = startAfter\n        self.period = period\n        self.action = action\n        self.state = state\n    }\n\n    func start() -> Disposable {\n        self.scheduler.scheduleRecursive(SchedulePeriodicRecursiveCommand.tick, dueTime: self.startAfter, action: self.tick)\n    }\n\n    func tick(_ command: SchedulePeriodicRecursiveCommand, scheduler: RecursiveScheduler) {\n        // Tries to emulate periodic scheduling as best as possible.\n        // The problem that could arise is if handling periodic ticks take too long, or\n        // tick interval is short.\n        switch command {\n        case .tick:\n            scheduler.schedule(.tick, dueTime: self.period)\n\n            // The idea is that if on tick there wasn't any item enqueued, schedule to perform work immediately.\n            // Else work will be scheduled after previous enqueued work completes.\n            if increment(self.pendingTickCount) == 0 {\n                self.tick(.dispatchStart, scheduler: scheduler)\n            }\n\n        case .dispatchStart:\n            self.state = self.action(self.state)\n            // Start work and schedule check is this last batch of work\n            if decrement(self.pendingTickCount) > 1 {\n                // This gives priority to scheduler emulation, it's not perfect, but helps\n                scheduler.schedule(SchedulePeriodicRecursiveCommand.dispatchStart)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift",
    "content": "//\n//  SerialDispatchQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport Foundation\n\n/**\nAbstracts the work that needs to be performed on a specific `dispatch_queue_t`. It will make sure \nthat even if concurrent dispatch queue is passed, it's transformed into a serial one.\n\nIt is extremely important that this scheduler is serial, because\ncertain operator perform optimizations that rely on that property.\n\nBecause there is no way of detecting is passed dispatch queue serial or\nconcurrent, for every queue that is being passed, worst case (concurrent)\nwill be assumed, and internal serial proxy dispatch queue will be created.\n\nThis scheduler can also be used with internal serial queue alone.\n\nIn case some customization need to be made on it before usage,\ninternal serial queue can be customized using `serialQueueConfiguration`\ncallback.\n*/\npublic class SerialDispatchQueueScheduler : SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n    \n    /// - returns: Current time.\n    public var now : Date {\n        Date()\n    }\n\n    let configuration: DispatchQueueConfiguration\n    \n    /**\n    Constructs new `SerialDispatchQueueScheduler` that wraps `serialQueue`.\n\n    - parameter serialQueue: Target dispatch queue.\n    - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n    */\n    init(serialQueue: DispatchQueue, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.configuration = DispatchQueueConfiguration(queue: serialQueue, leeway: leeway)\n    }\n\n    /**\n    Constructs new `SerialDispatchQueueScheduler` with internal serial queue named `internalSerialQueueName`.\n    \n    Additional dispatch queue properties can be set after dispatch queue is created using `serialQueueConfiguration`.\n    \n    - parameter internalSerialQueueName: Name of internal serial dispatch queue.\n    - parameter serialQueueConfiguration: Additional configuration of internal serial dispatch queue.\n    - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n    */\n    public convenience init(internalSerialQueueName: String, serialQueueConfiguration: ((DispatchQueue) -> Void)? = nil, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        let queue = DispatchQueue(label: internalSerialQueueName, attributes: [])\n        serialQueueConfiguration?(queue)\n        self.init(serialQueue: queue, leeway: leeway)\n    }\n    \n    /**\n    Constructs new `SerialDispatchQueueScheduler` named `internalSerialQueueName` that wraps `queue`.\n    \n    - parameter queue: Possibly concurrent dispatch queue used to perform work.\n    - parameter internalSerialQueueName: Name of internal serial dispatch queue proxy.\n    - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n    */\n    public convenience init(queue: DispatchQueue, internalSerialQueueName: String, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        // Swift 3.0 IUO\n        let serialQueue = DispatchQueue(label: internalSerialQueueName,\n                                        attributes: [],\n                                        target: queue)\n        self.init(serialQueue: serialQueue, leeway: leeway)\n    }\n\n    /**\n     Constructs new `SerialDispatchQueueScheduler` that wraps one of the global concurrent dispatch queues.\n     \n     - parameter qos: Identifier for global dispatch queue with specified quality of service class.\n     - parameter internalSerialQueueName: Custom name for internal serial dispatch queue proxy.\n     - parameter leeway: The amount of time, in nanoseconds, that the system will defer the timer.\n     */\n    @available(macOS 10.10, *)\n    public convenience init(qos: DispatchQoS, internalSerialQueueName: String = \"rx.global_dispatch_queue.serial\", leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.init(queue: DispatchQueue.global(qos: qos.qosClass), internalSerialQueueName: internalSerialQueueName, leeway: leeway)\n    }\n    \n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.scheduleInternal(state, action: action)\n    }\n\n    func scheduleInternal<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.configuration.schedule(state, action: action)\n    }\n\n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        self.configuration.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n    \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        self.configuration.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift",
    "content": "//\n//  VirtualTimeConverterType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n/// Parametrization for virtual time used by `VirtualTimeScheduler`s.\npublic protocol VirtualTimeConverterType {\n    /// Virtual time unit used that represents ticks of virtual clock.\n    associatedtype VirtualTimeUnit\n\n    /// Virtual time unit used to represent differences of virtual times.\n    associatedtype VirtualTimeIntervalUnit\n\n    /**\n     Converts virtual time to real time.\n     \n     - parameter virtualTime: Virtual time to convert to `Date`.\n     - returns: `Date` corresponding to virtual time.\n    */\n    func convertFromVirtualTime(_ virtualTime: VirtualTimeUnit) -> RxTime\n\n    /**\n     Converts real time to virtual time.\n     \n     - parameter time: `Date` to convert to virtual time.\n     - returns: Virtual time corresponding to `Date`.\n    */\n    func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit\n\n    /**\n     Converts from virtual time interval to `NSTimeInterval`.\n     \n     - parameter virtualTimeInterval: Virtual time interval to convert to `NSTimeInterval`.\n     - returns: `NSTimeInterval` corresponding to virtual time interval.\n    */\n    func convertFromVirtualTimeInterval(_ virtualTimeInterval: VirtualTimeIntervalUnit) -> TimeInterval\n\n    /**\n     Converts from `NSTimeInterval` to virtual time interval.\n     \n     - parameter timeInterval: `NSTimeInterval` to convert to virtual time interval.\n     - returns: Virtual time interval corresponding to time interval.\n    */\n    func convertToVirtualTimeInterval(_ timeInterval: TimeInterval) -> VirtualTimeIntervalUnit\n\n    /**\n     Offsets virtual time by virtual time interval.\n     \n     - parameter time: Virtual time.\n     - parameter offset: Virtual time interval.\n     - returns: Time corresponding to time offsetted by virtual time interval.\n    */\n    func offsetVirtualTime(_ time: VirtualTimeUnit, offset: VirtualTimeIntervalUnit) -> VirtualTimeUnit\n\n    /**\n     This is additional abstraction because `Date` is unfortunately not comparable.\n     Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries.\n    */\n    func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison\n}\n\n/**\n Virtual time comparison result.\n\n This is additional abstraction because `Date` is unfortunately not comparable.\n Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries.\n*/\npublic enum VirtualTimeComparison {\n    /// lhs < rhs.\n    case lessThan\n    /// lhs == rhs.\n    case equal\n    /// lhs > rhs.\n    case greaterThan\n}\n\nextension VirtualTimeComparison {\n    /// lhs < rhs.\n    var lessThen: Bool {\n        self == .lessThan\n    }\n\n    /// lhs > rhs\n    var greaterThan: Bool {\n        self == .greaterThan\n    }\n\n    /// lhs == rhs\n    var equal: Bool {\n        self == .equal\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift",
    "content": "//\n//  VirtualTimeScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Base class for virtual time schedulers using a priority queue for scheduled items.\nopen class VirtualTimeScheduler<Converter: VirtualTimeConverterType>\n    : SchedulerType {\n\n    public typealias VirtualTime = Converter.VirtualTimeUnit\n    public typealias VirtualTimeInterval = Converter.VirtualTimeIntervalUnit\n\n    private var running : Bool\n\n    private var currentClock: VirtualTime\n\n    private var schedulerQueue : PriorityQueue<VirtualSchedulerItem<VirtualTime>>\n    private var converter: Converter\n\n    private var nextId = 0\n\n    /// - returns: Current time.\n    public var now: RxTime {\n        self.converter.convertFromVirtualTime(self.clock)\n    }\n\n    /// - returns: Scheduler's absolute time clock value.\n    public var clock: VirtualTime {\n        self.currentClock\n    }\n\n    /// Creates a new virtual time scheduler.\n    ///\n    /// - parameter initialClock: Initial value for the clock.\n    public init(initialClock: VirtualTime, converter: Converter) {\n        self.currentClock = initialClock\n        self.running = false\n        self.converter = converter\n        self.schedulerQueue = PriorityQueue(hasHigherPriority: {\n            switch converter.compareVirtualTime($0.time, $1.time) {\n            case .lessThan:\n                return true\n            case .equal:\n                return $0.id < $1.id\n            case .greaterThan:\n                return false\n            }\n        }, isEqual: { $0 === $1 })\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    /**\n    Schedules an action to be executed immediately.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.scheduleRelative(state, dueTime: .microseconds(0)) { a in\n            return action(a)\n        }\n    }\n\n    /**\n     Schedules an action to be executed.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter dueTime: Relative time after which to execute the action.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let time = self.now.addingDispatchInterval(dueTime)\n        let absoluteTime = self.converter.convertToVirtualTime(time)\n        let adjustedTime = self.adjustScheduledTime(absoluteTime)\n        return self.scheduleAbsoluteVirtual(state, time: adjustedTime, action: action)\n    }\n\n    /**\n     Schedules an action to be executed after relative time has passed.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter time: Absolute time when to execute the action. If this is less or equal then `now`, `now + 1`  will be used.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleRelativeVirtual<StateType>(_ state: StateType, dueTime: VirtualTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let time = self.converter.offsetVirtualTime(self.clock, offset: dueTime)\n        return self.scheduleAbsoluteVirtual(state, time: time, action: action)\n    }\n\n    /**\n     Schedules an action to be executed at absolute virtual time.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter time: Absolute time when to execute the action.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleAbsoluteVirtual<StateType>(_ state: StateType, time: VirtualTime, action: @escaping (StateType) -> Disposable) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        let compositeDisposable = CompositeDisposable()\n\n        let item = VirtualSchedulerItem(action: {\n            return action(state)\n        }, time: time, id: self.nextId)\n\n        self.nextId += 1\n\n        self.schedulerQueue.enqueue(item)\n        \n        _ = compositeDisposable.insert(item)\n        \n        return compositeDisposable\n    }\n\n    /// Adjusts time of scheduling before adding item to schedule queue.\n    open func adjustScheduledTime(_ time: VirtualTime) -> VirtualTime {\n        time\n    }\n\n    /// Starts the virtual time scheduler.\n    public func start() {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        if self.running {\n            return\n        }\n\n        self.running = true\n        repeat {\n            guard let next = self.findNext() else {\n                break\n            }\n\n            if self.converter.compareVirtualTime(next.time, self.clock).greaterThan {\n                self.currentClock = next.time\n            }\n\n            next.invoke()\n            self.schedulerQueue.remove(next)\n        } while self.running\n\n        self.running = false\n    }\n\n    func findNext() -> VirtualSchedulerItem<VirtualTime>? {\n        while let front = self.schedulerQueue.peek() {\n            if front.isDisposed {\n                self.schedulerQueue.remove(front)\n                continue\n            }\n\n            return front\n        }\n\n        return nil\n    }\n\n    /// Advances the scheduler's clock to the specified time, running all work till that point.\n    ///\n    /// - parameter virtualTime: Absolute time to advance the scheduler's clock to.\n    public func advanceTo(_ virtualTime: VirtualTime) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        if self.running {\n            fatalError(\"Scheduler is already running\")\n        }\n\n        self.running = true\n        repeat {\n            guard let next = self.findNext() else {\n                break\n            }\n\n            if self.converter.compareVirtualTime(next.time, virtualTime).greaterThan {\n                break\n            }\n\n            if self.converter.compareVirtualTime(next.time, self.clock).greaterThan {\n                self.currentClock = next.time\n            }\n            next.invoke()\n            self.schedulerQueue.remove(next)\n        } while self.running\n\n        self.currentClock = virtualTime\n        self.running = false\n    }\n\n    /// Advances the scheduler's clock by the specified relative time.\n    public func sleep(_ virtualInterval: VirtualTimeInterval) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        let sleepTo = self.converter.offsetVirtualTime(self.clock, offset: virtualInterval)\n        if self.converter.compareVirtualTime(sleepTo, self.clock).lessThen {\n            fatalError(\"Can't sleep to past.\")\n        }\n\n        self.currentClock = sleepTo\n    }\n\n    /// Stops the virtual time scheduler.\n    public func stop() {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        self.running = false\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\n// MARK: description\n\nextension VirtualTimeScheduler: CustomDebugStringConvertible {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        self.schedulerQueue.debugDescription\n    }\n}\n\nfinal class VirtualSchedulerItem<Time>\n    : Disposable {\n    typealias Action = () -> Disposable\n    \n    let action: Action\n    let time: Time\n    let id: Int\n\n    var isDisposed: Bool {\n        self.disposable.isDisposed\n    }\n    \n    var disposable = SingleAssignmentDisposable()\n    \n    init(action: @escaping Action, time: Time, id: Int) {\n        self.action = action\n        self.time = time\n        self.id = id\n    }\n\n    func invoke() {\n         self.disposable.setDisposable(self.action())\n    }\n    \n    func dispose() {\n        self.disposable.dispose()\n    }\n}\n\nextension VirtualSchedulerItem\n    : CustomDebugStringConvertible {\n    var debugDescription: String {\n        \"\\(self.time)\"\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift",
    "content": "//\n//  AsyncSubject.swift\n//  RxSwift\n//\n//  Created by Victor Galán on 07/01/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// An AsyncSubject emits the last value (and only the last value) emitted by the source Observable,\n/// and only after that source Observable completes.\n///\n/// (If the source Observable does not emit any values, the AsyncSubject also completes without emitting any values.)\npublic final class AsyncSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , SynchronizedUnsubscribeType {\n    public typealias SubjectObserverType = AsyncSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        self.lock.performLocked {\n            self.observers.count > 0\n        }\n    }\n\n    let lock = RecursiveLock()\n\n    // state\n    private var observers = Observers()\n    private var isStopped = false\n    private var stoppedEvent = nil as Event<Element>? {\n        didSet {\n            self.isStopped = self.stoppedEvent != nil\n        }\n    }\n    private var lastElement: Element?\n\n    #if DEBUG\n        private let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n\n    /// Creates a subject.\n    public override init() {\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n        super.init()\n    }\n\n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        let (observers, event) = self.synchronized_on(event)\n        switch event {\n        case .next:\n            dispatch(observers, event)\n            dispatch(observers, .completed)\n        case .completed:\n            dispatch(observers, event)\n        case .error:\n            dispatch(observers, event)\n        }\n    }\n\n    func synchronized_on(_ event: Event<Element>) -> (Observers, Event<Element>) {\n        self.lock.lock(); defer { self.lock.unlock() }\n        if self.isStopped {\n            return (Observers(), .completed)\n        }\n\n        switch event {\n        case .next(let element):\n            self.lastElement = element\n            return (Observers(), .completed)\n        case .error:\n            self.stoppedEvent = event\n\n            let observers = self.observers\n            self.observers.removeAll()\n\n            return (observers, event)\n        case .completed:\n\n            let observers = self.observers\n            self.observers.removeAll()\n\n            if let lastElement = self.lastElement {\n                self.stoppedEvent = .next(lastElement)\n                return (observers, .next(lastElement))\n            }\n            else {\n                self.stoppedEvent = event\n                return (observers, .completed)\n            }\n        }\n    }\n\n    /// Subscribes an observer to the subject.\n    ///\n    /// - parameter observer: Observer to subscribe to the subject.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    public override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked { self.synchronized_subscribe(observer) }\n    }\n\n    func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if let stoppedEvent = self.stoppedEvent {\n            switch stoppedEvent {\n            case .next:\n                observer.on(stoppedEvent)\n                observer.on(.completed)\n            case .completed:\n                observer.on(stoppedEvent)\n            case .error:\n                observer.on(stoppedEvent)\n            }\n            return Disposables.create()\n        }\n\n        let key = self.observers.insert(observer.on)\n\n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        self.lock.performLocked { self.synchronized_unsubscribe(disposeKey) }\n    }\n    \n    func synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        _ = self.observers.removeKey(disposeKey)\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> AsyncSubject<Element> {\n        self\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n    #endif\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift",
    "content": "//\n//  BehaviorSubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a value that changes over time.\n///\n/// Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\npublic final class BehaviorSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , SynchronizedUnsubscribeType\n    , Cancelable {\n    public typealias SubjectObserverType = BehaviorSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n    \n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        self.lock.performLocked { self.observers.count > 0 }\n    }\n    \n    let lock = RecursiveLock()\n    \n    // state\n    private var disposed = false\n    private var element: Element\n    private var observers = Observers()\n    private var stoppedEvent: Event<Element>?\n\n    #if DEBUG\n        private let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    /// Indicates whether the subject has been disposed.\n    public var isDisposed: Bool {\n        self.disposed\n    }\n \n    /// Initializes a new instance of the subject that caches its last value and starts with the specified value.\n    ///\n    /// - parameter value: Initial value sent to observers when no other value has been received by the subject yet.\n    public init(value: Element) {\n        self.element = value\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n    \n    /// Gets the current value or throws an error.\n    ///\n    /// - returns: Latest value.\n    public func value() throws -> Element {\n        self.lock.lock(); defer { self.lock.unlock() }\n        if self.isDisposed {\n            throw RxError.disposed(object: self)\n        }\n        \n        if let error = self.stoppedEvent?.error {\n            // intentionally throw exception\n            throw error\n        }\n        else {\n            return self.element\n        }\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        dispatch(self.synchronized_on(event), event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) -> Observers {\n        self.lock.lock(); defer { self.lock.unlock() }\n        if self.stoppedEvent != nil || self.isDisposed {\n            return Observers()\n        }\n        \n        switch event {\n        case .next(let element):\n            self.element = element\n        case .error, .completed:\n            self.stoppedEvent = event\n        }\n        \n        return self.observers\n    }\n    \n    /// Subscribes an observer to the subject.\n    ///\n    /// - parameter observer: Observer to subscribe to the subject.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    public override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked { self.synchronized_subscribe(observer) }\n    }\n\n    func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if self.isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n        \n        if let stoppedEvent = self.stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        \n        let key = self.observers.insert(observer.on)\n        observer.on(.next(self.element))\n    \n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        self.lock.performLocked { self.synchronized_unsubscribe(disposeKey) }\n    }\n\n    func synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        if self.isDisposed {\n            return\n        }\n\n        _ = self.observers.removeKey(disposeKey)\n    }\n\n    /// Returns observer interface for subject.\n    public func asObserver() -> BehaviorSubject<Element> {\n        self\n    }\n\n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n        self.lock.performLocked {\n            self.disposed = true\n            self.observers.removeAll()\n            self.stoppedEvent = nil\n        }\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n        _ = Resources.decrementTotal()\n        }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift",
    "content": "//\n//  PublishSubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\n///\n/// Each notification is broadcasted to all subscribed observers.\npublic final class PublishSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , Cancelable\n    , ObserverType\n    , SynchronizedUnsubscribeType {\n    public typealias SubjectObserverType = PublishSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n    \n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        self.lock.performLocked { self.observers.count > 0 }\n    }\n    \n    private let lock = RecursiveLock()\n    \n    // state\n    private var disposed = false\n    private var observers = Observers()\n    private var stopped = false\n    private var stoppedEvent = nil as Event<Element>?\n\n    #if DEBUG\n        private let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    /// Indicates whether the subject has been isDisposed.\n    public var isDisposed: Bool {\n        self.disposed\n    }\n    \n    /// Creates a subject.\n    public override init() {\n        super.init()\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        dispatch(self.synchronized_on(event), event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) -> Observers {\n        self.lock.lock(); defer { self.lock.unlock() }\n        switch event {\n        case .next:\n            if self.isDisposed || self.stopped {\n                return Observers()\n            }\n            \n            return self.observers\n        case .completed, .error:\n            if self.stoppedEvent == nil {\n                self.stoppedEvent = event\n                self.stopped = true\n                let observers = self.observers\n                self.observers.removeAll()\n                return observers\n            }\n\n            return Observers()\n        }\n    }\n    \n    /**\n    Subscribes an observer to the subject.\n    \n    - parameter observer: Observer to subscribe to the subject.\n    - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    */\n    public override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked { self.synchronized_subscribe(observer) }\n    }\n\n    func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if let stoppedEvent = self.stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        \n        if self.isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n        \n        let key = self.observers.insert(observer.on)\n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        self.lock.performLocked { self.synchronized_unsubscribe(disposeKey) }\n    }\n\n    func synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        _ = self.observers.removeKey(disposeKey)\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> PublishSubject<Element> {\n        self\n    }\n    \n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n        self.lock.performLocked { self.synchronized_dispose() }\n    }\n\n    final func synchronized_dispose() {\n        self.disposed = true\n        self.observers.removeAll()\n        self.stoppedEvent = nil\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift",
    "content": "//\n//  ReplaySubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\n///\n/// Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\npublic class ReplaySubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , Disposable {\n    public typealias SubjectObserverType = ReplaySubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        self.lock.performLocked { self.observers.count > 0 }\n    }\n    \n    fileprivate let lock = RecursiveLock()\n    \n    // state\n    fileprivate var isDisposed = false\n    fileprivate var stopped = false\n    fileprivate var stoppedEvent = nil as Event<Element>? {\n        didSet {\n            self.stopped = self.stoppedEvent != nil\n        }\n    }\n    fileprivate var observers = Observers()\n\n    #if DEBUG\n        fileprivate let synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    func unsubscribe(_ key: DisposeKey) {\n        rxAbstractMethod()\n    }\n\n    final var isStopped: Bool {\n        self.stopped\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<Element>) {\n        rxAbstractMethod()\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> ReplaySubject<Element> {\n        self\n    }\n    \n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n    }\n\n    /// Creates new instance of `ReplaySubject` that replays at most `bufferSize` last elements of sequence.\n    ///\n    /// - parameter bufferSize: Maximal number of elements to replay to observer after subscription.\n    /// - returns: New instance of replay subject.\n    public static func create(bufferSize: Int) -> ReplaySubject<Element> {\n        if bufferSize == 1 {\n            return ReplayOne()\n        }\n        else {\n            return ReplayMany(bufferSize: bufferSize)\n        }\n    }\n\n    /// Creates a new instance of `ReplaySubject` that buffers all the elements of a sequence.\n    /// To avoid filling up memory, developer needs to make sure that the use case will only ever store a 'reasonable'\n    /// number of elements.\n    public static func createUnbounded() -> ReplaySubject<Element> {\n        ReplayAll()\n    }\n\n    #if TRACE_RESOURCES\n        override init() {\n            _ = Resources.incrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\nprivate class ReplayBufferBase<Element>\n    : ReplaySubject<Element>\n    , SynchronizedUnsubscribeType {\n    \n    func trim() {\n        rxAbstractMethod()\n    }\n    \n    func addValueToBuffer(_ value: Element) {\n        rxAbstractMethod()\n    }\n    \n    func replayBuffer<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {\n        rxAbstractMethod()\n    }\n    \n    override func on(_ event: Event<Element>) {\n        #if DEBUG\n            self.synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { self.synchronizationTracker.unregister() }\n        #endif\n        dispatch(self.synchronized_on(event), event)\n    }\n\n    func synchronized_on(_ event: Event<Element>) -> Observers {\n        self.lock.lock(); defer { self.lock.unlock() }\n        if self.isDisposed {\n            return Observers()\n        }\n        \n        if self.isStopped {\n            return Observers()\n        }\n        \n        switch event {\n        case .next(let element):\n            self.addValueToBuffer(element)\n            self.trim()\n            return self.observers\n        case .error, .completed:\n            self.stoppedEvent = event\n            self.trim()\n            let observers = self.observers\n            self.observers.removeAll()\n            return observers\n        }\n    }\n    \n    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        self.lock.performLocked { self.synchronized_subscribe(observer) }\n    }\n\n    func synchronized_subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {\n        if self.isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n     \n        let anyObserver = observer.asObserver()\n        \n        self.replayBuffer(anyObserver)\n        if let stoppedEvent = self.stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        else {\n            let key = self.observers.insert(observer.on)\n            return SubscriptionDisposable(owner: self, key: key)\n        }\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        self.lock.performLocked { self.synchronized_unsubscribe(disposeKey) }\n    }\n\n    func synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        if self.isDisposed {\n            return\n        }\n        \n        _ = self.observers.removeKey(disposeKey)\n    }\n    \n    override func dispose() {\n        super.dispose()\n\n        self.synchronizedDispose()\n    }\n\n    func synchronizedDispose() {\n        self.lock.performLocked { self.synchronized_dispose() }\n    }\n\n    func synchronized_dispose() {\n        self.isDisposed = true\n        self.observers.removeAll()\n    }\n}\n\nprivate final class ReplayOne<Element> : ReplayBufferBase<Element> {\n    private var value: Element?\n    \n    override init() {\n        super.init()\n    }\n    \n    override func trim() {\n        \n    }\n    \n    override func addValueToBuffer(_ value: Element) {\n        self.value = value\n    }\n\n    override func replayBuffer<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {\n        if let value = self.value {\n            observer.on(.next(value))\n        }\n    }\n\n    override func synchronized_dispose() {\n        super.synchronized_dispose()\n        self.value = nil\n    }\n}\n\nprivate class ReplayManyBase<Element>: ReplayBufferBase<Element> {\n    fileprivate var queue: Queue<Element>\n    \n    init(queueSize: Int) {\n        self.queue = Queue(capacity: queueSize + 1)\n    }\n    \n    override func addValueToBuffer(_ value: Element) {\n        self.queue.enqueue(value)\n    }\n\n    override func replayBuffer<Observer: ObserverType>(_ observer: Observer) where Observer.Element == Element {\n        for item in self.queue {\n            observer.on(.next(item))\n        }\n    }\n\n    override func synchronized_dispose() {\n        super.synchronized_dispose()\n        self.queue = Queue(capacity: 0)\n    }\n}\n\nprivate final class ReplayMany<Element> : ReplayManyBase<Element> {\n    private let bufferSize: Int\n    \n    init(bufferSize: Int) {\n        self.bufferSize = bufferSize\n        \n        super.init(queueSize: bufferSize)\n    }\n    \n    override func trim() {\n        while self.queue.count > self.bufferSize {\n            _ = self.queue.dequeue()\n        }\n    }\n}\n\nprivate final class ReplayAll<Element> : ReplayManyBase<Element> {\n    init() {\n        super.init(queueSize: 0)\n    }\n    \n    override func trim() {\n        \n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/SubjectType.swift",
    "content": "//\n//  SubjectType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\npublic protocol SubjectType : ObservableType {\n    /// The type of the observer that represents this subject.\n    ///\n    /// Usually this type is type of subject itself, but it doesn't have to be.\n    associatedtype Observer: ObserverType\n\n    /// Returns observer interface for subject.\n    ///\n    /// - returns: Observer interface for subject.\n    func asObserver() -> Observer\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift",
    "content": "//\n//  SwiftSupport.swift\n//  RxSwift\n//\n//  Created by Volodymyr  Gorbenko on 3/6/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\ntypealias IntMax = Int64\npublic typealias RxAbstractInteger = FixedWidthInteger\n\nextension SignedInteger {\n    func toIntMax() -> IntMax {\n        IntMax(self)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/Infallible+CombineLatest+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  Infallible+CombineLatest+arity.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\n// MARK: - Combine Latest\n\n// 2\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType>\n        (_ source1: I1, _ source2: I2, resultSelector: @escaping (I1.Element, I2.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 3\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, resultSelector: @escaping (I1.Element, I2.Element, I3.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 4\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType, I4: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, _ source4: I4, resultSelector: @escaping (I1.Element, I2.Element, I3.Element, I4.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 5\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType, I4: InfallibleType, I5: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, _ source4: I4, _ source5: I5, resultSelector: @escaping (I1.Element, I2.Element, I3.Element, I4.Element, I5.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 6\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType, I4: InfallibleType, I5: InfallibleType, I6: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, _ source4: I4, _ source5: I5, _ source6: I6, resultSelector: @escaping (I1.Element, I2.Element, I3.Element, I4.Element, I5.Element, I6.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 7\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType, I4: InfallibleType, I5: InfallibleType, I6: InfallibleType, I7: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, _ source4: I4, _ source5: I5, _ source6: I6, _ source7: I7, resultSelector: @escaping (I1.Element, I2.Element, I3.Element, I4.Element, I5.Element, I6.Element, I7.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n// 8\nextension Infallible {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<I1: InfallibleType, I2: InfallibleType, I3: InfallibleType, I4: InfallibleType, I5: InfallibleType, I6: InfallibleType, I7: InfallibleType, I8: InfallibleType>\n        (_ source1: I1, _ source2: I2, _ source3: I3, _ source4: I4, _ source5: I5, _ source6: I6, _ source7: I7, _ source8: I8, resultSelector: @escaping (I1.Element, I2.Element, I3.Element, I4.Element, I5.Element, I6.Element, I7.Element, I8.Element) throws -> Element)\n            -> Infallible<Element> {\n        Infallible(CombineLatest8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: resultSelector\n        ))\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/Infallible+Create.swift",
    "content": "//\n//  Infallible+Create.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic enum InfallibleEvent<Element> {\n    /// Next element is produced.\n    case next(Element)\n\n    /// Sequence completed successfully.\n    case completed\n}\n\nextension Infallible {\n    public typealias InfallibleObserver = (InfallibleEvent<Element>) -> Void\n\n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n\n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n\n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping InfallibleObserver) -> Disposable) -> Infallible<Element> {\n        let source = Observable<Element>.create { observer in\n            subscribe { event in\n                switch event {\n                case .next(let element):\n                    observer.onNext(element)\n                case .completed:\n                    observer.onCompleted()\n                }\n            }\n        }\n\n        return Infallible(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/Infallible+Operators.swift",
    "content": "//\n//  Infallible+Operators.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\n// MARK: - Static allocation\nextension InfallibleType {\n    /**\n     Returns an infallible sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting infallible sequence.\n\n     - returns: An infallible sequence containing the single specified element.\n     */\n    public static func just(_ element: Element) -> Infallible<Element> {\n        Infallible(.just(element))\n    }\n\n    /**\n     Returns an infallible sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting infallible sequence.\n     - parameter scheduler: Scheduler to send the single element on.\n     - returns: An infallible sequence containing the single specified element.\n     */\n    public static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> Infallible<Element> {\n        Infallible(.just(element, scheduler: scheduler))\n    }\n\n    /**\n     Returns a non-terminating infallible sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An infallible sequence whose observers will never get called.\n     */\n    public static func never() -> Infallible<Element> {\n        Infallible(.never())\n    }\n\n    /**\n     Returns an empty infallible sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An infallible sequence with no elements.\n     */\n    public static func empty() -> Infallible<Element> {\n        Infallible(.empty())\n    }\n\n    /**\n     Returns an infallible sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () throws -> Infallible<Element>)\n        -> Infallible<Element> {\n        Infallible(.deferred { try observableFactory().asObservable() })\n    }\n}\n\n// MARK: From & Of\n\nextension Infallible {\n    /**\n     This method creates a new Infallible instance with a variable number of elements.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter elements: Elements to generate.\n     - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediately on subscription.\n     - returns: The Infallible sequence whose elements are pulled from the given arguments.\n     */\n    public static func of(_ elements: Element ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Infallible<Element> {\n        Infallible(Observable.from(elements, scheduler: scheduler))\n    }\n}\n\nextension Infallible {\n    /**\n     Converts an array to an Infallible sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The Infallible sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from(_ array: [Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Infallible<Element> {\n        Infallible(Observable.from(array, scheduler: scheduler))\n    }\n\n    /**\n     Converts a sequence to an Infallible sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The Infallible sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from<Sequence: Swift.Sequence>(_ sequence: Sequence, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Infallible<Element> where Sequence.Element == Element {\n        Infallible(Observable.from(sequence, scheduler: scheduler))\n    }\n}\n\n// MARK: - Filter\nextension InfallibleType {\n    /**\n     Filters the elements of an observable sequence based on a predicate.\n\n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n\n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (Element) -> Bool)\n        -> Infallible<Element> {\n        Infallible(asObservable().filter(predicate))\n    }\n}\n\n// MARK: - Map\nextension InfallibleType {\n    /**\n     Projects each element of an observable sequence into a new form.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n\n     */\n    public func map<Result>(_ transform: @escaping (Element) -> Result)\n        -> Infallible<Result> {\n        Infallible(asObservable().map(transform))\n    }\n\n    /**\n     Projects each element of an observable sequence into an optional form and filters all optional results.\n\n     - parameter transform: A transform function to apply to each source element and which returns an element or nil.\n     - returns: An observable sequence whose elements are the result of filtering the transform function for each element of the source.\n\n     */\n    public func compactMap<Result>(_ transform: @escaping (Element) -> Result?)\n        -> Infallible<Result> {\n        Infallible(asObservable().compactMap(transform))\n    }\n}\n\n// MARK: - Distinct\n\nextension InfallibleType where Element: Comparable {\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to equality operator.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.\n     */\n    public func distinctUntilChanged()\n        -> Infallible<Element> {\n        Infallible(asObservable().distinctUntilChanged())\n    }\n}\n\nextension InfallibleType {\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n     */\n    public func distinctUntilChanged<Key: Equatable>(_ keySelector: @escaping (Element) throws -> Key)\n        -> Infallible<Element> {\n        Infallible(self.asObservable().distinctUntilChanged(keySelector, comparer: { $0 == $1 }))\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.\n     */\n    public func distinctUntilChanged(_ comparer: @escaping (Element, Element) throws -> Bool)\n        -> Infallible<Element> {\n        Infallible(self.asObservable().distinctUntilChanged({ $0 }, comparer: comparer))\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.\n     */\n    public func distinctUntilChanged<K>(_ keySelector: @escaping (Element) throws -> K, comparer: @escaping (K, K) throws -> Bool)\n        -> Infallible<Element> {\n        Infallible(asObservable().distinctUntilChanged(keySelector, comparer: comparer))\n    }\n\n    /**\n    Returns an observable sequence that contains only contiguous elements with distinct values in the provided key path on each object.\n\n    - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n    - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator on the provided key path\n    */\n    public func distinctUntilChanged<Property: Equatable>(at keyPath: KeyPath<Element, Property>) ->\n        Infallible<Element> {\n        Infallible(asObservable().distinctUntilChanged { $0[keyPath: keyPath] == $1[keyPath: keyPath] })\n    }\n}\n\n// MARK: - Throttle\nextension InfallibleType {\n    /**\n     Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Infallible<Element> {\n        Infallible(asObservable().debounce(dueTime, scheduler: scheduler))\n    }\n\n    /**\n     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.\n\n     This operator makes sure that no two elements are emitted in less then dueTime.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)\n        -> Infallible<Element> {\n        Infallible(asObservable().throttle(dueTime, latest: latest, scheduler: scheduler))\n    }\n}\n\n// MARK: - FlatMap\nextension InfallibleType {\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) -> Source)\n        -> Infallible<Source.Element> {\n        Infallible(asObservable().flatMap(selector))\n    }\n\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<Source: ObservableConvertibleType>(_ selector: @escaping (Element) -> Source)\n        -> Infallible<Source.Element> {\n        Infallible(asObservable().flatMapLatest(selector))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     If element is received while there is some projected observable sequence being merged it will simply be ignored.\n\n     - seealso: [flatMapFirst operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.\n     */\n    public func flatMapFirst<Source: ObservableConvertibleType>(_ selector: @escaping (Element) -> Source)\n        -> Infallible<Source.Element> {\n        Infallible(asObservable().flatMapFirst(selector))\n    }\n}\n\n// MARK: - Concat\nextension InfallibleType {\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func concat<Source: ObservableConvertibleType>(_ second: Source) -> Infallible<Element> where Source.Element == Element {\n        Infallible(Observable.concat([self.asObservable(), second.asObservable()]))\n    }\n\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Infallible<Element>\n        where Sequence.Element == Infallible<Element> {\n        Infallible(Observable.concat(sequence.map { $0.asObservable() }))\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Collection: Swift.Collection>(_ collection: Collection) -> Infallible<Element>\n        where Collection.Element == Infallible<Element> {\n        Infallible(Observable.concat(collection.map { $0.asObservable() }))\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat(_ sources: Infallible<Element> ...) -> Infallible<Element> {\n        Infallible(Observable.concat(sources.map { $0.asObservable() }))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and concatenates the resulting observable sequences into one observable sequence.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n     */\n    public func concatMap<Source: ObservableConvertibleType>(_ selector: @escaping (Element) -> Source)\n        -> Infallible<Source.Element> {\n        Infallible(asObservable().concatMap(selector))\n    }\n}\n\n// MARK: - Merge\nextension InfallibleType {\n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<Collection: Swift.Collection>(_ sources: Collection) -> Infallible<Element> where Collection.Element == Infallible<Element> {\n        Infallible(Observable.concat(sources.map { $0.asObservable() }))\n    }\n\n    /**\n     Merges elements from all infallible sequences from array into a single infallible sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Array of infallible sequences to merge.\n     - returns: The infallible sequence that merges the elements of the infallible sequences.\n     */\n    public static func merge(_ sources: [Infallible<Element>]) -> Infallible<Element> {\n        Infallible(Observable.merge(sources.map { $0.asObservable() }))\n    }\n\n    /**\n     Merges elements from all infallible sequences into a single infallible sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of infallible sequences to merge.\n     - returns: The infallible sequence that merges the elements of the infallible sequences.\n     */\n    public static func merge(_ sources: Infallible<Element>...) -> Infallible<Element> {\n        Infallible(Observable.merge(sources.map { $0.asObservable() }))\n    }\n}\n\n// MARK: - Do\n\nextension Infallible {\n    /**\n     Invokes an action for each event in the infallible sequence, and propagates all observer messages through the result sequence.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter afterNext: Action to invoke for each element after the observable has passed an onNext event along to its downstream.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter afterCompleted: Action to invoke after graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((Element) throws -> Void)? = nil, afterNext: ((Element) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, afterCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> Void)? = nil, onSubscribed: (() -> Void)? = nil, onDispose: (() -> Void)? = nil) -> Infallible<Element> {\n        Infallible(asObservable().do(onNext: onNext, afterNext: afterNext, onCompleted: onCompleted, afterCompleted: afterCompleted, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose))\n    }\n}\n\n// MARK: - Scan\nextension InfallibleType {\n    /**\n     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n\n     For aggregation behavior with no intermediate results, see `reduce`.\n\n     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)\n\n     - parameter seed: The initial accumulator value.\n     - parameter accumulator: An accumulator function to be invoked on each element.\n     - returns: An observable sequence containing the accumulated values.\n     */\n    public func scan<Seed>(into seed: Seed, accumulator: @escaping (inout Seed, Element) -> Void)\n        -> Infallible<Seed> {\n        Infallible(asObservable().scan(into: seed, accumulator: accumulator))\n    }\n\n    /**\n     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n\n     For aggregation behavior with no intermediate results, see `reduce`.\n\n     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)\n\n     - parameter seed: The initial accumulator value.\n     - parameter accumulator: An accumulator function to be invoked on each element.\n     - returns: An observable sequence containing the accumulated values.\n     */\n    public func scan<Seed>(_ seed: Seed, accumulator: @escaping (Seed, Element) -> Seed)\n        -> Infallible<Seed> {\n        Infallible(asObservable().scan(seed, accumulator: accumulator))\n    }\n}\n\n// MARK: - Start with\n\nextension InfallibleType {\n    /**\n    Prepends a value to an observable sequence.\n\n    - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)\n\n    - parameter element: Element to prepend to the specified sequence.\n    - returns: The source sequence prepended with the specified values.\n    */\n    public func startWith(_ element: Element) -> Infallible<Element> {\n        Infallible(asObservable().startWith(element))\n    }\n}\n\n\n\n// MARK: - Take and Skip {\nextension InfallibleType {\n    /**\n     Returns the elements from the source observable sequence until the other observable sequence produces an element.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n     */\n    public func take<Source: InfallibleType>(until other: Source)\n        -> Infallible<Element> {\n        Infallible(asObservable().take(until: other.asObservable()))\n    }\n\n    /**\n     Returns the elements from the source observable sequence until the other observable sequence produces an element.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n     */\n    public func take<Source: ObservableType>(until other: Source)\n        -> Infallible<Element> {\n        Infallible(asObservable().take(until: other))\n    }\n\n    /**\n     Returns elements from an observable sequence until the specified condition is true.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - parameter behavior: Whether or not to include the last element matching the predicate. Defaults to `exclusive`.\n\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test passes.\n     */\n    public func take(until predicate: @escaping (Element) throws -> Bool,\n                     behavior: TakeBehavior = .exclusive)\n        -> Infallible<Element> {\n        Infallible(asObservable().take(until: predicate, behavior: behavior))\n    }\n\n    /**\n     Returns elements from an observable sequence as long as a specified condition is true.\n\n     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n     */\n    public func take(while predicate: @escaping (Element) throws -> Bool,\n                     behavior: TakeBehavior = .exclusive)\n        -> Infallible<Element> {\n        Infallible(asObservable().take(while: predicate, behavior: behavior))\n    }\n\n    /**\n     Returns a specified number of contiguous elements from the start of an observable sequence.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter count: The number of elements to return.\n     - returns: An observable sequence that contains the specified number of elements from the start of the input sequence.\n     */\n    public func take(_ count: Int) -> Infallible<Element> {\n        Infallible(asObservable().take(count))\n    }\n\n    /**\n     Takes elements for the specified duration from the start of the infallible source sequence, using the specified scheduler to run timers.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter duration: Duration for taking elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An infallible sequence with the elements taken during the specified duration from the start of the source sequence.\n     */\n    public func take(for duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Infallible<Element> {\n        Infallible(asObservable().take(for: duration, scheduler: scheduler))\n    }\n\n    /**\n     Bypasses elements in an infallible sequence as long as a specified condition is true and then returns the remaining elements.\n\n     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An infallible sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n     */\n    public func skip(while predicate: @escaping (Element) throws -> Bool) -> Infallible<Element> {\n        Infallible(asObservable().skip(while: predicate))\n    }\n\n    /**\n     Returns the elements from the source infallible sequence that are emitted after the other infallible sequence produces an element.\n\n     - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)\n\n     - parameter other: Infallible sequence that starts propagation of elements of the source sequence.\n     - returns: An infallible sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.\n     */\n    public func skip<Source: ObservableType>(until other: Source)\n        -> Infallible<Element> {\n        Infallible(asObservable().skip(until: other))\n    }\n}\n\n// MARK: - Share\nextension InfallibleType {\n    /**\n     Returns an observable sequence that **shares a single subscription to the underlying sequence**, and immediately upon subscription replays  elements in buffer.\n\n     This operator is equivalent to:\n     * `.whileConnected`\n     ```\n     // Each connection will have it's own subject instance to store replay events.\n     // Connections will be isolated from each another.\n     source.multicast(makeSubject: { Replay.create(bufferSize: replay) }).refCount()\n     ```\n     * `.forever`\n     ```\n     // One subject will store replay events for all connections to source.\n     // Connections won't be isolated from each another.\n     source.multicast(Replay.create(bufferSize: replay)).refCount()\n     ```\n\n     It uses optimized versions of the operators for most common operations.\n\n     - parameter replay: Maximum element count of the replay buffer.\n     - parameter scope: Lifetime scope of sharing subject. For more information see `SubjectLifetimeScope` enum.\n\n     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n     */\n    public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected)\n        -> Infallible<Element> {\n        Infallible(asObservable().share(replay: replay, scope: scope))\n    }\n}\n\n// MARK: - withUnretained\nextension InfallibleType {\n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - parameter resultSelector: A function to combine the unretained referenced on `obj` and the value of the observable sequence.\n     - returns: An observable sequence that contains the result of `resultSelector` being called with an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject, Out>(\n        _ obj: Object,\n        resultSelector: @escaping (Object, Element) -> Out\n    ) -> Infallible<Out> {\n        Infallible(self.asObservable().withUnretained(obj, resultSelector: resultSelector))\n    }\n    \n    /**\n     Provides an unretained, safe to use (i.e. not implicitly unwrapped), reference to an object along with the events emitted by the sequence.\n     \n     In the case the provided object cannot be retained successfully, the seqeunce will complete.\n     \n     - note: Be careful when using this operator in a sequence that has a buffer or replay, for example `share(replay: 1)`, as the sharing buffer will also include the provided object, which could potentially cause a retain cycle.\n     \n     - parameter obj: The object to provide an unretained reference on.\n     - returns: An observable sequence of tuples that contains both an unretained reference on `obj` and the values of the original sequence.\n     */\n    public func withUnretained<Object: AnyObject>(_ obj: Object) -> Infallible<(Object, Element)> {\n        withUnretained(obj) { ($0, $1) }\n    }\n}\n\nextension InfallibleType {\n    // MARK: - withLatestFrom\n    /**\n     Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n     - note: Elements emitted by self before the second source has emitted any values will be omitted.\n\n     - parameter second: Second observable source.\n     - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<Source: InfallibleType, ResultType>(_ second: Source, resultSelector: @escaping (Element, Source.Element) throws -> ResultType) -> Infallible<ResultType> {\n        Infallible(self.asObservable().withLatestFrom(second.asObservable(), resultSelector: resultSelector))\n    }\n\n    /**\n     Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n     - note: Elements emitted by self before the second source has emitted any values will be omitted.\n\n     - parameter second: Second observable source.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<Source: InfallibleType>(_ second: Source) -> Infallible<Source.Element> {\n        withLatestFrom(second) { $1 }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/Infallible+Zip+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  Infallible+Zip+arity.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/8/20.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n// MARK: - Zip\n\n\n// 2\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, resultSelector: @escaping (E1, E2) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 3\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, resultSelector: @escaping (E1, E2, E3) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 4\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, _ source4: Infallible<E4>, resultSelector: @escaping (E1, E2, E3, E4) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 5\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, _ source4: Infallible<E4>, _ source5: Infallible<E5>, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 6\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, _ source4: Infallible<E4>, _ source5: Infallible<E5>, _ source6: Infallible<E6>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 7\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, _ source4: Infallible<E4>, _ source5: Infallible<E5>, _ source6: Infallible<E6>, _ source7: Infallible<E7>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n// 8\nextension InfallibleType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: Infallible<E1>, _ source2: Infallible<E2>, _ source3: Infallible<E3>, _ source4: Infallible<E4>, _ source5: Infallible<E5>, _ source6: Infallible<E6>, _ source7: Infallible<E7>, _ source8: Infallible<E8>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> Element)\n        -> Infallible<Element> {\n        Infallible(\n            Observable.zip(source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(), resultSelector: resultSelector)\n        )\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/Infallible.swift",
    "content": "//\n//  Infallible.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\n/// `Infallible` is an `Observable`-like push-style interface\n/// which is guaranteed to not emit error events.\n///\n/// Unlike `SharedSequence`, it does not share its resources or\n/// replay its events, but acts as a standard `Observable`.\npublic protocol InfallibleType: ObservableConvertibleType {}\n\n/// `Infallible` is an `Observable`-like push-style interface\n/// which is guaranteed to not emit error events.\n///\n/// Unlike `SharedSequence`, it does not share its resources or\n/// replay its events, but acts as a standard `Observable`.\npublic struct Infallible<Element>: InfallibleType {\n    private let source: Observable<Element>\n\n    init(_ source: Observable<Element>) {\n        self.source = source\n    }\n\n    public func asObservable() -> Observable<Element> { source }\n}\n\nextension InfallibleType {\n    /**\n     Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n     \n     Error callback is not exposed because `Infallible` can't error out.\n     \n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe<Object: AnyObject>(\n        with object: Object,\n        onNext: ((Object, Element) -> Void)? = nil,\n        onCompleted: ((Object) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        self.asObservable().subscribe(\n            with: object,\n            onNext: onNext,\n            onCompleted: onCompleted,\n            onDisposed: onDisposed\n        )\n    }\n    \n    /**\n     Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n     \n     Error callback is not exposed because `Infallible` can't error out.\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func subscribe(onNext: ((Element) -> Void)? = nil,\n                          onCompleted: (() -> Void)? = nil,\n                          onDisposed: (() -> Void)? = nil) -> Disposable {\n        self.asObservable().subscribe(onNext: onNext,\n                                      onCompleted: onCompleted,\n                                      onDisposed: onDisposed)\n    }\n\n    /**\n     Subscribes an event handler to an observable sequence.\n     \n     - parameter on: Action to invoke for each event in the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(_ on: @escaping (Event<Element>) -> Void) -> Disposable {\n        self.asObservable().subscribe(on)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift",
    "content": "//\n//  ObservableConvertibleType+Infallible.swift\n//  RxSwift\n//\n//  Created by Shai Mishali on 27/08/2020.\n//  Copyright © 2020 Krunoslav Zaher. All rights reserved.\n//\n\npublic extension ObservableConvertibleType {\n    /// Convert to an `Infallible`\n    ///\n    /// - returns: `Infallible<Element>`\n    func asInfallible(onErrorJustReturn element: Element) -> Infallible<Element> {\n        Infallible(self.asObservable().catchAndReturn(element))\n    }\n\n    /// Convert to an `Infallible`\n    ///\n    /// - parameter onErroFallbackTo: Fall back to this provided infallible on error\n    ///\n    ///\n    /// - returns: `Infallible<Element>`\n    func asInfallible(onErrorFallbackTo infallible: Infallible<Element>) -> Infallible<Element> {\n        Infallible(self.asObservable().catch { _ in infallible.asObservable() })\n    }\n\n    /// Convert to an `Infallible`\n    ///\n    /// - parameter onErrorRecover: Recover with the this infallible closure\n    ///\n    /// - returns: `Infallible<Element>`\n    func asInfallible(onErrorRecover: @escaping (Swift.Error) -> Infallible<Element>) -> Infallible<Element> {\n        Infallible(asObservable().catch { onErrorRecover($0).asObservable() })\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/Completable+AndThen.swift",
    "content": "//\n//  Completable+AndThen.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/2/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension PrimitiveSequenceType where Trait == CompletableTrait, Element == Never {\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<Element>(_ second: Single<Element>) -> Single<Element> {\n        let completable = self.primitiveSequence.asObservable()\n        return Single(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<Element>(_ second: Maybe<Element>) -> Maybe<Element> {\n        let completable = self.primitiveSequence.asObservable()\n        return Maybe(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen(_ second: Completable) -> Completable {\n        let completable = self.primitiveSequence.asObservable()\n        return Completable(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<Element>(_ second: Observable<Element>) -> Observable<Element> {\n        let completable = self.primitiveSequence.asObservable()\n        return ConcatCompletable(completable: completable, second: second.asObservable())\n    }\n}\n\nfinal private class ConcatCompletable<Element>: Producer<Element> {\n    fileprivate let completable: Observable<Never>\n    fileprivate let second: Observable<Element>\n\n    init(completable: Observable<Never>, second: Observable<Element>) {\n        self.completable = completable\n        self.second = second\n    }\n\n    override func run<Observer: ObserverType>(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {\n        let sink = ConcatCompletableSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal private class ConcatCompletableSink<Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType {\n    typealias Element = Never\n    typealias Parent = ConcatCompletable<Observer.Element>\n\n    private let parent: Parent\n    private let subscription = SerialDisposable()\n    \n    init(parent: Parent, observer: Observer, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .next:\n            break\n        case .completed:\n            let otherSink = ConcatCompletableSinkOther(parent: self)\n            self.subscription.disposable = self.parent.second.subscribe(otherSink)\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription = SingleAssignmentDisposable()\n        self.subscription.disposable = subscription\n        subscription.setDisposable(self.parent.completable.subscribe(self))\n        return self.subscription\n    }\n}\n\nfinal private class ConcatCompletableSinkOther<Observer: ObserverType>\n    : ObserverType {\n    typealias Element = Observer.Element \n\n    typealias Parent = ConcatCompletableSink<Observer>\n    \n    private let parent: Parent\n\n    init(parent: Parent) {\n        self.parent = parent\n    }\n\n    func on(_ event: Event<Observer.Element>) {\n        self.parent.forwardOn(event)\n        if event.isStopEvent {\n            self.parent.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/Completable.swift",
    "content": "//\n//  Completable.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if DEBUG\nimport Foundation\n#endif\n\n/// Sequence containing 0 elements\npublic enum CompletableTrait { }\n/// Represents a push style sequence containing 0 elements.\npublic typealias Completable = PrimitiveSequence<CompletableTrait, Swift.Never>\n\n@frozen public enum CompletableEvent {\n    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)\n    case error(Swift.Error)\n    \n    /// Sequence completed successfully.\n    case completed\n}\n\nextension PrimitiveSequenceType where Trait == CompletableTrait, Element == Swift.Never {\n    public typealias CompletableObserver = (CompletableEvent) -> Void\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping CompletableObserver) -> Disposable) -> PrimitiveSequence<Trait, Element> {\n        let source = Observable<Element>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .error(let error):\n                    observer.on(.error(error))\n                case .completed:\n                    observer.on(.completed)\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (CompletableEvent) -> Void) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next:\n                rxFatalError(\"Completables can't emit values\")\n            case .error(let error):\n                observer(.error(error))\n            case .completed:\n                observer(.completed)\n            }\n        }\n    }\n    \n    /**\n     Subscribes a completion handler and an error handler for this sequence.\n     \n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe<Object: AnyObject>(\n        with object: Object,\n        onCompleted: ((Object) -> Void)? = nil,\n        onError: ((Object, Swift.Error) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        subscribe(\n            onCompleted: { [weak object] in\n                guard let object = object else { return }\n                onCompleted?(object)\n            }, onError: { [weak object] in\n                guard let object = object else { return }\n                onError?(object, $0)\n            }, onDisposed: { [weak object] in\n                guard let object = object else { return }\n                onDisposed?(object)\n            }\n        )\n    }\n    \n    /**\n     Subscribes a completion handler and an error handler for this sequence.\n     \n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onCompleted: (() -> Void)? = nil,\n                          onError: ((Swift.Error) -> Void)? = nil,\n                          onDisposed: (() -> Void)? = nil) -> Disposable {\n        #if DEBUG\n                let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []\n        #else\n                let callStack = [String]()\n        #endif\n\n        let disposable: Disposable\n        if let onDisposed = onDisposed {\n            disposable = Disposables.create(with: onDisposed)\n        } else {\n            disposable = Disposables.create()\n        }\n\n        let observer: CompletableObserver = { event in\n            switch event {\n            case .error(let error):\n                if let onError = onError {\n                    onError(error)\n                } else {\n                    Hooks.defaultErrorHandler(callStack, error)\n                }\n                disposable.dispose()\n            case .completed:\n                onCompleted?()\n                disposable.dispose()\n            }\n        }\n\n        return Disposables.create(\n            self.primitiveSequence.subscribe(observer),\n            disposable\n        )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == CompletableTrait, Element == Swift.Never {\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Completable {\n        PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Completable {\n        PrimitiveSequence(raw: Observable.never())\n    }\n\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Completable {\n        Completable(raw: Observable.empty())\n    }\n\n}\n\nextension PrimitiveSequenceType where Trait == CompletableTrait, Element == Swift.Never {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n     \n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter afterError: Action to invoke after errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter afterCompleted: Action to invoke after graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onError: ((Swift.Error) throws -> Void)? = nil,\n                     afterError: ((Swift.Error) throws -> Void)? = nil,\n                     onCompleted: (() throws -> Void)? = nil,\n                     afterCompleted: (() throws -> Void)? = nil,\n                     onSubscribe: (() -> Void)? = nil,\n                     onSubscribed: (() -> Void)? = nil,\n                     onDispose: (() -> Void)? = nil)\n        -> Completable {\n            return Completable(raw: self.primitiveSequence.source.do(\n                onError: onError,\n                afterError: afterError,\n                onCompleted: onCompleted,\n                afterCompleted: afterCompleted,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n\n\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func concat(_ second: Completable) -> Completable {\n        Completable.concat(self.primitiveSequence, second)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Sequence: Swift.Sequence>(_ sequence: Sequence) -> Completable\n        where Sequence.Element == Completable {\n            let source = Observable.concat(sequence.lazy.map { $0.asObservable() })\n            return Completable(raw: source)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<Collection: Swift.Collection>(_ collection: Collection) -> Completable\n        where Collection.Element == Completable {\n            let source = Observable.concat(collection.map { $0.asObservable() })\n            return Completable(raw: source)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat(_ sources: Completable ...) -> Completable {\n        let source = Observable.concat(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n\n    /**\n     Merges the completion of all Completables from a collection into a single Completable.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     - note: For `Completable`, `zip` is an alias for `merge`.\n\n     - parameter sources: Collection of Completables to merge.\n     - returns: A Completable that merges the completion of all Completables.\n     */\n    public static func zip<Collection: Swift.Collection>(_ sources: Collection) -> Completable\n           where Collection.Element == Completable {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n\n    /**\n     Merges the completion of all Completables from an array into a single Completable.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     - note: For `Completable`, `zip` is an alias for `merge`.\n\n     - parameter sources: Array of observable sequences to merge.\n     - returns: A Completable that merges the completion of all Completables.\n     */\n    public static func zip(_ sources: [Completable]) -> Completable {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n\n    /**\n     Merges the completion of all Completables into a single Completable.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     - note: For `Completable`, `zip` is an alias for `merge`.\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func zip(_ sources: Completable...) -> Completable {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/Maybe.swift",
    "content": "//\n//  Maybe.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if DEBUG\nimport Foundation\n#endif\n\n/// Sequence containing 0 or 1 elements\npublic enum MaybeTrait { }\n/// Represents a push style sequence containing 0 or 1 element.\npublic typealias Maybe<Element> = PrimitiveSequence<MaybeTrait, Element>\n\n@frozen public enum MaybeEvent<Element> {\n    /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`)\n    case success(Element)\n    \n    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)\n    case error(Swift.Error)\n    \n    /// Sequence completed successfully.\n    case completed\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    public typealias MaybeObserver = (MaybeEvent<Element>) -> Void\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping MaybeObserver) -> Disposable) -> PrimitiveSequence<Trait, Element> {\n        let source = Observable<Element>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .success(let element):\n                    observer.on(.next(element))\n                    observer.on(.completed)\n                case .error(let error):\n                    observer.on(.error(error))\n                case .completed:\n                    observer.on(.completed)\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (MaybeEvent<Element>) -> Void) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next(let element):\n                observer(.success(element))\n            case .error(let error):\n                observer(.error(error))\n            case .completed:\n                observer(.completed)\n            }\n        }\n    }\n    \n    /**\n     Subscribes a success handler, an error handler, and a completion handler for this sequence.\n     \n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe<Object: AnyObject>(\n        with object: Object,\n        onSuccess: ((Object, Element) -> Void)? = nil,\n        onError: ((Object, Swift.Error) -> Void)? = nil,\n        onCompleted: ((Object) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        subscribe(\n            onSuccess: { [weak object] in\n                guard let object = object else { return }\n                onSuccess?(object, $0)\n            },\n            onError: { [weak object] in\n                guard let object = object else { return }\n                onError?(object, $0)\n            },\n            onCompleted: { [weak object] in\n                guard let object = object else { return }\n                onCompleted?(object)\n            },\n            onDisposed: { [weak object] in\n                guard let object = object else { return }\n                onDisposed?(object)\n            }\n        )\n    }\n    \n    /**\n     Subscribes a success handler, an error handler, and a completion handler for this sequence.\n     \n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onSuccess: ((Element) -> Void)? = nil,\n                          onError: ((Swift.Error) -> Void)? = nil,\n                          onCompleted: (() -> Void)? = nil,\n                          onDisposed: (() -> Void)? = nil) -> Disposable {\n        #if DEBUG\n            let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []\n        #else\n            let callStack = [String]()\n        #endif\n        let disposable: Disposable\n        if let onDisposed = onDisposed {\n            disposable = Disposables.create(with: onDisposed)\n        } else {\n            disposable = Disposables.create()\n        }\n\n        let observer: MaybeObserver = { event in\n            switch event {\n            case .success(let element):\n                onSuccess?(element)\n                disposable.dispose()\n            case .error(let error):\n                if let onError = onError {\n                    onError(error)\n                } else {\n                    Hooks.defaultErrorHandler(callStack, error)\n                }\n                disposable.dispose()\n            case .completed:\n                onCompleted?()\n                disposable.dispose()\n            }\n        }\n\n        return Disposables.create(\n            self.primitiveSequence.subscribe(observer),\n            disposable\n        )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element) -> Maybe<Element> {\n        Maybe(raw: Observable.just(element))\n    }\n    \n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - parameter scheduler: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> Maybe<Element> {\n        Maybe(raw: Observable.just(element, scheduler: scheduler))\n    }\n\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Maybe<Element> {\n        PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Maybe<Element> {\n        PrimitiveSequence(raw: Observable.never())\n    }\n\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Maybe<Element> {\n        Maybe(raw: Observable.empty())\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n     \n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter afterNext: Action to invoke for each element after the observable has passed an onNext event along to its downstream.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter afterError: Action to invoke after errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter afterCompleted: Action to invoke after graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((Element) throws -> Void)? = nil,\n                     afterNext: ((Element) throws -> Void)? = nil,\n                     onError: ((Swift.Error) throws -> Void)? = nil,\n                     afterError: ((Swift.Error) throws -> Void)? = nil,\n                     onCompleted: (() throws -> Void)? = nil,\n                     afterCompleted: (() throws -> Void)? = nil,\n                     onSubscribe: (() -> Void)? = nil,\n                     onSubscribed: (() -> Void)? = nil,\n                     onDispose: (() -> Void)? = nil)\n        -> Maybe<Element> {\n            return Maybe(raw: self.primitiveSequence.source.do(\n                onNext: onNext,\n                afterNext: afterNext,\n                onError: onError,\n                afterError: afterError,\n                onCompleted: onCompleted,\n                afterCompleted: afterCompleted,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n    \n    /**\n     Filters the elements of an observable sequence based on a predicate.\n     \n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n     \n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (Element) throws -> Bool)\n        -> Maybe<Element> {\n            return Maybe(raw: self.primitiveSequence.source.filter(predicate))\n    }\n    \n    /**\n     Projects each element of an observable sequence into a new form.\n     \n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n     \n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n     \n     */\n    public func map<Result>(_ transform: @escaping (Element) throws -> Result)\n        -> Maybe<Result> {\n            return Maybe(raw: self.primitiveSequence.source.map(transform))\n    }\n\n    /**\n     Projects each element of an observable sequence into an optional form and filters all optional results.\n     \n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of filtering the transform function for each element of the source.\n     \n     */\n    public func compactMap<Result>(_ transform: @escaping (Element) throws -> Result?)\n        -> Maybe<Result> {\n        Maybe(raw: self.primitiveSequence.source.compactMap(transform))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<Result>(_ selector: @escaping (Element) throws -> Maybe<Result>)\n        -> Maybe<Result> {\n            return Maybe<Result>(raw: self.primitiveSequence.source.flatMap(selector))\n    }\n\n    /**\n     Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter default: Default element to be sent if the source does not emit any elements\n     - returns: An observable sequence which emits default element end completes in case the original sequence is empty\n     */\n    public func ifEmpty(default: Element) -> Single<Element> {\n        Single(raw: self.primitiveSequence.source.ifEmpty(default: `default`))\n    }\n\n    /**\n     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter switchTo: Observable sequence being returned when source sequence is empty.\n     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.\n     */\n    public func ifEmpty(switchTo other: Maybe<Element>) -> Maybe<Element> {\n        Maybe(raw: self.primitiveSequence.source.ifEmpty(switchTo: other.primitiveSequence.source))\n    }\n\n    /**\n     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter switchTo: Observable sequence being returned when source sequence is empty.\n     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.\n     */\n    public func ifEmpty(switchTo other: Single<Element>) -> Single<Element> {\n        Single(raw: self.primitiveSequence.source.ifEmpty(switchTo: other.primitiveSequence.source))\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    public func catchAndReturn(_ element: Element)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.primitiveSequence.source.catchAndReturn(element))\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    @available(*, deprecated, renamed: \"catchAndReturn(_:)\")\n    public func catchErrorJustReturn(_ element: Element)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.primitiveSequence.source.catchAndReturn(element))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/ObservableType+PrimitiveSequence.swift",
    "content": "//\n//  ObservableType+PrimitiveSequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/17/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     The `asSingle` operator throws a `RxError.noElements` or `RxError.moreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element when the source Observable has completed, or throws an exception if more (or none) of them are emitted.\n     */\n    public func asSingle() -> Single<Element> {\n        PrimitiveSequence(raw: AsSingle(source: self.asObservable()))\n    }\n    \n    /**\n     The `first` operator emits only the very first item emitted by this Observable,\n     or nil if this Observable completes without emitting anything.\n     \n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n     \n     - returns: An observable sequence that emits a single element or nil if the source observable sequence completes without emitting any items.\n     */\n    public func first() -> Single<Element?> {\n        PrimitiveSequence(raw: First(source: self.asObservable()))\n    }\n\n    /**\n     The `asMaybe` operator throws a `RxError.moreThanOneElement`\n     if the source Observable does not emit at most one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element, completes when the source Observable has completed, or throws an exception if more of them are emitted.\n     */\n    public func asMaybe() -> Maybe<Element> {\n        PrimitiveSequence(raw: AsMaybe(source: self.asObservable()))\n    }\n}\n\nextension ObservableType where Element == Never {\n    /**\n     - returns: An observable sequence that completes.\n     */\n    public func asCompletable()\n        -> Completable {\n            return PrimitiveSequence(raw: self.asObservable())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence+Zip+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  PrimitiveSequence+Zip+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, resultSelector: @escaping (E1, E2) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>)\n        -> PrimitiveSequence<Trait, (E1, E2)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, resultSelector: @escaping (E1, E2) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>)\n        -> PrimitiveSequence<Trait, (E1, E2)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable())\n            )\n    }\n}\n\n\n\n\n// 3\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, resultSelector: @escaping (E1, E2, E3) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, resultSelector: @escaping (E1, E2, E3) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable())\n            )\n    }\n}\n\n\n\n\n// 4\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, resultSelector: @escaping (E1, E2, E3, E4) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, resultSelector: @escaping (E1, E2, E3, E4) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable())\n            )\n    }\n}\n\n\n\n\n// 5\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable())\n            )\n    }\n}\n\n\n\n\n// 6\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable())\n            )\n    }\n}\n\n\n\n\n// 7\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6, E7)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6, E7)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable())\n            )\n    }\n}\n\n\n\n\n// 8\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, _ source8: PrimitiveSequence<Trait, E8>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, _ source8: PrimitiveSequence<Trait, E8>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6, E7, E8)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, _ source8: PrimitiveSequence<Trait, E8>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> Element)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where Element == Any, Trait == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<Trait, E1>, _ source2: PrimitiveSequence<Trait, E2>, _ source3: PrimitiveSequence<Trait, E3>, _ source4: PrimitiveSequence<Trait, E4>, _ source5: PrimitiveSequence<Trait, E5>, _ source6: PrimitiveSequence<Trait, E6>, _ source7: PrimitiveSequence<Trait, E7>, _ source8: PrimitiveSequence<Trait, E8>)\n        -> PrimitiveSequence<Trait, (E1, E2, E3, E4, E5, E6, E7, E8)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable())\n            )\n    }\n}\n\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift",
    "content": "//\n//  PrimitiveSequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/5/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Observable sequences containing 0 or 1 element.\npublic struct PrimitiveSequence<Trait, Element> {\n    let source: Observable<Element>\n\n    init(raw: Observable<Element>) {\n        self.source = raw\n    }\n}\n\n/// Observable sequences containing 0 or 1 element\npublic protocol PrimitiveSequenceType {\n    /// Additional constraints\n    associatedtype Trait\n\n    /// Sequence element type\n    associatedtype Element\n\n    // Converts `self` to primitive sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    var primitiveSequence: PrimitiveSequence<Trait, Element> { get }\n}\n\nextension PrimitiveSequence: PrimitiveSequenceType {\n    // Converts `self` to primitive sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    public var primitiveSequence: PrimitiveSequence<Trait, Element> {\n        self\n    }\n}\n\nextension PrimitiveSequence: ObservableConvertibleType {\n    /// Converts `self` to `Observable` sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    public func asObservable() -> Observable<Element> {\n        self.source\n    }\n}\n\nextension PrimitiveSequence {\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: Observable.deferred {\n            try observableFactory().asObservable()\n        })\n    }\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.primitiveSequence.source.delay(dueTime, scheduler: scheduler))\n    }\n\n    /**\n     Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the subscription.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: Time-shifted sequence.\n     */\n    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.delaySubscription(dueTime, scheduler: scheduler))\n    }\n    \n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    public func observe(on scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.observe(on: scheduler))\n    }\n\n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    @available(*, deprecated, renamed: \"observe(on:)\")\n    public func observeOn(_ scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        observe(on: scheduler)\n    }\n\n    /**\n    Wraps the source sequence in order to run its subscription and unsubscription logic on the specified \n    scheduler. \n    \n    This operation is not commonly used.\n    \n    This only performs the side-effects of subscription and unsubscription on the specified scheduler. \n    \n    In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n    - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n    \n    - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n    - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n    */\n    public func subscribe(on scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.subscribe(on: scheduler))\n    }\n\n    /**\n    Wraps the source sequence in order to run its subscription and unsubscription logic on the specified\n    scheduler.\n\n    This operation is not commonly used.\n\n    This only performs the side-effects of subscription and unsubscription on the specified scheduler.\n\n    In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n    - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n\n    - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n    - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n    */\n    @available(*, deprecated, renamed: \"subscribe(on:)\")\n    public func subscribeOn(_ scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        subscribe(on: scheduler)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    @available(*, deprecated, renamed: \"catch(_:)\")\n    public func catchError(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        `catch`(handler)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    public func `catch`(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.catch { try handler($0).asObservable() })\n    }\n\n    /**\n     If the initial subscription to the observable sequence emits an error event, try repeating it up to the specified number of attempts (inclusive of the initial attempt) or until is succeeds. For example, if you want to retry a sequence once upon failure, you should use retry(2) (once for the initial attempt, and once for the retry).\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter maxAttemptCount: Maximum number of times to attempt the sequence subscription.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n     */\n    public func retry(_ maxAttemptCount: Int)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.retry(maxAttemptCount))\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retry<TriggerObservable: ObservableType, Error: Swift.Error>(when notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.retry(when: notificationHandler))\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    @available(*, deprecated, renamed: \"retry(when:)\")\n    public func retryWhen<TriggerObservable: ObservableType, Error: Swift.Error>(_ notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        retry(when: notificationHandler)\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retry<TriggerObservable: ObservableType>(when notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.retry(when: notificationHandler))\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    @available(*, deprecated, renamed: \"retry(when:)\")\n    public func retryWhen<TriggerObservable: ObservableType>(_ notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        retry(when: notificationHandler)\n    }\n\n    /**\n     Prints received events for all observers on standard output.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter identifier: Identifier that is printed together with event description to standard output.\n     - parameter trimOutput: Should output be trimmed to max 40 characters.\n     - returns: An observable sequence whose events are printed to standard output.\n     */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.source.debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function))\n    }\n    \n    /**\n     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n     \n     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)\n     \n     - parameter resourceFactory: Factory function to obtain a resource object.\n     - parameter primitiveSequenceFactory: Factory function to obtain an observable sequence that depends on the obtained resource.\n     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n     */\n    public static func using<Resource: Disposable>(_ resourceFactory: @escaping () throws -> Resource, primitiveSequenceFactory: @escaping (Resource) throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: Observable.using(resourceFactory, observableFactory: { (resource: Resource) throws -> Observable<Element> in\n            return try primitiveSequenceFactory(resource).asObservable()\n        }))\n    }\n\n    /**\n     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.\n     \n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n     \n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence<Trait, Element>(raw: self.primitiveSequence.source.timeout(dueTime, scheduler: scheduler))\n    }\n    \n    /**\n     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.\n     \n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n     \n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter other: Sequence to return in case of a timeout.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: The source sequence switching to the other sequence in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval,\n                        other: PrimitiveSequence<Trait, Element>,\n                        scheduler: SchedulerType) -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence<Trait, Element>(raw: self.primitiveSequence.source.timeout(dueTime, other: other.source, scheduler: scheduler))\n    }\n}\n\nextension PrimitiveSequenceType where Element: RxAbstractInteger\n{\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter scheduler: Scheduler to run timers on.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element>  {\n        PrimitiveSequence(raw: Observable<Element>.timer(dueTime, scheduler: scheduler))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence/Single.swift",
    "content": "//\n//  Single.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if DEBUG\nimport Foundation\n#endif\n\n/// Sequence containing exactly 1 element\npublic enum SingleTrait { }\n/// Represents a push style sequence containing 1 element.\npublic typealias Single<Element> = PrimitiveSequence<SingleTrait, Element>\npublic typealias SingleEvent<Element> = Result<Element, Swift.Error>\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    public typealias SingleObserver = (SingleEvent<Element>) -> Void\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping SingleObserver) -> Disposable) -> Single<Element> {\n        let source = Observable<Element>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .success(let element):\n                    observer.on(.next(element))\n                    observer.on(.completed)\n                case .failure(let error):\n                    observer.on(.error(error))\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (SingleEvent<Element>) -> Void) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next(let element):\n                observer(.success(element))\n            case .error(let error):\n                observer(.failure(error))\n            case .completed:\n                rxFatalErrorInDebug(\"Singles can't emit a completion event\")\n            }\n        }\n    }\n\n    /**\n     Subscribes a success handler, and an error handler for this sequence.\n\n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    @available(*, deprecated, renamed: \"subscribe(onSuccess:onFailure:onDisposed:)\")\n    public func subscribe(onSuccess: ((Element) -> Void)? = nil,\n                          onError: @escaping ((Swift.Error) -> Void),\n                          onDisposed: (() -> Void)? = nil) -> Disposable {\n        subscribe(onSuccess: onSuccess, onFailure: onError, onDisposed: onDisposed)\n    }\n    \n    /**\n     Subscribes a success handler, and an error handler for this sequence.\n     \n     Also, take in an object and provide an unretained, safe to use (i.e. not implicitly unwrapped), reference to it along with the events emitted by the sequence.\n     \n     - Note: If `object` can't be retained, none of the other closures will be invoked.\n     \n     - parameter object: The object to provide an unretained reference on.\n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onFailure: Action to invoke upon errored termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe<Object: AnyObject>(\n        with object: Object,\n        onSuccess: ((Object, Element) -> Void)? = nil,\n        onFailure: ((Object, Swift.Error) -> Void)? = nil,\n        onDisposed: ((Object) -> Void)? = nil\n    ) -> Disposable {\n        subscribe(\n            onSuccess: { [weak object] in\n                guard let object = object else { return }\n                onSuccess?(object, $0)\n            },\n            onFailure: { [weak object] in\n                guard let object = object else { return }\n                onFailure?(object, $0)\n            },\n            onDisposed: { [weak object] in\n                guard let object = object else { return }\n                onDisposed?(object)\n            }\n        )\n    }\n    \n    /**\n     Subscribes a success handler, and an error handler for this sequence.\n     \n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onFailure: Action to invoke upon errored termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onSuccess: ((Element) -> Void)? = nil,\n                          onFailure: ((Swift.Error) -> Void)? = nil,\n                          onDisposed: (() -> Void)? = nil) -> Disposable {\n        #if DEBUG\n            let callStack = Hooks.recordCallStackOnError ? Thread.callStackSymbols : []\n        #else\n            let callStack = [String]()\n        #endif\n\n        let disposable: Disposable\n        if let onDisposed = onDisposed {\n            disposable = Disposables.create(with: onDisposed)\n        } else {\n            disposable = Disposables.create()\n        }\n\n        let observer: SingleObserver = { event in\n            switch event {\n            case .success(let element):\n                onSuccess?(element)\n                disposable.dispose()\n            case .failure(let error):\n                if let onFailure = onFailure {\n                    onFailure(error)\n                } else {\n                    Hooks.defaultErrorHandler(callStack, error)\n                }\n                disposable.dispose()\n            }\n        }\n\n        return Disposables.create(\n            self.primitiveSequence.subscribe(observer),\n            disposable\n        )\n    }\n}\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element) -> Single<Element> {\n        Single(raw: Observable.just(element))\n    }\n    \n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - parameter scheduler: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: Element, scheduler: ImmediateSchedulerType) -> Single<Element> {\n        Single(raw: Observable.just(element, scheduler: scheduler))\n    }\n\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Single<Element> {\n        PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Single<Element> {\n        PrimitiveSequence(raw: Observable.never())\n    }\n}\n\nextension PrimitiveSequenceType where Trait == SingleTrait {\n\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter afterSuccess: Action to invoke for each element after the observable has passed an onNext event along to its downstream.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter afterError: Action to invoke after errored termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onSuccess: ((Element) throws -> Void)? = nil,\n                     afterSuccess: ((Element) throws -> Void)? = nil,\n                     onError: ((Swift.Error) throws -> Void)? = nil,\n                     afterError: ((Swift.Error) throws -> Void)? = nil,\n                     onSubscribe: (() -> Void)? = nil,\n                     onSubscribed: (() -> Void)? = nil,\n                     onDispose: (() -> Void)? = nil)\n        -> Single<Element> {\n            return Single(raw: self.primitiveSequence.source.do(\n                onNext: onSuccess,\n                afterNext: afterSuccess,\n                onError: onError,\n                afterError: afterError,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n\n    /**\n     Filters the elements of an observable sequence based on a predicate.\n     \n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n     \n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (Element) throws -> Bool)\n        -> Maybe<Element> {\n            return Maybe(raw: self.primitiveSequence.source.filter(predicate))\n    }\n\n    /**\n     Projects each element of an observable sequence into a new form.\n     \n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n     \n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n     \n     */\n    public func map<Result>(_ transform: @escaping (Element) throws -> Result)\n        -> Single<Result> {\n            return Single(raw: self.primitiveSequence.source.map(transform))\n    }\n    \n    /**\n     Projects each element of an observable sequence into an optional form and filters all optional results.\n\n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of filtering the transform function for each element of the source.\n\n     */\n    public func compactMap<Result>(_ transform: @escaping (Element) throws -> Result?)\n        -> Maybe<Result> {\n        Maybe(raw: self.primitiveSequence.source.compactMap(transform))\n    }\n    \n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     \n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n     \n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<Result>(_ selector: @escaping (Element) throws -> Single<Result>)\n        -> Single<Result> {\n            return Single<Result>(raw: self.primitiveSequence.source.flatMap(selector))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMapMaybe<Result>(_ selector: @escaping (Element) throws -> Maybe<Result>)\n        -> Maybe<Result> {\n            return Maybe<Result>(raw: self.primitiveSequence.source.flatMap(selector))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMapCompletable(_ selector: @escaping (Element) throws -> Completable)\n        -> Completable {\n            return Completable(raw: self.primitiveSequence.source.flatMap(selector))\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n     \n     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func zip<Collection: Swift.Collection, Result>(_ collection: Collection, resultSelector: @escaping ([Element]) throws -> Result) -> PrimitiveSequence<Trait, Result> where Collection.Element == PrimitiveSequence<Trait, Element> {\n        \n        if collection.isEmpty {\n            return PrimitiveSequence<Trait, Result>.deferred {\n                return PrimitiveSequence<Trait, Result>(raw: .just(try resultSelector([])))\n            }\n        }\n        \n        let raw = Observable.zip(collection.map { $0.asObservable() }, resultSelector: resultSelector)\n        return PrimitiveSequence<Trait, Result>(raw: raw)\n    }\n    \n    /**\n     Merges the specified observable sequences into one observable sequence all of the observable sequences have produced an element at a corresponding index.\n     \n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func zip<Collection: Swift.Collection>(_ collection: Collection) -> PrimitiveSequence<Trait, [Element]> where Collection.Element == PrimitiveSequence<Trait, Element> {\n        \n        if collection.isEmpty {\n            return PrimitiveSequence<Trait, [Element]>(raw: .just([]))\n        }\n        \n        let raw = Observable.zip(collection.map { $0.asObservable() })\n        return PrimitiveSequence(raw: raw)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    public func catchAndReturn(_ element: Element)\n        -> PrimitiveSequence<Trait, Element> {\n        PrimitiveSequence(raw: self.primitiveSequence.source.catchAndReturn(element))\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    @available(*, deprecated, renamed: \"catchAndReturn(_:)\")\n    public func catchErrorJustReturn(_ element: Element)\n        -> PrimitiveSequence<Trait, Element> {\n        catchAndReturn(element)\n    }\n\n    /// Converts `self` to `Maybe` trait.\n    ///\n    /// - returns: Maybe trait that represents `self`.\n    public func asMaybe() -> Maybe<Element> {\n        Maybe(raw: self.primitiveSequence.source)\n    }\n\n    /// Converts `self` to `Completable` trait, ignoring its emitted value if\n    /// one exists.\n    /// \n    /// - returns: Completable trait that represents `self`.\n    public func asCompletable() -> Completable {\n        self.primitiveSequence.source.ignoreElements().asCompletable()\n    }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>5.4.3</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Alamofire : NSObject\n@end\n@implementation PodsDummy_Alamofire\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double AlamofireVersionNumber;\nFOUNDATION_EXPORT const unsigned char AlamofireVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -framework \"CFNetwork\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.modulemap",
    "content": "framework module Alamofire {\n  umbrella header \"Alamofire-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -framework \"CFNetwork\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.xcconfig",
    "content": "CODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.7.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/BRLOptionParser/BRLOptionParser-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_BRLOptionParser : NSObject\n@end\n@implementation PodsDummy_BRLOptionParser\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/BRLOptionParser/BRLOptionParser-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/BRLOptionParser/BRLOptionParser.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/BRLOptionParser\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/BRLOptionParser\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/BRLOptionParser\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/BRLOptionParser/BRLOptionParser.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/BRLOptionParser\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/BRLOptionParser\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/BRLOptionParser\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/BRLOptionParser/BRLOptionParser.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/BRLOptionParser\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/BRLOptionParser\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/BRLOptionParser\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.5.4</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_GCDWebServer : NSObject\n@end\n@implementation PodsDummy_GCDWebServer\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"GCDWebServer.h\"\n#import \"GCDWebServerConnection.h\"\n#import \"GCDWebServerFunctions.h\"\n#import \"GCDWebServerHTTPStatusCodes.h\"\n#import \"GCDWebServerRequest.h\"\n#import \"GCDWebServerResponse.h\"\n#import \"GCDWebServerDataRequest.h\"\n#import \"GCDWebServerFileRequest.h\"\n#import \"GCDWebServerMultiPartFormRequest.h\"\n#import \"GCDWebServerURLEncodedFormRequest.h\"\n#import \"GCDWebServerDataResponse.h\"\n#import \"GCDWebServerErrorResponse.h\"\n#import \"GCDWebServerFileResponse.h\"\n#import \"GCDWebServerStreamedResponse.h\"\n\nFOUNDATION_EXPORT double GCDWebServerVersionNumber;\nFOUNDATION_EXPORT const unsigned char GCDWebServerVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/GCDWebServer\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer.modulemap",
    "content": "framework module GCDWebServer {\n  umbrella header \"GCDWebServer-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/GCDWebServer\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/GCDWebServer.xcconfig",
    "content": "CODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/GCDWebServer\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/GCDWebServer/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.4.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.3.6</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.4.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_MASShortcut : NSObject\n@end\n@implementation PodsDummy_MASShortcut\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"MASKeyCodes.h\"\n#import \"MASKeyMasks.h\"\n#import \"MASShortcut.h\"\n#import \"MASShortcutValidator.h\"\n#import \"MASHotKey.h\"\n#import \"MASShortcutMonitor.h\"\n#import \"Shortcut.h\"\n#import \"MASLocalization.h\"\n#import \"MASShortcutView+Bindings.h\"\n#import \"MASShortcutView.h\"\n#import \"MASDictionaryTransformer.h\"\n#import \"MASShortcutBinder.h\"\n\nFOUNDATION_EXPORT double MASShortcutVersionNumber;\nFOUNDATION_EXPORT const unsigned char MASShortcutVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -framework \"AppKit\" -framework \"Carbon\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/MASShortcut\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut.modulemap",
    "content": "framework module MASShortcut {\n  umbrella header \"MASShortcut-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -framework \"AppKit\" -framework \"Carbon\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/MASShortcut\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/MASShortcut.xcconfig",
    "content": "CODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_LDFLAGS = $(inherited) -framework \"AppKit\" -framework \"Carbon\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/MASShortcut\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/ResourceBundle-MASShortcut-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>BNDL</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.3.6</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/MASShortcut/ResourceBundle-MASShortcut-MASShortcut-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>BNDL</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.4.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## Alamofire\n\nCopyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## GCDWebServer\n\nCopyright (c) 2012-2014, Pierre-Olivier Latour\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * The name of Pierre-Olivier Latour may not be used to endorse\n      or promote products derived from this software without specific\n      prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## MASShortcut\n\nCopyright (c) 2012-2013, Vadim Shpakovski\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## RxCocoa\n\n**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## RxRelay\n\n**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## RxSwift\n\n**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2012-2014, Pierre-Olivier Latour\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * The name of Pierre-Olivier Latour may not be used to endorse\n      or promote products derived from this software without specific\n      prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL PIERRE-OLIVIER LATOUR BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>GCDWebServer</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2012-2013, Vadim Shpakovski\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD 2-clause</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>MASShortcut</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxCocoa</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxRelay</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>**The MIT License**\n**Copyright © 2015 Krunoslav Zaher, Shai Mishali**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxSwift</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_ShadowsocksX_NG : NSObject\n@end\n@implementation PodsDummy_Pods_ShadowsocksX_NG\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh",
    "content": "#!/bin/sh\nset -e\nset -u\nset -o pipefail\n\nfunction on_error {\n  echo \"$(realpath -mq \"${0}\"):$1: error: Unexpected failure\"\n}\ntrap 'on_error $LINENO' ERR\n\nif [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then\n  # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy\n  # frameworks to, so exit 0 (signalling the script phase was successful).\n  exit 0\nfi\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nCOCOAPODS_PARALLEL_CODE_SIGN=\"${COCOAPODS_PARALLEL_CODE_SIGN:-false}\"\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\nBCSYMBOLMAP_DIR=\"BCSymbolMaps\"\n\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n    echo \"Symlinked...\"\n    source=\"$(readlink \"${source}\")\"\n  fi\n\n  if [ -d \"${source}/${BCSYMBOLMAP_DIR}\" ]; then\n    # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied\n    find \"${source}/${BCSYMBOLMAP_DIR}\" -name \"*.bcsymbolmap\"|while read f; do\n      echo \"Installing $f\"\n      install_bcsymbolmap \"$f\" \"$destination\"\n      rm \"$f\"\n    done\n    rmdir \"${source}/${BCSYMBOLMAP_DIR}\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  elif [ -L \"${binary}\" ]; then\n    echo \"Destination binary is symlinked...\"\n    dirname=\"$(dirname \"${binary}\")\"\n    binary=\"${dirname}/$(readlink \"${binary}\")\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u)\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  warn_missing_arch=${2:-true}\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .dSYM \"$source\")\"\n    binary_name=\"$(ls \"$source/Contents/Resources/DWARF\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}\"\n\n    # Strip invalid architectures from the dSYM.\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O \"*\"dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\" \"$warn_missing_arch\"\n    fi\n    if [[ $STRIP_BINARY_RETVAL == 0 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM\"\n    fi\n  fi\n}\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  warn_missing_arch=${2:-true}\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    if [[ \"$warn_missing_arch\" == \"true\" ]]; then\n      echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    fi\n    STRIP_BINARY_RETVAL=1\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\"\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=0\n}\n\n# Copies the bcsymbolmap files of a vendored framework\ninstall_bcsymbolmap() {\n    local bcsymbolmap_path=\"$1\"\n    local destination=\"${BUILT_PRODUCTS_DIR}\"\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${bcsymbolmap_path}\" \"${destination}\"\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY:-}\" -a \"${CODE_SIGNING_REQUIRED:-}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identity\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/MASShortcut/MASShortcut.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/MASShortcut/MASShortcut.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\"\nfi\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_ShadowsocksX_NGVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_ShadowsocksX_NGVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks'\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"Alamofire\" -framework \"AppKit\" -framework \"CFNetwork\" -framework \"Carbon\" -framework \"GCDWebServer\" -framework \"MASShortcut\" -framework \"RxCocoa\" -framework \"RxRelay\" -framework \"RxSwift\" -framework \"SystemConfiguration\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.modulemap",
    "content": "framework module Pods_ShadowsocksX_NG {\n  umbrella header \"Pods-ShadowsocksX-NG-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks'\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"Alamofire\" -framework \"AppKit\" -framework \"CFNetwork\" -framework \"Carbon\" -framework \"GCDWebServer\" -framework \"MASShortcut\" -framework \"RxCocoa\" -framework \"RxRelay\" -framework \"RxSwift\" -framework \"SystemConfiguration\"\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_ShadowsocksX_NGTests : NSObject\n@end\n@implementation PodsDummy_Pods_ShadowsocksX_NGTests\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_ShadowsocksX_NGTestsVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_ShadowsocksX_NGTestsVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"Alamofire\" -framework \"AppKit\" -framework \"CFNetwork\" -framework \"Carbon\" -framework \"GCDWebServer\" -framework \"MASShortcut\" -framework \"RxCocoa\" -framework \"RxRelay\" -framework \"RxSwift\" -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.modulemap",
    "content": "framework module Pods_ShadowsocksX_NGTests {\n  umbrella header \"Pods-ShadowsocksX-NGTests-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/GCDWebServer/GCDWebServer.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/MASShortcut/MASShortcut.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.framework/Headers\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -l\"z\" -framework \"Alamofire\" -framework \"AppKit\" -framework \"CFNetwork\" -framework \"Carbon\" -framework \"GCDWebServer\" -framework \"MASShortcut\" -framework \"RxCocoa\" -framework \"RxRelay\" -framework \"RxSwift\" -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## BRLOptionParser\n\n(The MIT License)\n\nCopyright © 2013-2015 Stephen Celis (<stephen@stephencelis.com>)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-acknowledgements.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>(The MIT License)\n\nCopyright © 2013-2015 Stephen Celis (&lt;stephen@stephencelis.com&gt;)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>BRLOptionParser</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_proxy_conf_helper : NSObject\n@end\n@implementation PodsDummy_Pods_proxy_conf_helper\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/BRLOptionParser\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"BRLOptionParser\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/BRLOptionParser\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/BRLOptionParser\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"BRLOptionParser\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.1.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>6.2.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxCocoa : NSObject\n@end\n@implementation PodsDummy_RxCocoa\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"RxCocoaRuntime.h\"\n#import \"_RX.h\"\n#import \"_RXDelegateProxy.h\"\n#import \"_RXKVOObserver.h\"\n#import \"_RXObjCRuntime.h\"\n#import \"RxCocoa.h\"\n\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxCocoa\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.modulemap",
    "content": "framework module RxCocoa {\n  umbrella header \"RxCocoa-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\" \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxCocoa\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig",
    "content": "CODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxCocoa\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>6.2.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxRelay : NSObject\n@end\n@implementation PodsDummy_RxRelay\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxRelayVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxRelayVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxRelay\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay.modulemap",
    "content": "framework module RxRelay {\n  umbrella header \"RxRelay-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxRelay/RxRelay.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxRelay\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxRelay\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.1.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>6.2.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxSwift : NSObject\n@end\n@implementation PodsDummy_RxSwift\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <Cocoa/Cocoa.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxSwiftVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxSwiftVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.debug.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxSwift\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.modulemap",
    "content": "framework module RxSwift {\n  umbrella header \"RxSwift-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.release.xcconfig",
    "content": "CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO\nCODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxSwift\nPODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nUSE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.xcconfig",
    "content": "CODE_SIGN_IDENTITY =\nCONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RxSwift\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nOTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxSwift\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "README.md",
    "content": "# ShadowsocksX-NG\n\n[Download](https://github.com/shadowsocks/ShadowsocksX-NG/releases/latest)\n\n[![Actions Status](https://github.com/shadowsocks/ShadowsocksX-NG/workflows/CI/badge.svg)](https://github.com/shadowsocks/ShadowsocksX-NG/actions)\n\nNext Generation of [ShadowsocksX](https://github.com/shadowsocks/shadowsocks-iOS)\n\n## Why a new implementation?\n\nIt's hard to maintain the original implementation as there is too much unused code in it.\nIt also embeds the `ss-local` source code. It's crazy to maintain dependencies of `ss-local`.\nSo it's hard to update the `ss-local` version.\n\nNow I just copied the `ss-local` from Homebrew. Run `ss-local` executable as a Launch Agent in the background.\nSo there is only some source code related to GUI left.\nThen I have rewrited the GUI code in Swift.\n\n## Requirements\n\n### Running\n\nmacOS 10.12+\n\n### Building\n\n- Xcode 12.5.1+\n- CocoaPods 1.10.1+\n\n## Download\n\nFrom [here](https://github.com/shadowsocks/ShadowsocksX-NG/releases/)\n\n## Features\n\n- `ss-local` from shadowsocks-libev 3.2.5.\n- Support SIP003 plugins. Embed `kcptun`,  `simple-obfs` and `v2ray-plugin`.\n- Could update PAC by download GFW List from GitHub.\n- Share your server profiles by qrcode or url.\n- Import server profile urls from pasteboard.\n- Import server profile by scan QRCode on screen.\n- Custom rules for PAC.\n- Support for [AEAD Ciphers](https://shadowsocks.org/en/spec/AEAD-Ciphers.html)\n- HTTP Proxy by [privoxy](http://www.privoxy.org/)\n\n## Difference from original ShadowsocksX\n\n`ss-local` is run as a background service through launchd, not as an in-app process.\nSo after you quit the app, the `ss-local` might be still running.\n\nAdded a manual mode which won't configure the system proxy settings,\nso that you could configure your apps to use the SOCKS5 proxy manually.\n\n## Contributing\n\nContributions must be available on a separately named branch based on the latest version of the main branch `develop`.\n\nref: [GitFlow](http://nvie.com/posts/a-successful-git-branching-model/)\n\n## License\n\nThe project is released under the terms of the GPLv3.\n\n"
  },
  {
    "path": "ShadowsocksX-NG/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/5.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\nimport Carbon\nimport RxCocoa\nimport RxSwift\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {\n    \n    var shareWinCtrl: ShareServerProfilesWindowController!\n    var qrcodeWinCtrl: SWBQRCodeWindowController!\n    var preferencesWinCtrl: PreferencesWindowController!\n    var editUserRulesWinCtrl: UserRulesController!\n    var allInOnePreferencesWinCtrl: PreferencesWinController!\n    var toastWindowCtrl: ToastWindowController!\n    var importWinCtrl: ImportWindowController!\n\n    @IBOutlet weak var window: NSWindow!\n    @IBOutlet weak var statusMenu: NSMenu!\n    \n    @IBOutlet weak var runningStatusMenuItem: NSMenuItem!\n    @IBOutlet weak var toggleRunningMenuItem: NSMenuItem!\n    @IBOutlet weak var autoModeMenuItem: NSMenuItem!\n    @IBOutlet weak var globalModeMenuItem: NSMenuItem!\n    @IBOutlet weak var manualModeMenuItem: NSMenuItem!\n    @IBOutlet weak var externalPACModeMenuItem: NSMenuItem!\n    \n    @IBOutlet weak var serversMenuItem: NSMenuItem!\n    @IBOutlet var showQRCodeMenuItem: NSMenuItem!\n    @IBOutlet var scanQRCodeMenuItem: NSMenuItem!\n    @IBOutlet var serverProfilesBeginSeparatorMenuItem: NSMenuItem!\n    @IBOutlet var serverProfilesEndSeparatorMenuItem: NSMenuItem!\n    \n    @IBOutlet weak var copyHttpProxyExportCmdLineMenuItem: NSMenuItem!\n    \n    @IBOutlet weak var lanchAtLoginMenuItem: NSMenuItem!\n\n    @IBOutlet weak var hudWindow: NSPanel!\n    @IBOutlet weak var panelView: NSView!\n    @IBOutlet weak var isNameTextField: NSTextField!\n\n    let kProfileMenuItemIndexBase = 100\n\n    var statusItem: NSStatusItem!\n    static let StatusItemIconWidth: CGFloat = NSStatusItem.variableLength\n    \n    func ensureLaunchAgentsDirOwner () {\n        let dirPath = NSHomeDirectory() + \"/Library/LaunchAgents\"\n        let fileMgr = FileManager.default\n        if fileMgr.fileExists(atPath: dirPath) {\n            do {\n                let attrs = try fileMgr.attributesOfItem(atPath: dirPath)\n                if attrs[FileAttributeKey.ownerAccountName] as! String != NSUserName() {\n                    //try fileMgr.setAttributes([FileAttributeKey.ownerAccountName: NSUserName()], ofItemAtPath: dirPath)\n                    let bashFilePath = Bundle.main.path(forResource: \"fix_dir_owner.sh\", ofType: nil)!\n                    let script = \"do shell script \\\"bash \\\\\\\"\\(bashFilePath)\\\\\\\" \\(NSUserName()) \\\" with administrator privileges\"\n                    if let appleScript = NSAppleScript(source: script) {\n                        var err: NSDictionary? = nil\n                        appleScript.executeAndReturnError(&err)\n                    }\n                }\n            }\n            catch {\n                NSLog(\"Error when ensure the owner of $HOME/Library/LaunchAgents, \\(error.localizedDescription)\")\n            }\n        }\n    }\n    \n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n        \n        _ = LaunchAtLoginController()// Ensure set when launch\n        \n        NSUserNotificationCenter.default.delegate = self\n        \n        self.ensureLaunchAgentsDirOwner()\n        \n        // Prepare ss-local\n        InstallSSLocal()\n        InstallPrivoxy()\n        InstallSimpleObfs()\n        InstallKcptun()\n        InstallV2rayPlugin()\n        \n        // Prepare defaults\n        let defaults = UserDefaults.standard\n        defaults.register(defaults: [\n            \"ShadowsocksOn\": true,\n            \"ShadowsocksRunningMode\": \"auto\",\n            \"LocalSocks5.ListenPort\": NSNumber(value: 1086 as UInt16),\n            \"LocalSocks5.ListenAddress\": \"127.0.0.1\",\n            \"PacServer.BindToLocalhost\": NSNumber(value: true as Bool),\n            \"PacServer.ListenPort\":NSNumber(value: 1089 as UInt16),\n            \"LocalSocks5.Timeout\": NSNumber(value: 60 as UInt),\n            \"LocalSocks5.EnableUDPRelay\": NSNumber(value: false as Bool),\n            \"LocalSocks5.EnableVerboseMode\": NSNumber(value: false as Bool),\n            \"GFWListURL\": \"https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt\",\n            \"AutoConfigureNetworkServices\": NSNumber(value: true as Bool),\n            \"LocalHTTP.ListenAddress\": \"127.0.0.1\",\n            \"LocalHTTP.ListenPort\": NSNumber(value: 1087 as UInt16),\n            \"LocalHTTPOn\": true,\n            \"LocalHTTP.FollowGlobal\": false,\n            \"ProxyExceptions\": \"127.0.0.1, localhost, 192.168.0.0/16, 10.0.0.0/8, FE80::/64, ::1, FD00::/8\",\n            \"ExternalPACURL\": \"\",\n            \"EnableSwitchMode.PAC\": true,\n            \"EnableSwitchMode.Global\": true,\n            \"EnableSwitchMode.Manual\": false,\n            \"EnableSwitchMode.ExternalPAC\": false,\n            ])\n        \n        statusItem = NSStatusBar.system.statusItem(withLength: AppDelegate.StatusItemIconWidth)\n        let image : NSImage = NSImage(named: \"menu_icon\")!\n        image.isTemplate = true\n        statusItem.image = image\n        statusItem.menu = statusMenu\n        \n        let notifyCenter = NotificationCenter.default\n        \n        _ = notifyCenter.rx.notification(NOTIFY_CONF_CHANGED)\n            .subscribe(onNext: { noti in\n                self.applyConfig()\n                self.updateRunningModeMenu()\n                self.updateCopyHttpProxyExportMenu()\n            })\n        \n        notifyCenter.addObserver(forName: NOTIFY_SERVER_PROFILES_CHANGED, object: nil, queue: nil\n            , using: {\n                (note) in\n                let profileMgr = ServerProfileManager.instance\n                if profileMgr.activeProfileId == nil &&\n                    profileMgr.profiles.count > 0{\n                    if profileMgr.profiles[0].isValid(){\n                        profileMgr.setActiveProfiledId(profileMgr.profiles[0].uuid)\n                    }\n                }\n                self.updateServersMenu()\n                self.updateRunningModeMenu()\n                SyncSSLocal()\n            }\n        )\n        _ = notifyCenter.rx.notification(NOTIFY_TOGGLE_RUNNING_SHORTCUT)\n            .subscribe(onNext: { noti in\n                self.doToggleRunning(showToast: true)\n            })\n        _ = notifyCenter.rx.notification(NOTIFY_SWITCH_PROXY_MODE_SHORTCUT)\n            .subscribe(onNext: { noti in\n                let mode = defaults.string(forKey: \"ShadowsocksRunningMode\")!\n                \n                var enabledModeList: [String] = []\n                if defaults.bool(forKey: \"EnableSwitchMode.PAC\") {\n                    enabledModeList.append(\"auto\")\n                }\n                if defaults.bool(forKey: \"EnableSwitchMode.Global\") {\n                    enabledModeList.append(\"global\")\n                }\n                if defaults.bool(forKey: \"EnableSwitchMode.Manual\") {\n                    enabledModeList.append(\"manual\")\n                }\n                if defaults.bool(forKey: \"EnableSwitchMode.ExternalPAC\")\n                    && self.externalPACModeMenuItem.isEnabled {\n                    enabledModeList.append(\"externalPAC\")\n                }\n                \n                if enabledModeList.isEmpty {\n                    return\n                }\n                \n                var nextMode = \"\"\n                if enabledModeList.contains(mode) {\n                    let i = enabledModeList.firstIndex(of: mode)!\n                    if i + 1 == enabledModeList.count {\n                        nextMode = enabledModeList[0]\n                    } else {\n                        nextMode = enabledModeList[i+1]\n                    }\n                } else {\n                    nextMode = enabledModeList[0]\n                }\n                \n                defaults.setValue(nextMode, forKey: \"ShadowsocksRunningMode\")\n                \n                self.updateRunningModeMenu()\n                self.applyConfig()\n                \n                // Show toast message\n                let toastMessages = [\n                    \"auto\": \"Auto Mode By PAC\".localized,\n                    \"global\": \"Global Mode\".localized,\n                    \"manual\": \"Manual Mode\".localized,\n                    \"externalPAC\": \"Auto Mode By External PAC\".localized,\n                ]\n                self.makeToast(toastMessages[nextMode]!)\n            })\n        \n        _ = notifyCenter.rx.notification(NOTIFY_FOUND_SS_URL)\n            .subscribe(onNext: { noti in\n                self.handleFoundSSURL(noti)\n            })\n        \n        // Handle ss url scheme\n        NSAppleEventManager.shared().setEventHandler(self\n            , andSelector: #selector(self.handleURLEvent)\n            , forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))\n        \n        updateMainMenu()\n        updateCopyHttpProxyExportMenu()\n        updateServersMenu()\n        updateRunningModeMenu()\n        \n        ProxyConfHelper.install()\n        ProxyConfHelper.startMonitorPAC()\n        applyConfig()\n\n        // Register global hotkey\n        ShortcutsController.bindShortcuts()\n    }\n    \n    func applicationWillTerminate(_ aNotification: Notification) {\n        // Insert code here to tear down your application\n        StopSSLocal()\n        StopPrivoxy()\n        ProxyConfHelper.disableProxy()\n    }\n\n    func applyConfig() {\n        SyncSSLocal()\n        \n        let defaults = UserDefaults.standard\n        let isOn = defaults.bool(forKey: \"ShadowsocksOn\")\n        let mode = defaults.string(forKey: \"ShadowsocksRunningMode\")\n        \n        if isOn {\n            if mode == \"auto\" {\n                ProxyConfHelper.enablePACProxy()\n            } else if mode == \"global\" {\n                ProxyConfHelper.enableGlobalProxy()\n            } else if mode == \"manual\" {\n                ProxyConfHelper.disableProxy()\n            } else if mode == \"externalPAC\" {\n                ProxyConfHelper.enableExternalPACProxy()\n            }\n        } else {\n            ProxyConfHelper.disableProxy()\n        }\n    }\n\n    // MARK: - UI Methods\n    @IBAction func toggleRunning(_ sender: NSMenuItem) {\n        self.doToggleRunning(showToast: false)\n    }\n    \n    func doToggleRunning(showToast: Bool) {\n        let defaults = UserDefaults.standard\n        var isOn = UserDefaults.standard.bool(forKey: \"ShadowsocksOn\")\n        isOn = !isOn\n        defaults.set(isOn, forKey: \"ShadowsocksOn\")\n        \n        self.updateMainMenu()\n        self.applyConfig()\n        \n        if showToast {\n            if isOn {\n                self.makeToast(\"Shadowsocks: On\".localized)\n            }\n            else {\n                self.makeToast(\"Shadowsocks: Off\".localized)\n            }\n        }\n    }\n    \n    @IBAction func updateGFWList(_ sender: NSMenuItem) {\n        UpdatePACFromGFWList()\n    }\n    \n    @IBAction func editUserRulesForPAC(_ sender: NSMenuItem) {\n        if editUserRulesWinCtrl != nil {\n            editUserRulesWinCtrl.close()\n        }\n        let ctrl = UserRulesController(windowNibName: \"UserRulesController\")\n        editUserRulesWinCtrl = ctrl\n        \n        ctrl.showWindow(self)\n        NSApp.activate(ignoringOtherApps: true)\n        ctrl.window?.makeKeyAndOrderFront(self)\n    }\n    \n    @IBAction func showShareServerProfiles(_ sender: NSMenuItem) {\n        if shareWinCtrl != nil {\n            shareWinCtrl.close()\n        }\n        shareWinCtrl = ShareServerProfilesWindowController(windowNibName: \"ShareServerProfilesWindowController\")\n        shareWinCtrl.showWindow(self)\n        NSApp.activate(ignoringOtherApps: true)\n        shareWinCtrl.window?.makeKeyAndOrderFront(nil)\n    }\n    \n    @IBAction func showImportWindow(_ sender: NSMenuItem) {\n        if importWinCtrl != nil {\n            importWinCtrl.close()\n        }\n        importWinCtrl = ImportWindowController(windowNibName: \"ImportWindowController\")\n        importWinCtrl.showWindow(self)\n        NSApp.activate(ignoringOtherApps: true)\n        importWinCtrl.window?.makeKeyAndOrderFront(nil)\n    }\n    \n    @IBAction func scanQRCodeFromScreen(_ sender: NSMenuItem) {\n        ScanQRCodeOnScreen()\n    }\n    \n    @IBAction func importProfileURLFromPasteboard(_ sender: NSMenuItem) {\n        let pb = NSPasteboard.general\n        if #available(OSX 10.13, *) {\n            if let text = pb.string(forType: NSPasteboard.PasteboardType.URL) {\n                if let url = URL(string: text) {\n                    NotificationCenter.default.post(\n                        name: NOTIFY_FOUND_SS_URL, object: nil\n                        , userInfo: [\n                            \"urls\": [url],\n                            \"source\": \"pasteboard\",\n                            ])\n                }\n            }\n        }\n        if let text = pb.string(forType: NSPasteboard.PasteboardType.string) {\n            var urls = text.split(separator: \"\\n\")\n                .map { String($0).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) }\n                .map { URL(string: $0) }\n                .filter { $0 != nil }\n                .map { $0! }\n            urls = urls.filter { $0.scheme == \"ss\" }\n            \n            NotificationCenter.default.post(\n                name: NOTIFY_FOUND_SS_URL, object: nil\n                , userInfo: [\n                    \"urls\": urls,\n                    \"source\": \"pasteboard\",\n                    ])\n        }\n    }\n\n    @IBAction func selectPACMode(_ sender: NSMenuItem) {\n        let defaults = UserDefaults.standard\n        defaults.setValue(\"auto\", forKey: \"ShadowsocksRunningMode\")\n        updateRunningModeMenu()\n        applyConfig()\n    }\n    \n    @IBAction func selectGlobalMode(_ sender: NSMenuItem) {\n        let defaults = UserDefaults.standard\n        defaults.setValue(\"global\", forKey: \"ShadowsocksRunningMode\")\n        updateRunningModeMenu()\n        applyConfig()\n    }\n    \n    @IBAction func selectManualMode(_ sender: NSMenuItem) {\n        let defaults = UserDefaults.standard\n        defaults.setValue(\"manual\", forKey: \"ShadowsocksRunningMode\")\n        updateRunningModeMenu()\n        applyConfig()\n    }\n    \n    @IBAction func selectExternalPACMode(_ sender: NSMenuItem) {\n        let defaults = UserDefaults.standard\n        defaults.setValue(\"externalPAC\", forKey: \"ShadowsocksRunningMode\")\n        updateRunningModeMenu()\n        applyConfig()\n    }\n    \n    @IBAction func editServerPreferences(_ sender: NSMenuItem) {\n        if preferencesWinCtrl != nil {\n            preferencesWinCtrl.close()\n        }\n        preferencesWinCtrl = PreferencesWindowController(windowNibName: \"PreferencesWindowController\")\n        \n        preferencesWinCtrl.showWindow(self)\n        NSApp.activate(ignoringOtherApps: true)\n    }\n    \n    @IBAction func showAllInOnePreferences(_ sender: NSMenuItem) {\n        if allInOnePreferencesWinCtrl != nil {\n            allInOnePreferencesWinCtrl.close()\n        }\n        \n        allInOnePreferencesWinCtrl = PreferencesWinController(windowNibName: \"PreferencesWinController\")\n        \n        allInOnePreferencesWinCtrl.showWindow(self)\n        NSApp.activate(ignoringOtherApps: true)\n        allInOnePreferencesWinCtrl.window?.makeKeyAndOrderFront(self)\n    }\n    \n    @IBAction func selectServer(_ sender: NSMenuItem) {\n        let index = sender.tag - kProfileMenuItemIndexBase\n        let spMgr = ServerProfileManager.instance\n        let newProfile = spMgr.profiles[index]\n        if newProfile.uuid != spMgr.activeProfileId {\n            spMgr.setActiveProfiledId(newProfile.uuid)\n            updateServersMenu()\n            SyncSSLocal()\n            applyConfig()\n        }\n        updateRunningModeMenu()\n    }\n    \n    @IBAction func copyExportCommand(_ sender: NSMenuItem) {\n        // Get the Http proxy config.\n        let defaults = UserDefaults.standard\n        let address = defaults.string(forKey: \"LocalHTTP.ListenAddress\")!\n        let port = defaults.integer(forKey: \"LocalHTTP.ListenPort\")\n        \n        // Format an export string.\n        let command = \"export http_proxy=http://\\(address):\\(port);export https_proxy=http://\\(address):\\(port);\"\n        \n        // Copy to paste board.\n        NSPasteboard.general.clearContents()\n        NSPasteboard.general.setString(command, forType: NSPasteboard.PasteboardType.string)\n        \n        // Show a toast notification.\n        self.makeToast(\"Export Command Copied.\".localized)\n    }\n    \n    @IBAction func showLogs(_ sender: NSMenuItem) {\n        let ws = NSWorkspace.shared\n        if let appUrl = ws.urlForApplication(withBundleIdentifier: \"com.apple.Console\") {\n            try! ws.launchApplication(at: appUrl\n                ,options: NSWorkspace.LaunchOptions.default\n                ,configuration: [NSWorkspace.LaunchConfigurationKey.arguments: \"~/Library/Logs/ss-local.log\"])\n        }\n    }\n    \n    @IBAction func feedback(_ sender: NSMenuItem) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/qiuyuzhou/ShadowsocksX-NG/issues\")!)\n    }\n    \n    @IBAction func checkForUpdates(_ sender: NSMenuItem) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/shadowsocks/ShadowsocksX-NG/releases\")!)\n    }\n    \n    @IBAction func exportDiagnosis(_ sender: NSMenuItem) {\n        let savePanel = NSSavePanel()\n        savePanel.title = \"Save Diagnosis to File\".localized\n        savePanel.canCreateDirectories = true\n        savePanel.allowedFileTypes = [\"txt\"]\n        savePanel.isExtensionHidden = false\n        \n        let formatter = DateFormatter()\n        formatter.dateFormat = \"yyyyMMdd_HHmmss\"\n        let dateString = formatter.string(from: Date())\n        \n        savePanel.nameFieldStringValue = \"ShadowsocksX-NG_diagnose_\\(dateString)\"\n        \n        savePanel.becomeKey()\n        let result = savePanel.runModal()\n        if (result.rawValue == NSFileHandlingPanelOKButton) {\n            if let url = savePanel.url {\n                let diagnosisText = diagnose()\n                try! diagnosisText.write(to: url, atomically: false, encoding: String.Encoding.utf8)\n            }\n        }\n    }\n    \n    @IBAction func showHelp(_ sender: NSMenuItem) {\n        NSWorkspace.shared.open(URL(string: \"https://github.com/shadowsocks/ShadowsocksX-NG/wiki\")!)\n    }\n    \n    @IBAction func showAbout(_ sender: NSMenuItem) {\n        NSApp.orderFrontStandardAboutPanel(sender);\n        NSApp.activate(ignoringOtherApps: true)\n    }\n    \n    func updateRunningModeMenu() {\n        let defaults = UserDefaults.standard\n        \n        if let pacURL = defaults.string(forKey: \"ExternalPACURL\") {\n            if pacURL != \"\" {\n                externalPACModeMenuItem.isEnabled = true\n            } else {\n                externalPACModeMenuItem.isEnabled = false\n            }\n        }\n\n        // Update running mode state\n        autoModeMenuItem.state = .off\n        globalModeMenuItem.state = .off\n        manualModeMenuItem.state = .off\n        externalPACModeMenuItem.state = .off\n        \n        let mode = defaults.string(forKey: \"ShadowsocksRunningMode\")\n        if mode == \"auto\" {\n            autoModeMenuItem.state = .on\n        } else if mode == \"global\" {\n            globalModeMenuItem.state = .on\n        } else if mode == \"manual\" {\n            manualModeMenuItem.state = .on\n        } else if mode == \"externalPAC\" {\n            externalPACModeMenuItem.state = .on\n        }\n        updateStatusMenuImage()\n        \n        // Update selected server name\n        var serverMenuText = \"Servers - (No Selected)\".localized\n        \n        let mgr = ServerProfileManager.instance\n        for p in mgr.profiles {\n            if mgr.activeProfileId == p.uuid {\n                var profileName :String\n                if !p.remark.isEmpty {\n                    profileName = String(p.remark.prefix(24))\n                } else {\n                    profileName = p.serverHost\n                }\n                serverMenuText = \"Servers\".localized + \" - \\(profileName)\"\n                break\n            }\n        }\n        serversMenuItem.title = serverMenuText\n    }\n    \n    func updateStatusMenuImage() {\n        let defaults = UserDefaults.standard\n        let mode = defaults.string(forKey: \"ShadowsocksRunningMode\")\n        let isOn = defaults.bool(forKey: \"ShadowsocksOn\")\n        if isOn {\n            if let m = mode {\n                switch m {\n                    case \"auto\":\n                        statusItem.image = NSImage(named: \"menu_p_icon\")\n                    case \"global\":\n                        statusItem.image = NSImage(named: \"menu_g_icon\")\n                    case \"manual\":\n                        statusItem.image = NSImage(named: \"menu_m_icon\")\n                    case \"externalPAC\":\n                        statusItem.image = NSImage(named: \"menu_e_icon\")\n                default: break\n                }\n                statusItem.image?.isTemplate = true\n            }\n        } else {\n            statusItem.image = NSImage(named: \"menu_icon_disabled\")\n            statusItem.image?.isTemplate = true\n        }\n    }\n    \n    func updateMainMenu() {\n        let defaults = UserDefaults.standard\n        let isOn = defaults.bool(forKey: \"ShadowsocksOn\")\n        if isOn {\n            runningStatusMenuItem.title = \"Shadowsocks: On\".localized\n            runningStatusMenuItem.image = NSImage(named: \"NSStatusAvailable\")\n            toggleRunningMenuItem.title = \"Turn Shadowsocks Off\".localized\n            let image = NSImage(named: \"menu_icon\")\n            statusItem.image = image\n        } else {\n            runningStatusMenuItem.title = \"Shadowsocks: Off\".localized\n            toggleRunningMenuItem.title = \"Turn Shadowsocks On\".localized\n            runningStatusMenuItem.image = NSImage(named: \"NSStatusNone\")\n            let image = NSImage(named: \"menu_icon_disabled\")\n            statusItem.image = image\n        }\n        statusItem.image?.isTemplate = true\n        \n        updateStatusMenuImage()\n    }\n    \n    func updateCopyHttpProxyExportMenu() {\n        let defaults = UserDefaults.standard\n        let isOn = defaults.bool(forKey: \"LocalHTTPOn\")\n        copyHttpProxyExportCmdLineMenuItem.isHidden = !isOn\n    }\n    \n    func updateServersMenu() {\n        guard let menu = serversMenuItem.submenu else { return }\n\n        let mgr = ServerProfileManager.instance\n        let profiles = mgr.profiles\n\n        // Remove all profile menu items\n        let beginIndex = menu.index(of: serverProfilesBeginSeparatorMenuItem) + 1\n        let endIndex = menu.index(of: serverProfilesEndSeparatorMenuItem)\n        // Remove from end to begin, so the index won't change :)\n        for index in (beginIndex..<endIndex).reversed() {\n            menu.removeItem(at: index)\n        }\n\n        // Insert all profile menu items\n        for (i, profile) in profiles.enumerated().reversed() {\n            let item = NSMenuItem()\n            item.tag = i + kProfileMenuItemIndexBase\n            item.title = profile.title()\n            item.state = (mgr.activeProfileId == profile.uuid) ? .on : .off\n            item.isEnabled = profile.isValid()\n            // Use number keys for faster switch between the first 10 servers from main menu\n            if i < 10 {\n                var key = i + 1\n                if key == 10 {\n                    key = 0\n                }\n                item.keyEquivalent = String(key)\n                item.keyEquivalentModifierMask = .init()\n            }\n            item.action = #selector(AppDelegate.selectServer)\n            \n            menu.insertItem(item, at: beginIndex)\n        }\n\n        // End separator is redundant if profile section is empty\n        serverProfilesEndSeparatorMenuItem.isHidden = profiles.isEmpty\n    }\n    \n    @objc func handleURLEvent(_ event: NSAppleEventDescriptor, withReplyEvent replyEvent: NSAppleEventDescriptor) {\n        if let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue {\n            if let url = URL(string: urlString) {\n                NotificationCenter.default.post(\n                    name: NOTIFY_FOUND_SS_URL, object: nil\n                    , userInfo: [\n                        \"urls\": [url],\n                        \"source\": \"url\",\n                        ])\n            }\n        }\n    }\n    \n    func handleFoundSSURL(_ note: Notification) {\n        let sendNotify = { (title: String, subtitle: String, infoText: String) in\n            let userNote = NSUserNotification()\n            userNote.title = title\n            userNote.subtitle = subtitle\n            userNote.informativeText = infoText\n            userNote.soundName = NSUserNotificationDefaultSoundName\n            \n            NSUserNotificationCenter.default.deliver(userNote)\n        }\n        \n        if let userInfo = (note as NSNotification).userInfo {\n            // 检查错误\n            if let error = userInfo[\"error\"] as? String {\n                sendNotify(\"Scan Failed\", \"\", error.localized)\n                return\n            }\n            \n            // 使用新的通知信息\n            let title = (userInfo[\"title\"] as? String) ?? \"\"\n            let subtitle = (userInfo[\"subtitle\"] as? String) ?? \"\"\n            let body = (userInfo[\"body\"] as? String) ?? \"\"\n            \n            let urls: [URL] = userInfo[\"urls\"] as! [URL]\n            let addCount = ServerProfileManager.instance.addServerProfileByURL(urls: urls)\n            \n            if addCount > 0 {\n                sendNotify(\n                    title.localized,\n                    subtitle.localized,\n                    \"Successfully added \\(addCount) server configuration(s)\".localized\n                )\n            } else {\n                sendNotify(\n                    title.localized,\n                    subtitle.localized,\n                    body.localized\n                )\n            }\n        }\n    }\n    \n    //------------------------------------------------------------\n    // NSUserNotificationCenterDelegate\n    \n    func userNotificationCenter(_ center: NSUserNotificationCenter\n        , shouldPresent notification: NSUserNotification) -> Bool {\n        return true\n    }\n    \n    \n    func makeToast(_ message: String) {\n        if toastWindowCtrl != nil {\n            toastWindowCtrl.close()\n        }\n        toastWindowCtrl = ToastWindowController(windowNibName: \"ToastWindowController\")\n        toastWindowCtrl.message = message\n        toastWindowCtrl.showWindow(self)\n        //NSApp.activate(ignoringOtherApps: true)\n        //toastWindowCtrl.window?.makeKeyAndOrderFront(self)\n        toastWindowCtrl.fadeInHud()\n    }\n}\n\n"
  },
  {
    "path": "ShadowsocksX-NG/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_16x16.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"16x16\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_16x16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_32x32.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"32x32\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_32x32@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_128x128.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"128x128\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_128x128@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_256x256.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"256x256\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_256x256@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_512x512.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"512x512\",\n      \"idiom\" : \"mac\",\n      \"filename\" : \"Icon_512x512@2x.png\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "ShadowsocksX-NG/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/ImportWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"ImportWindowController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"inputBox\" destination=\"EgI-Py-Op1\" id=\"zNx-W4-NkW\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Import Server URLs\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"544\" y=\"557\" width=\"680\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"680\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EgI-Py-Op1\">\n                        <rect key=\"frame\" x=\"20\" y=\"49\" width=\"640\" height=\"201\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"201\" id=\"Nj4-mV-JHl\"/>\n                        </constraints>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" placeholderString=\"Copy the shadowsocks URLs to here\" drawsBackground=\"YES\" id=\"h31-8G-f2d\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"doh-o9-XXh\">\n                        <rect key=\"frame\" x=\"516\" y=\"13\" width=\"150\" height=\"32\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"138\" id=\"uoX-dr-Ak1\"/>\n                        </constraints>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Import\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"EW8-ld-aGr\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"handleImport:\" target=\"-2\" id=\"Ch1-iY-BAo\"/>\n                        </connections>\n                    </button>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"EgI-Py-Op1\" firstAttribute=\"trailing\" secondItem=\"doh-o9-XXh\" secondAttribute=\"trailing\" id=\"K62-uO-jYd\"/>\n                    <constraint firstItem=\"EgI-Py-Op1\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"ghl-kH-ozW\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"EgI-Py-Op1\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"mTU-X2-mS7\"/>\n                    <constraint firstItem=\"EgI-Py-Op1\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"oet-Qd-ugX\"/>\n                    <constraint firstItem=\"doh-o9-XXh\" firstAttribute=\"top\" secondItem=\"EgI-Py-Op1\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"wZC-Am-Hdd\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/Localizable.strings",
    "content": "\n\n\n\n\n\n/*\n * SHARED STRINGS\n */\n\n/*\n * ./ShadowsocksX-NG/UserRulesController.swift\n */\n\n\"PAC has been updated by User Rules.\" = \"PAC has been updated by User Rules.\";\n\n\"It's failed to update PAC by User Rules.\" = \"It's failed to update PAC by User Rules.\";\n\n/*\n * ./ShadowsocksX-NG/AppDelegate.swift\n */\n\n\"Global Mode\" = \"Global Mode\";\n\n\"Manual Mode\" = \"Manual Mode\";\n\n\"Auto Mode By PAC\" = \"Auto Mode By PAC\";\n\n\"Shadowsocks: On\" = \"Shadowsocks: On\";\n\n\"Shadowsocks: Off\" = \"Shadowsocks: Off\";\n\n\"Export Command Copied.\" = \"Export Command Copied.\";\n\n\"Save Diagnosis to File\" = \"Save Diagnosis to File\";\n\n\"Servers\" = \"Servers\";\n\n\"Turn Shadowsocks Off\" = \"Turn Shadowsocks Off\";\n\n\"Turn Shadowsocks On\" = \"Turn Shadowsocks On\";\n\n\"By scan QR Code\" = \"By scan QR Code\";\n\n\"By handle SS URL\" = \"By handle SS URL\";\n\n\"By import from pasteboard\" = \"By import from pasteboard\";\n\n\"Add \\(addCount) Shadowsocks Server Profile\" = \"Add \\(addCount) Shadowsocks Server Profile\";\n\n\"Not found valid QRCode of shadowsocks profile\" = \"Not found valid QRCode of shadowsocks profile\";\n\n\"Not found valid URL of shadowsocks profile\" = \"Not found valid URL of shadowsocks profile\";\n\n/*\n * ./ShadowsocksX-NG/ShareServerProfilesWindowController.swift\n */\n\n\"Save QRCode As File\" = \"Save QRCode As File\";\n\n\"Save All Server URLs To File\" = \"Save All Server URLs To File\";\n\n/*\n * ./ShadowsocksX-NG/PACUtils.swift\n */\n\n\"PAC has been updated by latest GFW List.\" = \"PAC has been updated by latest GFW List.\";\n\n\"Failed to download latest GFW List.\" = \"Failed to download latest GFW List.\";\n\n/*\n * ./ShadowsocksX-NG/ImportWindowController.swift\n */\n\n\"Success to add \\(addCount) server.\" = \"Success to add \\(addCount) server.\";\n\n\"Not found valid shadowsocks server urls.\" = \"Not found valid shadowsocks server urls.\";\n\n/*\n * ./ShadowsocksX-NG/PreferencesWindowController.swift\n */\n\n\"New Server\" = \"New Server\";\n\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"NSApplication\">\n            <connections>\n                <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"GzC-gU-4Uq\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"autoModeMenuItem\" destination=\"r07-Gu-aEz\" id=\"9aH-pQ-Rgi\"/>\n                <outlet property=\"copyHttpProxyExportCmdLineMenuItem\" destination=\"lg6-To-GZA\" id=\"VTb-he-dg4\"/>\n                <outlet property=\"externalPACModeMenuItem\" destination=\"U9N-QS-BwB\" id=\"ING-P9-2Xz\"/>\n                <outlet property=\"globalModeMenuItem\" destination=\"Mw3-Jm-eXA\" id=\"ar5-Yx-3ze\"/>\n                <outlet property=\"manualModeMenuItem\" destination=\"8PR-gs-c5N\" id=\"9qz-mU-5kt\"/>\n                <outlet property=\"runningStatusMenuItem\" destination=\"fzk-mE-CEV\" id=\"Vwm-Rg-Ykn\"/>\n                <outlet property=\"scanQRCodeMenuItem\" destination=\"Qe6-bF-paT\" id=\"XHa-pa-nCa\"/>\n                <outlet property=\"serverProfilesBeginSeparatorMenuItem\" destination=\"4iN-w2-but\" id=\"Jyu-48-AzD\"/>\n                <outlet property=\"serverProfilesEndSeparatorMenuItem\" destination=\"3cf-dF-7dx\" id=\"eyc-6W-nWV\"/>\n                <outlet property=\"serversMenuItem\" destination=\"u5M-hQ-VSc\" id=\"8gp-SY-Y4U\"/>\n                <outlet property=\"statusMenu\" destination=\"Hob-KD-bx9\" id=\"clA-ZW-0pT\"/>\n                <outlet property=\"toggleRunningMenuItem\" destination=\"GSu-Tf-StS\" id=\"XHw-pU-nCa\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"YLy-65-1bz\" customClass=\"NSFontManager\"/>\n        <menu title=\"ShadowsocksX-NG\" autoenablesItems=\"NO\" id=\"Hob-KD-bx9\">\n            <items>\n                <menuItem title=\"Showsocks: On\" enabled=\"NO\" id=\"fzk-mE-CEV\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                </menuItem>\n                <menuItem title=\"Turn ShadowsocksX On\" keyEquivalent=\"s\" id=\"GSu-Tf-StS\">\n                    <connections>\n                        <action selector=\"toggleRunning:\" target=\"Voe-Tx-rLC\" id=\"EvE-23-Wiv\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"LXP-yK-yQu\"/>\n                <menuItem title=\"Auto Mode By PAC\" keyEquivalent=\"a\" id=\"r07-Gu-aEz\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"selectPACMode:\" target=\"Voe-Tx-rLC\" id=\"l36-cd-xl7\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Global Mode\" keyEquivalent=\"g\" id=\"Mw3-Jm-eXA\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"selectGlobalMode:\" target=\"Voe-Tx-rLC\" id=\"7QH-HB-B2e\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Manual Mode\" keyEquivalent=\"m\" id=\"8PR-gs-c5N\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"selectManualMode:\" target=\"Voe-Tx-rLC\" id=\"Xxb-28-6fi\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Auto Mode By External PAC\" id=\"U9N-QS-BwB\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"selectExternalPACMode:\" target=\"Voe-Tx-rLC\" id=\"LnX-Ec-hc4\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"BMf-0T-UcX\"/>\n                <menuItem title=\"Servers\" id=\"u5M-hQ-VSc\">\n                    <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\"/>\n                    <menu key=\"submenu\" title=\"Servers\" id=\"9Y1-db-3HK\">\n                        <items>\n                            <menuItem title=\"Server Preferences...\" keyEquivalent=\"e\" id=\"M5r-E7-44f\">\n                                <connections>\n                                    <action selector=\"editServerPreferences:\" target=\"Voe-Tx-rLC\" id=\"6Lv-6i-Neb\"/>\n                                </connections>\n                            </menuItem>\n                            <menuItem isSeparatorItem=\"YES\" id=\"4iN-w2-but\"/>\n                            <menuItem isSeparatorItem=\"YES\" id=\"3cf-dF-7dx\"/>\n                        </items>\n                    </menu>\n                </menuItem>\n                <menuItem title=\"Scan QR Code From Screen\" id=\"Qe6-bF-paT\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"scanQRCodeFromScreen:\" target=\"Voe-Tx-rLC\" id=\"zQZ-IT-H4a\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Import Server URLs...\" id=\"geG-dQ-OYl\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"showImportWindow:\" target=\"-1\" id=\"CsE-vW-Wcn\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Share Server Profiles...\" image=\"NSShareTemplate\" id=\"r5z-RB-LIZ\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"showShareServerProfiles:\" target=\"Voe-Tx-rLC\" id=\"3Qv-n1-5h1\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"vwY-hQ-ZIz\"/>\n                <menuItem title=\"Preferences...\" keyEquivalent=\",\" id=\"4CS-qD-zW5\">\n                    <connections>\n                        <action selector=\"showAllInOnePreferences:\" target=\"Voe-Tx-rLC\" id=\"2of-nZ-atc\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"HTTP Proxy Export Line To Pasteboard\" image=\"terminal-logo\" keyEquivalent=\"c\" id=\"lg6-To-GZA\">\n                    <connections>\n                        <action selector=\"copyExportCommand:\" target=\"Voe-Tx-rLC\" id=\"2U4-3M-sAK\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Update PAC from GFW List\" id=\"TFc-Ec-duM\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"updateGFWList:\" target=\"Voe-Tx-rLC\" id=\"Ztt-PS-F3T\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Edit User Rules For PAC...\" id=\"rms-p0-CvB\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"editUserRulesForPAC:\" target=\"Voe-Tx-rLC\" id=\"ZtK-2d-Pcl\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"DTJ-NF-Wxr\"/>\n                <menuItem title=\"Show Logs...\" id=\"Jfy-sf-Fhl\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"showLogs:\" target=\"Voe-Tx-rLC\" id=\"5FZ-Xo-DGb\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Export Diagnosis...\" id=\"eNh-vY-utd\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"exportDiagnosis:\" target=\"Voe-Tx-rLC\" id=\"YM9-l3-PHa\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Check for Updates...\" id=\"hLv-bp-doM\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"checkForUpdates:\" target=\"Voe-Tx-rLC\" id=\"rWL-H9-me8\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"Help\" id=\"Xg8-er-4Ov\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"showHelp:\" target=\"Voe-Tx-rLC\" id=\"Q7X-kb-TWD\"/>\n                    </connections>\n                </menuItem>\n                <menuItem title=\"About\" id=\"LgB-6g-Gba\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"showAbout:\" target=\"Voe-Tx-rLC\" id=\"ToP-D0-suY\"/>\n                    </connections>\n                </menuItem>\n                <menuItem isSeparatorItem=\"YES\" id=\"lSf-ni-kjo\"/>\n                <menuItem title=\"Quit\" keyEquivalent=\"q\" id=\"vJS-JW-byz\">\n                    <connections>\n                        <action selector=\"terminate:\" target=\"-2\" id=\"Mrp-4z-omR\"/>\n                    </connections>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"-2367\" y=\"-139\"/>\n        </menu>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"jhL-aG-BFA\"/>\n    </objects>\n    <resources>\n        <image name=\"NSShareTemplate\" width=\"11\" height=\"16\"/>\n        <image name=\"terminal-logo\" width=\"22.695652008056641\" height=\"17.217391967773438\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/PreferencesWinController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"15400\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"15400\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"PreferencesWinController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"tabView\" destination=\"h22-uy-K1x\" id=\"yH1-8m-Qpe\"/>\n                <outlet property=\"toolbar\" destination=\"D9u-IW-4jN\" id=\"Q34-fm-M45\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Preferences\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"609\" y=\"533\" width=\"480\" height=\"326\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" misplaced=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"479\" height=\"326\"/>\n                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                <subviews>\n                    <tabView type=\"noTabsNoBorder\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"h22-uy-K1x\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"326\"/>\n                        <font key=\"font\" metaFont=\"system\"/>\n                        <tabViewItems>\n                            <tabViewItem label=\"General\" identifier=\"general\" id=\"xbG-eW-Prj\">\n                                <view key=\"view\" id=\"78E-rb-Ecu\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"479\" height=\"326\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3eT-fn-moA\" customClass=\"MASShortcutView\">\n                                            <rect key=\"frame\" x=\"240\" y=\"228\" width=\"163\" height=\"20\"/>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"associatedUserDefaultsKey\" value=\"SwitchProxyMode\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                        <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pbX-DJ-7mU\" customClass=\"MASShortcutView\">\n                                            <rect key=\"frame\" x=\"240\" y=\"256\" width=\"163\" height=\"20\"/>\n                                            <userDefinedRuntimeAttributes>\n                                                <userDefinedRuntimeAttribute type=\"string\" keyPath=\"associatedUserDefaultsKey\" value=\"ToggleRunning\"/>\n                                            </userDefinedRuntimeAttributes>\n                                        </customView>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"q90-qj-BXy\">\n                                            <rect key=\"frame\" x=\"18\" y=\"230\" width=\"216\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Switch proxy mode:\" id=\"BaL-cn-m8v\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hbS-Ox-rTR\">\n                                            <rect key=\"frame\" x=\"18\" y=\"258\" width=\"216\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"Toggle Shadowsocks On/Off:\" id=\"95S-ma-8Q7\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Q6E-ur-aIL\">\n                                            <rect key=\"frame\" x=\"18\" y=\"290\" width=\"120\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Launch At Login\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"XJx-j4-bBr\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"YAC-3k-qMR\" name=\"value\" keyPath=\"launchAtLogin\" id=\"lF3-G5-F0w\"/>\n                                            </connections>\n                                        </button>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nKV-Vh-uaW\">\n                                            <rect key=\"frame\" x=\"315\" y=\"13\" width=\"151\" height=\"32\"/>\n                                            <buttonCell key=\"cell\" type=\"push\" title=\"Reset Preferences\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"mQC-AR-HXC\">\n                                                <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <action selector=\"resetAllPreferencesWithSender:\" target=\"-2\" id=\"uck-d4-Zun\"/>\n                                            </connections>\n                                        </button>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Jbe-9l-xF4\">\n                                            <rect key=\"frame\" x=\"18\" y=\"149\" width=\"92\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"left\" title=\"GFW List URL:\" id=\"v7a-wf-aEm\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"71I-66-7Vm\">\n                                            <rect key=\"frame\" x=\"20\" y=\"96\" width=\"440\" height=\"45\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"45\" id=\"iCq-yU-Y2M\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"left\" drawsBackground=\"YES\" id=\"YqN-0f-ODA\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.GFWListURL\" id=\"Rqt-XM-aCE\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                            </connections>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"P6I-yN-chl\">\n                                            <rect key=\"frame\" x=\"18\" y=\"204\" width=\"281\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"The mode will be switched to by the shortcut:\" id=\"JZn-Si-mym\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WCm-yO-4iG\">\n                                            <rect key=\"frame\" x=\"18\" y=\"180\" width=\"48\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"PAC\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"LtL-Fu-qXy\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.EnableSwitchMode.PAC\" id=\"8Ud-4g-FJA\"/>\n                                            </connections>\n                                        </button>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3IG-rd-b11\">\n                                            <rect key=\"frame\" x=\"132\" y=\"180\" width=\"61\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Global\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"aAp-dI-e5Q\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.EnableSwitchMode.Global\" id=\"fwM-0H-0RB\"/>\n                                            </connections>\n                                        </button>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Rhd-R5-G5h\">\n                                            <rect key=\"frame\" x=\"238\" y=\"180\" width=\"66\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Manual\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"HEX-K9-W2f\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.EnableSwitchMode.Manual\" id=\"C3s-U6-qkc\"/>\n                                            </connections>\n                                        </button>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Bb7-im-uLW\">\n                                            <rect key=\"frame\" x=\"362\" y=\"180\" width=\"100\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"External PAC\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"wQp-fv-2mb\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.EnableSwitchMode.ExternalPAC\" id=\"RpF-o3-gZh\"/>\n                                            </connections>\n                                        </button>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"Rhd-R5-G5h\" firstAttribute=\"baseline\" secondItem=\"Bb7-im-uLW\" secondAttribute=\"baseline\" id=\"1yr-EN-h3l\"/>\n                                        <constraint firstItem=\"3IG-rd-b11\" firstAttribute=\"leading\" secondItem=\"WCm-yO-4iG\" secondAttribute=\"trailing\" constant=\"70\" id=\"22p-Tc-rHc\"/>\n                                        <constraint firstItem=\"hbS-Ox-rTR\" firstAttribute=\"centerY\" secondItem=\"pbX-DJ-7mU\" secondAttribute=\"centerY\" id=\"2P5-T2-RkV\"/>\n                                        <constraint firstItem=\"Jbe-9l-xF4\" firstAttribute=\"top\" secondItem=\"WCm-yO-4iG\" secondAttribute=\"bottom\" constant=\"17\" id=\"5ej-R0-r46\"/>\n                                        <constraint firstItem=\"Bb7-im-uLW\" firstAttribute=\"leading\" secondItem=\"Rhd-R5-G5h\" secondAttribute=\"trailing\" constant=\"62\" id=\"5kp-aA-o9G\"/>\n                                        <constraint firstItem=\"3IG-rd-b11\" firstAttribute=\"baseline\" secondItem=\"Rhd-R5-G5h\" secondAttribute=\"baseline\" id=\"6vf-yU-5hh\"/>\n                                        <constraint firstItem=\"71I-66-7Vm\" firstAttribute=\"top\" secondItem=\"Jbe-9l-xF4\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"DI0-F3-nPx\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"nKV-Vh-uaW\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"Dbi-Kv-Prd\"/>\n                                        <constraint firstItem=\"3eT-fn-moA\" firstAttribute=\"top\" secondItem=\"pbX-DJ-7mU\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"DyC-vv-4hm\"/>\n                                        <constraint firstItem=\"Q6E-ur-aIL\" firstAttribute=\"leading\" secondItem=\"hbS-Ox-rTR\" secondAttribute=\"leading\" id=\"Hpf-nE-hPy\"/>\n                                        <constraint firstItem=\"3eT-fn-moA\" firstAttribute=\"leading\" secondItem=\"q90-qj-BXy\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"Ikf-Jk-Tz6\"/>\n                                        <constraint firstItem=\"WCm-yO-4iG\" firstAttribute=\"top\" secondItem=\"P6I-yN-chl\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"O9s-j5-mi9\"/>\n                                        <constraint firstItem=\"WCm-yO-4iG\" firstAttribute=\"baseline\" secondItem=\"3IG-rd-b11\" secondAttribute=\"baseline\" id=\"PIh-fb-Tzm\"/>\n                                        <constraint firstItem=\"Q6E-ur-aIL\" firstAttribute=\"leading\" secondItem=\"78E-rb-Ecu\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"PYb-Gf-rr5\"/>\n                                        <constraint firstItem=\"hbS-Ox-rTR\" firstAttribute=\"top\" secondItem=\"Q6E-ur-aIL\" secondAttribute=\"bottom\" constant=\"18\" id=\"T6H-PC-XvB\"/>\n                                        <constraint firstItem=\"hbS-Ox-rTR\" firstAttribute=\"leading\" secondItem=\"q90-qj-BXy\" secondAttribute=\"leading\" id=\"TBQ-sz-KTB\"/>\n                                        <constraint firstItem=\"Jbe-9l-xF4\" firstAttribute=\"leading\" secondItem=\"71I-66-7Vm\" secondAttribute=\"leading\" id=\"Tex-pk-ZD5\"/>\n                                        <constraint firstItem=\"q90-qj-BXy\" firstAttribute=\"centerY\" secondItem=\"3eT-fn-moA\" secondAttribute=\"centerY\" id=\"VZw-mA-zAc\"/>\n                                        <constraint firstItem=\"P6I-yN-chl\" firstAttribute=\"top\" secondItem=\"q90-qj-BXy\" secondAttribute=\"bottom\" constant=\"10\" id=\"Wp6-vh-c45\"/>\n                                        <constraint firstItem=\"WCm-yO-4iG\" firstAttribute=\"leading\" secondItem=\"Jbe-9l-xF4\" secondAttribute=\"leading\" id=\"Y0x-fT-GRh\"/>\n                                        <constraint firstItem=\"71I-66-7Vm\" firstAttribute=\"trailing\" secondItem=\"nKV-Vh-uaW\" secondAttribute=\"trailing\" id=\"YMU-yy-gfG\"/>\n                                        <constraint firstItem=\"pbX-DJ-7mU\" firstAttribute=\"leading\" secondItem=\"hbS-Ox-rTR\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"bDi-Yo-gUu\"/>\n                                        <constraint firstItem=\"q90-qj-BXy\" firstAttribute=\"top\" secondItem=\"hbS-Ox-rTR\" secondAttribute=\"bottom\" constant=\"12\" id=\"cgo-tr-moS\"/>\n                                        <constraint firstItem=\"P6I-yN-chl\" firstAttribute=\"leading\" secondItem=\"WCm-yO-4iG\" secondAttribute=\"leading\" id=\"crm-aD-7SO\"/>\n                                        <constraint firstItem=\"pbX-DJ-7mU\" firstAttribute=\"leading\" secondItem=\"3eT-fn-moA\" secondAttribute=\"leading\" id=\"dxN-Bw-raD\"/>\n                                        <constraint firstItem=\"Q6E-ur-aIL\" firstAttribute=\"top\" secondItem=\"78E-rb-Ecu\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"fS2-Xh-qxI\"/>\n                                        <constraint firstItem=\"Rhd-R5-G5h\" firstAttribute=\"leading\" secondItem=\"3IG-rd-b11\" secondAttribute=\"trailing\" constant=\"49\" id=\"lmS-0A-XJL\"/>\n                                        <constraint firstItem=\"P6I-yN-chl\" firstAttribute=\"top\" secondItem=\"3eT-fn-moA\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"oXD-FV-cSV\"/>\n                                        <constraint firstItem=\"pbX-DJ-7mU\" firstAttribute=\"trailing\" secondItem=\"3eT-fn-moA\" secondAttribute=\"trailing\" id=\"osE-Ta-cCX\"/>\n                                        <constraint firstItem=\"q90-qj-BXy\" firstAttribute=\"leading\" secondItem=\"P6I-yN-chl\" secondAttribute=\"leading\" id=\"wYd-Ib-vG5\"/>\n                                        <constraint firstItem=\"3eT-fn-moA\" firstAttribute=\"leading\" secondItem=\"Rhd-R5-G5h\" secondAttribute=\"leading\" id=\"y5S-xd-IIK\"/>\n                                        <constraint firstItem=\"Bb7-im-uLW\" firstAttribute=\"trailing\" secondItem=\"71I-66-7Vm\" secondAttribute=\"trailing\" id=\"zPo-Sm-LX1\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"pbX-DJ-7mU\" secondAttribute=\"trailing\" constant=\"76\" id=\"zw4-bz-JLZ\"/>\n                                    </constraints>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"Advance\" identifier=\"adv\" id=\"ksf-9b-qoz\" userLabel=\"Advanced\">\n                                <view key=\"view\" id=\"Pc1-f7-0zA\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"326\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"r8z-mM-M0X\">\n                                            <rect key=\"frame\" x=\"35\" y=\"257\" width=\"181\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Local Socks5 Listen Port:\" id=\"8fk-fw-Tsx\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c8B-qf-UNK\">\n                                            <rect key=\"frame\" x=\"35\" y=\"288\" width=\"181\" height=\"16\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"177\" id=\"37M-JU-n0c\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Local Socks5 Listen Address:\" id=\"jkc-e3-4O0\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cd8-PU-OwG\">\n                                            <rect key=\"frame\" x=\"222\" y=\"285\" width=\"238\" height=\"21\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"LBl-2M-X7O\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalSocks5.ListenAddress\" id=\"UR8-Hk-Nyh\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                            </connections>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MvY-R0-1FU\">\n                                            <rect key=\"frame\" x=\"35\" y=\"164\" width=\"181\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Timeout:\" id=\"sQ9-bj-V0I\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zfl-10-Wdk\">\n                                            <rect key=\"frame\" x=\"222\" y=\"161\" width=\"60\" height=\"21\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"Ity-ir-Fyi\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalSocks5.Timeout\" id=\"gut-fs-P9y\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                                <outlet property=\"formatter\" destination=\"2LX-ic-DJh\" id=\"xUL-JA-BJu\"/>\n                                            </connections>\n                                        </textField>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tGd-pe-2xJ\">\n                                            <rect key=\"frame\" x=\"220\" y=\"137\" width=\"154\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Enable UDP Relay\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"R3v-iN-zu8\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalSocks5.EnableUDPRelay\" id=\"aYQ-xT-BcZ\"/>\n                                            </connections>\n                                        </button>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2rw-0u-LXJ\">\n                                            <rect key=\"frame\" x=\"222\" y=\"254\" width=\"60\" height=\"21\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"60\" id=\"afC-Ya-WgP\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"MV1-4D-sap\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalSocks5.ListenPort\" id=\"m5T-YP-Pyp\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                                <outlet property=\"formatter\" destination=\"C7t-aU-bub\" id=\"ANT-yN-RZL\"/>\n                                            </connections>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"a60-LH-adV\">\n                                            <rect key=\"frame\" x=\"288\" y=\"164\" width=\"119\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Seconds\" id=\"4R2-UO-qs7\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RcT-mn-xqK\">\n                                            <rect key=\"frame\" x=\"220\" y=\"117\" width=\"154\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Enable Verbose Mode\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"cIS-Wb-Rzg\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalSocks5.EnableVerboseMode\" id=\"iOb-fx-G7F\"/>\n                                            </connections>\n                                        </button>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RYj-h6-uAT\">\n                                            <rect key=\"frame\" x=\"35\" y=\"195\" width=\"181\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Local PAC Server Listen Port:\" id=\"IMQ-c4-gmc\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KXG-O0-ake\">\n                                            <rect key=\"frame\" x=\"222\" y=\"192\" width=\"60\" height=\"21\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"T9o-Og-neF\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.PacServer.ListenPort\" id=\"EkJ-YG-WZk\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                                <outlet property=\"formatter\" destination=\"C7t-aU-bub\" id=\"3M6-FE-SDQ\"/>\n                                            </connections>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kjx-TJ-4n3\">\n                                            <rect key=\"frame\" x=\"20\" y=\"66\" width=\"352\" height=\"21\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"8u6-Mz-FmD\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.ExternalPACURL\" id=\"Txm-wz-loc\"/>\n                                                <outlet property=\"formatter\" destination=\"TUK-vL-Gf1\" id=\"P0K-qn-jbx\"/>\n                                            </connections>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4xg-iR-B4f\">\n                                            <rect key=\"frame\" x=\"18\" y=\"95\" width=\"115\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"External PAC URL:\" id=\"kBe-eq-uZL\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"67s-wg-2Sy\">\n                                            <rect key=\"frame\" x=\"220\" y=\"224\" width=\"237\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Local PAC Server Bind To Localhost\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"oCf-id-PAx\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <connections>\n                                                    <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.PacServer.BindToLocalhost\" id=\"Yar-rA-DFY\"/>\n                                                </connections>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.PacServer.BindToLocalhost\" id=\"BDg-Bb-qTa\"/>\n                                            </connections>\n                                        </button>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"RYj-h6-uAT\" firstAttribute=\"leading\" secondItem=\"MvY-R0-1FU\" secondAttribute=\"leading\" id=\"1aA-6v-Q8B\"/>\n                                        <constraint firstItem=\"2rw-0u-LXJ\" firstAttribute=\"trailing\" secondItem=\"KXG-O0-ake\" secondAttribute=\"trailing\" id=\"2sM-Ud-zaK\"/>\n                                        <constraint firstItem=\"Zfl-10-Wdk\" firstAttribute=\"leading\" secondItem=\"MvY-R0-1FU\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"72a-tV-4gM\"/>\n                                        <constraint firstItem=\"r8z-mM-M0X\" firstAttribute=\"leading\" secondItem=\"RYj-h6-uAT\" secondAttribute=\"leading\" id=\"7dL-ac-PRT\"/>\n                                        <constraint firstItem=\"67s-wg-2Sy\" firstAttribute=\"top\" secondItem=\"2rw-0u-LXJ\" secondAttribute=\"bottom\" constant=\"14\" id=\"8FC-1g-GY6\"/>\n                                        <constraint firstItem=\"r8z-mM-M0X\" firstAttribute=\"baseline\" secondItem=\"2rw-0u-LXJ\" secondAttribute=\"baseline\" id=\"Avs-sU-9rl\"/>\n                                        <constraint firstItem=\"cd8-PU-OwG\" firstAttribute=\"leading\" secondItem=\"c8B-qf-UNK\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"BRO-xg-HnA\"/>\n                                        <constraint firstItem=\"cd8-PU-OwG\" firstAttribute=\"leading\" secondItem=\"2rw-0u-LXJ\" secondAttribute=\"leading\" id=\"ByT-YT-4YP\"/>\n                                        <constraint firstItem=\"kjx-TJ-4n3\" firstAttribute=\"top\" secondItem=\"RcT-mn-xqK\" secondAttribute=\"bottom\" constant=\"32\" id=\"DhD-hY-Hei\"/>\n                                        <constraint firstItem=\"tGd-pe-2xJ\" firstAttribute=\"top\" secondItem=\"Zfl-10-Wdk\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"ERy-Kz-wm9\"/>\n                                        <constraint firstItem=\"c8B-qf-UNK\" firstAttribute=\"leading\" secondItem=\"Pc1-f7-0zA\" secondAttribute=\"leading\" constant=\"37\" id=\"FC0-Uf-JHj\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"a60-LH-adV\" secondAttribute=\"trailing\" constant=\"75\" id=\"Gid-Dg-5o3\"/>\n                                        <constraint firstItem=\"RcT-mn-xqK\" firstAttribute=\"trailing\" secondItem=\"kjx-TJ-4n3\" secondAttribute=\"trailing\" id=\"JIF-rX-Yva\"/>\n                                        <constraint firstItem=\"c8B-qf-UNK\" firstAttribute=\"baseline\" secondItem=\"cd8-PU-OwG\" secondAttribute=\"baseline\" id=\"NZe-9h-P0V\"/>\n                                        <constraint firstItem=\"Zfl-10-Wdk\" firstAttribute=\"baseline\" secondItem=\"a60-LH-adV\" secondAttribute=\"baseline\" id=\"PM4-3S-XXa\"/>\n                                        <constraint firstItem=\"KXG-O0-ake\" firstAttribute=\"leading\" secondItem=\"Zfl-10-Wdk\" secondAttribute=\"leading\" id=\"S1b-KD-JDg\"/>\n                                        <constraint firstItem=\"c8B-qf-UNK\" firstAttribute=\"leading\" secondItem=\"r8z-mM-M0X\" secondAttribute=\"leading\" id=\"VDu-iy-6vK\"/>\n                                        <constraint firstItem=\"4xg-iR-B4f\" firstAttribute=\"leading\" secondItem=\"Pc1-f7-0zA\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"VJI-th-aeN\"/>\n                                        <constraint firstItem=\"RcT-mn-xqK\" firstAttribute=\"top\" secondItem=\"tGd-pe-2xJ\" secondAttribute=\"bottom\" constant=\"6\" symbolic=\"YES\" id=\"WlH-NJ-RUt\"/>\n                                        <constraint firstItem=\"tGd-pe-2xJ\" firstAttribute=\"leading\" secondItem=\"RcT-mn-xqK\" secondAttribute=\"leading\" id=\"YLA-i2-7Fi\"/>\n                                        <constraint firstItem=\"KXG-O0-ake\" firstAttribute=\"top\" secondItem=\"67s-wg-2Sy\" secondAttribute=\"bottom\" constant=\"13\" id=\"ZIU-je-F0U\"/>\n                                        <constraint firstItem=\"Zfl-10-Wdk\" firstAttribute=\"top\" secondItem=\"KXG-O0-ake\" secondAttribute=\"bottom\" constant=\"10\" symbolic=\"YES\" id=\"ahT-23-auY\"/>\n                                        <constraint firstItem=\"4xg-iR-B4f\" firstAttribute=\"leading\" secondItem=\"kjx-TJ-4n3\" secondAttribute=\"leading\" id=\"aoH-EQ-rvn\"/>\n                                        <constraint firstItem=\"a60-LH-adV\" firstAttribute=\"leading\" secondItem=\"Zfl-10-Wdk\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"bOO-HZ-pGJ\"/>\n                                        <constraint firstItem=\"MvY-R0-1FU\" firstAttribute=\"baseline\" secondItem=\"Zfl-10-Wdk\" secondAttribute=\"baseline\" id=\"cTU-sU-Hbg\"/>\n                                        <constraint firstItem=\"Zfl-10-Wdk\" firstAttribute=\"leading\" secondItem=\"tGd-pe-2xJ\" secondAttribute=\"leading\" id=\"fOM-N9-QWD\"/>\n                                        <constraint firstItem=\"RYj-h6-uAT\" firstAttribute=\"baseline\" secondItem=\"KXG-O0-ake\" secondAttribute=\"baseline\" id=\"hAh-N6-Vph\"/>\n                                        <constraint firstItem=\"67s-wg-2Sy\" firstAttribute=\"leading\" secondItem=\"KXG-O0-ake\" secondAttribute=\"leading\" id=\"isi-Hl-Asv\"/>\n                                        <constraint firstItem=\"tGd-pe-2xJ\" firstAttribute=\"trailing\" secondItem=\"RcT-mn-xqK\" secondAttribute=\"trailing\" id=\"j1r-Q0-FKa\"/>\n                                        <constraint firstItem=\"cd8-PU-OwG\" firstAttribute=\"top\" secondItem=\"Pc1-f7-0zA\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"l9o-ay-eyU\"/>\n                                        <constraint firstItem=\"2rw-0u-LXJ\" firstAttribute=\"top\" secondItem=\"cd8-PU-OwG\" secondAttribute=\"bottom\" constant=\"10\" symbolic=\"YES\" id=\"n0x-Ms-zP0\"/>\n                                        <constraint firstItem=\"kjx-TJ-4n3\" firstAttribute=\"top\" secondItem=\"4xg-iR-B4f\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"qo9-qW-tK8\"/>\n                                        <constraint firstItem=\"2rw-0u-LXJ\" firstAttribute=\"leading\" secondItem=\"r8z-mM-M0X\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"rEO-dX-nm4\"/>\n                                        <constraint firstItem=\"KXG-O0-ake\" firstAttribute=\"trailing\" secondItem=\"Zfl-10-Wdk\" secondAttribute=\"trailing\" id=\"usG-2D-Jps\"/>\n                                        <constraint firstItem=\"2rw-0u-LXJ\" firstAttribute=\"leading\" secondItem=\"67s-wg-2Sy\" secondAttribute=\"leading\" id=\"vXT-hO-fLs\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"cd8-PU-OwG\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"zrF-jX-3fl\"/>\n                                    </constraints>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"HTTP\" identifier=\"http\" id=\"F5Q-Ce-JJN\">\n                                <view key=\"view\" id=\"kK3-29-KeI\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"479\" height=\"326\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XI2-x3-9ie\">\n                                            <rect key=\"frame\" x=\"18\" y=\"288\" width=\"217\" height=\"16\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"213\" id=\"pd4-On-JhI\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"HTTP Proxy Listen Address:\" id=\"6W4-TY-Bw5\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"URa-Z3-BgW\">\n                                            <rect key=\"frame\" x=\"18\" y=\"257\" width=\"217\" height=\"16\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"HTTP Proxy Listen Port:\" id=\"Ww9-j9-WYR\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A8G-1x-YxA\">\n                                            <rect key=\"frame\" x=\"247\" y=\"285\" width=\"213\" height=\"21\"/>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"p6k-oG-17u\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalHTTP.ListenAddress\" id=\"OWW-xe-Axa\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                            </connections>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OoG-C4-oji\">\n                                            <rect key=\"frame\" x=\"247\" y=\"254\" width=\"70\" height=\"21\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"70\" id=\"xcK-p4-AFO\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"0bX-LS-7QW\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalHTTP.ListenPort\" id=\"ehW-40-ivo\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                                <outlet property=\"formatter\" destination=\"C7t-aU-bub\" id=\"I35-3e-hTk\"/>\n                                            </connections>\n                                        </textField>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xWf-Bw-9V9\">\n                                            <rect key=\"frame\" x=\"30\" y=\"220\" width=\"138\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"HTTP Proxy Enable\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"jr6-x7-WJD\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalHTTPOn\" id=\"Be3-2x-hs4\"/>\n                                            </connections>\n                                        </button>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ee3-wg-WSi\">\n                                            <rect key=\"frame\" x=\"30\" y=\"186\" width=\"371\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Set HTTP proxy to system proxy configure in global mode\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"m8L-D6-ye3\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.LocalHTTP.FollowGlobal\" id=\"J5j-AM-zeV\"/>\n                                            </connections>\n                                        </button>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"URa-Z3-BgW\" firstAttribute=\"baseline\" secondItem=\"OoG-C4-oji\" secondAttribute=\"baseline\" id=\"Aj1-X9-AaX\"/>\n                                        <constraint firstItem=\"xWf-Bw-9V9\" firstAttribute=\"leading\" secondItem=\"Ee3-wg-WSi\" secondAttribute=\"leading\" id=\"D5c-Hf-hbn\"/>\n                                        <constraint firstItem=\"XI2-x3-9ie\" firstAttribute=\"baseline\" secondItem=\"A8G-1x-YxA\" secondAttribute=\"baseline\" id=\"GBh-Wy-StZ\"/>\n                                        <constraint firstItem=\"Ee3-wg-WSi\" firstAttribute=\"top\" secondItem=\"xWf-Bw-9V9\" secondAttribute=\"bottom\" constant=\"20\" id=\"MRV-c0-DsH\"/>\n                                        <constraint firstItem=\"XI2-x3-9ie\" firstAttribute=\"trailing\" secondItem=\"URa-Z3-BgW\" secondAttribute=\"trailing\" id=\"Ndh-r0-5BA\"/>\n                                        <constraint firstAttribute=\"trailing\" secondItem=\"A8G-1x-YxA\" secondAttribute=\"trailing\" constant=\"19\" id=\"P7w-PO-lyw\"/>\n                                        <constraint firstItem=\"A8G-1x-YxA\" firstAttribute=\"leading\" secondItem=\"OoG-C4-oji\" secondAttribute=\"leading\" id=\"R8T-f7-dn2\"/>\n                                        <constraint firstItem=\"A8G-1x-YxA\" firstAttribute=\"top\" secondItem=\"kK3-29-KeI\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"aXD-oD-GcI\"/>\n                                        <constraint firstItem=\"A8G-1x-YxA\" firstAttribute=\"leading\" secondItem=\"XI2-x3-9ie\" secondAttribute=\"trailing\" constant=\"14\" id=\"c1Q-No-GbX\"/>\n                                        <constraint firstItem=\"OoG-C4-oji\" firstAttribute=\"top\" secondItem=\"A8G-1x-YxA\" secondAttribute=\"bottom\" constant=\"10\" symbolic=\"YES\" id=\"g7t-rt-dUV\"/>\n                                        <constraint firstItem=\"XI2-x3-9ie\" firstAttribute=\"leading\" secondItem=\"URa-Z3-BgW\" secondAttribute=\"leading\" id=\"mZ6-ha-7XJ\"/>\n                                        <constraint firstItem=\"xWf-Bw-9V9\" firstAttribute=\"leading\" secondItem=\"kK3-29-KeI\" secondAttribute=\"leading\" constant=\"32\" id=\"nh8-k4-cWC\"/>\n                                        <constraint firstItem=\"XI2-x3-9ie\" firstAttribute=\"leading\" secondItem=\"kK3-29-KeI\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"wbx-Xy-yfh\"/>\n                                        <constraint firstItem=\"xWf-Bw-9V9\" firstAttribute=\"top\" secondItem=\"URa-Z3-BgW\" secondAttribute=\"bottom\" constant=\"21\" id=\"ysE-Xx-EKD\"/>\n                                    </constraints>\n                                </view>\n                            </tabViewItem>\n                            <tabViewItem label=\"Interfaces\" identifier=\"interfaces\" id=\"eDR-CZ-P4p\">\n                                <view key=\"view\" misplaced=\"YES\" id=\"Ati-LQ-RB7\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"479\" height=\"326\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <button translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"x9X-2w-cOy\">\n                                            <rect key=\"frame\" x=\"18\" y=\"241\" width=\"114\" height=\"18\"/>\n                                            <buttonCell key=\"cell\" type=\"check\" title=\"Auto Configure\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"bu3-s5-bYM\">\n                                                <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.AutoConfigureNetworkServices\" id=\"lqW-ja-MOj\"/>\n                                            </connections>\n                                        </button>\n                                        <scrollView autohidesScrollers=\"YES\" horizontalLineScroll=\"19\" horizontalPageScroll=\"10\" verticalLineScroll=\"19\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dGc-zC-AYJ\">\n                                            <rect key=\"frame\" x=\"20\" y=\"111\" width=\"440\" height=\"119\"/>\n                                            <clipView key=\"contentView\" id=\"9Wy-0J-wQ8\">\n                                                <rect key=\"frame\" x=\"1\" y=\"1\" width=\"438\" height=\"117\"/>\n                                                <autoresizingMask key=\"autoresizingMask\"/>\n                                                <subviews>\n                                                    <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"lastColumnOnly\" columnSelection=\"YES\" multipleSelection=\"NO\" autosaveColumns=\"NO\" id=\"Vp3-dp-iqv\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"438\" height=\"117\"/>\n                                                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                        <size key=\"intercellSpacing\" width=\"3\" height=\"2\"/>\n                                                        <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        <tableColumns>\n                                                            <tableColumn width=\"435\" minWidth=\"40\" maxWidth=\"1000\" id=\"4CL-dk-HUu\">\n                                                                <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                                    <font key=\"font\" metaFont=\"menu\" size=\"11\"/>\n                                                                    <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                    <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                </tableHeaderCell>\n                                                                <buttonCell key=\"dataCell\" type=\"check\" title=\"Check\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"8Ku-VV-ZaY\">\n                                                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                                                    <font key=\"font\" metaFont=\"system\"/>\n                                                                </buttonCell>\n                                                                <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                                            </tableColumn>\n                                                        </tableColumns>\n                                                        <connections>\n                                                            <binding destination=\"uQz-5y-ZL2\" name=\"enabled\" keyPath=\"values.AutoConfigureNetworkServices\" id=\"h72-DX-clT\">\n                                                                <dictionary key=\"options\">\n                                                                    <string key=\"NSValueTransformerName\">NSNegateBoolean</string>\n                                                                </dictionary>\n                                                            </binding>\n                                                            <outlet property=\"dataSource\" destination=\"2Fn-b8-1pQ\" id=\"Ri8-L6-adR\"/>\n                                                            <outlet property=\"delegate\" destination=\"2Fn-b8-1pQ\" id=\"w7K-z3-I2P\"/>\n                                                        </connections>\n                                                    </tableView>\n                                                </subviews>\n                                            </clipView>\n                                            <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"FHm-ib-d94\">\n                                                <rect key=\"frame\" x=\"-7\" y=\"-14\" width=\"0.0\" height=\"15\"/>\n                                                <autoresizingMask key=\"autoresizingMask\"/>\n                                            </scroller>\n                                            <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"sEE-Wn-Fcs\">\n                                                <rect key=\"frame\" x=\"94\" y=\"1\" width=\"15\" height=\"0.0\"/>\n                                                <autoresizingMask key=\"autoresizingMask\"/>\n                                            </scroller>\n                                        </scrollView>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fMc-SG-EDy\">\n                                            <rect key=\"frame\" x=\"18\" y=\"265\" width=\"444\" height=\"41\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"41\" id=\"8Tc-8R-1jj\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"Which network interfaces proxy setting would be controlled by ShadowsocksX-NG\" id=\"t0I-6n-gnu\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1lH-rX-WZT\">\n                                            <rect key=\"frame\" x=\"18\" y=\"78\" width=\"373\" height=\"16\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"369\" id=\"uWk-mY-ajK\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"Bypass proxy settings for these Hosts &amp; Domains:\" id=\"v4F-L4-s8U\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                        </textField>\n                                        <textField verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"N84-AY-ecA\">\n                                            <rect key=\"frame\" x=\"20\" y=\"20\" width=\"440\" height=\"45\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"45\" id=\"R7N-ad-q8p\"/>\n                                            </constraints>\n                                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"g2Z-r8-ipF\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <connections>\n                                                <binding destination=\"uQz-5y-ZL2\" name=\"value\" keyPath=\"values.ProxyExceptions\" id=\"Cjp-zo-o6K\">\n                                                    <dictionary key=\"options\">\n                                                        <bool key=\"NSContinuouslyUpdatesValue\" value=\"YES\"/>\n                                                    </dictionary>\n                                                </binding>\n                                            </connections>\n                                        </textField>\n                                        <button horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qG0-rB-6MR\">\n                                            <rect key=\"frame\" x=\"391\" y=\"68\" width=\"75\" height=\"32\"/>\n                                            <buttonCell key=\"cell\" type=\"push\" title=\"Reset\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Afd-bH-wOk\">\n                                                <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                            </buttonCell>\n                                            <connections>\n                                                <action selector=\"resetProxyExceptionsWithSender:\" target=\"-2\" id=\"cUx-aD-yJN\"/>\n                                            </connections>\n                                        </button>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"dGc-zC-AYJ\" firstAttribute=\"top\" secondItem=\"x9X-2w-cOy\" secondAttribute=\"bottom\" constant=\"13\" id=\"5jW-Mo-Pc5\"/>\n                                        <constraint firstItem=\"x9X-2w-cOy\" firstAttribute=\"leading\" secondItem=\"dGc-zC-AYJ\" secondAttribute=\"leading\" id=\"7eE-eY-Whe\"/>\n                                        <constraint firstItem=\"dGc-zC-AYJ\" firstAttribute=\"leading\" secondItem=\"1lH-rX-WZT\" secondAttribute=\"leading\" id=\"DH7-r8-mwZ\"/>\n                                        <constraint firstItem=\"1lH-rX-WZT\" firstAttribute=\"leading\" secondItem=\"N84-AY-ecA\" secondAttribute=\"leading\" id=\"GgB-L7-cW8\"/>\n                                        <constraint firstItem=\"fMc-SG-EDy\" firstAttribute=\"leading\" secondItem=\"x9X-2w-cOy\" secondAttribute=\"leading\" id=\"HtT-3a-mit\"/>\n                                        <constraint firstItem=\"dGc-zC-AYJ\" firstAttribute=\"trailing\" secondItem=\"qG0-rB-6MR\" secondAttribute=\"trailing\" id=\"Hvf-rM-FRI\"/>\n                                        <constraint firstItem=\"qG0-rB-6MR\" firstAttribute=\"trailing\" secondItem=\"N84-AY-ecA\" secondAttribute=\"trailing\" id=\"Q6X-Sp-lFi\"/>\n                                        <constraint firstItem=\"qG0-rB-6MR\" firstAttribute=\"leading\" secondItem=\"1lH-rX-WZT\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"c5y-iA-dyS\"/>\n                                        <constraint firstItem=\"fMc-SG-EDy\" firstAttribute=\"leading\" secondItem=\"Ati-LQ-RB7\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"doB-b9-Gri\"/>\n                                        <constraint firstAttribute=\"bottom\" secondItem=\"N84-AY-ecA\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"eWN-hg-7YJ\"/>\n                                        <constraint firstItem=\"qG0-rB-6MR\" firstAttribute=\"top\" secondItem=\"dGc-zC-AYJ\" secondAttribute=\"bottom\" constant=\"15\" id=\"hpv-9Y-g7G\"/>\n                                        <constraint firstItem=\"fMc-SG-EDy\" firstAttribute=\"trailing\" secondItem=\"dGc-zC-AYJ\" secondAttribute=\"trailing\" id=\"ikc-gG-3MB\"/>\n                                        <constraint firstItem=\"N84-AY-ecA\" firstAttribute=\"top\" secondItem=\"qG0-rB-6MR\" secondAttribute=\"bottom\" constant=\"10\" id=\"jDx-Uy-AhQ\"/>\n                                        <constraint firstItem=\"fMc-SG-EDy\" firstAttribute=\"top\" secondItem=\"Ati-LQ-RB7\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"kY4-8C-LzC\"/>\n                                        <constraint firstItem=\"x9X-2w-cOy\" firstAttribute=\"top\" secondItem=\"fMc-SG-EDy\" secondAttribute=\"bottom\" constant=\"8\" symbolic=\"YES\" id=\"luD-Zw-Bag\"/>\n                                        <constraint firstItem=\"fMc-SG-EDy\" firstAttribute=\"centerX\" secondItem=\"Ati-LQ-RB7\" secondAttribute=\"centerX\" id=\"qiF-jK-5Jt\"/>\n                                        <constraint firstItem=\"1lH-rX-WZT\" firstAttribute=\"baseline\" secondItem=\"qG0-rB-6MR\" secondAttribute=\"baseline\" id=\"rtB-T6-I3K\"/>\n                                    </constraints>\n                                </view>\n                            </tabViewItem>\n                        </tabViewItems>\n                    </tabView>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"h22-uy-K1x\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" id=\"HCv-ZJ-Q2c\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"h22-uy-K1x\" secondAttribute=\"trailing\" id=\"MeG-fb-l06\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"h22-uy-K1x\" secondAttribute=\"bottom\" id=\"XlW-sY-ILc\"/>\n                    <constraint firstItem=\"h22-uy-K1x\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" id=\"Yrg-VE-f0G\"/>\n                </constraints>\n            </view>\n            <toolbar key=\"toolbar\" implicitIdentifier=\"8C4EF182-55FF-4325-A88F-2B007115CF4C\" autosavesConfiguration=\"NO\" allowsUserCustomization=\"NO\" displayMode=\"iconAndLabel\" sizeMode=\"regular\" id=\"D9u-IW-4jN\">\n                <allowedToolbarItems>\n                    <toolbarItem implicitItemIdentifier=\"0F065718-7F7B-4558-84B0-7A74B8F8AF88\" explicitItemIdentifier=\"general\" label=\"General\" paletteLabel=\"General\" tag=\"-1\" image=\"NSPreferencesGeneral\" selectable=\"YES\" id=\"Mp8-cF-kQ7\">\n                        <connections>\n                            <action selector=\"toolbarActionWithSender:\" target=\"-2\" id=\"dFv-Bx-jbl\"/>\n                        </connections>\n                    </toolbarItem>\n                    <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"hn4-gj-wF1\"/>\n                    <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"hy4-IW-j13\"/>\n                    <toolbarItem implicitItemIdentifier=\"20667A16-FBAB-459E-9094-87ABC9B66795\" explicitItemIdentifier=\"adv\" label=\"Advanced\" paletteLabel=\"Advanced\" tag=\"-1\" image=\"NSAdvanced\" selectable=\"YES\" id=\"kuN-wm-bl5\">\n                        <connections>\n                            <action selector=\"toolbarActionWithSender:\" target=\"-2\" id=\"W2m-K9-R3F\"/>\n                        </connections>\n                    </toolbarItem>\n                    <toolbarItem implicitItemIdentifier=\"6CA73D5D-9BB2-495A-8658-D0A96900A764\" explicitItemIdentifier=\"http\" label=\"HTTP\" paletteLabel=\"HTTP\" tag=\"-1\" image=\"http\" selectable=\"YES\" id=\"D0F-6S-Ztu\">\n                        <connections>\n                            <action selector=\"toolbarActionWithSender:\" target=\"-2\" id=\"tnS-2P-ws4\"/>\n                        </connections>\n                    </toolbarItem>\n                    <toolbarItem implicitItemIdentifier=\"E4909835-8791-41EE-919B-0DC2AECD6F26\" explicitItemIdentifier=\"interfaces\" label=\"Interfaces\" paletteLabel=\"Interfaces\" tag=\"-1\" image=\"NSNetwork\" selectable=\"YES\" id=\"Bdm-pj-Ckd\">\n                        <connections>\n                            <action selector=\"toolbarActionWithSender:\" target=\"-2\" id=\"X6O-F1-Axw\"/>\n                        </connections>\n                    </toolbarItem>\n                </allowedToolbarItems>\n                <defaultToolbarItems>\n                    <toolbarItem reference=\"Mp8-cF-kQ7\"/>\n                    <toolbarItem reference=\"kuN-wm-bl5\"/>\n                    <toolbarItem reference=\"D0F-6S-Ztu\"/>\n                    <toolbarItem reference=\"Bdm-pj-Ckd\"/>\n                    <toolbarItem reference=\"hy4-IW-j13\"/>\n                </defaultToolbarItems>\n            </toolbar>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"141\" y=\"146\"/>\n        </window>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"uQz-5y-ZL2\"/>\n        <customFormatter id=\"TUK-vL-Gf1\" userLabel=\"PAC URL Formatter\" customClass=\"PACURLFormatter\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\"/>\n        <numberFormatter formatterBehavior=\"default10_4\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"C7t-aU-bub\" userLabel=\"Port Number Formatter\">\n            <real key=\"minimum\" value=\"128\"/>\n            <real key=\"maximum\" value=\"65535\"/>\n        </numberFormatter>\n        <numberFormatter formatterBehavior=\"default10_4\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"2LX-ic-DJh\" userLabel=\"Timeout Number Formatter\">\n            <real key=\"minimum\" value=\"10\"/>\n            <real key=\"maximum\" value=\"600\"/>\n        </numberFormatter>\n        <numberFormatter formatterBehavior=\"default10_4\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"1En-Ey-GAr\" userLabel=\"Num of Kcptun Conn Formatter\">\n            <real key=\"minimum\" value=\"1\"/>\n            <real key=\"maximum\" value=\"16\"/>\n        </numberFormatter>\n        <customObject id=\"YAC-3k-qMR\" customClass=\"LaunchAtLoginController\"/>\n        <customObject id=\"2Fn-b8-1pQ\" customClass=\"ProxyInterfacesViewCtrl\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"tableView\" destination=\"Vp3-dp-iqv\" id=\"e8T-To-sCx\"/>\n                <outlet property=\"view\" destination=\"Ati-LQ-RB7\" id=\"KcW-Hq-Jmh\"/>\n            </connections>\n        </customObject>\n    </objects>\n    <resources>\n        <image name=\"NSAdvanced\" width=\"32\" height=\"32\"/>\n        <image name=\"NSNetwork\" width=\"32\" height=\"32\"/>\n        <image name=\"NSPreferencesGeneral\" width=\"32\" height=\"32\"/>\n        <image name=\"http\" width=\"512\" height=\"512\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/PreferencesWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"15400\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"15400\"/>\n        <capability name=\"System colors introduced in macOS 10.14\" minToolsVersion=\"10.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"PreferencesWindowController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"hostTextField\" destination=\"R4F-j7-GkK\" id=\"a1I-WO-Qdj\"/>\n                <outlet property=\"methodTextField\" destination=\"ef4-8J-eFn\" id=\"OXd-fC-ICR\"/>\n                <outlet property=\"passwordSecureTextField\" destination=\"ZXA-oi-Zv3\" id=\"ZMF-s4-w53\"/>\n                <outlet property=\"passwordTabView\" destination=\"DHz-Hx-kZ5\" id=\"8W3-H3-Ezq\"/>\n                <outlet property=\"passwordTextField\" destination=\"3Ad-X4-DBi\" id=\"FHf-t3-D8t\"/>\n                <outlet property=\"pluginOptionsTextField\" destination=\"5eh-s9-YH8\" id=\"k4c-c6-OIq\"/>\n                <outlet property=\"pluginTextField\" destination=\"0PP-Ng-z0v\" id=\"Dif-aD-nRE\"/>\n                <outlet property=\"portTextField\" destination=\"lng-AE-g0J\" id=\"7b1-ox-WSL\"/>\n                <outlet property=\"profileBox\" destination=\"oZ5-85-pwY\" id=\"D19-PQ-X7E\"/>\n                <outlet property=\"profilesTableView\" destination=\"r91-ho-Lum\" id=\"TNk-f6-Vgo\"/>\n                <outlet property=\"remarkTextField\" destination=\"q3C-S0-iNn\" id=\"DSv-lV-PX7\"/>\n                <outlet property=\"removeButton\" destination=\"3ei-2f-kHB\" id=\"DdP-dA-coT\"/>\n                <outlet property=\"togglePasswordVisibleButton\" destination=\"jDI-cn-wYa\" id=\"wc1-ra-kya\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Server Preferences\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"423\" y=\"484\" width=\"557\" height=\"354\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"557\" height=\"354\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView focusRingType=\"none\" fixedFrame=\"YES\" autohidesScrollers=\"YES\" horizontalLineScroll=\"19\" horizontalPageScroll=\"10\" verticalLineScroll=\"19\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"u4U-Ju-FJV\">\n                        <rect key=\"frame\" x=\"20\" y=\"79\" width=\"200\" height=\"255\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <clipView key=\"contentView\" focusRingType=\"none\" ambiguous=\"YES\" id=\"1oC-7s-16v\">\n                            <rect key=\"frame\" x=\"1\" y=\"1\" width=\"198\" height=\"253\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <tableView focusRingType=\"none\" verticalHuggingPriority=\"750\" ambiguous=\"YES\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"lastColumnOnly\" columnReordering=\"NO\" columnSelection=\"YES\" multipleSelection=\"NO\" emptySelection=\"NO\" autosaveColumns=\"NO\" id=\"r91-ho-Lum\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"198\" height=\"253\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <size key=\"intercellSpacing\" width=\"3\" height=\"2\"/>\n                                    <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <tableColumns>\n                                        <tableColumn identifier=\"status\" width=\"20\" minWidth=\"10\" maxWidth=\"3.4028234663852886e+38\" id=\"wR0-vc-Gtr\">\n                                            <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" alignment=\"left\">\n                                                <font key=\"font\" metaFont=\"message\" size=\"11\"/>\n                                                <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                            </tableHeaderCell>\n                                            <imageCell key=\"dataCell\" refusesFirstResponder=\"YES\" alignment=\"left\" identifier=\"status\" imageScaling=\"proportionallyDown\" id=\"aBb-XB-tD7\"/>\n                                            <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                        </tableColumn>\n                                        <tableColumn identifier=\"main\" width=\"135\" minWidth=\"40\" maxWidth=\"1000\" id=\"6gc-9b-Qnw\">\n                                            <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\">\n                                                <font key=\"font\" metaFont=\"message\" size=\"11\"/>\n                                                <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </tableHeaderCell>\n                                            <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" identifier=\"main\" title=\"Text\" id=\"COZ-Qr-bmU\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                        </tableColumn>\n                                    </tableColumns>\n                                    <connections>\n                                        <outlet property=\"dataSource\" destination=\"-2\" id=\"fz3-X6-PbB\"/>\n                                        <outlet property=\"delegate\" destination=\"-2\" id=\"6zR-v1-wZj\"/>\n                                        <outlet property=\"menu\" destination=\"QmU-th-vjP\" id=\"J0d-c9-pYs\"/>\n                                    </connections>\n                                </tableView>\n                            </subviews>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"jTp-ja-h3t\">\n                            <rect key=\"frame\" x=\"1\" y=\"-15\" width=\"0.0\" height=\"16\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"dLS-Vz-L6A\">\n                            <rect key=\"frame\" x=\"-15\" y=\"1\" width=\"16\" height=\"0.0\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                    <box fixedFrame=\"YES\" boxType=\"custom\" borderType=\"none\" titlePosition=\"noTitle\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oZ5-85-pwY\">\n                        <rect key=\"frame\" x=\"240\" y=\"61\" width=\"297\" height=\"273\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <view key=\"contentView\" ambiguous=\"YES\" id=\"a3z-VL-3xV\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"297\" height=\"273\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HPg-NP-kjP\">\n                                    <rect key=\"frame\" x=\"44\" y=\"245\" width=\"58\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Address:\" id=\"yHs-XE-XEB\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <comboBox verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ef4-8J-eFn\">\n                                    <rect key=\"frame\" x=\"108\" y=\"180\" width=\"164\" height=\"25\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <comboBoxCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" completes=\"NO\" numberOfVisibleItems=\"11\" id=\"5Qb-ey-uS5\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </comboBoxCell>\n                                </comboBox>\n                                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"q3C-S0-iNn\">\n                                    <rect key=\"frame\" x=\"108\" y=\"29\" width=\"161\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"oxu-qq-MGC\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5eh-s9-YH8\">\n                                    <rect key=\"frame\" x=\"108\" y=\"60\" width=\"161\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"dtO-2M-4yX\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0PP-Ng-z0v\">\n                                    <rect key=\"frame\" x=\"108\" y=\"124\" width=\"129\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"IGs-KE-ySP\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DGz-Sq-t0c\">\n                                    <rect key=\"frame\" x=\"56\" y=\"127\" width=\"46\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Plugin:\" id=\"gDt-yZ-Mqs\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"R4F-j7-GkK\">\n                                    <rect key=\"frame\" x=\"108\" y=\"242\" width=\"161\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" placeholderString=\"IP\" drawsBackground=\"YES\" id=\"MWO-hQ-nMt\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <tabView focusRingType=\"none\" fixedFrame=\"YES\" drawsBackground=\"NO\" type=\"noTabsNoBorder\" initialItem=\"aRD-sh-uEl\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DHz-Hx-kZ5\">\n                                    <rect key=\"frame\" x=\"108\" y=\"153\" width=\"129\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                    <tabViewItems>\n                                        <tabViewItem label=\"Secure\" identifier=\"secure\" id=\"aRD-sh-uEl\">\n                                            <view key=\"view\" ambiguous=\"YES\" id=\"rXs-ye-nly\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"129\" height=\"21\"/>\n                                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                <subviews>\n                                                    <secureTextField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZXA-oi-Zv3\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"129\" height=\"21\"/>\n                                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                                        <secureTextFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" borderStyle=\"bezel\" drawsBackground=\"YES\" usesSingleLineMode=\"YES\" id=\"zuN-Jd-LeS\">\n                                                            <font key=\"font\" metaFont=\"system\"/>\n                                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                            <allowedInputSourceLocales>\n                                                                <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                                                            </allowedInputSourceLocales>\n                                                        </secureTextFieldCell>\n                                                    </secureTextField>\n                                                </subviews>\n                                            </view>\n                                        </tabViewItem>\n                                        <tabViewItem label=\"Insecure\" identifier=\"insecure\" id=\"SYv-Tn-tur\">\n                                            <view key=\"view\" id=\"Z6k-mP-BgX\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"129\" height=\"21\"/>\n                                                <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                <subviews>\n                                                    <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3Ad-X4-DBi\">\n                                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"129\" height=\"21\"/>\n                                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" drawsBackground=\"YES\" id=\"DNt-0X-3Z0\">\n                                                            <font key=\"font\" metaFont=\"system\"/>\n                                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                        </textFieldCell>\n                                                    </textField>\n                                                </subviews>\n                                            </view>\n                                        </tabViewItem>\n                                    </tabViewItems>\n                                </tabView>\n                                <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jDI-cn-wYa\">\n                                    <rect key=\"frame\" x=\"244\" y=\"151\" width=\"26\" height=\"26\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <buttonCell key=\"cell\" type=\"squareTextured\" bezelStyle=\"texturedSquare\" image=\"icons8-Blind Filled-50\" imagePosition=\"only\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" imageScaling=\"axesIndependently\" inset=\"2\" id=\"8Bw-DM-zYg\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                    </buttonCell>\n                                    <connections>\n                                        <action selector=\"togglePasswordVisible:\" target=\"-2\" id=\"3kh-Pz-mr0\"/>\n                                    </connections>\n                                </button>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kft-TG-O5S\">\n                                    <rect key=\"frame\" x=\"28\" y=\"186\" width=\"74\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Encryption:\" id=\"mOh-nD-7EX\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jch-rI-Swc\">\n                                    <rect key=\"frame\" x=\"232\" y=\"120\" width=\"50\" height=\"25\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <buttonCell key=\"cell\" type=\"help\" bezelStyle=\"helpButton\" imagePosition=\"left\" borderStyle=\"border\" inset=\"2\" id=\"IF1-Fy-5la\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                    </buttonCell>\n                                    <connections>\n                                        <action selector=\"openPluginHelp:\" target=\"-2\" id=\"ZjN-36-KgP\"/>\n                                    </connections>\n                                </button>\n                                <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ApG-51-Uva\">\n                                    <rect key=\"frame\" x=\"102\" y=\"82\" width=\"173\" height=\"38\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <buttonCell key=\"cell\" type=\"push\" title=\"Open Plugins Folder...\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"T8q-g1-qjN\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                    </buttonCell>\n                                    <connections>\n                                        <action selector=\"openPluginFolder:\" target=\"-2\" id=\"eyc-L3-7US\"/>\n                                    </connections>\n                                </button>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4LD-CD-u7b\">\n                                    <rect key=\"frame\" x=\"24\" y=\"63\" width=\"78\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Plugin Opts:\" id=\"orT-7j-dxE\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Opl-x8-XTI\">\n                                    <rect key=\"frame\" x=\"68\" y=\"214\" width=\"34\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Port:\" id=\"fRO-Pq-XeJ\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lng-AE-g0J\">\n                                    <rect key=\"frame\" x=\"108\" y=\"211\" width=\"50\" height=\"21\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" placeholderString=\"Port\" drawsBackground=\"YES\" id=\"e1F-jd-e0J\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <allowedInputSourceLocales>\n                                            <string>NSAllRomanInputSourcesLocaleIdentifier</string>\n                                        </allowedInputSourceLocales>\n                                    </textFieldCell>\n                                    <connections>\n                                        <outlet property=\"formatter\" destination=\"QZc-kt-D7Z\" id=\"ZB9-Of-Xi9\"/>\n                                    </connections>\n                                </textField>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qfe-Ql-iCO\">\n                                    <rect key=\"frame\" x=\"36\" y=\"156\" width=\"66\" height=\"16\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Password:\" id=\"kil-xC-HPD\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                                <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Baj-Yh-kmj\">\n                                    <rect key=\"frame\" x=\"41\" y=\"31\" width=\"61\" height=\"17\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"right\" title=\"Remarks:\" id=\"MiN-VE-FtC\">\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                        <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    </textFieldCell>\n                                </textField>\n                            </subviews>\n                        </view>\n                        <color key=\"fillColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </box>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yyD-qq-aSk\">\n                        <rect key=\"frame\" x=\"462\" y=\"13\" width=\"81\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"zPE-oD-PwK\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"ok:\" target=\"-2\" id=\"ifI-e4-Htf\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kGm-Zm-ipY\">\n                        <rect key=\"frame\" x=\"381\" y=\"13\" width=\"81\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"j03-9E-uHW\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"cancel:\" target=\"-2\" id=\"514-4D-a6S\"/>\n                        </connections>\n                    </button>\n                    <box fixedFrame=\"YES\" boxType=\"custom\" borderType=\"none\" title=\"Box\" titlePosition=\"noTitle\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gqv-5O-Wwf\">\n                        <rect key=\"frame\" x=\"20\" y=\"61\" width=\"200\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <view key=\"contentView\" ambiguous=\"YES\" id=\"MbP-FS-YEs\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"200\" height=\"18\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4ig-lF-m2R\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"-1\" width=\"22\" height=\"20\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <buttonCell key=\"cell\" type=\"smallSquare\" bezelStyle=\"smallSquare\" image=\"NSAddTemplate\" imagePosition=\"overlaps\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"VkE-bG-mJb\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                    </buttonCell>\n                                    <connections>\n                                        <action selector=\"addProfile:\" target=\"-2\" id=\"NEh-IP-KO8\"/>\n                                    </connections>\n                                </button>\n                                <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3ei-2f-kHB\">\n                                    <rect key=\"frame\" x=\"20\" y=\"-1\" width=\"22\" height=\"20\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                    <buttonCell key=\"cell\" type=\"smallSquare\" bezelStyle=\"smallSquare\" image=\"NSRemoveTemplate\" imagePosition=\"overlaps\" alignment=\"center\" lineBreakMode=\"truncatingTail\" state=\"on\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Nu6-Aw-ihE\">\n                                        <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                        <font key=\"font\" metaFont=\"system\"/>\n                                    </buttonCell>\n                                    <connections>\n                                        <action selector=\"removeProfile:\" target=\"-2\" id=\"CJC-GL-qeS\"/>\n                                    </connections>\n                                </button>\n                            </subviews>\n                        </view>\n                        <color key=\"fillColor\" name=\"alternatingContentBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                    </box>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"389.5\" y=\"74\"/>\n        </window>\n        <numberFormatter formatterBehavior=\"default10_4\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"QZc-kt-D7Z\" userLabel=\"Port Number Formatter\">\n            <real key=\"minimum\" value=\"1\"/>\n            <real key=\"maximum\" value=\"65535\"/>\n        </numberFormatter>\n        <menu showsStateColumn=\"NO\" id=\"QmU-th-vjP\">\n            <items>\n                <menuItem title=\"Clone\" id=\"bl9-lq-u9V\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"duplicate:\" target=\"-2\" id=\"dEb-Dt-yBW\"/>\n                    </connections>\n                </menuItem>\n            </items>\n            <point key=\"canvasLocation\" x=\"-25.5\" y=\"171.5\"/>\n        </menu>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"UV9-ar-oJ3\"/>\n        <numberFormatter formatterBehavior=\"default10_4\" localizesFormat=\"NO\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"B8F-00-aMS\">\n            <real key=\"minimum\" value=\"250\"/>\n            <real key=\"maximum\" value=\"1350\"/>\n        </numberFormatter>\n        <numberFormatter formatterBehavior=\"default10_4\" localizesFormat=\"NO\" usesGroupingSeparator=\"NO\" groupingSize=\"0\" minimumIntegerDigits=\"0\" maximumIntegerDigits=\"42\" id=\"fck-0V-svg\">\n            <real key=\"minimum\" value=\"0.0\"/>\n            <real key=\"maximum\" value=\"100\"/>\n        </numberFormatter>\n    </objects>\n    <resources>\n        <image name=\"NSAddTemplate\" width=\"11\" height=\"11\"/>\n        <image name=\"NSRemoveTemplate\" width=\"11\" height=\"11\"/>\n        <image name=\"icons8-Blind Filled-50\" width=\"50\" height=\"50\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/ShareServerProfilesWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"ShareServerProfilesWindowController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"copyAllServerURLsButton\" destination=\"PkN-2i-ex7\" id=\"5gY-Vs-cfn\"/>\n                <outlet property=\"copyQRCodeButton\" destination=\"GPl-Kb-AZg\" id=\"pId-jX-erp\"/>\n                <outlet property=\"copyURLButton\" destination=\"Myo-Gh-Sba\" id=\"3uJ-PP-nOS\"/>\n                <outlet property=\"profilesTableView\" destination=\"LWb-xh-GIK\" id=\"qqJ-Qa-fWq\"/>\n                <outlet property=\"qrCodeImageView\" destination=\"atP-ge-P5H\" id=\"Wc7-Ht-oJE\"/>\n                <outlet property=\"saveAllServerURLsAsFileButton\" destination=\"WOW-rs-fyP\" id=\"A7T-IN-ub2\"/>\n                <outlet property=\"saveQRCodeAsFileButton\" destination=\"4WD-tD-JDA\" id=\"Bfg-wE-8ls\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Share Server Profiles\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"562\" y=\"460\" width=\"508\" height=\"419\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n            <view key=\"contentView\" wantsLayer=\"YES\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"508\" height=\"419\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <scrollView autohidesScrollers=\"YES\" horizontalLineScroll=\"19\" horizontalPageScroll=\"10\" verticalLineScroll=\"19\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d0q-qb-o6U\">\n                        <rect key=\"frame\" x=\"20\" y=\"119\" width=\"200\" height=\"280\"/>\n                        <clipView key=\"contentView\" id=\"G7B-Z5-glP\">\n                            <rect key=\"frame\" x=\"1\" y=\"1\" width=\"198\" height=\"278\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <tableView verticalHuggingPriority=\"750\" allowsExpansionToolTips=\"YES\" columnAutoresizingStyle=\"lastColumnOnly\" columnReordering=\"NO\" columnSelection=\"YES\" columnResizing=\"NO\" multipleSelection=\"NO\" autosaveColumns=\"NO\" rowSizeStyle=\"automatic\" viewBased=\"YES\" id=\"LWb-xh-GIK\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"198\" height=\"278\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <size key=\"intercellSpacing\" width=\"3\" height=\"2\"/>\n                                    <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"gridColor\" name=\"gridColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <tableColumns>\n                                        <tableColumn editable=\"NO\" width=\"195\" minWidth=\"40\" maxWidth=\"1000\" id=\"BVB-7v-GrU\">\n                                            <tableHeaderCell key=\"headerCell\" lineBreakMode=\"truncatingTail\" borderStyle=\"border\" title=\"Server\">\n                                                <font key=\"font\" metaFont=\"smallSystem\"/>\n                                                <color key=\"textColor\" name=\"headerTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"headerColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </tableHeaderCell>\n                                            <textFieldCell key=\"dataCell\" lineBreakMode=\"truncatingTail\" selectable=\"YES\" editable=\"YES\" title=\"Text Cell\" id=\"Z7X-TN-APg\">\n                                                <font key=\"font\" metaFont=\"system\"/>\n                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                <color key=\"backgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            </textFieldCell>\n                                            <tableColumnResizingMask key=\"resizingMask\" resizeWithTable=\"YES\" userResizable=\"YES\"/>\n                                            <prototypeCellViews>\n                                                <tableCellView identifier=\"cellTitle\" id=\"a8X-ox-vkA\">\n                                                    <rect key=\"frame\" x=\"1\" y=\"1\" width=\"195\" height=\"17\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                                    <subviews>\n                                                        <textField verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"250\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kni-HI-MDc\">\n                                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"195\" height=\"17\"/>\n                                                            <textFieldCell key=\"cell\" lineBreakMode=\"truncatingTail\" sendsActionOnEndEditing=\"YES\" title=\"Table View Cell\" id=\"EIQ-Bg-vVe\">\n                                                                <font key=\"font\" metaFont=\"system\"/>\n                                                                <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                                            </textFieldCell>\n                                                        </textField>\n                                                    </subviews>\n                                                    <constraints>\n                                                        <constraint firstItem=\"Kni-HI-MDc\" firstAttribute=\"leading\" secondItem=\"a8X-ox-vkA\" secondAttribute=\"leading\" constant=\"2\" id=\"7KO-0D-dgp\"/>\n                                                        <constraint firstItem=\"Kni-HI-MDc\" firstAttribute=\"centerX\" secondItem=\"a8X-ox-vkA\" secondAttribute=\"centerX\" id=\"Fe7-da-2Ni\"/>\n                                                        <constraint firstItem=\"Kni-HI-MDc\" firstAttribute=\"centerY\" secondItem=\"a8X-ox-vkA\" secondAttribute=\"centerY\" id=\"jIj-uO-Kop\"/>\n                                                    </constraints>\n                                                    <connections>\n                                                        <outlet property=\"textField\" destination=\"Kni-HI-MDc\" id=\"wnh-Vn-cT5\"/>\n                                                    </connections>\n                                                </tableCellView>\n                                            </prototypeCellViews>\n                                        </tableColumn>\n                                    </tableColumns>\n                                    <connections>\n                                        <outlet property=\"dataSource\" destination=\"-2\" id=\"4GA-ch-rOE\"/>\n                                        <outlet property=\"delegate\" destination=\"-2\" id=\"IdR-br-h7j\"/>\n                                    </connections>\n                                </tableView>\n                            </subviews>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"gkA-hM-aoX\">\n                            <rect key=\"frame\" x=\"1\" y=\"224\" width=\"178\" height=\"16\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"UQv-FS-DZa\">\n                            <rect key=\"frame\" x=\"224\" y=\"17\" width=\"15\" height=\"102\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"atP-ge-P5H\">\n                        <rect key=\"frame\" x=\"238\" y=\"119\" width=\"250\" height=\"250\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" id=\"V51-A5-F2F\"/>\n                    </imageView>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GPl-Kb-AZg\">\n                        <rect key=\"frame\" x=\"232\" y=\"46\" width=\"262\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Copy QRCode\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"PrW-s6-Uab\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"copyQRCode:\" target=\"-2\" id=\"cLd-uU-Mqd\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4WD-tD-JDA\">\n                        <rect key=\"frame\" x=\"232\" y=\"13\" width=\"262\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Save QRCode As File\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"IaI-Rj-Kss\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"saveQRCodeAsFile:\" target=\"-2\" id=\"cHE-5h-cbg\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PkN-2i-ex7\">\n                        <rect key=\"frame\" x=\"14\" y=\"79\" width=\"212\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Copy All Server URLs\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"Yt2-p1-4w0\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"copyAllServerURLs:\" target=\"-2\" id=\"y34-hx-a7y\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WOW-rs-fyP\">\n                        <rect key=\"frame\" x=\"14\" y=\"46\" width=\"212\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Save All Server URLs As File\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"9OS-xy-GB1\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"saveAllServerURLsAsFile:\" target=\"-2\" id=\"Urh-dz-B8d\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Myo-Gh-Sba\">\n                        <rect key=\"frame\" x=\"232\" y=\"79\" width=\"262\" height=\"32\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Copy URL\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"PHX-gY-lZe\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"copyURL:\" target=\"-2\" id=\"dqq-Ps-sEh\"/>\n                        </connections>\n                    </button>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9o8-fU-fd5\">\n                        <rect key=\"frame\" x=\"236\" y=\"378\" width=\"200\" height=\"17\"/>\n                        <textFieldCell key=\"cell\" lineBreakMode=\"clipping\" title=\"The QRCode is in SIP002 format\" id=\"czc-dd-Tcq\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"PkN-2i-ex7\" firstAttribute=\"baseline\" secondItem=\"Myo-Gh-Sba\" secondAttribute=\"baseline\" id=\"0JZ-YU-1ku\"/>\n                    <constraint firstItem=\"WOW-rs-fyP\" firstAttribute=\"baseline\" secondItem=\"GPl-Kb-AZg\" secondAttribute=\"baseline\" id=\"2KL-CL-2ZT\"/>\n                    <constraint firstItem=\"PkN-2i-ex7\" firstAttribute=\"top\" secondItem=\"d0q-qb-o6U\" secondAttribute=\"bottom\" constant=\"12\" id=\"5B6-SC-Lfb\"/>\n                    <constraint firstItem=\"GPl-Kb-AZg\" firstAttribute=\"leading\" secondItem=\"4WD-tD-JDA\" secondAttribute=\"leading\" id=\"BMf-K1-TVf\"/>\n                    <constraint firstItem=\"4WD-tD-JDA\" firstAttribute=\"top\" secondItem=\"GPl-Kb-AZg\" secondAttribute=\"bottom\" constant=\"12\" symbolic=\"YES\" id=\"IhQ-NN-0wa\"/>\n                    <constraint firstItem=\"d0q-qb-o6U\" firstAttribute=\"leading\" secondItem=\"PkN-2i-ex7\" secondAttribute=\"leading\" id=\"OIj-KG-9aT\"/>\n                    <constraint firstItem=\"atP-ge-P5H\" firstAttribute=\"leading\" secondItem=\"Myo-Gh-Sba\" secondAttribute=\"leading\" id=\"OW7-ys-grj\"/>\n                    <constraint firstItem=\"atP-ge-P5H\" firstAttribute=\"trailing\" secondItem=\"Myo-Gh-Sba\" secondAttribute=\"trailing\" id=\"Ond-No-6XU\"/>\n                    <constraint firstItem=\"d0q-qb-o6U\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"P4g-uT-iiA\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"4WD-tD-JDA\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"Pzp-Xq-ySf\"/>\n                    <constraint firstItem=\"9o8-fU-fd5\" firstAttribute=\"leading\" secondItem=\"d0q-qb-o6U\" secondAttribute=\"trailing\" constant=\"18\" id=\"YhZ-3f-Vhg\"/>\n                    <constraint firstItem=\"PkN-2i-ex7\" firstAttribute=\"leading\" secondItem=\"WOW-rs-fyP\" secondAttribute=\"leading\" id=\"aVv-aq-6Uw\"/>\n                    <constraint firstItem=\"9o8-fU-fd5\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"24\" id=\"djw-QK-Hkh\"/>\n                    <constraint firstItem=\"d0q-qb-o6U\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"eBs-kY-b4F\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"9o8-fU-fd5\" secondAttribute=\"trailing\" constant=\"74\" id=\"fMj-gc-6a3\"/>\n                    <constraint firstItem=\"WOW-rs-fyP\" firstAttribute=\"top\" secondItem=\"PkN-2i-ex7\" secondAttribute=\"bottom\" constant=\"12\" symbolic=\"YES\" id=\"hFL-Fk-vnh\"/>\n                    <constraint firstItem=\"d0q-qb-o6U\" firstAttribute=\"bottom\" secondItem=\"atP-ge-P5H\" secondAttribute=\"bottom\" id=\"j2N-0R-fbF\"/>\n                    <constraint firstItem=\"PkN-2i-ex7\" firstAttribute=\"trailing\" secondItem=\"WOW-rs-fyP\" secondAttribute=\"trailing\" id=\"jYr-de-nuz\"/>\n                    <constraint firstItem=\"Myo-Gh-Sba\" firstAttribute=\"leading\" secondItem=\"GPl-Kb-AZg\" secondAttribute=\"leading\" id=\"lZg-Ig-xNO\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"atP-ge-P5H\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"lwK-X8-kuL\"/>\n                    <constraint firstItem=\"GPl-Kb-AZg\" firstAttribute=\"trailing\" secondItem=\"4WD-tD-JDA\" secondAttribute=\"trailing\" id=\"u6y-c4-plW\"/>\n                    <constraint firstItem=\"atP-ge-P5H\" firstAttribute=\"top\" secondItem=\"9o8-fU-fd5\" secondAttribute=\"bottom\" constant=\"9\" id=\"uwM-zJ-SN7\"/>\n                    <constraint firstItem=\"d0q-qb-o6U\" firstAttribute=\"trailing\" secondItem=\"PkN-2i-ex7\" secondAttribute=\"trailing\" id=\"v7l-fK-lVF\"/>\n                    <constraint firstItem=\"9o8-fU-fd5\" firstAttribute=\"leading\" secondItem=\"atP-ge-P5H\" secondAttribute=\"leading\" id=\"vJ0-fV-7FM\"/>\n                    <constraint firstItem=\"Myo-Gh-Sba\" firstAttribute=\"trailing\" secondItem=\"GPl-Kb-AZg\" secondAttribute=\"trailing\" id=\"yu7-lx-VDg\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"143\" y=\"223.5\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Base.lproj/UserRulesController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"14490.70\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"14490.70\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"UserRulesController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"didCancel\" destination=\"2bi-hW-nd9\" id=\"wKx-Nb-7Kt\"/>\n                <outlet property=\"userRulesView\" destination=\"4yV-hS-knY\" id=\"HF3-TH-oBY\"/>\n                <outlet property=\"window\" destination=\"F0z-JX-Cv5\" id=\"gIp-Ho-8D9\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"User Rules\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" releasedWhenClosed=\"NO\" animationBehavior=\"default\" id=\"F0z-JX-Cv5\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n            <windowPositionMask key=\"initialPositionMask\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n            <rect key=\"contentRect\" x=\"196\" y=\"519\" width=\"480\" height=\"270\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n            <view key=\"contentView\" id=\"se5-gp-TjO\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"N2T-OG-SO9\">\n                        <rect key=\"frame\" x=\"385\" y=\"13\" width=\"81\" height=\"32\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"69\" id=\"aO3-kK-V9p\"/>\n                        </constraints>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"OK\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"0Sc-cm-Vyu\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nDQ\n</string>\n                            <modifierMask key=\"keyEquivalentModifierMask\" command=\"YES\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"didOK:\" target=\"-2\" id=\"216-18-SFI\"/>\n                        </connections>\n                    </button>\n                    <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2bi-hW-nd9\">\n                        <rect key=\"frame\" x=\"304\" y=\"13\" width=\"81\" height=\"32\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"69\" id=\"jXL-pY-uDw\"/>\n                        </constraints>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Cancel\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"QAR-9i-kmv\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nGw\n</string>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"didCancel:\" target=\"-2\" id=\"SFh-eD-YLV\"/>\n                        </connections>\n                    </button>\n                    <scrollView horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" hasHorizontalScroller=\"NO\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"J3L-MK-p8I\">\n                        <rect key=\"frame\" x=\"20\" y=\"61\" width=\"440\" height=\"189\"/>\n                        <clipView key=\"contentView\" drawsBackground=\"NO\" id=\"fO6-Dc-ZUL\">\n                            <rect key=\"frame\" x=\"1\" y=\"1\" width=\"423\" height=\"187\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                            <subviews>\n                                <textView importsGraphics=\"NO\" richText=\"NO\" verticallyResizable=\"YES\" usesFontPanel=\"YES\" findStyle=\"panel\" continuousSpellChecking=\"YES\" allowsUndo=\"YES\" usesRuler=\"YES\" allowsNonContiguousLayout=\"YES\" quoteSubstitution=\"YES\" dashSubstitution=\"YES\" spellingCorrection=\"YES\" smartInsertDelete=\"YES\" id=\"4yV-hS-knY\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"423\" height=\"187\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                    <size key=\"minSize\" width=\"423\" height=\"187\"/>\n                                    <size key=\"maxSize\" width=\"463\" height=\"10000000\"/>\n                                    <color key=\"insertionPointColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                </textView>\n                            </subviews>\n                        </clipView>\n                        <scroller key=\"horizontalScroller\" hidden=\"YES\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"YES\" id=\"z0Z-PW-muW\">\n                            <rect key=\"frame\" x=\"-100\" y=\"-100\" width=\"87\" height=\"18\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                        <scroller key=\"verticalScroller\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"NO\" id=\"Us9-yx-gj4\">\n                            <rect key=\"frame\" x=\"424\" y=\"1\" width=\"15\" height=\"187\"/>\n                            <autoresizingMask key=\"autoresizingMask\"/>\n                        </scroller>\n                    </scrollView>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"N2T-OG-SO9\" firstAttribute=\"leading\" secondItem=\"2bi-hW-nd9\" secondAttribute=\"trailing\" constant=\"12\" symbolic=\"YES\" id=\"aMv-5A-H00\"/>\n                    <constraint firstItem=\"2bi-hW-nd9\" firstAttribute=\"baseline\" secondItem=\"N2T-OG-SO9\" secondAttribute=\"baseline\" id=\"bCp-AI-xph\"/>\n                    <constraint firstItem=\"J3L-MK-p8I\" firstAttribute=\"trailing\" secondItem=\"N2T-OG-SO9\" secondAttribute=\"trailing\" id=\"ceZ-Kz-tzP\"/>\n                    <constraint firstItem=\"J3L-MK-p8I\" firstAttribute=\"leading\" secondItem=\"se5-gp-TjO\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"jkN-Yi-047\"/>\n                    <constraint firstItem=\"2bi-hW-nd9\" firstAttribute=\"top\" secondItem=\"J3L-MK-p8I\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"n5u-fC-X85\"/>\n                    <constraint firstItem=\"J3L-MK-p8I\" firstAttribute=\"top\" secondItem=\"se5-gp-TjO\" secondAttribute=\"top\" constant=\"20\" symbolic=\"YES\" id=\"nm4-yK-hmi\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"2bi-hW-nd9\" secondAttribute=\"bottom\" constant=\"20\" symbolic=\"YES\" id=\"tqM-nL-hC0\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"J3L-MK-p8I\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"ziG-gJ-Fcg\"/>\n                </constraints>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"0bl-1N-AYu\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"343\" y=\"474\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/Credits.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg936\\cocoartf2509\n\\cocoatextscaling0\\cocoaplatform0{\\fonttbl\\f0\\fnil\\fcharset134 STHeitiSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;}\n{\\*\\expandedcolortbl;;}\n\\paperw12240\\paperh15840\\margl1440\\margr1440\\vieww12420\\viewh9780\\viewkind0\n\\pard\\tx560\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/shadowsocks/shadowsocks-libev\"}}{\\fldrslt \n\\f0\\fs24 \\cf0 ss-local}}\n\\f0\\fs24  v3.2.5\\\n\\pard\\tx560\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/shadowsocks/kcptun\"}}{\\fldrslt \\cf0 kcptun}} v20190905\\\n\\pard\\tx560\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/shadowsocks/simple-obfs\"}}{\\fldrslt \\cf0 simple-obfs}} v0.0.5\\\n\\pard\\tx560\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n{\\field{\\*\\fldinst{HYPERLINK \"https://www.privoxy.org/\"}}{\\fldrslt \\cf0 privoxy}} v3.0.26\\\n\\pard\\tx560\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/shadowsocks/v2ray-plugin\"}}{\\fldrslt \\cf0 v2ray-plugin}} v1.2.0\\\n}"
  },
  {
    "path": "ShadowsocksX-NG/Diagnose.swift",
    "content": "//\n//  diagnose.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2018/10/2.\n//  Copyright © 2018 qiuyuzhou. All rights reserved.\n//\n\nimport Foundation\n\nfunc shell(_ args: String...) -> String {\n    let task = Process()\n    task.launchPath = \"/usr/bin/env\"\n    task.arguments = args\n    \n    let pipe = Pipe()\n    task.standardOutput = pipe\n    \n    task.launch()\n    task.waitUntilExit()\n    \n    let data = pipe.fileHandleForReading.readDataToEndOfFile()\n    let output = String(data: data, encoding: String.Encoding.utf8)\n    \n    return output ?? \"\"\n}\n\nfunc diagnose() -> String {\n    var strs = [String]()\n    \n    strs.append(\"\\n-----------------------------------\\n\")\n    let infoDict = Bundle.main.infoDictionary!\n    let infoDictJsonData = try! JSONSerialization.data(withJSONObject: infoDict, options: JSONSerialization.WritingOptions.prettyPrinted)\n    \n    strs.append(String(data: infoDictJsonData, encoding: String.Encoding.utf8)!)\n    strs.append(\"\\n-----------------------------------\\n\")\n    \n    let defaults = UserDefaults.standard\n    let keys = [\n        \"ShadowsocksOn\",\n        \"ShadowsocksRunningMode\",\n        \"LocalSocks5.ListenPort\",\n        \"LocalSocks5.ListenAddress\",\n        \"PacServer.BindToLocalhost\",\n        \"PacServer.ListenPort\",\n        \"LocalSocks5.Timeout\",\n        \"LocalSocks5.EnableUDPRelay\",\n        \"LocalSocks5.EnableVerboseMode\",\n        \"GFWListURL\",\n        \"LocalHTTP.ListenAddress\",\n        \"LocalHTTP.ListenPort\",\n        \"LocalHTTPOn\",\n        \"LocalHTTP.FollowGlobal\",\n        \"ProxyExceptions\",\n        ]\n    \n    strs.append(\"Preferences:\\n\")\n    for key in keys {\n        if let obj = defaults.object(forKey: key) {\n            strs.append(\"\\(key)=\\(obj)\\n\")\n        }\n    }\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"Active server profile: \\n\")\n    \n    if let profile = ServerProfileManager.instance.getActiveProfile() {\n        strs.append(profile.debugString())\n    } else {\n        strs.append(\"No actived server profile!\")\n    }\n    \n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ ls -l ~/Library/Application Support/ShadowsocksX-NG/\\n\")\n    strs.append(shell(\"ls\", \"-l\", NSHomeDirectory() + \"/Library/Application Support/ShadowsocksX-NG/\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ ls -l ~/Library/LaunchAgents/\\n\")\n    strs.append(shell(\"ls\", \"-l\", NSHomeDirectory() + \"/Library/LaunchAgents/\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ ls -l ~/.ShadowsocksX-NG/\\n\")\n    strs.append(shell(\"ls\", \"-l\", NSHomeDirectory() + \"/.ShadowsocksX-NG/\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ ls -l /Library/Application Support/ShadowsocksX-NG/\\n\")\n    strs.append(shell(\"ls\", \"-l\", \"/Library/Application Support/ShadowsocksX-NG/\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ lsof -PiTCP -sTCP:LISTEN\\n\")\n    strs.append(shell(\"lsof\", \"-PiTCP\", \"-sTCP:LISTEN\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ ifconfig\\n\")\n    strs.append(shell(\"ifconfig\"))\n    strs.append(\"-----------------------------------\\n\")\n    strs.append(\"$ launchctl list | grep com.qiuyuzhou.\\n\")\n    strs.append(shell(\"bash\", \"-c\", \"launchctl list | grep com.qiuyuzhou.\"))\n    strs.append(\"-----------------------------------\\n\")\n    \n    let output = strs.joined()\n    return output\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ImportWindowController.swift",
    "content": "//\n//  ImportWindowController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2019/9/10.\n//  Copyright © 2019 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\nclass ImportWindowController: NSWindowController {\n    @IBOutlet weak var inputBox: NSTextField!\n    \n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n        \n        let pb = NSPasteboard.general\n        if #available(OSX 10.13, *) {\n            if let text = pb.string(forType: NSPasteboard.PasteboardType.URL) {\n                if let url = URL(string: text) {\n                    if url.scheme == \"ss\" {\n                        inputBox.stringValue = text\n                    }\n                }\n            }\n        }\n        if let text = pb.string(forType: NSPasteboard.PasteboardType.string) {\n            let urls = ServerProfileManager.findURLSInText(text)\n            if urls.count > 0 {\n                inputBox.stringValue = text\n            }\n        }\n    }\n    \n    @IBAction func handleImport(_ sender: NSButton) {\n        let mgr = ServerProfileManager.instance\n        let urls = ServerProfileManager.findURLSInText(inputBox.stringValue)\n        let addCount = mgr.addServerProfileByURL(urls: urls)\n\n        if addCount > 0 {\n            let alert = NSAlert.init()\n            alert.alertStyle = .informational;\n            alert.messageText = \"Success to add \\(addCount) server.\".localized\n            alert.addButton(withTitle: \"OK\")\n            alert.runModal()\n            self.close()\n        } else {\n            let alert = NSAlert.init()\n            alert.alertStyle = .informational;\n            alert.messageText = \"Not found valid shadowsocks server urls.\".localized\n            alert.addButton(withTitle: \"OK\")\n            alert.runModal()\n        }\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Viewer</string>\n\t\t\t<key>CFBundleURLIconFile</key>\n\t\t\t<string>menu_icon@2x</string>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>shadowsocks</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>ss</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2016-2019 qiuyuzhou. All rights reserved. License GPLv3.</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>SWBApplication</string>\n\t<key>NSScreenCaptureUsageDescription</key>\n\t<string>ShadowsocksX-NG needs Screen Recording permission to scan QR codes on your screen</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ShadowsocksX-NG/LaunchAgentUtils.swift",
    "content": "//\n//  BGUtils.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/6.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Foundation\n\nlet APP_SUPPORT_DIR = \"/Library/Application Support/ShadowsocksX-NG/\"\nlet USER_CONFIG_DIR = \"/.ShadowsocksX-NG/\"\nlet LAUNCH_AGENT_DIR = \"/Library/LaunchAgents/\"\nlet LAUNCH_AGENT_CONF_SSLOCAL_NAME = \"com.qiuyuzhou.shadowsocksX-NG.local.plist\"\nlet LAUNCH_AGENT_CONF_PRIVOXY_NAME = \"com.qiuyuzhou.shadowsocksX-NG.http.plist\"\nlet LAUNCH_AGENT_CONF_KCPTUN_NAME = \"com.qiuyuzhou.shadowsocksX-NG.kcptun.plist\"\n\n\nfunc getFileSHA1Sum(_ filepath: String) -> String {\n    if let data = try? Data(contentsOf: URL(fileURLWithPath: filepath)) {\n        return data.sha1()\n    }\n    return \"\"\n}\n\n// Ref: https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html\n// Genarate the mac launch agent service plist\n\n//  MARK: sslocal\n\nfunc generateSSLocalLauchAgentPlist() -> Bool {\n    let sslocalPath = NSHomeDirectory() + APP_SUPPORT_DIR + \"ss-local/ss-local\"\n    let logFilePath = NSHomeDirectory() + \"/Library/Logs/ss-local.log\"\n    let launchAgentDirPath = NSHomeDirectory() + LAUNCH_AGENT_DIR\n    let plistTempFilepath = NSHomeDirectory() + APP_SUPPORT_DIR + LAUNCH_AGENT_CONF_SSLOCAL_NAME\n    let plistFilepath = launchAgentDirPath + LAUNCH_AGENT_CONF_SSLOCAL_NAME\n    \n    // Ensure launch agent directory is existed.\n    let fileMgr = FileManager.default\n    if !fileMgr.fileExists(atPath: launchAgentDirPath) {\n        try! fileMgr.createDirectory(atPath: launchAgentDirPath, withIntermediateDirectories: true, attributes: nil)\n    }\n    \n    let oldSha1Sum = getFileSHA1Sum(plistFilepath)\n    \n    let defaults = UserDefaults.standard\n    let enableUdpRelay = defaults.bool(forKey: \"LocalSocks5.EnableUDPRelay\")\n    let enableVerboseMode = defaults.bool(forKey: \"LocalSocks5.EnableVerboseMode\")\n    \n    var arguments = [sslocalPath, \"-c\", \"ss-local-config.json\"]\n    if enableUdpRelay {\n        arguments.append(\"-u\")\n    }\n    if enableVerboseMode {\n        arguments.append(\"-v\")\n    }\n    arguments.append(\"--reuse-port\")\n    \n    // For a complete listing of the keys, see the launchd.plist manual page.\n    let dyld_library_paths = [\n        NSHomeDirectory() + APP_SUPPORT_DIR + \"ss-local/\",\n        NSHomeDirectory() + APP_SUPPORT_DIR + \"plugins/\",\n    ]\n    \n    let dict: NSMutableDictionary = [\n        \"Label\": \"com.qiuyuzhou.shadowsocksX-NG.local\",\n        \"WorkingDirectory\": NSHomeDirectory() + APP_SUPPORT_DIR,\n        \"StandardOutPath\": logFilePath,\n        \"StandardErrorPath\": logFilePath,\n        \"ProgramArguments\": arguments,\n        \"EnvironmentVariables\": [\"DYLD_LIBRARY_PATH\": dyld_library_paths.joined(separator: \":\")]\n    ]\n    dict.write(toFile: plistTempFilepath, atomically: true)\n    let Sha1Sum = getFileSHA1Sum(plistTempFilepath)\n    if oldSha1Sum != Sha1Sum {\n        dict.write(toFile: plistFilepath, atomically: true)\n        NSLog(\"generateSSLocalLauchAgentPlist - File has been changed.\")\n        return true\n    } else {\n        NSLog(\"generateSSLocalLauchAgentPlist - File has not been changed.\")\n        return false\n    }\n}\n\nfunc StartSSLocal() {\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"start_ss_local.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Start ss-local succeeded.\")\n    } else {\n        NSLog(\"Start ss-local failed.\")\n    }\n}\n\nfunc StopSSLocal() {\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"stop_ss_local.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Stop ss-local succeeded.\")\n    } else {\n        NSLog(\"Stop ss-local failed.\")\n    }\n}\n\nfunc InstallSSLocal() {\n    let fileMgr = FileManager.default\n    let homeDir = NSHomeDirectory()\n    let appSupportDir = homeDir+APP_SUPPORT_DIR\n    if fileMgr.fileExists(atPath: appSupportDir + \"ss-local/ss-local\") {\n        do {\n            try fileMgr.removeItem(atPath: appSupportDir + \"ss-local/ss-local\")\n        } catch {\n            NSLog(\"Remove old ss-local error\")\n        }\n    }\n    \n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"install_ss_local.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Install ss-local succeeded.\")\n    } else {\n        NSLog(\"Install ss-local failed.\")\n    }\n    \n}\n\nfunc writeSSLocalConfFile(_ conf:[String:AnyObject]) -> Bool {\n    do {\n        let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + \"ss-local-config.json\"\n        var data: Data = try JSONSerialization.data(withJSONObject: conf, options: .prettyPrinted)\n        \n        // https://github.com/shadowsocks/ShadowsocksX-NG/issues/1104\n        // This is NSJSONSerialization.dataWithJSONObject that likes to insert additional backslashes.\n        // Escaped forward slashes is also valid json.\n        // Workaround:\n        let s = String(data:data, encoding: .utf8)!\n        data = s.replacingOccurrences(of: \"\\\\/\", with: \"/\").data(using: .utf8)!\n        \n        let oldSum = getFileSHA1Sum(filepath)\n        try data.write(to: URL(fileURLWithPath: filepath), options: .atomic)\n        let newSum = data.sha1()\n        \n        if oldSum == newSum {\n            NSLog(\"writeSSLocalConfFile - File has not been changed.\")\n            return false\n        }\n        \n        NSLog(\"writeSSLocalConfFile - File has been changed.\")\n        return true\n    } catch {\n        NSLog(\"Write ss-local file failed.\")\n    }\n    return false\n}\n\nfunc removeSSLocalConfFile() {\n    do {\n        let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + \"ss-local-config.json\"\n        try FileManager.default.removeItem(atPath: filepath)\n    } catch {\n        \n    }\n}\n\nfunc SyncSSLocal() {\n    var changed: Bool = false\n    changed = changed || generateSSLocalLauchAgentPlist()\n    let mgr = ServerProfileManager.instance\n    if mgr.activeProfileId != nil {\n        if let profile = mgr.getActiveProfile() {\n            changed = changed || writeSSLocalConfFile((profile.toJsonConfig()))\n        }\n        \n        let on = UserDefaults.standard.bool(forKey: \"ShadowsocksOn\")\n        if on {\n            if changed {\n                StopSSLocal()\n                DispatchQueue.main.asyncAfter(\n                    deadline: DispatchTime.now() + DispatchTimeInterval.seconds(1),\n                    execute: {\n                        () in\n                        StartSSLocal()\n                    })\n            } else {\n                StartSSLocal()\n            }\n        } else {\n            StopSSLocal()\n        }\n    } else {\n        removeSSLocalConfFile()\n        StopSSLocal()\n    }\n    SyncPac()\n    SyncPrivoxy()\n}\n\n// --------------------------------------------------------------------------------\n//  MARK: simple-obfs\n\nfunc InstallSimpleObfs() {\n    let fileMgr = FileManager.default\n    let homeDir = NSHomeDirectory()\n    let appSupportDir = homeDir + APP_SUPPORT_DIR\n    if fileMgr.fileExists(atPath: appSupportDir + \"simple-obfs/obfs-local\") {\n        do {\n            try fileMgr.removeItem(atPath: appSupportDir + \"simple-obfs/obfs-local\")\n        } catch {\n            NSLog(\"Remove old simple-obfs error\")\n        }\n    }\n    \n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"install_simple_obfs.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: \"/bin/sh\", arguments: [installerPath!])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Install simple-obfs succeeded.\")\n    } else {\n        NSLog(\"Install simple-obfs failed.\")\n    }\n    \n}\n\n// --------------------------------------------------------------------------------\n//  MARK: kcptun\n\nfunc InstallKcptun() {\n    let fileMgr = FileManager.default\n    let homeDir = NSHomeDirectory()\n    let appSupportDir = homeDir+APP_SUPPORT_DIR\n    if fileMgr.fileExists(atPath: appSupportDir + \"kcptun/client\") {\n        do {\n            try fileMgr.removeItem(atPath: appSupportDir + \"kcptun/client\")\n        } catch {\n            NSLog(\"Remove old kcptun client error\")\n        }\n    }\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"install_kcptun\", ofType: \"sh\")\n    let task = Process.launchedProcess(launchPath: \"/bin/sh\", arguments: [installerPath!])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Install kcptun succeeded.\")\n    } else {\n        NSLog(\"Install kcptun failed.\")\n    }\n}\n\n// --------------------------------------------------------------------------------\n//  MARK: v2ray-plugin\n\nfunc InstallV2rayPlugin() {\n    let fileMgr = FileManager.default\n    let homeDir = NSHomeDirectory()\n    let appSupportDir = homeDir+APP_SUPPORT_DIR\n    if fileMgr.fileExists(atPath: appSupportDir + \"v2ray-plugin/v2ray-plugin\") {\n        do {\n            try fileMgr.removeItem(atPath: appSupportDir + \"v2ray-plugin/v2ray-plugin\")\n        } catch {\n            NSLog(\"Remove old v2ray-plugin error\")\n        }\n    }\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"install_v2ray_plugin\", ofType: \"sh\")\n    let task = Process.launchedProcess(launchPath: \"/bin/sh\", arguments: [installerPath!])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Install v2ray-plugin succeeded.\")\n    } else {\n        NSLog(\"Install v2ray-plugin failed.\")\n    }\n}\n\n// --------------------------------------------------------------------------------\n//  MARK: privoxy\n\nfunc generatePrivoxyLauchAgentPlist() -> Bool {\n    let privoxyPath = NSHomeDirectory() + APP_SUPPORT_DIR + \"privoxy/privoxy\"\n    let logFilePath = NSHomeDirectory() + \"/Library/Logs/privoxy.log\"\n    let launchAgentDirPath = NSHomeDirectory() + LAUNCH_AGENT_DIR\n    let plistTempFilePath = NSHomeDirectory() + APP_SUPPORT_DIR + LAUNCH_AGENT_CONF_PRIVOXY_NAME\n    let plistFilepath = launchAgentDirPath + LAUNCH_AGENT_CONF_PRIVOXY_NAME\n    \n    // Ensure launch agent directory is existed.\n    let fileMgr = FileManager.default\n    if !fileMgr.fileExists(atPath: launchAgentDirPath) {\n        try! fileMgr.createDirectory(atPath: launchAgentDirPath, withIntermediateDirectories: true, attributes: nil)\n    }\n    \n    let oldSha1Sum = getFileSHA1Sum(plistFilepath)\n    \n    let arguments = [privoxyPath, \"--no-daemon\", \"privoxy.config\"]\n    \n    // For a complete listing of the keys, see the launchd.plist manual page.\n    let dict: NSMutableDictionary = [\n        \"Label\": \"com.qiuyuzhou.shadowsocksX-NG.http\",\n        \"WorkingDirectory\": NSHomeDirectory() + APP_SUPPORT_DIR,\n        \"StandardOutPath\": logFilePath,\n        \"StandardErrorPath\": logFilePath,\n        \"ProgramArguments\": arguments\n    ]\n    dict.write(toFile: plistTempFilePath, atomically: true)\n    let Sha1Sum = getFileSHA1Sum(plistTempFilePath)\n    if oldSha1Sum != Sha1Sum {\n        dict.write(toFile: plistFilepath, atomically: true)\n        return true\n    } else {\n        return false\n    }\n}\n\nfunc StartPrivoxy() {\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"start_privoxy.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Start privoxy succeeded.\")\n    } else {\n        NSLog(\"Start privoxy failed.\")\n    }\n}\n\nfunc StopPrivoxy() {\n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"stop_privoxy.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Stop privoxy succeeded.\")\n    } else {\n        NSLog(\"Stop privoxy failed.\")\n    }\n}\n\nfunc InstallPrivoxy() {\n    let fileMgr = FileManager.default\n    let homeDir = NSHomeDirectory()\n    let appSupportDir = homeDir+APP_SUPPORT_DIR\n    if fileMgr.fileExists(atPath: appSupportDir + \"privoxy/privoxy\") {\n        do {\n            try fileMgr.removeItem(atPath: appSupportDir + \"privoxy/privoxy\")\n        } catch {\n            NSLog(\"Remove old privoxy error\")\n        }\n    }\n    \n    let bundle = Bundle.main\n    let installerPath = bundle.path(forResource: \"install_privoxy.sh\", ofType: nil)\n    let task = Process.launchedProcess(launchPath: installerPath!, arguments: [\"\"])\n    task.waitUntilExit()\n    if task.terminationStatus == 0 {\n        NSLog(\"Install privoxy succeeded.\")\n    } else {\n        NSLog(\"Install privoxy failed.\")\n    }\n    \n    let userConfigDir = homeDir + USER_CONFIG_DIR\n    // Make dir: '~/.ShadowsocksX-NG'\n    if !fileMgr.fileExists(atPath: userConfigDir) {\n        try! fileMgr.createDirectory(atPath: userConfigDir\n                                     , withIntermediateDirectories: true, attributes: nil)\n    }\n    \n    // Install empty `user-privoxy.config` file.\n    let userConfigPath = userConfigDir + \"user-privoxy.config\"\n    if !fileMgr.fileExists(atPath: userConfigPath) {\n        let srcPath = Bundle.main.path(forResource: \"user-privoxy\", ofType: \"config\")!\n        try! fileMgr.copyItem(atPath: srcPath, toPath: userConfigPath)\n    }\n}\n\nfunc writePrivoxyConfFile() -> Bool {\n    do {\n        let defaults = UserDefaults.standard\n        let bundle = Bundle.main\n        let templatePath = bundle.path(forResource: \"privoxy.template.config\", ofType: nil)\n        \n        // Read template file\n        var template = try String(contentsOfFile: templatePath!, encoding: .utf8)\n        \n        template = template.replacingOccurrences(of: \"{http}\", with: defaults.string(forKey: \"LocalHTTP.ListenAddress\")! + \":\" + String(defaults.integer(forKey: \"LocalHTTP.ListenPort\")))\n        template = template.replacingOccurrences(of: \"{socks5}\", with: defaults.string(forKey: \"LocalSocks5.ListenAddress\")! + \":\" + String(defaults.integer(forKey: \"LocalSocks5.ListenPort\")))\n        \n        // Append the user config file to the end\n        let userConfigPath = NSHomeDirectory() + USER_CONFIG_DIR + \"user-privoxy.config\"\n        let userConfig = try String(contentsOfFile: userConfigPath, encoding: .utf8)\n        template.append(contentsOf: userConfig)\n        \n        // Write to file\n        let data = template.data(using: .utf8)\n        let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + \"privoxy.config\"\n        \n        let oldSum = getFileSHA1Sum(filepath)\n        try data?.write(to: URL(fileURLWithPath: filepath), options: .atomic)\n        let newSum = getFileSHA1Sum(filepath)\n        \n        if oldSum == newSum {\n            return false\n        }\n        \n        return true\n    } catch {\n        NSLog(\"Write privoxy file failed.\")\n    }\n    return false\n}\n\nfunc removePrivoxyConfFile() {\n    do {\n        let filepath = NSHomeDirectory() + APP_SUPPORT_DIR + \"privoxy.config\"\n        try FileManager.default.removeItem(atPath: filepath)\n    } catch {\n        \n    }\n}\n\nfunc SyncPrivoxy() {\n    var changed: Bool = false\n    changed = changed || generatePrivoxyLauchAgentPlist()\n    let mgr = ServerProfileManager.instance\n    if mgr.activeProfileId != nil {\n        changed = changed || writePrivoxyConfFile()\n        \n        let on = UserDefaults.standard.bool(forKey: \"LocalHTTPOn\")\n        if on {\n            if changed {\n                StopPrivoxy()\n                DispatchQueue.main.asyncAfter(\n                    deadline: DispatchTime.now() + DispatchTimeInterval.seconds(1),\n                    execute: {\n                        () in\n                        StartPrivoxy()\n                    })\n            } else {\n                StartPrivoxy()\n            }\n        } else {\n            StopPrivoxy()\n        }\n    } else {\n        removePrivoxyConfFile()\n        StopPrivoxy()\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/LaunchAtLoginController.h",
    "content": "//\n//  LaunchAtLoginController.h\n//\n//  Copyright 2011 Tomáš Znamenáček\n//  Copyright 2010 Ben Clark-Robinson\n//\n//  Permission is hereby granted, free of charge, to any person obtaining\n//  a copy of this software and associated documentation files (the ‘Software’),\n//  to deal in the Software without restriction, including without limitation\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n//  and/or sell copies of the Software, and to permit persons to whom the\n//  Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be\n//  included in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,\n//  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#import <Foundation/Foundation.h>\n\n@interface LaunchAtLoginController : NSObject\n\n@property(assign) BOOL launchAtLogin;\n\n+ (instancetype) shared;\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/LaunchAtLoginController.m",
    "content": "//\n//  LaunchAtLoginController.m\n//\n//  Copyright 2011 Tomáš Znamenáček\n//  Copyright 2010 Ben Clark-Robinson\n//\n//  Permission is hereby granted, free of charge, to any person obtaining\n//  a copy of this software and associated documentation files (the ‘Software’),\n//  to deal in the Software without restriction, including without limitation\n//  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n//  and/or sell copies of the Software, and to permit persons to whom the\n//  Software is furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be\n//  included in all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,\n//  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n//  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n//  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n//  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n//  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import \"LaunchAtLoginController.h\"\n#import <ServiceManagement/SMLoginItem.h>\n\n//static NSString *const StartAtLoginKey = @\"launchAtLogin\";\n\n@interface LaunchAtLoginController () {\n    BOOL _enabled;\n}\n\n@end\n\n@implementation LaunchAtLoginController\n\n#pragma mark Change Observing\n\n\n#pragma mark Initialization\n\n- (id) init\n{\n    self = [super init];\n    if (self) {\n        _enabled = NO;\n        BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey: @\"LaunchAtLogin\"];\n        [self setLaunchAtLogin:enabled];\n    }\n    return self;\n}\n    \n- (void) dealloc\n{\n}\n\n+ (instancetype) shared {\n    static LaunchAtLoginController* ctrl = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        ctrl = [[self alloc]init];\n    });\n    return ctrl;\n}\n\n- (void) setLaunchAtLogin: (BOOL) enabled\n{\n    static NSString* bundleID = @\"com.qiuyuzhou.ShadowsocksX-NG.LaunchHelper\";\n    \n    if (SMLoginItemSetEnabled(\n                              (__bridge CFStringRef)bundleID\n                              , enabled)) {\n        _enabled = enabled;\n        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];\n        [defaults setBool: enabled forKey: @\"LaunchAtLogin\"];\n        \n        NSLog(@\"Call SMLoginItemSetEnabled with [%hhd] success\", enabled);\n    } else {\n        NSLog(@\"Call SMLoginItemSetEnabled with [%hhd] failed\", enabled);\n    }\n}\n\n- (BOOL) launchAtLogin\n{\n    return _enabled;\n}\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/Notifications.swift",
    "content": "//\n//  Notifications.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/7.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Foundation\n\nlet NOTIFY_SERVER_PROFILES_CHANGED = Notification.Name(rawValue: \"NOTIFY_SERVER_PROFILES_CHANGED\")\n\nlet NOTIFY_CONF_CHANGED = Notification.Name(rawValue: \"NOTIFY_CONF_CHANGED\")\n\nlet NOTIFY_TOGGLE_RUNNING_SHORTCUT = Notification.Name(rawValue: \"NOTIFY_TOGGLE_RUNNING_SHORTCUT\")\nlet NOTIFY_SWITCH_PROXY_MODE_SHORTCUT = Notification.Name(rawValue: \"NOTIFY_SWITCH_PROXY_MODE_SHORTCUT\")\n\nlet NOTIFY_FOUND_SS_URL = Notification.Name(rawValue: \"NOTIFY_FOUND_SS_URL\")\n"
  },
  {
    "path": "ShadowsocksX-NG/PACURLFormatter.swift",
    "content": "//\n//  PACURLFormatter.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2019/9/15.\n//  Copyright © 2019 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\n\n\nclass PACURLFormatter: Formatter {\n    override func string(for obj: Any?) -> String? {\n        if let _obj = obj {\n            switch _obj {\n            case let s as String:\n                return s\n            default:\n                return \"\"\n            }\n        }\n        return \"\"\n    }\n    \n    override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {\n\n        let input = string.trimmingCharacters(in: .whitespaces)\n        if input == \"\" {\n            return true\n        }\n\n        let errorMessage = \"Must be a valid URL with scheme 'file', 'http' or 'https'\".localized\n        \n        if let url = URL.init(string: input) {\n            if let scheme = url.scheme {\n                if !([\"http\", \"https\", \"file\"].contains(scheme) ) {\n                    error?.pointee = errorMessage as NSString\n                    return false\n                }\n                \n                obj?.pointee = url.absoluteString as AnyObject\n                return true\n            } else {\n                error?.pointee = errorMessage as NSString\n                return false\n            }\n        } else {\n            error?.pointee = errorMessage as NSString\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/PACUtils.swift",
    "content": "//\n//  PACUtils.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/9.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Foundation\nimport Alamofire\n\nlet OldErrorPACRulesDirPath = NSHomeDirectory() + \"/.ShadowsocksX-NE/\"\n\nlet PACRulesDirPath = NSHomeDirectory() + \"/.ShadowsocksX-NG/\"\nlet PACUserRuleFilePath = PACRulesDirPath + \"user-rule.txt\"\nlet PACFilePath = PACRulesDirPath + \"gfwlist.js\"\nlet GFWListFilePath = PACRulesDirPath + \"gfwlist.txt\"\n\n\n// Because of LocalSocks5.ListenPort may be changed\nfunc SyncPac() {\n    var needGenerate = false\n    \n    let nowSocks5Address = UserDefaults.standard.string(forKey: \"LocalSocks5.ListenAddress\")\n    let oldSocks5Address = UserDefaults.standard.string(forKey: \"LocalSocks5.ListenAddress.Old\")\n    if nowSocks5Address != oldSocks5Address {\n        needGenerate = true\n        UserDefaults.standard.set(nowSocks5Address, forKey: \"LocalSocks5.ListenAddress.Old\")\n    }\n    \n    let nowSocks5Port = UserDefaults.standard.integer(forKey: \"LocalSocks5.ListenPort\")\n    let oldSocks5Port = UserDefaults.standard.integer(forKey: \"LocalSocks5.ListenPort.Old\")\n    if nowSocks5Port != oldSocks5Port {\n        needGenerate = true\n        UserDefaults.standard.set(nowSocks5Port, forKey: \"LocalSocks5.ListenPort.Old\")\n    }\n    \n    let fileMgr = FileManager.default\n    if !fileMgr.fileExists(atPath: PACFilePath) {\n        needGenerate = true\n    }\n    \n    if needGenerate {\n        if !GeneratePACFile() {\n            NSLog(\"GeneratePACFile failed!\")\n        }\n    }\n}\n\n\nfunc GeneratePACFile() -> Bool {\n    let fileMgr = FileManager.default\n    // Maker the dir if rulesDirPath is not exesited.\n    if !fileMgr.fileExists(atPath: PACRulesDirPath) {\n        if fileMgr.fileExists(atPath: OldErrorPACRulesDirPath) {\n            try! fileMgr.moveItem(atPath: OldErrorPACRulesDirPath, toPath: PACRulesDirPath)\n        } else {\n            try! fileMgr.createDirectory(atPath: PACRulesDirPath\n                , withIntermediateDirectories: true, attributes: nil)\n        }\n    }\n    \n    // If gfwlist.txt is not exsited, copy from bundle\n    if !fileMgr.fileExists(atPath: GFWListFilePath) {\n        let src = Bundle.main.path(forResource: \"gfwlist\", ofType: \"txt\")\n        try! fileMgr.copyItem(atPath: src!, toPath: GFWListFilePath)\n    }\n    \n    // If user-rule.txt is not exsited, copy from bundle\n    if !fileMgr.fileExists(atPath: PACUserRuleFilePath) {\n        let src = Bundle.main.path(forResource: \"user-rule\", ofType: \"txt\")\n        try! fileMgr.copyItem(atPath: src!, toPath: PACUserRuleFilePath)\n    }\n    \n    let socks5Address = UserDefaults.standard.string(forKey: \"LocalSocks5.ListenAddress\")!\n    let socks5Port = UserDefaults.standard.integer(forKey: \"LocalSocks5.ListenPort\")\n    \n    do {\n        let gfwlist = try String(contentsOfFile: GFWListFilePath, encoding: String.Encoding.utf8)\n        if let data = Data(base64Encoded: gfwlist, options: .ignoreUnknownCharacters) {\n            let str = String(data: data, encoding: String.Encoding.utf8)\n            var lines = str!.components(separatedBy: CharacterSet.newlines)\n            \n            do {\n                let userRuleStr = try String(contentsOfFile: PACUserRuleFilePath, encoding: String.Encoding.utf8)\n                let userRuleLines = userRuleStr.components(separatedBy: CharacterSet.newlines)\n                \n                lines = userRuleLines + lines.filter { (line) in\n                    // ignore the rule from gwf if user provide same rule for the same url\n                    var i = line.startIndex\n                    while i < line.endIndex {\n                        if line[i] == \"@\" || line[i] == \"|\" {\n                            i = line.index(after: i)\n                            continue\n                        }\n                        break\n                    }\n                    if i == line.startIndex {\n                        return !userRuleLines.contains(line)\n                    }\n                    return !userRuleLines.contains(String(line[i...]))\n                }\n            } catch {\n                NSLog(\"Not found user-rule.txt\")\n            }\n            \n            // Filter empty and comment lines\n            lines = lines.filter({ (s: String) -> Bool in\n                if s.isEmpty {\n                    return false\n                }\n                let c = s[s.startIndex]\n                if c == \"!\" || c == \"[\" {\n                    return false\n                }\n                return true\n            })\n            \n            do {\n                // rule lines to json array\n                let rulesJsonData: Data\n                    = try JSONSerialization.data(withJSONObject: lines, options: .prettyPrinted)\n                let rulesJsonStr = String(data: rulesJsonData, encoding: String.Encoding.utf8)\n                \n                // Get raw pac js\n                let jsPath = Bundle.main.url(forResource: \"abp\", withExtension: \"js\")\n                let jsData = try? Data(contentsOf: jsPath!)\n                var jsStr = String(data: jsData!, encoding: String.Encoding.utf8)\n                \n                // Replace rules placeholder in pac js\n                jsStr = jsStr!.replacingOccurrences(of: \"__RULES__\"\n                    , with: rulesJsonStr!)\n                // Replace __SOCKS5PORT__ palcholder in pac js\n                jsStr = jsStr!.replacingOccurrences(of: \"__SOCKS5PORT__\"\n                    , with: \"\\(socks5Port)\")\n                // Replace __SOCKS5ADDR__ palcholder in pac js\n                var sin6 = sockaddr_in6()\n                if socks5Address.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {\n                    jsStr = jsStr!.replacingOccurrences(of: \"__SOCKS5ADDR__\"\n                        , with: \"[\\(socks5Address)]\")\n                } else {\n                    jsStr = jsStr!.replacingOccurrences(of: \"__SOCKS5ADDR__\"\n                        , with: socks5Address)\n                }\n                \n                // Write the pac js to file.\n                try jsStr!.data(using: String.Encoding.utf8)?\n                    .write(to: URL(fileURLWithPath: PACFilePath), options: .atomic)\n                \n                return true\n            } catch {\n                \n            }\n        }\n        \n    } catch {\n        NSLog(\"Not found gfwlist.txt\")\n    }\n    return false\n}\n\nfunc UpdatePACFromGFWList() {\n    // Make the dir if rulesDirPath is not exesited.\n    if !FileManager.default.fileExists(atPath: PACRulesDirPath) {\n        do {\n            try FileManager.default.createDirectory(atPath: PACRulesDirPath\n                , withIntermediateDirectories: true, attributes: nil)\n        } catch {\n        }\n    }\n    \n    let url = UserDefaults.standard.string(forKey: \"GFWListURL\")\n    AF.request(url!)\n        .validate()\n        .responseString {\n            response in\n            switch response.result {\n            case .success(let v):\n                do {\n                    try v.write(toFile: GFWListFilePath, atomically: true, encoding: String.Encoding.utf8)\n                    if GeneratePACFile() {\n                        // Popup a user notification\n                        let notification = NSUserNotification()\n                        notification.title = \"PAC has been updated by latest GFW List.\".localized\n                        NSUserNotificationCenter.default\n                            .deliver(notification)\n                    }\n                } catch {\n                    \n                }\n            case .failure:\n                // Popup a user notification\n                let notification = NSUserNotification()\n                notification.title = \"Failed to download latest GFW List.\".localized\n                NSUserNotificationCenter.default\n                    .deliver(notification)\n            }\n        }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/PreferencesWinController.swift",
    "content": "//\n//  PreferencesWinController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2017/3/11.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\nimport RxCocoa\nimport RxSwift\n\nclass PreferencesWinController: NSWindowController {\n    \n    @IBOutlet weak var toolbar: NSToolbar!\n    @IBOutlet weak var tabView: NSTabView!\n    \n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n        toolbar.selectedItemIdentifier = NSToolbarItem.Identifier(rawValue: \"general\")\n    }\n    \n    @objc func windowWillClose(_ notification: Notification) {\n        NotificationCenter.default\n            .post(name: NOTIFY_CONF_CHANGED, object: nil)\n    }\n    \n    @IBAction func toolbarAction(sender: NSToolbarItem) {\n        tabView.selectTabViewItem(withIdentifier: sender.itemIdentifier)\n    }\n\n    @IBAction func resetProxyExceptions(sender: NSButton) {\n        let defaults = UserDefaults.standard\n        defaults.removeObject(forKey: \"ProxyExceptions\")\n    }\n    \n    @IBAction func resetAllPreferences(sender: NSButton) {\n        let alert = NSAlert.init()\n        alert.alertStyle = .warning;\n        alert.messageText = \"Are you sure you want to reset the preferences to defaults?\".localized\n        alert.informativeText = \"All your changes of preferences will be lost.\".localized\n        alert.addButton(withTitle: \"OK\")\n        alert.addButton(withTitle: \"Cancel\")\n        if alert.runModal() == .alertFirstButtonReturn {\n            self.resetUserDefaults()\n        }\n    }\n    \n    func resetUserDefaults() {\n        let domain = Bundle.main.bundleIdentifier!\n        let defaults = UserDefaults.standard\n        \n        // Don't reset server profiles, restore them later.\n        let profiles = defaults.array(forKey: \"ServerProfiles\")\n        let activeProfileId = defaults.string(forKey: \"ActiveServerProfileId\")\n        \n        defaults.removePersistentDomain(forName: domain)\n        defaults.synchronize()\n        \n        // Restore server profiles.\n        defaults.set(profiles, forKey: \"ServerProfiles\")\n        defaults.set(activeProfileId, forKey: \"ActiveServerProfileId\")\n        defaults.synchronize()\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/PreferencesWindowController.swift",
    "content": "//\n//  PreferencesWindowController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/6.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\nimport RxCocoa\nimport RxSwift\n\nclass PreferencesWindowController: NSWindowController\n    , NSTableViewDataSource, NSTableViewDelegate {\n    \n    @IBOutlet weak var profilesTableView: NSTableView!\n    \n    @IBOutlet weak var profileBox: NSBox!\n    \n    @IBOutlet weak var hostTextField: NSTextField!\n    @IBOutlet weak var portTextField: NSTextField!\n    @IBOutlet weak var methodTextField: NSComboBox!\n    \n    @IBOutlet weak var passwordTabView: NSTabView!\n    @IBOutlet weak var passwordTextField: NSTextField!\n    @IBOutlet weak var passwordSecureTextField: NSSecureTextField!\n    @IBOutlet weak var togglePasswordVisibleButton: NSButton!\n    @IBOutlet weak var pluginTextField: NSTextField!\n    @IBOutlet weak var pluginOptionsTextField: NSTextField!\n    @IBOutlet weak var remarkTextField: NSTextField!\n    @IBOutlet weak var removeButton: NSButton!\n    \n    let tableViewDragType: String = \"ss.server.profile.data\"\n    \n    var defaults: UserDefaults!\n    var profileMgr: ServerProfileManager!\n    \n    var editingProfile: ServerProfile!\n\n\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n        \n        defaults = UserDefaults.standard\n        profileMgr = ServerProfileManager.instance\n        \n        methodTextField.addItems(withObjectValues: [\n            \"aes-128-gcm\",\n            \"aes-192-gcm\",\n            \"aes-256-gcm\",\n            \"aes-128-cfb\",\n            \"aes-192-cfb\",\n            \"aes-256-cfb\",\n            \"aes-128-ctr\",\n            \"aes-192-ctr\",\n            \"aes-256-ctr\",\n            \"camellia-128-cfb\",\n            \"camellia-192-cfb\",\n            \"camellia-256-cfb\",\n            \"bf-cfb\",\n            \"chacha20-ietf-poly1305\",\n            \"xchacha20-ietf-poly1305\",\n            \"salsa20\",\n            \"chacha20\",\n            \"chacha20-ietf\",\n            \"rc4-md5\",\n            ])\n        \n        profilesTableView.reloadData()\n        updateProfileBoxVisible()\n    }\n    \n    override func awakeFromNib() {\n        profilesTableView.registerForDraggedTypes([NSPasteboard.PasteboardType(rawValue: tableViewDragType)])\n        profilesTableView.allowsMultipleSelection = true\n    }\n    \n    @IBAction func addProfile(_ sender: NSButton) {\n        if editingProfile != nil && !editingProfile.isValid(){\n            shakeWindows()\n            return\n        }\n        profilesTableView.beginUpdates()\n        let profile = ServerProfile()\n        profile.remark = \"New Server\".localized\n        profileMgr.profiles.append(profile)\n        \n        let index = IndexSet(integer: profileMgr.profiles.count-1)\n        profilesTableView.insertRows(at: index, withAnimation: NSTableView.AnimationOptions.effectFade)\n        \n        self.profilesTableView.scrollRowToVisible(self.profileMgr.profiles.count-1)\n        self.profilesTableView.selectRowIndexes(index, byExtendingSelection: false)\n        profilesTableView.endUpdates()\n        updateProfileBoxVisible()\n    }\n    \n    @IBAction func removeProfile(_ sender: NSButton) {\n        let index = Int(profilesTableView.selectedRowIndexes.first!)\n        var deleteCount = 0\n        if index >= 0 {\n            profilesTableView.beginUpdates()\n            for (_, toDeleteIndex) in profilesTableView.selectedRowIndexes.enumerated() {\n                print(profileMgr.profiles.count)\n                profileMgr.profiles.remove(at: toDeleteIndex - deleteCount)\n                profilesTableView.removeRows(at: IndexSet(integer: toDeleteIndex - deleteCount), withAnimation: NSTableView.AnimationOptions.effectFade)\n                deleteCount += 1\n            }\n            profilesTableView.endUpdates()\n        }\n        self.profilesTableView.scrollRowToVisible(index-1)\n        self.profilesTableView.selectRowIndexes(IndexSet(integer: index-1), byExtendingSelection: false)\n        updateProfileBoxVisible()\n    }\n    \n    @IBAction func ok(_ sender: NSButton) {\n        if editingProfile != nil {\n            if !editingProfile.isValid() {\n                // TODO Shake window?\n                shakeWindows()\n                return\n            }\n        }\n        profileMgr.save()\n        window?.performClose(nil)\n\n        NotificationCenter.default\n            .post(name: NOTIFY_SERVER_PROFILES_CHANGED, object: nil)\n    }\n    \n    @IBAction func cancel(_ sender: NSButton) {\n        profileMgr.reload()\n        window?.performClose(self)\n    }\n    \n    @IBAction func duplicate(_ sender: Any) {\n        var copyCount = 0\n        for (_, toDuplicateIndex) in profilesTableView.selectedRowIndexes.enumerated() {\n            print(profileMgr.profiles.count)\n            let profile = profileMgr.profiles[toDuplicateIndex + copyCount]\n            let duplicateProfile = profile.copy() as! ServerProfile\n            duplicateProfile.uuid = UUID().uuidString\n            profileMgr.profiles.insert(duplicateProfile, at:toDuplicateIndex + copyCount)\n            \n            profilesTableView.beginUpdates()\n            let index = IndexSet(integer: toDuplicateIndex + copyCount)\n            profilesTableView.insertRows(at: index, withAnimation: NSTableView.AnimationOptions.effectFade)\n            self.profilesTableView.scrollRowToVisible(toDuplicateIndex + copyCount)\n            self.profilesTableView.selectRowIndexes(index, byExtendingSelection: false)\n            profilesTableView.endUpdates()\n            \n            copyCount += 1\n        }\n        updateProfileBoxVisible()\n    }\n    \n    @IBAction func togglePasswordVisible(_ sender: Any) {\n        if passwordTabView.selectedTabViewItem?.identifier as! String == \"secure\" {\n            passwordTabView.selectTabViewItem(withIdentifier: \"insecure\")\n            togglePasswordVisibleButton.image = NSImage(named: \"icons8-Eye Filled-50\")\n        } else {\n            passwordTabView.selectTabViewItem(withIdentifier: \"secure\")\n            togglePasswordVisibleButton.image = NSImage(named: \"icons8-Blind Filled-50\")\n        }\n    }\n    \n    @IBAction func openPluginHelp(_ sender: Any) {\n        let url = URL(string: \"https://github.com/shadowsocks/ShadowsocksX-NG/wiki/SIP003-Plugin\")\n        NSWorkspace.shared.open(url!)\n    }\n    \n    @IBAction func openPluginFolder(_ sender: Any) {\n        let folderPath = NSHomeDirectory() + APP_SUPPORT_DIR + \"plugins/\"\n        let url = URL(fileURLWithPath: folderPath, isDirectory: true)\n        NSWorkspace.shared.open(url)\n    }\n    \n    @IBAction func copyCurrentProfileURL2Pasteboard(_ sender: NSButton) {\n        let index = profilesTableView.selectedRow\n        if  index >= 0 {\n            let profile = profileMgr.profiles[index]\n            let ssURL = profile.URL()\n            if let url = ssURL {\n                // Then copy url to pasteboard\n                // TODO Why it not working?? It's ok in objective-c\n                let pboard = NSPasteboard.general\n                pboard.clearContents()\n                let rs = pboard.writeObjects([url as NSPasteboardWriting])\n                if rs {\n                    NSLog(\"copy to pasteboard success\")\n                } else {\n                    NSLog(\"copy to pasteboard failed\")\n                }\n            }\n        }\n    }\n    \n    func updateProfileBoxVisible() {\n        if profileMgr.profiles.count <= 0 {\n            removeButton.isEnabled = false\n        }else{\n            removeButton.isEnabled = true\n        }\n\n        if profileMgr.profiles.isEmpty {\n            profileBox.isHidden = true\n        } else {\n            profileBox.isHidden = false\n        }\n    }\n    \n    func bindProfile(_ index:Int) {\n        NSLog(\"bind profile \\(index)\")\n\n        if index >= 0 && index < profileMgr.profiles.count {\n            let editingProfile = profileMgr.profiles[index]\n            \n            hostTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"serverHost\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            portTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"serverPort\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            \n            methodTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"method\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            passwordTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"password\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            passwordSecureTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"password\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n\n            pluginTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"plugin\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            pluginOptionsTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"pluginOptions\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n            \n            remarkTextField.bind(NSBindingName(rawValue: \"value\"), to: editingProfile, withKeyPath: \"remark\"\n                , options: [NSBindingOption.continuouslyUpdatesValue: true])\n        } else {\n            editingProfile = nil\n            hostTextField.unbind(NSBindingName(rawValue: \"value\"))\n            portTextField.unbind(NSBindingName(rawValue: \"value\"))\n            \n            methodTextField.unbind(NSBindingName(rawValue: \"value\"))\n            passwordTextField.unbind(NSBindingName(rawValue: \"value\"))\n            \n            remarkTextField.unbind(NSBindingName(rawValue: \"value\"))\n        }\n    }\n    \n    func getDataAtRow(_ index:Int) -> (String, Bool) {\n        let profile = profileMgr.profiles[index]\n        let isActive = (profileMgr.activeProfileId == profile.uuid)\n        if !profile.remark.isEmpty {\n            return (String(profile.remark.prefix(24)), isActive)\n        } else {\n            return (profile.serverHost, isActive)\n        }\n    }\n    \n    //--------------------------------------------------\n    // For NSTableViewDataSource\n    \n    func numberOfRows(in tableView: NSTableView) -> Int {\n        if let mgr = profileMgr {\n            return mgr.profiles.count\n        }\n        return 0\n    }\n    \n    func tableView(_ tableView: NSTableView\n        , objectValueFor tableColumn: NSTableColumn?\n        , row: Int) -> Any? {\n        \n        let (title, isActive) = getDataAtRow(row)\n        \n        if tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"main\") {\n            return title\n        } else if tableColumn?.identifier == NSUserInterfaceItemIdentifier(\"status\") {\n            if isActive {\n                return NSImage(named: \"NSMenuOnStateTemplate\")\n            } else {\n                return nil\n            }\n        }\n        return \"\"\n    }\n    \n    // Drag & Drop reorder rows\n    \n    func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {\n        let item = NSPasteboardItem()\n        item.setString(String(row), forType: NSPasteboard.PasteboardType(rawValue: tableViewDragType))\n        return item\n    }\n    \n    func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int\n        , proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {\n        if dropOperation == .above {\n            return .move\n        }\n        return NSDragOperation()\n    }\n    \n    func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo\n        , row: Int, dropOperation: NSTableView.DropOperation) -> Bool {\n        if let mgr = profileMgr {\n            var oldIndexes = [Int]()\n            info.enumerateDraggingItems(options: [], for: tableView, classes: [NSPasteboardItem.self], searchOptions: [:], using: {\n                (draggingItem: NSDraggingItem, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) in\n                if let str = (draggingItem.item as! NSPasteboardItem).string(forType: NSPasteboard.PasteboardType(rawValue: self.tableViewDragType)), let index = Int(str) {\n                    oldIndexes.append(index)\n                }\n            })\n            \n            var oldIndexOffset = 0\n            var newIndexOffset = 0\n            \n            // For simplicity, the code below uses `tableView.moveRowAtIndex` to move rows around directly.\n            // You may want to move rows in your content array and then call `tableView.reloadData()` instead.\n            tableView.beginUpdates()\n            for oldIndex in oldIndexes {\n                if oldIndex < row {\n                    let o = mgr.profiles.remove(at: oldIndex + oldIndexOffset)\n                    mgr.profiles.insert(o, at:row - 1)\n                    tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)\n                    oldIndexOffset -= 1\n                } else {\n                    let o = mgr.profiles.remove(at: oldIndex)\n                    mgr.profiles.insert(o, at:row + newIndexOffset)\n                    tableView.moveRow(at: oldIndex, to: row + newIndexOffset)\n                    newIndexOffset += 1\n                }\n            }\n            tableView.endUpdates()\n        \n            return true\n        }\n        return false\n    }\n    \n    //--------------------------------------------------\n    // For NSTableViewDelegate\n    \n    func tableView(_ tableView: NSTableView\n        , shouldEdit tableColumn: NSTableColumn?, row: Int) -> Bool {\n        return false\n    }\n    \n    func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool {\n        if row < 0 {\n            editingProfile = nil\n            return true\n        }\n        if editingProfile != nil {\n            if !editingProfile.isValid() {\n                return false\n            }\n        }\n        \n        return true\n    }\n    \n    func tableViewSelectionDidChange(_ notification: Notification) {\n        if profilesTableView.selectedRow >= 0 {\n            bindProfile(profilesTableView.selectedRow)\n        } else {\n            if !profileMgr.profiles.isEmpty {\n                let index = IndexSet(integer: profileMgr.profiles.count - 1)\n                profilesTableView.selectRowIndexes(index, byExtendingSelection: false)\n            }\n        }\n    }\n\n    func shakeWindows(){\n        let numberOfShakes:Int = 8\n        let durationOfShake:Float = 0.5\n        let vigourOfShake:Float = 0.05\n\n        let frame:CGRect = (window?.frame)!\n        let shakeAnimation = CAKeyframeAnimation()\n\n        let shakePath = CGMutablePath()\n        shakePath.move(to: CGPoint(x:NSMinX(frame), y:NSMinY(frame)))\n\n        for _ in 1...numberOfShakes{\n            shakePath.addLine(to: CGPoint(x: NSMinX(frame) - frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame)))\n            shakePath.addLine(to: CGPoint(x: NSMinX(frame) + frame.size.width * CGFloat(vigourOfShake), y: NSMinY(frame)))\n        }\n\n        shakePath.closeSubpath()\n        shakeAnimation.path = shakePath\n        shakeAnimation.duration = CFTimeInterval(durationOfShake)\n        window?.animations = [\"frameOrigin\":shakeAnimation]\n        window?.animator().setFrameOrigin(window!.frame.origin)\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ProxyConfHelper.h",
    "content": "//\n//  ProxyConfHelper.h\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/10.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <GCDWebServer/GCDWebServer.h>\n#import <GCDWebServer/GCDWebServerDataResponse.h>\n\n@interface ProxyConfHelper : NSObject\n\n+ (void)install;\n\n+ (void)enablePACProxy;\n\n+ (void)enableGlobalProxy;\n\n+ (void)disableProxy;\n\n+ (void)enableExternalPACProxy;\n\n+ (void)startMonitorPAC;\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ProxyConfHelper.m",
    "content": "//\n//  ProxyConfHelper.m\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/10.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#import \"ProxyConfHelper.h\"\n#import \"proxy_conf_helper_version.h\"\n\n#define kShadowsocksHelper @\"/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper\"\n\n@implementation ProxyConfHelper\n\nGCDWebServer *webServer = nil;\n\n+ (BOOL)isVersionOk {\n    NSTask *task;\n    task = [[NSTask alloc] init];\n    [task setLaunchPath:kShadowsocksHelper];\n    \n    NSArray *args;\n    args = [NSArray arrayWithObjects:@\"-v\", nil];\n    [task setArguments: args];\n    \n    NSPipe *pipe;\n    pipe = [NSPipe pipe];\n    [task setStandardOutput:pipe];\n    \n    NSFileHandle *fd;\n    fd = [pipe fileHandleForReading];\n    \n    [task launch];\n    \n    NSData *data;\n    data = [fd readDataToEndOfFile];\n    \n    NSString *str;\n    str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n    \n    if (![str isGreaterThanOrEqualTo: kProxyConfHelperVersion]) {\n        return NO;\n    }\n    return YES;\n}\n\n+ (void)install {\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if (![fileManager fileExistsAtPath:kShadowsocksHelper] || ![self isVersionOk]) {\n        NSString *helperPath = [NSString stringWithFormat:@\"%@/%@\", [[NSBundle mainBundle] resourcePath], @\"install_helper.sh\"];\n        NSLog(@\"run install script: %@\", helperPath);\n        NSDictionary *error;\n        NSString *script = [NSString stringWithFormat:@\"do shell script \\\"/bin/bash \\\\\\\"%@\\\\\\\"\\\" with administrator privileges\", helperPath];\n        NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];\n        if ([appleScript executeAndReturnError:&error]) {\n            NSLog(@\"installation success\");\n        } else {\n            NSLog(@\"installation failure: %@\", error);\n        }\n    }\n}\n\n+ (void)callHelper:(NSArray*) arguments {\n    NSTask *task;\n    task = [[NSTask alloc] init];\n    [task setLaunchPath:kShadowsocksHelper];\n\n    // this log is very important\n    NSLog(@\"run shadowsocks helper: %@\", kShadowsocksHelper);\n    [task setArguments:arguments];\n\n    NSPipe *stdoutpipe;\n    stdoutpipe = [NSPipe pipe];\n    [task setStandardOutput:stdoutpipe];\n\n    NSPipe *stderrpipe;\n    stderrpipe = [NSPipe pipe];\n    [task setStandardError:stderrpipe];\n\n    NSFileHandle *file;\n    file = [stdoutpipe fileHandleForReading];\n\n    [task launch];\n\n    NSData *data;\n    data = [file readDataToEndOfFile];\n\n    NSString *string;\n    string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n    if (string.length > 0) {\n        NSLog(@\"%@\", string);\n    }\n\n    file = [stderrpipe fileHandleForReading];\n    data = [file readDataToEndOfFile];\n    string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n    if (string.length > 0) {\n        NSLog(@\"%@\", string);\n    }\n}\n\n+ (void)addArguments4ManualSpecifyNetworkServices:(NSMutableArray*) args {\n    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];\n    \n    if (![defaults boolForKey:@\"AutoConfigureNetworkServices\"]) {\n        NSArray* serviceKeys = [defaults arrayForKey:@\"Proxy4NetworkServices\"];\n        if (serviceKeys) {\n            for (NSString* key in serviceKeys) {\n                [args addObject:@\"--network-service\"];\n                [args addObject:key];\n            }\n        }\n    }\n}\n\n+ (void)addArguments4ManualSpecifyProxyExceptions:(NSMutableArray*) args {\n    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];\n\n    NSString* rawExceptions = [defaults stringForKey:@\"ProxyExceptions\"];\n    if (rawExceptions) {\n        NSCharacterSet* whites = [NSCharacterSet whitespaceAndNewlineCharacterSet];\n        NSMutableCharacterSet* seps = [NSMutableCharacterSet characterSetWithCharactersInString:@\",、\"];\n        [seps formUnionWithCharacterSet:whites];\n\n        NSArray* exceptions = [rawExceptions componentsSeparatedByCharactersInSet:seps];\n        for (NSString* domainOrHost in exceptions) {\n            if ([domainOrHost length] > 0) {\n                [args addObject:@\"-x\"];\n                [args addObject:domainOrHost];\n            }\n        }\n    }\n}\n\n+ (NSString*)getPACFilePath {\n    return [NSString stringWithFormat:@\"%@/%@\", NSHomeDirectory(), @\".ShadowsocksX-NG/gfwlist.js\"];\n}\n\n+ (void)enablePACProxy {\n    //start server here and then using the string next line\n    //next two lines can open gcdwebserver and work around pac file\n    NSString* PACFilePath = [self getPACFilePath];\n    [self startPACServer: PACFilePath];\n    \n    NSURL* url = [NSURL URLWithString: [self getHttpPACUrl]];\n    \n    NSMutableArray* args = [@[@\"--mode\", @\"auto\", @\"--pac-url\", [url absoluteString]]mutableCopy];\n    \n    [self addArguments4ManualSpecifyNetworkServices:args];\n    [self addArguments4ManualSpecifyProxyExceptions:args];\n    [self callHelper:args];\n}\n\n+ (void)enableGlobalProxy {\n    NSString* socks5ListenAddress = [[NSUserDefaults standardUserDefaults]stringForKey:@\"LocalSocks5.ListenAddress\"];\n    NSUInteger port = [[NSUserDefaults standardUserDefaults]integerForKey:@\"LocalSocks5.ListenPort\"];\n    \n    NSMutableArray* args = [@[@\"--mode\", @\"global\", @\"--port\"\n                              , [NSString stringWithFormat:@\"%lu\", (unsigned long)port],@\"--socks-listen-address\",socks5ListenAddress]mutableCopy];\n    \n    // Known issue #106 https://github.com/shadowsocks/ShadowsocksX-NG/issues/106\n    if ([[NSUserDefaults standardUserDefaults] boolForKey:@\"LocalHTTPOn\"] && [[NSUserDefaults standardUserDefaults] boolForKey:@\"LocalHTTP.FollowGlobal\"]) {\n        NSUInteger privoxyPort = [[NSUserDefaults standardUserDefaults]integerForKey:@\"LocalHTTP.ListenPort\"];\n        NSString* privoxyListenAddress = [[NSUserDefaults standardUserDefaults]stringForKey:@\"LocalHTTP.ListenAddress\"];\n        [args addObject:@\"--privoxy-port\"];\n        [args addObject:[NSString stringWithFormat:@\"%lu\", (unsigned long)privoxyPort]];\n        [args addObject:@\"--privoxy-listen-address\"];\n        [args addObject:privoxyListenAddress];\n    }\n    \n    [self addArguments4ManualSpecifyNetworkServices:args];\n    [self addArguments4ManualSpecifyProxyExceptions:args];\n    [self callHelper:args];\n    [self stopPACServer];\n}\n\n+ (void)disableProxy {\n    // 带上所有参数是为了判断是否原有代理设置是否由ssx-ng设置的。如果是用户手工设置的其他配置，则不进行清空。\n    NSURL* url = [NSURL URLWithString: [self getHttpPACUrl]];\n    NSString* socks5ListenAddress = [[NSUserDefaults standardUserDefaults]stringForKey:@\"LocalSocks5.ListenAddress\"];\n    NSUInteger port = [[NSUserDefaults standardUserDefaults]integerForKey:@\"LocalSocks5.ListenPort\"];\n    \n    NSMutableArray* args = [@[@\"--mode\", @\"off\"\n                              , @\"--pac-url\", [url absoluteString]\n                              , @\"--port\", [NSString stringWithFormat:@\"%lu\", (unsigned long)port]\n                              , @\"--socks-listen-address\",socks5ListenAddress\n                              ]mutableCopy];\n    [self addArguments4ManualSpecifyNetworkServices:args];\n    [self addArguments4ManualSpecifyProxyExceptions:args];\n    [self callHelper:args];\n    [self stopPACServer];\n}\n\n+ (void)enableExternalPACProxy {\n    NSURL* url = [NSURL URLWithString: [self getExternalPACUrl]];\n    NSMutableArray* args = [@[@\"--mode\", @\"auto\"\n                              , @\"--pac-url\", [url absoluteString]\n                              ]mutableCopy];\n    [self addArguments4ManualSpecifyNetworkServices:args];\n    [self addArguments4ManualSpecifyProxyExceptions:args];\n    [self callHelper:args];\n    [self stopPACServer];\n}\n\n+ (NSString*)getHttpPACUrl {\n    NSString * routerPath = @\"/proxy.pac\";\n    \n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n\n    NSString * address = @\"localhost\";\n    int port = (short)[defaults integerForKey:@\"PacServer.ListenPort\"];\n    \n    return [NSString stringWithFormat:@\"%@%@:%d%@\",@\"http://\",address,port,routerPath];\n}\n\n+ (NSString*)getExternalPACUrl {\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    \n    return [defaults stringForKey:@\"ExternalPACURL\"];\n}\n\n+ (void)startPACServer:(NSString*) PACFilePath {\n    [self stopPACServer];\n    \n    NSString * routerPath = @\"/proxy.pac\";\n    \n    NSData* originalPACData = [NSData dataWithContentsOfFile:PACFilePath];\n    \n    webServer = [[GCDWebServer alloc] init];\n    \n\n    [webServer addHandlerForMethod:@\"GET\"\n                              path:routerPath\n                      requestClass:[GCDWebServerRequest class]\n                      processBlock:^GCDWebServerResponse *(GCDWebServerRequest *request)\n    {\n        GCDWebServerDataResponse* resp = [GCDWebServerDataResponse responseWithData:originalPACData\n                                                                        contentType:@\"application/x-ns-proxy-autoconfig\"];\n        return resp;\n    }\n     ];\n    \n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    \n    BOOL bindToLocalhost = [defaults boolForKey:@\"PacServer.BindToLocalhost\"];\n    int port = (short)[defaults integerForKey:@\"PacServer.ListenPort\"];\n    \n    [webServer startWithOptions:@{\n        GCDWebServerOption_BindToLocalhost: @(bindToLocalhost),\n        GCDWebServerOption_Port: @(port)\n    } error:nil];\n}\n\n+ (void)stopPACServer {\n    //原版似乎没有处理这个，本来设计计划如果切换到全局模式或者手动模式就关掉webserver 似乎没有这个必要了？\n    if ([webServer isRunning]) {\n        [webServer stop];\n    }\n}\n\n+ (void)startMonitorPAC {\n    // Monitor change event of the PAC file.\n    NSString* PACFilePath = [self getPACFilePath];\n    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);\n    int fileId = open([PACFilePath UTF8String], O_EVTONLY);\n    __block dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fileId,\n                                                              DISPATCH_VNODE_DELETE | DISPATCH_VNODE_WRITE | DISPATCH_VNODE_EXTEND | DISPATCH_VNODE_ATTRIB | DISPATCH_VNODE_LINK | DISPATCH_VNODE_RENAME | DISPATCH_VNODE_REVOKE,\n                                                              queue);\n    dispatch_source_set_event_handler(source, ^\n                                      {\n                                          unsigned long flags = dispatch_source_get_data(source);\n                                          if(flags & DISPATCH_VNODE_DELETE)\n                                          {\n                                              dispatch_source_cancel(source);\n                                          }\n                                          \n                                          // The PAC file was written by atomically (PACUtils.swift:134)\n                                          // That means DISPATCH_VNODE_DELETE event always be trigged\n                                          // Need to be run the following statements in any events\n                                          NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];\n                                          if ([defaults boolForKey:@\"ShadowsocksOn\"]) {\n                                              if ([[defaults stringForKey:@\"ShadowsocksRunningMode\"] isEqualToString:@\"auto\"]) {\n                                                  [ProxyConfHelper disableProxy];\n                                                  [ProxyConfHelper enablePACProxy];\n                                              }\n                                          }\n                                      });\n    dispatch_source_set_cancel_handler(source, ^(void) \n                                       {\n                                           close(fileId);\n                                       });\n    dispatch_resume(source);\n}\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ProxyConfTool.h",
    "content": "//\n//  ProxyConfTool.h\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/29.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n\n@interface ProxyConfTool : NSObject\n\n+(NSArray*)networkServicesList;\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ProxyConfTool.m",
    "content": "//\n//  ProxyConfTool.m\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/29.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#import \"ProxyConfTool.h\"\n#import <SystemConfiguration/SystemConfiguration.h>\n\n//https://developer.apple.com/library/mac/documentation/Networking/Conceptual/SystemConfigFrameworks/SC_Intro/SC_Intro.html\n\n@implementation ProxyConfTool\n\n\n+(NSArray*)networkServicesList {\n    NSMutableArray* results = [NSMutableArray array];\n    \n    SCPreferencesRef prefRef = SCPreferencesCreate(nil, CFSTR(\"Shadowsocks\"), nil);\n    NSDictionary *sets = (__bridge NSDictionary *)SCPreferencesGetValue(prefRef, kSCPrefNetworkServices);\n    // 遍历系统中的网络设备列表\n    for (NSString *key in [sets allKeys]) {\n        NSMutableDictionary *service = [sets objectForKey:key];\n        NSString *userDefinedName = [service valueForKey:(__bridge NSString *)kSCPropUserDefinedName];\n//        NSString *hardware = [service valueForKeyPath:@\"Interface.Hardware\"];\n//        NSString *deviceName = [service valueForKeyPath:@\"Interface.DeviceName\"];\n//        NSString *deviceType = [service valueForKeyPath:@\"Interface.Type\"];\n        \n        BOOL isActive = ![service objectForKey:(NSString *)kSCResvInactive];\n        //                NSLog(@\"%@\", hardware);\n//        NSLog(@\"%@-------------------\", key);\n//        for(NSString* key in service) {\n//            NSLog(@\"key=%@ value=%@\", key, [service objectForKey:key]);\n//        }\n//\n        if (isActive) {\n            if (isActive && userDefinedName) {\n                NSDictionary* v = @{\n                                    @\"key\": key,\n                                    @\"userDefinedName\": userDefinedName,\n                                    };\n                [results addObject:v];\n            }\n        }\n    }\n    \n    return results;\n}\n\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ProxyInterfacesViewCtrl.swift",
    "content": "//\n//  ProxyInterfacesTableViewCtrl.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2017/3/17.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\nimport RxCocoa\nimport RxSwift\n\nclass ProxyInterfacesViewCtrl: NSViewController, NSTableViewDataSource, NSTableViewDelegate {\n    \n    var networkServices: NSArray!\n    var selectedNetworkServices: NSMutableSet!\n    \n    @IBOutlet weak var tableView: NSTableView!\n    @IBOutlet weak var autoConfigCheckBox: NSButton!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let defaults = UserDefaults.standard\n        if let services = defaults.array(forKey: \"Proxy4NetworkServices\") {\n            selectedNetworkServices = NSMutableSet(array: services)\n        } else {\n            selectedNetworkServices = NSMutableSet()\n        }\n        \n        networkServices = ProxyConfTool.networkServicesList() as NSArray?\n        tableView.reloadData()\n    }\n\n    //--------------------------------------------------\n    // For NSTableViewDataSource\n    func numberOfRows(in tableView: NSTableView) -> Int {\n        if networkServices != nil {\n            return networkServices.count\n        }\n        return 0;\n    }\n    \n    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?\n        , row: Int) -> Any? {\n        let cell = tableColumn!.dataCell as! NSButtonCell\n        \n        let networkService = networkServices[row] as! [String: Any]\n        let key = networkService[\"key\"] as! String\n        if selectedNetworkServices.contains(key) {\n            cell.state = .on\n        } else {\n            cell.state = .off\n        }\n        let userDefinedName = networkService[\"userDefinedName\"] as! String\n        cell.title = userDefinedName\n        return cell\n    }\n    \n    func tableView(_ tableView: NSTableView, setObjectValue object: Any?\n        , for tableColumn: NSTableColumn?, row: Int) {\n        let networkService = networkServices[row] as! [String: Any]\n        let key = networkService[\"key\"] as! String\n        \n//        NSLog(\"%d\", object!.integerValue)\n        if (object! as AnyObject).intValue == 1 {\n            selectedNetworkServices.add(key)\n        } else {\n            selectedNetworkServices.remove(key)\n        }\n\n        UserDefaults.standard.set(selectedNetworkServices.allObjects,\n                                  forKey: \"Proxy4NetworkServices\")\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/SWBApplication.h",
    "content": "//\n// Created by clowwindy on 3/1/14.\n// Copyright (c) 2014 clowwindy. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n@import AppKit;\n\n\n@interface SWBApplication : NSApplication\n@end"
  },
  {
    "path": "ShadowsocksX-NG/SWBApplication.m",
    "content": "//\n// Created by clowwindy on 3/1/14.\n// Copyright (c) 2014 clowwindy. All rights reserved.\n//\n\n#import \"SWBApplication.h\"\n\n\n@implementation SWBApplication {\n\n}\n\n// Enable Key Shortcuts\n// http://stackoverflow.com/questions/970707/cocoa-keyboard-shortcuts-in-dialog-without-an-edit-menu\n- (void) sendEvent:(NSEvent *)event {\n    if ([event type] == NSEventTypeKeyDown ) {\n        if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == NSEventModifierFlagCommand) {\n            if ([[event charactersIgnoringModifiers] isEqualToString:@\"x\"]) {\n                if ([self sendAction:@selector(cut:) to:nil from:self])\n                    return;\n            }\n            else if ([[event charactersIgnoringModifiers] isEqualToString:@\"c\"]) {\n                if ([self sendAction:@selector(copy:) to:nil from:self])\n                    return;\n            }\n            else if ([[event charactersIgnoringModifiers] isEqualToString:@\"v\"]) {\n                if ([self sendAction:@selector(paste:) to:nil from:self])\n                    return;\n            }\n            else if ([[event charactersIgnoringModifiers] isEqualToString:@\"z\"]) {\n                if ([self sendAction:@selector(undo) to:nil from:self])\n                    return;\n            }\n            else if ([[event charactersIgnoringModifiers] isEqualToString:@\"a\"]) {\n                if ([self sendAction:@selector(selectAll:) to:nil from:self])\n                    return;\n            }\n        }\n        else if (([event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask) == (NSEventModifierFlagCommand | NSEventModifierFlagShift)) {\n            if ([[event charactersIgnoringModifiers] isEqualToString:@\"Z\"]) {\n                if ([self sendAction:@selector(redo) to:nil from:self])\n                    return;\n            }\n        }\n    }\n    [super sendEvent:event];\n}\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/SWBQRCodeWindowController.h",
    "content": "//\n//  QRCodeWindowController.h\n//  shadowsocks\n//\n//  Created by clowwindy on 10/12/14.\n//  Copyright (c) 2014 clowwindy. All rights reserved.\n//\n\n#import <Cocoa/Cocoa.h>\n#import <WebKit/WebKit.h>\n\n@interface SWBQRCodeWindowController : NSWindowController\n\n@property (nonatomic, copy) NSString *legacyQRCode;\n@property (nonatomic, copy) NSString *qrCode;\n@property (nonatomic, copy) NSString *title;\n\n@property (nonatomic, weak) NSTextField *titleTextField;\n@property (nonatomic, weak) NSImageView *imageView;\n\n- (IBAction) copyQRCode: (id) sender;\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/SWBQRCodeWindowController.m",
    "content": "//\n//  QRCodeWindowController.m\n//  shadowsocks\n//\n//  Created by clowwindy on 10/12/14.\n//  Copyright (c) 2014 clowwindy. All rights reserved.\n//\n\n#import \"SWBQRCodeWindowController.h\"\n@import CoreImage;\n\n@interface SWBQRCodeWindowController ()\n\n@end\n\n@implementation SWBQRCodeWindowController\n\n- (void)windowDidLoad {\n    [super windowDidLoad];\n    \n    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n    [self setQRCode:self.qrCode withOverlayText:@\"SIP002\"];\n}\n\n- (void)setQRCode:(NSString*) qrCode withOverlayText: (NSString*) text {\n    NSImage *image = [self createQRImageForString:qrCode size:NSMakeSize(250, 250)];\n    \n    if (text) {\n        // Draw overlay text\n        NSDictionary* attrs = @{\n                                NSForegroundColorAttributeName: [NSColor colorWithRed:28/255.0 green:155/255.0 blue:71/255.0 alpha:1],\n                                NSBackgroundColorAttributeName: [NSColor whiteColor],\n                                NSFontAttributeName: [NSFont fontWithName:@\"Helvetica\" size:(CGFloat)16],\n                                };\n        NSMutableAttributedString* attrsText = [[NSMutableAttributedString alloc] initWithString: text\n                                                                        attributes: attrs];\n        \n        [image lockFocus];\n        [attrsText drawAtPoint: NSMakePoint(100, 5)];\n        [image unlockFocus];\n    }\n    self.imageView.image = image;\n}\n\n- (NSImage*)createQRImageForString:(NSString *)string size:(NSSize)size {\n    NSImage *outputImage = [[NSImage alloc]initWithSize:size];\n    [outputImage lockFocus];\n    \n    // Setup the QR filter with our string\n    CIFilter *filter = [CIFilter filterWithName:@\"CIQRCodeGenerator\"];\n    [filter setDefaults];\n    \n    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];\n    [filter setValue:data forKey:@\"inputMessage\"];\n    /*\n         L: 7%\n         M: 15%\n         Q: 25%\n         H: 30%\n     */\n    [filter setValue:@\"Q\" forKey:@\"inputCorrectionLevel\"];\n    \n    CIImage *image = [filter valueForKey:@\"outputImage\"];\n    \n    // Calculate the size of the generated image and the scale for the desired image size\n    CGRect extent = CGRectIntegral(image.extent);\n    CGFloat scale = MIN(size.width / CGRectGetWidth(extent), size.height / CGRectGetHeight(extent));\n    \n    CGImageRef bitmapImage = [NSGraphicsContext.currentContext.CIContext createCGImage:image fromRect:extent];\n    \n    CGContextRef graphicsContext = NSGraphicsContext.currentContext.CGContext;\n    \n    CGContextSetInterpolationQuality(graphicsContext, kCGInterpolationNone);\n    CGContextScaleCTM(graphicsContext, scale, scale);\n    CGContextDrawImage(graphicsContext, extent, bitmapImage);\n    \n    // Cleanup\n    CGImageRelease(bitmapImage);\n    \n    [outputImage unlockFocus];\n    return outputImage;\n}\n\n- (IBAction) copyQRCode: (id) sender{\n    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];\n    [pasteboard clearContents];\n    NSArray *copiedObjects = [NSArray arrayWithObject: self.imageView.image];\n    [pasteboard writeObjects:copiedObjects];\n}\n\n- (void)flagsChanged:(NSEvent *)event {\n    NSUInteger modifiers = event.modifierFlags & NSEventModifierFlagDeviceIndependentFlagsMask;\n    if (modifiers & NSEventModifierFlagOption) {\n        [self setQRCode:self.legacyQRCode withOverlayText:@\"Legacy\"];\n    } else {\n        [self setQRCode:self.qrCode withOverlayText:@\"SIP002\"];\n    }\n}\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/SWBQRCodeWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"12121\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n        <capability name=\"system font weights other than Regular or Bold\" minToolsVersion=\"7.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"SWBQRCodeWindowController\">\n            <connections>\n                <outlet property=\"imageView\" destination=\"yRy-QH-TEe\" id=\"aa5-Ri-k04\"/>\n                <outlet property=\"window\" destination=\"QvC-M9-y7g\" id=\"HLy-eJ-5RD\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"QR Code\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" restorable=\"NO\" oneShot=\"NO\" animationBehavior=\"default\" id=\"QvC-M9-y7g\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"566\" y=\"456\" width=\"290\" height=\"379\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1440\" height=\"877\"/>\n            <view key=\"contentView\" id=\"EiT-Mj-1SZ\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"290\" height=\"379\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <imageView horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yRy-QH-TEe\">\n                        <rect key=\"frame\" x=\"20\" y=\"81\" width=\"250\" height=\"250\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <imageCell key=\"cell\" refusesFirstResponder=\"YES\" alignment=\"left\" imageScaling=\"proportionallyDown\" id=\"iAJ-tw-LNU\"/>\n                        <connections>\n                            <outlet property=\"menu\" destination=\"5h4-gO-Rh7\" id=\"Ps3-TP-31Y\"/>\n                        </connections>\n                    </imageView>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9f5-sB-jlD\">\n                        <rect key=\"frame\" x=\"18\" y=\"342\" width=\"254\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Title For Server\" id=\"fHU-xF-zyc\">\n                            <font key=\"font\" metaFont=\"systemSemibold\" size=\"13\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                        <connections>\n                            <binding destination=\"-2\" name=\"value\" keyPath=\"self.title\" id=\"VU2-sZ-3fH\"/>\n                        </connections>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fAd-u3-u8m\">\n                        <rect key=\"frame\" x=\"14\" y=\"20\" width=\"262\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Copy To Pasteboard\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"3q0-EO-Vug\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"copyQRCode:\" target=\"-2\" id=\"4fF-ID-p1E\"/>\n                        </connections>\n                    </button>\n                    <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" fixedFrame=\"YES\" allowsCharacterPickerTouchBarItem=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dqP-hN-9CY\">\n                        <rect key=\"frame\" x=\"34\" y=\"56\" width=\"222\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Press option/alt key to show legacy \" id=\"x9U-Ti-73h\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <point key=\"canvasLocation\" x=\"152\" y=\"-60.5\"/>\n        </window>\n        <menu id=\"5h4-gO-Rh7\">\n            <items>\n                <menuItem title=\"Copy QRCode\" id=\"m8q-W6-UjX\">\n                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                    <connections>\n                        <action selector=\"copyQRCode:\" target=\"-2\" id=\"vD4-PS-09w\"/>\n                    </connections>\n                </menuItem>\n            </items>\n        </menu>\n        <userDefaultsController representsSharedInstance=\"YES\" id=\"owc-dp-6hu\"/>\n    </objects>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/ServerProfile.swift",
    "content": "//\n//  ServerProfile.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/6.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\n\nclass ServerProfile: NSObject, NSCopying {\n    \n    @objc var uuid: String\n\n    @objc var serverHost: String = \"\"\n    @objc var serverPort: uint16 = 8379\n    @objc var method:String = \"aes-128-gcm\"\n    @objc var password:String = \"\"\n    @objc var remark:String = \"\"\n    \n    // SIP003 Plugin\n    @objc var plugin: String = \"\"  // empty string disables plugin\n    @objc var pluginOptions: String = \"\"\n    \n    override init() {\n        uuid = UUID().uuidString\n    }\n\n    init(uuid: String) {\n        self.uuid = uuid\n    }\n\n    convenience init?(url: URL) {\n        self.init()\n\n        func padBase64(string: String) -> String {\n            var length = string.utf8.count\n            if length % 4 == 0 {\n                return string\n            } else {\n                length = 4 - length % 4 + length\n                return string.padding(toLength: length, withPad: \"=\", startingAt: 0)\n            }\n        }\n\n        func decodeUrl(url: URL) -> (String?,String?) {\n            let urlStr = url.absoluteString\n            let base64Begin = urlStr.index(urlStr.startIndex, offsetBy: 5)\n            let base64End = urlStr.firstIndex(of: \"#\")\n            let encodedStr = String(urlStr[base64Begin..<(base64End ?? urlStr.endIndex)])\n            guard let data = Data(base64Encoded: padBase64(string: encodedStr)) else {\n                // Not legacy format URI\n                return (url.absoluteString, nil)\n            }\n            guard let decoded = String(data: data, encoding: String.Encoding.utf8) else {\n                return (nil, nil)\n            }\n            var s = decoded.trimmingCharacters(in: CharacterSet(charactersIn: \"\\n\"))\n            \n            // May be legacy format URI\n            // Note that the legacy URI doesn't follow RFC3986. It means the password here\n            // should be plain text, not percent-encoded.\n            // Ref: https://shadowsocks.org/en/config/quick-guide.html\n            let parser = try? NSRegularExpression(\n                pattern: \"(.+):(.+)@(.+)\", options: .init())\n            if let match = parser?.firstMatch(in:s, options: [], range: NSRange(location: 0, length: s.utf16.count)) {\n                // Convert legacy format to SIP002 format\n                let r1 = Range(match.range(at: 1), in: s)!\n                let r2 = Range(match.range(at: 2), in: s)!\n                let r3 = Range(match.range(at: 3), in: s)!\n                let user = String(s[r1])\n                let password = String(s[r2])\n                let hostAndPort = String(s[r3])\n                \n                let rawUserInfo = \"\\(user):\\(password)\".data(using: .utf8)!\n                let userInfo = rawUserInfo.base64EncodedString()\n                \n                s = \"ss://\\(userInfo)@\\(hostAndPort)\"\n            }\n            \n            if let index = base64End {\n                let i = urlStr.index(index, offsetBy: 1)\n                let fragment = String(urlStr[i...])\n                return (s, fragment.removingPercentEncoding)\n            }\n            return (s, nil)\n        }\n        func decodeLegacyFormat(url: String) -> (URL?,String?) {\n            return (nil, nil)\n        }\n        \n        let (_decodedUrl, _tag) = decodeUrl(url: url)\n        guard let decodedUrl = _decodedUrl else {\n            return nil\n        }\n        guard let parsedUrl = URLComponents(string: decodedUrl) else {\n            return nil\n        }\n        guard let host = parsedUrl.host, let port = parsedUrl.port,\n            let user = parsedUrl.user else {\n            return nil\n        }\n\n        self.serverHost = host\n        self.serverPort = UInt16(port)\n\n        // This can be overriden by the fragment part of SIP002 URL\n        remark = parsedUrl.queryItems?\n            .filter({ $0.name == \"Remark\" }).first?.value ?? \"\"\n        \n        if let tag = _tag {\n            remark = tag\n        }\n\n        // SIP002 URL have no password section\n        guard let data = Data(base64Encoded: padBase64(string: user)),\n            let userInfo = String(data: data, encoding: .utf8) else {\n            return nil\n        }\n\n        let parts = userInfo.split(separator: \":\", maxSplits: 1, omittingEmptySubsequences: false)\n        if parts.count != 2 {\n            return nil\n        }\n        self.method = String(parts[0]).lowercased()\n        self.password = String(parts[1])\n\n        // SIP002 defines where to put the profile name\n        if let profileName = parsedUrl.fragment {\n            self.remark = profileName\n        }\n\n        if let pluginStr = parsedUrl.queryItems?\n            .filter({ $0.name == \"plugin\" }).first?.value {\n            let parts = pluginStr.split(separator: \";\", maxSplits: 1)\n            if parts.count == 2 {\n                plugin = String(parts[0])\n                pluginOptions = String(parts[1])\n            } else if parts.count == 1 {\n                plugin = String(parts[0])\n            }\n        }\n    }\n    \n    public func copy(with zone: NSZone? = nil) -> Any {\n        let copy = ServerProfile()\n        copy.serverHost = self.serverHost\n        copy.serverPort = self.serverPort\n        copy.method = self.method\n        copy.password = self.password\n        copy.remark = self.remark\n        \n        copy.plugin = self.plugin\n        copy.pluginOptions = self.pluginOptions\n        return copy;\n    }\n    \n    static func fromDictionary(_ data:[String:Any?]) -> ServerProfile {\n        let cp = {\n            (profile: ServerProfile) in\n            profile.serverHost = data[\"ServerHost\"] as! String\n            profile.serverPort = (data[\"ServerPort\"] as! NSNumber).uint16Value\n            profile.method = data[\"Method\"] as! String\n            profile.password = data[\"Password\"] as! String\n            if let remark = data[\"Remark\"] {\n                profile.remark = remark as! String\n            }\n            if let plugin = data[\"Plugin\"] as? String {\n                profile.plugin = plugin\n            }\n            if let pluginOptions = data[\"PluginOptions\"] as? String {\n                profile.pluginOptions = pluginOptions\n            }\n        }\n\n        if let id = data[\"Id\"] as? String {\n            let profile = ServerProfile(uuid: id)\n            cp(profile)\n            return profile\n        } else {\n            let profile = ServerProfile()\n            cp(profile)\n            return profile\n        }\n    }\n\n    func toDictionary() -> [String:AnyObject] {\n        var d = [String:AnyObject]()\n        d[\"Id\"] = uuid as AnyObject?\n        d[\"ServerHost\"] = serverHost as AnyObject?\n        d[\"ServerPort\"] = NSNumber(value: serverPort as UInt16)\n        d[\"Method\"] = method as AnyObject?\n        d[\"Password\"] = password as AnyObject?\n        d[\"Remark\"] = remark as AnyObject?\n        d[\"Plugin\"] = plugin as AnyObject\n        d[\"PluginOptions\"] = pluginOptions as AnyObject\n        return d\n    }\n\n    func toJsonConfig() -> [String: AnyObject] {\n        var conf: [String: AnyObject] = [\"password\": password as AnyObject,\n                                         \"method\": method as AnyObject,]\n        \n        let defaults = UserDefaults.standard\n        conf[\"local_port\"] = NSNumber(value: UInt16(defaults.integer(forKey: \"LocalSocks5.ListenPort\")) as UInt16)\n        conf[\"local_address\"] = defaults.string(forKey: \"LocalSocks5.ListenAddress\") as AnyObject?\n        conf[\"timeout\"] = NSNumber(value: UInt32(defaults.integer(forKey: \"LocalSocks5.Timeout\")) as UInt32)\n        conf[\"server\"] = serverHost as AnyObject\n        conf[\"server_port\"] = NSNumber(value: serverPort as UInt16)\n\n        if !plugin.isEmpty {\n            // all plugin binaries should be located in the plugins dir\n            // so that we don't have to mess up with PATH envvars\n            conf[\"plugin\"] = \"plugins/\\(plugin)\" as AnyObject\n            conf[\"plugin_opts\"] = pluginOptions as AnyObject\n        }\n\n        return conf\n    }\n    \n    func debugString() -> String {\n        var buf = \"\"\n        print(\"ServerHost=\\(String(repeating: \"*\", count: serverHost.count))\", to: &buf)\n        print(\"ServerPort=\\(serverPort)\", to: &buf)\n        print(\"Method=\\(method)\", to: &buf)\n        print(\"Password=\\(String(repeating: \"*\", count: password.count))\", to: &buf)\n        print(\"Plugin=\\(plugin)\", to: &buf)\n        print(\"PluginOptions=\\(pluginOptions)\", to: &buf)\n        return buf\n    }\n\n    func isValid() -> Bool {\n        func validateIpAddress(_ ipToValidate: String) -> Bool {\n\n            var sin = sockaddr_in()\n            var sin6 = sockaddr_in6()\n\n            if ipToValidate.withCString({ cstring in inet_pton(AF_INET6, cstring, &sin6.sin6_addr) }) == 1 {\n                // IPv6 peer.\n                return true\n            }\n            else if ipToValidate.withCString({ cstring in inet_pton(AF_INET, cstring, &sin.sin_addr) }) == 1 {\n                // IPv4 peer.\n                return true\n            }\n\n            return false;\n        }\n\n        func validateDomainName(_ value: String) -> Bool {\n            let validHostnameRegex = \"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\\\-]*[A-Za-z0-9])$\"\n\n            if (value.range(of: validHostnameRegex, options: .regularExpression) != nil) {\n                return true\n            } else {\n                return false\n            }\n        }\n\n        if !(validateIpAddress(serverHost) || validateDomainName(serverHost)){\n            return false\n        }\n\n        if password.isEmpty {\n            return false\n        }\n\n        return true\n    }\n\n    private func makeLegacyURL() -> URL? {\n        var url = URLComponents()\n\n        url.host = serverHost\n        url.user = method\n        url.password = password\n        url.port = Int(serverPort)\n\n        url.fragment = remark\n\n        let parts = url.string?.replacingOccurrences(\n            of: \"//\", with: \"\",\n            options: String.CompareOptions.anchored, range: nil)\n\n        let base64String = parts?.data(using: String.Encoding.utf8)?\n            .base64EncodedString(options: Data.Base64EncodingOptions())\n        if var s = base64String {\n            s = s.trimmingCharacters(in: CharacterSet(charactersIn: \"=\"))\n            return Foundation.URL(string: \"ss://\\(s)\")\n        }\n        return nil\n    }\n\n    func URL(legacy: Bool = false) -> URL? {\n        // If you want the URL from <= 1.5.1\n        if (legacy) {\n            return self.makeLegacyURL()\n        }\n\n        guard let rawUserInfo = \"\\(method):\\(password)\".data(using: .utf8) else {\n            return nil\n        }\n        let userInfo = rawUserInfo.base64EncodedString()\n\n        var items: [URLQueryItem] = []\n        if !plugin.isEmpty {\n            let value = \"\\(plugin);\\(pluginOptions)\"\n            items.append(URLQueryItem(name: \"plugin\", value: value))\n        }\n\n        var comps = URLComponents()\n\n        comps.scheme = \"ss\"\n        comps.host = serverHost\n        comps.port = Int(serverPort)\n        comps.user = userInfo\n        comps.path = \"/\"  // This is required by SIP0002 for URLs with fragment or query\n        comps.fragment = remark\n        comps.queryItems = items\n\n        let url = try? comps.asURL()\n\n        return url\n    }\n    \n    func title() -> String {\n        if remark.isEmpty {\n            return \"\\(serverHost):\\(serverPort)\"\n        } else {\n            return \"\\(String(remark.prefix(24))) (\\(serverHost):\\(serverPort))\"\n        }\n    }\n    \n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ServerProfileManager.swift",
    "content": "//\n//  ServerProfileManager.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/6. Modified by 秦宇航 16/9/12\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\nclass ServerProfileManager: NSObject {\n    \n    static let instance:ServerProfileManager = ServerProfileManager()\n    \n    var profiles:[ServerProfile] = [ServerProfile]()\n    var activeProfileId: String?\n    \n    fileprivate override init() {\n        let defaults = UserDefaults.standard\n        if let _profiles = defaults.array(forKey: \"ServerProfiles\") {\n            for _profile in _profiles {\n                let profile = ServerProfile.fromDictionary(_profile as! [String: Any])\n                profiles.append(profile)\n            }\n        }\n        activeProfileId = defaults.string(forKey: \"ActiveServerProfileId\")\n    }\n    \n    func setActiveProfiledId(_ id: String) {\n        activeProfileId = id\n        let defaults = UserDefaults.standard\n        defaults.set(id, forKey: \"ActiveServerProfileId\")\n    }\n    \n    func save() {\n        let defaults = UserDefaults.standard\n        var _profiles = [AnyObject]()\n        for profile in profiles {\n            if profile.isValid() {\n                let _profile = profile.toDictionary()\n                _profiles.append(_profile as AnyObject)\n            }\n        }\n        defaults.set(_profiles, forKey: \"ServerProfiles\")\n        \n        if getActiveProfile() == nil {\n            activeProfileId = nil\n        }\n    }\n    \n    func reload() {\n        profiles.removeAll()\n        \n        let defaults = UserDefaults.standard\n        if let _profiles = defaults.array(forKey: \"ServerProfiles\") {\n            for _profile in _profiles {\n                let profile = ServerProfile.fromDictionary(_profile as! [String: Any])\n                profiles.append(profile)\n            }\n        }\n        activeProfileId = defaults.string(forKey: \"ActiveServerProfileId\")\n    }\n    \n    func getActiveProfile() -> ServerProfile? {\n        if let id = activeProfileId {\n            for p in profiles {\n                if p.uuid == id {\n                    return p\n                }\n            }\n            return nil\n        } else {\n            return nil\n        }\n    }\n    \n    func addServerProfileByURL(urls: [URL]) -> Int {\n        var addCount = 0\n        \n        for url in urls {\n            if let profile = ServerProfile(url: url) {\n                profiles.append(profile)\n                addCount = addCount + 1\n            }\n        }\n        \n        if addCount > 0 {\n            save()\n            NotificationCenter.default\n                .post(name: NOTIFY_SERVER_PROFILES_CHANGED, object: nil)\n        }\n        \n        return addCount\n    }\n    \n    static func findURLSInText(_ text: String) -> [URL] {\n        var urls = text.split(separator: \"\\n\")\n            .map { String($0).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) }\n            .map { URL(string: $0) }\n            .filter { $0 != nil }\n            .map { $0! }\n        urls = urls.filter { $0.scheme == \"ss\" }\n        return urls\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import <CommonCrypto/CommonCrypto.h>\n\n#import \"LaunchAtLoginController.h\"\n#import \"SWBQRCodeWindowController.h\"\n#import \"ShortcutsController.h\"\n#import \"Utils.h\"\n#import \"ProxyConfHelper.h\"\n#import \"ProxyConfTool.h\"\n"
  },
  {
    "path": "ShadowsocksX-NG/ShareServerProfilesWindowController.swift",
    "content": "//\n//  ShareServerProfilesWindowController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2018/9/16.\n//  Copyright © 2018年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\nclass ShareServerProfilesWindowController: NSWindowController\n    , NSTableViewDataSource, NSTableViewDelegate {\n\n    @IBOutlet weak var profilesTableView: NSTableView!\n    \n    @IBOutlet weak var qrCodeImageView: NSImageView!\n    \n    @IBOutlet weak var copyAllServerURLsButton: NSButton!\n    @IBOutlet weak var saveAllServerURLsAsFileButton: NSButton!\n    \n    @IBOutlet weak var copyURLButton: NSButton!\n    @IBOutlet weak var copyQRCodeButton: NSButton!\n    @IBOutlet weak var saveQRCodeAsFileButton: NSButton!\n    \n    var defaults: UserDefaults!\n    var profileMgr: ServerProfileManager!\n\n    override func windowDidLoad() {\n        super.windowDidLoad()\n        \n        defaults = UserDefaults.standard\n        profileMgr = ServerProfileManager.instance\n        profilesTableView.reloadData()\n        \n        if !profileMgr.profiles.isEmpty {\n            let index = IndexSet(integer: 0)\n            profilesTableView.selectRowIndexes(index, byExtendingSelection: false)\n        } else {\n            copyAllServerURLsButton.isEnabled = false\n            saveAllServerURLsAsFileButton.isEnabled = false\n            copyURLButton.isEnabled = false\n            copyQRCodeButton.isEnabled = false\n            saveQRCodeAsFileButton.isEnabled = false\n        }\n    }\n    \n    @IBAction func copyURL(_ sender: NSButton) {\n        let profile = getSelectedProfile()\n        if profile.isValid(), let url = profile.URL() {\n            let pb = NSPasteboard.general\n            pb.clearContents()\n            if pb.writeObjects([url.absoluteString as NSPasteboardWriting]) {\n                NSLog(\"Copy URL to clipboard\")\n            } else {\n                NSLog(\"Failed to copy URL to clipboard\")\n            }\n        }\n    }\n    \n    @IBAction func copyQRCode(_ sender: NSButton) {\n        if let img = qrCodeImageView.image {\n            let pb = NSPasteboard.general\n            pb.clearContents()\n            if pb.writeObjects([img as NSPasteboardWriting]) {\n                NSLog(\"Copy QRCode to clipboard\")\n            } else {\n                NSLog(\"Failed to copy QRCode to clipboard\")\n            }\n        }\n    }\n    \n    @IBAction func saveQRCodeAsFile(_ sender: NSButton) {\n        if let img = qrCodeImageView.image {\n            let savePanel = NSSavePanel()\n            savePanel.title = \"Save QRCode As File\".localized\n            savePanel.canCreateDirectories = true\n            savePanel.allowedFileTypes = [\"gif\"]\n            savePanel.isExtensionHidden = false\n            \n            let profile = getSelectedProfile()\n            if profile.remark.isEmpty {\n                savePanel.nameFieldStringValue = \"shadowsocks_qrcode.gif\"\n            } else {\n                savePanel.nameFieldStringValue = \"shadowsocks_qrcode_\\(profile.remark).gif\"\n            }\n            \n            savePanel.becomeKey()\n            let result = savePanel.runModal()\n            if (result.rawValue == NSFileHandlingPanelOKButton && (savePanel.url) != nil) {\n                let imgRep = NSBitmapImageRep(data: img.tiffRepresentation!)\n                let data = imgRep?.representation(using: NSBitmapImageRep.FileType.gif, properties: [:])\n                try! data?.write(to: savePanel.url!)\n            }\n        }\n    }\n    \n    @IBAction func copyAllServerURLs(_ sender: NSButton) {\n        let pb = NSPasteboard.general\n        pb.clearContents()\n        if pb.writeObjects([getAllServerURLs() as NSPasteboardWriting]) {\n            NSLog(\"Copy all server URLs to clipboard\")\n        } else {\n            NSLog(\"Failed to all server URLs to clipboard\")\n        }\n    }\n    \n    @IBAction func saveAllServerURLsAsFile(_ sender: NSButton) {\n        let formatter = DateFormatter()\n        formatter.dateFormat = \"yyyyMMdd\"\n        let date_string = formatter.string(from: Date())\n\n        let savePanel = NSSavePanel()\n        savePanel.title = \"Save All Server URLs To File\".localized\n        savePanel.canCreateDirectories = true\n        savePanel.allowedFileTypes = [\"txt\"]\n        savePanel.isExtensionHidden = false\n        savePanel.nameFieldStringValue = \"shadowsocks_profiles_\\(date_string).txt\"\n        savePanel.becomeKey()\n        let result = savePanel.runModal()\n        if (result.rawValue == NSFileHandlingPanelOKButton && (savePanel.url) != nil) {\n            let urls = getAllServerURLs()\n            try! urls.write(to: (savePanel.url)!, atomically: true, encoding: String.Encoding.utf8)\n        }\n    }\n    \n    func getAllServerURLs() -> String {\n        let urls = profileMgr.profiles.filter({ (profile) -> Bool in\n            return profile.isValid()\n        }).map { (profile) -> String in\n            return profile.URL()!.absoluteString\n        }\n        return urls.joined(separator: \"\\n\")\n    }\n    \n    func getSelectedProfile() -> ServerProfile {\n        let i = profilesTableView.selectedRow\n        return profileMgr.profiles[i]\n    }\n    \n    func getDataAtRow(_ index:Int) -> String {\n        let profile = profileMgr.profiles[index]\n        if !profile.remark.isEmpty {\n            return profile.remark\n        } else {\n            return profile.serverHost\n        }\n    }\n    \n    //--------------------------------------------------\n    // For NSTableViewDataSource\n    \n    func numberOfRows(in tableView: NSTableView) -> Int {\n        if let mgr = profileMgr {\n            return mgr.profiles.count\n        }\n        return 0\n    }\n    \n    //--------------------------------------------------\n    // For NSTableViewDelegate\n    \n    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {\n        let colId = NSUserInterfaceItemIdentifier(rawValue: \"cellTitle\")\n        if let cell = tableView.makeView(withIdentifier: colId, owner: self) as? NSTableCellView {\n            cell.textField?.stringValue = getDataAtRow(row)\n            return cell\n        }\n        return nil\n    }\n    \n    func tableViewSelectionDidChange(_ notification: Notification) {\n        if profilesTableView.selectedRow >= 0 {\n            let profile = getSelectedProfile()\n            if profile.isValid(), let url = profile.URL() {\n                let img = createQRImage(url.absoluteString, NSMakeSize(250, 250))\n                qrCodeImageView.image = img\n                \n                copyURLButton.isEnabled = true\n                copyQRCodeButton.isEnabled = true\n                saveQRCodeAsFileButton.isEnabled = true\n                return\n            }\n        }\n        qrCodeImageView.image = nil\n            \n        copyURLButton.isEnabled = false\n        copyQRCodeButton.isEnabled = false\n        saveQRCodeAsFileButton.isEnabled = false\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ShortcutsController.h",
    "content": "//\n//  ShortcutsController.h\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2017/3/10.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface ShortcutsController : NSObject\n\n+ (void)bindShortcuts;\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ShortcutsController.m",
    "content": "//\n//  ShortcutsController.m\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2017/3/10.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\n#import \"ShortcutsController.h\"\n\n#import <MASShortcut/Shortcut.h>\n\n\n@implementation ShortcutsController\n\n+ (void)bindShortcuts {\n    MASShortcutBinder* binder = [MASShortcutBinder sharedBinder];\n    [binder\n     bindShortcutWithDefaultsKey: @\"ToggleRunning\"\n     toAction:^{\n         [[NSNotificationCenter defaultCenter] postNotificationName: @\"NOTIFY_TOGGLE_RUNNING_SHORTCUT\" object: nil];\n     }];    \n    [binder\n     bindShortcutWithDefaultsKey: @\"SwitchProxyMode\"\n     toAction:^{\n         [[NSNotificationCenter defaultCenter] postNotificationName: @\"NOTIFY_SWITCH_PROXY_MODE_SHORTCUT\" object: nil];\n     }];    \n}\n\n@end\n"
  },
  {
    "path": "ShadowsocksX-NG/ToastWindowController.swift",
    "content": "//\n//  ToastWindowController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 2017/3/20.\n//  Copyright © 2017年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\nclass ToastWindowController: NSWindowController {\n    \n    var message: String = \"\"\n    \n    @IBOutlet weak var titleTextField: NSTextField!\n    @IBOutlet weak var panelView: NSView!\n    \n    let kHudFadeInDuration: Double = 0.35\n    let kHudFadeOutDuration: Double = 0.35\n    let kHudDisplayDuration: Double = 1.2\n\n    let kHudAlphaValue: CGFloat = 0.75\n    let kHudCornerRadius: CGFloat = 18.0\n    let kHudHorizontalMargin: CGFloat = 30\n    let kHudHeight: CGFloat = 90.0\n    \n    var timerToFadeOut: Timer? = nil\n    var fadingOut: Bool = false\n\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        self.shouldCascadeWindows = false\n\n        // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n        if let win = self.window {\n            win.isOpaque = false\n            win.backgroundColor = .clear\n            win.styleMask = NSWindow.StyleMask.borderless\n            win.hidesOnDeactivate = false\n            win.collectionBehavior = NSWindow.CollectionBehavior.canJoinAllSpaces\n            win.level = NSWindow.Level(rawValue: Int(CGWindowLevelForKey(.floatingWindow)))\n            win.orderFrontRegardless()\n        }\n\n        let viewLayer: CALayer = CALayer()\n        viewLayer.backgroundColor = CGColor.init(red: 0.05, green: 0.05, blue: 0.05, alpha: kHudAlphaValue)\n        viewLayer.cornerRadius = kHudCornerRadius\n        panelView.wantsLayer = true\n        panelView.layer = viewLayer\n        panelView.layer?.opacity = 0.0\n        \n        self.titleTextField.stringValue = self.message\n        \n        setupHud()\n    }\n    \n    func setupHud() -> Void {\n        titleTextField.sizeToFit()\n\n        var labelFrame: CGRect = titleTextField.frame\n        var hudWindowFrame: CGRect = self.window!.frame\n        hudWindowFrame.size.width = labelFrame.size.width + kHudHorizontalMargin * 2\n        hudWindowFrame.size.height = kHudHeight\n\n        let screenRect: NSRect = NSScreen.screens[0].visibleFrame\n        hudWindowFrame.origin.x = (screenRect.size.width - hudWindowFrame.size.width) / 2\n        hudWindowFrame.origin.y = (screenRect.size.height - hudWindowFrame.size.height) / 2\n        self.window!.setFrame(hudWindowFrame, display: true)\n\n        var viewFrame: NSRect = hudWindowFrame;\n        viewFrame.origin.x = 0\n        viewFrame.origin.y = 0\n        panelView.frame = viewFrame\n\n        labelFrame.origin.x = kHudHorizontalMargin\n        labelFrame.origin.y = (hudWindowFrame.size.height - labelFrame.size.height) / 2\n        titleTextField.frame = labelFrame\n    }\n    \n    func fadeInHud() -> Void {\n        if timerToFadeOut != nil {\n            timerToFadeOut?.invalidate()\n            timerToFadeOut = nil\n        }\n\n        fadingOut = false\n\n        CATransaction.begin()\n        CATransaction.setAnimationDuration(kHudFadeInDuration)\n        CATransaction.setCompletionBlock { self.didFadeIn() }\n        panelView.layer?.opacity = 1.0\n        CATransaction.commit()\n    }\n\n    func didFadeIn() -> Void {\n        timerToFadeOut = Timer.scheduledTimer(\n            timeInterval: kHudDisplayDuration,\n            target: self,\n            selector: #selector(fadeOutHud),\n            userInfo: nil,\n            repeats: false)\n    }\n\n    @objc func fadeOutHud() -> Void {\n        fadingOut = true\n\n        CATransaction.begin()\n        CATransaction.setAnimationDuration(kHudFadeOutDuration)\n        CATransaction.setCompletionBlock { self.didFadeOut() }\n        panelView.layer?.opacity = 0.0\n        CATransaction.commit()\n    }\n\n    func didFadeOut() -> Void {\n        if fadingOut {\n            self.window?.orderOut(self)\n        }\n        fadingOut = false\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/ToastWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"11762\" systemVersion=\"16D32\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11762\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"ToastWindowController\" customModule=\"ShadowsocksX_NG\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"panelView\" destination=\"KRY-zc-8By\" id=\"a3Z-ll-K4V\"/>\n                <outlet property=\"titleTextField\" destination=\"scG-hz-bja\" id=\"8Dk-Hq-eUS\"/>\n                <outlet property=\"window\" destination=\"kRK-Pd-y69\" id=\"pHW-35-GCT\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <window title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" hidesOnDeactivate=\"YES\" oneShot=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"kRK-Pd-y69\" customClass=\"NSPanel\">\n            <windowStyleMask key=\"styleMask\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\" utility=\"YES\"/>\n            <rect key=\"contentRect\" x=\"139\" y=\"81\" width=\"300\" height=\"100\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1920\" height=\"1057\"/>\n            <value key=\"minSize\" type=\"size\" width=\"200\" height=\"100\"/>\n            <view key=\"contentView\" id=\"KRY-zc-8By\" userLabel=\"Panel View\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"300\" height=\"100\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                <subviews>\n                    <textField verticalHuggingPriority=\"750\" fixedFrame=\"YES\" preferredMaxLayoutWidth=\"162\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"scG-hz-bja\" userLabel=\"Is Name\">\n                        <rect key=\"frame\" x=\"24\" y=\"33\" width=\"258\" height=\"31\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" alignment=\"center\" title=\"Label\" usesSingleLineMode=\"YES\" id=\"eQL-ri-Y7Z\">\n                            <font key=\"font\" metaFont=\"system\" size=\"24\"/>\n                            <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <color key=\"backgroundColor\" name=\"alternateSelectedControlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <point key=\"canvasLocation\" x=\"-2307\" y=\"172\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "ShadowsocksX-NG/UserRulesController.swift",
    "content": "//\n//  UserRulesController.swift\n//  ShadowsocksX-NG\n//\n//  Created by 周斌佳 on 16/8/1.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Cocoa\n\nclass UserRulesController: NSWindowController {\n\n    @IBOutlet var userRulesView: NSTextView!\n\n    override func windowDidLoad() {\n        super.windowDidLoad()\n\n        let fileMgr = FileManager.default\n        if !fileMgr.fileExists(atPath: PACUserRuleFilePath) {\n            let src = Bundle.main.path(forResource: \"user-rule\", ofType: \"txt\")\n            try! fileMgr.copyItem(atPath: src!, toPath: PACUserRuleFilePath)\n        }\n\n        let str = try? String(contentsOfFile: PACUserRuleFilePath, encoding: String.Encoding.utf8)\n        userRulesView.string = str!\n    }\n    \n    @IBAction func didCancel(_ sender: AnyObject) {\n        window?.performClose(self)\n    }\n\n    @IBAction func didOK(_ sender: AnyObject) {\n        if let str = userRulesView?.string {\n            do {\n                try str.data(using: String.Encoding.utf8)?.write(to: URL(fileURLWithPath: PACUserRuleFilePath), options: .atomic)\n\n                if GeneratePACFile() {\n                    // Popup a user notification\n                    let notification = NSUserNotification()\n                    notification.title = \"PAC has been updated by User Rules.\".localized\n                    NSUserNotificationCenter.default\n                        .deliver(notification)\n                } else {\n                    let notification = NSUserNotification()\n                    notification.title = \"It's failed to update PAC by User Rules.\".localized\n                    NSUserNotificationCenter.default\n                        .deliver(notification)\n                }\n            } catch {}\n        }\n        window?.performClose(self)\n    }\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/Utils.h",
    "content": "//\n//  QRCodeUtils.h\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/8.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#ifndef QRCodeUtils_h\n#define QRCodeUtils_h\n\nvoid ScanQRCodeOnScreen();\n\nNSImage* createQRImage(NSString *string, NSSize size);\n\n#endif /* QRCodeUtils_h */\n"
  },
  {
    "path": "ShadowsocksX-NG/Utils.m",
    "content": "//\n//  QRCodeUtils.m\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/8.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <CoreImage/CoreImage.h>\n#import <AppKit/AppKit.h>\n\nvoid ScanQRCodeOnScreen(void) {    \n    /* check system version and permission status */\n    if (@available(macOS 10.12, *)) {\n        BOOL hasPermission = CGPreflightScreenCaptureAccess();\n        NSLog(@\"Screen Recording Permission Status: %@\", hasPermission ? @\"Granted\" : @\"Not Granted\");\n        \n        if (!hasPermission) {\n            NSLog(@\"Requesting Screen Recording Permission...\");\n            CGRequestScreenCaptureAccess();\n            \n            /* check permission status after request */\n            hasPermission = CGPreflightScreenCaptureAccess();\n            NSLog(@\"Screen Recording Permission Status After Request: %@\", hasPermission ? @\"Granted\" : @\"Not Granted\");\n            \n            if (!hasPermission) {\n                NSLog(@\"Screen Recording Permission Denied\");\n                \n                /* send notification about permission missing */\n                [[NSNotificationCenter defaultCenter]\n                 postNotificationName:@\"NOTIFY_FOUND_SS_URL\"\n                 object:nil\n                 userInfo:@{\n                     @\"urls\": @[],\n                     @\"source\": @\"qrcode\",\n                     @\"error\": @\"Screen Recording permission required. Please grant permission in System Preferences and restart ShadowsocksX-NG\"\n                 }];\n                \n                /* open system privacy settings */\n                [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@\"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture\"]];\n                return;\n            }\n        }\n        \n        NSLog(@\"Proceeding with screen capture...\");\n    }\n    \n    /* displays[] Quartz display ID's */\n    CGDirectDisplayID   *displays = nil;\n    CGDisplayCount      dspCount = 0;\n    \n    /* variables for collecting scan information */\n    NSMutableDictionary *scanInfo = [NSMutableDictionary dictionary];\n    NSMutableArray *foundSSUrls = [NSMutableArray array];\n    NSMutableArray *foundQRCodes = [NSMutableArray array];\n    \n    /* How many active displays do we have? */\n    CGError err = CGGetActiveDisplayList(0, NULL, &dspCount);\n    \n    if(err != CGDisplayNoErr) {\n        [[NSNotificationCenter defaultCenter]\n         postNotificationName:@\"NOTIFY_FOUND_SS_URL\"\n         object:nil\n         userInfo:@{\n             @\"urls\": @[],\n             @\"source\": @\"qrcode\",\n             @\"error\": @\"Failed to get display list\"\n         }];\n        return;\n    }\n    \n    scanInfo[@\"displayCount\"] = @(dspCount);\n    NSLog(@\"Found %d displays\", dspCount);\n    \n    /* Allocate enough memory to hold all the display IDs we have. */\n    displays = calloc((size_t)dspCount, sizeof(CGDirectDisplayID));\n    \n    // Get the list of active displays\n    err = CGGetActiveDisplayList(dspCount, displays, &dspCount);\n    \n    if(err != CGDisplayNoErr) {\n        free(displays);\n        [[NSNotificationCenter defaultCenter]\n         postNotificationName:@\"NOTIFY_FOUND_SS_URL\"\n         object:nil\n         userInfo:@{\n             @\"urls\": @[],\n             @\"source\": @\"qrcode\",\n             @\"error\": @\"Failed to get display information\"\n         }];\n        return;\n    }\n    \n    CIDetector *detector = [CIDetector detectorOfType:@\"CIDetectorTypeQRCode\"\n                                            context:nil\n                                            options:@{ CIDetectorAccuracy:CIDetectorAccuracyHigh }];\n    \n    int totalQRCodesFound = 0;\n    int validSSUrlsFound = 0;\n    \n    for (unsigned int displaysIndex = 0; displaysIndex < dspCount; displaysIndex++) {\n        CGImageRef image = CGDisplayCreateImage(displays[displaysIndex]);\n        NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image]];\n        \n        /* count total QR codes found */\n        totalQRCodesFound += (int)features.count;\n        \n        for (CIQRCodeFeature *feature in features) {\n            NSLog(@\"Found QR Code: %@\", feature.messageString);\n            [foundQRCodes addObject:feature.messageString];\n            \n            if ([feature.messageString hasPrefix:@\"ss://\"]) {\n                NSURL *url = [NSURL URLWithString:feature.messageString];\n                if (url) {\n                    [foundSSUrls addObject:url];\n                    validSSUrlsFound++;\n                }\n            }\n        }\n        CGImageRelease(image);\n    }\n    \n    free(displays);\n    \n    /* prepare notification information */\n    NSString *notificationTitle;\n    NSString *notificationSubtitle;\n    NSString *notificationBody;\n    \n    if (totalQRCodesFound == 0) {\n        notificationTitle = [NSString stringWithFormat:@\"Scanned %d displays\", dspCount];\n        notificationSubtitle = @\"No QR codes found\";\n        notificationBody = @\"Try adjusting the QR code position on your screen\";\n    } else if (validSSUrlsFound == 0) {\n        notificationTitle = [NSString stringWithFormat:@\"Found %d QR code(s)\", totalQRCodesFound];\n        notificationSubtitle = @\"No valid Shadowsocks URLs\";\n        notificationBody = @\"QR codes found are not Shadowsocks configuration\";\n    } else {\n        notificationTitle = [NSString stringWithFormat:@\"Found %d Shadowsocks URL(s)\", validSSUrlsFound];\n        notificationSubtitle = [NSString stringWithFormat:@\"Scanned %d displays, found %d QR codes\", dspCount, totalQRCodesFound];\n        notificationBody = @\"Processing Shadowsocks configuration...\";\n    }\n    \n    [[NSNotificationCenter defaultCenter]\n     postNotificationName:@\"NOTIFY_FOUND_SS_URL\"\n     object:nil\n     userInfo:@{\n         @\"urls\": foundSSUrls,\n         @\"source\": @\"qrcode\",\n         @\"title\": notificationTitle,\n         @\"subtitle\": notificationSubtitle,\n         @\"body\": notificationBody,\n         @\"scanInfo\": @{\n             @\"displayCount\": @(dspCount),\n             @\"totalQRCodes\": @(totalQRCodesFound),\n             @\"validURLs\": @(validSSUrlsFound)\n         }\n     }];\n}\n\nNSImage* createQRImage(NSString *string, NSSize size) {\n    NSImage *outputImage = [[NSImage alloc]initWithSize:size];\n    [outputImage lockFocus];\n    \n    // Setup the QR filter with our string\n    CIFilter *filter = [CIFilter filterWithName:@\"CIQRCodeGenerator\"];\n    [filter setDefaults];\n    \n    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];\n    [filter setValue:data forKey:@\"inputMessage\"];\n    /*\n     L: 7%\n     M: 15%\n     Q: 25%\n     H: 30%\n     */\n    [filter setValue:@\"Q\" forKey:@\"inputCorrectionLevel\"];\n    \n    CIImage *image = [filter valueForKey:@\"outputImage\"];\n    \n    // Calculate the size of the generated image and the scale for the desired image size\n    CGRect extent = CGRectIntegral(image.extent);\n    CGFloat scale = MIN(size.width / CGRectGetWidth(extent), size.height / CGRectGetHeight(extent));\n    \n    CGImageRef bitmapImage = [NSGraphicsContext.currentContext.CIContext createCGImage:image fromRect:extent];\n    \n    CGContextRef graphicsContext = NSGraphicsContext.currentContext.CGContext;\n    \n    CGContextSetInterpolationQuality(graphicsContext, kCGInterpolationNone);\n    CGContextScaleCTM(graphicsContext, scale, scale);\n    CGContextDrawImage(graphicsContext, extent, bitmapImage);\n    \n    // Cleanup\n    CGImageRelease(bitmapImage);\n    \n    [outputImage unlockFocus];\n    return outputImage;\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/Utils.swift",
    "content": "//\n//  Utils.swift\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/7.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\nimport Foundation\n\nextension String {\n    var localized: String {\n        return NSLocalizedString(self, tableName: \"Localizable\", comment: \"\")\n    }\n    \n    func localized(withComment:String) -> String {\n        return NSLocalizedString(self, tableName: \"Localizable\", comment: withComment)\n    }\n}\n\nextension Data {\n    func sha1() -> String {\n        let data = self\n        var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))\n        CC_SHA1((data as NSData).bytes, CC_LONG(data.count), &digest)\n        let hexBytes = digest.map { String(format: \"%02hhx\", $0) }\n        return hexBytes.joined(separator: \"\")\n    }\n}\n\nenum ProxyType {\n    case pac\n    case global\n}\n\nstruct Globals {\n    static var proxyType = ProxyType.pac\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/abp.js",
    "content": "// Generated by gfwlist2pac in precise mode\n// https://github.com/clowwindy/gfwlist2pac\n\nvar proxy = \"SOCKS5 __SOCKS5ADDR__:__SOCKS5PORT__; SOCKS __SOCKS5ADDR__:__SOCKS5PORT__; DIRECT;\";\n\nvar rules = __RULES__;\n\n/*\n * This file is part of Adblock Plus <http://adblockplus.org/>,\n * Copyright (C) 2006-2014 Eyeo GmbH\n *\n * Adblock Plus is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 3 as\n * published by the Free Software Foundation.\n *\n * Adblock Plus is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nfunction createDict()\n{\n  var result = {};\n  result.__proto__ = null;\n  return result;\n}\n\nfunction getOwnPropertyDescriptor(obj, key)\n{\n  if (obj.hasOwnProperty(key))\n  {\n    return obj[key];\n  }\n  return null;\n}\n\nfunction extend(subclass, superclass, definition)\n{\n  if (Object.__proto__)\n  {\n    definition.__proto__ = superclass.prototype;\n    subclass.prototype = definition;\n  }\n  else\n  {\n    var tmpclass = function(){}, ret;\n    tmpclass.prototype = superclass.prototype;\n    subclass.prototype = new tmpclass();\n    subclass.prototype.constructor = superclass;\n    for (var i in definition)\n    {\n      if (definition.hasOwnProperty(i))\n      {\n        subclass.prototype[i] = definition[i];\n      }\n    }\n  }\n}\n\nfunction Filter(text)\n{\n  this.text = text;\n  this.subscriptions = [];\n}\nFilter.prototype = {\ntext: null,\nsubscriptions: null,\ntoString: function()\n  {\n    return this.text;\n  }\n};\nFilter.knownFilters = createDict();\nFilter.elemhideRegExp = /^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+(?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$/;\nFilter.regexpRegExp = /^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)?$/;\nFilter.optionsRegExp = /\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$/;\nFilter.fromText = function(text)\n{\n  if (text in Filter.knownFilters)\n  {\n    return Filter.knownFilters[text];\n  }\n  var ret;\n  if (text[0] == \"!\")\n  {\n    ret = new CommentFilter(text);\n  }\n  else\n  {\n    ret = RegExpFilter.fromText(text);\n  }\n  Filter.knownFilters[ret.text] = ret;\n  return ret;\n};\n\nfunction InvalidFilter(text, reason)\n{\n  Filter.call(this, text);\n  this.reason = reason;\n}\nextend(InvalidFilter, Filter, {\n       reason: null\n       });\n\nfunction CommentFilter(text)\n{\n  Filter.call(this, text);\n}\nextend(CommentFilter, Filter, {\n       });\n\nfunction ActiveFilter(text, domains)\n{\n  Filter.call(this, text);\n  this.domainSource = domains;\n}\nextend(ActiveFilter, Filter, {\n       domainSource: null,\n       domainSeparator: null,\n       ignoreTrailingDot: true,\n       domainSourceIsUpperCase: false,\n       getDomains: function()\n       {\n       var prop = getOwnPropertyDescriptor(this, \"domains\");\n       if (prop)\n       {\n       return prop;\n       }\n       var domains = null;\n       if (this.domainSource)\n       {\n       var source = this.domainSource;\n       if (!this.domainSourceIsUpperCase)\n       {\n       source = source.toUpperCase();\n       }\n       var list = source.split(this.domainSeparator);\n       if (list.length == 1 && list[0][0] != \"~\")\n       {\n       domains = createDict();\n       domains[\"\"] = false;\n       if (this.ignoreTrailingDot)\n       {\n       list[0] = list[0].replace(/\\.+$/, \"\");\n       }\n       domains[list[0]] = true;\n       }\n       else\n       {\n       var hasIncludes = false;\n       for (var i = 0; i < list.length; i++)\n       {\n       var domain = list[i];\n       if (this.ignoreTrailingDot)\n       {\n       domain = domain.replace(/\\.+$/, \"\");\n       }\n       if (domain == \"\")\n       {\n       continue;\n       }\n       var include;\n       if (domain[0] == \"~\")\n       {\n       include = false;\n       domain = domain.substr(1);\n       }\n       else\n       {\n       include = true;\n       hasIncludes = true;\n       }\n       if (!domains)\n       {\n       domains = createDict();\n       }\n       domains[domain] = include;\n       }\n       domains[\"\"] = !hasIncludes;\n       }\n       this.domainSource = null;\n       }\n       return this.domains;\n       },\n       sitekeys: null,\n       isActiveOnDomain: function(docDomain, sitekey)\n       {\n       if (this.getSitekeys() && (!sitekey || this.getSitekeys().indexOf(sitekey.toUpperCase()) < 0))\n       {\n       return false;\n       }\n       if (!this.getDomains())\n       {\n       return true;\n       }\n       if (!docDomain)\n       {\n       return this.getDomains()[\"\"];\n       }\n       if (this.ignoreTrailingDot)\n       {\n       docDomain = docDomain.replace(/\\.+$/, \"\");\n       }\n       docDomain = docDomain.toUpperCase();\n       while (true)\n       {\n       if (docDomain in this.getDomains())\n       {\n       return this.domains[docDomain];\n       }\n       var nextDot = docDomain.indexOf(\".\");\n       if (nextDot < 0)\n       {\n       break;\n       }\n       docDomain = docDomain.substr(nextDot + 1);\n       }\n       return this.domains[\"\"];\n       },\n       isActiveOnlyOnDomain: function(docDomain)\n       {\n       if (!docDomain || !this.getDomains() || this.getDomains()[\"\"])\n       {\n       return false;\n       }\n       if (this.ignoreTrailingDot)\n       {\n       docDomain = docDomain.replace(/\\.+$/, \"\");\n       }\n       docDomain = docDomain.toUpperCase();\n       for (var domain in this.getDomains())\n       {\n       if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf(\".\" + docDomain) != domain.length - docDomain.length - 1))\n       {\n       return false;\n       }\n       }\n       return true;\n       }\n       });\n\nfunction RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys)\n{\n  ActiveFilter.call(this, text, domains, sitekeys);\n  if (contentType != null)\n  {\n    this.contentType = contentType;\n  }\n  if (matchCase)\n  {\n    this.matchCase = matchCase;\n  }\n  if (thirdParty != null)\n  {\n    this.thirdParty = thirdParty;\n  }\n  if (sitekeys != null)\n  {\n    this.sitekeySource = sitekeys;\n  }\n  if (regexpSource.length >= 2 && regexpSource[0] == \"/\" && regexpSource[regexpSource.length - 1] == \"/\")\n  {\n    var regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? \"\" : \"i\");\n    this.regexp = regexp;\n  }\n  else\n  {\n    this.regexpSource = regexpSource;\n  }\n}\nextend(RegExpFilter, ActiveFilter, {\n       domainSourceIsUpperCase: true,\n       length: 1,\n       domainSeparator: \"|\",\n       regexpSource: null,\n       getRegexp: function()\n       {\n       var prop = getOwnPropertyDescriptor(this, \"regexp\");\n       if (prop)\n       {\n       return prop;\n       }\n       var source = this.regexpSource.replace(/\\*+/g, \"*\").replace(/\\^\\|$/, \"^\").replace(/\\W/g, \"\\\\$&\").replace(/\\\\\\*/g, \".*\").replace(/\\\\\\^/g, \"(?:[\\\\x00-\\\\x24\\\\x26-\\\\x2C\\\\x2F\\\\x3A-\\\\x40\\\\x5B-\\\\x5E\\\\x60\\\\x7B-\\\\x7F]|$)\").replace(/^\\\\\\|\\\\\\|/, \"^[\\\\w\\\\-]+:\\\\/+(?!\\\\/)(?:[^\\\\/]+\\\\.)?\").replace(/^\\\\\\|/, \"^\").replace(/\\\\\\|$/, \"$\").replace(/^(\\.\\*)/, \"\").replace(/(\\.\\*)$/, \"\");\n       var regexp = new RegExp(source, this.matchCase ? \"\" : \"i\");\n       this.regexp = regexp;\n       return regexp;\n       },\n       contentType: 2147483647,\n       matchCase: false,\n       thirdParty: null,\n       sitekeySource: null,\n       getSitekeys: function()\n       {\n       var prop = getOwnPropertyDescriptor(this, \"sitekeys\");\n       if (prop)\n       {\n       return prop;\n       }\n       var sitekeys = null;\n       if (this.sitekeySource)\n       {\n       sitekeys = this.sitekeySource.split(\"|\");\n       this.sitekeySource = null;\n       }\n       this.sitekeys = sitekeys;\n       return this.sitekeys;\n       },\n       matches: function(location, contentType, docDomain, thirdParty, sitekey)\n       {\n       if (this.getRegexp().test(location) && this.isActiveOnDomain(docDomain, sitekey))\n       {\n       return true;\n       }\n       return false;\n       }\n       });\nRegExpFilter.prototype[\"0\"] = \"#this\";\nRegExpFilter.fromText = function(text)\n{\n  var blocking = true;\n  var origText = text;\n  if (text.indexOf(\"@@\") == 0)\n  {\n    blocking = false;\n    text = text.substr(2);\n  }\n  var contentType = null;\n  var matchCase = null;\n  var domains = null;\n  var sitekeys = null;\n  var thirdParty = null;\n  var collapse = null;\n  var options;\n  var match = text.indexOf(\"$\") >= 0 ? Filter.optionsRegExp.exec(text) : null;\n  if (match)\n  {\n    options = match[1].toUpperCase().split(\",\");\n    text = match.input.substr(0, match.index);\n    for (var _loopIndex6 = 0; _loopIndex6 < options.length; ++_loopIndex6)\n    {\n      var option = options[_loopIndex6];\n      var value = null;\n      var separatorIndex = option.indexOf(\"=\");\n      if (separatorIndex >= 0)\n      {\n        value = option.substr(separatorIndex + 1);\n        option = option.substr(0, separatorIndex);\n      }\n      option = option.replace(/-/, \"_\");\n      if (option in RegExpFilter.typeMap)\n      {\n        if (contentType == null)\n        {\n          contentType = 0;\n        }\n        contentType |= RegExpFilter.typeMap[option];\n      }\n      else if (option[0] == \"~\" && option.substr(1) in RegExpFilter.typeMap)\n      {\n        if (contentType == null)\n        {\n          contentType = RegExpFilter.prototype.contentType;\n        }\n        contentType &= ~RegExpFilter.typeMap[option.substr(1)];\n      }\n      else if (option == \"MATCH_CASE\")\n      {\n        matchCase = true;\n      }\n      else if (option == \"~MATCH_CASE\")\n      {\n        matchCase = false;\n      }\n      else if (option == \"DOMAIN\" && typeof value != \"undefined\")\n      {\n        domains = value;\n      }\n      else if (option == \"THIRD_PARTY\")\n      {\n        thirdParty = true;\n      }\n      else if (option == \"~THIRD_PARTY\")\n      {\n        thirdParty = false;\n      }\n      else if (option == \"COLLAPSE\")\n      {\n        collapse = true;\n      }\n      else if (option == \"~COLLAPSE\")\n      {\n        collapse = false;\n      }\n      else if (option == \"SITEKEY\" && typeof value != \"undefined\")\n      {\n        sitekeys = value;\n      }\n      else\n      {\n        return new InvalidFilter(origText, \"Unknown option \" + option.toLowerCase());\n      }\n    }\n  }\n  if (!blocking && (contentType == null || contentType & RegExpFilter.typeMap.DOCUMENT) && (!options || options.indexOf(\"DOCUMENT\") < 0) && !/^\\|?[\\w\\-]+:/.test(text))\n  {\n    if (contentType == null)\n    {\n      contentType = RegExpFilter.prototype.contentType;\n    }\n    contentType &= ~RegExpFilter.typeMap.DOCUMENT;\n  }\n  try\n  {\n    if (blocking)\n    {\n      return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse);\n    }\n    else\n    {\n      return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys);\n    }\n  }\n  catch (e)\n  {\n    return new InvalidFilter(origText, e);\n  }\n};\nRegExpFilter.typeMap = {\nOTHER: 1,\nSCRIPT: 2,\nIMAGE: 4,\nSTYLESHEET: 8,\nOBJECT: 16,\nSUBDOCUMENT: 32,\nDOCUMENT: 64,\nXBL: 1,\nPING: 1,\nXMLHTTPREQUEST: 2048,\nOBJECT_SUBREQUEST: 4096,\nDTD: 1,\nMEDIA: 16384,\nFONT: 32768,\nBACKGROUND: 4,\nPOPUP: 268435456,\nELEMHIDE: 1073741824\n};\nRegExpFilter.prototype.contentType &= ~ (RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP);\n\nfunction BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse)\n{\n  RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys);\n  this.collapse = collapse;\n}\nextend(BlockingFilter, RegExpFilter, {\n       collapse: null\n       });\n\nfunction WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys)\n{\n  RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys);\n}\nextend(WhitelistFilter, RegExpFilter, {\n       });\n\nfunction Matcher()\n{\n  this.clear();\n}\nMatcher.prototype = {\nfilterByKeyword: null,\nkeywordByFilter: null,\nclear: function()\n  {\n    this.filterByKeyword = createDict();\n    this.keywordByFilter = createDict();\n  },\nadd: function(filter)\n  {\n    if (filter.text in this.keywordByFilter)\n    {\n      return;\n    }\n    var keyword = this.findKeyword(filter);\n    var oldEntry = this.filterByKeyword[keyword];\n    if (typeof oldEntry == \"undefined\")\n    {\n      this.filterByKeyword[keyword] = filter;\n    }\n    else if (oldEntry.length == 1)\n    {\n      this.filterByKeyword[keyword] = [oldEntry, filter];\n    }\n    else\n    {\n      oldEntry.push(filter);\n    }\n    this.keywordByFilter[filter.text] = keyword;\n  },\nremove: function(filter)\n  {\n    if (!(filter.text in this.keywordByFilter))\n    {\n      return;\n    }\n    var keyword = this.keywordByFilter[filter.text];\n    var list = this.filterByKeyword[keyword];\n    if (list.length <= 1)\n    {\n      delete this.filterByKeyword[keyword];\n    }\n    else\n    {\n      var index = list.indexOf(filter);\n      if (index >= 0)\n      {\n        list.splice(index, 1);\n        if (list.length == 1)\n        {\n          this.filterByKeyword[keyword] = list[0];\n        }\n      }\n    }\n    delete this.keywordByFilter[filter.text];\n  },\nfindKeyword: function(filter)\n  {\n    var result = \"\";\n    var text = filter.text;\n    if (Filter.regexpRegExp.test(text))\n    {\n      return result;\n    }\n    var match = Filter.optionsRegExp.exec(text);\n    if (match)\n    {\n      text = match.input.substr(0, match.index);\n    }\n    if (text.substr(0, 2) == \"@@\")\n    {\n      text = text.substr(2);\n    }\n    var candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g);\n    if (!candidates)\n    {\n      return result;\n    }\n    var hash = this.filterByKeyword;\n    var resultCount = 16777215;\n    var resultLength = 0;\n    for (var i = 0, l = candidates.length; i < l; i++)\n    {\n      var candidate = candidates[i].substr(1);\n      var count = candidate in hash ? hash[candidate].length : 0;\n      if (count < resultCount || count == resultCount && candidate.length > resultLength)\n      {\n        result = candidate;\n        resultCount = count;\n        resultLength = candidate.length;\n      }\n    }\n    return result;\n  },\nhasFilter: function(filter)\n  {\n    return filter.text in this.keywordByFilter;\n  },\ngetKeywordForFilter: function(filter)\n  {\n    if (filter.text in this.keywordByFilter)\n    {\n      return this.keywordByFilter[filter.text];\n    }\n    else\n    {\n      return null;\n    }\n  },\n_checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, sitekey)\n  {\n    var list = this.filterByKeyword[keyword];\n    for (var i = 0; i < list.length; i++)\n    {\n      var filter = list[i];\n      if (filter == \"#this\")\n      {\n        filter = list;\n      }\n      if (filter.matches(location, contentType, docDomain, thirdParty, sitekey))\n      {\n        return filter;\n      }\n    }\n    return null;\n  },\nmatchesAny: function(location, contentType, docDomain, thirdParty, sitekey)\n  {\n    var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);\n    if (candidates === null)\n    {\n      candidates = [];\n    }\n    candidates.push(\"\");\n    for (var i = 0, l = candidates.length; i < l; i++)\n    {\n      var substr = candidates[i];\n      if (substr in this.filterByKeyword)\n      {\n        var result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey);\n        if (result)\n        {\n          return result;\n        }\n      }\n    }\n    return null;\n  }\n};\n\nfunction CombinedMatcher()\n{\n  this.blacklist = new Matcher();\n  this.whitelist = new Matcher();\n  this.resultCache = createDict();\n}\nCombinedMatcher.maxCacheEntries = 1000;\nCombinedMatcher.prototype = {\nblacklist: null,\nwhitelist: null,\nresultCache: null,\ncacheEntries: 0,\nclear: function()\n  {\n    this.blacklist.clear();\n    this.whitelist.clear();\n    this.resultCache = createDict();\n    this.cacheEntries = 0;\n  },\nadd: function(filter)\n  {\n    if (filter instanceof WhitelistFilter)\n    {\n      this.whitelist.add(filter);\n    }\n    else\n    {\n      this.blacklist.add(filter);\n    }\n    if (this.cacheEntries > 0)\n    {\n      this.resultCache = createDict();\n      this.cacheEntries = 0;\n    }\n  },\nremove: function(filter)\n  {\n    if (filter instanceof WhitelistFilter)\n    {\n      this.whitelist.remove(filter);\n    }\n    else\n    {\n      this.blacklist.remove(filter);\n    }\n    if (this.cacheEntries > 0)\n    {\n      this.resultCache = createDict();\n      this.cacheEntries = 0;\n    }\n  },\nfindKeyword: function(filter)\n  {\n    if (filter instanceof WhitelistFilter)\n    {\n      return this.whitelist.findKeyword(filter);\n    }\n    else\n    {\n      return this.blacklist.findKeyword(filter);\n    }\n  },\nhasFilter: function(filter)\n  {\n    if (filter instanceof WhitelistFilter)\n    {\n      return this.whitelist.hasFilter(filter);\n    }\n    else\n    {\n      return this.blacklist.hasFilter(filter);\n    }\n  },\ngetKeywordForFilter: function(filter)\n  {\n    if (filter instanceof WhitelistFilter)\n    {\n      return this.whitelist.getKeywordForFilter(filter);\n    }\n    else\n    {\n      return this.blacklist.getKeywordForFilter(filter);\n    }\n  },\nisSlowFilter: function(filter)\n  {\n    var matcher = filter instanceof WhitelistFilter ? this.whitelist : this.blacklist;\n    if (matcher.hasFilter(filter))\n    {\n      return !matcher.getKeywordForFilter(filter);\n    }\n    else\n    {\n      return !matcher.findKeyword(filter);\n    }\n  },\nmatchesAnyInternal: function(location, contentType, docDomain, thirdParty, sitekey)\n  {\n    var candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);\n    if (candidates === null)\n    {\n      candidates = [];\n    }\n    candidates.push(\"\");\n    var blacklistHit = null;\n    for (var i = 0, l = candidates.length; i < l; i++)\n    {\n      var substr = candidates[i];\n      if (substr in this.whitelist.filterByKeyword)\n      {\n        var result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey);\n        if (result)\n        {\n          return result;\n        }\n      }\n      if (substr in this.blacklist.filterByKeyword && blacklistHit === null)\n      {\n        blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, sitekey);\n      }\n    }\n    return blacklistHit;\n  },\nmatchesAny: function(location, docDomain)\n  {\n    var key = location + \" \" + docDomain + \" \";\n    if (key in this.resultCache)\n    {\n      return this.resultCache[key];\n    }\n    var result = this.matchesAnyInternal(location, 0, docDomain, null, null);\n    if (this.cacheEntries >= CombinedMatcher.maxCacheEntries)\n    {\n      this.resultCache = createDict();\n      this.cacheEntries = 0;\n    }\n    this.resultCache[key] = result;\n    this.cacheEntries++;\n    return result;\n  }\n};\nvar defaultMatcher = new CombinedMatcher();\n\nvar direct = 'DIRECT;';\n\nfor (var i = 0; i < rules.length; i++) {\n  defaultMatcher.add(Filter.fromText(rules[i]));\n}\n\nfunction FindProxyForURL(url, host) {\n  if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) {\n    return proxy;\n  }\n  return direct;\n}\n"
  },
  {
    "path": "ShadowsocksX-NG/fix_dir_owner.sh",
    "content": "#!/bin/sh\n\n#  fix_dir_owner.sh\n#  ShadowsocksX-NG\n#\n#  Created by 邱宇舟 on 2017/8/25.\n#  Copyright © 2017年 qiuyuzhou. All rights reserved.\n\n\nLAUNCH_AGENTS_DIR=\"$HOME/Library/LaunchAgents\"\nsudo chown $@ \"$HOME/Library/LaunchAgents\"\n\n"
  },
  {
    "path": "ShadowsocksX-NG/gfwlist.txt",
    "content": "W0F1dG9Qcm94eSAwLjIuOV0KISBDaGVja3N1bTogVVFhQ0k0RnJ4SngxR3FVcXlq\nU3FCdwohIEV4cGlyZXM6IDZoCiEgVGl0bGU6IEdGV0xpc3Q0TEwKISBHRldMaXN0\nIHdpdGggRVZFUllUSElORyBpbmNsdWRlZAohIExhc3QgTW9kaWZpZWQ6IEZyaSwg\nMDkgQXVnIDIwMTkgMDE6MTE6MTYgLTA0MDAKIQohIEhvbWVQYWdlOiBodHRwczov\nL2dpdGh1Yi5jb20vZ2Z3bGlzdC9nZndsaXN0CiEgTGljZW5zZTogaHR0cHM6Ly93\nd3cuZ251Lm9yZy9saWNlbnNlcy9vbGQtbGljZW5zZXMvbGdwbC0yLjEudHh0CiEK\nISBHRldMaXN0IGlzIHVubGlrZWx5IHRvIGZ1bGx5IGNvbXByaXNlIHRoZSByZWFs\nCiEgcnVsZXMgYmVpbmcgZGVwbG95ZWQgaW5zaWRlIEdGVyBzeXN0ZW0uIFdlIHRy\neQohIG91ciBiZXN0IHRvIGtlZXAgdGhlIGxpc3QgdXAgdG8gZGF0ZS4gUGxlYXNl\nCiEgY29udGFjdCB1cyByZWdhcmRpbmcgVVJMIHN1Ym1pc3Npb24gLyByZW1vdmFs\nLAohIG9yIHN1Z2dlc3Rpb24gLyBlbmhhbmNlbWVudCBhdCBpc3N1ZSB0cmFja2Vy\nOgohIGh0dHBzOi8vZ2l0aHViLmNvbS9nZndsaXN0L2dmd2xpc3QvaXNzdWVzLy4K\nCiEtLS0tLS0tLS00MDMvNDUxLzUyMCAmIFVSTCBSZWRpcmVjdHMtLS0tLS0tLS0K\nIS0tZWhlbnRhaQp8aHR0cDovLzg1LjE3LjczLjMxLwohLS18fGFkb3JhbWEuY29t\nCnx8YWduZXNiLmZyCnx8YWtpYmEtd2ViLmNvbQp8fGFsdHJlYy5jb20KfHxhbmdl\nbGEtbWVya2VsLmRlCnx8YW5nb2xhLm9yZwp8fGFwYXJ0bWVudHJhdGluZ3MuY29t\nCnx8YXBhcnRtZW50cy5jb20KfHxhcmVuYS50YWlwZWkKfHxhc2lhbnNwaXNzLmNv\nbQp8fGFzc2ltcC5vcmcKfHxhdGhlbmFlaXpvdS5jb20KfHxhenVidS50dgp8fGJh\nbmttb2JpbGV2aWJlLmNvbQp8fGJhbm9ydGUuY29tCnx8YmFzaC1oYWNrZXJzLm9y\nZwp8fGJlZWcuY29tCnx8Z2xvYmFsLmJpbmcuY29tCnx8Ymxvb21iZXJndmlldy5j\nb20KfHxib29rdG9waWEuY29tLmF1Cnx8Ym95c21hc3Rlci5jb20KfHxieW5ldC5j\nby5pbAp8fGNhcmZheC5jb20KLmNhc2lub2JlbGxpbmkuY29tCnx8Y2FzaW5vYmVs\nbGluaS5jb20KfHxjZW50YXVyby5jb20uYnIKfHxjaG9iaXQuY2MKfHxjbGVhcnN1\ncmFuY2UuY29tCnx8aW1hZ2VzLmNvbWljby50dwp8fHN0YXRpYy5jb21pY28udHcK\nfHxjb3VudGVyLnNvY2lhbAp8fGNvc3Rjby5jb20KfHxjcm9zc2ZpcmUuY28ua3IK\nfHxkMnBhc3MuY29tCnx8ZGFycGEubWlsCnx8ZGF3YW5naWRjLmNvbQp8fGRlZXpl\nci5jb20KfHxkZXNpcHJvLmRlCnx8ZGluZ2NoaW4uY29tLnR3Cnx8ZGlzY29yZGFw\ncC5jb20KfHxkaXNjb3JkYXBwLm5ldAp8fGRpc2guY29tCnxodHRwOi8vaW1nLmRs\nc2l0ZS5qcC8KfHxkbTUzMC5uZXQKc2hhcmUuZG1oeS5vcmcKQEB8aHR0cHM6Ly9z\naGFyZS5kbWh5Lm9yZwp8fGRtbS5jby5qcAp8aHR0cDovL3d3dy5kbW0uY29tL25l\ndGdhbWUKfHxkbnZvZC50dgp8fGR2ZHBhYy5jb20KfHxlZXN0aS5lZQp8fGVzdXJh\nbmNlLmNvbQouZXhwZWt0LmNvbQp8fGV4cGVrdC5jb20KLmV4dG1hdHJpeC5jb20K\nfHxleHRtYXRyaXguY29tCnx8ZmFra3UubmV0Cnx8ZmFzdHBpYy5ydQp8fGZpbGVz\nb3IuY29tCnx8ZmluYW5jZXR3aXR0ZXIuY29tCnx8ZmxpcGJvYXJkLmNvbQp8fGZs\naXR0by5jb20KfHxmbmFjLmJlCnx8Zm5hYy5jb20KfHxmdW5reWltZy5jb20KfHxm\neG5ldHdvcmtzLmNvbQp8fGctYXJlYS5vcmcKfHxnZXR0eWltYWdlcy5jb20KfHxn\nZXR1cGxvYWRlci5jb20KIS0tfGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9ncmFtdGhp\nbmsvemhhbwp8aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Byb2dy\nYW10aGluay96aGFvCnx8Z2xhc3M4LmV1Cnx8Z2x5cGUuY29tCnx8Z28xNDEuY29t\nCnx8Z3VvLm1lZGlhCnx8aGF1dGVsb29rLmNvbQp8fGhhdXRlbG9va2Nkbi5jb20K\nfHx3ZWdvLmhlcmUuY29tCnx8Z2FtZXItY2RzLmNkbi5oaW5ldC5uZXQKfHxnYW1l\ncjItY2RzLmNkbi5oaW5ldC5uZXQKfHxobXZkaWdpdGFsLmNhCnx8aG12ZGlnaXRh\nbC5jb20KfHxob21lZGVwb3QuY29tCnx8aG9vdmVycy5jb20KfHxodWx1LmNvbQp8\nfGh1bHVpbS5jb20KfGh0dHA6Ly9zZWN1cmUuaHVzdGxlci5jb20KfGh0dHA6Ly9o\ndXN0bGVyY2FzaC5jb20KfGh0dHA6Ly93d3cuaHVzdGxlcmNhc2guY29tCnx8aHli\ncmlkLWFuYWx5c2lzLmNvbQp8fGNkbiouaS1zY21wLmNvbQp8fGlsb3ZlbG9uZ3Rv\nZXMuY29tCnxodHRwOi8vaW1nbWVnYS5jb20vKi5naWYuaHRtbAp8aHR0cDovL2lt\nZ21lZ2EuY29tLyouanBnLmh0bWwKfGh0dHA6Ly9pbWdtZWdhLmNvbS8qLmpwZWcu\naHRtbAp8aHR0cDovL2ltZ21lZ2EuY29tLyoucG5nLmh0bWwKfHxpbWxpdmUuY29t\nCnx8dHcuaXFpeWkuY29tCnx8amF2aHViLm5ldAp8fGphdmh1Z2UuY29tCi5qYXZs\naWJyYXJ5LmNvbQp8fGphdmxpYnJhcnkuY29tCnx8amNwZW5uZXkuY29tCnx8amlt\ncy5uZXQKfHxqdWt1am8tY2x1Yi5jb20KfHxqdWxpZXBvc3QuY29tCnx8a2F3YWlp\na2F3YWlpLmpwCnx8a2VuZGF0aXJlLmNvbQp8fGtoYXRyaW1hemEub3JnCnx8a2ti\nb3guY29tCnx8bGVpc3VyZXByby5jb20KfHxsaWZlbWlsZXMuY29tCnx8bG9uZ3Rv\nZXMuY29tCnx8bG92ZXR2c2hvdy5jb20KfGh0dHA6Ly93d3cubS1zcG9ydC5jby51\nawp8fG1hY2dhbWVzdG9yZS5jb20KfHxtYWRvbm5hLWF2LmNvbQp8fG1hbmdhZm94\nLmNvbQp8fG1hbmdhZm94Lm1lCnx8bWFudGEuY29tCnx8bWF0b21lLXBsdXMuY29t\nCnx8bWF0b21lLXBsdXMubmV0Cnx8bWF0dHdpbGNveC5uZXQKfHxtZXRhcnRodW50\nZXIuY29tCnx8bWZ4bWVkaWEuY29tCnx8bW9qaW0uY29tCnx8a2IubW9uaXRvcndh\ncmUuY29tCnx8bW9uc3Rlci5jb20KfHxtb29keXouY29tCnx8bW9vbmJpbmdvLmNv\nbQp8fG1vcy5ydQp8fG1zaGEuZ292Cnx8bXV6dS50dgp8fG12Zy5qcAoubXliZXQu\nY29tCnx8bXliZXQuY29tCnx8bmF0aW9ud2lkZS5jb20KfGh0dHA6Ly93d3cubmJj\nLmNvbS9saXZlCnx8bmVvLW1pcmFjbGUuY29tCnx8bmV0ZmxpeC5jb20KfHxuZmx4\naW1nLmNvbQp8fG5mbHhpbWcubmV0Cnx8bmZseGV4dC5jb20KfHxuZmx4c28ubmV0\nCnx8bmZseHZpZGVvLm5ldAp8fG5pYy5nb3YKfGh0dHA6Ly9tby5uaWdodGxpZmUx\nNDEuY29tCnx8bm9yZHN0cm9tLmNvbQp8fG5vcmRzdHJvbWltYWdlLmNvbQp8fG5v\ncmRzdHJvbXJhY2suY29tCnx8bm90dGluZ2hhbXBvc3QuY29tCnx8bnBzYm9vc3Qu\nY29tCnx8bnRkdHYuY3oKfHxzMS5udWRlenouY29tCnx8bnVzYXRyaXAuY29tCnx8\nbnV1dmVtLmNvbQp8fG9tbmk3LmpwCnx8b25hcHAuY29tCiEtLVdlIGFyZSBjb25m\ndXNlZCBhcyB3ZWxsCnx8b250cmFjLmNvbQpAQHxodHRwOi8vYmxvZy5vbnRyYWMu\nY29tCnx8cGFuZG9yYS5jb20KLnBhbmRvcmEudHYKfHxwYXJrYW5za3kuY29tCnx8\ncGhtc29jaWV0eS5vcmcKfGh0dHA6Ly8qLnBpbWcudHcvCnx8cHVyZTE4LmNvbQp8\nfHB5dG9yY2gub3JnCnx8cXEuY28uemEKfHxyMTguY29tCnxodHRwOi8vcmFkaWtv\nLmpwCnx8cmFtY2l0eS5jb20uYXUKfHxyZC5jb20KfHxyZGlvLmNvbQp8aHR0cHM6\nLy9yaXNldXAubmV0Cnx8c2FkaXN0aWMtdi5jb20KfHxpc2Muc2Fucy5lZHUKfGh0\ndHA6Ly9jZG4qLnNlYXJjaC54eHgvCnx8c2hpa3NoYS5jb20KfHxzbGFja2VyLmNv\nbQp8fHNtLW1pcmFjbGUuY29tCnx8c295bGVudG5ld3Mub3JnCnx8c3BvdGlmeS5j\nb20KfHxzcHJlYWRzaGlydC5lcwp8fHNwcmluZ2JvYXJkcGxhdGZvcm0uY29tCnx8\nc3ByaXRlLm9yZwpAQHxodHRwOi8vc3RvcmUuc3ByaXRlLm9yZwp8fHN1cGVyb2th\neWFtYS5jb20KfHxzdXBlcnBhZ2VzLmNvbQp8fHN3YWdidWNrcy5jb20KfHxzd2l0\nY2gxLmpwCnx8dGFwYW53YXAuY29tCnx8Z3NwLnRhcmdldC5jb20KfHxsb2dpbi50\nYXJnZXQuY29tCiEtLUBAfHxpbnRsLnRhcmdldC5jb20KfHxyY2FtLnRhcmdldC5j\nb20KfHx0aGlua2dlZWsuY29tCnx8dGhlYm9keXNob3AtdXNhLmNvbQp8fHRtYS5j\nby5qcAp8fHRyYWNmb25lLmNvbQp8fHRyeWhlYXJ0LmpwCnx8dHVybnRhYmxlLmZt\nCnx8dHdlcmtpbmdidXR0LmNvbQp8fHVsb3AubmV0Cnx8dXVrYW5zaHUuY29tCnx8\ndmVnYXNyZWQuY29tCnx8dmV2by5jb20KfHx2aXAtZW50ZXJwcmlzZS5jb20KfGh0\ndHA6Ly92aXUudHYvY2gvCnxodHRwOi8vdml1LnR2L2VuY29yZS8KfHx2bXBzb2Z0\nLmNvbQp8aHR0cDovL2Vjc20udnMuY29tLwp8fHdhbnotZmFjdG9yeS5jb20KfHxz\nc2wud2VicGFjay5kZQp8fHdoZXJldG93YXRjaC5jb20KfHx3aW5nYW1lc3RvcmUu\nY29tCnx8d2l6Y3JhZnRzLm5ldAp8fHZvZC53d2UuY29tCnx8eGZpbml0eS5jb20K\nfHx5b3V3aW4uY29tCnx8eXRuLmNvLmtyCnx8emF0dG9vLmNvbQp8fHppbS52bgp8\nfHpvem90b3duLmNvbQoKISMjIyMjIyMjIyMjIyMjR2VuZXJhbCBMaXN0IFN0YXJ0\nIyMjIyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0tLS0tLS0tLS0tUHVyZSBJUC0tLS0t\nLS0tLS0tLS0tLS0tLS0tLQoxNC4xMDIuMjUwLjE4CjE0LjEwMi4yNTAuMTkKNTAu\nNy4zMS4yMzA6ODg5OAoxNzQuMTQyLjEwNS4xNTMKNjkuNjUuMTkuMTYwCgohLS0t\nLS0tLS0tLS0tLS0tLS0tLS0tLUlETi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHx4\nbi0tNGdxMTcxcC5jb20KfHx4bi0tY3pxNzVwdnYxYWo1Yy5vcmcKfHx4bi0taTJy\ndThxMnFnLmNvbQp8fHhuLS1vaXEuY2MKfHx4bi0tcDhqOWEwZDljOWEueG4tLXE5\nanliNGMKCiEtLS0tLS0tLS0tLS0tLS0tLUROUyBQb2lzb25pbmctLS0tLS0tLS0t\nLS0tLS0tLQohLS0tQW1hem9uLS0tCiEtfHxjZG4taW1hZ2VzLm1haWxjaGltcC5j\nb20KfHxhYmVib29rcy5jb20KfGh0dHBzOi8vKi5zMy5hbWF6b25hd3MuY29tCnx8\nczMtYXAtc291dGhlYXN0LTIuYW1hem9uYXdzLmNvbQoKfHw0MzExMC5jZgp8fDln\nYWcuY29tCnx8YWdyby5oawp8fHNoYXJlLmFtZXJpY2EuZ292Cnx8YXBrbWlycm9y\nLmNvbQp8fGFydGUudHYKfHxhcnRzdGF0aW9uLmNvbQp8fGJhbmdkcmVhbS5zcGFj\nZQp8fGJlaGFuY2UubmV0Cnx8YmlyZC5zbwp8fHpoLmJpdHRlcndpbnRlci5vcmcK\nfHxibm4uY28KfHxidXNpbmVzc2luc2lkZXIuY29tCnx8Ym9vbXNzci5jb20KfHxi\nd2d5aHcuY29tCnx8Y2FzdGJveC5mbQp8fGNoaW5hdGltZXMuY29tCnx8Y2x5cC5p\ndAp8fGNtY24ub3JnCnx8Y214LmltCnx8ZGFpbHl2aWV3LnR3Cnx8ZGF1bS5uZXQK\nfHxkZXBvc2l0cGhvdG9zLmNvbQp8fGRpc2Nvbm5lY3QubWUKfHxkb3ViaWJhY2t1\ncC5jb20KfHxkb3VibWlycm9yLmNmCnx8ZW5jeWNsb3BlZGlhLmNvbQp8fGZhbmdl\ncWlhbmcuY29tCnx8Y2xvdWQuZmVlZGx5LmNvbQp8fGZseXp5MjAwNS5jb20KfHxm\nb3JlaWducG9saWN5LmNvbQp8fGZyZWUtc3Muc2l0ZQp8fGJsb2cuZnVja2dmdzIz\nMy5vcmcKfHxnMHYuc29jaWFsCnx8Z2xvYmFsdm9pY2VzLm9yZwp8fGdsb3J5c3Rh\nci5tZQp8fGdvcmVncmlzaC5jb20KfHxoYm8uY29tCnx8c3BhY2VzLmhpZ2h0YWls\nLmNvbQp8fGhrZ2FsZGVuLmNvbQp8fGhrZ29sZGVuLmNvbQp8fGh1ZHNvbi5vcmcK\nfHxpcGZzLmlvCnx8amFwYW50aW1lcy5jby5qcAp8fGppamkuY29tCnx8amludGlh\nbi5uZXQKfHxqaW54LmNvbQp8fGpvaW5tYXN0b2Rvbi5vcmcKfHxsaWFuZ3poaWNo\ndWFubWVpLmNvbQp8fGxpZ2h0aS5tZQp8fGxpaGtnLmNvbQp8fGxpbmUtc2Nkbi5u\nZXQKfHxpLmxpdGhpdW0uY29tCnx8Y2xvdWQubWFpbC5ydQp8fGNkbi1pbWFnZXMu\nbWFpbGNoaW1wLmNvbQp8fG1hc3RvZG9uLmNsb3VkCnx8bWFzdG9kb24uaG9zdAp8\nfG1hc3RvZG9uLnNvY2lhbAp8fG1hdHRlcnMubmV3cwp8fG1lLm1lCnx8bWV0YXJ0\nLmNvbQp8fG1vaHUuY2x1Ygp8fG1vaHUubWwKfHxtb3RpeXVuLmNvbQp8fG1zYS1p\ndC5vcmcKfHxkaWN0aW9uYXJ5Lmdvby5uZS5qcAp8fGdvLm5lc25vZGUuY29tCnx8\naW50ZXJuYXRpb25hbC1uZXdzLm5ld3NtYWdhemluZS5hc2lhCnx8bmlra2VpLmNv\nbQp8fG5pdS5tb2UKfHxub2ZpbGUuaW8KfHxub3cuY29tCnx8c3VrZWJlaS5ueWFh\nLnNpCnx8b3BlbnZwbi5vcmcKfHxvbmVqYXYuY29tCnx8cGFzdGUuZWUKfHxteS5w\nY2xvdWQuY29tCnx8cGljYWNvbWljLmNvbQp8fHBpbmNvbmcucm9ja3MKfHxwaXhp\ndi5uZXQKfHxwb3RhdG8uaW0KfHxwcmVtcHJveHkuY29tCnx8cHJpc20tYnJlYWsu\nb3JnCnx8cHJvdG9udnBuLmNvbQp8fGFwaS5wdXJlYXBrLmNvbQp8fHF1b3JhLmNv\nbQp8fHF1b3JhY2RuLm5ldAp8fGNkbi5zZWF0Z3VydS5jb20KfHxzZWN1cmUucmF4\nY2RuLmNvbQp8fHJlZGQuaXQKfHxyZWRkaXQuY29tCi5yZWRkaXRsaXN0LmNvbQp8\naHR0cDovL3JlZGRpdGxpc3QuY29tCnx8cmVkZGl0bWVkaWEuY29tCnx8cmVkZGl0\nc3RhdGljLmNvbQp8fHJpeGNsb3VkLmNvbQp8fHJpeGNsb3VkLnVzCnx8cnNkbG1v\nbml0b3IuY29tCnx8c2hhZG93c29ja3MuYmUKfHxzaGFkb3dzb2NrczkuY29tCnx8\ndG4xLnNoZW1hbGV6LmNvbQp8fHRuMi5zaGVtYWxlei5jb20KfHx0bjMuc2hlbWFs\nZXouY29tCnx8c3RhdGljLnNoZW1hbGV6LmNvbQp8fHNpeC1kZWdyZWVzLmlvCnx8\nc29mdGZhbW91cy5jb20KfHxzb2Z0c21pcnJvci5jZgp8fHNvc3JlYWRlci5jb20K\nfHxzc3BhbmVsLm5ldAp8fHN1bGlhbi5tZQp8fHN1cGNoaW5hLmNvbQp8fHRlZGR5\nc3VuLmNvbQp8fHRleHRub3cubWUKfHx0aW5leWUuY29tCnx8dG9wMTB2cG4uY29t\nCnx8dHViZXBvcm5jbGFzc2ljLmNvbQp8fHVrdS5pbQp8fHVuc2Vlbi5pcwp8fGNu\nLnVwdG9kb3duLmNvbQp8fHVyYWJhbi5tZQp8fHZyc21hc2guY29tCnx8dnVsdHJ5\naHcuY29tCnx8c2NhY2hlLnZ6dy5jb20KfHxzY2FjaGUxLnZ6dy5jb20KfHxzY2Fj\naGUyLnZ6dy5jb20KfHxzczcudnp3LmNvbQp8fHNzci50b29scwp8fHN0ZWVtaXQu\nY29tCnx8dGFpd2FuanVzdGljZS5uZXQKfHx0aW5jLXZwbi5vcmcKfHx3ZW56aGFv\nLmNhCnx8d2hhdHNvbndlaWJvLmNvbQp8fHdpcmUuY29tCnx8YmxvZy53b3JrZmxv\ndy5pcwp8fHhtLmNvbQp8fHh1ZWh1YS51cwp8fHllcy1uZXdzLmNvbQp8fHlvdS1n\nZXQub3JnCnx8enpjbG91ZC5tZQoKIS0tLURpZ2l0YWwgQ3VycmVuY3kgRXhjaGFu\nZ2UoQ1JZUFRPKS0tLQp8fGFleC5jb20KfHxhbGxjb2luLmNvbQp8fGFkY2V4LmNv\nbQp8fGJjZXguY2EKfHxiaWJveC5jb20KfHxiaWcub25lCnx8YmluYW5jZS5jb20K\nfHxiaXQtei5jb20KfHxiaXRjb2lud29ybGQuY29tCnx8Yml0ZmluZXguY29tCnx8\nYml0aHVtYi5jb20KfHxiaXRpbmthLmNvbS5hcgp8fGJpdG1leC5jb20KfHxidGM5\nOC5jb20KfHxidGNiYW5rLmJhbmsKfHxidGN0cmFkZS5pbQp8fGMyY3guY29tCnx8\nY2hhb2V4LmNvbQp8fGNvYmluaG9vZC5jb20KfHxjb2luMmNvLmluCnx8Y29pbmJl\nbmUuY29tCi5jb2luZWdnLmNvbQp8fGNvaW5lZ2cuY29tCnx8Y29pbmV4LmNvbQoh\nLS18aHR0cHM6Ly93d3cuY29pbmV4Y2hhbmdlLmlvLwp8fGNvaW5naS5jb20KfHxj\nb2lucmFpbC5jby5rcgp8fGNvaW50aWdlci5jb20KfHxjb2ludG9iZS5jb20KfHxj\nb2ludXQuY29tCnx8ZGlzY29pbnMuY29tCnx8ZHJhZ29uZXguaW8KfHxlYnRjYmFu\nay5jb20KfHxldGhlcmRlbHRhLmNvbQp8fGV4bW8uY29tCnx8ZXhyYXRlcy5tZQp8\nfGV4eC5jb20KfHxmYXRidGMuY29tCnx8Z2F0ZS5pbwp8fGdhdGVjb2luLmNvbQp8\nfGhiZy5jb20KfHxoaXRidGMuY29tCnx8aHVvYmkuY29tCnx8aHVvYmkucHJvCnx8\naHVvYmlwcm8uY29tCnx8YnguaW4udGgKfHxqZXguY29tCnx8a2V4LmNvbQp8fGtz\ncGNvaW4uY29tCnx8a3Vjb2luLmNvbQp8fGxiYW5rLmluZm8KfHxsaXZlY29pbi5u\nZXQKfHxsb2NhbGJpdGNvaW5zLmNvbQp8fG1lcmNhdG94LmNvbQp8fG9leC5jb20K\nfHxva2V4LmNvbQp8fG90Y2J0Yy5jb20KfHxyaWdodGJ0Yy5jb20KfHx0b3BidGMu\nY29tCnx8eGJ0Y2UuY29tCnx8eW9iaXQubmV0Cnx8emIuY29tCgohLS0tLS0tLS0t\nLS0tLS0tLUZyYXVkcyAmIFNjYW1zLS0tLS0tLS0tLS0tLS0tLS0KISEtLS1Db250\nZW50IEZhcm0oZmFrZSA1MDAgZXJyb3IpLS0tCnx8cmVhZDAxLmNvbQp8fGtrbmV3\ncy5jYwoKY2hpbmEtbW1tLmpwLm5ldAoubHN4c3p6Zy5jb20KLmNoaW5hLW1tbS5u\nZXQKfHxjaGluYS1tbW0ubmV0CmNoaW5hLW1tbS5zYS5jb20KCiEtLS0tLS0tLS0t\nLS0tLS0tLS0tLS1Hcm91cHMtLS0tLS0tLS0tLS0tLS0tLS0tLQohIS0tLUFmcmFp\nZCBGcmVlRE5TLS0tCi5hbGxvd2VkLm9yZwoubm93LmltCgohIS0tLUFtYXpvbi0t\nLQp8fGFtYXpvbi5jby5qcAouYW1hem9uLmNvbS9EYWxhaS1MYW1hCmFtYXpvbi5j\nb20vUHJpc29uZXItU3RhdGUtU2VjcmV0LUpvdXJuYWwtUHJlbWllcgpzMy1hcC1u\nb3J0aGVhc3QtMS5hbWF6b25hd3MuY29tCgohIS0tLUFPTC0tLQp8fGFvbGNoYW5u\nZWxzLmFvbC5jb20KdmlkZW8uYW9sLmNhL3ZpZGVvLWRldGFpbAp2aWRlby5hb2wu\nY28udWsvdmlkZW8tZGV0YWlsCnZpZGVvLmFvbC5jb20KfHx2aWRlby5hb2wuY29t\nCnx8c2VhcmNoLmFvbC5jb20Kd3d3LmFvbG5ld3MuY29tCgohIS0tLUF2TW9vLS0t\nCi5hdm1vLnB3CiEtLXxodHRwOi8vYXZtby5wdwouYXZtb28uY29tCnxodHRwOi8v\nYXZtb28uY29tCi5hdm1vby5uZXQKfGh0dHA6Ly9hdm1vby5uZXQKfHxhdm1vby5w\ndwouamF2bW9vLnh5egp8aHR0cDovL2phdm1vby54eXoKLmphdnRhZy5jb20KfGh0\ndHA6Ly9qYXZ0YWcuY29tCi5qYXZ6b28uY29tCnxodHRwOi8vamF2em9vLmNvbQou\ndGVsbG1lLnB3CgohIS0tLUJCQy0tLQohLS0uYmJjLmNvLnVrL2Jsb2dzCiEtLS5i\nYmMuY28udWsvY2hpbmVzZQohLS0uYmJjLmNvLnVrL25ld3Mvd29ybGQtYXNpYS1j\naGluYQohLS0uYmJjLmNvLnVrL3R2CiEtLS5iYmMuY28udWsvemhvbmd3ZW4KIS0t\nLmJiYy5jb20vdWtjaGluYQohLS0uYmJjLmNvbS96aG9uZ3dlbgohLS0uYmJjLmNv\nbSUyRnpob25nd2VuCiEtLW5ld3MuYmJjLmNvLnVrL29udGhpc2RheSpuZXdzaWRf\nMjQ5NjAwMC8yNDk2Mjc3CiEtLW5ld3Nmb3J1bXMuYmJjLmNvLnVrCi5iYmMuY29t\nCnx8YmJjLmNvbQouYmJjLmNvLnVrCnx8YmJjLmNvLnVrCnx8YmJjaS5jby51awou\nYmJjY2hpbmVzZS5jb20KfHxiYmNjaGluZXNlLmNvbQp8aHR0cDovL2JiYy5pbgoK\nISEtLS1DaGFuZ2VJUC0tLQouMWR1bWIuY29tCi4yNXUuY29tCi4yd2FreS5jb20K\nLjMtYS5uZXQKLjRkcS5jb20KLjRteWRvbWFpbi5jb20KLjRwdS5jb20KLmFjbWV0\nb3kuY29tCi5hbG1vc3RteS5jb20KLmFtZXJpY2FudW5maW5pc2hlZC5jb20KLmF1\ndGhvcml6ZWRkbnMubmV0Ci5hdXRob3JpemVkZG5zLm9yZwouYXV0aG9yaXplZGRu\ncy51cwouYmlnbW9uZXkuYml6Ci5jaGFuZ2VpcC5uYW1lCi5jaGFuZ2VpcC5uZXQK\nLmNoYW5nZWlwLm9yZwouY2xlYW5zaXRlLmJpegouY2xlYW5zaXRlLmluZm8KLmNs\nZWFuc2l0ZS51cwouY29tcHJlc3MudG8KLmRkbnMuaW5mbwouZGRucy5tZS51awou\nZGRucy5tb2JpCi5kZG5zLm1zCi5kZG5zLm5hbWUKLmRkbnMudXMKLmRoY3AuYml6\nCi5kbnMtZG5zLmNvbQouZG5zLXN0dWZmLmNvbQouZG5zMDQuY29tCi5kbnMwNS5j\nb20KLmRuczEudXMKLmRuczIudXMKLmRuc2V0LmNvbQouZG5zcmQuY29tCi5kc210\ncC5jb20KLmR1bWIxLmNvbQouZHluYW1pYy1kbnMubmV0Ci5keW5hbWljZG5zLmJp\negouZHluYW1pY2Rucy5jby51awouZHluYW1pY2Rucy5tZS51awouZHluYW1pY2Ru\ncy5vcmcudWsKLmR5bmRucy5wcm8KLmR5bnNzbC5jb20KLmVkbnMuYml6Ci5lcGFj\nLnRvCi5lc210cC5iaXoKLmV6dWEuY29tCi5mYXFzZXJ2LmNvbQouZmFydGl0LmNv\nbQouZnJlZWRkbnMuY29tCi5mcmVldGNwLmNvbQouZnJlZXd3dy5iaXoKLmZyZWV3\nd3cuaW5mbwouZnRwMS5iaXoKLmZ0cHNlcnZlci5iaXoKLmdldHRyaWFscy5jb20K\nLmdvdC1nYW1lLm9yZwouZ3I4ZG9tYWluLmJpegouZ3I4bmFtZS5iaXoKLmh0dHBz\nNDQzLm5ldAouaHR0cHM0NDMub3JnCi5pa3diLmNvbQouaW5zdGFudGhxLmNvbQou\naW93bnlvdXIuYml6Ci5pb3dueW91ci5vcmcKLmlzYXNlY3JldC5jb20KLml0ZW1k\nYi5jb20KLml0c2FvbC5jb20KLmpldG9zLmNvbQouamt1Yi5jb20KLmp1bmdsZWhl\nYXJ0LmNvbQouanVzdGRpZWQuY29tCi5sZmxpbmsuY29tCi5sZmxpbmt1cC5jb20K\nLmxmbGlua3VwLm5ldAoubGZsaW5rdXAub3JnCi5sb25nbXVzaWMuY29tCi5tZWZv\ndW5kLmNvbQoubW9uZXlob21lLmJpegoubXJiYXNpYy5jb20KLm1yYm9udXMuY29t\nCi5tcmZhY2UuY29tCi5tcnNsb3ZlLmNvbQoubXkwMy5jb20KLm15ZGFkLmluZm8K\nLm15ZGRucy5jb20KLm15ZnRwLmluZm8KLm15ZnRwLm5hbWUKLm15bGZ0di5jb20K\nLm15bW9tLmluZm8KLm15bmV0YXYubmV0Ci5teW5ldGF2Lm9yZwoubXludW1iZXIu\nb3JnCi5teXBpY3R1cmUuaW5mbwoubXlwb3AzLm5ldAoubXlwb3AzLm9yZwoubXlz\nZWNvbmRhcnlkbnMuY29tCi5teXd3dy5iaXoKLm15ei5pbmZvCi5uaW50aC5iaXoK\nLm5zMDEuYml6Ci5uczAxLmluZm8KLm5zMDEudXMKLm5zMDIuYml6Ci5uczAyLmlu\nZm8KLm5zMDIudXMKLm5zMS5uYW1lCi5uczIubmFtZQoubnMzLm5hbWUKLm9jcnku\nY29tCi5vbmVkdW1iLmNvbQoub25teXBjLmJpegoub25teXBjLmluZm8KLm9ubXlw\nYy5uZXQKLm9ubXlwYy5vcmcKLm9ubXlwYy51cwoub3JnYW5pY2NyYXAuY29tCi5v\ndHpvLmNvbQoub3VyaG9iYnkuY29tCi5wY2FueXdoZXJlLm5ldAoucG9ydDI1LmJp\negoucHJveHlkbnMuY29tCi5xaGlnaC5jb20KLnFwb2UuY29tCi5yZWJhdGVzcnVs\nZS5uZXQKLnNlbGxjbGFzc2ljcy5jb20KLnNlbmRzbXRwLmNvbQouc2VydmV1c2Vy\nLmNvbQouc2VydmV1c2Vycy5jb20KLnNleGlkdWRlLmNvbQouc2V4eHh5LmJpegou\nc2l4dGguYml6Ci5zcXVpcmx5LmluZm8KLnNzbDQ0My5vcmcKLnRvaC5pbmZvCi50\nb3l0aGlldmVzLmNvbQoudHJpY2tpcC5uZXQKLnRyaWNraXAub3JnCi52aXp2YXou\nY29tCi53aGEubGEKLndpa2FiYS5jb20KLnd3dzEuYml6Ci53d3dob3N0LmJpegpA\nQHxodHRwOi8veHgud3d3aG9zdC5iaXoKLngyNGhyLmNvbQoueHh1ei5jb20KLnh4\neHkuYml6Ci54eHh5LmluZm8KLnlndG8uY29tCi55b3Vkb250Y2FyZS5jb20KLnlv\ndXJ0cmFwLmNvbQouenlucy5jb20KLnp6dXguY29tCgohIS0tLUNsb3VkRnJvbnQt\nLS0KZDFiMTgzc2cwbnZudWguY2xvdWRmcm9udC5uZXQKfGh0dHBzOi8vZDFiMTgz\nc2cwbnZudWguY2xvdWRmcm9udC5uZXQKZDFjMzdnandhMjZ0YWEuY2xvdWRmcm9u\ndC5uZXQKfGh0dHBzOi8vZDFjMzdnandhMjZ0YWEuY2xvdWRmcm9udC5uZXQKZDNj\nMzNoY2dpd2V2My5jbG91ZGZyb250Lm5ldAp8aHR0cHM6Ly9kM2MzM2hjZ2l3ZXYz\nLmNsb3VkZnJvbnQubmV0Cnx8ZDNyaHI3a2dtdHJxMXYuY2xvdWRmcm9udC5uZXQK\nCiEhLS0tRHRETlMtLS0KISMjI2h0dHBzOi8vd3d3LmR0ZG5zLmNvbS9kdHNpdGUv\nZmFxCi4zZC1nYW1lLmNvbQouNGlyYy5jb20KLmIwbmUuY29tCi5jaGF0bm9vay5j\nb20KLmRhcmt0ZWNoLm9yZwouZGVhZnRvbmUuY29tCi5kdGRucy5uZXQKLmVmZmVy\ncy5jb20KLmV0b3ducy5uZXQKLmV0b3ducy5vcmcKLmZsbmV0Lm9yZwouZ290Z2Vl\na3MuY29tCi5zY2llcm9uLmNvbQouc2x5aXAuY29tCi5zbHlpcC5uZXQKLnN1cm9v\ndC5jb20KCiEhLS0tRHluRE5TLS0tCiEjIyNodHRwczovL2hlbHAuZHluLmNvbS9s\naXN0LW9mLWR5bi1kbnMtcHJvLXJlbW90ZS1hY2Nlc3MtZG9tYWluLW5hbWVzLwou\nYmxvZ2Rucy5vcmcKLmR5bmRucy5vcmcKLmR5bmRucy1pcC5jb20KLmR5bmRucy1w\naWNzLmNvbQouZnJvbS1zZC5jb20KLmZyb20tcHIuY29tCi5pcy1hLWh1bnRlci5j\nb20KCiEhLS0tRHludS0tLQouZHludS5jb20KLmR5bnUubmV0Ci5mcmVlZGRucy5v\ncmcKCiEhLS0tRmFjZWJvb2stLS0KY2RuaW5zdGFncmFtLmNvbQp8fGNkbmluc3Rh\nZ3JhbS5jb20KfHxmYWNlYm9vay5icgouZmFjZWJvb2suY29tCnx8ZmFjZWJvb2su\nY29tCiEtLS9eaHR0cHM/OlwvXC9bXlwvXStmYWNlYm9va1wuY29tLwpAQHx8djYu\nZmFjZWJvb2suY29tCnx8ZmFjZWJvb2suZGVzaWduCnx8Y29ubmVjdC5mYWNlYm9v\nay5uZXQKfHxmYWNlYm9vay5odQp8fGZhY2Vib29rLmluCnx8ZmFjZWJvb2submwK\nfHxmYWNlYm9vay5zZQp8fGZhY2Vib29rbWFpbC5jb20KfHxmYi5jb20KfHxmYi5t\nZQp8fGZiY2RuLm5ldAp8fGZic2J4LmNvbQp8fGZiYWRkaW5zLmNvbQp8fGZid29y\na21haWwuY29tCi5pbnN0YWdyYW0uY29tCnx8aW5zdGFncmFtLmNvbQp8fG0ubWUK\nfHxtZXNzZW5nZXIuY29tCnx8b2N1bHVzLmNvbQp8fG9jdWx1c2Nkbi5jb20KfHxy\nb2Nrc2RiLm9yZwpAQHx8aXA2LnN0YXRpYy5zbC1yZXZlcnNlLmNvbQp8fHRoZWZh\nY2Vib29rLmNvbQp8fHdoYXRzYXBwLmNvbQp8fHdoYXRzYXBwLm5ldAoKISEtLS1G\nVENoaW5lc2UtLS0KLmZ0Y2hpbmVzZS5jb20KfHxmdGNoaW5lc2UuY29tCiEtLS5m\ndGNoaW5lc2UuY29tL2NoYW5uZWwvdmlkZW8KIS0tLmZ0Y2hpbmVzZS5jb20vcHJl\nbWl1bS8wMDEwODEwNjYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI3NTMK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI2NjE2CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTAyNjc0OQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nMjY4MDcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI2ODA4CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTAyNjgzNAohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwMjY4ODAKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDI3NDI5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMDM0MQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwMzA1MDIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDMw\nODAzCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMTMxNwohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwMzI2MTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDMyNjM2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzMjY5MgohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzI3NjIKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDMzMTM4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzNDkx\nNwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzQ5MjYKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDM0OTI3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTAzNDkyOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzQ5NTIKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDM1ODkwCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTAzNTk3MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzU5OTMK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM2NDE3CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTAzNzA5MAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nMzcwOTEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM4MTc4CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTAzODE5OQohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwMzgyMjAKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM4ODE5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzODg2MgohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwMzkwNjcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDM5\nMTc4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTIxMQohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwMzkyNzEKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDM5Mjk1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTM2OQohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk0ODIKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDM5NTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTAzOTU1\nNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk1NzYKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDM5NzEyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTAzOTc3OQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwMzk4MDkKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDQwMTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA0MDgzNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDA4OTAK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQwOTE4CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA0MDk5MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNDEyMDkKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQyMTAwCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA0MjI1MgohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNDIyNzIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQyMjgwCiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzAyOQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNDMwNjYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQz\nMDk2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzEyNAohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNDMxNTIKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDQzMTg5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzQyOAohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDM0MzkKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDQzNTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0MzY3\nNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDM2ODAKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDQzNzAyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA0Mzg0OQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDQwOTkKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ0Nzc2CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA0NDg3MQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDQ4OTcK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ1MTE0CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA0NTEzOQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNDUxODYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ1NzU1CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA0NjA4NwohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNDYxMDUKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ2MTE4CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NjEzMgohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNDY1MTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ2\nODIyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0Njg2NgohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNDY5NDIKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDQ3MTgwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzIwNgohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDczMDQKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDQ3MzE3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0NzM0\nNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDczNTgKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDQ3Mzc1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA0NzM4MQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDc0MTMKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3NDU2CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA0NzQ5MQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNDc1NDUK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ3NTU4CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA0NzU2OAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNDc2MjcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ4MjkzCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA0ODM0MwohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNDg3MTAKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDQ5Mjg5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA0OTM2MAohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNDk4OTYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUw\nMTUyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MTAyNwohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTExNjEKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDUxMzcyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MTQ3OQohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTIxMzgKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDUyMTYxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1MjUy\nNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTI1NDkKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDUyNzAxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA1Mjk2NQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTMxNDkKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzMTUwCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA1MzIwMAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTM0MjUK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzNDk2CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA1MzUyNgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNTM1NTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDUzOTA2CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA1NDA0OQohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNTQxMDMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0MTA5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDExOQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNTQxMjMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU0\nMTM5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDE2NgohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTQxNjgKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDU0MTkwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDQzNwohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ1MjYKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDU0NjA3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NDY0\nNAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ3ODYKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDU0ODQzCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA1NDkyNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTQ5NDAKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1MDUxCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA1NTA2MwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTUwNjkK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1MTM2CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA1NTE3MAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNTUyMDIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1MjQyCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA1NTI2MwohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNTUyNzQKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1Mjk5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTQ4MAohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNTU1NTEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU1\nNTU5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NTU2NgohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTU4NDAKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDU2MDk5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjEwOAohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTYxMzEKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDU2Mzc1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjQ5\nMQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1MjkKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDU2NTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA1NjUzOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NDEKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTU0CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA1NjU1NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTY1NjAK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTY3CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA1NjU3NAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNTY1ODgKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2NTk0CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA1NjU5NgohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNTY2ODQKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2ODMyCiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NjgzMwohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNTY4NTEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU2\nODc0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1Njg5NgohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTY5MjcKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDU3MDExCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzAxOAohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTcwNDQKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDU3MTYyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1NzUw\nMAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1MDQKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDU3NTA5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA1NzUxOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1MzIKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3NTMzCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA1NzU1NgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTc1ODAK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3NjM4CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA1NzY0NAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNTc4MTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU3ODc1CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA1ODAwOQohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNTgwNTYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4MjI0CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODI1NwohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNTgyOTUKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4\nMzI4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODMzOQohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTgzNDQKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDU4MzUyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODQxMwohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg0MjEKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDU4NDQwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1ODQ1\nOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg0NjgKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDU4NTYxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA1ODU2NgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg1NjcKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NTg1CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA1ODYyOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNTg2NTYK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NjY1CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA1ODY3OAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNTg2OTEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU4NzIxCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA1ODcyOAohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNTk0NjQKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU5NDg0CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTUzNwohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNTk1MzgKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDU5\nNTUxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTgxOAohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNTk5MTQKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDU5OTIwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA1OTk1NwohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjAwODgKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDYwMTU2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MDE1\nNwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjAxNjAKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDYwMTgxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA2MDE4NQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjA0OTMKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDYwNDk1CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA2MDU5MAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjA4NDYK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYwODQ3CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA2MDg3NQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNjA5MjEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYwOTQ2CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA2MTEyMAohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNjE0NzQKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYxNTI0CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MTY0MgohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNjIwMTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYy\nMDIwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjAyOAohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNjIwOTIKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDYyMDk2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjE0NwohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjIxNzYKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDYyMTg4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2MjI1\nNAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjIzNzQKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDYyNDgyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA2MjQ5NgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjI1MDEKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNTA4CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA2MjUxOQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjI1NTQK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYyNzQxCiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA2Mjc5NAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNjMxNjAKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYzMzU5CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA2MzUxMgohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNjM2NjgKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYzNjkyCiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Mzc2MwohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNjM3NjQKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDYz\nODI2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NDEyNwohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNjQzMTIKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDY0NzA1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NDgwNwohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjUxMjAKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDY1MTY4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NTI0\nOQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjUyODcKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDY1MzM1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA2NTMzNwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjU1NDEKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDY1NzE1CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA2NTczNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjU3NTYK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY1ODAyCiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA2NjExMgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNjYxMzYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY2MTQwCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA2NjQ2NQohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNjY4ODEKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY2OTUwCiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2Njk1OQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNjc0MzUKIS0td3d3LmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx\nMDY3NDc5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzUyOAohLS0uZnRj\naGluZXNlLmNvbS9zdG9yeS8wMDEwNjc1NDUKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rv\ncnkvMDAxMDY3NTcyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2NzY0OAoh\nLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjc2NTAKIS0tLmZ0Y2hpbmVzZS5j\nb20vc3RvcnkvMDAxMDY3NjgwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2\nNzY5MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjc4NzEKIS0tLmZ0Y2hp\nbmVzZS5jb20vc3RvcnkvMDAxMDY3OTIzCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5\nLzAwMTA2ODA2MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjgyNDgKIS0t\nLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4Mjc4CiEtLS5mdGNoaW5lc2UuY29t\nL3N0b3J5LzAwMTA2ODM3OQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNjg0\nODMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NTA2CiEtLS5mdGNoaW5l\nc2UuY29tL3N0b3J5LzAwMTA2ODU0NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8w\nMDEwNjg2MTYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY4NjIyCiEtLS5m\ndGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2ODcwNwohLS0uZnRjaGluZXNlLmNvbS9z\ndG9yeS8wMDEwNjkxNDYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDY5Mzcz\nCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2OTUxNgohLS0uZnRjaGluZXNl\nLmNvbS9zdG9yeS8wMDEwNjk1MTcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAx\nMDY5Njg3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA2OTc0MQohLS0uZnRj\naGluZXNlLmNvbS9zdG9yeS8wMDEwNjk4NjEKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rv\ncnkvMDAxMDY5OTUyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MDA1Mwoh\nLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzAxNzcKIS0tLmZ0Y2hpbmVzZS5j\nb20vc3RvcnkvMDAxMDcwMzA3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3\nMDgwOQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzA5OTAKIS0tLmZ0Y2hp\nbmVzZS5jb20vc3RvcnkvMDAxMDcxMDQyCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5\nLzAwMTA3MTA0NAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzExMDYKIS0t\nLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcxMTY2CiEtLS5mdGNoaW5lc2UuY29t\nL3N0b3J5LzAwMTA3MTE4MQohLS1mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MTIw\nMAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzEyMDgKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDcxMjM4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA3MTY4MwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzIyNzEKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyMzQ4CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA3MjY3NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzI3MjYK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyNzk0CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA3Mjg1MwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNzI4OTUKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcyOTkzCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA3MzA0MwohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNzMxMDMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDczMTU3CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MzIxNgohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNzMyNDYKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDcz\nMzA1CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MzMwNwohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNzM0MDgKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDczNTM3CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3MzY3MgohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzM4NDkKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDczOTA2CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDA4\nOQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQxMTAKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDc0MTI4CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA3NDE1NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQyNDYKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0MzA3CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA3NDM0NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ0MjMK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0NDU0CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA3NDQ2NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNzQ0OTMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0NTUwCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA3NDU2MgohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNzQ2NTMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0NjkzCiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDY5OQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNzQ3MTIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc0\nNzEzCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDc2OAohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNzQ3ODIKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDc0Nzk0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDgyMgohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzQ4NzQKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDc0ODkxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NDkx\nOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzUwODEKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDc1MTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA3NTE0MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzUyMTYKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1MjMwCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA3NTIzOAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzUyNjIK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1MjY5CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA3NTQ5MQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNzU1MDAKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1NjUwCiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA3NTY3OAohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNzU3MDMKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc1NzM5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NjA2NgohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNzYxNDIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc2\nNDU5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NjQ3MAohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwNzY1MzgKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDc2NTczCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NjkwMQohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzcwNjcKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDc3MDg0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3NzIz\nNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzczNDQKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDc3MzkwCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA3NzM5MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzc0NjUKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDc3NDY4CiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA3NzQ5MgohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwNzc3NDUK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc3NzY4CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA3NzgwNAohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEw\nNzc4NTIKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc4NjQ2CiEtLS5mdGNo\naW5lc2UuY29tL3N0b3J5LzAwMTA3ODkyOAohLS0uZnRjaGluZXNlLmNvbS9zdG9y\neS8wMDEwNzg5NjcKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc5NTU5CiEt\nLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3OTY0MQohLS0uZnRjaGluZXNlLmNv\nbS9zdG9yeS8wMDEwNzk5MDkKIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDc5\nOTM0CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA3OTk5MgohLS0uZnRjaGlu\nZXNlLmNvbS9zdG9yeS8wMDEwODAwNTQKIS0tLmZ0Y2hpbmVzZS5jb20vc3Rvcnkv\nMDAxMDgwMTA5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA4MDE2OQohLS0u\nZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwODAyMjYKIS0tLmZ0Y2hpbmVzZS5jb20v\nc3RvcnkvMDAxMDgwNDI5CiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAwMTA4MDQ3\nMQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwODA1NTAKIS0tLmZ0Y2hpbmVz\nZS5jb20vc3RvcnkvMDAxMDgwNTgxCiEtLS5mdGNoaW5lc2UuY29tL3N0b3J5LzAw\nMTA4MDY0NwohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwODA3NzgKIS0tLmZ0\nY2hpbmVzZS5jb20vc3RvcnkvMDAxMDgwODkyCiEtLS5mdGNoaW5lc2UuY29tL3N0\nb3J5LzAwMTA4MDkxNQohLS0uZnRjaGluZXNlLmNvbS9zdG9yeS8wMDEwODA5MzUK\nIS0tLmZ0Y2hpbmVzZS5jb20vc3RvcnkvMDAxMDgxMDU5CiEtLS5mdGNoaW5lc2Uu\nY29tL3N0b3J5LzAwMTA4MTEyNwohLS0uZnRjaGluZXNlLmNvbS90YWcvJUU1JThE\nJTgxJUU1JTg1JUFCJUU1JUIxJThBJUU0JUI4JTg5JUU0JUI4JUFEJUU1JTg1JUE4\nJUU0JUJDJTlBCiEtLS5mdGNoaW5lc2UuY29tL3RhZy8lRTYlQjglQTklRTUlQUUl\nQjYlRTUlQUUlOUQKIS0tLmZ0Y2hpbmVzZS5jb20vdGFnLyVFOCU5NiU4NCVFNyU4\nNiU5OSVFNiU5RCVBNQohLS0uZnRjaGluZXNlLmNvbS92aWRlby8xNDM3CiEtLS5m\ndGNoaW5lc2UuY29tL3ZpZGVvLzE4ODIKIS0tLmZ0Y2hpbmVzZS5jb20vdmlkZW8v\nMjQ0NgohLS0uZnRjaGluZXNlLmNvbS92aWRlby8yNjAxCiEtLS5mdGNoaW5lc2Uu\nY29tL2NvbW1lbnRzCgohIS0tLUdvb2dsZS0tLQohIyMjaHR0cHM6Ly93d3cuZ29v\nZ2xlLmNvbS9zdXBwb3J0ZWRfZG9tYWlucyMjIwohLi4uR0ZXTGlzdCBkb2Vzbid0\nIGludGVuZCB0byBzdXBwb3J0IHR5cG9zcXVhdHRpbmcuLi4KfHwxZTEwMC5uZXQK\nfHw0NjY0NTMuY29tCnx8YWJjLnh5egp8fGFib3V0Lmdvb2dsZQp8fGFkbW9iLmNv\nbQp8fGFkc2Vuc2UuY29tCnx8YWdvb2dsZWFkYXkuY29tCnx8YWkuZ29vZ2xlCnx8\nYW1wcHJvamVjdC5vcmcKQEB8aHR0cHM6Ly93d3cuYW1wcHJvamVjdC5vcmcKQEB8\naHR0cHM6Ly9jZG4uYW1wcHJvamVjdC5vcmcKfHxhbmRyb2lkLmNvbQp8fGFuZHJv\naWRpZnkuY29tCnx8YW5kcm9pZHR2LmNvbQp8fGFwaS5haQouYXBwc3BvdC5jb20K\nfHxhcHBzcG90LmNvbQp8fGF1dG9kcmF3LmNvbQp8fGJsb2cuZ29vZ2xlCnx8Ymxv\nZ2Jsb2cuY29tCmJsb2dzcG90LmNvbQovXmh0dHBzPzpcL1wvW15cL10rYmxvZ3Nw\nb3RcLiguKikvCi5ibG9nc3BvdC5oawouYmxvZ3Nwb3QuanAKLmJsb2dzcG90LnR3\nCiEtLXx8Y2FwaXRhbGcuY29tCnx8Y2VydGlmaWNhdGUtdHJhbnNwYXJlbmN5Lm9y\nZwp8fGNocm9tZS5jb20KfHxjaHJvbWVjYXN0LmNvbQp8fGNocm9tZWV4cGVyaW1l\nbnRzLmNvbQp8fGNocm9tZXJjaXNlLmNvbQp8fGNocm9tZXN0YXR1cy5jb20KfHxj\naHJvbWl1bS5vcmcKfHxjb20uZ29vZ2xlCnx8Y3JidWcuY29tCnx8Y3JlYXRpdmVs\nYWI1LmNvbQp8fGNyaXNpc3Jlc3BvbnNlLmdvb2dsZQp8fGNycmV2LmNvbQp8fGRh\ndGEtdm9jYWJ1bGFyeS5vcmcKfHxkZWJ1Zy5jb20KfHxkZWVwbWluZC5jb20KfHxk\nZWphLmNvbQp8fGRlc2lnbi5nb29nbGUKfHxkaWdpc2ZlcmEuY29tCnx8ZG5zLmdv\nb2dsZQp8fGRvbWFpbnMuZ29vZ2xlCnx8ZHVjay5jb20KfHxlbnZpcm9ubWVudC5n\nb29nbGUKfHxmZWVkYnVybmVyLmNvbQp8fGZpcmViYXNlaW8uY29tCnx8Zy5jbwp8\nfGdjci5pbwp8fGdldC5hcHAKfHxnZXQuZGV2Cnx8Z2V0Lmhvdwp8fGdldC5wYWdl\nCnx8Z2V0bWRsLmlvCnx8Z2V0b3V0bGluZS5vcmcKfHxnZ3BodC5jb20KfHxnbWFp\nbC5jb20KfHxnbW9kdWxlcy5jb20KfHxnb2RvYy5vcmcKfHxnb2xhbmcub3JnCnx8\nZ29vLmdsCi5nb29nbGUuYWUKLmdvb2dsZS5hcwouZ29vZ2xlLmFtCi5nb29nbGUu\nYXQKLmdvb2dsZS5hegouZ29vZ2xlLmJhCi5nb29nbGUuYmUKLmdvb2dsZS5iZwou\nZ29vZ2xlLmNhCi5nb29nbGUuY2QKLmdvb2dsZS5jaQouZ29vZ2xlLmNvLmlkCi5n\nb29nbGUuY28uanAKLmdvb2dsZS5jby5rcgouZ29vZ2xlLmNvLm1hCi5nb29nbGUu\nY28udWsKLmdvb2dsZS5jb20KLmdvb2dsZS5kZQp8fGdvb2dsZS5kZXYKLmdvb2ds\nZS5kagouZ29vZ2xlLmRrCi5nb29nbGUuZXMKLmdvb2dsZS5maQouZ29vZ2xlLmZt\nCi5nb29nbGUuZnIKLmdvb2dsZS5nZwouZ29vZ2xlLmdsCi5nb29nbGUuZ3IKLmdv\nb2dsZS5pZQouZ29vZ2xlLmlzCi5nb29nbGUuaXQKLmdvb2dsZS5qbwouZ29vZ2xl\nLmt6Ci5nb29nbGUubHYKLmdvb2dsZS5tbgouZ29vZ2xlLm1zCi5nb29nbGUubmwK\nLmdvb2dsZS5udQouZ29vZ2xlLm5vCi5nb29nbGUucm8KLmdvb2dsZS5ydQouZ29v\nZ2xlLnJ3Ci5nb29nbGUuc2MKLmdvb2dsZS5zaAouZ29vZ2xlLnNrCi5nb29nbGUu\nc20KLmdvb2dsZS5zbgouZ29vZ2xlLnRrCi5nb29nbGUudG0KLmdvb2dsZS50bwou\nZ29vZ2xlLnR0Ci5nb29nbGUudnUKLmdvb2dsZS53cwovXmh0dHBzPzpcL1wvKFte\nXC9dK1wuKSpnb29nbGVcLihhY3xhZHxhZXxhZnxhbHxhbXxhc3xhdHxhenxiYXxi\nZXxiZnxiZ3xiaXxianxic3xidHxieXxjYXxjYXR8Y2R8Y2Z8Y2d8Y2h8Y2l8Y2x8\nY218Y28uYW98Y28uYnd8Y28uY2t8Y28uY3J8Y28uaWR8Y28uaWx8Y28uaW58Y28u\nanB8Y28ua2V8Y28ua3J8Y28ubHN8Y28ubWF8Y29tfGNvbS5hZnxjb20uYWd8Y29t\nLmFpfGNvbS5hcnxjb20uYXV8Y29tLmJkfGNvbS5iaHxjb20uYm58Y29tLmJvfGNv\nbS5icnxjb20uYnp8Y29tLmNvfGNvbS5jdXxjb20uY3l8Y29tLmRvfGNvbS5lY3xj\nb20uZWd8Y29tLmV0fGNvbS5manxjb20uZ2h8Y29tLmdpfGNvbS5ndHxjb20uaGt8\nY29tLmptfGNvbS5raHxjb20ua3d8Y29tLmxifGNvbS5seXxjb20ubW18Y29tLm10\nfGNvbS5teHxjb20ubXl8Y29tLm5hfGNvbS5uZnxjb20ubmd8Y29tLm5pfGNvbS5u\ncHxjb20ub218Y29tLnBhfGNvbS5wZXxjb20ucGd8Y29tLnBofGNvbS5wa3xjb20u\ncHJ8Y29tLnB5fGNvbS5xYXxjb20uc2F8Y29tLnNifGNvbS5zZ3xjb20uc2x8Y29t\nLnN2fGNvbS50anxjb20udHJ8Y29tLnR3fGNvbS51YXxjb20udXl8Y29tLnZjfGNv\nbS52bnxjby5tenxjby5uenxjby50aHxjby50enxjby51Z3xjby51a3xjby51enxj\nby52ZXxjby52aXxjby56YXxjby56bXxjby56d3xjdnxjenxkZXxkanxka3xkbXxk\nenxlZXxlc3xldXxmaXxmbXxmcnxnYXxnZXxnZ3xnbHxnbXxncHxncnxneXxoa3xo\nbnxocnxodHxodXxpZXxpbXxpcXxpc3xpdHxpdC5hb3xqZXxqb3xrZ3xraXxrenxs\nYXxsaXxsa3xsdHxsdXxsdnxtZHxtZXxtZ3xta3xtbHxtbnxtc3xtdXxtdnxtd3xt\neHxuZXxubHxub3xucnxudXxvcmd8cGx8cG58cHN8cHR8cm98cnN8cnV8cnd8c2N8\nc2V8c2h8c2l8c2t8c218c258c298c3J8c3R8dGR8dGd8dGt8dGx8dG18dG58dG98\ndHR8dXN8dmd8dm58dnV8d3MpXC8uKi8KIS0tfHxnb29nbGUtYW5hbHl0aWNzLmNv\nbQohLS18fGdvb2dsZWFkc2VydmljZXMuY29tCnx8Z29vZ2xlYXBpcy5jbgp8fGdv\nb2dsZWFwaXMuY29tCnx8Z29vZ2xlYXBwcy5jb20KfHxnb29nbGVhcnRwcm9qZWN0\nLmNvbQp8fGdvb2dsZWJsb2cuY29tCnx8Z29vZ2xlYm90LmNvbQohLS18fGdvb2ds\nZWNhcGl0YWwuY29tCnx8Z29vZ2xlY2hpbmF3ZWJtYXN0ZXIuY29tCnx8Z29vZ2xl\nY29kZS5jb20KfHxnb29nbGVjb21tZXJjZS5jb20KfHxnb29nbGVkb21haW5zLmNv\nbQp8fGdvb2dsZWFydGguY29tCnx8Z29vZ2xlZWFydGguY29tCnx8Z29vZ2xlZHJp\ndmUuY29tCnx8Z29vZ2xlZ3JvdXBzLmNvbQp8fGdvb2dsZWhvc3RlZC5jb20KfHxn\nb29nbGVpZGVhcy5jb20KfHxnb29nbGVpbnNpZGVzZWFyY2guY29tCnx8Z29vZ2xl\nbGFicy5jb20KfHxnb29nbGVtYWlsLmNvbQp8fGdvb2dsZW1hc2h1cHMuY29tCnx8\nZ29vZ2xlcGFnZWNyZWF0b3IuY29tCnx8Z29vZ2xlcGxheS5jb20KfHxnb29nbGVw\nbHVzLmNvbQp8fGdvb2dsZXNjaG9sYXIuY29tCnx8Z29vZ2xlc291cmNlLmNvbQoh\nLS18fGdvb2dsZXN5bmRpY2F0aW9uLmNvbQohLS18fGdvb2dsZXRhZ21hbmFnZXIu\nY29tCiEtLXx8Z29vZ2xldGFnc2VydmljZXMuY29tCnx8Z29vZ2xldXNlcmNvbnRl\nbnQuY29tCi5nb29nbGV2aWRlby5jb20KfHxnb29nbGV2aWRlby5jb20KfHxnb29n\nbGV3ZWJsaWdodC5jb20KfHxnb29nbGV6aXAubmV0Cnx8Z3JvdXBzLmdvb2dsZS5j\nbgp8fGdyb3cuZ29vZ2xlCnx8Z3N0YXRpYy5jb20KIS0tfHxndi5jb20KfHxndnQw\nLmNvbQp8fGd2dDEuY29tCkBAfHxyZWRpcmVjdG9yLmd2dDEuY29tCnx8Z3Z0My5j\nb20KfHxnd3Rwcm9qZWN0Lm9yZwp8fGh0bWw1cm9ja3MuY29tCnx8aWFtLnNveQp8\nfGlnb29nbGUuY29tCnx8aXRhc29mdHdhcmUuY29tCnx8bGVycy5nb29nbGUKfHxs\naWtlLmNvbQp8fG1hZGV3aXRoY29kZS5jb20KfHxtYXRlcmlhbC5pbwp8fG5pYy5n\nb29nbGUKfHxvbjIuY29tCnx8cGFub3JhbWlvLmNvbQp8fHBpY2FzYXdlYi5jb20K\nfHxwa2kuZ29vZwp8fHBsdXMuY29kZXMKfHxwb2x5bWVyLXByb2plY3Qub3JnCnx8\ncHJpZGUuZ29vZ2xlCnx8cXVlc3R2aXN1YWwuY29tCnx8YWRtaW4ucmVjYXB0Y2hh\nLm5ldAp8fGFwaS5yZWNhcHRjaGEubmV0Cnx8YXBpLXNlY3VyZS5yZWNhcHRjaGEu\nbmV0Cnx8YXBpLXZlcmlmeS5yZWNhcHRjaGEubmV0Cnx8cmVkaG90bGFicy5jb20K\nfHxyZWdpc3RyeS5nb29nbGUKfHxzYWZldHkuZ29vZ2xlCnx8c2F2ZXRoZWRhdGUu\nZm9vCnx8c2NoZW1hLm9yZwp8fHNoYXR0ZXJlZC5pbwp8aHR0cDovL3NpcG1sNS5v\ncmcvCnx8c3Rvcmllcy5nb29nbGUKfHxzdXN0YWluYWJpbGl0eS5nb29nbGUKfHxz\neW5lcmd5c2UuY29tCnx8dGVhY2hwYXJlbnRzdGVjaC5vcmcKfHx0ZW5zb3JmbG93\nLm9yZwp8fHRmaHViLmRldgp8fHRoaW5rd2l0aGdvb2dsZS5jb20KfHx0aWx0YnJ1\nc2guY29tCnx8dXJjaGluLmNvbQohLS18fHd3dy5nb29nbGUKfHx3YXZlcHJvdG9j\nb2wub3JnCnx8d2F5bW8uY29tCnx8d2ViLmRldgp8fHdlYm1wcm9qZWN0Lm9yZwp8\nfHdlYnJ0Yy5vcmcKfHx3aGF0YnJvd3Nlci5vcmcKfHx3aWRldmluZS5jb20KfHx3\naXRoZ29vZ2xlLmNvbQp8fHdpdGh5b3V0dWJlLmNvbQp8fHguY29tcGFueQp8fHhu\nLS1uZ3N0ci1scmE4ai5jb20KfHx5b3V0dS5iZQoueW91dHViZS5jb20KfHx5b3V0\ndWJlLmNvbQp8fHlvdXR1YmUtbm9jb29raWUuY29tCnx8eW91dHViZWVkdWNhdGlv\nbi5jb20KfHx5b3V0dWJlZ2FtaW5nLmNvbQp8fHl0LmJlCnx8eXRpbWcuY29tCnx8\nenluYW1pY3MuY29tCgohIS0tLUtpY2tBU1MtLS0KIS0tT0ZGSUNJQUwgVVJMIGxp\nc3QgYXQ6IGh0dHBzOi8va2FzdGF0dXMuY29tCgohIS0tLU5hdWdodHlBbWVyaWNh\nLS0tCnx8bmF1Z2h0eWFtZXJpY2EuY29tCgohIS0tLU5ZVGltZXMtLS0KIS0tfHxk\nMWYxZXJ5aXF5anMwci5jbG91ZGZyb250Lm5ldAohLS18fGQzbGFyMDl4Yndsc2dl\nLmNsb3VkZnJvbnQubmV0CiEtLXx8ZDNxMXFqOWp6c3U4bncuY2xvdWRmcm9udC5u\nZXQKIS0tfHxkYzh4bDBuZHpuMmNiLmNsb3VkZnJvbnQubmV0CiEtLXx8YTEubnl0\nLmNvbQohLS18fGludC5ueXQuY29tCiEtLXx8czEubnl0LmNvbQpzdGF0aWMwMS5u\neXQuY29tCiEtLXx8c3RhdGljMDEubnl0LmNvbQohLS18fHR5cGVmYWNlLm55dC5j\nb20KfHxueXQuY29tCm55dGNoaW5hLmNvbQpueXRjbi5tZQp8fG55dGNuLm1lCnx8\nbnl0Y28uY29tCnxodHRwOi8vbnl0aS5tcy8KLm55dGltZXMuY29tCnx8bnl0aW1l\ncy5jb20KfHxueXRpbWcuY29tCnVzZXJhcGkubnl0bG9nLmNvbQpjbi5ueXRzdHls\nZS5jb20KfHxueXRzdHlsZS5jb20KCiEhLS0tU3RlYW0tLS0KLnN0ZWFtY29tbXVu\naXR5LmNvbQp8fHN0ZWFtY29tbXVuaXR5LmNvbQohLS1zdGVhbWNvbW11bml0eS5j\nb20vcHJvZmlsZXMvNzY1NjExOTgwNjI3NzE2MDkKIS0tc3RlYW1jb21tdW5pdHku\nY29tL2dyb3Vwcy9MaWJldFRpYmV0CiEtLXN0ZWFtY29tbXVuaXR5LmNvbS9ncm91\ncHMvemhvbmdnb25nCiEtLXN0ZWFtY29tbXVuaXR5LmNvbS9pZC9DSlRfSmFja3Rv\nbgp8aHR0cDovL3N0b3JlLnN0ZWFtcG93ZXJlZC5jb20vYXBwLzMzMzYwMAoKISEt\nLS1UZWxlZ3JhbS0tLQohISEtLS1Eb21haW4tLS0KfHx0Lm1lCnx8dXBkYXRlcy50\nZGVza3RvcC5jb20KfHx0ZWxlZ3JhbS5kb2cKfHx0ZWxlZ3JhbS5tZQp8fHRlbGVn\ncmFtLm9yZwoudGVsZWdyYW1kb3dubG9hZC5jb20KfHx0ZWxlc2NvLnBlCiEhIS0t\nLUlQLS0tCgohIS0tLVR3aXRjaC0tLQp8fGp0dm53Lm5ldAp8fHR0dm53Lm5ldAp8\nfHR3aXRjaC50dgp8fHR3aXRjaGNkbi5uZXQKCiEhLS0tVHdpdHRlci0tLQp8fHBl\ncmlzY29wZS50dgoucHNjcC50dgp8fHBzY3AudHYKLnQuY28KfHx0LmNvCi50d2Vl\ndGRlY2suY29tCnx8dHdlZXRkZWNrLmNvbQp8fHR3aW1nLmNvbQoudHdpdHBpYy5j\nb20KfHx0d2l0cGljLmNvbQoudHdpdHRlci5jb20KfHx0d2l0dGVyLmNvbQp8fHR3\naXR0ZXIuanAKfHx2aW5lLmNvCgohIS0tLVRhaXdhbi0tLQp8fGdvdi50YWlwZWkK\nLmdvdi50dwp8aHR0cHM6Ly9haXNzLmFud3MuZ292LnR3Cnx8YXJjaGl2ZXMuZ292\nLnR3Cnx8dGFjYy5jd2IuZ292LnR3Cnx8ZGF0YS5nb3YudHcKfHxlcGEuZ292LnR3\nCnx8ZmEuZ292LnR3Cnx8ZmRhLmdvdi50dwp8fGhwYS5nb3YudHcKfHxpbW1pZ3Jh\ndGlvbi5nb3YudHcKfHxpdGFpd2FuLmdvdi50dwp8fG1qaWIuZ292LnR3Cnx8bW9l\nYWljLmdvdi50dwp8fG1vZmEuZ292LnR3Cnx8bW9sLmdvdi50dwp8fG12ZGlzLmdv\ndi50dwp8fG5hdC5nb3YudHcKfHxuaGkuZ292LnR3Cnx8bnBhLmdvdi50dwp8fG5z\nYy5nb3YudHcKfHxudGJrLmdvdi50dwp8fG50Ym5hLmdvdi50dwp8fG50YnQuZ292\nLnR3Cnx8bnRzbmEuZ292LnR3Cnx8cGNjLmdvdi50dwp8fHN0YXQuZ292LnR3Cnx8\ndGFpcGVpLmdvdi50dwp8fHRhaXdhbmpvYnMuZ292LnR3Cnx8dGhiLmdvdi50dwp8\nfHRpcG8uZ292LnR3Cnx8d2RhLmdvdi50dwoKfHx0ZWNvLWhrLm9yZwp8fHRlY28t\nbW8ub3JnCgpAQHx8YWZ0eWdoLmdvdi50dwpAQHx8YWlkZS5nb3YudHcKQEB8fHRw\nZGUuYWlkZS5nb3YudHcKQEB8fGFydGUuZ292LnR3CkBAfHxjaHVrdWFuZy5nb3Yu\ndHcKQEB8fGN3Yi5nb3YudHcKQEB8fGN5Y2FiLmdvdi50dwpAQHx8ZGJuc2EuZ292\nLnR3CkBAfHxkZi5nb3YudHcKQEB8fGVhc3Rjb2FzdC1uc2EuZ292LnR3CkBAfHxl\ncnYtbnNhLmdvdi50dwpAQHx8Z3JiLmdvdi50dwpAQHx8Z3lzZC5ueWMuZ292LnR3\nCkBAfHxoY2hjYy5nb3YudHcKQEB8fGhzaW5jaHUtY2MuZ292LnR3CkBAfHxpbmVy\nLmdvdi50dwpAQHx8a2xzaW8uZ292LnR3CkBAfHxrbXNlaC5nb3YudHcKQEB8fGx1\nbmd0YW5oci5nb3YudHcKQEB8fG1hb2xpbi1uc2EuZ292LnR3CkBAfHxtYXRzdS1u\nZXdzLmdvdi50dwpAQHx8bWF0c3UtbnNhLmdvdi50dwpAQHx8bWF0c3VjYy5nb3Yu\ndHcKQEB8fG1vZS5nb3YudHcKQEB8fG12ZGlzLmdvdi50dwpAQHx8bmFua2FuLmdv\ndi50dwpAQHx8bmNyZWUuZ292LnR3CkBAfHxuZWNvYXN0LW5zYS5nb3YudHcKQEB8\nfHNpcmF5YS1uc2EuZ292LnR3CkBAfHxjcm9tb3RjLm5hdC5nb3YudHcKQEB8fHRh\neC5uYXQuZ292LnR3CkBAfHxuZWNvYXN0LW5zYS5nb3YudHcKQEB8fG5lci5nb3Yu\ndHcKQEB8fG5tbWJhLmdvdi50dwpAQHx8bm1wLmdvdi50dwpAQHx8bm12dHRjLmdv\ndi50dwpAQHx8bm9ydGhndWFuLW5zYS5nb3YudHcKQEB8fG5wbS5nb3YudHcKQEB8\nfG5zdG0uZ292LnR3CkBAfHxudGRtaC5nb3YudHcKQEB8fG50bC5nb3YudHcKQEB8\nfG50c2VjLmdvdi50dwpAQHx8bnR1aC5nb3YudHcKQEB8fG52cmkuZ292LnR3CkBA\nfHxwZW5naHUtbnNhLmdvdi50dwpAQHx8cG9zdC5nb3YudHcKQEB8fHNpcmF5YS1u\nc2EuZ292LnR3CkBAfHxzdGR0aW1lLmdvdi50dwpAQHx8c3VubW9vbmxha2UuZ292\nLnR3CkBAfHx0YWl0dW5nLWhvdXNlLmdvdi50dwpAQHx8dGFveXVhbi5nb3YudHcK\nQEB8fHRwaGNjLmdvdi50dwpAQHx8dHJpbXQtbnNhLmdvdi50dwpAQHx8dmdodHBl\nLmdvdi50dwpAQHx8dmdoa3MuZ292LnR3CkBAfHx2Z2h0Yy5nb3YudHcKQEB8fHdh\nbmZhbmcuZ292LnR3CkBAfHx5YXRzZW4uZ292LnR3CkBAfHx5ZGEuZ292LnR3Cgoh\nLS1AQHx8NHBwcGMuZ292LnR3CiEtLUBAfHw5MjEuZ292LnR3CiEtLUBAfHxkbXRp\ncC5nb3YudHcKIS0tQEB8fGV0cmFpbmluZy5nb3YudHcKIS0tQEB8fGdzbi1jZXJ0\nLm5hdC5nb3YudHcKIS0tQEB8fG5pY2kubmF0Lmdvdi50dwohLS1AQHx8aGNjLmdv\ndi50dwohLS1AQHx8aGVuZ2NodWVuLmdvdi50dwohLS1AQHx8a2hjYy5nb3YudHcK\nIS0tQEB8fGtobXMuZ292LnR3CiEtLUBAfHxray5nb3YudHcKIS0tQEB8fGtsY2Nh\nYi5nb3YudHcKIS0tQEB8fGtscmEuZ292LnR3CiEtLUBAfHxubWguZ292LnR3CiEt\nLUBAfHxubXRsLmdvdi50dwohLS1AQHx8cGFicC5nb3YudHcKIS0tQEB8fHBldC5n\nb3YudHcKIS0tQEB8fHRjaGIuZ292LnR3CiEtLUBAfHx0Y3NhYy5nb3YudHcKIS0t\nQEB8fHRuY3NlYy5nb3YudHcKfHxraW5tZW4ub3JnLnR3CgohIS0tLVYyRVgtLS0K\nLnYyZXguY29tCiEtLUluY2x1ZGVkIGluIGFib3ZlIHJ1bGU6IGRucy52MmV4LmNv\nbQpAQHxodHRwOi8vdjJleC5jb20KQEB8aHR0cDovL2Nkbi52MmV4LmNvbQpAQHxo\ndHRwOi8vY24udjJleC5jb20KQEB8aHR0cDovL2hrLnYyZXguY29tCkBAfGh0dHA6\nLy9pLnYyZXguY29tCkBAfGh0dHA6Ly9sYXgudjJleC5jb20KQEB8aHR0cDovL25l\ndWUudjJleC5jb20KQEB8aHR0cDovL3BhZ2VzcGVlZC52MmV4LmNvbQpAQHxodHRw\nOi8vc3RhdGljLnYyZXguY29tCkBAfGh0dHA6Ly93b3Jrc3BhY2UudjJleC5jb20K\nQEB8aHR0cDovL3d3dy52MmV4LmNvbQoKISEtLS1ZYWhvby0tLQp8fGRhdGEuZmx1\ncnJ5LmNvbQpwYWdlLmJpZC55YWhvby5jb20KdHcuYmlkLnlhaG9vLmNvbQp8aHR0\ncHM6Ly90dy5iaWQueWFob28uY29tCmJsb2dzLnlhaG9vLmNvLmpwCnx8c2VhcmNo\nLnlhaG9vLmNvLmpwCmJ1eS55YWhvby5jb20udHcvZ2RzYWxlCmhrLnlhaG9vLmNv\nbQpoay5rbm93bGVkZ2UueWFob28uY29tCnR3Lm1vbmV5LnlhaG9vLmNvbQpoay5t\neWJsb2cueWFob28uY29tCm5ld3MueWFob28uY29tL2NoaW5hLWJsb2Nrcy1iYmMK\nfHxoay5uZXdzLnlhaG9vLmNvbQpoay5yZC55YWhvby5jb20KaGsuc2VhcmNoLnlh\naG9vLmNvbS9zZWFyY2gKaGsudmlkZW8ubmV3cy55YWhvby5jb20vdmlkZW8KbWVt\nZS55YWhvby5jb20KIS0tdHcueWFob28uY29tCnR3LmFuc3dlcnMueWFob28uY29t\nCnxodHRwczovL3R3LmFuc3dlcnMueWFob28uY29tCnx8dHcua25vd2xlZGdlLnlh\naG9vLmNvbQp8fHR3Lm1hbGwueWFob28uY29tCnR3LnlhaG9vLmNvbQp8fHR3Lm1v\nYmkueWFob28uY29tCnR3Lm15YmxvZy55YWhvby5jb20KfHx0dy5uZXdzLnlhaG9v\nLmNvbQpwdWxzZS55YWhvby5jb20KfHxzZWFyY2gueWFob28uY29tCnVwY29taW5n\nLnlhaG9vLmNvbQp2aWRlby55YWhvby5jb20KfHx5YWhvby5jb20uaGsKfHxkdWNr\nZHVja2dvLW93bmVkLXNlcnZlci55YWhvby5uZXQKCiEtLS0tLS0tLS0tLS0tLS0t\nLS1OdW1lcmljcy0tLS0tLS0tLS0tLS0tLS0tLS0tLQouMDMwYnV5LmNvbQouMHJ6\nLnR3CnxodHRwOi8vMHJ6LnR3CjEtYXBwbGUuY29tLnR3Cnx8MS1hcHBsZS5jb20u\ndHcKLjEwLnR0Ci4xMDBrZS5vcmcKLjEwMDBnaXJpLm5ldAp8fDEwMDBnaXJpLm5l\ndAouMTBjb25kaXRpb25zb2Zsb3ZlLmNvbQp8fDEwbXVzdW1lLmNvbQoxMjNyZi5j\nb20KLjEyYmV0LmNvbQp8fDEyYmV0LmNvbQouMTJ2cG4uY29tCi4xMnZwbi5uZXQK\nfHwxMnZwbi5jb20KfHwxMnZwbi5uZXQKLjEzOC5jb20KMTQxaG9uZ2tvbmcuY29t\nL2ZvcnVtCnx8MTQxamouY29tCi4xNDF0dWJlLmNvbQouMTY4OC5jb20uYXUKLjE3\nM25nLmNvbQp8fDE3M25nLmNvbQouMTc3cGljLmluZm8KLjE3dDE3cC5jb20KfHwx\nOGJvYXJkLmNvbQp8fDE4Ym9hcmQuaW5mbwoxOG9ubHlnaXJscy5jb20KLjE4cDJw\nLmNvbQouMTh2aXJnaW5zZXguY29tCi4xOTQ5ZXIub3JnCnpoYW8uMTk4NC5jaXR5\nCnx8emhhby4xOTg0LmNpdHkKMTk4NGJicy5jb20KfHwxOTg0YmJzLmNvbQohLS18\nfDE5ODRibG9nLmNvbQouMTk4NGJicy5vcmcKfHwxOTg0YmJzLm9yZwouMTk5MXdh\neS5jb20KfHwxOTkxd2F5LmNvbQouMTk5OGNkcC5vcmcKLjFiYW8ub3JnCnxodHRw\nOi8vMWJhby5vcmcKLjFlZXcuY29tCi4xbW9iaWxlLmNvbQp8aHR0cDovLyouMW1v\nYmlsZS50dwp8fDFwb25kby50dgouMi1oYW5kLmluZm8KLjIwMDBmdW4uY29tL2Ji\ncwouMjAwOHhpYW56aGFuZy5pbmZvCnx8MjAwOHhpYW56aGFuZy5pbmZvCnx8MjAx\nNy5oawoyMWFuZHkuY29tL2Jsb2cKLjIxcHJvbi5jb20KMjFzZXh0dXJ5LmNvbQou\nMjI4Lm5ldC50dwp8fDIzM2FiYy5jb20KfHwyNGhycy5jYQoyNHNtaWxlLm9yZwoy\nbGlwc3R1YmUuY29tCi4yc2hhcmVkLmNvbQozMGJveGVzLmNvbQouMzE1bHouY29t\nCnx8MzJyZWQuY29tCnx8MzZyYWluLmNvbQouM2E1YS5jb20KM2FyYWJ0di5jb20K\nLjNib3lzMmdpcmxzLmNvbQouM3Byb3h5LnJ1Ci4zcmVuLmNhCi4zdHVpLm5ldAp8\nfDRibHVlc3RvbmVzLmJpegouNGNoYW4uY29tCiEtLXx8NGNoYW4ub3JnCi40ZXZl\ncnByb3h5LmNvbQp8fDRldmVycHJveHkuY29tCnx8NHJidHYuY29tCnx8NHNoYXJl\nZC5jb20KdGFpd2FubmF0aW9uLjUwd2Vicy5jb20KfHw1MS5jYQp8fDUxamF2Lm9y\nZwouNTFsdW9iZW4uY29tCnx8NTFsdW9iZW4uY29tCi41Mjc4LmNjCi41Mjk5LnR2\nCjVhaW1pa3UuY29tCjVpMDEuY29tCi41aXNvdG9pNS5vcmcKLjVtYW9kYW5nLmNv\nbQp8fDYzaS5jb20KLjY0bXVzZXVtLm9yZwo2NHRpYW53YW5nLmNvbQo2NHdpa2ku\nY29tCi42Ni5jYQo2NjZrYi5jb20KNnBhcmsuY29tCnx8NnBhcmsuY29tCnx8NnBh\ncmtlci5jb20KfHw3Y2FwdHVyZS5jb20KLjdjb3cuY29tCi44LWQuY29tCnxodHRw\nOi8vOC1kLmNvbQo4NWNjLm5ldAouODVjYy51cwp8aHR0cDovLzg1Y2MudXMKfGh0\ndHA6Ly84NXN0LmNvbQouODgxOTAzLmNvbS9wYWdlL3poLXR3Lwp8fDg4MTkwMy5j\nb20KLjg4OC5jb20KLjg4OHBva2VyLmNvbQo4OS42NC5jaGFydGVyLmNvbnN0aXR1\ndGlvbmFsaXNtLnNvbHV0aW9ucwo4OS02NC5vcmcKfHw4OS02NC5vcmcKLjhuZXdz\nLmNvbS50dwouOHoxLm5ldAp8fDh6MS5uZXQKLjkwMDE3MDAuY29tCnxodHRwOi8v\nOTA4dGFpd2FuLm9yZy8KfHw5MXBvcm4uY29tCnx8OTF2cHMuY2x1YgouOTJjY2F2\nLmNvbQouOTkxLmNvbQp8aHR0cDovLzk5MS5jb20KLjk5YnRnYzAxLmNvbQp8fDk5\nYnRnYzAxLmNvbQouOTljbi5pbmZvCnxodHRwOi8vOTljbi5pbmZvCnx8OWJpcy5j\nb20KfHw5YmlzLm5ldAoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tQUEtLS0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tCi50aWJldC5hLnNlCnxodHRwOi8vdGliZXQuYS5zZQp8\nfGEtbm9ybWFsLWRheS5jb20KYTUuY29tLnJ1CnxodHRwOi8vYWFtYWNhdS5jb20K\nIS0tfGh0dHA6Ly9jZG4qLmFiYy5jb20vCi5hYmMuY29tCi5hYmMubmV0LmF1Cnx8\nYWJjLm5ldC5hdQouYWJjaGluZXNlLmNvbQphYmNsaXRlLm5ldAp8aHR0cHM6Ly93\nd3cuYWJjbGl0ZS5uZXQKLmFibHdhbmcuY29tCi5hYm9sdW93YW5nLmNvbQp8fGFi\nb2x1b3dhbmcuY29tCi5hYm91dGdmdy5jb20KLmFicy5lZHUKLmFjY2ltLm9yZwou\nYWNlcm9zLWRlLWhpc3BhbmlhLmNvbQouYWNldnBuLmNvbQp8fGFjZXZwbi5jb20K\nLmFjZzE4Lm1lCnxodHRwOi8vYWNnMTgubWUKfHxhY2drai5jb20KLmFjbWVkaWEz\nNjUuY29tCi5hY253LmNvbS5hdQphY3Rmb3J0aWJldC5vcmcKYWN0aW1lcy5jb20u\nYXUKYWN0aXZwbi5jb20KfHxhY3RpdnBuLmNvbQp8fGFjdWxvLnVzCnx8YWRkaWN0\nZWR0b2NvZmZlZS5kZQouYWRlbGFpZGViYnMuY29tL2JicwouYWRwbC5vcmcuaGsK\nfGh0dHA6Ly9hZHBsLm9yZy5oawouYWR1bHQtc2V4LWdhbWVzLmNvbQp8fGFkdWx0\nLXNleC1nYW1lcy5jb20KYWR1bHRmcmllbmRmaW5kZXIuY29tCmFkdWx0a2VlcC5u\nZXQvcGVlcHNob3cvbWVtYmVycy9tYWluLmh0bQp8fGFkdmFuc2NlbmUuY29tCnx8\nYWR2ZXJ0ZmFuLmNvbQouYWUub3JnCnx8YWVuaGFuY2Vycy5jb20KfHxhZi5taWwK\nLmFmYW50aWJicy5jb20KfGh0dHA6Ly9hZmFudGliYnMuY29tCi5haS1rYW4ubmV0\nCnx8YWkta2FuLm5ldAphaS13ZW4ubmV0Ci5haXBoLm5ldAp8fGFpcGgubmV0Ci5h\naXJhc2lhLmNvbQp8fGFpcmNvbnNvbGUuY29tCnxodHRwOi8vZG93bmxvYWQuYWly\nY3JhY2stbmcub3JnCi5haXJ2cG4ub3JnCnx8YWlydnBuLm9yZwouYWlzZXguY29t\nCnx8YWl0Lm9yZy50dwphaXdlaXdlaS5jb20KLmFpd2Vpd2VpYmxvZy5jb20KfHxh\naXdlaXdlaWJsb2cuY29tCnx8d3d3LmFqc2FuZHMuY29tCgohIS0tLUFrYW1haS0t\nLQphMjQ4LmUuYWthbWFpLm5ldAp8fGEyNDguZS5ha2FtYWkubmV0CgpyZmFsaXZl\nMS5ha2FjYXN0LmFrYW1haXN0cmVhbS5uZXQKdm9hLTExLmFrYWNhc3QuYWthbWFp\nc3RyZWFtLm5ldAoKISEtLTQwMwp8fGFiZW1hdHYuYWthbWFpemVkLm5ldAp8fGxp\nbmVhci1hYmVtYXR2LmFrYW1haXplZC5uZXQKfHx2b2QtYWJlbWF0di5ha2FtYWl6\nZWQubmV0Cgp8aHR0cHM6Ly9mYmNkbiouYWthbWFpaGQubmV0LwohLS18fGZiZXh0\nZXJuYWwtYS5ha2FtYWloZC5uZXQKIS0tfHxmYnN0YXRpYy1hLmFrYW1haWhkLm5l\ndAohLS18aHR0cHM6Ly9pZ2NkbiouYWthbWFpaGQubmV0CnJ0aGtsaXZlMi1saC5h\na2FtYWloZC5uZXQKCi5ha2FkZW1peWUub3JnL3VnCnxodHRwOi8vYWthZGVtaXll\nLm9yZy91Zwp8fGFraWJhLW9ubGluZS5jb20KfHxha293Lm9yZwouYWwtaXNsYW0u\nY29tCnx8YWwtcWltbWFoLm5ldAp8fGFsYWJvdXQuY29tCi5hbGFuaG91LmNvbQp8\naHR0cDovL2FsYW5ob3UuY29tCi5hbGFyYWIucWEKfHxhbGFzYmFycmljYWRhcy5v\ncmcKYWxleGx1ci5vcmcKfHxhbGZvcmF0dHYubmV0Ci5hbGhheWF0LmNvbQouYWxp\nY2VqYXBhbi5jby5qcAphbGllbmd1LmNvbQp8fGFsa2FzaXIuY29tCnx8YWxsY29u\nbmVjdGVkLmNvCi5hbGxkcmF3bnNleC5jb20KfHxhbGxkcmF3bnNleC5jb20KLmFs\nbGVydnBuLmNvbQp8fGFsbGZpbmVnaXJscy5jb20KLmFsbGdpcmxtYXNzYWdlLmNv\nbQphbGxnaXJsc2FsbG93ZWQub3JnCi5hbGxncmF2dXJlLmNvbQphbGxpYW5jZS5v\ncmcuaGsKLmFsbGluZmEuY29tCnx8YWxsaW5mYS5jb20KLmFsbGphY2twb3RzY2Fz\naW5vLmNvbQp8fGFsbG1vdmllLmNvbQp8fGFsbWFzZGFybmV3cy5jb20KLmFscGhh\ncG9ybm8uY29tCnx8YWx0ZXJuYXRlLXRvb2xzLmNvbQphbHRlcm5hdGl2ZXRvLm5l\ndC9zb2Z0d2FyZQphbHZpbmFsZXhhbmRlci5jb20KYWx3YXlzZGF0YS5jb20KfHxh\nbHdheXNkYXRhLmNvbQp8fGFsd2F5c2RhdGEubmV0Ci5hbHdheXN2cG4uY29tCnx8\nYWx3YXlzdnBuLmNvbQp8fGFtNzMwLmNvbS5oawphbWVibG8uanAKfHxhbWVibG8u\nanAKd3d3MS5hbWVyaWNhbi5lZHUvdGVkL2ljZS90aWJldAp8fGFtZXJpY2FuZ3Jl\nZW5jYXJkLmNvbQp8aHR0cDovL3d3dy5hbWVyaWNvcnBzLmdvdgp8fGFtaWJsb2Nr\nZWRvcm5vdC5jb20KLmFtaWdvYmJzLm5ldAouYW1pdGFiaGFmb3VuZGF0aW9uLnVz\nCnxodHRwOi8vYW1pdGFiaGFmb3VuZGF0aW9uLnVzCi5hbW5lc3R5Lm9yZwp8fGFt\nbmVzdHkub3JnCnx8YW1uZXN0eS5vcmcuaGsKLmFtbmVzdHkudHcKLmFtbmVzdHl1\nc2Eub3JnCnx8YW1uZXN0eXVzYS5vcmcKLmFtbnllbWFjaGVuLm9yZwouYW1vaWlz\ndC5jb20KLmFtdGItdGFpcGVpLm9yZwphbmRyb2lkcGx1cy5jby9hcGsKLmFuZHln\nb2QuY29tCnxodHRwOi8vYW5keWdvZC5jb20KYW5uYXRhbS5jb20vY2hpbmVzZQp8\nfGFuY2hvcmZyZWUuY29tCiEtLUdIUwp8fGFuY3Njb25mLm9yZwp8fGFuZGZhcmF3\nYXkubmV0Cnx8YW5kcm9pZC14ODYub3JnCmFuZ2VsZmlyZS5jb20vaGkvaGF5YXNo\naQp8fGFuZ3VsYXJqcy5vcmcKYW5pbWVjcmF6eS5uZXQKLmFuaW1lc2hpcHB1dWRl\nbi5jb20KYW5pc2NhcnR1am8uY29tCnx8YW5pc2NhcnR1am8uY29tCnx8YW5vYmlp\nLmNvbQphbm9ueW1pc2UudXMKLmFub255bWl0eW5ldHdvcmsuY29tCi5hbm9ueW1p\nemVyLmNvbQouYW5vbnltb3VzZS5vcmcKfHxhbm9ueW1vdXNlLm9yZwphbm9udGV4\ndC5jb20KLmFucG9wby5jb20KLmFuc3dlcmluZy1pc2xhbS5vcmcKfGh0dHA6Ly93\nd3cuYW50ZC5vcmcKfHxhbnRob255Y2FsemFkaWxsYS5jb20KLmFudGkxOTg0LmNv\nbQphbnRpY2hyaXN0ZW5kb20uY29tCi5hbnRpd2F2ZS5uZXQKfGh0dHA6Ly9hbnRp\nd2F2ZS5uZXQKLmFueXBvcm4uY29tCi5hbnlzZXguY29tCnxodHRwOi8vYW55c2V4\nLmNvbQp8fGFvYm8uY29tLmF1Ci5hb2ZyaWVuZC5jb20KfGh0dHA6Ly9hb2ZyaWVu\nZC5jb20KLmFvZnJpZW5kLmNvbS5hdQouYW9qaWFvLm9yZwp8fGFvbWl3YW5nLmNv\nbQp2aWRlby5hcC5vcmcKLmFwZXR1YmUuY29tCnx8YXBpYXJ5LmlvCi5hcGlnZWUu\nY29tCnx8YXBpZ2VlLmNvbQphcGstZGwuY29tCmFwa2RsZXIuY29tL2Fway92aWV3\nCi5hcGttb25rLmNvbS9hcHAKfHxhcGtwbHouY29tCmFwa3B1cmUuY29tCnx8YXBr\ncHVyZS5jb20KLmFwbHVzdnBuLmNvbQohLS18fGFwcGFubmllLmNvbQouYXBwZG93\nbmxvYWRlci5uZXQvQW5kcm9pZAouYXBwbGVkYWlseS5jb20KfHxhcHBsZWRhaWx5\nLmNvbQphcHBsZWRhaWx5LmNvbS5oawp8fGFwcGxlZGFpbHkuY29tLmhrCmFwcGxl\nZGFpbHkuY29tLnR3Cnx8YXBwbGVkYWlseS5jb20udHcKLmFwcHNob3BwZXIuY29t\nCnxodHRwOi8vYXBwc2hvcHBlci5jb20KfHxhcHBzb2Nrcy5uZXQKfHxhcHBzdG8u\ncmUKLmFwdG9pZGUuY29tCnx8YXB0b2lkZS5jb20KfHxhcmNoaXZlcy5nb3YKLmFy\nY2hpdmUuZm8KfHxhcmNoaXZlLmZvCi5hcmNoaXZlLmlzCnx8YXJjaGl2ZS5pcwou\nYXJjaGl2ZS5saQp8fGFyY2hpdmUubGkKfHxhcmNoaXZlLm9yZwphcmNoaXZlLnRv\nZGF5CnxodHRwczovL2FyY2hpdmUudG9kYXkKLmFyY3Rvc2lhLmNvbQp8aHR0cDov\nL2FyY3Rvc2lhLmNvbQp8fGFyZWNhLWJhY2t1cC5vcmcKLmFyZXRodXNhLnN1Cnx8\nYXJldGh1c2Euc3UKfHxhcmxpbmd0b25jZW1ldGVyeS5taWwKfHxhcm15Lm1pbAou\nYXJ0NHRpYmV0MTk5OC5vcmcKYXJ0b2ZwZWFjZWZvdW5kYXRpb24ub3JnCmFydHN5\nLm5ldAp8fGFzYWNwLm9yZwphc2RmZy5qcC9kYWJyCmFzZy50bwouYXNpYS1nYW1p\nbmcuY29tCi5hc2lhaGFydmVzdC5vcmcKfHxhc2lhaGFydmVzdC5vcmcKYXNpYW5l\nd3MuaXQKfGh0dHA6Ly9qYXBhbmZpcnN0LmFzaWFuZnJlZWZvcnVtLmNvbS8KfHxh\nc2lhbnNleGRpYXJ5LmNvbQp8fGFzaWFud29tZW5zZmlsbS5kZQouYXNpYXRncC5j\nb20KLmFzaWF0b2RheS51cwp8fGFza3N0dWRlbnQuY29tCi5hc2t5bnoubmV0Cnx8\nYXNreW56Lm5ldAp8fGFzc2VtYmxhLmNvbQp8fGFzdHJpbGwuY29tCnx8YXRjLm9y\nZy5hdQouYXRjaGluZXNlLmNvbQp8aHR0cDovL2F0Y2hpbmVzZS5jb20KYXRnZncu\nb3JnCi5hdGxhc3Bvc3QuY29tCnx8YXRsYXNwb3N0LmNvbQp8fGF0ZG10LmNvbQou\nYXRsYW50YTE2OC5jb20vZm9ydW0KLmF0bmV4dC5jb20KfHxhdG5leHQuY29tCmlj\nZS5hdWRpb25vdy5jb20KLmF2LmNvbQp8fGF2Lm1vdmllCi5hdi1lLWJvZHkuY29t\nCmF2YWF6Lm9yZwp8fGF2YWF6Lm9yZwohLS18fGF2YXN0LmNvbQouYXZib2R5LnR2\nCi5hdmNpdHkudHYKLmF2Y29vbC5jb20KLmF2ZGIuaW4KfHxhdmRiLmluCi5hdmRi\nLnR2Cnx8YXZkYi50dgouYXZmYW50YXN5LmNvbQouYXZnbGUuY29tCnx8YXZnbGUu\nY29tCnx8YXZpZGVtdXgub3JnCnx8YXZvaXNpb24uY29tCi5hdnlhaG9vLmNvbQp8\nfGF4dXJlZm9ybWFjLmNvbQouYXplcmJheWNhbi50dgphemVyaW1peC5jb20KIS0t\nYm94dW4uYXp1cmV3ZWJzaXRlcy5uZXQgZG9lc24ndCBleGlzdC4KYm94dW4qLmF6\ndXJld2Vic2l0ZXMubmV0Cnx8Ym94dW4qLmF6dXJld2Vic2l0ZXMubmV0CgohLS0t\nLS0tLS0tLS0tLS0tLS0tLS1CQi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZm9y\ndW0uYmFieS1raW5nZG9tLmNvbQpiYWJ5bmV0LmNvbS5oawpiYWNrY2hpbmEuY29t\nCnx8YmFja2NoaW5hLmNvbQouYmFja3BhY2tlcnMuY29tLnR3L2ZvcnVtCmJhY2t0\nb3RpYW5hbm1lbi5jb20KLmJhZGl1Y2FvLmNvbQp8fGJhZGl1Y2FvLmNvbQouYmFk\nam9qby5jb20KYmFkb28uY29tCnxodHRwOi8vKjIuYmFoYW11dC5jb20udHcKfHxi\nYWlkdS5qcAouYmFpamllLm9yZwp8aHR0cDovL2JhaWppZS5vcmcKfHxiYWlsYW5k\nYWlseS5jb20KfHxiYWl4aW5nLm1lCnx8YmFrZ2Vla2hvbWUudGsKLmJhbmFuYS12\ncG4uY29tCnx8YmFuYW5hLXZwbi5jb20KLmJhbmQudXMKLmJhbmR3YWdvbmhvc3Qu\nY29tCnx8YmFuZHdhZ29uaG9zdC5jb20KLmJhbmdicm9zbmV0d29yay5jb20KLmJh\nbmdjaGVuLm5ldAp8aHR0cDovL2JhbmdjaGVuLm5ldAp8fGJhbmd5b3VsYXRlci5j\nb20KYmFubmVkYm9vay5vcmcKfHxiYW5uZWRib29rLm9yZwouYmFubmVkbmV3cy5v\ncmcKLmJhcmFtYW5nYW9ubGluZS5jb20KfGh0dHA6Ly9iYXJhbWFuZ2FvbmxpbmUu\nY29tCi5iYXJlbmFrZWRpc2xhbS5jb20KfHxiYXJuYWJ1LmNvLnVrCnx8YmFydG9u\nLmRlCmJhcnR2cG4uY29tCi5iYXN0aWxsZXBvc3QuY29tCmJheXZvaWNlLm5ldAp8\nfGJheXZvaWNlLm5ldApkYWp1c2hhLmJheXdvcmRzLmNvbQp8fGJiY2hhdC50dgp8\nfGJiLWNoYXQudHYKLmJiZy5nb3YKLmJia3ouY29tL2ZvcnVtCi5iYm5yYWRpby5v\ncmcKYmJzLXR3LmNvbQouYmJzZGlnZXN0LmNvbS90aHJlYWQKfHxiYnNmZWVkLmNv\nbQpiYnNsYW5kLmNvbQouYmJzbW8uY29tCi5iYnNvbmUuY29tCmJidG95c3RvcmUu\nY29tCi5iY2FzdC5jby5uegouYmNjLmNvbS50dy9ib2FyZAouYmNjaGluZXNlLm5l\ndAouYmNtb3JuaW5nLmNvbQpiZHNtdmlkZW9zLm5ldAouYmVhY29uZXZlbnRzLmNv\nbQouYmViby5jb20KfHxiZWJvLmNvbQouYmVldnBuLmNvbQp8fGJlZXZwbi5jb20K\nLmJlaGluZGtpbmsuY29tCnx8YmVpamluZzE5ODkuY29tCmJlaWppbmdzcHJpbmcu\nY29tCnx8YmVpamluZ3NwcmluZy5jb20KLmJlaWppbmd6eC5vcmcKfGh0dHA6Ly9i\nZWlqaW5nengub3JnCi5iZWxhbWlvbmxpbmUuY29tCi5iZWxsLndpa2kKfGh0dHA6\nLy9iZWxsLndpa2kKYmVteXdpZmUuY2MKYmVyaWMubWUKLmJlcmxpbnR3aXR0ZXJ3\nYWxsLmNvbQp8fGJlcmxpbnR3aXR0ZXJ3YWxsLmNvbQouYmVybS5jby5uegouYmVz\ndGZvcmNoaW5hLm9yZwp8fGJlc3Rmb3JjaGluYS5vcmcKLmJlc3Rnb3JlLmNvbQou\nYmVzdHBvcm5zdGFyZGIuY29tCnx8YmVzdHZwbi5jb20KLmJlc3R2cG5hbmFseXNp\ncy5jb20KLmJlc3R2cG5zZXJ2ZXIuY29tCi5iZXN0dnBuc2VydmljZS5jb20KLmJl\nc3R2cG51c2EuY29tCnx8YmV0MzY1LmNvbQouYmV0ZmFpci5jb20KfHxiZXR0ZXJu\nZXQuY28KLmJldHRlcnZwbi5jb20KfHxiZXR0ZXJ2cG4uY29tCi5iZXR0d2Vlbi5j\nb20KfHxiZXR0d2Vlbi5jb20KfHxiZXR2aWN0b3IuY29tCi5iZXd3dy5uZXQKLmJl\neW9uZGZpcmV3YWxsLmNvbQp8fGJmbm4ub3JnCnx8YmZzaC5oawouYmd2cG4uY29t\nCnx8Ymd2cG4uY29tCi5iaWFubGVpLmNvbQpAQHx8YmlhbmxlaS5jb20KYmlhbnRh\naWxhamlhby5jb20KYmlhbnRhaWxhamlhby5pbgouYmlibGVzZm9yYW1lcmljYS5v\ncmcKfGh0dHA6Ly9iaWJsZXNmb3JhbWVyaWNhLm9yZwouYmljMjAxMS5vcmcKYmln\nZm9vbHMuY29tCnx8YmlnamFwYW5lc2VzZXguY29tCi5iaWduZXdzLm9yZwp8fGJp\nZ25ld3Mub3JnCi5iaWdzb3VuZC5vcmcKLmJpbGl3b3JsZC5jb20KfGh0dHA6Ly9i\naWxpd29ybGQuY29tCnxodHRwOi8vYmlsbHlwYW4uY29tL3dpa2kKLmJpbnV4Lm1l\nCmFpLmJpbndhbmcubWUvY291cGxldApiaXBpYy5uZXQKLmJpdC5kbwp8aHR0cDov\nL2JpdC5kbwouYml0Lmx5CnxodHRwOi8vYml0Lmx5CiEtLXx8Yml0YnVja2V0Lm9y\nZwp8fGJpdGNvaW50YWxrLm9yZwouYml0c2hhcmUuY29tCnx8Yml0c2hhcmUuY29t\nCmJpdHNub29wLmNvbQouYml0dmlzZS5jb20KfHxiaXR2aXNlLmNvbQpiaXpoYXQu\nY29tCnx8YmwtZG91amluc291a28uY29tCi5iam5ld2xpZmUub3JnCi5ianMub3Jn\nCmJqemMub3JnCnx8Ymp6Yy5vcmcKLmJsYWNrbG9naWMuY29tCi5ibGFja3Zwbi5j\nb20KfHxibGFja3Zwbi5jb20KYmxld3Bhc3MuY29tCnRvci5ibGluZ2JsaW5nc3F1\nYWQubmV0Ci5ibGlua3guY29tCnx8Ymxpbmt4LmNvbQpibGludy5jb20KLmJsaXAu\ndHYKfHxibGlwLnR2LwouYmxvY2tjbi5jb20KfHxibG9ja2NuLmNvbQp8fGJsb2Nr\nbGVzcy5jb20KfHxibG9nLmRlCi5ibG9nLmpwCnxodHRwOi8vYmxvZy5qcApAQHx8\nanB1c2guY24KLmJsb2djYXRhbG9nLmNvbQp8fGJsb2djYXRhbG9nLmNvbQp8fGJs\nb2djaXR5Lm1lCi5ibG9nZ2VyLmNvbQp8fGJsb2dnZXIuY29tCmJsb2dpbWcuanAK\nfHxibG9nLmthbmd5ZS5vcmcKLmJsb2dsaW5lcy5jb20KfHxibG9nbGluZXMuY29t\nCnx8YmxvZ2xvdmluLmNvbQpyY29udmVyc2F0aW9uLmJsb2dzLmNvbQpibG9ndGQu\nbmV0Ci5ibG9ndGQub3JnCnxodHRwOi8vYmxvZ3RkLm9yZwp8fGJsb29kc2hlZC5u\nZXQKLmJsb29tYmVyZy5jbgp8fGJsb29tYmVyZy5jbgouYmxvb21iZXJnLmNvbQp8\nfGJsb29tYmVyZy5jb20KYmxvb21iZXJnLmRlCnx8Ymxvb21iZXJnLmRlCiEtLTQw\nMwp8fGFzc2V0cy5id2J4LmlvCgp8fGJsb29tZm9ydHVuZS5jb20KYmx1ZWFuZ2Vs\nbGl2ZS5jb20KLmJtZmlubi5jb20KLmJuZXdzLmNvCnx8Ym5ld3MuY28KfHxibnJt\nZXRhbC5jb20KYm9hcmRyZWFkZXIuY29tL3RocmVhZAp8fGJvYXJkcmVhZGVyLmNv\nbQouYm9kLmFzaWEKfGh0dHA6Ly9ib2QuYXNpYQouYm9kb2c4OC5jb20KLmJvbGVo\ndnBuLm5ldAp8fGJvbGVodnBuLm5ldApib25ib25tZS5jb20KLmJvbmJvbnNleC5j\nb20KLmJvbmZvdW5kYXRpb24ub3JnCi5ib25nYWNhbXMuY29tCnx8Ym9vYnN0YWdy\nYW0uY29tCnx8Ym9vay5jb20udHcKYm9va2VwdWIuY29tCnx8Ym9va3MuY29tLnR3\nCnx8Ym90YW53YW5nLmNvbQouYm90Lm51Ci5ib3dlbnByZXNzLmNvbQp8fGJvd2Vu\ncHJlc3MuY29tCnx8YXBwLmJveC5jb20KZGwuYm94Lm5ldAp8fGRsLmJveC5uZXQK\nLmJveHBuLmNvbQp8fGJveHBuLmNvbQpib3h1bi5jb20KfHxib3h1bi5jb20KLmJv\neHVuLnR2Cnx8Ym94dW4udHYKYm94dW5ibG9nLmNvbQp8fGJveHVuYmxvZy5jb20K\nLmJveHVuY2x1Yi5jb20KYm95YW5ndS5jb20KLmJveWZyaWVuZHR2LmNvbQouYm95\nc2Zvb2QuY29tCnx8YnIuc3QKLmJyYWlueXF1b3RlLmNvbS9xdW90ZXMvYXV0aG9y\ncy9kL2RhbGFpX2xhbWEKfHxicmFuZG9uaHV0Y2hpbnNvbi5jb20KfHxicmF1bWVp\nc3Rlci5vcmcKLmJyYXZvdHViZS5uZXQKfHxicmF2b3R1YmUubmV0Ci5icmF6emVy\ncy5jb20KfHxicmF6emVycy5jb20KLmJyZWFrLmNvbQp8fGJyZWFrLmNvbQpicmVh\na2dmdy5jb20KfHxicmVha2dmdy5jb20KYnJlYWtpbmc5MTEuY29tCi5icmVha2lu\nZ3R3ZWV0cy5jb20KfHxicmVha2luZ3R3ZWV0cy5jb20KfHxicmVha3dhbGwubmV0\nCmJyaWlhbi5jb20vNjUxMS9mcmVlZ2F0ZQouYnJpZWZkcmVhbS5jb20vJUU3JUI0\nJUEwJUU2JUEzJUJBCmJyaXp6bHkuY29tCnx8YnJpenpseS5jb20KfHxicmttZC5j\nb20KYnJvYWRib29rLmNvbQouYnJvYWRwcmVzc2luYy5jb20KfHxicm9hZHByZXNz\naW5jLmNvbQpiYnMuYnJvY2tiYnMuY29tCmJydWNld2FuZy5uZXQKLmJydXRhbHRn\ncC5jb20KfHxicnV0YWx0Z3AuY29tCi5idDJtYWcuY29tCnx8YnQ5NS5jb20KLmJ0\nYWlhLmNvbQouYnRidGF2LmNvbQp8aHR0cDovL2J0ZGlnZy5vcmcKLmJ0a3UubWUK\nfHxidGt1Lm1lCnx8YnRrdS5vcmcKLmJ0c3ByZWFkLmNvbQouYnRzeW5ja2V5cy5j\nb20KLmJ1ZGFlZHUub3JnCnx8YnVkYWVkdS5vcmcKLmJ1ZGRoYW5ldC5jb20udHcv\nemZyb3AvdGliZXQKLmJ1ZGRoaXN0Y2hhbm5lbC50dgouYnVmZmVyZWQuY29tCnxo\ndHRwOi8vYnVmZmVyZWQuY29tCi5idWxsb2cub3JnCnx8YnVsbG9nLm9yZwouYnVs\nbG9nZ2VyLmNvbQp8fGJ1bGxvZ2dlci5jb20KYnVuYnVuaGsuY29tCi5idXNheWFy\naS5jb20KfGh0dHA6Ly9idXNheWFyaS5jb20KLmJ1c2luZXNzaW5zaWRlci5jb20v\nYmluZy1jb3VsZC1iZS1jZW5zb3Jpbmctc2VhcmNoLXJlc3VsdHMtMjAxNAouYnVz\naW5lc3NpbnNpZGVyLmNvbS9jaGluYS1iYW5rcy1wcmVwYXJpbmctZm9yLWRlYnQt\naW1wbG9zaW9uLTIwMTQKLmJ1c2luZXNzaW5zaWRlci5jb20vaG9uZy1rb25nLWFj\ndGl2aXN0cy1kZWZ5LXBvbGljZS10ZWFyLWdhcy1hcy1wcm90ZXN0cy1jb250aW51\nZS1vdmVybmlnaHQtMjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS9pbnRlcm5ldC1v\ndXRhZ2VzLXJlcG9ydGVkLWluLW5vcnRoLWtvcmVhLTIwMTQKLmJ1c2luZXNzaW5z\naWRlci5jb20vaXBob25lLTYtaXMtYXBwcm92ZWQtZm9yLXNhbGUtaW4tY2hpbmEt\nMjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS9uZmwtYW5ub3VuY2Vycy1zdXJmYWNl\nLXRhYmxldHMtMjAxNAouYnVzaW5lc3NpbnNpZGVyLmNvbS9wYW5hbWEtcGFwZXJz\nCi5idXNpbmVzc2luc2lkZXIuY29tL3VtYnJlbGxhLW1hbi1ob25nLWtvbmctMjAx\nNAp8aHR0cDovL3d3dy5idXNpbmVzc2luc2lkZXIuY29tLmF1LyoKLmJ1c2luZXNz\ndG9kYXkuY29tLnR3Cnx8YnVzaW5lc3N0b2RheS5jb20udHcKLmJ1c2luZXNzd2Vl\nay5jb20KLmJ1c3Uub3JnL25ld3MKfGh0dHA6Ly9idXN1Lm9yZy9uZXdzCmJ1c3l0\ncmFkZS5jb20KLmJ1dWdhYS5jb20KLmJ1enpoYW5kLmNvbQouYnV6emhhbmQubmV0\nCi5idXp6b3JhbmdlLmNvbQp8fGJ1enpvcmFuZ2UuY29tCnx8YnZwbi5jb20KfHxi\nd2gxLm5ldApid3NqLmhrCnx8YngudGwKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUND\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQouYy1zcGFudmlkZW8ub3JnCnx8Yy1z\ncGFudmlkZW8ub3JnCnx8Yy1lc3Qtc2ltcGxlLmNvbQouYzEwMHRpYmV0Lm9yZwp8\nfGNhYmxlZ2F0ZXNlYXJjaC5uZXQKLmNhY2hpbmVzZS5jb20KLmNhY253LmNvbQp8\naHR0cDovL2NhY253LmNvbQouY2FjdHVzdnBuLmNvbQp8fGNhY3R1c3Zwbi5jb20K\nLmNhZmVwcmVzcy5jb20KLmNhaHIub3JnLnR3Ci5jYWxhbWVvLmNvbS9ib29rcwpj\nbi5jYWxhbWVvLmNvbQp8aHR0cDovL2NuLmNhbGFtZW8uY29tCi5jYWxnYXJ5Y2hp\nbmVzZS5jYQouY2FsZ2FyeWNoaW5lc2UuY29tCi5jYWxnYXJ5Y2hpbmVzZS5uZXQK\nfGh0dHA6Ly9ibG9nLmNhbGlicmUtZWJvb2suY29tCnxodHRwOi8vZ29vZ2xlLmNh\nbHN0YXRlLmVkdQpmYWx1bi5jYWx0ZWNoLmVkdQouaXRzLmNhbHRlY2guZWR1L35m\nYWx1bi8KLmNhbTQuY29tCi5jYW00LmpwCi5jYW00LnNnCi5jYW1mcm9nLmNvbQp8\nfGNhbWZyb2cuY29tCnx8Y2Ftcy5jb20KLmNhbXMub3JnLnNnCmNhbmFkYW1lZXQu\nY29tCi5jYW5hbHBvcm5vLmNvbQp8aHR0cDovL2Jicy5jYW50b25lc2UuYXNpYS8K\nIS0taHR0cDovL3d3dy5jYW50b25lc2UuYXNpYS9hY3Rpb24tYmJzLmh0bWwKLmNh\nbnl1Lm9yZwp8fGNhbnl1Lm9yZwouY2FvLmltCi5jYW9iaWFuLmluZm8KfHxjYW9i\naWFuLmluZm8KY2FvY2hhbmdxaW5nLmNvbQp8fGNhb2NoYW5ncWluZy5jb20KLmNh\ncC5vcmcuaGsKfHxjYXAub3JnLmhrCi5jYXJhYmluYXN5cGlzdG9sYXMuY29tCmNh\ncmRpbmFsa3VuZ2ZvdW5kYXRpb24ub3JnCmNhcm1vdG9yc2hvdy5jb20Kc3MuY2Fy\ncnl6aG91LmNvbQouY2FydG9vbm1vdmVtZW50LmNvbQp8fGNhcnRvb25tb3ZlbWVu\ndC5jb20KLmNhc2FkZWx0aWJldGJjbi5vcmcKLmNhc2F0aWJldC5vcmcubXgKfGh0\ndHA6Ly9jYXNhdGliZXQub3JnLm14CmNhcmkuY29tLm15Cnx8Y2FyaWJiZWFuY29t\nLmNvbQouY2FzaW5va2luZy5jb20KLmNhc2lub3JpdmEuY29tCnx8Y2F0Y2gyMi5u\nZXQKLmNhdGNoZ29kLmNvbQp8aHR0cDovL2NhdGNoZ29kLmNvbQp8fGNhdGZpZ2h0\ncGF5cGVydmlldy54eHgKLmNhdGhvbGljLm9yZy5oawp8fGNhdGhvbGljLm9yZy5o\nawpjYXRob2xpYy5vcmcudHcKfHxjYXRob2xpYy5vcmcudHcKLmNhdGh2b2ljZS5v\ncmcudHcKfHxjYXR0dC5jb20KLmNiYy5jYQp8fGNiYy5jYQouY2JzbmV3cy5jb20v\ndmlkZW8KLmNidGMub3JnLmhrCiEtLmNjYy5kZQohLXx8Y2NjLmRlCnx8Y2NjYXQu\nY2MKfHxjY2NhdC5jbwouY2NkdHIub3JnCnx8Y2NkdHIub3JnCi5jY2hlcmUuY29t\nCnx8Y2NoZXJlLmNvbQouY2NpbS5vcmcKLmNjbGlmZS5jYQpjY2xpZmUub3JnCmNj\nbGlmZWZsLm9yZwouY2N0aGVyZS5jb20KfHxjY3RoZXJlLmNvbQp8fGNjdGhlcmUu\nbmV0Ci5jY3Rtd2ViLm5ldAouY2N0b25nYmFvLmNvbS9hcnRpY2xlLzIwNzg3MzIK\nY2N1ZS5jYQpjY3VlLmNvbQouY2N2b2ljZS5jYQouY2N3Lm9yZy50dwouY2dkZXBv\ndC5vcmcKfGh0dHA6Ly9jZ2RlcG90Lm9yZwp8fGNkYm9vay5vcmcKLmNkY3BhcnR5\nLmNvbQouY2RlZi5vcmcKfHxjZGVmLm9yZwp8fGNkaWcuaW5mbwpjZGpwLm9yZwp8\nfGNkanAub3JnCi5jZG4tYXBwbGUuY29tCnx8Y2RuLWFwcGxlLmNvbQouY2RuZXdz\nLmNvbS50dwpjZHAxOTg5Lm9yZwpjZHAxOTk4Lm9yZwp8fGNkcDE5OTgub3JnCmNk\ncDIwMDYub3JnCnx8Y2RwMjAwNi5vcmcKLmNkcGEudXJsLnR3CmNkcGV1Lm9yZwpj\nZHB1c2Eub3JnCmNkcHdlYi5vcmcKfHxjZHB3ZWIub3JnCmNkcHd1Lm9yZwp8fGNk\ncHd1Lm9yZwp8fGNkdy5jb20KLmNlY2MuZ292Cnx8Y2VjYy5nb3YKfHxjZWxsdWxv\nLmluZm8KfHxjZW5ld3MuZXUKfHxjZW50ZXJmb3JodW1hbnJlcHJvZC5jb20KfHxj\nZW50cmFsbmF0aW9uLmNvbQouY2VudHVyeXMubmV0CnxodHRwOi8vY2VudHVyeXMu\nbmV0Ci5jZmhrcy5vcmcuaGsKLmNmb3MuZGUKLmNmdGZjLmNvbQouY2dzdC5lZHUK\nLmNoYW5nZS5vcmcKfHxjaGFuZ2Uub3JnCi5jaGFuZ3AuY29tCnx8Y2hhbmdwLmNv\nbQouY2hhbmdzYS5uZXQKfGh0dHA6Ly9jaGFuZ3NhLm5ldAouY2hhbm5lbDhuZXdz\nLnNnL25ld3M4Ci5jaGFwbTI1LmNvbQouY2hhdHVyYmF0ZS5jb20KLmNodWFuZy15\nZW4ub3JnCmNoZW5nbWluZ21hZy5jb20KLmNoZW5ndWFuZ2NoZW5nLmNvbQp8fGNo\nZW5ndWFuZ2NoZW5nLmNvbQouY2hlbnBva29uZy5jb20KLmNoZW5wb2tvbmcubmV0\nCnxodHRwOi8vY2hlbnBva29uZy5uZXQKfHxjaGVycnlzYXZlLmNvbQouY2hob25n\nYmkub3JnCmNoaWNhZ29uY210di5jb20KfGh0dHA6Ly9jaGljYWdvbmNtdHYuY29t\nCi5jaGluYS13ZWVrLmNvbQpjaGluYTEwMS5jb20KfHxjaGluYTEwMS5jb20KfHxj\naGluYTE4Lm9yZwp8fGNoaW5hMjEuY29tCmNoaW5hMjEub3JnCnx8Y2hpbmEyMS5v\ncmcKLmNoaW5hNTAwMC51cwpjaGluYWFmZmFpcnMub3JnCnx8Y2hpbmFhZmZhaXJz\nLm9yZwp8fGNoaW5hYWlkLm1lCmNoaW5hYWlkLnVzCmNoaW5hYWlkLm9yZwpjaGlu\nYWFpZC5uZXQKY2hpbmFjb21tZW50cy5vcmcKfHxjaGluYWNvbW1lbnRzLm9yZwou\nY2hpbmFjaGFuZ2Uub3JnCnx8Y2hpbmFjaGFuZ2Uub3JnCmNoaW5hY2hhbm5lbC5o\nawp8fGNoaW5hY2hhbm5lbC5oawouY2hpbmFjaXR5bmV3cy5iZQouY2hpbmFkaWFs\nb2d1ZS5uZXQKLmNoaW5hZGlnaXRhbHRpbWVzLm5ldAp8fGNoaW5hZGlnaXRhbHRp\nbWVzLm5ldAouY2hpbmFlbGVjdGlvbnMub3JnCnx8Y2hpbmFlbGVjdGlvbnMub3Jn\nCi5jaGluYWV3ZWVrbHkuY29tCnx8Y2hpbmFld2Vla2x5LmNvbQp8fGNoaW5hZnJl\nZXByZXNzLm9yZwouY2hpbmFnYXRlLmNvbQpjaGluYWdlZWtzLm9yZwpjaGluYWdm\ndy5vcmcKfHxjaGluYWdmdy5vcmcKLmNoaW5hZ29uZXQuY29tCi5jaGluYWdyZWVu\ncGFydHkub3JnCnx8Y2hpbmFncmVlbnBhcnR5Lm9yZwouY2hpbmFob3Jpem9uLm9y\nZwp8fGNoaW5haG9yaXpvbi5vcmcKLmNoaW5haHVzaC5jb20KLmNoaW5haW5wZXJz\ncGVjdGl2ZS5jb20KfHxjaGluYWludGVyaW1nb3Yub3JnCmNoaW5hbGFib3J3YXRj\naC5vcmcKY2hpbmFsYXd0cmFuc2xhdGUuY29tCi5jaGluYXBvc3QuY29tLnR3L3Rh\naXdhbi9uYXRpb25hbC9uYXRpb25hbC1uZXdzCmNoaW5heGNoaW5hLmNvbS9ob3d0\nbwpjaGluYWxhd2FuZHBvbGljeS5jb20KLmNoaW5hbXVsZS5jb20KfHxjaGluYW11\nbGUuY29tCmNoaW5hbXoub3JnCi5jaGluYW5ld3NjZW50ZXIuY29tCnxodHRwczov\nL2NoaW5hbmV3c2NlbnRlci5jb20KLmNoaW5hcHJlc3MuY29tLm15Cnx8Y2hpbmFw\ncmVzcy5jb20ubXkKLmNoaW5hLXJldmlldy5jb20udWEKfGh0dHA6Ly9jaGluYS1y\nZXZpZXcuY29tLnVhCi5jaGluYXJpZ2h0c2lhLm9yZwpjaGluYXNtaWxlLm5ldC9m\nb3J1bXMKY2hpbmFzb2NpYWxkZW1vY3JhdGljcGFydHkuY29tCnx8Y2hpbmFzb2Np\nYWxkZW1vY3JhdGljcGFydHkuY29tCmNoaW5hc291bC5vcmcKfHxjaGluYXNvdWwu\nb3JnCi5jaGluYXN1Y2tzLm5ldAp8fGNoaW5hdG9wc2V4LmNvbQouY2hpbmF0b3du\nLmNvbS5hdQpjaGluYXR3ZWVwcy5jb20KY2hpbmF3YXkub3JnCi5jaGluYXdvcmtl\nci5pbmZvCnx8Y2hpbmF3b3JrZXIuaW5mbwpjaGluYXlvdXRoLm9yZy5oawpjaGlu\nYXl1YW5taW4ub3JnCnx8Y2hpbmF5dWFubWluLm9yZwouY2hpbmVzZS1oZXJtaXQu\nbmV0CmNoaW5lc2UtbGVhZGVycy5vcmcKY2hpbmVzZS1tZW1vcmlhbC5vcmcKLmNo\naW5lc2VkYWlseS5jb20KfHxjaGluZXNlZGFpbHluZXdzLmNvbQouY2hpbmVzZWRl\nbW9jcmFjeS5jb20KfHxjaGluZXNlZGVtb2NyYWN5LmNvbQp8fGNoaW5lc2VnYXku\nb3JnCi5jaGluZXNlbi5kZQp8fGNoaW5lc2VuLmRlCi5jaGluZXNlbmV3cy5uZXQu\nYXUvCi5jaGluZXNlcGVuLm9yZwouY2hpbmVzZXRhbGtzLm5ldC9jaAp8fGNoaW5l\nc2V1cHJlc3MuY29tCi5jaGluZ2NoZW9uZy5jb20KfHxjaGluZ2NoZW9uZy5jb20K\nLmNoaW5tYW4ubmV0CnxodHRwOi8vY2hpbm1hbi5uZXQKY2hpdGh1Lm9yZwp8aHR0\ncDovL2Nobi5jaG9zdW4uY29tCmNubmV3cy5jaG9zdW4uY29tL2NsaWVudC9uZXdz\nL3Zpdy5hc3A/Y2F0ZT1DMDEmbWNhdGUKLmNocmRuZXQuY29tCnxodHRwOi8vY2hy\nZG5ldC5jb20KLmNocmlzdGlhbmZyZWVkb20ub3JnCnxodHRwOi8vY2hyaXN0aWFu\nZnJlZWRvbS5vcmcKY2hyaXN0aWFuc3R1ZHkuY29tCnx8Y2hyaXN0aWFuc3R1ZHku\nY29tCmNocmlzdHVzcmV4Lm9yZy93d3cxL3NkYwouY2h1Ym9sZC5jb20KY2h1YnVu\nLmNvbQpjaHVpemkubmV0CmNocmlzdGlhbnRpbWVzLm9yZy5oawouY2hybGF3eWVy\ncy5oawp8aHR0cDovL2Nocmxhd3llcnMuaGsKLmNodXJjaGluaG9uZ2tvbmcub3Jn\nL2I1L2luZGV4LnBocAp8aHR0cDovL2NodXJjaGluaG9uZ2tvbmcub3JnL2I1L2lu\nZGV4LnBocAouY2h1c2hpZ2FuZ2RydWcuY2gKLmNpZW5lbi5jb20KLmNpbmVhc3Rl\nbnRyZWZmLmRlCi5jaXBmZy5vcmcKfHxjaXJjbGV0aGViYXlmb3J0aWJldC5vcmcK\nfHxjaXJvc2FudGlsbGkuY29tCi5jaXRpemVuY24uY29tCnx8Y2l0aXplbmNuLmNv\nbQp8aHR0cDovL2NpdGl6ZW5sYWIub3JnCnxodHRwOi8vd3d3LmNpdGl6ZW5sYWIu\nb3JnCnx8Y2l0aXplbnNjb21taXNzaW9uLmhrCi5jaXRpemVubGFiLm9yZwpjaXRp\nemVuc3JhZGlvLm9yZwouY2l0eTM2NS5jYQp8aHR0cDovL2NpdHkzNjUuY2EKY2l0\neTl4LmNvbQp8fGNpdHlwb3B1bGF0aW9uLmRlCi5jaXR5dGFsay50dy9ldmVudAou\nY2l2aWNwYXJ0eS5oawp8fGNpdmljcGFydHkuaGsKLmNpdmlsZGlzb2JlZGllbmNl\nbW92ZW1lbnQub3JnCmNpdmlsaHJmcm9udC5vcmcKfHxjaXZpbGhyZnJvbnQub3Jn\nCi5jaXZpbGlhbmd1bm5lci5jb20KLmNpdmlsbWVkaWEudHcKfHxjaXZpbG1lZGlh\nLnR3CnBzaXBob24uY2l2aXNlYy5vcmcKfHx2cG4uY2piLm5ldAouY2sxMDEuY29t\nCnx8Y2sxMDEuY29tCi5jbGFyaW9ucHJvamVjdC5vcmcvbmV3cy9pc2xhbWljLXN0\nYXRlLWlzaXMtaXNpbC1wcm9wYWdhbmRhCnx8Y2xhc3NpY2FsZ3VpdGFyYmxvZy5u\nZXQKLmNsYi5vcmcuaGsKY2xlYXJoYXJtb255Lm5ldApjbGVhcndpc2RvbS5uZXQK\nY2xpbmljYS10aWJldC5ydQouY2xpcGZpc2guZGUKY2xvYWtwb2ludC5jb20KfHxj\nbHViMTA2OS5jb20KY21pLm9yZy50dwp8aHR0cDovL3d3dy5jbW9pbmMub3JnCmNt\ncC5oa3UuaGsKaGt1cG9wLmhrdS5oawp8fGNtdWxlLmNvbQp8fGNtdWxlLm9yZwp8\nfGNtcy5nb3YKfGh0dHA6Ly92cG4uY211LmVkdQp8aHR0cDovL3Zwbi5zdi5jbXUu\nZWR1Ci5jbjYuZXUKLmNuYS5jb20udHcKfHxjbmEuY29tLnR3Ci5jbmFiYy5jb20K\nLmNuZC5vcmcKfHxjbmQub3JnCmRvd25sb2FkLmNuZXQuY29tCi5jbmV4Lm9yZy5j\nbgouY25pbmV1LmNvbQp3aWtpLmNuaXR0ZXIuY29tCi5jbm4uY29tL3ZpZGVvCi5j\nbnBvbGl0aWNzLm9yZwp8fGNucG9saXRpY3Mub3JnCi5jbi1wcm94eS5jb20KfGh0\ndHA6Ly9jbi1wcm94eS5jb20KLmNucHJveHkuY29tCmJsb2cuY255ZXMuY29tCm5l\nd3MuY255ZXMuY29tCnx8Y29hdC5jby5qcAouY29jaGluYS5jbwp8fGNvY2hpbmEu\nY28KfHxjb2NoaW5hLm9yZwouY29kZTE5ODQuY29tLzY0CnxodHRwOi8vZ29hZ2Vu\ndC5jb2RlcGxleC5jb20KfHxjb2Rlc2hhcmUuaW8KfHxjb2Rlc2t1bHB0b3Iub3Jn\nCnxodHRwOi8vdG9zaC5jb21lZHljZW50cmFsLmNvbQpjb21lZnJvbWNoaW5hLmNv\nbQp8fGNvbWVmcm9tY2hpbmEuY29tCi5jb21pYy1tZWdhLm1lCmNvbW1hbmRhcm1z\nLmNvbQp8fGNvbW1lbnRzaGsuY29tCi5jb21tdW5pc3RjcmltZXMub3JnCnx8Y29t\nbXVuaXN0Y3JpbWVzLm9yZwp8fGNvbW11bml0eWNob2ljZWN1LmNvbQp8fGNvbXBp\nbGVoZWFydC5jb20KfHxjb25vaGEuanAKLmNvbnRhY3RtYWdhemluZS5uZXQKLmNv\nbnZpby5uZXQKLmNvb2JheS5jb20KfGh0dHA6Ly93d3cuY29vbDE4LmNvbS9iYnMq\nLwouY29vbGFsZXIuY29tCnx8Y29vbGFsZXIuY29tCmNvb2xkZXIuY29tCnx8Y29v\nbGRlci5jb20KfHxjb29sbG91ZC5vcmcudHcKLmNvb2xuY3V0ZS5jb20KfHxjb29s\nc3R1ZmZpbmMuY29tCmNvcnVtY29sbGVnZS5jb20KLmNvcy1tb2UuY29tCnxodHRw\nOi8vY29zLW1vZS5jb20KLmNvc3BsYXlqYXYucGwKfGh0dHA6Ly9jb3NwbGF5amF2\nLnBsCi5jb3R3ZWV0LmNvbQp8fGNvdHdlZXQuY29tCi5jb3Vyc2VoZXJvLmNvbQp8\nfGNvdXJzZWhlcm8uY29tCmNwai5vcmcKfHxjcGoub3JnCi5jcTk5LnVzCnxodHRw\nOi8vY3E5OS51cwpjcmFja2xlLmNvbQp8fGNyYWNrbGUuY29tCi5jcmF6eXMuY2MK\nLmNyYXp5c2hpdC5jb20KfHxjcmNoaW5hLm9yZwpjcmQtbmV0Lm9yZwpjcmVhZGVy\ncy5uZXQKfHxjcmVhZGVycy5uZXQKLmNyZWFkZXJzbmV0LmNvbQp8fGNyaXN0eWxp\nLmNvbQouY3JvY290dWJlLmNvbQp8aHR0cDovL2Nyb2NvdHViZS5jb20KLmNyb3Nz\ndGhld2FsbC5uZXQKfHxjcm9zc3RoZXdhbGwubmV0Ci5jcm9zc3Zwbi5uZXQKfHxj\ncm9zc3Zwbi5uZXQKfHxjcnVjaWFsLmNvbQpjc2RwYXJ0eS5jb20KfHxjc2RwYXJ0\neS5jb20KfHxjc3VjaGVuLmRlCi5jc3cub3JnLnVrCi5jdC5vcmcudHcKfHxjdC5v\ncmcudHcKLmN0YW8ub3JnCi5jdGZyaWVuZC5uZXQKLmN0aXR2LmNvbS50dwpjdHMu\nY29tLnR3CnxodHRwOi8vbGlicmFyeS51c2MuY3Voay5lZHUuaGsvCnxodHRwOi8v\nbWpsc2gudXNjLmN1aGsuZWR1LmhrLwouY3Voa2Fjcy5vcmcvfmJlbm5nCi5jdWlo\ndWEub3JnCnx8Y3VpaHVhLm9yZwouY3Vpd2VpcGluZy5uZXQKfHxjdWl3ZWlwaW5n\nLm5ldAp8fGN1bHR1cmUudHcKLmN1bWxvdWRlci5jb20KfHxjdW1sb3VkZXIuY29t\nCnx8Y3VydmVmaXNoLmNvbQouY3VzdS5oawp8fGN1c3UuaGsKLmN1dHNjZW5lcy5u\nZXQKLmN3LmNvbS50dwp8fGN3LmNvbS50dwp8aHR0cDovL2ZvcnVtLmN5YmVyY3Rt\nLmNvbQpjeWJlcmdob3N0dnBuLmNvbQp8fGN5YmVyZ2hvc3R2cG4uY29tCnx8Y3lu\nc2NyaWJlLmNvbQpjeXRvZGUudXMKfHxpZmFuLmN6LmNjCnx8bWlrZS5jei5jYwp8\nfG5pYy5jei5jYwoKIS0tLS0tLS0tLS0tLS0tLS0tLS0tREQtLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLS0tCi5kLWZ1a3l1LmNvbQp8aHR0cDovL2QtZnVreXUuY29tCmNs\nLmQwei5uZXQKLmQxMDAubmV0Cnx8ZDEwMC5uZXQKLmQyYmF5LmNvbQp8aHR0cDov\nL2QyYmF5LmNvbQouZGFici5jby51awp8fGRhYnIuY28udWsKZGFici5ldQpkYWJy\nLm1vYmkKfHxkYWJyLm1vYmkKfHxkYWJyLm1lCmRhZGF6aW0uY29tCnx8ZGFkYXpp\nbS5jb20KLmRhZGkzNjAuY29tCi5kYWZhYmV0LmNvbQpkYWZhZ29vZC5jb20KZGFm\nYWhhby5jb20KLmRhZm9oLm9yZwouZGFmdHBvcm4uY29tCi5kYWdlbGlqa3Nlc3Rh\nbmRhYXJkLm5sCi5kYWlkb3N0dXAucnUKfGh0dHA6Ly9kYWlkb3N0dXAucnUKLmRh\naWxpZGFpbGkuY29tCnx8ZGFpbGlkYWlsaS5jb20KLmRhaWx5bW90aW9uLmNvbQp8\nfGRhaWx5bW90aW9uLmNvbQpkYWlwaGFwaW5mby5uZXQKLmRhaml5dWFuLmNvbQp8\nfGRhaml5dWFuLmRlCmRhaml5dWFuLmV1CmRhbGFpbGFtYS5jb20KLmRhbGFpbGFt\nYS5tbgp8aHR0cDovL2RhbGFpbGFtYS5tbgouZGFsYWlsYW1hLnJ1Cnx8ZGFsYWls\nYW1hLnJ1CmRhbGFpbGFtYTgwLm9yZwouZGFsYWlsYW1hLWFyY2hpdmVzLm9yZwou\nZGFsYWlsYW1hY2VudGVyLm9yZwp8aHR0cDovL2RhbGFpbGFtYWNlbnRlci5vcmcK\nZGFsYWlsYW1hZmVsbG93cy5vcmcKLmRhbGFpbGFtYWZpbG0uY29tCi5kYWxhaWxh\nbWFmb3VuZGF0aW9uLm9yZwouZGFsYWlsYW1haGluZGkuY29tCi5kYWxhaWxhbWFp\nbmF1c3RyYWxpYS5vcmcKLmRhbGFpbGFtYWphcGFuZXNlLmNvbQouZGFsYWlsYW1h\ncHJvdGVzdGVycy5pbmZvCi5kYWxhaWxhbWFxdW90ZXMub3JnCi5kYWxhaWxhbWF0\ncnVzdC5vcmcKLmRhbGFpbGFtYXZpc2l0Lm9yZy5uegouZGFsYWlsYW1hd29ybGQu\nY29tCnx8ZGFsYWlsYW1hd29ybGQuY29tCmRhbGlhbm1lbmcub3JnCnx8ZGFsaWFu\nbWVuZy5vcmcKLmRhbGl1bGlhbi5vcmcKfHxkYWxpdWxpYW4ub3JnCi5kYW5rZTRj\naGluYS5uZXQKfHxkYW5rZTRjaGluYS5uZXQKLmRhbndlaS5vcmcKZGFvbGFuLm5l\ndAouZGFvemhvbmd4aW5nLm9yZwpkYXJrdG95Lm5ldAp8fGRhc3RyYXNzaS5vcmcK\nYmxvZy5kYXVtLm5ldC9fYmxvZwouZGF2aWQta2lsZ291ci5jb20KfGh0dHA6Ly9k\nYXZpZC1raWxnb3VyLmNvbQpkYXhhLmNuCnx8ZGF4YS5jbgpjbi5kYXlhYm9vay5j\nb20KLmRheWxpZmUuY29tL3RvcGljL2RhbGFpX2xhbWEKfHxkYi50dAouZGJjLmhr\nL21haW4KfHxkY2FyZC50dwpkY21pbGl0YXJ5LmNvbQouZGRjLmNvbS50dwouZGRo\ndy5pbmZvCnx8ZGUtc2NpLm9yZwouZGUtc2NpLm9yZwpwYWNrYWdlcy5kZWJpYW4u\nb3JnL3poLWNuL2xlbm55L2dwYXNzCnx8ZGVjb2RldC5jbwoKIS0tT3JpZ2luOmNk\nbi1pMzAkXwohLS1FeGNlcHRpb246IEhvbWVwYWdlIGFjY2VzcyB3aXRob3V0IHJz\ndAohLS1LZXl3b3JkIGlzICRfCi5kZWZpbmViYWJlLmNvbQoKfHxkZWxjYW1wLm5l\ndApkZWxpY2lvdXMuY29tL0dGV2Jvb2ttYXJrCi5kZW1vY3JhdHMub3JnCnx8ZGVt\nb2NyYXRzLm9yZwp8fGRlc2Muc2UKfHxkZXNzY2kuY29tCi5kZXN0cm95LWNoaW5h\nLmpwCnx8ZGV1dHNjaGUtd2VsbGUuZGUKIS0tfHxkZXZpYW50YXJ0LmNvbQohLS18\nfGRldmlhbnRhcnQubmV0Cnx8ZGV2aW8udXMKfHxkZXZwbi5jb20KfHxkZmFzLm1p\nbApkZm4ub3JnCmRoYXJtYWthcmEubmV0Ci5kaGFyYW1zYWxhbmV0LmNvbQouZGlh\nb3l1aXNsYW5kcy5vcmcKfHxkaWFveXVpc2xhbmRzLm9yZwouZGlmYW5nd2VuZ2Uu\nb3JnCnxodHRwOi8vZGlnaWxhbmQudHcvCnx8ZGlnaXRhbG5vbWFkc3Byb2plY3Qu\nb3JnCi5kaWlnby5jb20KfHxkaWlnby5jb20KfHxkaWxiZXIuc2UKfHxmdXJsLm5l\ndAouZGlwaXR5LmNvbQp8fGRpcmVjdGNyZWF0aXZlLmNvbQohLS18fGRpc2NvZ3Mu\nY29tCiEtLUBAfHxjZG4uZGlzY29ncy5jb20KLmRpc2N1c3MuY29tLmhrCnx8ZGlz\nY3Vzcy5jb20uaGsKLmRpc2N1c3M0dS5jb20KZGlzcC5jYwouZGlzcXVzLmNvbQp8\nfGRpc3F1cy5jb20KLmRpdC1pbmMudXMKfHxkaXQtaW5jLnVzCi5kaXpoaWRpemhp\nLmNvbQp8fGRpemh1emhpc2hhbmcuY29tCmRqYW5nb3NuaXBwZXRzLm9yZwouZGpv\ncnouY29tCnx8ZGpvcnouY29tCnx8ZGwtbGFieS5qcAp8fGRsc2l0ZS5jb20KfHxk\nbHlvdXR1YmUuY29tCnx8ZG1jZG4ubmV0Ci5kbnNjcnlwdC5vcmcKfHxkbnNjcnlw\ndC5vcmcKfHxkbnMyZ28uY29tCnx8ZG5zc2VjLm5ldApkb2N0b3J2b2ljZS5vcmcK\nCiEtLURvZ0ZhcnROZXR3b3JrCi5kb2dmYXJ0bmV0d29yay5jb20vdG91cgpnbG9y\neWhvbGUuY29tCgouZG9qaW4uY29tCi5kb2stZm9ydW0ubmV0Cnx8ZG9sYy5kZQp8\nfGRvbGYub3JnLmhrCnx8ZG9sbGYuY29tCi5kb21haW4uY2x1Yi50dwouZG9tYWlu\ndG9kYXkuY29tLmF1CmNoaW5lc2UuZG9uZ2EuY29tCmRvbmd0YWl3YW5nLmNvbQp8\nfGRvbmd0YWl3YW5nLmNvbQouZG9uZ3RhaXdhbmcubmV0Cnx8ZG9uZ3RhaXdhbmcu\nbmV0Ci5kb25neWFuZ2ppbmcuY29tCnxodHRwOi8vZGFuYm9vcnUuZG9ubWFpLnVz\nCi5kb250ZmlsdGVyLnVzCnx8ZG9udG1vdmV0b2NoaW5hLmNvbQouZG9yamVzaHVn\nZGVuLmNvbQouZG90cGxhbmUuY29tCnx8ZG90cGxhbmUuY29tCnx8ZG90c3ViLmNv\nbQouZG90dnBuLmNvbQp8fGRvdHZwbi5jb20KLmRvdWIuaW8KfHxkb3ViLmlvCnx8\nZG91Z3NjcmlwdHMuY29tCnx8ZG91aG9rYW5rby5uZXQKfHxkb3VqaW5jYWZlLmNv\nbQpkb3dlaS5vcmcKZHBoay5vcmcKZHBwLm9yZy50dwp8fGRwcC5vcmcudHcKfHxk\ncHIuaW5mbwp8fGRyYWdvbnNwcmluZ3Mub3JnCiEtLXx8ZHJhdy5pbwouZHJlYW1h\nbWF0ZXVycy5jb20KLmRyZXB1bmcub3JnCnx8ZHJnYW4ubmV0Ci5kcm1pbmd4aWEu\nb3JnCnxodHRwOi8vZHJtaW5neGlhLm9yZwp8fGRyb3Bib29rcy50dgp8fGRyb3Bi\nb3guY29tCnx8YXBpLmRyb3Bib3hhcGkuY29tCnx8bm90aWZ5LmRyb3Bib3hhcGku\nY29tCnx8ZHJvcGJveHVzZXJjb250ZW50LmNvbQpkcnN1bmFjYWRlbXkuY29tCi5k\ncnR1YmVyLmNvbQouZHNjbi5pbmZvCnxodHRwOi8vZHNjbi5pbmZvCi5kc3RrLmRr\nCnxodHRwOi8vZHN0ay5kawp8fGR0aWJsb2cuY29tCnx8ZHRpYy5taWwKLmR0d2Fu\nZy5vcmcKLmR1YW56aGlodS5jb20KLmR1Y2tkbnMub3JnCnxodHRwOi8vZHVja2Ru\ncy5vcmcKLmR1Y2tkdWNrZ28uY29tCnx8ZHVja2R1Y2tnby5jb20KLmR1Y2tsb2Fk\nLmNvbS9kb3dubG9hZAp8fGR1Y2tteWxpZmUuY29tCi5kdWdhLmpwCnxodHRwOi8v\nZHVnYS5qcAouZHVpaHVhLm9yZwp8fGR1aWh1YS5vcmcKfHxkdWlodWFocmpvdXJu\nYWwub3JnCi5kdW55YWJ1bHRlbmkubmV0Ci5kdW93ZWl0aW1lcy5jb20KfHxkdW93\nZWl0aW1lcy5jb20KZHVwaW5nLm5ldAp8fGR1cGxpY2F0aS5jb20KZHVwb2xhLmNv\nbQpkdXBvbGEubmV0Ci5kdXNoaS5jYQp8fGR2b3Jhay5vcmcKLmR3LmNvbQp8fGR3\nLmNvbQp8fGR3LmRlCi5kdy13b3JsZC5jb20KfHxkdy13b3JsZC5jb20KLmR3LXdv\ncmxkLmRlCnxodHRwOi8vZHctd29ybGQuZGUKd3d3LmR3aGVlbGVyLmNvbQpkd25l\nd3MuY29tCnx8ZHduZXdzLmNvbQpkd25ld3MubmV0Cnx8ZHduZXdzLm5ldAp4eXMu\nZHhpb25nLmNvbQp8fGR5bmF3ZWJpbmMuY29tCnx8ZHlzZnouY2MKLmR6emUuY29t\nCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1FRS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0KfHxlLWNsYXNzaWNhbC5jb20udHcKfHxlLWdvbGQuY29tCi5lLWdvbGQuY29t\nCi5lLWhlbnRhaS5vcmcKfHxlLWhlbnRhaS5vcmcKLmUtaGVudGFpZGIuY29tCnxo\ndHRwOi8vZS1oZW50YWlkYi5jb20KZS1pbmZvLm9yZy50dwouZS10cmFkZXJsYW5k\nLm5ldC9ib2FyZAouZS16b25lLmNvbS5oay9kaXNjdXoKfGh0dHA6Ly9lLXpvbmUu\nY29tLmhrL2Rpc2N1egouZTEyMy5oawp8fGUxMjMuaGsKLmVhcmx5dGliZXQuY29t\nCnxodHRwOi8vZWFybHl0aWJldC5jb20KLmVhcnRoY2FtLmNvbQouZWFydGh2cG4u\nY29tCnx8ZWFydGh2cG4uY29tCmVhc3Rlcm4tYXJrLmNvbQouZWFzdGVybmxpZ2h0\nbmluZy5vcmcKLmVhc3R0dXJrZXN0YW4uY29tCnxodHRwOi8vd3d3LmVhc3R0dXJr\naXN0YW4ubmV0LwouZWFzdHR1cmtpc3Rhbi1nb3Yub3JnCi5lYXN0dHVya2lzdGFu\nY2Mub3JnCi5lYXN0dHVya2lzdGFuZ292ZXJubWVudGluZXhpbGUudXMKfHxlYXN0\ndHVya2lzdGFuZ292ZXJubWVudGluZXhpbGUudXMKLmVhc3ljYS5jYQouZWFzeXBp\nYy5jb20KLmVib255LWJlYXV0eS5jb20KZWJvb2ticm93c2UuY29tCmVib29rZWUu\nY29tCnx8ZWNmYS5vcmcudHcKdXNodWFyZW5jaXR5LmVjaGFpbmhvc3QuY29tCnx8\nZWNpbWcudHcKZWNtaW5pc3RyeS5uZXQKLmVjb25vbWlzdC5jb20KYmJzLmVjc3Rh\ncnQuY29tCmVkZ2VjYXN0Y2RuLm5ldAp8fGVkZ2VjYXN0Y2RuLm5ldAovdHdpbWdc\nLmVkZ2VzdWl0ZVwubmV0XC9cLz9hcHBsZWRhaWx5LwplZGljeXBhZ2VzLmNvbQou\nZWRtb250b25jaGluYS5jbgouZWRtb250b25zZXJ2aWNlLmNvbQplZG9vcnMuY29t\nCi5lZHVicmlkZ2UuY29tCnx8ZWR1YnJpZGdlLmNvbQouZWR1cHJvLm9yZwp8fGVl\ndnBuLmNvbQplZmNjLm9yZy5oawouZWZ1a3QuY29tCnxodHRwOi8vZWZ1a3QuY29t\nCnx8ZWljLWF2LmNvbQp8fGVpcmVpbmlrb3RhZXJ1a2FpLmNvbQouZWlzYmIuY29t\nCi5la3Npc296bHVrLmNvbQp8fGVrc2lzb3psdWsuY29tCmVsZWN0aW9uc21ldGVy\nLmNvbQp8fGVsZ29vZy5pbQouZWxsYXdpbmUub3JnCi5lbHBhaXMuY29tCnx8ZWxw\nYWlzLmNvbQouZWx0b25kaXNuZXkuY29tCi5lbWFnYS5jb20vaW5mby8zNDA3CmVt\naWx5bGF1Lm9yZy5oawouZW1hbm5hLmNvbS9jaGluZXNlVHJhZGl0aW9uYWwKYml0\nYy5ibWUuZW1vcnkuZWR1L35semhvdS9ibG9ncwouZW1wZmlsLmNvbQouZW11bGUt\nZWQyay5jb20KfGh0dHA6Ly9lbXVsZS1lZDJrLmNvbQouZW11bGVmYW5zLmNvbQp8\naHR0cDovL2VtdWxlZmFucy5jb20KLmVtdXBhcmFkaXNlLm1lCi5lbmFueWFuZy5t\neQohLS0uZW5hbnlhbmcubXkvbmV3cy8yMDE3MDUwMi8lRTclQkUlOEUlRTUlOUIl\nQkQlRTQlQjklOEIlRTklOUYlQjMlRTUlQTQlQTclRTUlOUMlQjAlRTklOUMlODcl\nRTMlODAlOEElRTglOEIlQjklRTYlOUUlOUMlRTMlODAlOEIlRTclOEIlQUMlRTUl\nQUUlQjYKfHxlbmV3c3RyZWUuY29tCi5lbmZhbC5kZQpjaGluZXNlLmVuZ2FkZ2V0\nLmNvbQp8fGVuZ2FnZWRhaWx5Lm9yZwplbmdsaXNoZm9yZXZlcnlvbmUub3JnCnx8\nZW5nbGlzaGZyb21lbmdsYW5kLmNvLnVrCmVuZ2xpc2hwZW4ub3JnCi5lbmxpZ2h0\nZW4ub3JnLnR3Cnx8ZW50ZXJtYXAuY29tCi5lbnRudC5jb20KfGh0dHA6Ly9lbnRu\ndC5jb20KLmVwaXNjb3BhbGNodXJjaC5vcmcKLmVwb2NoaGsuY29tCnxodHRwOi8v\nZXBvY2hoay5jb20KZXBvY2h0aW1lcy1iZy5jb20KfHxlcG9jaHRpbWVzLWJnLmNv\nbQplcG9jaHRpbWVzLXJvbWFuaWEuY29tCnx8ZXBvY2h0aW1lcy1yb21hbmlhLmNv\nbQplcG9jaHRpbWVzLmNvLmlsCnx8ZXBvY2h0aW1lcy5jby5pbAplcG9jaHRpbWVz\nLmNvLmtyCnx8ZXBvY2h0aW1lcy5jby5rcgplcG9jaHRpbWVzLmNvbQp8fGVwb2No\ndGltZXMuY29tCi5lcG9jaHRpbWVzLmN6CmVwb2NodGltZXMuZGUKZXBvY2h0aW1l\ncy5mcgouZXBvY2h0aW1lcy5pZQouZXBvY2h0aW1lcy5pdAplcG9jaHRpbWVzLmpw\nCmVwb2NodGltZXMucnUKZXBvY2h0aW1lcy5zZQplcG9jaHRpbWVzdHIuY29tCi5l\ncG9jaHdlZWsuY29tCnx8ZXBvY2h3ZWVrLmNvbQp8fGVwb2Nod2Vla2x5LmNvbQou\nZXBvcm5lci5jb20KLmVxdWluZW5vdy5jb20KZXJhYmFydS5uZXQKLmVyYWNvbS5j\nb20udHcKLmVyYXlzb2Z0LmNvbS50cgouZXJlcHVibGlrLmNvbQouZXJpZ2h0cy5u\nZXQKfHxlcmlnaHRzLm5ldAouZXJrdHYuY29tCnxodHRwOi8vZXJrdHYuY29tCnx8\nZXJuZXN0bWFuZGVsLm9yZwp8fGVyb2RhaXplbnN5dS5jb20KfHxlcm9kb3VqaW5s\nb2cuY29tCnx8ZXJvZG91amlud29ybGQuY29tCnx8ZXJvbWFuZ2Eta2luZ2RvbS5j\nb20KfHxlcm9tYW5nYWRvdXppbi5jb20KLmVyb21vbi5uZXQKfGh0dHA6Ly9lcm9t\nb24ubmV0Ci5lcm9wcm9maWxlLmNvbQouZXJvdGljc2Fsb29uLm5ldAouZXNsaXRl\nLmNvbQp8fGVzbGl0ZS5jb20KIS0tLmVzbGl0ZS5jb20vcHJvZHVjdAohLS0uZXNs\naXRlLmNvbS9TZWFyY2hfQlcuYXNweD9xCndpa2kuZXN1LmltLyVFOCU5QiVBNCVF\nOCU5QiVBNCVFOCVBRiVBRCVFNSVCRCU5NQouZXRhYS5vcmcuYXUKLmV0YWR1bHQu\nY29tCmV0YWl3YW5uZXdzLmNvbQp8fGV0aXplci5vcmcKfHxldG9ra2kuY29tCiEt\nLS5ldHRvZGF5Lm5ldAouZXR0b2RheS5uZXQvbmV3cy8yMDE1MTIxNi82MTQwODEK\nZXR2b25saW5lLmhrCi5ldS5vcmcKfHxldS5vcmcKLmV1Y2FzaW5vLmNvbQouZXVs\nYW0uY29tCi5ldXJla2F2cHQuY29tCnx8ZXVyZWthdnB0LmNvbQouZXVyb25ld3Mu\nY29tCnx8ZXVyb25ld3MuY29tCmVlYXMuZXVyb3BhLmV1L2RlbGVnYXRpb25zL2No\naW5hL3ByZXNzX2Nvcm5lci9hbGxfbmV3cy9uZXdzLzIwMTUvMjAxNTA3MTZfemgK\nZWVhcy5ldXJvcGEuZXUvc3RhdGVtZW50cy1lZWFzLzIwMTUvMTUxMDIyCi5ldnNj\naG9vbC5uZXQKfGh0dHA6Ly9ldnNjaG9vbC5uZXQKfHxleGJsb2cuanAKfHxibG9n\nLmV4YmxvZy5jby5qcApAQHx8d3d3LmV4YmxvZy5qcAouZXhjaHJpc3RpYW4uaGsK\nfHxleGNocmlzdGlhbi5oawp8aHR0cDovL2Jsb2cuZXhjaXRlLmNvLmpwCnx8ZXht\nb3Jtb24ub3JnCnx8ZXhwYXRzaGllbGQuY29tCi5leHBlY3RoaW0uY29tCnx8ZXhw\nZWN0aGltLmNvbQpleHBlcnRzLXVuaXZlcnMuY29tCnx8ZXhwbG9hZGVyLm5ldAou\nZXhwcmVzc3Zwbi5jb20KfHxleHByZXNzdnBuLmNvbQouZXh0cmVtZXR1YmUuY29t\nCmV5ZXZpby5qcAp8fGV5ZXZpby5qcAouZXlueS5jb20KfHxleW55LmNvbQouZXpw\nYy50ay9jYXRlZ29yeS9zb2Z0Ci5lenBlZXIuY29tCgohLS0tLS0tLS0tLS0tLS0t\nLS0tLS1GRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxmYWNlYm9va3F1b3Rl\nczR1LmNvbQouZmFjZWxlc3MubWUKfHxmYWNlbGVzcy5tZQp8aHR0cDovL2ZhY2Vz\nb2Z0aWJldGFuc2VsZmltbW9sYXRvcnMuaW5mbwp8fGZhY2Vzb2ZueWZ3LmNvbQou\nZmFpdGgxMDAub3JnCnxodHRwOi8vZmFpdGgxMDAub3JnCgohLS1FbmhhbmNlbWVu\ndDoKIS0taHR0cDovL2ZhaXRoZnVsZXllLmNvbS5kZXRhaWwud2Vic2l0ZS8KIS0t\naHR0cDovL2ZhaXRoZnVsZXllLmNvbS5pcGFkZHJlc3MuY29tLwouZmFpdGhmdWxl\neWUuY29tCgp8fGZhaXRodGhlZG9nLmluZm8KLmZha2t1Lm5ldAouZmFsc2VmaXJl\nLmNvbQp8fGZhbHNlZmlyZS5jb20KZmFsdW4tY28ub3JnCmZhbHVuYXJ0Lm9yZwp8\nfGZhbHVuYXNpYS5pbmZvCnxodHRwOi8vZmFsdW5hdS5vcmcKLmZhbHVuYXoubmV0\nCmZhbHVuZGFmYS5vcmcKZmFsdW5kYWZhLWRjLm9yZwp8fGZhbHVuZGFmYS1mbG9y\naWRhLm9yZwp8fGZhbHVuZGFmYS1uYy5vcmcKfHxmYWx1bmRhZmEtcGEubmV0Cnx8\nZmFsdW5kYWZhLXNhY3JhbWVudG8ub3JnCmZhbHVuLW55Lm5ldAp8fGZhbHVuZGFm\nYWluZGlhLm9yZwpmYWx1bmRhZmFtdXNldW0ub3JnCi5mYWx1bmdvbmcuY2x1Ygou\nZmFsdW5nb25nLmRlCmZhbHVuZ29uZy5vcmcudWsKfHxmYWx1bmhyLm9yZwpmYWx1\nbmluZm8uZGUKZmFsdW5pbmZvLm5ldAouZmFsdW5waWxpcGluYXMubmV0Cnx8ZmFs\ndW53b3JsZC5uZXQKZmFtaWx5ZmVkLm9yZwouZmFuZ2VtaW5nLmNvbQp8fGZhbmds\naXpoaS5pbmZvCnx8ZmFuZ29uZy5vcmcKZmFuZ29uZ2hlaWtlLmNvbQouZmFucWlh\nbmcudGsKZmFucWlhbmdob3UuY29tCnx8ZmFucWlhbmdob3UuY29tCi5mYW5xaWFu\nZ3poZS5jb20KfHxmYW5xaWFuZ3poZS5jb20KZmFwZHUuY29tCmZhcHJveHkuY29t\nCiEtLS5mYXJ4aWFuLmNvbQouZmF3YW5naHVpaHVpLm9yZwpmYW5xaWFuZ3lha2V4\naS5uZXQKZmFpbC5oawp8fGZhbXVuaW9uLmNvbQouZmFuLXFpYW5nLmNvbQouZmFu\nZ2JpbnhpbmcuY29tCnx8ZmFuZ2JpbnhpbmcuY29tCmZhbmdlbWluZy5jb20KLmZh\nbmdtaW5jbi5vcmcKfHxmYW5nbWluY24ub3JnCi5mYW5oYW9kYW5nLmNvbQp8fGZh\nbnN3b25nLmNvbQouZmFueXVlLmluZm8KLmZhcndlc3RjaGluYS5jb20KCiEtLUZh\nc3RseQplbi5mYXZvdHRlci5uZXQKIS0tfHxybncuZ2xvYmFsLnNzbC5mYXN0bHku\nbmV0CiEtLXxodHRwczovLypnbG9iYWwuc3NsLmZhc3RseS5uZXQvCm55dGltZXMu\nbWFwLmZhc3RseS5uZXQKfHxueXRpbWVzLm1hcC5mYXN0bHkubmV0Cnx8ZmFzdC53\naXN0aWEuY29tCgp8fGZhc3Rzc2guY29tCnx8ZmFzdHN0b25lLm9yZwpmYXZzdGFy\nLmZtCnx8ZmF2c3Rhci5mbQpmYXlkYW8uY29tL3dlYmxvZwouZmMyLmNvbQouZmMy\nY2hpbmEuY29tCi5mYzJjbi5jb20KfHxmYzJjbi5jb20KZmMyYmxvZy5uZXQKfGh0\ndHA6Ly91eWd1ci5mYzJ3ZWIuY29tLwp2aWRlby5mZGJveC5jb20KLmZkYzY0LmRl\nCi5mZGM2NC5vcmcKLmZkYzg5LmpwCnx8Zm91cmZhY2Uubm9kZXNub29wLmNvbQoh\nLS1mZWVkYm9va3MubW9iaQp8fGZlZWxzc2guY29tCmZlZXIuY29tCi5mZWlmZWlz\ncy5jb20KfGh0dHA6Ly9mZWl0aWFuYWNhZGVteS5vcmcKLmZlaXRpYW4tY2FsaWZv\ncm5pYS5vcmcKfHxmZW1pbmlzdHRlYWNoZXIuY29tCi5mZW5nemhlbmdodS5jb20K\nfHxmZW5nemhlbmdodS5jb20KLmZlbmd6aGVuZ2h1Lm5ldAp8fGZlbmd6aGVuZ2h1\nLm5ldAouZmV2ZXJuZXQuY29tCnxodHRwOi8vZmYuaW0KZmZmZmYuYXQKZmZsaWNr\nLmNvbQouZmZ2cG4uY29tCmZnbXR2Lm5ldAouZmdtdHYub3JnCi5maHJlcG9ydHMu\nbmV0CnxodHRwOi8vZmhyZXBvcnRzLm5ldAouZmlncHJheWVyLmNvbQp8fGZpZ3By\nYXllci5jb20KLmZpbGVmbHllci5jb20KfHxmaWxlZmx5ZXIuY29tCnxodHRwOi8v\nZmVlZHMuZmlsZWZvcnVtLmNvbQouZmlsZXMybWUuY29tCi5maWxlc2VydmUuY29t\nL2ZpbGUKZmlsbHRoZXNxdWFyZS5vcmcKZmlsbWluZ2ZvcnRpYmV0Lm9yZwouZmls\ndGhkdW1wLmNvbQouZmluY2h2cG4uY29tCnx8ZmluY2h2cG4uY29tCiEtLWZpbmRi\nb29rLnR3CmZpbmRtZXNwb3QuY29tCnx8ZmluZHlvdXR1YmUuY29tCnx8ZmluZHlv\ndXR1YmUubmV0Ci5maW5nZXJkYWlseS5jb20KZmlubGVyLm5ldAouZmlyZWFybXN3\nb3JsZC5uZXQKfGh0dHA6Ly9maXJlYXJtc3dvcmxkLm5ldAouZmlyZW9mbGliZXJ0\neS5vcmcKfHxmaXJlb2ZsaWJlcnR5Lm9yZwouZmlyZXR3ZWV0LmlvCnx8ZmlyZXR3\nZWV0LmlvCiEtLXx8ZmxhZ2ZveC5uZXQKLmZsYWdzb25saW5lLml0CmZsZXNoYm90\nLmNvbQouZmxldXJzZGVzbGV0dHJlcy5jb20KfGh0dHA6Ly9mbGV1cnNkZXNsZXR0\ncmVzLmNvbQp8fGZsZ2cudXMKfHxmbGdqdXN0aWNlLm9yZwoKIS0tfHxmYXJtNi5z\ndGF0aWNmbGlja3IuY29tCiEtLS5mbGlja3IuY29tL3Bob3Rvcy80NjIzMTA3N0BO\nMDYKIS0tLmZsaWNrci5jb20vZ3JvdXBzL2Fpd2Vpd2VpCiEtLS5mbGlja3IuY29t\nL3Bob3Rvcy9kaWdpdGFsYm95MTAwCiEtLS5mbGlja3IuY29tL3Bob3Rvcy9memhl\nbmdodQohLS0uZmxpY2tyLmNvbS9waG90b3MvbG9uZWx5Zm94CiEtLWZsaWNrci5j\nb20vcGhvdG9zL3ZhbnZhbi81Mjk5MjUxNTcKIS0tLmZsaWNrci5jb20vcGhvdG9z\nL3dpbnRlcmthbmFsCiEtLS5mbGlja3IuY29tL3Bob3Rvcy96b2xhCnx8ZmxpY2ty\nLmNvbQp8fHN0YXRpY2ZsaWNrci5jb20KCmZsaWNrcmhpdmVtaW5kLm5ldAouZmxp\nY2tyaXZlci5jb20KLmZsaW5nLmNvbQp8fGZsaXBrYXJ0LmNvbQp8fGZsb2cudHcK\nLmZseXZwbi5jb20KfHxmbHl2cG4uY29tCnxodHRwOi8vY24uZm1ubm93LmNvbQpm\nb2ZsZGZyYWRpby5vcmcKYmxvZy5mb29sc21vdW50YWluLmNvbQouZm9ydW00aGsu\nY29tCmZhbmdvbmcuZm9ydW1zLWZyZWUuY29tCnBpb25lZXItd29ya2VyLmZvcnVt\ncy1mcmVlLmNvbQohLS1mb3Vyc3F1YXJlLmNvbQohLS18aHR0cDovLzRzcS5jb20K\nfGh0dHBzOi8vc3MqLjRzcWkubmV0CnZpZGVvLmZveGJ1c2luZXNzLmNvbQp8aHR0\ncDovL2ZveGdheS5jb20KfHxmcmluZ2VuZXR3b3JrLmNvbQp8fGZsZWNoZWludGhl\ncGVjaGUuZnIKLmZvY2hrLm9yZwp8aHR0cDovL2ZvY2hrLm9yZwp8fGZvY3VzdGFp\nd2FuLnR3Ci5mb2N1c3Zwbi5jb20KfHxmb2ZnLm9yZwouZm9mZy1ldXJvcGUubmV0\nCi5mb29vb28uY29tCnx8Zm9vb29vLmNvbQpmb290d2liYWxsLmNvbQouZm90aWxl\nLm1lCnx8Zm91cnRoaW50ZXJuYXRpb25hbC5vcmcKfHxmb3hkaWUudXMKfHxmb3hz\ndWIuY29tCmZveHRhbmcuY29tCi5mcG10Lm9yZwp8aHR0cDovL2ZwbXQub3JnCi5m\ncG10LnR3Ci5mcG10LW9zZWwub3JnCnx8ZnBtdG1leGljby5vcmcKZnFvay5vcmcK\nfHxmcXJvdXRlci5jb20KfHxmcmFua2xjLmNvbQouZnJlYWtzaGFyZS5jb20KfGh0\ndHA6Ly9mcmVha3NoYXJlLmNvbQp8fGZyZWU0dS5jb20uYXIKZnJlZS1nYXRlLm9y\nZwouZnJlZS1oYWRhLW5vdy5vcmcKZnJlZS1wcm94eS5jegouZnJlZS5mci9hZHNs\nCmtpbmVveC5mcmVlLmZyCnRpYmV0bGlicmUuZnJlZS5mcgp8fGZyZWVhbGltLmNv\nbQp3aGl0ZWJlYXIuZnJlZWJlYXJibG9nLm9yZwp8fGZyZWVicm93c2VyLm9yZwou\nZnJlZWNoYWwuY29tCi5mcmVlZG9tY2hpbmEuaW5mbwp8fGZyZWVkb21jaGluYS5p\nbmZvCi5mcmVlZG9taG91c2Uub3JnCnx8ZnJlZWRvbWhvdXNlLm9yZwouZnJlZWRv\nbXNoZXJhbGQub3JnCnx8ZnJlZWRvbXNoZXJhbGQub3JnCi5mcmVlZnEuY29tCi5m\ncmVlZnVja3ZpZHMuY29tCi5mcmVlZ2FvLmNvbQp8fGZyZWVnYW8uY29tCmZyZWVp\nbGhhbXRvaHRpLm9yZwouZnJlZWt3b25weW9uZy5vcmcKfHxzYXZlbGl1eGlhb2Jv\nLmNvbQouZnJlZWxvdHRvLmNvbQp8fGZyZWVsb3R0by5jb20KZnJlZW1hbjIuY29t\nCi5mcmVlb3BlbnZwbi5jb20KZnJlZW1vcmVuLmNvbQpmcmVlbW9yZW5ld3MuY29t\nCmZyZWVtdXNlLm9yZy9hcmNoaXZlcy83ODkKZnJlZW5ldC1jaGluYS5vcmcKZnJl\nZW5ld3Njbi5jb20KY24uZnJlZW9uZXMuY29tCi5mcmVlb3oub3JnL2Jicwp8fGZy\nZWVvei5vcmcKfHxmcmVlc3NoLnVzCmZyZWU0dS5jb20uYXIKLmZyZWUtc3NoLmNv\nbQp8fGZyZWUtc3NoLmNvbQouZnJlZWNoaW5hLm5ld3MvCnx8ZnJlZWNoaW5hZm9y\ndW0ub3JnCnx8ZnJlZWNoaW5hd2VpYm8uY29tCi5mcmVlZG9tY29sbGVjdGlvbi5v\ncmcvaW50ZXJ2aWV3cy9yZWJpeWFfa2FkZWVyCi5mcmVlZm9ydW1zLm9yZwp8fGZy\nZWVuZXRwcm9qZWN0Lm9yZwouZnJlZW96Lm9yZwouZnJlZXRpYmV0Lm5ldAp8fGZy\nZWV0aWJldC5vcmcKLmZyZWV0aWJldGFuaGVyb2VzLm9yZwp8aHR0cDovL2ZyZWV0\naWJldGFuaGVyb2VzLm9yZwouZnJlZXZpZXdtb3ZpZXMuY29tCi5mcmVldnBuLm1l\nCnxodHRwOi8vZnJlZXZwbi5tZQp8fGZyZWV3YWxscGFwZXI0Lm1lCi5mcmVld2Vi\ncy5jb20KLmZyZWV3ZWNoYXQuY29tCnx8ZnJlZXdlY2hhdC5jb20KZnJlZXdlaWJv\nLmNvbQp8fGZyZWV3ZWliby5jb20KLmZyZWV4aW53ZW4uY29tCi5mcmVleW91dHVi\nZXByb3h5Lm5ldAp8fGZyZWV5b3V0dWJlcHJveHkubmV0CmZyaWVuZGZlZWQuY29t\nCmZyaWVuZGZlZWQtbWVkaWEuY29tL2U5OWE0ZWJlMmZiNGMxOTg1YzJhNTg3NzVl\nYjQ0MjI5NjFhYTVhMmUKZnJpZW5kcy1vZi10aWJldC5vcmcKLmZyaWVuZHNvZnRp\nYmV0Lm9yZwpmcmVlY2hpbmEubmV0CnxodHRwOi8vd3d3LnplbnN1ci5mcmVlcmsu\nY29tLwpmcmVldnBuLm5sCmZyZWV5ZWxsb3cuY29tCmhrLmZyaWVuZGR5LmNvbS9o\nawp8aHR0cDovL2FkdWx0LmZyaWVuZGZpbmRlci5jb20vCi5mcmluZy5jb20KfHxm\ncmluZy5jb20KLmZyb21jaGluYXRvdXNhLm5ldAp8fGZyb21tZWwubmV0Ci5mcm9u\ndGxpbmVkZWZlbmRlcnMub3JnCi5mcm9vdHZwbi5jb20KfHxmcm9vdHZwbi5jb20K\nfHxmc2NrZWQub3JnCi5mc3VyZi5jb20KLmZ0di5jb20udHcKZnVjZC5jb20KLmZ1\nY2tjbm5pYy5uZXQKfHxmdWNrY25uaWMubmV0CmZ1Y2tnZncub3JnCi5mdWxpb25l\nLmNvbQp8aHR0cHM6Ly9mdWxpb25lLmNvbQp8fGZ1bGxlcmNvbnNpZGVyYXRpb24u\nY29tCmZ1bHVlLmNvbQouZnVuZi50dwpmdW5wLmNvbQouZnVxLmNvbQouZnVyaGhk\nbC5vcmcKfHxmdXJpbmthbi5jb20KLmZ1dHVyZWNoaW5hZm9ydW0ub3JnCnx8ZnV0\ndXJlbWVzc2FnZS5vcmcKLmZ1eC5jb20KLmZ1eWluLm5ldAouZnV5aW5kaWFudGFp\nLm9yZwouZnV5dS5vcmcudHcKfHxmdy5jbQouZnhjbS1jaGluZXNlLmNvbQp8fGZ4\nY20tY2hpbmVzZS5jb20KZnpoOTk5LmNvbQpmemg5OTkubmV0CmZ6bG0uY29tCgoh\nLS0tLS0tLS0tLS0tLS0tLS0tLS1HRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K\nLmc2aGVudGFpLmNvbQp8aHR0cDovL2c2aGVudGFpLmNvbQp8fGctcXVlZW4uY29t\nCnx8Z2Fib2NvcnAuY29tCi5nYWVwcm94eS5jb20KLmdhZm9ydW0ub3JnCi5nYWxh\neHltYWNhdS5jb20KfHxnYWxlbnd1LmNvbQouZ2Fsc3RhcnMubmV0Cnx8Z2FtZTcz\nNS5jb20KZ2FtZWJhc2UuY29tLnR3CmdhbWVqb2x0LmNvbQp8aHR0cDovL3dpa2ku\nZ2FtZXJwLmpwCnx8Z2FtZXIuY29tLnR3Ci5nYW1lci5jb20udHcKLmdhbWV6LmNv\nbS50dwp8fGdhbWV6LmNvbS50dwouZ2Ftb3VzYS5jb20KLmdhb21pbmcubmV0Cnx8\nZ2FvbWluZy5uZXQKZ2FuZ2VzLmNvbQouZ2FvcGkubmV0CnxodHRwOi8vZ2FvcGku\nbmV0Ci5nYW96aGlzaGVuZy5vcmcKLmdhb3poaXNoZW5nLm5ldApnYXJkZW5uZXR3\nb3Jrcy5jb20KfHxnYXJkZW5uZXR3b3Jrcy5vcmcKIS0tSVAgb2YgR2FyZGVuIE5l\ndHdvcmsKNzIuNTIuODEuMjIKfHxnYXJ0bGl2ZS5jb20KfHxnYXRlLXByb2plY3Qu\nY29tCnx8Z2F0aGVyLmNvbQouZ2F0aGVycHJveHkuY29tCmdhdGkub3JnLnR3Ci5n\nYXlidWJibGUuY29tCi5nYXljbi5uZXQKLmdheWh1Yi5jb20KfHxnYXltYXAuY2MK\nLmdheW1lbnJpbmcuY29tCi5nYXl0dWJlLmNvbQohLS18fGdheXR1YmUuY29tCnx8\naW1hZ2VzLWdheXR1YmUuY29tCi5nYXl3YXRjaC5jb20KfGh0dHA6Ly9nYXl3YXRj\naC5jb20KLmdhem90dWJlLmNvbQp8fGdhem90dWJlLmNvbQp8fGdjYy5vcmcuaGsK\nfHxnY2xvb25leS5jb20KfHxnY21hc2lhLmNvbQouZ2NwbmV3cy5jb20KfGh0dHA6\nLy9nY3BuZXdzLmNvbQouZ2RidC5uZXQvZm9ydW0KZ2R6Zi5vcmcKfHxnZWVrLWFy\ndC5uZXQKZ2Vla2VyaG9tZS5jb20vMjAxMC8wMy94aXhpYW5nLXByb2plY3QtY3Jv\nc3MtZ2Z3Cnx8Z2Vla2hlYXJ0LmluZm8KLmdla2lrYW1lLmNvbQp8aHR0cDovL2dl\na2lrYW1lLmNvbQouZ2VsYm9vcnUuY29tCnxodHRwOi8vZ2VsYm9vcnUuY29tCiEt\nLXx8Z2VudWl0ZWMuY29tCi5nZW9jaXRpZXMuY28uanAKLmdlb2NpdGllcy5jb20v\nU2lsaWNvblZhbGxleS9DaXJjdWl0LzU2ODMvZG93bmxvYWQuaHRtbApoay5nZW9j\naXRpZXMuY29tCmdlb2NpdGllcy5qcAouZ2VyZWZvdW5kYXRpb24ub3JnCnx8Z2V0\nYXN0cmlsbC5jb20KLmdldGNodS5jb20KLmdldGNsb2FrLmNvbQp8fGdldGNsb2Fr\nLmNvbQp8fGdldGZveHlwcm94eS5vcmcKLmdldGZyZWVkdXIuY29tCnx8Z2V0Z29t\nLmNvbQouZ2V0aTJwLm5ldAp8fGdldGkycC5uZXQKLmdldGxhbnRlcm4ub3JnCnx8\nZ2V0bGFudGVybi5vcmcKLmdldGpldHNvLmNvbS9mb3J1bQpnZXRpdG9uLmNvbQou\nZ2V0c29jaWFsc2NvcGUuY29tCnx8Z2V0c3luYy5jb20KZ2Zidi5kZQouZ2Znb2xk\nLmNvbS5oawouZ2ZzYWxlLmNvbQp8fGdmc2FsZS5jb20KZ2Z3Lm9yZy51YQouZ2Z3\nLnByZXNzCnx8Z2Z3LnByZXNzCi5nZ3NzbC5jb20KfHxnZ3NzbC5jb20KIS0tfHxn\naG9zdC5vcmcKLmdob3N0cGF0aC5jb20KfHxnaG9zdHBhdGguY29tCnx8Z2h1dC5v\ncmcKLmdpYW50ZXNzbmlnaHQuY29tCnxodHRwOi8vZ2lhbnRlc3NuaWdodC5jb20K\nLmdpZnJlZS5jb20KfHxnaWdhLXdlYi5qcAp0dy5naWdhY2lyY2xlLmNvbQp8aHR0\ncDovL2NuLmdpZ2FuZXdzLmNvbS8KZ2lncG9ybm8ucnUKfHxnaXJsYmFua2VyLmNv\nbQouZ2l0LmlvCnx8Z2l0LmlvCnxodHRwOi8vc29mdHdhcmVkb3dubG9hZC5naXRi\nb29rcy5pbwoKIS0tLUdpdEh1Yi0tLQpnaXRodWIuY29tL2dldGxhbnRlcm4KfGh0\ndHBzOi8vZ2lzdC5naXRodWIuY29tCmh0dHA6Ly9jdGhsby5naXRodWIuaW8vaGt0\ndgpoYWhheGl4aS5naXRodWIuaW8KfGh0dHBzOi8vaGFoYXhpeGkuZ2l0aHViLmlv\nCnx8aGFvZWwuZ2l0aHViLmlvCiEtLXxodHRwOi8vb25pb25oYWNrZXIuZ2l0aHVi\nLmlvCnx8cmczLmdpdGh1Yi5pbwp8fHNpa2FvemhlMTk5Ny5naXRodWIuaW8KfHxz\nb2RhdGVhLmdpdGh1Yi5pbwp8fHRlcm1pbnVzMjA0OS5naXRodWIuaW8KfHx0b3V0\neXJhdGVyLmdpdGh1Yi5pbwp3c2d6YW8uZ2l0aHViLmlvCnxodHRwczovL3dzZ3ph\nby5naXRodWIuaW8KIS0tLmdpdGh1Yi5pbwoKLmdpemxlbi5uZXQKfHxnaXpsZW4u\nbmV0Ci5namN6ei5jb20KfHxnamN6ei5jb20KZ2xvYmFsamloYWQubmV0Cmdsb2Jh\nbG1lZGlhb3V0cmVhY2guY29tCmdsb2JhbG11c2V1bW9uY29tbXVuaXNtLm9yZwp8\nfGdsb2JhbHJlc2N1ZS5uZXQKLmdsb2JhbHRtLm9yZwouZ2xvYmFsdm9pY2Vzb25s\naW5lLm9yZwp8fGdsb2JhbHZvaWNlc29ubGluZS5vcmcKfHxnbG9iYWx2cG4ubmV0\nCi5nbG9jay5jb20KZ2x1Y2ttYW4uY29tL0RhbGFpTGFtYQpnbWJkLmNuCnx8Z21o\nei5vcmcKfGh0dHA6Ly93d3cuZ21pZGRsZS5jb20KfGh0dHA6Ly93d3cuZ21pZGRs\nZS5uZXQKLmdtbGwub3JnCnx8Z25jaS5vcmcuaGsKZ28tcGtpLmNvbQp8fGdvYWdl\nbnQuYml6Cnx8Z29hZ2VudHBsdXMuY29tCmdvYmV0LmNjCmdvZGZvb3RzdGVwcy5v\ncmcKfHxnb2Rmb290c3RlcHMub3JnCmdvZG5zLndvcmsKZ29kc2RpcmVjdGNvbnRh\nY3QuY28udWsKLmdvZHNkaXJlY3Rjb250YWN0Lm9yZwpnb2RzZGlyZWN0Y29udGFj\ndC5vcmcudHcKLmdvZHNpbW1lZGlhdGVjb250YWN0LmNvbQouZ29nb3R1bm5lbC5j\nb20KfHxnb2hhcHB5LmNvbS50dwouZ29rYmF5cmFrLmNvbQouZ29sZGJldC5jb20K\nfHxnb2xkYmV0c3BvcnRzLmNvbQp8fGdvbGRlbmV5ZXZhdWx0LmNvbQouZ29sZGVu\nZnJvZy5jb20KfHxnb2xkZW5mcm9nLmNvbQouZ29sZGppenouY29tCnxodHRwOi8v\nZ29sZGppenouY29tCi5nb2xkc3RlcC5uZXQKfHxnb2xkd2F2ZS5jb20KZ29uZ21l\nbmcuaW5mbwpnb25nbS5pbgpnb25nbWlubGlsaWFuZy5jb20KLmdvbmd3dC5jb20K\nfGh0dHA6Ly9nb25nd3QuY29tCmJsb2cuZ29vLm5lLmpwL2R1Y2stdGFpbF8yMDA5\nCi5nb29kYXkueHl6CnxodHRwOi8vZ29vZGF5Lnh5egouZ29vZHJlYWRzLmNvbQp8\nfGdvb2RyZWFkcy5jb20KLmdvb2RyZWFkZXJzLmNvbQp8fGdvb2RyZWFkZXJzLmNv\nbQouZ29vZHR2LmNvbS50dwouZ29vZHR2LnR2Cnx8Z29vZmluZC5jb20KLmdvb2ds\nZXNpbGUuY29tCi5nb3BldGl0aW9uLmNvbQp8fGdvcGV0aXRpb24uY29tCi5nb3By\nb3hpbmcubmV0Ci5nb3RydXN0ZWQuY29tCnx8Z290cnVzdGVkLmNvbQp8fGdvdHcu\nY2EKfHxncmFtbWFseS5jb20KZ3JhbmR0cmlhbC5vcmcKLmdyYXBoaXMubmUuanAK\nfHxncmFwaGlzLm5lLmpwCnx8Z3JhcGhxbC5vcmcKIS0tfHxzLmdyYXZhdGFyLmNv\nbQpncmVhdGZpcmV3YWxsLmJpegp8fGdyZWF0ZmlyZXdhbGxvZmNoaW5hLm5ldAou\nZ3JlYXRmaXJld2FsbG9mY2hpbmEub3JnCnx8Z3JlYXRmaXJld2FsbG9mY2hpbmEu\nb3JnCnx8Z3JlZW5maWVsZGJvb2tzdG9yZS5jb20uaGsKLmdyZWVucGFydHkub3Jn\nLnR3Cnx8Z3JlZW5wZWFjZS5vcmcKLmdyZWVucmVhZGluZ3MuY29tL2ZvcnVtCmdy\nZWF0LWZpcmV3YWxsLmNvbQpncmVhdC1yb2Mub3JnCmdyZWF0cm9jLm9yZwpncmVh\ndHpob25naHVhLm9yZwouZ3JlZW5wZWFjZS5jb20udHcKLmdyZWVudnBuLm5ldAp8\nfGdyZWVudnBuLm5ldAouZ3JlZW52cG4ub3JnCnx8Z3JvdHR5LW1vbmRheS5jb20K\nZ3MtZGlzY3Vzcy5jb20KfHxndHJpY2tzLmNvbQpndWFuY2hhLm9yZwpndWFuZXJ5\ndS5jb20KLmd1YXJkc3Rlci5jb20KLmd1bi13b3JsZC5uZXQKZ3Vuc2FuZGFtbW8u\nY29tCnx8Z3V0dGVydW5jZW5zb3JlZC5jb20KfHxndm0uY29tLnR3Ci5nem0udHYK\nfHxnem9uZS1hbmltZS5pbmZvCgohLS0tLS0tLS0tLS0tLUdIUy0tLS0tCiEtfHxm\nZWVkcy5jYnNuZXdzLmNvbQohLXx8d3d3LmNoaW5lc2VhbGJ1bWFydC5jb20KfHxj\nbGVtZW50aW5lLXBsYXllci5vcmcKIS18fGNsZW1lc2hhLm9yZwohLXx8d3d3LmNs\nb3VkZ2lybGZyaWVuZC5jb20KIS18fGNvY29hd2l0aGxvdmUuY29tCiEtfHxibG9n\nLmNvbnRyb2xzcGFjZS5vcmcKIS1ECiEtfHx3d3cuZGFpbHlneWFuLmNvbQohLXx8\nZGFpbHl0b2RvLm9yZwohLXx8YmxvZy5kYW5tYXJuZXIuY29tCiEtfHxnaXRodWIu\nZGFubWFybmVyLmNvbQohLXx8ZGVzaWduLXNlZWRzLmNvbQohLXx8ZGVzaWduZXJz\nLWFydGlzdHMuY29tCiEtfHxtYWlsLmRpeWFuZy5vcmcKIS18fGJsb2cuZG91Z2hl\nbGxtYW5uLmNvbQohLXx8ZG93bmZvcmV2ZXJ5b25lb3JqdXN0bWUuY29tCiEtfHxk\ncm9pZHNlY3VyaXR5LmNvbQohLXx8d3d3LmRyb3Btb2Nrcy5jb20KIS18fGR1bWJs\naXR0bGVtYW4uY29tCiEtRQplY2hvZm9uLmNvbQohLXx8ZWNob2Zvbi5jb20KIS18\nfGVwYy1qYXYuY29tCiEtfHxldmVyZGFyay5pbmZvCiEtfHxldmhlYWQuY29tCiEt\nRgohLXx8ZmFjaWxlbG9naW4uY29tCiEtfHwqLmZhdGR1Y2sub3JnCiEtfHxibG9n\nLmZkY24ub3JnCiEtfHxmZnRvZ28uY29tCiEtfHxmbGlnaHRzaW10YWxrLmNvbQoh\nLXx8bWNsZWUuZm9vbG1lLm5ldAohLXx8d3d3LmZyaWVuZGRlY2suY29tCiEtfHxm\ncmluZ2VzcG9pbGVycy5jb20KIS18fGZyaW5nZXRlbGV2aXNpb24uY29tCiEtfHxm\ndW5wZWEuY29tCiEtRwohLXx8YmxvZy5nYXRlaW4ub3JnCiEtfHxmZWVkcy5nYXdr\nZXIuY29tCiEtfHxnZWVrdGFuZy5jb20KIS18fGdlb2hvdC51cwohLXx8Z2V0YXJv\ndW5kLmNvbQohLXx8Z21lci5uZXQKIS18fHd3dy5nbW90ZS5vcmcKIS18fGJsb2cu\nZ28yd2ViMjAubmV0CiEtfHxnb29nbGUtbWVsYW5nZS5jb20KIS18fGZhbWUuZ29u\nem9sYWJzLm9yZwohLXx8Z292ZWNuLm9yZwohLXx8Z3F1ZXVlcy5jb20KIS18fGdy\nYXBoeWNhbGMuY29tCnx8Z3JlYXNlc3BvdC5uZXQKIS18fGJsb2cuZ3Jvd2xmb3J3\naW5kb3dzLmNvbQohLUgKIS18fGhjbS5jb20udHcKIS18fGJsb2cuaGVhZGl1cy5j\nb20KIS18fGhvZ2JheXNvZnR3YXJlLmNvbQohLXx8YmxvZy5ob3RvdC5vcmcKIS18\nfGZlZWRzLmhvd3N0dWZmd29ya3MuY29tCiEtfHxodWhhaXRhaS5jb20KIS18fGJs\nb2cuaHVtYW5yaWdodHNmaXJzdC5vcmcKIS1JCiEtfHxzaXRlLmljdS1wcm9qZWN0\nLm9yZwohLXx8aWdvcndhcmUuY29tCiEtfHxpaGFzMTMzN2NvZGUuY29tCiEtfHxp\nbmtub3V2ZWF1LmNvbQohLXx8aW5vdGUudHcKIS18fGlyb25oZWxtZXQuY29tCiEt\nfHxpd2Z3Y2YuY29tCiEtSgohLXx8YmxvZy5qYW5nbXQuY29tCiEtfHxibG9nLmph\neWZpZWxkcy5jb20KIS18fGJsb2cuam9pbnQubmV0CiEtfHxibG9nLmpzcXVhcmVk\namF2YXNjcmlwdC5jb20KIS18fGJsb2cuanRid29ybGQuY29tCiEtSwohLXx8a2F0\naHlzY2h3YWxiZS5jb20KIS18fHRvbWF0b3Zwbi5rZWl0aG1veWVyLmNvbQohLXx8\nd3d3LmtlaXRobW95ZXIuY29tCiEtfHxrZW5kYWx2YW5keWtlLmNvbQohLXx8Ymxv\nZy5rZW5nYW8udHcKIS18fGxvZy5rZXNvLmNuCiEtfHx3d3cua2hhbmFjYWRlbXku\nb3JnCnx8d3d3LmtsaXAubWUKIS18fHVzYmxvYWRlcmd4LmtvdXJlaW8ubmV0CiEt\nfHxibG9nLmtvd2FsY3p5ay5pbmZvCiEtTAohLXx8bGFieXJpbnRoMi5jb20KIS18\nfGxhcnNnZW9yZ2UuY29tCiEtfHxibG9nLmxhc3RwYXNzLmNvbQohLXx8ZG9jcy5s\nYXRleGxhYi5vcmcKIS18fGxlYW5lc3NheXMuY29tCiEtfHxibG9nLmxpZGFvYmlu\nZy5pbmZvCiEtfHxsb2cubGlnaHRvcnkubmV0CiEtfHxmZWVkcy5saW1pLm5ldAoh\nLXx8d3d3LmxpdGVhcHBsaWNhdGlvbnMuY29tCiEtfHxibG9nLmxpdWthbmd4dS5p\nbmZvCiEtfHx0d2l0dGVyLmxpdWthbmd4dS5pbmZvCiEtfHxvYXNpc25ld3Nyb29t\nLmxpdmU0ZXZlci51cwohLXx8d3d3LmxvY2tlcmdub21lLmNvbQohLXx8bG9jcWwu\nY29tCkBAfHxzaXRlLmxvY3FsLmNvbQohLXx8ZmVlZHMubG9pY2xlbWV1ci5jb20K\nIS18fGJsb2cubG91aXNncmF5LmNvbQohLU0KIS18fG1hZGVieXNvZmEuY29tCiEt\nfHxtYWRlbW9pc2VsbGVyb2JvdC5jb20KIS18fG1hc2FtaXhlcy5jb20KIS18fHd3\ndy5tZXRhbXVzZS5uZXQKIS18fGJsb2cubWV0YXNwbG9pdC5jb20KIS18fG1pbGF6\naS5jb20KIS18fHd3dy5taW5pd2VhdGhlci5jb20KIS18fHR3aXR0ZXIubWlzc2l1\nLmNvbQohLXx8cGx1cmt0b3AtYnV0dG9uLm1tZGF5cy5jb20KIS18fGZlZWRzLm1v\nYmlsZXJlYWQuY29tCiEtfHx3d3cubW9kZXJuaXpyLmNvbQohLXx8d3d3Lm1vZGsu\naXQKIS18fG15dHdpc2hpcnQuY29tCiEtTgohLXx8YmxvZy5uZXRmbGl4LmNvbQoh\nLXx8YmxvZy5uaWhpbG9naWMuZGsKIS18fG50bGsub3JnCiEtfHxudnF1YW4ub3Jn\nCiEtfHxub2dvb2RhdGNvZGluZy5jb20KIS18fGJsb2cubm90ZG90Lm5ldAohLXx8\nd3d3Lm5vdGlmeS5pbwohLU8KIS18fGJsb2cub2J2aW91cy5jb20KIS18fG9uZWJp\nZ2ZsdWtlLmNvbQohLXx8b3ZlcnN0aW11bGF0ZS5jb20KIS1QCiEtfHxwY2dlZWti\nbG9nLmNvbQohLXx8ZmVlZHMucGRmY2htLm5ldAohLXx8ZmVlZHMucGVvcGxlLmNv\nbQohLXx8YmxvZy5wZXJzaXN0ZW50LmluZm8KIS18fGNocm9tZS5wbGFudHN2c3pv\nbWJpZXMuY29tCiEtfHxwb3J0YWJsZXNvZnQub3JnLnJ1CiEtfHxwcmFzYW5uYXRl\nY2gubmV0CiEtfHx0YWxrLm5ld3MucHRzLm9yZy50dwohLXx8cHl0aG9uLWV4Y2Vs\nLm9yZwohLVEKIS1SCiEtfHxyLWNoYXJ0LmNvbQohLXx8cmFtZXNoc3VicmFtYW5p\nYW4ub3JnCiEtfHxyYXBpZC5wawohLXx8YmxvZy5yZW5hbnNlLmNvbQohLXx8cm9i\nZXJ0bWFvLmNvbQohLXx8d3d3LnJvbWVvLWZveHRyb3QuY29tCiEtUwohLXx8c2Fs\nbWl5dWNrLmNvbQohLXx8c2Ftc2FsLmNvbQohLXx8YmxvZy5zZWVtaW5nbGVlLmNv\nbQohLXx8YmxvZy5zZmxvdy5jb20KIS18fGJsb2cuc2lnZnBlLmNvbQohLXx8c2lt\ncGxldGV4dC53cwohLXx8d3d3LnNrdWxwdC5vcmcKIS18fHJzcy5zbGFzaGRvdC5v\ncmcKIS18fHNuaXBwZXRzYXBwLmNvbQohLXx8dy5zbnMubHkKIS18fHd3dy5zb2Np\nYWxubW9iaWxlLmNvbQohLXx8d3d3LnNvY2lhbHdob2lzLmNvbQohLXx8c3Bpcml0\namIub3JnCiEtfHxzc2Jvb2suY29tCiEtfHxzc2hmb3J3YXJkaW5nLmNvbQohLXx8\nc3RhdGlvbmVyaWEuY29tCnx8c3RlcGhhbmllcmVkLmNvbQohLXx8c3Vuamlkb25n\nLm5ldAohLXx8c3luaXVtc29mdHdhcmUuY29tCkBAfHxkb3dubG9hZC5zeW5pdW1z\nb2Z0d2FyZS5jb20KIS1UCiEtfHx0YWd4ZWRvLmNvbQohLXx8YmxvZy50YXRvZWJh\nLm9yZwohLXx8d3d3LnRlY2hmb2IuY29tCiEtfHx0ZWFjaHBhcmVudHN0ZWNoLm9y\nZwohLXx8dGhlOHBlbi5jb20KIS18fHRoZWlwaG9uZXdpa2kuY29tCiEtfHxibG9n\nLnRoZXNpbGVudG51bWJlci5tZQohLXx8dGhlc3BvbnR5LmNvbQohLXx8dGhldWx0\ncmFsaW54LmNvbQohLXx8YmxvZy50aGluay1hc3luYy5jb20KIS18fHRvcm5hZG93\nZWIub3JnCiEtfHx0cmFuc3BhcmVudHVwdGltZS5jb20KIS18fHRyaWFuZ3VsYXRp\nb25ibG9nLmNvbQohLXx8YmxvZy50c3VuYW5ldC5uZXQKIS18fGVuLnR1eGVyby5j\nb20KIS18fHR3YXp6dXAuY29tCiEtfHx0d2VldHN3ZWxsLmNvbQohLXx8dHdpYmVz\nLmNvbQohLXx8YXJ0LnR3Z2cub3JnCiEtfHx0d2l2ZXJ0LmNvbQohLVUKfGh0dHA6\nLy91YjAuY2MKIS18fGpvbm55LnVidW50dS10dy5uZXQKIS18fGJsb2cudW1vbmtl\neS5uZXQKIS1WCiEtfHx0cC52YmFwLmNvbS5hdQohLXx8d3d3LnZpcnR1b3Vzcm9t\nLmNvbQohLXx8YmxvZy52aXNpYm90ZWNoLmNvbQohLVcKIS18fHdhdmVwcm90b2Nv\nbC5vcmcKIS18fHd3dy53YXZlc2FuZGJveC5jb20KIS18fHdlYmZlZS5vcmcucnUK\nIS18fGJsb2cud2VibXByb2plY3Qub3JnCiEtfHx3ZWJ1cGQ4Lm9yZwohLXx8d3d3\nLndoYXRicm93c2VyLm9yZwohLXx8d3d3LndoZXJlZG95b3Vnby5uZXQKIS18fHdp\nbGxoYWlucy5jb20KIS18fGZlZWRzLndpcmVkLmNvbQohLXx8d2lzZW1hcHBpbmcu\nb3JnCndvenkuaW4KIS18fHdvenkuaW4vCiEtfHxibG9nLnd1bmRlcmNvdW50ZXIu\nY29tCiEtWAohLXx8eGRlbHRhLm9yZwohLXx8eGlhb2dhb3ppLm9yZwohLXx8eGls\nb3UudXMKIS18fHh6eS5vcmcucnUKIS1ZCiEtfHx5b29wZXIuYmUKIS18fHRzb25n\nLnl1bnhpLm5ldAohLVoKCmdvc3BlbGhlcmFsZC5jb20KfHxnb3NwZWxoZXJhbGQu\nY29tCnxodHRwOi8vaGsuZ3JhZGNvbm5lY3Rpb24uY29tLwp8fGdyYW5nb3J6Lm9y\nZwpncmVhdGZpcmUub3JnCnx8Z3JlYXRmaXJlLm9yZwpncmVhdGZpcmV3YWxsb2Zj\naGluYS5vcmcKfHxncmVhdHJvYy50dwouZ3RzLXZwbi5jb20KfGh0dHA6Ly9ndHMt\ndnBuLmNvbQouZ3UtY2h1LXN1bS5vcmcKfGh0dHA6Ly9ndS1jaHUtc3VtLm9yZwou\nZ3VhZ3Vhc3MuY29tCnxodHRwOi8vZ3VhZ3Vhc3MuY29tCi5ndWFndWFzcy5vcmcK\nfGh0dHA6Ly9ndWFndWFzcy5vcmcKLmd1YW5nbWluZy5jb20ubXkKZ3Vpc2hhbi5v\ncmcKfHxndWlzaGFuLm9yZwouZ3Vtcm9hZC5jb20KfHxndW1yb2FkLmNvbQp8fGd1\nbnNhbWVyaWNhLmNvbQpndXJ1b25saW5lLmhrCnxodHRwOi8vZ3ZsaWIuY29tCi5n\neWFsd2FyaW5wb2NoZS5jb20KLmd5YXRzb3N0dWRpby5jb20KCiEtLS0tLS0tLS0t\nLS0tLS0tLS0tLUhILS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQouaDUyOC5jb20K\nLmg1ZG0uY29tCi5oNWdhbGdhbWUubWUKfHxoLWNoaW5hLm9yZwouaC1tb2UuY29t\nCnxodHRwOi8vaC1tb2UuY29tCmgxbjFjaGluYS5vcmcKLmhhY2cuY2x1Ygp8fGhh\nY2cuY2x1YgouaGFjZy5pbgp8aHR0cDovL2hhY2cuaW4KLmhhY2cubGkKfGh0dHA6\nLy9oYWNnLmxpCi5oYWNnLm1lCnxodHRwOi8vaGFjZy5tZQouaGFjZy5yZWQKfGh0\ndHA6Ly9oYWNnLnJlZAouaGFja2VuLmNjL2JicwouaGFja2VyLm9yZwp8fGhhY2t0\naGF0cGhvbmUubmV0CmhhaGxvLmNvbQp8fGhha2thdHYub3JnLnR3Ci5oYW5kY3Jh\nZnRlZHNvZnR3YXJlLm9yZwp8aHR0cDovL2Jicy5oYW5taW56dS5vcmcvCi5oYW51\nbnlpLmNvbQouaGFvLm5ld3MvbmV3cwp8aHR0cDovL2FlLmhhbzEyMy5jb20KfGh0\ndHA6Ly9hci5oYW8xMjMuY29tCnxodHRwOi8vYnIuaGFvMTIzLmNvbQp8aHR0cDov\nL2VuLmhhbzEyMy5jb20KfGh0dHA6Ly9pZC5oYW8xMjMuY29tCnxodHRwOi8vanAu\naGFvMTIzLmNvbQp8aHR0cDovL21hLmhhbzEyMy5jb20KfGh0dHA6Ly9teC5oYW8x\nMjMuY29tCnxodHRwOi8vc2EuaGFvMTIzLmNvbQp8aHR0cDovL3RoLmhhbzEyMy5j\nb20KfGh0dHA6Ly90dy5oYW8xMjMuY29tCnxodHRwOi8vdm4uaGFvMTIzLmNvbQp8\naHR0cDovL2hrLmhhbzEyM2ltZy5jb20KfGh0dHA6Ly9sZC5oYW8xMjNpbWcuY29t\nCnx8aGFwcHktdnBuLmNvbQouaGFwcm94eS5vcmcKfHxoYXJkc2V4dHViZS5jb20K\nLmhhcnVueWFoeWEuY29tCnxodHRwOi8vaGFydW55YWh5YS5jb20KYmJzLmhhc2ku\nd2FuZwpoYXZlOC5jb20KQEB8fGhheWdvLmNvbQouaGNsaXBzLmNvbQp8fGhkbHQu\nbWUKfHxoZHR2Yi5uZXQKLmhkem9nLmNvbQp8aHR0cDovL2hkem9nLmNvbQp8fGhl\nYXJ0eWl0LmNvbQouaGVhdnktci5jb20KLmhlYy5zdQp8aHR0cDovL2hlYy5zdQou\naGVjYWl0b3UubmV0Cnx8aGVjYWl0b3UubmV0Ci5oZWNoYWppLmNvbQp8fGhlY2hh\namkuY29tCnx8aGVlYWN0LmVkdS50dwouaGVncmUtYXJ0LmNvbQp8aHR0cDovL2hl\nZ3JlLWFydC5jb20KfHxjZG4uaGVsaXhzdHVkaW9zLm5ldAp8fGhlbHBsaW5mZW4u\nY29tCnx8aGVsbG9hbmRyb2lkLmNvbQp8fGhlbGxvcXVlZXIuY29tCi5oZWxsb3Nz\nLnB3CmhlbGxvdHh0LmNvbQp8fGhlbGxvdHh0LmNvbQouaGVudGFpLnRvCi5oZWxs\nb3VrLm9yZy9mb3J1bS9sb2ZpdmVyc2lvbgouaGVscGVhY2hwZW9wbGUuY29tCnx8\naGVscGVhY2hwZW9wbGUuY29tCnx8aGVscHN0ZXIuZGUKLmhlbHB6aHVsaW5nLm9y\nZwpoZW50YWl0dWJlLnR2Ci5oZW50YWl2aWRlb3dvcmxkLmNvbQoKISMjIyMjIyMj\nIyMjLS1IZXJva3UtLSMjIyMjIyMjIyMKIS0tfHxnZXRjbG91ZGFwcC5jb20KIS0t\nfHxjbC5seQohLS1AQHx8Zi5jbC5seQohLS1FQzIgRE5TIFBvaXNvbmVkCnx8aWQu\naGVyb2t1LmNvbQoKaGVxaW5nbGlhbi5uZXQKfHxoZXVuZ2tvbmdkaXNjdXNzLmNv\nbQouaGV4aWVzaGUuY29tCnx8aGV4aWVzaGUuY29tCnx8aGV4aWVzaGUueHl6CiEt\nLUdvb2dsZSBlbXBsb3llZSB3aXRoaW4gR29vZ2xlIElQCnx8aGV4eGVoLm5ldAph\ncHAuaGV5d2lyZS5jb20KLmhleXpvLmNvbQouaGdzZWF2LmNvbQouaGhkY2Izb2Zm\naWNlLm9yZwouaGh0aGVzYWt5YXRyaXppbi5vcmcKaGktb24ub3JnLnR3CmhpZGRl\nbi1hZHZlbnQub3JnCnx8aGlkZGVuLWFkdmVudC5vcmcKaGlkZWNsb3VkLmNvbS9i\nbG9nLzIwMDgvMDcvMjkvZnVjay1iZWlqaW5nLW9seW1waWNzLmh0bWwKfHxoaWRl\nLm1lCi5oaWRlaW4ubmV0Ci5oaWRlaXB2cG4uY29tCnx8aGlkZWlwdnBuLmNvbQou\naGlkZW1hbi5uZXQKfHxoaWRlbWFuLm5ldApoaWRlbWUubmwKfHxoaWRlbXkubmFt\nZQouaGlkZW15YXNzLmNvbQp8fGhpZGVteWFzcy5jb20KaGlkZW15Y29tcC5jb20K\nfHxoaWRlbXljb21wLmNvbQouaGloaWZvcnVtLmNvbQouaGloaXN0b3J5Lm5ldAp8\nfGhpaGlzdG9yeS5uZXQKLmhpZ2Z3LmNvbQpoaWdocGVha3NwdXJlZWFydGguY29t\nCnx8aGlnaHJvY2ttZWRpYS5jb20KfHxoaWl0Y2guY29tCnx8aGlraW5nZ2Z3Lm9y\nZwouaGlsaXZlLnR2Ci5oaW1hbGF5YW4tZm91bmRhdGlvbi5vcmcKaGltYWxheWFu\nZ2xhY2llci5jb20KLmhpbWVtaXguY29tCnx8aGltZW1peC5jb20KLmhpbWVtaXgu\nbmV0CnRpbWVzLmhpbmV0Lm5ldAouaGl0b21pLmxhCnxodHRwOi8vaGl0b21pLmxh\nCi5oaXdpZmkuY29tCkBAfHxoaXdpZmkuY29tCmhpemJ1dHRhaHJpci5vcmcKaGl6\nYi11dC10YWhyaXIuaW5mbwpoaXpiLXV0LXRhaHJpci5vcmcKLmhqY2x1Yi5pbmZv\nCi5oay1wdWIuY29tL2ZvcnVtCnxodHRwOi8vaGstcHViLmNvbQouaGswMS5jb20K\nfHxoazAxLmNvbQouaGszMjE2OC5jb20KfHxoazMyMTY4LmNvbQp8fGhrYWNnLmNv\nbQp8fGhrYWNnLm5ldAouaGthdHZuZXdzLmNvbQpoa2JjLm5ldAouaGtiZi5vcmcK\nLmhrYm9va2NpdHkuY29tCnx8aGtib29rY2l0eS5jb20KLmhrY2h1cmNoLm9yZwpo\na2NpLm9yZy5oawouaGtjbWkuZWR1Cnx8aGtjbmV3cy5jb20KfHxoa2NvYy5jb20K\naGtkYXkubmV0Ci5oa2RhaWx5bmV3cy5jb20uaGsvY2hpbmEucGhwCmhrZGYub3Jn\nCi5oa2VqLmNvbQouaGtlcGMuY29tL2ZvcnVtL3ZpZXd0aHJlYWQucGhwP3RpZD0x\nMTUzMzIyCmNoaW5hLmhrZXQuY29tCnx8aGtmYWEuY29tCmhrZnJlZXpvbmUuY29t\nCmhrZnJvbnQub3JnCm0uaGtnYWxkZW4uY29tCnxodHRwczovL20uaGtnYWxkZW4u\nY29tCi5oa2dyZWVucmFkaW8ub3JnL2hvbWUKLmhraGVhZGxpbmUuY29tKmJsb2cK\nLmhraGVhZGxpbmUuY29tL2luc3RhbnRuZXdzCmhraGtoay5jb20KaGtocmMub3Jn\nLmhrCmhraHJtLm9yZy5oawp8fGhraXAub3JnLnVrCjE5ODlyZXBvcnQuaGtqYS5v\ncmcuaGsKaGtqYy5jb20KLmhranAub3JnCi5oa2xmdC5jb20KLmhrbHRzLm9yZy5o\nawp8fGhrbHRzLm9yZy5oawpuZXdzLmhrcGVhbnV0LmNvbQpoa3B0dS5vcmcKLmhr\ncmVwb3J0ZXIuY29tCnx8aGtyZXBvcnRlci5jb20KfGh0dHA6Ly9oa3Vwb3AuaGt1\nLmhrLwouaGt1c3UubmV0Cnx8aGt1c3UubmV0Ci5oa3Z3ZXQuY29tCi5oa3djYy5v\ncmcuaGsKfHxoa3pvbmUub3JnCi5obW9uZ2hvdC5jb20KfGh0dHA6Ly9obW9uZ2hv\ndC5jb20KLmhtdi5jby5qcC8KaG5qaGouY29tCnx8aG5qaGouY29tCi5obm50dWJl\nLmNvbQp8fGhvbGEuY29tCnx8aG9sYS5vcmcKaG9seW1vdW50YWluY24uY29tCmhv\nbHlzcGlyaXRzcGVha3Mub3JnCnx8aG9seXNwaXJpdHNwZWFrcy5vcmcKfHxkZXJl\na2hzdS5ob21laXAubmV0Ci5ob21lcGVydmVyc2lvbi5jb20KfGh0dHA6Ly9ob21l\nc2VydmVyc2hvdy5jb20KfGh0dHA6Ly9vbGQuaG9uZXluZXQub3JnL3NjYW5zL3Nj\nYW4zMS9zdWIvZG91Z19lcmljL3NwYW1fdHJhbnNsYXRpb24uaHRtbAouaG9uZ2tv\nbmdmcC5jb20KfHxob25na29uZ2ZwLmNvbQpob25nbWVpbWVpLmNvbQp8fGhvbmd6\naGkubGkKLmhvb3RzdWl0ZS5jb20KfHxob290c3VpdGUuY29tCi5ob3BlZGlhbG9n\ndWUub3JnCnxodHRwOi8vaG9wZWRpYWxvZ3VlLm9yZwouaG9wdG8ub3JnCi5ob3Ju\neWdhbWVyLmNvbQouaG9ybnl0cmlwLmNvbQp8aHR0cDovL2hvcm55dHJpcC5jb20K\nLmhvdGF2LnR2Ci5ob3RlbHMuY24KaG90ZnJvZy5jb20udHcKaG90Z29vLmNvbQou\naG90cG9ybnNob3cuY29tCmhvdHBvdC5oawouaG90c2hhbWUuY29tCnx8aG90c3Bv\ndHNoaWVsZC5jb20KLmhvdHZwbi5jb20KfHxob3R2cG4uY29tCnx8aG91Z2FpZ2Uu\nY29tCnx8aG93dG9mb3JnZS5jb20KfHxob3h4LmNvbQouaHFjZHAub3JnCnx8aHFj\nZHAub3JnCnx8aHFqYXBhbmVzZXNleC5jb20KaHFtb3ZpZXMuY29tCi5ocmNpci5j\nb20KLmhyY2NoaW5hLm9yZwouaHJlYS5vcmcKLmhyaWNoaW5hLm9yZwp8fGhyaWNo\naW5hLm9yZwouaHJ0c2VhLmNvbQouaHJ3Lm9yZwp8fGhydy5vcmcKaHJ3ZWIub3Jn\nCnx8aHNqcC5uZXQKfHxoc3NlbGl0ZS5jb20KfGh0dHA6Ly9oc3QubmV0LnR3Ci5o\nc3Rlcm4ubmV0Ci5oc3R0Lm5ldAouaHRrb3UubmV0Cnx8aHRrb3UubmV0Ci5odWEt\neXVlLm5ldAouaHVhZ2xhZC5jb20KfHxodWFnbGFkLmNvbQouaHVhbmdodWFnYW5n\nLm9yZwp8fGh1YW5naHVhZ2FuZy5vcmcKLmh1YW5neWl5dS5jb20KLmh1YXJlbi51\ncwp8fGh1YXJlbi51cwouaHVhcmVuNHVzLmNvbQouaHVhc2hhbmduZXdzLmNvbQp8\naHR0cDovL2h1YXNoYW5nbmV3cy5jb20KYmJzLmh1YXNpbmcub3JnCmh1YXhpYS1u\nZXdzLmNvbQpodWF4aWFiYW8ub3JnCmh1YXhpbi5waAp8fGh1YXl1d29ybGQub3Jn\nCi5odWZmaW5ndG9ucG9zdC5jb20vcmViaXlhLWthZGVlcgp8fGh1Z29yb3kuZXUK\nfHxodWhhaXRhaS5jb20KfHxodWhhbWhpcmUuY29tCmh1aXlpLmluCi5odWxrc2hh\ncmUuY29tCmh1bWFucmlnaHRzYnJpZWZpbmcub3JnCnx8aHVuZy15YS5jb20KfHxo\ndW5nZXJzdHJpa2Vmb3JhaWRzLm9yZwp8fGh1cGluZy5uZXQKaHVyZ29rYmF5cmFr\nLmNvbQouaHVycml5ZXQuY29tLnRyCi5odXQyLnJ1Cnx8aHV0aWFueWkubmV0Cmh1\ndG9uZzkubmV0Cmh1eWFuZGV4LmNvbQouaHdhZHphbi50dwp8fGh3YXl1ZS5vcmcu\ndHcKfHxod2luZm8uY29tCnx8aHh3ay5vcmcKaHh3cS5vcmcKfHxoeXBlcnJhdGUu\nY29tCmVib29rLmh5cmVhZC5jb20udHcKfHxlYm9vay5oeXJlYWQuY29tLnR3Cgoh\nLS0tLS0tLS0tLS0tLS0tLS0tLS1JSS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K\nfHxpMS5oawp8fGkycDIuZGUKfHxpMnJ1bm5lci5jb20KfHxpODE4aGsuY29tCi5p\nLWNhYmxlLmNvbQouaS1wYXJ0LmNvbS50dwouaWFtdG9wb25lLmNvbQppYXNrLmNh\nCnx8aWFzay5jYQppYXNrLmJ6Cnx8aWFzay5iegouaWF2MTkuY29tCmliaWJsaW8u\nb3JnL3B1Yi9wYWNrYWdlcy9jY2ljCi5pYmxpc3QuY29tCnx8aWJsb2dzZXJ2LWYu\nbmV0Cmlicm9zLm9yZwp8aHR0cDovL2NuLmlidGltZXMuY29tCi5pYnZwbi5jb20K\nfHxpYnZwbi5jb20KaWNhbXMuY29tCmJsb2dzLmljZXJvY2tldC5jb20vdGFnCi5p\nY2lqLm9yZwp8fGljaWoub3JnCnx8aWNsLWZpLm9yZwouaWNvY28uY29tCnx8aWNv\nY28uY29tCgohLS0zOC4xMDMuMTY1LjUwCnx8ZnVyYm8ub3JnCiEtLXx8aWNvbmZh\nY3RvcnkuY29tCnx8d2FyYmxlci5pY29uZmFjdG9yeS5uZXQKCnx8aWNvbnBhcGVy\nLm9yZwohLS0gR29vZ2xlIFBhZ2VzCnx8aWN1LXByb2plY3Qub3JnCncuaWRhaXdh\nbi5jb20vZm9ydW0KfHxpZGRkZGcuY29tCmlkZW1vY3JhY3kuYXNpYQouaWRlbnRp\nLmNhCnx8aWRlbnRpLmNhCnx8aWRpb21jb25uZWN0aW9uLmNvbQp8aHR0cDovL3d3\ndy5pZGxjb3lvdGUuY29tCi5pZG91Z2EuY29tCi5pZHJlYW14LmNvbQpmb3J1bS5p\nZHNhbS5jb20KLmlkdi50dwouaWVhc3k1LmNvbQp8aHR0cDovL2llYXN5NS5jb20K\nLmllZDJrLm5ldAouaWVuZXJneTEuY29tCnxodHRwOi8vaWYudHR0LwppZmFucWlh\nbmcuY29tCi5pZmNzcy5vcmcKfHxpZmNzcy5vcmcKaWZqYy5vcmcKLmlmdC50dAp8\naHR0cDovL2lmdC50dAp8fGlmcmVld2FyZXMuY29tCnx8aWdjZC5uZXQKLmlnZncu\nbmV0Cnx8aWdmdy5uZXQKLmlnZncudGVjaAp8fGlnZncudGVjaAouaWdtZy5kZQp8\nfGlnbml0ZWRldHJvaXQubmV0Ci5pZ290bWFpbC5jb20udHcKfHxpZ3ZpdGEuY29t\nCnx8aWhha2thLm5ldAouaWhhby5vcmcvZHo1Cnx8aWljbnMuY29tCi5pa3N0YXIu\nY29tCnx8aWxsdXNpb25mYWN0b3J5LmNvbQp8fGlsb3ZlODAuYmUKfHxpbS50dgpA\nQHx8bXl2bG9nLmltLnR2Cnx8aW04OC50dwouaW1nY2hpbGkubmV0CnxodHRwOi8v\naW1nY2hpbGkubmV0Ci5pbWFnZWFiLmNvbQouaW1hZ2VmYXAuY29tCnx8aW1hZ2Vm\nYXAuY29tCnx8aW1hZ2VmbGVhLmNvbQppbWFnZXNoYWNrLnVzCnx8aW1hZ2V2ZW51\nZS5jb20KfHxpbWFnZXppbGxhLm5ldAouaW1iLm9yZwp8aHR0cDovL2ltYi5vcmcK\nCiEtLUlNREIKfGh0dHA6Ly93d3cuaW1kYi5jb20vbmFtZS9ubTA0ODI3MzAKLmlt\nZGIuY29tL3RpdGxlL3R0MDgxOTM1NAouaW1kYi5jb20vdGl0bGUvdHQxNTQwMDY4\nCi5pbWRiLmNvbS90aXRsZS90dDQ5MDg2NDQKCi5pbWcubHkKfHxpbWcubHkKLmlt\nZ3VyLmNvbQp8fGltZ3VyLmNvbQouaW1rZXYuY29tCnx8aW1rZXYuY29tCi5pbWxp\ndmUuY29tCi5pbW1vcmFsLmpwCmltcGFjdC5vcmcuYXUKaW1wcC5tbgp8aHR0cDov\nL3RlY2gyLmluLmNvbS92aWRlby8KaW45OS5vcmcKaW4tZGlzZ3Vpc2UuY29tCi5p\nbmNhcGRucy5uZXQKLmluY2xvYWsuY29tCnx8aW5jbG9hay5jb20KfHxpbmNyZWRp\nYm94LmZyCnx8aW5kaWFuZGVmZW5zZW5ld3MuaW4KdGltZXNvZmluZGlhLmluZGlh\ndGltZXMuY29tL2RhbGFpCnRpbWVzb2ZpbmRpYS5pbmRpYXRpbWVzLmNvbS9kZWZh\ndWx0aW50ZXJzdGl0aWFsLmNtcwouaW5kaWVtZXJjaC5jb20KfHxpbmRpZW1lcmNo\nLmNvbQppbmZvLWdyYWYuZnIKd2Vic2l0ZS5pbmZvcm1lci5jb20KLmluaXRpYXRp\ndmVzZm9yY2hpbmEub3JnCi5pbmt1aS5jb20KLmlubWVkaWFoay5uZXQKfHxpbm1l\nZGlhaGsubmV0Cnx8aW5uZXJtb25nb2xpYS5vcmcKfGh0dHA6Ly9ibG9nLmlub3Jl\nYWRlci5jb20KLmlub3RlLnR3Ci5pbnNlY2FtLm9yZwp8aHR0cDovL2luc2VjYW0u\nb3JnCnx8aW5zaWRldm9hLmNvbQouaW5zdGl0dXQtdGliZXRhaW4ub3JnCnxodHRw\nOi8vaW50ZXJuZXQub3JnLwppbnRlcm5ldGRlZmVuc2VsZWFndWUub3JnCmludGVy\nbmV0ZnJlZWRvbS5vcmcKIS0tfHxpbnRlcnBvbC5pbnQKfHxpbnRlcm5ldHBvcGN1\nbHR1cmUuY29tCi5pbnRoZW5hbWVvZmNvbmZ1Y2l1c21vdmllLmNvbQp8fGludGhl\nbmFtZW9mY29uZnVjaXVzbW92aWUuY29tCmlueGlhbi5jb20KfHxpbnhpYW4uY29t\nCmlwYWx0ZXIuY29tCiEtLXx8aXBjZi5vcmcudHcKLmlwZmlyZS5vcmcKfHxpcGhv\nbmU0aG9uZ2tvbmcuY29tCnx8aXBob25laGFja3MuY29tCnx8aXBob25ldGFpd2Fu\nLm9yZwp8fGlwaG9uaXguZnIKfHxpcGljdHVyZS5ydQouaXBqZXRhYmxlLm5ldAp8\nfGlwamV0YWJsZS5uZXQKLmlwb2Jhci5jb20vcmVhZC5waHA/Cmlwb29jay5jb20v\naW1nCi5pcG9ydGFsLm1lCnxodHRwOi8vaXBvcnRhbC5tZQp8fGlwcG90di5jb20K\nLmlwcmVkYXRvci5zZQp8fGlwcmVkYXRvci5zZQouaXB0di5jb20udHcKfHxpcHR2\nYmluLmNvbQp8fGlwdmFuaXNoLmNvbQppcmVkbWFpbC5vcmcKY2hpbmVzZS5pcmli\nLmlyCnx8aXJvbmJpZ2Zvb2xzLmNvbXB5dGhvbi5uZXQKfHxpcm9ucHl0aG9uLm5l\ndAouaXJvbnNvY2tldC5jb20KfHxpcm9uc29ja2V0LmNvbQouaXMuZ2QKLmlzbGFo\naGFiZXIubmV0Ci5pc2xhbS5vcmcuaGsKfGh0dHA6Ly9pc2xhbS5vcmcuaGsKLmlz\nbGFtYXdhcmVuZXNzLm5ldC9Bc2lhL0NoaW5hCi5pc2xhbWhvdXNlLmNvbQp8fGlz\nbGFtaG91c2UuY29tCi5pc2xhbWljaXR5LmNvbQouaXNsYW1pY3BsdXJhbGlzbS5v\ncmcKLmlzbGFtdG9kYXkubmV0Ci5pc2FhY21hby5jb20KfHxpc2FhY21hby5jb20K\nfHxpc2dyZWF0Lm9yZwp8fGlzbWFlbGFuLmNvbQouaXNtYWxsdGl0cy5jb20KfHxp\nc21wcm9mZXNzaW9uYWwubmV0Cmlzb2h1bnQuY29tCnx8aXNyYWJveC5jb20KLmlz\nc3V1LmNvbQp8fGlzc3V1LmNvbQouaXN0YXJzLmNvLm56Cm92ZXJzZWEuaXN0YXJz\naGluZS5jb20KfHxvdmVyc2VhLmlzdGFyc2hpbmUuY29tCmJsb2cuaXN0ZWYuaW5m\nby8yMDA3LzEwLzIxL215ZW50dW5uZWwKLmlzdGlxbGFsaGV3ZXIuY29tCi5pc3Rv\nY2twaG90by5jb20KaXN1bmFmZmFpcnMuY29tCmlzdW50di5jb20KaXRhYm9vLmlu\nZm8KfHxpdGFib28uaW5mbwouaXRhbGlhdGliZXQub3JnCmRvd25sb2FkLml0aG9t\nZS5jb20udHcKaXRoZWxwLml0aG9tZS5jb20udHcKfHxpdHNoaWRkZW4uY29tCi5p\ndHNreS5pdAouaXR3ZWV0Lm5ldAp8aHR0cDovL2l0d2VldC5uZXQKLml1NDUuY29t\nCi5pdWhyZGYub3JnCnx8aXVocmRmLm9yZwouaXVrc2t5LmNvbQouaXZhY3kuY29t\nCnx8aXZhY3kuY29tCi5pdmVyeWNkLmNvbQouaXZwbi5uZXQKIS0tfHxpdnBuLm5l\ndAp8fGl4cXVpY2suY29tCi5peHh4LmNvbQppeW91cG9ydC5jb20KfHxpeW91cG9y\ndC5jb20KLml6YW9iYW8udXMKfHxnbW96b21nLml6aWhvc3Qub3JnCi5pemxlcy5u\nZXQKLml6bGVzZW0ub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1KSi0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0KfHxqLm1wCmJsb2cuamFja2ppYS5jb20KamFtYWF0\nLm9yZwouamFteWFuZ25vcmJ1LmNvbQp8aHR0cDovL2phbXlhbmdub3JidS5jb20K\nLmphbmR5eC5jb20KfHxqYW53b25ncGhvdG8uY29tCnx8amFwYW4td2hvcmVzLmNv\nbQouamF2LmNvbQouamF2MTAxLmNvbQouamF2MmJlLmNvbQp8fGphdjJiZS5jb20K\nLmphdjY4LnR2Ci5qYXZha2liYS5vcmcKfGh0dHA6Ly9qYXZha2liYS5vcmcKLmph\ndmJ1cy5jb20KfHxqYXZidXMuY29tCnx8amF2Zm9yLm1lCi5qYXZoZC5jb20KLmph\ndmhpcC5jb20KLmphdm1vYmlsZS5uZXQKfGh0dHA6Ly9qYXZtb2JpbGUubmV0Ci5q\nYXZtb28uY29tCi5qYXZzZWVuLmNvbQp8aHR0cDovL2phdnNlZW4uY29tCmpidGFs\na3MuY2MKamJ0YWxrcy5jb20KamJ0YWxrcy5teQouamR3c3kuY29tCmplYW55aW0u\nY29tCnx8amZxdTM2LmNsdWIKfHxqZnF1MzcueHl6Cnx8amdvb2RpZXMuY29tCi5q\naWFuZ3dlaXBpbmcuY29tCnx8amlhbmd3ZWlwaW5nLmNvbQp8fGppYW95b3U4LmNv\nbQouamllaHVhLmN6Cnx8aGsuamllcGFuZy5jb20KfHx0dy5qaWVwYW5nLmNvbQpq\naWVzaGliYW9iYW8uY29tCi5qaWdnbGVnaWZzLmNvbQo1NmN1bjA0LmppZ3N5LmNv\nbQpqaWdvbmcxMDI0LmNvbQpkYW9kdTE0LmppZ3N5LmNvbQpzcGVjeGluemwuamln\nc3kuY29tCndsY25ldy5qaWdzeS5jb20KLmppaGFkb2xvZ3kubmV0CnxodHRwOi8v\namloYWRvbG9neS5uZXQKamluYnVzaGUub3JnCnx8amluYnVzaGUub3JnCi5qaW5n\nc2ltLm9yZwp6aGFvLmppbmhhaS5kZQpqaW5ncGluLm9yZwp8fGppbmdwaW4ub3Jn\nCmppbnBpYW53YW5nLmNvbQouamlucm91a29uZy5jb20KYWMuamlydWFuLm5ldAp8\nfGppdG91Y2guY29tCi5qaXp6dGhpcy5jb20KampnaXJscy5jb20KLmprYi5jYwp8\naHR0cDovL2prYi5jYwpqa2ZvcnVtLm5ldAp8fGptYS5nby5qcApyZXNlYXJjaC5q\nbXNjLmhrdS5oay9zb2NpYWwKd2VpYm9zY29wZS5qbXNjLmhrdS5oawouam1zY3Vs\ndC5jb20KfGh0dHA6Ly9qbXNjdWx0LmNvbQp8fGpvYWNoaW1zLm9yZwp8fGpvYnNv\nLnR2Ci5zdW53aW5pc20uam9pbmJicy5uZXQKLmpvdXJuYWxjaHJldGllbi5uZXQK\nfHxqb3VybmFsb2ZkZW1vY3JhY3kub3JnCi5qb3ltaWlodWIuY29tCi5qb3lvdXJz\nZWxmLmNvbQpqcG9wZm9ydW0ubmV0Cnx8ZmlkZGxlLmpzaGVsbC5uZXQKLmp1YnVz\naG91c2hlbi5jb20KfHxqdWJ1c2hvdXNoZW4uY29tCiEtLURvYW1pbiBwYXJraW5n\nCi5qdWh1YXJlbi5jb20KfHxqdWxpZXJleWMuY29tCnx8anVuYXV6YS5jb20KLmp1\nbmU0Y29tbWVtb3JhdGlvbi5vcmcKLmp1bmVmb3VydGgtMjAubmV0Cnx8anVuZWZv\ndXJ0aC0yMC5uZXQKfHxiYnMuanVuZ2xvYmFsLm5ldAouanVvYWEuY29tCnxodHRw\nOi8vanVvYWEuY29tCmp1c3RmcmVldnBuLmNvbQouanVzdGljZWZvcnRlbnppbi5v\ncmcKanVzdHBhc3RlLml0Cmp1c3R0cmlzdGFuLmNvbQpqdXl1YW5nZS5vcmcKanV6\naXl1ZS5jb20KfHxqdXppeXVlLmNvbQp8fGp3bXVzaWMub3JnCkBAfHxtdXNpYy5q\nd211c2ljLm9yZwouanl4Zi5uZXQKCiEtLS0tLS0tLS0tLS0tLS0tLS0tLUtLLS0t\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp8fGstZG91amluLm5ldAp8fGthLXdhaS5j\nb20KLmthZ3l1Lm9yZwp8fGthZ3l1Lm9yZy56YQoua2FneXVtb25sYW0ub3JnCi5r\nYWd5dW5ld3MuY29tLmhrCi5rYWd5dW9mZmljZS5vcmcKfHxrYWd5dW9mZmljZS5v\ncmcKfHxrYWd5dW9mZmljZS5vcmcudHcKLmthaXl1YW4uZGUKLmtha2FvLmNvbQp8\nfGtha2FvLmNvbQoua2FsYWNoYWtyYWx1Z2Fuby5vcmcKLmthbmthbi50b2RheQou\na2FubmV3eW9yay5jb20KfHxrYW5uZXd5b3JrLmNvbQoua2Fuc2hpZmFuZy5jb20K\nfHxrYW5zaGlmYW5nLmNvbQp8fGthbnRpZS5vcmcKa2FuemhvbmdndW8uY29tCmth\nbnpob25nZ3VvLmV1Ci5rYW90aWMuY29tCnx8a2FyYXlvdS5jb20Ka2Fya2h1bmcu\nY29tCi5rYXJtYXBhLm9yZwoua2FybWFwYS10ZWFjaGluZ3Mub3JnCnx8a2F3YXNl\nLmNvbQoua2JhLXR4Lm9yZwoua2Nvb2xvbmxpbmUuY29tCi5rZWJydW0uY29tCnx8\na2VicnVtLmNvbQoua2VjaGFyYS5jb20KLmtlZXBhbmRzaGFyZS5jb20vdmlzaXQv\ndmlzaXRfcGFnZS5waHA/aT02ODgxNTQKIS0tfHxrZWVwdmlkLmNvbQoua2Vlem1v\ndmllcy5jb20KLmtlbmRpbmNvcy5uZXQKLmtlbmVuZ2JhLmNvbQp8fGtlbmVuZ2Jh\nLmNvbQp8fGtlb250ZWNoLm5ldAoua2VwYXJkLmNvbQp8fGtlcGFyZC5jb20Kd2lr\naS5rZXNvLmNuL0hvbWUKfHxrZXljZG4uY29tCi5raGFiZGhhLm9yZwoua2htdXNp\nYy5jb20udHcKfHxraWNoaWt1LWRvdWppbmtvLmNvbQoua2lrLmNvbQp8fGtpay5j\nb20KYmJzLmtpbXkuY29tLnR3Ci5raW5kbGVyZW4uY29tCnxodHRwOi8va2luZGxl\ncmVuLmNvbQp8aHR0cDovL3d3dy5raW5kbGVyZW4uY29tCi5raW5nZG9tc2FsdmF0\naW9uLm9yZwp8fGtpbmdkb21zYWx2YXRpb24ub3JnCmtpbmdob3N0LmNvbQohLS0u\na2luZ3N0b25lLmNvbS50dy9ib29rLwp8fGtpbmdzdG9uZS5jb20udHcKLmtpbmsu\nY29tCi5raW5va3VuaXlhLmNvbQp8fGtpbm9rdW5peWEuY29tCmtpbGx3YWxsLmNv\nbQp8fGtpbGx3YWxsLmNvbQp8fGtpbm1lbi50cmF2ZWwKLmtpci5qcAoua2lzc2Ji\nYW8uY24KfGh0dHA6Ly9raXdpLmt6Cnx8a2std2h5cy5jby5qcAohLS18fGttdC5v\ncmcudHcKLmttdWgub3JnLnR3Ci5rbm93bGVkZ2VydXNoLmNvbS9rci9lbmN5Y2xv\ncGVkaWEKLmtvYm8uY29tCnx8a29iby5jb20KLmtvYm9ib29rcy5jb20KfHxrb2Jv\nYm9va3MuY29tCnx8a29kaW5nZW4uY29tCkBAfHx3d3cua29kaW5nZW4uY29tCnx8\na29tcG96ZXIubmV0Ci5rb25hY2hhbi5jb20KfGh0dHA6Ly9rb25hY2hhbi5jb20K\nLmtvbmUuY29tCnx8a29vbHNvbHV0aW9ucy5jb20KLmtvb3Juay5jb20KfHxrb29y\nbmsuY29tCnx8a29yYW5tYW5kYXJpbi5jb20KLmtvcmVuYW4yLmNvbQp8aHR0cDov\nL2dvamV0LmtydGNvLmNvbS50dwoua3NkbC5vcmcKLmtzbmV3cy5jb20udHcKfHxr\ndHpoay5jb20KLmt1aS5uYW1lL2V2ZW50Cmt1bi5pbQoua3VyYXNoc3VsdGFuLmNv\nbQp8fGt1cnRtdW5nZXIuY29tCmt1c29jaXR5LmNvbQp8fGt3Y2cuY2EKa3dvbmd3\nYWguY29tLm15Ci5reHN3LmxpZmUKfHxreHN3LmxpZmUKLmt5b2Z1bi5jb20Ka3lv\naGsubmV0Cnx8a3lveXVlLmNvbQoua3l6eWhlbGxvLmNvbQp8fGt5enloZWxsby5j\nb20KLmt6ZW5nLmluZm8KfHxremVuZy5pbmZvCgohLS0tLS0tLS0tLS0tLS0tLS0t\nLS1MTC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGEtZm9ydW0ub3JnCmxhZGJy\nb2tlcy5jb20KfHxsYWJpZW5uYWxlLm9yZwoubGFncmFuZXBvY2EuY29tCnx8bGFn\ncmFuZXBvY2EuY29tCi5sYWx1bGFsdS5jb20KLmxhbWEuY29tLnR3Cnx8bGFtYS5j\nb20udHcKLmxhbWF5ZXNoZS5jb20KfGh0dHA6Ly9sYW1heWVzaGUuY29tCnxodHRw\nOi8vd3d3LmxhbWVuaHUuY29tCi5sYW1uaWEuY28udWsKfHxsYW1uaWEuY28udWsK\nbGFtcmltLmNvbQoubGFudGVybmNuLmNuCnxodHRwOi8vbGFudGVybmNuLmNuCi5s\nYW50b3Nmb3VuZGF0aW9uLm9yZwoubGFvZC5jbgp8aHR0cDovL2xhb2QuY24KbGFv\nZ2FpLm9yZwp8fGxhb2dhaS5vcmcKbGFvbWl1LmNvbQoubGFveWFuZy5pbmZvCnxo\ndHRwOi8vbGFveWFuZy5pbmZvCnx8bGFwdG9wbG9ja2Rvd24uY29tCi5sYXFpbmdk\nYW4ubmV0Cnx8bGFxaW5nZGFuLm5ldAp8fGxhcnNnZW9yZ2UuY29tCi5sYXN0Y29t\nYmF0LmNvbQp8aHR0cDovL2xhc3Rjb21iYXQuY29tCnx8bGFzdGZtLmVzCmxhdGVs\naW5lbmV3cy5jb20KLmxhdGliZXQub3JnCnx8bGUtdnBuLmNvbQoubGVhZnl2cG4u\nbmV0Cnx8bGVhZnl2cG4ubmV0CmxlZWFvLmNvbS5jbi9iYnMvZm9ydW0ucGhwCiEt\nLXx8bGVlY2hldWt5YW4ub3JnCmxlZm9yYS5jb20KfHxsZWZ0MjEuaGsKLmxlZ2Fs\ncG9ybm8uY29tCi5sZWdzamFwYW4uY29tCnxodHRwOi8vbGVpcmVudHYuY2EKbGVp\nc3VyZWNhZmUuY2EKfHxsZW1hdGluLmNoCi5sZW1vbmRlLmZyCnx8bGVud2hpdGUu\nY29tCmxlcm9zdWEub3JnCnx8bGVyb3N1YS5vcmcKYmxvZy5sZXN0ZXI4NTAuaW5m\nbwp8fGxlc29pci5iZQoubGV0b3UuY29tCmxldHNjb3JwLm5ldAp8fGxldHNjb3Jw\nLm5ldAp8fHNzLmxldnloc3UuY29tCiE2OS4xNi4xNzUuNDIKfHxjZG4uYXNzZXRz\nLmxmcGNvbnRlbnQuY29tCi5saGFrYXIub3JnCnxodHRwOi8vbGhha2FyLm9yZwou\nbGhhc29jaWFsd29yay5vcmcKLmxpYW5neW91Lm5ldAp8fGxpYW5neW91Lm5ldAou\nbGlhbnl1ZS5uZXQKfHxsaWFvd2FuZ3hpemFuZy5uZXQKLmxpYW93YW5neGl6YW5n\nLm5ldAp8fGxpYmVyYWwub3JnLmhrCi5saWJlcnR5dGltZXMuY29tLnR3CmJsb2dz\nLmxpYnJhcnlpbmZvcm1hdGlvbnRlY2hub2xvZ3kuY29tL2p4eXoKLmxpZGVjaGVu\nZy5jb20vYmxvZy9mdWNraW5nLWdmdwoubGlnaHRlbi5vcmcudHcKLmxpZ2h0bm92\nZWwuY24KQEB8aHR0cHM6Ly93d3cubGlnaHRub3ZlbC5jbgpsaW1pYW8ubmV0Cmxp\nbmt1c3dlbGwuY29tCmFiaXRuby5saW5waWUuY29tL3VzZS1pcHY2LXRvLWZ1Y2st\nZ2Z3Cnx8bGluZS5tZQp8fGxpbmUtYXBwcy5jb20KLmxpbmdsaW5nZmEuY29tCnx8\nbGluZ3ZvZGljcy5jb20KLmxpbmstby1yYW1hLmNvbQp8aHR0cDovL2xpbmstby1y\nYW1hLmNvbQoubGlua2lkZW8uY29tCnx8YXBpLmxpbmtzYWxwaGEuY29tCnx8YXBp\nZG9jcy5saW5rc2FscGhhLmNvbQp8fHd3dy5saW5rc2FscGhhLmNvbQp8fGhlbHAu\nbGlua3NhbHBoYS5jb20KfHxsaW51eC5vcmcuaGsKbGludXh0b3kub3JnL2FyY2hp\ndmVzL2luc3RhbGxpbmctd2VzdC1jaGFtYmVyLW9uLXVidW50dQoubGlvbnNyb2Fy\nLmNvbQoubGlwdW1hbi5jb20KfHxsaXF1aWR2cG4uY29tCnx8Z3JlYXRmaXJlLnVz\nNy5saXN0LW1hbmFnZS5jb20KfHxsaXN0ZW50b3lvdXR1YmUuY29tCmxpc3Rvcmlv\ndXMuY29tCi5saXUteGlhb2JvLm9yZwp8fGxpdWRlanVuLmNvbQoubGl1aGFueXUu\nY29tCi5saXVqaWFuc2h1LmNvbQp8fGxpdWppYW5zaHUuY29tCi5saXV4aWFvYm8u\nbmV0CnxodHRwOi8vbGl1eGlhb2JvLm5ldApsaXV4aWFvdG9uZy5jb20KfHxsaXV4\naWFvdG9uZy5jb20KLmxpdmVkb29yLmpwCi5saXZlbGVhay5jb20KfHxsaXZlbGVh\nay5jb20KLmxpdmVzdGF0aW9uLmNvbQpsaXZlc3RyZWFtLmNvbQp8fGxpdmVzdHJl\nYW0uY29tCnx8bGl2aW5nb25saW5lLnVzCnx8bGl2aW5nc3RyZWFtLmNvbQp8fGxp\ndmV2aWRlby5jb20KLmxpdmV2aWRlby5jb20KLmxpd2FuZ3lhbmcuY29tCmxpemhp\nemh1YW5nYmkuY29tCmxrY24ubmV0Ci5sbHNzLm1lLwoubG9hZC50bwoubG9ic2Fu\nZ3dhbmd5YWwuY29tCi5sb2NhbGRvbWFpbi53cwp8fGxvY2FsZG9tYWluLndzCmxv\nY2FscHJlc3Noay5jb20KfHxsb2NrZXN0ZWsuY29tCmxvZ2JvdC5uZXQKfHxsb2dp\ncXguY29tCnNlY3VyZS5sb2dtZWluLmNvbQp8fHNlY3VyZS5sb2dtZWluLmNvbQou\nbG9uZG9uY2hpbmVzZS5jYQoubG9uZ2hhaXIuaGsKbG9uZ211c2ljLmNvbQp8fGxv\nbmd0ZXJtbHkubmV0Cnx8bG9va3BpYy5jb20KLmxvb2t0b3JvbnRvLmNvbQp8aHR0\ncDovL2xvb2t0b3JvbnRvLmNvbQoubG90c2F3YWhvdXNlLm9yZy90aWJldGFuLW1h\nc3RlcnMvZm91cnRlZW50aC1kYWxhaS1sYW1hCi5sb3R1c2xpZ2h0Lm9yZy5oawou\nbG90dXNsaWdodC5vcmcudHcKaGtyZXBvcnRlci5sb3ZlZC5oawohLS00MDM/Cnx8\nbHBzZy5jb20KfHxscmZ6LmNvbQoubHJpcC5vcmcKfHxscmlwLm9yZwoubHNkLm9y\nZy5oawp8fGxzZC5vcmcuaGsKbHNmb3J1bS5uZXQKLmxzbS5vcmcKfHxsc20ub3Jn\nCi5sc21jaGluZXNlLm9yZwp8fGxzbWNoaW5lc2Uub3JnCi5sc21rb3JlYW4ub3Jn\nCnx8bHNta29yZWFuLm9yZwoubHNtcmFkaW8uY29tL3JhZF9hcmNoaXZlcwoubHNt\nd2ViY2FzdC5jb20KLmx0bi5jb20udHcKfGh0dHA6Ly9sdG4uY29tLnR3Ci5sdWtl\nNTQuY29tCi5sdWtlNTQub3JnCi5sdXBtLm9yZwp8fGx1cG0ub3JnCnx8bHVzaHN0\nb3JpZXMuY29tCmx1eGViYy5jb20KbHZoYWkub3JnCnx8bHZoYWkub3JnCnx8bHZ2\nMi5jb20KLmx5ZmhrLm5ldAp8aHR0cDovL2x5ZmhrLm5ldAoubHptdG5ld3Mub3Jn\nCnx8bHptdG5ld3Mub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1NTS0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0KaHR0cDovLyoubS10ZWFtLmNjCiEtLW0tdGVhbS5j\nYy9mb3J1bQoubWFjcm92cG4uY29tCm1hY3RzLmNvbS50dwp8fG1hZC1hci5jaAp8\nfG1hZHJhdS5jb20KfHxtYWR0aHVtYnMuY29tCnx8bWFnaWMtbmV0LmluZm8KbWFo\nYWJvZGhpLm9yZwpteS5tYWlsLnJ1Ci5tYWlwbHVzLmNvbQp8aHR0cDovL21haXBs\ndXMuY29tCi5tYWl6aG9uZy5vcmcKbWFra2FobmV3c3BhcGVyLmNvbQoubWFtaW5n\nemhlLmNvbQptYW5pY3VyNGlrLnJ1Ci5tYXBsZXcuY29tCnxodHRwOi8vbWFwbGV3\nLmNvbQp8fG1hcmMuaW5mbwptYXJndWVyaXRlLnN1Cnx8bWFydGluY2FydG9vbnMu\nY29tCm1hc2tlZGlwLmNvbQoubWFpaW8ubmV0Ci5tYWlsLWFyY2hpdmUuY29tCi5t\nYWxheXNpYWtpbmkuY29tCnx8bWFrZW15bW9vZC5jb20KLm1hbmNodWt1by5uZXQK\nLm1hbmlhc2guY29tCnxodHRwOi8vbWFuaWFzaC5jb20KLm1hbnNpb24uY29tCi5t\nYW5zaW9ucG9rZXIuY29tCiEtLXx8bWFyaW5lcy5taWwKIS0tbWFya21haWwub3Jn\nKm1lc3NhZ2UKfHxtYXJ0YXUuY29tCnxodHRwOi8vYmxvZy5tYXJ0aW5vZWkuY29t\nCi5tYXJ0c2FuZ2thZ3l1b2ZmaWNpYWwub3JnCnxodHRwOi8vbWFydHNhbmdrYWd5\ndW9mZmljaWFsLm9yZwptYXJ1dGEuYmUvZm9yZ2V0Ci5tYXJ4aXN0LmNvbQp8fG1h\ncnhpc3QubmV0Ci5tYXJ4aXN0cy5vcmcvY2hpbmVzZQohLS18fG1hc2hhYmxlLmNv\nbQp8fG1hdGFpbmphLmNvbQp8fG1hdGhhYmxlLmlvCnx8bWF0aGlldy1iYWRpbW9u\nLmNvbQp8fG1hdHN1c2hpbWFrYWVkZS5jb20KfGh0dHA6Ly9tYXR1cmVqcC5jb20K\nbWF5aW1heWkuY29tCi5tYXhpbmcuanAKLm1jYWYuZWUKfGh0dHA6Ly9tY2FmLmVl\nCnx8bWNhZGZvcnVtcy5jb20KbWNmb2cuY29tCm1jcmVhc2l0ZS5jb20KLm1kLXQu\nb3JnCnx8bWQtdC5vcmcKfHxtZWFuc3lzLmNvbQoubWVkaWEub3JnLmhrCi5tZWRp\nYWNoaW5lc2UuY29tCnx8bWVkaWFjaGluZXNlLmNvbQoubWVkaWFmaXJlLmNvbS8/\nCi5tZWRpYWZpcmUuY29tL2Rvd25sb2FkCi5tZWRpYWZyZWFrY2l0eS5jb20KfHxt\nZWRpYWZyZWFrY2l0eS5jb20KLm1lZGl1bS5jb20KfHxtZWRpdW0uY29tCi5tZWV0\nYXYuY29tCnx8bWVldHVwLmNvbQptZWZlZWRpYS5jb20KamloYWRpbnRlbC5tZWZv\ncnVtLm9yZwp8fG1lZ2EubnoKfHxtZWdhcHJveHkuY29tCnx8bWVnYXJvdGljLmNv\nbQptZWdhdmlkZW8uY29tCnx8bWVndXJpbmVsdWthLmNvbQptZWlyaXhpYW9jaGFv\nLmNvbQoubWVsdG9kYXkuY29tCi5tZW1laGsuY29tCnx8bWVtZWhrLmNvbQptZW1v\ncnliYnMuY29tCi5tZW1yaS5vcmcKLm1lbXJpanR0bS5vcmcKLm1lcmN5cHJvcGhl\ndC5vcmcKfGh0dHA6Ly9tZXJjeXByb3BoZXQub3JnCnx8bWVyZ2Vyc2FuZGlucXVp\nc2l0aW9ucy5vcmcKLm1lcmlkaWFuLXRydXN0Lm9yZwp8aHR0cDovL21lcmlkaWFu\nLXRydXN0Lm9yZwoubWVyaXBldC5iaXoKfGh0dHA6Ly9tZXJpcGV0LmJpegoubWVy\naXBldC5jb20KfGh0dHA6Ly9tZXJpcGV0LmNvbQptZXJpdC10aW1lcy5jb20udHcK\nbWVzaHJlcC5jb20KLm1lc290dy5jb20vYmJzCm1ldGFjYWZlLmNvbS93YXRjaAp8\nfG1ldGVvcnNob3dlcnNvbmxpbmUuY29tCnxodHRwOi8vd3d3Lm1ldHJvLnRhaXBl\naS8KLm1ldHJvaGsuY29tLmhrLz9jbWQ9ZGV0YWlsJmNhdGVnb3J5SUQ9Mgp8fG1l\ndHJvbGlmZS5jYQoubWV0cm9yYWRpby5jb20uaGsKfGh0dHA6Ly9tZXRyb3JhZGlv\nLmNvbS5oawptZXlvdS5qcAoubWV5dWwuY29tCnx8bWdvb24uY29tCnx8bWdzdGFn\nZS5jb20KfHxtaDR1Lm9yZwptaHJhZGlvLm9yZwp8aHR0cDovL21pY2hhZWxhbnRp\nLmNvbQp8fG1pY2hhZWxtYXJrZXRsLmNvbQp8aHR0cDovL2Jicy5taWtvY29uLmNv\nbQoubWljcm92cG4uY29tCnxodHRwOi8vbWljcm92cG4uY29tCm1pZGRsZS13YXku\nbmV0Ci5taWhrLmhrL2ZvcnVtCi5taWhyLmNvbQptaWh1YS5vcmcKIS0tSVAKfHxt\naWtlc29sdHlzLmNvbQoubWlscGgubmV0CnxodHRwOi8vbWlscGgubmV0Ci5taWxz\ndXJwcy5jb20KbWltaWFpLm5ldAoubWltaXZpcC5jb20KLm1pbWl2di5jb20KLm1p\nbmRyb2xsaW5nLm9yZwp8aHR0cDovL21pbmRyb2xsaW5nLm9yZwoubWluZ2h1aS5v\nci5rcgp8aHR0cDovL21pbmdodWkub3Iua3IKbWluZ2h1aS5vcmcKfHxtaW5naHVp\nLm9yZwptaW5naHVpLWEub3JnCm1pbmdodWktYi5vcmcKbWluZ2h1aS1zY2hvb2wu\nb3JnCi5taW5namluZ2xpc2hpLmNvbQp8fG1pbmdqaW5nbGlzaGkuY29tCm1pbmdq\naW5nbmV3cy5jb20KfHxtaW5namluZ3RpbWVzLmNvbQoubWluZ3Bhby5jb20KfHxt\naW5ncGFvLmNvbQoubWluZ3Bhb2NhbmFkYS5jb20KLm1pbmdwYW9tb250aGx5LmNv\nbQp8aHR0cDovL21pbmdwYW9tb250aGx5LmNvbQptaW5ncGFvbmV3cy5jb20KLm1p\nbmdwYW9ueS5jb20KLm1pbmdwYW9zZi5jb20KLm1pbmdwYW90b3IuY29tCi5taW5n\ncGFvdmFuLmNvbQoubWluZ3NoZW5nYmFvLmNvbQoubWluaGh1ZS5uZXQKLm1pbmlm\nb3J1bS5vcmcKLm1pbmlzdHJ5Ym9va3Mub3JnCi5taW56aHVodWEubmV0Cnx8bWlu\nemh1aHVhLm5ldAptaW56aHV6aGFueGlhbi5jb20KbWluemh1emhvbmdndW8ub3Jn\nCnx8bWlyb2d1aWRlLmNvbQptaXJyb3Jib29rcy5jb20KLm1pc3QudmlwCnRoZWNl\nbnRlci5taXQuZWR1Ci5taXRhby5jb20udHcKLm1pdGJicy5jb20KfHxtaXRiYnMu\nY29tCm1pdGJic2F1LmNvbQoubWl4ZXJvLmNvbQp8fG1peGVyby5jb20KbWl4cG9k\nLmNvbQoubWl4eC5jb20KfHxtaXh4LmNvbQp8fG1penptb25hLmNvbQoubWs1MDAw\nLmNvbQoubWxjb29sLmNvbQp8fG1senMud29yawoubW0tY2cuY29tCnx8bW1hYXh4\nLmNvbQoubW1tY2EuY29tCm1uZXdzdHYuY29tCnx8bW9iYXRlay5uZXQKLm1vYmls\nZTAxLmNvbQp8fG1vYmlsZTAxLmNvbQp8fG1vYmlsZXdheXMuZGUKLm1vYnlwaWN0\ndXJlLmNvbQp8aHR0cDovL21vYnkudG8KfHxtb2Vlcm9saWJyYXJ5LmNvbQp3aWtp\nLm1vZWdpcmwub3JnCi5tb2ZheGllaHVpLmNvbQoubW9mb3MuY29tCnx8bW9nLmNv\nbQptb2xpaHVhLm9yZwp8fG1vbmRleC5vcmcKLm1vbmV5LWxpbmsuY29tLnR3Cnxo\ndHRwOi8vbW9uZXktbGluay5jb20udHcKfGh0dHA6Ly93d3cubW9ubGFtaXQub3Jn\nCi5tb29uYmJzLmNvbQp8fG1vb25iYnMuY29tCmMxNTIyLm1vb28uY29tCnx8bW9u\naXRvcmNoaW5hLm9yZwpiYnMubW9yYmVsbC5jb20KfHxtb3JuaW5nc3VuLm9yZwp8\nfG1vcm9uZXRhLmNvbQoubW90aGVybGVzcy5jb20KfGh0dHA6Ly9tb3RoZXJsZXNz\nLmNvbQptb3RvcjRpay5ydQoubW91c2VicmVha2VyLmNvbQohLS18fG1vdmFibGV0\neXBlLmNvbQoubW92ZW1lbnRzLm9yZwp8fG1vdmVtZW50cy5vcmcKfHxtb3ZpZWZh\ncC5jb20KfHx3d3cubW96dHcub3JnCi5tcDNidXNjYWRvci5jb20KbXAzeWUuZXUK\nfHxtcGV0dGlzLmNvbQptcGZpbmFuY2UuY29tCm1waW5ld3MuY29tCm1wb25saW5l\nLmhrCi5tcXhkLm9yZwp8aHR0cDovL21xeGQub3JnCm1ydHdlZXQuY29tCnx8bXJ0\nd2VldC5jb20KbmV3cy5oay5tc24uY29tCm5ld3MubXNuLmNvbS50dwptc2d1YW5j\naGEuY29tCi5tc3dlMS5vcmcKfGh0dHA6Ly9tc3dlMS5vcmcKfHxtdGhydWYuY29t\nCm11Y2hvc3Vja28uY29tCnx8bXVsdGlwbHkuY29tCm11bHRpcHJveHkub3JnCm11\nbHRpdXBsb2FkLmNvbQoubXVsbHZhZC5uZXQKfHxtdWxsdmFkLm5ldAoubXVtbXlz\nZ29sZC5jb20KLm11cm11ci50dwp8aHR0cDovL211cm11ci50dwoubXVzaWNhZGUu\nbmV0Ci5tdXNsaW12aWRlby5jb20KfHxtdXppLmNvbQp8fG11emkubmV0Cnx8bXg5\nODEuY29tCi5teS1mb3Jtb3NhLmNvbQoubXktcHJveHkuY29tCi5teS1wcml2YXRl\nLW5ldHdvcmsuY28udWsKfHxteS1wcml2YXRlLW5ldHdvcmsuY28udWsKZm9ydW0u\nbXk5MDMuY29tCi5teWFjdGltZXMuY29tL2FjdGltZXMKfHxteWFubml1LmNvbQou\nbXlhdWRpb2Nhc3QuY29tCnx8bXlhdWRpb2Nhc3QuY29tCi5teWF2LmNvbS50dy9i\nYnMKLm15YmJzLnVzCi5teWNhMTY4LmNvbQoubXljYW5hZGFub3cuY29tCnx8YmJz\nLm15Y2hhdC50bwp8fG15Y2hpbmFteWhvbWUuY29tCi5teWNoaW5hbXlob21lLmNv\nbQoubXljaGluYW5ldC5jb20KLm15Y2hpbmFuZXdzLmNvbQp8fG15Y2hpbmFuZXdz\nLmNvbQoubXljaGluZXNlLm5ld3MKfHxteWNubmV3cy5jb20KfHxteWtvbWljYS5v\ncmcKbXljb3VsZC5jb20vZGlzY3V6Ci5teWVhc3l0di5jb20KfHxteWVjbGlwc2Vp\nZGUuY29tCi5teWZvcnVtLmNvbS5oawp8fG15Zm9ydW0uY29tLmhrCnx8bXlmb3J1\nbS5jb20udWsKLm15ZnJlZWNhbXMuY29tCi5teWZyZWVwYXlzaXRlLmNvbQoubXlm\ncmVzaG5ldC5jb20KLm15aXBoaWRlLmNvbQp8fG15aXBoaWRlLmNvbQpmb3J1bS5t\neW1hamkuY29tCm15bWVkaWFyb20uY29tL2ZpbGVzL2JveAp8fG15bW9lLm1vZQp8\nfG15bXVzaWMubmV0LnR3Cnx8bXlwYXJhZ2xpZGluZy5jb20KfHxteXBvcGVzY3Uu\nY29tCm15cmFkaW8uaGsvcG9kY2FzdAoubXlyZWFkaW5nbWFuZ2EuaW5mbwpteXNp\nbmFibG9nLmNvbQoubXlzcGFjZS5jb20KIS0tLmJsb2dzLm15c3BhY2UuY29tCiEt\nLXx8YmxvZ3MubXlzcGFjZS5jb20KIS0tdmlkcy5teXNwYWNlLmNvbS9pbmRleC5j\nZm0/ZnVzZWFjdGlvbj12aWRzLgohLS12aWV3bW9yZXBpY3MubXlzcGFjZS5jb20K\nfHxteXNwYWNlY2RuLmNvbQoubXl0YWxrYm94LmNvbQoubXl0aXppLmNvbQoKIS0t\nLS0tLS0tLS0tLS0tLS0tLS0tTk4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnx8\nbmFhY29hbGl0aW9uLm9yZwpvbGQubmFiYmxlLmNvbQp8fG5haXRpay5uZXQKLm5h\na3V6LmNvbS9iYnMKfHxuYWxhbmRhYm9kaGkub3JnCnx8bmFsYW5kYXdlc3Qub3Jn\nCi5uYW1neWFsLm9yZwpuYW1neWFsbW9uYXN0ZXJ5Lm9yZwp8fG5hbXNpc2kuY29t\nCi5uYW55YW5nLmNvbQp8fG5hbnlhbmcuY29tCi5uYW55YW5ncG9zdC5jb20KfHxu\nYW55YW5ncG9zdC5jb20KLm5hbnphby5jb20KIS0tLm5hbnphby5jb20vc2MvY2hp\nbmEvMjAyMjMKIS0tLm5hbnphby5jb20vc2MvaGstbWFjYXUtdHcKfHxqcGwubmFz\nYS5nb3YKfHxwZHMubmFzYS5nb3YKfHxzb2xhcnN5c3RlbS5uYXNhLmdvdgoubmFr\naWRvLmNvbQp8fG5ha2lkby5jb20KLm5hb2wuY2EKLm5hb2wuY2MKdWlnaHVyLm5h\ncm9kLnJ1Ci5uYXQubW9lCnx8bmF0Lm1vZQpjeWJlcmdob3N0Lm5hdGFkby5jb20K\nfHxuYXRpb25hbC1sb3R0ZXJ5LmNvLnVrCm5ld3MubmF0aW9uYWxnZW9ncmFwaGlj\nLmNvbS9uZXdzLzIwMTQvMDYvMTQwNjAzLXRpYW5hbm1lbi1zcXVhcmUKLm5hdGlv\nbnNvbmxpbmUub3JnL29uZXdvcmxkL3RpYmV0Cnx8bGluZS5uYXZlci5qcAp8fG5h\ndnlmYW1pbHkubmF2eS5taWwKfHxuYXZ5cmVzZXJ2ZS5uYXZ5Lm1pbAp8fG5rby5u\nYXZ5Lm1pbAp8fHVzbm8ubmF2eS5taWwKbmF3ZWVrbHl0aW1lcy5jb20KLm5idHZw\nbi5jb20KfGh0dHA6Ly9uYnR2cG4uY29tCm5jY3dhdGNoLm9yZy50dwoubmNoLmNv\nbS50dwoubmNuLm9yZwp8fG5jbi5vcmcKfHxldG9vbHMubmNvbC5jb20KLm5kZS5k\nZQoubmRyLmRlCi5uZWQub3JnCnx8bmVrb3Nsb3Zha2lhLm5ldAp8fG5lcHVzb2t1\nLmNvbQp8fG5ldC1maXRzLnBybwohLS1iYnNuZXcubmV0YmlnLmNvbQpiYnMubmV0\nYmlnLmNvbQoubmV0YmlyZHMuY29tCm5ldGNvbG9ueS5jb20KYm9saW4ubmV0Zmly\nbXMuY29tCnx8bmV0bWUuY2MKbmV0c25lYWsuY29tCi5uZXR3b3JrNTQuY29tCm5l\ndHdvcmtlZGJsb2dzLmNvbQoubmV0d29ya3R1bm5lbC5uZXQKbmV2ZXJmb3JnZXQ4\nOTY0Lm9yZwpuZXctM2x1bmNoLm5ldAoubmV3LWFraWJhLmNvbQoubmV3OTYuY2EK\nLm5ld2NlbnR1cnltYy5jb20KfGh0dHA6Ly9uZXdjZW50dXJ5bWMuY29tCm5ld2Nl\nbnR1cnluZXdzLmNvbQp8fG5ld2NoZW4uY29tCi5uZXdjaGVuLmNvbQoubmV3Z3Jv\ndW5kcy5jb20KbmV3aXBub3cuY29tCi5uZXdsYW5kbWFnYXppbmUuY29tLmF1Ci5u\nZXduZXdzLmNhCm5ld3MxMDAuY29tLnR3Cm5ld3NjaGluYWNvbW1lbnQub3JnCi5u\nZXdzY24ub3JnCnx8bmV3c2NuLm9yZwpuZXdzcGVhay5jYy9zdG9yeQoubmV3c2Fu\nY2FpLmNvbQp8fG5ld3NhbmNhaS5jb20KLm5ld3NkZXRveC5jYQoubmV3c2RoLmNv\nbQp8fG5ld3N0YW1hZ28uY29tCnx8bmV3c3RhcGEub3JnCm5ld3N0YXJuZXQuY29t\nCi5uZXd0YWl3YW4uY29tLnR3Cm5ld3RhbGsudHcKfHxuZXd0YWxrLnR3Cm5ld3lv\ncmt0aW1lcy5jb20KfHxuZXhvbi5jb20KLm5leHQxMS5jby5qcAoubmV4dG1hZy5j\nb20udHcKCiEtLWhrKi5uZXh0bWVkaWEuY29tCiEtLXR3Ki5uZXh0bWVkaWEuY29t\nCiEtLXN0YXRpYyoubmV4dG1lZGlhLmNvbQoubmV4dG1lZGlhLmNvbQoKfHxuZXh0\nb24tbmV0LmpwCm5leHR0di5jb20udHcKLm5manR5ZC5jb20KfHxjby5uZy5taWwK\nfHxuZ2EubWlsCm5nZW5zaXMuY29tCi5uaGVudGFpLm5ldAp8aHR0cDovL25oZW50\nYWkubmV0Ci5uaGstb25kZW1hbmQuanAKLm5pY292aWRlby5qcC93YXRjaAp8fG5p\nY292aWRlby5qcAp8fG5pZ2hvc3Qub3JnCmF2Lm5pZ2h0bGlmZTE0MS5jb20Kbmlu\nZWNvbW1lbnRhcmllcy5jb20KLm5pbmphY2xvYWsuY29tCnx8bmluamFwcm94eS5u\naW5qYQpuaW50ZW5kaXVtLmNvbQp0YWl3YW55ZXMubmluZy5jb20KdXNtZ3RjZy5u\naW5nLmNvbS9mb3J1bQp8fG5pdXNuZXdzLmNvbQp8fG5qYWN0Yi5vcmcKbmp1aWNl\nLmNvbQp8fG5qdWljZS5jb20KbmxmcmVldnBuLmNvbQoKIS0tbm8taXAuY29tI05P\nSVAKLmRkbnMubmV0LwouZ29vZGRucy5pbmZvCnx8Z290ZG5zLmNoCi5tYWlsZG5z\nLnh5egoubm8taXAub3JnCi5vcGVuZG4ueHl6Ci5zZXJ2ZWh0dHAuY29tCnN5dGVz\nLm5ldAoud2hvZG5zLnh5egouemFwdG8ub3JnCnxodHRwOi8vZHludXBkYXRlLm5v\nLWlwLmNvbS8KCnx8bm9iZWwuc2UKIS0tLm5vYmVscHJpemUub3JnCiEtLXxodHRw\nOi8vbm9iZWxwcml6ZS5vcmcKbm9iZWxwcml6ZS5vcmcvbm9iZWxfcHJpemVzL3Bl\nYWNlL2xhdXJlYXRlcy8xOTg5Cm5vYmVscHJpemUub3JnL25vYmVsX3ByaXplcy9w\nZWFjZS9sYXVyZWF0ZXMvMjAxMApub2JvZHljYW5zdG9wLnVzCnx8bm9ib2R5Y2Fu\nc3RvcC51cwp8fG5va29naXJpLm9yZwp8fG5va29sYS5jb20Kbm9vZGxldnBuLmNv\nbQoubm9yYnVsaW5na2Eub3JnCm5vcmR2cG4uY29tCnx8bm9yZHZwbi5jb20KfHxu\nb3ZlbGFzaWEuY29tCi5uZXdzLm5vdy5jb20KfGh0dHA6Ly9uZXdzLm5vdy5jb20K\nIS0tfGh0dHA6Ly9uZXdzLm5vdy5jb20vaG9tZSoKbmV3cy5ub3cuY29tJTJGaG9t\nZQp8fG5vd25ld3MuY29tCi5ub3d0b3JyZW50cy5jb20KLm5veXBmLmNvbQp8fG5v\neXBmLmNvbQp8fG5wYS5nby5qcAoubnBudC5tZQp8aHR0cDovL25wbnQubWUKLm5w\ncy5nb3YKLm5yYWRpby5tZQp8aHR0cDovL25yYWRpby5tZQoubnJrLm5vCnx8bnJr\nLm5vCi5udGQudHYKfHxudGQudHYKISEtLU9yaWc6bnRkdHYuY29tCi5udGR0di5j\nb20KfHxudGR0di5jb20KLm50ZHR2LmNvLmtyCm50ZHR2LmNhCm50ZHR2Lm9yZwpu\ndGR0di5ydQpudGR0dmxhLmNvbQoubnRyZnVuLmNvbQp8fGNicy5udHUuZWR1LnR3\nCnx8bWVkaWEubnUubmwKLm51YmlsZXMubmV0Cnx8bnVleHBvLmNvbQoubnVraXN0\ncmVhbS5jb20KfHxudXJnby1zb2Z0d2FyZS5jb20KfHxudXRha3UubmV0Ci5udXZp\nZC5jb20KfHxudmRzdC5jb20KbnV6Y29tLmNvbQoubnZxdWFuLm9yZwoubnZ0b25n\nemhpc2hlbmcub3JnCnxodHRwOi8vbnZ0b25nemhpc2hlbmcub3JnCi5ud3RjYS5v\ncmcKfGh0dHA6Ly9ueWFhLmV1CiEtLXx8bnlhYS5zaQoubnlkdXMuY2EKbnlsb24t\nYW5nZWwuY29tCm55bG9uc3RvY2tpbmdzb25saW5lLmNvbQohLS1ueXNpbmd0YW8u\nY29tCi5uemNoaW5lc2UuY29tCnx8bnpjaGluZXNlLm5ldC5uegoKIS0tLS0tLS0t\nLS0tLS0tLS0tLS0tT08tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm9ic2VydmVj\naGluYS5uZXQKLm9idXR1LmNvbQpvY2FzcHJvLmNvbQpvY2N1cHl0aWFuYW5tZW4u\nY29tCm9jbHAuaGsKLm9jcmVhbXBpZXMuY29tCnx8b2N0b2Jlci1yZXZpZXcub3Jn\nCm9mZmJlYXRjaGluYS5jb20Kb2ZmaWNlb2Z0aWJldC5jb20KfGh0dHA6Ly9vZmls\nZS5vcmcKfHxvZ2FvZ2Eub3JnCnR3dHIyc3JjLm9nYW9nYS5vcmcKLm9nYXRlLm9y\nZwp8fG9nYXRlLm9yZwp3d3cyLm9oY2hyLm9yZy9lbmdsaXNoL2JvZGllcy9jYXQv\nZG9jcy9uZ29zL0lJX0NoaW5hXzQxLnBkZgoub2lrb3MuY29tLnR3L3Y0Ci5vaWt0\ndi5jb20Kb2l6b2Jsb2cuY29tCi5vay5ydQp8fG9rLnJ1Ci5va2F5ZnJlZWRvbS5j\nb20KfHxva2F5ZnJlZWRvbS5jb20Kb2trLnR3CnxodHRwOi8vZmlsbXkub2xhYmxv\nZ2EucGwvcGxheWVyCm9sZC1jYXQubmV0Cnx8b2x1bXBvLmNvbQoub2x5bXBpY3dh\ndGNoLm9yZwpvbWdpbGkuY29tCnx8b21uaXRhbGsuY29tCnx8b21uaXRhbGsub3Jn\nCmNsaW5nLm9teS5zZwpmb3J1bS5vbXkuc2cKbmV3cy5vbXkuc2cKc2hvd2Jpei5v\nbXkuc2cKfHxvbi5jYwp8fG9uZWRyaXZlLmxpdmUuY29tCnx8b25pb24uY2l0eQou\nb25saW5lY2hhLmNvbQp8fG9ubGluZXlvdXR1YmUuY29tCi5vbmx5dHdlZXRzLmNv\nbQp8aHR0cDovL29ubHl0d2VldHMuY29tCm9ubW9vbi5uZXQKb25tb29uLmNvbQou\nb250aGVodW50LmNvbQp8aHR0cDovL29udGhlaHVudC5jb20KLm9vcHNmb3J1bS5j\nb20Kb3Blbi5jb20uaGsKb3BlbmFsbHdlYi5jb20Kb3BlbmRlbW9jcmFjeS5uZXQK\nfHxvcGVuZGVtb2NyYWN5Lm5ldAoub3BlbmVydnBuLmluCm9wZW5pZC5uZXQKfHxv\ncGVuaWQubmV0Ci5vcGVubGVha3Mub3JnCnx8b3BlbmxlYWtzLm9yZwpvcGVudnBu\nLm5ldAp8fG9wZW52cG4ubmV0Cnx8b3BlbndlYnN0ZXIuY29tCi5vcGVud3J0Lm9y\nZy5jbgpAQHx8b3BlbndydC5vcmcuY24KbXkub3BlcmEuY29tL2RhaGVtYQp8fGRl\nbW8ub3BlcmEtbWluaS5uZXQKLm9wdXMtZ2FtaW5nLmNvbQp8aHR0cDovL29wdXMt\nZ2FtaW5nLmNvbQp3d3cub3JjaGlkYmJzLmNvbQoub3JnYW5jYXJlLm9yZy50dwpv\ncmdhbmhhcnZlc3RpbnZlc3RpZ2F0aW9uLm5ldAoub3JnYXNtLmNvbQoub3JnZnJl\nZS5jb20KfHxvcmllbnQtZG9sbC5jb20Kb3JpZW50YWxkYWlseS5jb20ubXkKfHxv\ncmllbnRhbGRhaWx5LmNvbS5teQohLS1vcmllbnRhbGRhaWx5Lm9uLmNjCnx8b3Ju\nLmpwCnQub3J6ZHJlYW0uY29tCnx8dC5vcnpkcmVhbS5jb20KdHVpLm9yemRyZWFt\nLmNvbQp8fG9yemlzdGljLm9yZwp8fG9zZm9vcmEuY29tCi5vdG5kLm9yZwp8fG90\nbmQub3JnCnx8b3R0by5kZQp8fG91cmRlYXJhbXkuY29tCm91cnNvZ28uY29tCi5v\ndXJzdGVwcy5jb20uYXUKfHxvdXJzdGVwcy5jb20uYXUKLm91cnN3ZWIubmV0Cnx8\nb3VydHYuaGsKeGlucWltZW5nLm92ZXItYmxvZy5jb20KfHxvdmVycGxheS5uZXQK\nc2hhcmUub3ZpLmNvbS9tZWRpYQp8aHR0cDovL293bC5saQp8aHR0cDovL2h0Lmx5\nCnxodHRwOi8vaHRsLmxpCnxodHRwOi8vbWFzaC50bwp3d3cub3dpbmQuY29tCnxo\ndHRwOi8vd3d3Lm94aWQuaXQKb3lheC5jb20Kb3lnaGFuLmNvbS93cHMKLm96Y2hp\nbmVzZS5jb20vYmJzCnx8b3cubHkKYmJzLm96Y2hpbmVzZS5jb20KLm96dm9pY2Uu\nb3JnCnx8b3p2b2ljZS5vcmcKLm96eHcuY29tCi5venlveW8uY29tCgohLS0tLS0t\nLS0tLS0tLS0tLS0tLS1QUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfHxwYWNo\nb3N0aW5nLmNvbQoucGFjaWZpY3Bva2VyLmNvbQoucGFja2V0aXgubmV0Cnx8cGFj\nb3BhY29tYW1hLmNvbQoucGFkbWFuZXQuY29tCnBhZ2UycnNzLmNvbQp8fHBhZ29k\nYWJveC5jb20KLnBhbGFjZW1vb24uY29tCmZvcnVtLnBhbG1pc2xpZmUuY29tCnx8\nZXJpdmVyc29mdC5jb20KLnBhbGRlbmd5YWwuY29tCnBhbGpvcnB1YmxpY2F0aW9u\ncy5jb20KLnBhbHRhbGsuY29tCiEtLXx8cGFuZ2NpLm5ldAp8fHBhbmRhcG93LmNv\nCi5wYW5kYXBvdy5uZXQKLnBhbmRhdnBuLWpwLmNvbQoucGFubHVhbi5uZXQKfHxw\nYW5sdWFuLm5ldAp8fHBhby1wYW8ubmV0CnBhcGVyLmxpCnBhcGVyYi51cwoucGFy\nYWRpc2VoaWxsLmNjCi5wYXJhZGlzZXBva2VyLmNvbQoucGFydHljYXNpbm8uY29t\nCi5wYXJ0eXBva2VyLmNvbQoucGFzc2lvbi5jb20KfHxwYXNzaW9uLmNvbQoucGFz\nc2lvbnRpbWVzLmhrCnBhc3RlYmluLmNvbQoucGFzdGllLm9yZwp8fHBhc3RpZS5v\ncmcKfHxibG9nLnBhdGh0b3NoYXJlcG9pbnQuY29tCnBicy5vcmcvd2diaC9wYWdl\ncy9mcm9udGxpbmUvZ2F0ZQpwYnMub3JnL3dnYmgvcGFnZXMvZnJvbnRsaW5lL3Rh\nbmttYW4KcGJzLm9yZy93Z2JoL3BhZ2VzL2Zyb250bGluZS90aWJldAp2aWRlby5w\nYnMub3JnCgohLS1QYndpa2kKcGJ3aWtpLmNvbQp8fHBid29ya3MuY29tCnx8ZGV2\nZWxvcGVycy5ib3gubmV0Cnx8d2lraS5vYXV0aC5uZXQKfHx3aWtpLnBob25lZ2Fw\nLmNvbQp8fHdpa2kuanF1ZXJ5dWkuY29tCgp8fHBieGVzLmNvbQp8fHBieGVzLm9y\nZwpwY2R2ZC5jb20udHcKLnBjaG9tZS5jb20udHcKfGh0dHA6Ly9wY2lqLm9yZwou\ncGNzdG9yZS5jb20udHcKfHxwY3Qub3JnLnR3CnBkZXRhaWxzLmNvbQp8fHBkcHJv\neHkuY29tCnx8cGVhY2UuY2EKcGVhY2VmaXJlLm9yZwpwZWFjZWhhbGwuY29tCnx8\ncGVhY2VoYWxsLmNvbQp8aHR0cDovL3BlYXJsaGVyLm9yZwoucGVlYXNpYW4uY29t\nCi5wZWtpbmdkdWNrLm9yZwp8fHBla2luZ2R1Y2sub3JnCi5wZW11bGloYW4ub3Iu\naWQKfGh0dHA6Ly9wZW11bGloYW4ub3IuaWQKfHxwZW4uaW8KcGVuY2hpbmVzZS5j\nb20KfHxwZW5jaGluZXNlLm5ldAoucGVuY2hpbmVzZS5uZXQKcGVuZ3l1bG9uZy5j\nb20KcGVuaXNib3QuY29tCnx8YmxvZy5wZW50YWxvZ2ljLm5ldAoucGVudGhvdXNl\nLmNvbQoucGVudG95LmhrLyVFNCVCOCVBRCVFNSU5QyU4QgoucGVudG95LmhrLyVF\nNiU5OSU4MiVFNCVCQSU4QgoucGVvcGxlYm9va2NhZmUuY29tCi5wZW9wbGVuZXdz\nLnR3Cnx8cGVvcGxlbmV3cy50dwoucGVvcG8ub3JnCnx8cGVvcG8ub3JnCi5wZXJj\neS5pbgoucGVyZmVjdGdpcmxzLm5ldApwZXJmZWN0dnBuLm5ldAoucGVyc2VjdXRp\nb25ibG9nLmNvbQoucGVyc2lhbmtpdHR5LmNvbQpwZmQub3JnLmhrCnBoYXBsdWFu\nLm9yZwpwaGF5dWwuY29tCnBoaWxib3JnZXMuY29tCnBoaWxseS5jb20KfHxwaG5j\nZG4uY29tCnx8cGhvdG9kaGFybWEubmV0Cnx8cGhvdG9mb2N1cy5jb20KfHxwaHVx\ndW9jc2VydmljZXMuY29tCnx8cGljYWNvbWljY24uY29tCi5waWNpZGFlLm5ldAp8\nfGltZyoucGljdHVyZWRpcC5jb20KcGljdHVyZXNvY2lhbC5jb20KfHxwaW4tY29u\nZy5jb20KLnBpbjYuY29tCnx8cGluNi5jb20KLnBpbmcuZm0KfHxwaW5nLmZtCnx8\ncGluaW1nLmNvbQoucGlua3JvZC5jb20KfHxwaW5veS1uLmNvbQp8fHBpbnRlcmVz\ndC5hdAp8fHBpbnRlcmVzdC5jYQp8fHBpbnRlcmVzdC5jby5rcgp8fHBpbnRlcmVz\ndC5jby51awoucGludGVyZXN0LmNvbQp8fHBpbnRlcmVzdC5jb20KfHxwaW50ZXJl\nc3QuZGUKfHxwaW50ZXJlc3QuZGsKfHxwaW50ZXJlc3QuZnIKfHxwaW50ZXJlc3Qu\nanAKfHxwaW50ZXJlc3QubmwKfHxwaW50ZXJlc3Quc2UKLnBpcGlpLnR2Ci5waXBv\nc2F5LmNvbQpwaXJhYXR0aWxhaHRpLm9yZwoucGlyaW5nLmNvbQp8fHBpeGVscWku\nY29tCnx8Y3NzLnBpeG5ldC5pbgp8fHBpeG5ldC5uZXQKLnBpeG5ldC5uZXQKLnBr\nLmNvbQp8fHBsYWNlbWl4LmNvbQohLS0ucGxhbmV0c3V6eS5vcmcKfGh0dHA6Ly9w\naWN0dXJlcy5wbGF5Ym95LmNvbQp8fHBsYXlib3kuY29tCi5wbGF5Ym95cGx1cy5j\nb20KfHxwbGF5Ym95cGx1cy5jb20KfHxwbGF5ZXIuZm0KLnBsYXlubzEuY29tCnx8\ncGxheW5vMS5jb20KfHxwbGF5cGNlc29yLmNvbQpwbGF5cy5jb20udHcKfHxtLnBs\naXhpLmNvbQpwbG0ub3JnLmhrCnBsdW5kZXIuY29tCi5wbHVyay5jb20KfHxwbHVy\nay5jb20KLnBsdXMyOC5jb20KLnBsdXNiYi5jb20KLnBtYXRlaHVudGVyLmNvbQp8\naHR0cDovL3BtYXRlaHVudGVyLmNvbQoucG1hdGVzLmNvbQp8fHBvMmIuY29tCnBv\nYmllcmFteS50b3AKIS0tfHxwb2Nvby5vcmcKfHxwb2RpY3Rpb25hcnkuY29tCi5w\nb2tlcnN0YXJzLmNvbQp8fHBva2Vyc3RhcnMuY29tCi5wb2tlcnN0YXJzLm5ldAp6\naC5wb2tlcnN0cmF0ZWd5LmNvbQpwb2xpdGljYWxjaGluYS5vcmcKcG9saXRpY2Fs\nY29uc3VsdGF0aW9uLm9yZwoucG9saXRpc2NhbGVzLm5ldAp8fHBvbG9uaWV4LmNv\nbQoucG9seW1lcmhrLmNvbQp8aHR0cDovL3BvbHltZXJoay5jb20KLnBvcG8udHcK\nIS0tfHxwb3B1bGFycGFnZXMubmV0Cnx8cG9wdm90ZS5oawoucG9weWFyZC5jb20K\nfHxwb3B5YXJkLm9yZwoucG9ybi5jb20KLnBvcm4yLmNvbQoucG9ybjUuY29tCi5w\nb3JuYmFzZS5vcmcKLnBvcm5lcmJyb3MuY29tCnx8cG9ybmhkLmNvbQoucG9ybmhv\nc3QuY29tCi5wb3JuaHViLmNvbQp8fHBvcm5odWIuY29tCi5wb3JuaHViZGV1dHNj\naC5uZXQKfGh0dHA6Ly9wb3JuaHViZGV1dHNjaC5uZXQKfHxwb3JubW0ubmV0Ci5w\nb3Jub3hvLmNvbQoucG9ybnJhcGlkc2hhcmUuY29tCnx8cG9ybnJhcGlkc2hhcmUu\nY29tCi5wb3Juc2hhcmluZy5jb20KfGh0dHA6Ly9wb3Juc2hhcmluZy5jb20KLnBv\ncm5zb2NrZXQuY29tCi5wb3Juc3RhcmNsdWIuY29tCnx8cG9ybnN0YXJjbHViLmNv\nbQoucG9ybnR1YmUuY29tCi5wb3JudHViZW5ld3MuY29tCi5wb3JudHZibG9nLmNv\nbQp8fHBvcm50dmJsb2cuY29tCi5wb3JudmlzaXQuY29tCi5wb3J0YWJsZXZwbi5u\nbAp8fHBvc2tvdGFuZXdzLmNvbQoucG9zdDAxLmNvbQoucG9zdDc2LmNvbQp8fHBv\nc3Q3Ni5jb20KLnBvc3Q4NTIuY29tCnBvc3RhZHVsdC5jb20KLnBvc3RpbWcub3Jn\nCnx8cG90dnBuLmNvbQp8fHBvd2VyY3guY29tCi5wb3dlcnBob3RvLm9yZwp8fHd3\ndy5wb3dlcnBvaW50bmluamEuY29tCnx8cHJlc2lkZW50bGVlLnR3Cnx8Y2RuLnBy\naW50ZnJpZW5kbHkuY29tCi5wcml0dW5sLmNvbQpwcm92cG5hY2NvdW50cy5jb20K\nfHxwcm92cG5hY2NvdW50cy5jb20KLnByb3hmcmVlLmNvbQp8fHByb3hmcmVlLmNv\nbQpwcm94eWFub25pbW8uZXMKLnByb3h5bmV0d29yay5vcmcudWsKfHxwcm94eW5l\ndHdvcmsub3JnLnVrCnx8cHRzLm9yZy50dwoucHR0dmFuLm9yZwpwdWJ1LmNvbS50\ndwpwdWZmaW5icm93c2VyLmNvbQpwdXJlaW5zaWdodC5vcmcKLnB1c2hjaGluYXdh\nbGwuY29tCi5wdXR0eS5vcmcKfHxwdXR0eS5vcmcKCiEtLS0tLS0tLS0tLS0tUG9z\ndGVyb3VzLS0tLS0KfHxjYWxlYmVsc3Rvbi5jb20KfHxibG9nLmZpenppay5jb20K\nfHxuZi5pZC5hdQp8fHNvZ3JhZHkubWUKfHx2YXRuLm9yZwp8fHZlbnR1cmVzd2Vs\nbC5jb20KfHx3aGVyZWlzd2VybmVyLmNvbQoKLnBvd2VyLmNvbQp8fHBvd2VyLmNv\nbQpwb3dlcmFwcGxlLmNvbQp8fHBvd2VyYXBwbGUuY29tCnx8YWJjLnBwLnJ1Cmhl\naXgucHAucnUKfHxwcmF5Zm9yY2hpbmEubmV0Cnx8cHJlbWVmb3J3aW5kb3dzNy5j\nb20KfHxwcmVzZW50YXRpb256ZW4uY29tCnx8cHJlc3RpZ2UtYXYuY29tCnByaXNv\nbmVyLXN0YXRlLXNlY3JldC1qb3VybmFsLXByZW1pZXIKLnByaXNvbmVyYWxlcnQu\nY29tCnx8cHJpdHVubC5jb20KfHxwcml2YWN5Ym94LmRlCi5wcml2YXRlLmNvbS9o\nb21lCnx8cHJpdmF0ZWludGVybmV0YWNjZXNzLmNvbQpwcml2YXRlcGFzdGUuY29t\nCnx8cHJpdmF0ZXBhc3RlLmNvbQpwcml2YXRldHVubmVsLmNvbQp8fHByaXZhdGV0\ndW5uZWwuY29tCnx8cHJpdmF0ZXZwbi5jb20KfHxwcm9jb3B5dGlwcy5jb20KcHJv\ndmlkZW9jb2FsaXRpb24uY29tCnx8cHJvc2liZW4uZGUKcHJveGlmaWVyLmNvbQph\ncGkucHJveGxldC5jb20KfHxwcm94b21pdHJvbi5pbmZvCi5wcm94cG4uY29tCnx8\ncHJveHBuLmNvbQoucHJveHlsaXN0Lm9yZy51awp8fHByb3h5bGlzdC5vcmcudWsK\nLnByb3h5cHkubmV0Cnx8cHJveHlweS5uZXQKcHJveHlyb2FkLmNvbQoucHJveHl0\ndW5uZWwubmV0CiEtLTQwMyBtYXliZQp8fHByb3llY3RvY2x1YmVzLmNvbQpwcm96\nei5uZXQKcHNibG9nLm5hbWUKfHxwc2Jsb2cubmFtZQp8fHBzaXBob24uY2EKLnBz\naXBob24zLmNvbQp8fHBzaXBob24zLmNvbQoucHNpcGhvbnRvZGF5LmNvbQoucHR0\nLmNjCnx8cHR0LmNjCi5wdWZmc3RvcmUuY29tCi5wdXVrby5jb20KfHxwdWxsZm9s\naW8uY29tCi5wdW55dS5jb20vcHVueQp8fHB1cmVjb25jZXB0cy5uZXQKfHxwdXJl\naW5zaWdodC5vcmcKfHxwdXJlcGRmLmNvbQp8fHB1cmV2cG4uY29tCi5wdXJwbGVs\nb3R1cy5vcmcKLnB1cnN1ZXN0YXIuY29tCnx8cHVyc3Vlc3Rhci5jb20KLnB1c3N5\nc3BhY2UuY29tCi5wdXRpaG9tZS5vcmcKLnB1dGxvY2tlci5jb20vZmlsZQpwd25l\nZC5jb20KcHl0aG9uLmNvbQoucHl0aG9uLmNvbS50dwp8aHR0cDovL3B5dGhvbi5j\nb20udHcKcHl0aG9uaGFja2Vycy5jb20vcApzcy5weXRob25pYy5saWZlLwoKIS0t\nLS0tLS0tLS0tLS0tLS0tLS0tUVEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5x\nYW5vdGUuY29tCnx8cWFub3RlLmNvbQoucWdpcmwuY29tLnR3Cnx8cWlhbmRhby50\nb2RheQoucWktZ29uZy5tZQp8fHFpLWdvbmcubWUKIS0tIzkyMQp8fHFpYW5neW91\nLm9yZwoucWlkaWFuLmNhCi5xaWVua3Vlbi5vcmcKfHxxaWVua3Vlbi5vcmcKfHxx\naXdlbi5sdQpxaXhpYW5nbHUuY24KYmJzLnFtemRkLmNvbQoucWtzaGFyZS5jb20K\ncW9vcy5jb20KfHxxb29zLmNvbQpibG9nLnFvb3phLmhrL2RhZmVuZ3FpeGkKfHxl\nZmtzb2Z0LmNvbQp8fHFzdGF0dXMuY29tCnx8cXR3ZWV0ZXIuY29tCnx8cXRyYWMu\nZXUKLnF1YW5uZW5nc2hlbi5vcmcKfGh0dHA6Ly9xdWFubmVuZ3NoZW4ub3JnCnF1\nYW50dW1ib290ZXIubmV0Cnx8cXVpdGNjcC5uZXQKLnF1aXRjY3AubmV0Cnx8cXVp\ndGNjcC5vcmcKLnF1aXRjY3Aub3JnCi5xdW9yYS5jb20vQ2hpbmFzLUZ1dHVyZQou\ncXVyYW4uY29tCnxodHRwOi8vcXVyYW4uY29tCi5xdXJhbmV4cGxvcmVyLmNvbQpx\ndXNpOC5uZXQKLnF2b2R6eS5vcmcKbmVtZXNpczIucXgubmV0L3BhZ2VzL015RW5U\ndW5uZWwKcXhiYnMub3JnCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1SUi0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0KLnJhLmdnCnxodHRwOi8vcmEuZ2cvCi5yYWRpY2Fs\ncGFydHkub3JnCnx8cmFlbC5vcmcKcmFkaWNhbHBhcnR5Lm9yZwpyYWRpb2F1c3Ry\nYWxpYS5uZXQuYXUKLnJhZGlvaGlsaWdodC5uZXQKfHxyYWRpb2hpbGlnaHQubmV0\nCm9wbWwucmFkaW90aW1lLmNvbQp8fHJhZGlvdmF0aWNhbmEub3JnCnx8cmFkaW92\nbmNyLmNvbQp8fHJhZ2dlZGJhbm5lci5jb20KfHxyYWlkY2FsbC5jb20udHcKLnJh\naWR0YWxrLmNvbS50dwoucmFpbmJvd3BsYW4ub3JnL2Jicwp8aHR0cHM6Ly9yYWlu\nZHJvcC5pby8KLnJhaXpvamkub3IuanAKfGh0dHA6Ly9yYWl6b2ppLm9yLmpwCnJh\nbmd3YW5nLmJpegpyYW5nemVuLmNvbQpyYW5nemVuLm5ldApyYW5nemVuLm9yZwp8\naHR0cDovL2Jsb2cucmFueGlhbmcuY29tLwpyYW55dW5mZWkuY29tCnx8cmFueXVu\nZmVpLmNvbQoucmFwYnVsbC5uZXQKfGh0dHA6Ly9yYXBpZGdhdG9yLm5ldC8KfHxy\nYXBpZG1vdmllei5jb20KcmFwaWR2cG4uY29tCnx8cmFwaWR2cG4uY29tCi5yYXJl\nbW92aWUuY2MKfGh0dHA6Ly9yYXJlbW92aWUuY2MKLnJhcmVtb3ZpZS5uZXQKfGh0\ndHA6Ly9yYXJlbW92aWUubmV0Cnx8cmF3Z2l0LmNvbQp8fHJhd2dpdGh1Yi5jb20K\nIS0tLnJheWZtZS5jb20vYmJzCnx8cmF6eWJvYXJkLmNvbQpyY2luZXQuY2EKLnJl\nYWQxMDAuY29tCi5yZWFkaW5ndGltZXMuY29tLnR3Cnx8cmVhZGluZ3RpbWVzLmNv\nbS50dwp8fHJlYWRtb28uY29tCi5yZWFkeWRvd24uY29tCnxodHRwOi8vcmVhZHlk\nb3duLmNvbQoucmVhbGNvdXJhZ2Uub3JnCi5yZWFsaXR5a2luZ3MuY29tCnx8cmVh\nbGl0eWtpbmdzLmNvbQoucmVhbHJhcHRhbGsuY29tCi5yZWFsc2V4cGFzcy5jb20K\nLnJlY29yZGhpc3Rvcnkub3JnCi5yZWNvdmVyeS5vcmcudHcKfGh0dHA6Ly9vbmxp\nbmUucmVjb3Zlcnl2ZXJzaW9uLm9yZwp8fHJlY292ZXJ5dmVyc2lvbi5jb20udHcK\nfHxyZWQtbGFuZy5vcmcKcmVkYmFsbG9vbnNvbGlkYXJpdHkub3JnCi5yZWRjaGlu\nYWNuLm5ldAp8aHR0cDovL3JlZGNoaW5hY24ubmV0CnJlZGNoaW5hY24ub3JnCnJl\nZHR1YmUuY29tCnJlZmVyZXIudXMKfHxyZWZlcmVyLnVzCnx8cmVmbGVjdGl2ZWNv\nZGUuY29tCnJlbGF4YmJzLmNvbQoucmVsYXkuY29tLnR3Ci5yZWxlYXNlaW50ZXJu\nYXRpb25hbC5vcmcKcmVsaWdpb3VzdG9sZXJhbmNlLm9yZwpyZW5taW5iYW8uY29t\nCnx8cmVubWluYmFvLmNvbQoucmVueXVyZW5xdWFuLm9yZwp8fHJlbnl1cmVucXVh\nbi5vcmcKfGh0dHA6Ly9jZXJ0aWZpY2F0ZS5yZXZvY2F0aW9uY2hlY2suY29tCnN1\nYmFjbWUucmVyb3V0ZWQub3JnCnx8cmVzaWxpby5jb20KLnJldXRlcnMuY29tCnx8\ncmV1dGVycy5jb20KfHxyZXV0ZXJzbWVkaWEubmV0Ci5yZXZsZWZ0LmNvbQpyZXR3\nZWV0aXN0LmNvbQp8fHJldHdlZXRyYW5rLmNvbQohLS1jb25uZWN0ZWRjaGluYS5y\nZXV0ZXJzLmNvbQohLS18aHR0cDovL3d3dy5yZXV0ZXJzLmNvbS9uZXdzL3ZpZGVv\nCnJldnZlci5jb20KLnJmYS5vcmcKfHxyZmEub3JnCi5yZmFjaGluYS5jb20KLnJm\nYW1vYmlsZS5vcmcKcmZhd2ViLm9yZwp8fHJmZXJsLm9yZwoucmZpLmZyCnx8cmZp\nLmZyCnxodHRwOi8vcmZpLm15LwohLS0ucmhjbG91ZC5jb20KIS0tRWRnZWNhc3QK\nfGh0dHA6Ly92ZHMucmlnaHRzdGVyLmNvbS8KLnJpZ3BhLm9yZwoucmlsZXlndWlk\nZS5jb20KcmlrdS5tZS8KLnJpdG91a2kuanAKfHxyaXR0ZXIudmcKLnJsd2x3LmNv\nbQp8fHJsd2x3LmNvbQoucm1qZHcuY29tCi5ybWpkdzEzMi5pbmZvCi5yb2Fkc2hv\ndy5oawoucm9ib2ZvcmV4LmNvbQp8fHJvYnVzdG5lc3Npc2tleS5jb20KIS0tfHxy\nb2MtdGFpd2FuLm9yZwp8fHJvY2tldC1pbmMubmV0CnxodHRwOi8vd3d3Mi5yb2Nr\nZXRiYnMuY29tLzExL2Jicy5jZ2k/aWQ9NW11cwp8aHR0cDovL3d3dzIucm9ja2V0\nYmJzLmNvbS8xMS9iYnMuY2dpP2lkPWZyZWVtZ2wKIS0tfHxyb2NtcC5vcmcKfHxy\nb2pvLmNvbQp8fHJvbmpvbmVzd3JpdGVyLmNvbQp8fHJvbGlhLm5ldAoucm9vZG8u\nY29tCi5yb3NlY2hpbmEubmV0Ci5yb3R0ZW4uY29tCi5yc2Yub3JnCnx8cnNmLm9y\nZwoucnNmLWNoaW5lc2Uub3JnCnx8cnNmLWNoaW5lc2Uub3JnCi5yc2dhbWVuLm9y\nZwp8fHBob3NwaGF0aW9uMTMucnNzaW5nLmNvbQoucnNzbWVtZS5jb20KfHxyc3Nt\nZW1lLmNvbQp8fHJ0YWxhYmVsLm9yZwoucnRoay5oawp8aHR0cDovL3J0aGsuaGsK\nLnJ0aGsub3JnLmhrCnxodHRwOi8vcnRoay5vcmcuaGsKLnJ0aS5vcmcudHcKfHxy\ndGkub3JnLnR3Ci5ydHljbWlubmVzb3RhLm9yZwoucnVhbnlpZmVuZy5jb20vYmxv\nZypzb21lX3dheXNfdG9fYnJlYWtfdGhlX2dyZWF0X2ZpcmV3YWxsCnJ1a29yLm9y\nZwoucnVuYnR4LmNvbQoucnVzaGJlZS5jb20KLnJ1dGVuLmNvbS50dwpydXR1YmUu\ncnUKLnJ1eWlzZWVrLmNvbQoucnhoai5uZXQKfGh0dHA6Ly9yeGhqLm5ldAoKIS0t\nLS0tLS0tLS0tLS0tLS0tLS0tU1MtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5z\nMXMxczEuY29tCnx8cy1jdXRlLmNvbQoucy1kcmFnb24ub3JnCnx8czFoZW5nLmNv\nbQp8aHR0cDovL3d3dy5zNG1pbmlhcmNoaXZlLmNvbQp8fHM4Zm9ydW0uY29tCmNk\nbjEubHAuc2Fib29tLmNvbQp8fHNhY2tzLmNvbQpzYWNvbS5oawp8fHNhY29tLmhr\nCnx8c2FkcGFuZGEudXMKLnNhZmVydnBuLmNvbQp8fHNhZmVydnBuLmNvbQouc2Fp\nbnR5Y3VsdHVyZS5jb20KfGh0dHA6Ly9zYWludHljdWx0dXJlLmNvbQouc2FpcS5t\nZQp8fHNhaXEubWUKfHxzYWt1cmFsaXZlLmNvbQouc2FreWEub3JnCi5zYWx2YXRp\nb24ub3JnLmhrCnx8c2FsdmF0aW9uLm9yZy5oawouc2FtYWlyLnJ1L3Byb3h5L3R5\ncGUtMDEKLnNhbWJob3RhLm9yZwouY24uc2FuZHNjb3RhaWNlbnRyYWwuY29tCnxo\ndHRwOi8vY24uc2FuZHNjb3RhaWNlbnRyYWwuY29tCi5zYW5taW4uY29tLnR3CnNh\ncGlrYWNodS5uZXQKc2F2ZW1lZGlhLmNvbQp8fHNhdmV0aGVzb3VuZHMuaW5mbwou\nc2F2ZXRpYmV0LmRlCnx8c2F2ZXRpYmV0LmRlCnNhdmV0aWJldC5mcgpzYXZldGli\nZXQubmwKLnNhdmV0aWJldC5vcmcKfHxzYXZldGliZXQub3JnCnNhdmV0aWJldC5y\ndQouc2F2ZXRpYmV0c3RvcmUub3JnCnx8c2F2ZXRpYmV0c3RvcmUub3JnCnNhdmV2\naWQuY29tCnx8c2F5Mi5pbmZvCi5zYm1lLm1lCnxodHRwOi8vc2JtZS5tZQouc2Jz\nLmNvbS5hdS95b3VybGFuZ3VhZ2UKLnNjYXNpbm8uY29tCnxodHRwOi8vd3d3LnNj\naWVuY2VtYWcub3JnL2NvbnRlbnQvMzQ0LzYxODcvOTUzCi5zY2llbmNlbmV0cy5j\nb20KLnNjbXAuY29tCnx8c2NtcC5jb20KLnNjbXBjaGluZXNlLmNvbQp8fHNjcmFt\nYmxlLmlvCi5zY3JpYmQuY29tCnx8c2NyaWJkLmNvbQp8fHNjcmlwdHNwb3QuY29t\nCnNlYXB1ZmYuY29tCmRvbWFpbmhlbHAuc2VhcmNoLmNvbQouc2VhcmNodHJ1dGgu\nY29tCnNlY3JldGNoaW5hLmNvbQp8fHNlY3JldGNoaW5hLmNvbQp8fHNlY3JldGdh\ncmRlbi5ubwouc2VjcmV0c2xpbmUuYml6Cnx8c2VjcmV0c2xpbmUuYml6Cnx8c2Vj\ndXJldHVubmVsLmNvbQpzZWN1cml0eWluYWJveC5vcmcKfGh0dHBzOi8vc2VjdXJp\ndHlpbmFib3gub3JnCi5zZWN1cml0eWtpc3MuY29tCnx8c2VjdXJpdHlraXNzLmNv\nbQp8fHNlZWQ0Lm1lCm5ld3Muc2VlaHVhLmNvbQpzZWVzbWljLmNvbQp8fHNlZXZw\nbi5jb20KfHxzZWV6b25lLm5ldApzZWppZS5jb20KLnNlbmRzcGFjZS5jb20KfGh0\ndHA6Ly90d2VldHMuc2VyYXBoLm1lLwpzZXNhd2UubmV0Cnx8c2VzYXdlLm5ldAou\nc2VzYXdlLm9yZwp8fHNldGh3a2xlaW4ubmV0Ci5zZXRuLmNvbQouc2V0dHYuY29t\nLnR3CmZvcnVtLnNldHR5LmNvbS50dwouc2V2ZW5sb2FkLmNvbQp8fHNldmVubG9h\nZC5jb20KLnNleC5jb20KLnNleC0xMS5jb20KfHxzZXgzLmNvbQp8fHNleDguY2MK\nLnNleGFuZHN1Ym1pc3Npb24uY29tCi5zZXhib3QuY29tCi5zZXhodS5jb20KLnNl\neGh1YW5nLmNvbQpzZXhpbnNleC5uZXQKfHxzZXhpbnNleC5uZXQKLnNleHR2eC5j\nb20KCiEtLUlQIG9mIFNleEluU2V4CjY3LjIyMC45MS4xNQo2Ny4yMjAuOTEuMTgK\nNjcuMjIwLjkxLjIzCgp8aHR0cDovLyouc2YubmV0Ci5zZmlsZXlkeS5jb20KfHxz\nZnNoaWJhby5jb20KLnNmdGluZGlhLm9yZwouc2Z0dWsub3JnCnx8c2Z0dWsub3Jn\nCnx8c2hhZGV5b3V2cG4uY29tCnNoYWRvdy5tYQouc2hhZG93c2t5Lnh5egouc2hh\nZG93c29ja3MuYXNpYQp8fHd3dy5zaGFkb3dzb2Nrcy5jb20KLnNoYWRvd3NvY2tz\nLmNvbQp8fHNoYWRvd3NvY2tzLmNvbS5oawouc2hhZG93c29ja3Mub3JnCnx8c2hh\nZG93c29ja3Mub3JnCnx8c2hhZG93c29ja3Mtci5jb20KfGh0dHA6Ly9jbi5zaGFm\nYXFuYS5jb20KLnNoYW1iYWxhcG9zdC5jb20KLnNoYW1iaGFsYXN1bi5jb20KLnNo\nYW5nZmFuZy5vcmcKfHxzaGFuZ2Zhbmcub3JnCnNoYXBlc2VydmljZXMuY29tCi5z\naGFyZWJlZS5jb20KfHxzaGFyZWNvb2wub3JnCiEtLXx8c2hhcmtkb2xwaGluLmNv\nbQpzaGFycGRhaWx5LmNvbS5oawp8fHNoYXJwZGFpbHkuY29tLmhrCi5zaGFycGRh\naWx5LmhrCi5zaGFycGRhaWx5LnR3Ci5zaGF0LXRpYmV0LmNvbQpzaGVpa3llcm1h\nbWkuY29tCi5zaGVsbGZpcmUuZGUKfHxzaGVsbGZpcmUuZGUKLnNoZW5zaG91Lm9y\nZwpzaGVueXVuLmNvbQpzaGVueXVucGVyZm9ybWluZ2FydHMub3JnCnx8c2hlbnl1\nbnBlcmZvcm1pbmdhcnRzLm9yZwpzaGVuemhvdWZpbG0uY29tCnx8c2hlbnpob3Vm\naWxtLmNvbQp8fHNoZXJhYmd5YWx0c2VuLmNvbQouc2hpYXR2Lm5ldAouc2hpY2hl\nbmcub3JnCnNoaW55Y2hhbi5jb20Kc2hpcGNhbW91ZmxhZ2UuY29tCi5zaGlyZXlp\nc2h1bmppYW4uY29tCi5zaGl0YW90di5vcmcKfHxzaGl4aWFvLm9yZwp8fHNoaXpo\nYW8ub3JnCnNoaXpoYW8ub3JnCnNoa3Nwci5tb2JpL2RhYnIKfHxzaG9kYW5ocS5j\nb20KfHxzaG9vc2h0aW1lLmNvbQouc2hvcDIwMDAuY29tLnR3Ci5zaG9wcGluZy5j\nb20KLnNob3doYW90dS5jb20KLnNob3d0aW1lLmpwCi5zaHV0dGVyc3RvY2suY29t\nCnx8c2h1dHRlcnN0b2NrLmNvbQpjaC5zaHZvb25nLmNvbQouc2h3Y2h1cmNoLm9y\nZwp8fHd3dy5zaHdjaHVyY2gub3JnCi5zaHdjaHVyY2gzLmNvbQp8aHR0cDovL3No\nd2NodXJjaDMuY29tCi5zaWRkaGFydGhhc2ludGVudC5vcmcKfHxzaWRlbGluZXNu\nZXdzLmNvbQouc2lkZWxpbmVzc3BvcnRzZWF0ZXJ5LmNvbQouc2lqaWh1aXN1by5j\nbHViCi5zaWppaHVpc3VvLmNvbQouc2lsa2Jvb2suY29tCnx8c2ltYm9sb3N0d2l0\ndGVyLmNvbQpzaW1wbGVjZC5vcmcKfHxzaW1wbGVjZC5vcmcKQEB8fHNpbXBsZWNk\nLm1lCnNpbXBsZXByb2R1Y3Rpdml0eWJsb2cuY29tCmJicy5zaW5hLmNvbS8KYmJz\nLnNpbmEuY29tJTJGCmJsb2cuc2luYS5jb20udHcKZGFpbHluZXdzLnNpbmEuY29t\nLwpkYWlseW5ld3Muc2luYS5jb20lMkYKZm9ydW0uc2luYS5jb20uaGsKaG9tZS5z\naW5hLmNvbQp8fG1hZ2F6aW5lcy5zaW5hLmNvbS50dwpuZXdzLnNpbmEuY29tLmhr\nCm5ld3Muc2luYS5jb20udHcKbmV3cy5zaW5jaGV3LmNvbS5teQouc2luY2hldy5j\nb20ubXkvbm9kZS8KLnNpbmNoZXcuY29tLm15L3RheG9ub215L3Rlcm0KLnNpbmdh\ncG9yZXBvb2xzLmNvbS5zZwp8fHNpbmdhcG9yZXBvb2xzLmNvbS5zZwouc2luZ2Zv\ncnRpYmV0LmNvbQouc2luZ3Bhby5jb20uaGsKc2luZ3Rhby5jb20KfHxzaW5ndGFv\nLmNvbQpuZXdzLnNpbmd0YW8uY2EKLnNpbmd0YW91c2EuY29tCnx8c2luZ3Rhb3Vz\nYS5jb20KIS0tfHxjZHAuc2luaWNhLmVkdS50dwpzaW5vLW1vbnRobHkuY29tCnx8\nc2lub2Nhc3QuY29tCnNpbm9jaXNtLmNvbQpzaW5vbW9udHJlYWwuY2EKLnNpbm9u\nZXQuY2EKLnNpbm9waXR0LmluZm8KLnNpbm9hbnRzLmNvbQp8fHNpbm9hbnRzLmNv\nbQouc2lub3F1ZWJlYy5jb20KLnNpZXJyYWZyaWVuZHNvZnRpYmV0Lm9yZwpzaXMu\neHh4Cnx8c2lzMDAxLmNvbQpzaXMwMDEudXMKLnNpdGUydW5ibG9jay5jb20KfHxz\naXRlOTAubmV0Ci5zaXRlYnJvLnR3Cnx8c2l0ZWtyZWF0b3IuY29tCnx8c2l0ZWtz\nLnVrLnRvCnx8c2l0ZW1hcHMub3JnCi5zanJ0Lm9yZwp8aHR0cDovL3NqcnQub3Jn\nCnx8c2p1bS5jbgp8fHNrZXRjaGFwcHNvdXJjZXMuY29tCnx8c2tpbXR1YmUuY29t\nCnx8c2t5YmV0LmNvbQp8aHR0cDovL3VzZXJzLnNreW5ldC5iZS9yZXZlcy90aWJl\ndGhvbWUuaHRtbAouc2t5a2luZy5jb20udHcKYmJzLnNreWtpd2kuY29tCnxodHRw\nOi8vd3d3LnNreXBlLmNvbS9pbnRsLwp8aHR0cDovL3d3dy5za3lwZS5jb20vemgt\nSGFudAp8fHNreXZlZ2FzLmNvbQoueHNreXdhbGtlci5jb20KfHx4c2t5d2Fsa2Vy\nLmNvbQp8fHNreXh2cG4uY29tCm0uc2xhbmRyLm5ldAouc2xheXRpemxlLmNvbQou\nc2xlYXp5ZHJlYW0uY29tCnx8c2xoZW5nLmNvbQp8fHNsaWRlc2hhcmUubmV0CmZv\ncnVtLnNsaW1lLmNvbS50dwouc2xpbmtzZXQuY29tCnx8c2xpY2t2cG4uY29tCi5z\nbHV0bG9hZC5jb20KfHxzbWFydGRuc3Byb3h5LmNvbQouc21hcnRoaWRlLmNvbQp8\nfGFwcC5zbWFydG1haWxjbG91ZC5jb20Kc21jaGJvb2tzLmNvbQouc21oLmNvbS5h\ndS93b3JsZC9kZWF0aC1vZi1jaGluZXNlLXBsYXlib3ktbGVhdmVzLWZyZXNoLXNj\ncmF0Y2hlcy1pbi1wYXJ0eS1wYWludHdvcmstMjAxMjA5MDMtMjVhOHYKc21ocmlj\nLm9yZwouc21pdGguZWR1L2RhbGFpbGFtYQouc215eHkub3JnCiEtLVRPRE8tbm8t\naG9tZXBhZ2UKfHxzbmFwY2hhdC5jb20KLnNuYXB0dS5jb20KfHxzbmFwdHUuY29t\nCnx8c25kY2RuLmNvbQpzbmVha21lLm5ldApzbm93bGlvbnB1Yi5jb20KaG9tZS5z\nby1uZXQubmV0LnR3L3lpc2FfdHNhaQp8fHNvYy5taWwKLnNvY2tzLXByb3h5Lm5l\ndAp8fHNvY2tzLXByb3h5Lm5ldAouc29ja3NjYXA2NC5jb20KfHxzb2Nrc2xpc3Qu\nbmV0Ci5zb2NyZWMub3JnCnxodHRwOi8vc29jcmVjLm9yZwouc29kLmNvLmpwCi5z\nb2Z0ZXRoZXIub3JnCnx8c29mdGV0aGVyLm9yZwouc29mdGV0aGVyLWRvd25sb2Fk\nLmNvbQp8fHNvZnRldGhlci1kb3dubG9hZC5jb20KfHxjZG4uc29mdGxheWVyLm5l\ndAp8fHNvZ2NsdWIuY29tCnNvaGNyYWRpby5jb20KfHxzb2hjcmFkaW8uY29tCi5z\nb2ttaWwuY29tCnx8c29ydGluZy1hbGdvcml0aG1zLmNvbQouc29zdGliZXQub3Jn\nCi5zb3Vtby5pbmZvCnx8c291cC5pbwpAQHx8c3RhdGljLnNvdXAuaW8KLnNvYmVl\ncy5jb20KfHxzb2JlZXMuY29tCnNvY2lhbHdoYWxlLmNvbQouc29mdGV0aGVyLmNv\nLmpwCnx8c29mdHdhcmVieWNodWNrLmNvbQpibG9nLnNvZ29vLm9yZwpzb2gudHcK\nfHxzb2gudHcKc29oZnJhbmNlLm9yZwp8fHNvaGZyYW5jZS5vcmcKY2hpbmVzZS5z\nb2lmaW5kLmNvbQpzb2thbW9ubGluZS5jb20KLnNvbGlkYXJpdGV0aWJldC5vcmcK\nLnNvbGlkZmlsZXMuY29tCnx8c29tZWUuY29tCi5zb25namlhbmp1bi5jb20KfHxz\nb25namlhbmp1bi5jb20KLnNvbmljYmJzLmNjCi5zb25pZG9kZWxhZXNwZXJhbnph\nLm9yZwouc29wY2FzdC5jb20KLnNvcGNhc3Qub3JnCi5zb3Jhem9uZS5uZXQKfHxz\nb3Mub3JnCmJicy5zb3UtdG9uZy5vcmcKLnNvdWJvcnkuY29tCnxodHRwOi8vc291\nYm9yeS5jb20KLnNvdWwtcGx1cy5uZXQKLnNvdWxjYWxpYnVyaGVudGFpLm5ldAp8\nfHNvdWxjYWxpYnVyaGVudGFpLm5ldAp8fHNvdW5kY2xvdWQuY29tCiEtLXxodHRw\nczovL3NvdW5kY2xvdWQuY29tL3B1bmtnb2QKLnNvdW5kb2Zob3BlLmtyCnNvdW5k\nb2Zob3BlLm9yZwp8fHNvdW5kb2Zob3BlLm9yZwp8fHNvdXBvZm1lZGlhLmNvbQoh\nLS0uc291cmNlZm9yZ2UubmV0CiEtfGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQKfGh0\ndHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcCovc2hhZG93c29ja3NndWkvCi5zb3VyY2V3\nYWRpby5jb20Kc291dGhuZXdzLmNvbS50dwpzb3dlcnMub3JnLmhrCnx8d2x4LnNv\nd2lraS5uZXQKfHxzcGFua2JhbmcuY29tCi5zcGFua2luZ3R1YmUuY29tCi5zcGFu\na3dpcmUuY29tCnx8c3BiLmNvbQp8fHNwZWFrZXJkZWNrLmNvbQp8fHNwZWVkaWZ5\nLmNvbQpzcGVtLmF0Cnx8c3BlbmNlcnRpcHBpbmcuY29tCnx8c3BlbmRlZS5jb20K\nfHxzcGljZXZwbi5jb20KLnNwaWRlcm9hay5jb20KfHxzcGlkZXJvYWsuY29tCi5z\ncGlrZS5jb20KLnNwb3RmbHV4LmNvbQp8fHNwb3RmbHV4LmNvbQouc3ByaW5nNHUu\naW5mbwp8aHR0cDovL3NwcmluZzR1LmluZm8KfHxzcHJvdXRjb3JlLmNvbQp8fHNw\ncm94eS5pbmZvCnx8c3JvY2tldC51cwouc3MtbGluay5jb20KfHxzcy1saW5rLmNv\nbQouc3NnbG9iYWwuY28vd3AKfGh0dHA6Ly9zc2dsb2JhbC5jbwouc3NnbG9iYWwu\nbWUKfHxzc2g5MS5jb20KLnNzcHJvLm1sCnxodHRwOi8vc3Nwcm8ubWwKLnNzcnNo\nYXJlLmNvbQp8fHNzcnNoYXJlLmNvbQp8fHNzcy5jYW1wCiEtLXxodHRwOi8vY2Ru\nLnNzdGF0aWMubmV0Lwp8fHNzdG1sdC5tb2UKc3N0bWx0Lm5ldAp8fHNzdG1sdC5u\nZXQKfGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS91c2Vycy84OTUyNDUKLnN0YWdl\nNjQuaGsKfHxzdGFnZTY0LmhrCnx8c3RhbmR1cGZvcnRpYmV0Lm9yZwpzdGFuZm9y\nZC5lZHUvZ3JvdXAvZmFsdW4KdXNpbmZvLnN0YXRlLmdvdgp8fHN0YXR1ZW9mZGVt\nb2NyYWN5Lm9yZwouc3RhcmZpc2hmeC5jb20KLnN0YXJwMnAuY29tCnx8c3RhcnAy\ncC5jb20KLnN0YXJ0cGFnZS5jb20KfHxzdGFydHBhZ2UuY29tCi5zdGFydHVwbGl2\naW5nY2hpbmEuY29tCnxodHRwOi8vc3RhcnR1cGxpdmluZ2NoaW5hLmNvbQp8fHN0\nYXRpYy1lY29ub21pc3QuY29tCnx8c3RjLmNvbS5zYQp8fHN0ZWVsLXN0b3JtLmNv\nbQouc3RlZ2Fub3MuY29tCnx8c3RlZ2Fub3MuY29tCi5zdGVnYW5vcy5uZXQKLnN0\nZXBjaGluYS5jb20KIS0tfHxzdGVwbWFuaWEuY29tCm55LnN0Z2xvYmFsbGluay5j\nb20KaGQuc3RoZWFkbGluZS5jb20vbmV3cy9yZWFsdGltZQpzdGhvby5jb20KfHxz\ndGhvby5jb20KLnN0aWNrYW0uY29tCnN0aWNrZXJhY3Rpb24uY29tL3Nlc2F3ZQou\nc3RpbGVwcm9qZWN0LmNvbQouc3RvLmNjCi5zdG9wb3JnYW5oYXJ2ZXN0aW5nLm9y\nZwp8fHN0b3JhZ2VuZXdzbGV0dGVyLmNvbQouc3Rvcm0ubWcKfHxzdG9ybS5tZwou\nc3RvcHRpYmV0Y3Jpc2lzLm5ldAp8fHN0b3B0aWJldGNyaXNpcy5uZXQKfHxzdG9y\naWZ5LmNvbQouc3Rvcm1tZWRpYWdyb3VwLmNvbQp8fHN0b3dlYm95ZC5jb20Kc3Ry\nYW5hYmcuY29tCnx8c3RyYXBsZXNzZGlsZG8uY29tCnx8c3RyZWFtaW5ndGhlLm5l\ndApzdHJlZW1hLmNvbS90di9OVERUVl9DaGluZXNlCmNuLnN0cmVldHZvaWNlLmNv\nbS9hcnRpY2xlCmNuLnN0cmVldHZvaWNlLmNvbS9kaWFyeQpjbjIuc3RyZWV0dm9p\nY2UuY29tCnR3LnN0cmVldHZvaWNlLmNvbQouc3RyaWtpbmdseS5jb20KfHxzdHJv\nbmd2cG4uY29tCi5zdHJvbmd3aW5kcHJlc3MuY29tCi5zdHVkZW50LnR3L2RiCnx8\nc3R1ZGVudHNmb3JhZnJlZXRpYmV0Lm9yZwp8fHN0dW1ibGV1cG9uLmNvbQpzdHVw\naWR2aWRlb3MuY29tCi5zdWNjZXNzZm4uY29tCnBhbmFtYXBhcGVycy5zdWVkZGV1\ndHNjaGUuZGUKLnN1Z2Fyc3luYy5jb20KfHxzdWdhcnN5bmMuY29tCi5zdWdvYmJz\nLmNvbQp8fHN1Z3VtaXJ1MTguY29tCnx8c3Vpc3NsLmNvbQpzdW1taWZ5LmNvbQou\nc3VtcmFuZG8uY29tCnx8c3VtcmFuZG8uY29tCnN1bjE5MTEuY29tCi5zdW5wb3Ju\nby5jb20KfHxzdW5tZWRpYS5jYQp8fHN1bnBvcm5vLmNvbQouc3Vuc2t5Zm9ydW0u\nY29tCi5zdW50YS5jb20udHcKLnN1bnZwbi5uZXQKLnN1b2x1by5vcmcKLnN1cGVy\nZnJlZXZwbi5jb20KLnN1cGVydnBuLm5ldAp8fHN1cGVydnBuLm5ldAouc3VwZXJ6\nb29pLmNvbQp8aHR0cDovL3N1cGVyem9vaS5jb20KLnN1cHBpZy5uZXQKLnN1cHJl\nbWVtYXN0ZXJ0di5jb20KfGh0dHA6Ly9zdXByZW1lbWFzdGVydHYuY29tCi5zdXJm\nZWFzeS5jb20KfHxzdXJmZWFzeS5jb20KLnN1cmZlYXN5LmNvbS5hdQp8aHR0cDov\nL3N1cmZlYXN5LmNvbS5hdQp8fHN1cnJlbmRlcmF0MjAubmV0Ci5zdXlhbmdnLmNv\nbQp8aHR0cDovL3N1eWFuZ2cuY29tCi5zdnNmeC5jb20KLnN3aXNzaW5mby5jaAp8\nfHN3aXNzaW5mby5jaAouc3dpc3N2cG4ubmV0Cnx8c3dpc3N2cG4ubmV0CnN3aXRj\naHZwbi5uZXQKfHxzd2l0Y2h2cG4ubmV0Ci5zeWRuZXl0b2RheS5jb20KfHxzeWRu\nZXl0b2RheS5jb20KLnN5bGZvdW5kYXRpb24ub3JnCnx8c3luY2JhY2suY29tCnN5\nc3Jlc2NjZC5vcmcKLnN5dGVzLm5ldApibG9nLnN5eDg2LmNvbS8yMDA5LzA5L3B1\nZmYKYmxvZy5zeXg4Ni5jbi8yMDA5LzA5L3B1ZmYKLnN6YmJzLm5ldAouc3pldG93\nYWgub3JnLmhrCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1UVC0tLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLS0KfHx0LWcuY29tCi50MzUuY29tCi50NjZ5LmNvbQp8fHQ2Nnku\nY29tCi50YWEtdXNhLm9yZwp8aHR0cDovL3RhYS11c2Eub3JnCi50YWF6ZS50dwp8\nfHRhYXplLnR3CnxodHRwOi8vd3d3LnRhYmxlc2dlbmVyYXRvci5jb20vCnRhYnR0\nZXIuanAKLnRhY2VtLm9yZwoudGFjb25ldC5jb20udHcKfHx0YWVkcC5vcmcudHcK\nLnRhZm0ub3JnCi50YWd3YS5vcmcuYXUKdGFnd2Fsay5jb20KfHx0YWd3YWxrLmNv\nbQp0YWhyLm9yZy50dwoudGFpcGVpc29jaWV0eS5vcmcKfHx0YWlwZWlzb2NpZXR5\nLm9yZwoudGFpd2FuYmlibGUuY29tCi50YWl3YW5jb24uY29tCi50YWl3YW5kYWls\neS5uZXQKfHx0YWl3YW5kYWlseS5uZXQKLnRhaXdhbmRjLm9yZwohLS18fHRhaXdh\nbmVtYmFzc3kub3JnCi50YWl3YW5qdXN0aWNlLmNvbQp0YWl3YW5raXNzLmNvbQp0\nYWl3YW5uYXRpb24uY29tCnRhaXdhbm5hdGlvbi5jb20udHcKfHx0YWl3YW5uY2Yu\nb3JnLnR3Cnx8dGFpd2FubmV3cy5jb20udHcKfGh0dHA6Ly93d3cudGFpd2Fub25s\naW5lLmNjLwohLS18fHRhaXdhbnRvZGF5LnR3CnRhaXdhbnRwLm5ldAp8fHRhaXdh\nbnR0Lm9yZy50dwp0YWl3YW51cy5uZXQKdGFpd2FueWVzLmNvbQp0YWl3YW4tc2V4\nLmNvbQoudGFsazg1My5jb20KLnRhbGtib3hhcHAuY29tCnx8dGFsa2JveGFwcC5j\nb20KLnRhbGtjYy5jb20KfHx0YWxrY2MuY29tCi50YWxrb25seS5uZXQKfHx0YWxr\nb25seS5uZXQKfHx0YW1pYW9kZS50awp8fHRhbmMub3JnCnRhbmdiZW4uY29tCi50\nYW5ncmVuLnVzCi50YW9pc20ubmV0CnxodHRwOi8vdGFvaXNtLm5ldAoudGFvbHVu\nLmluZm8KfHx0YW9sdW4uaW5mbwoudGFwYXRhbGsuY29tCnx8dGFwYXRhbGsuY29t\nCmJsb2cudGFyYWdhbmEuY29tCi50YXNjbi5jb20uYXUKfHx0YXVwLm5ldAp8aHR0\ncDovL3d3dy50YXVwLm9yZy50dwoudGF3ZWV0LmNvbQp8fHRhd2VldC5jb20KLnRi\nY29sbGVnZS5vcmcKfHx0YmNvbGxlZ2Uub3JnCi50Ymkub3JnLmhrCi50Ymljbi5v\ncmcKLnRianl0Lm9yZwp8fHRicGljLmluZm8KLnRicmMub3JnCnRicy1yYWluYm93\nLm9yZwoudGJzZWMub3JnCnx8dGJzZWMub3JnCnRic2traW5hYmFsdS5wYWdlLnRs\nCi50YnNtYWxheXNpYS5vcmcKLnRic24ub3JnCnx8dGJzbi5vcmcKLnRic3NlYXR0\nbGUub3JnCi50YnNzcWgub3JnCnxodHRwOi8vdGJzc3FoLm9yZwp0YnN3ZC5vcmcK\nLnRidGVtcGxlLm9yZy51awoudGJ0aG91c3Rvbi5vcmcKLnRjY3dvbmxpbmUub3Jn\nCi50Y2V3Zi5vcmcKdGNocmQub3JnCnRjbnluai5vcmcKfHx0Y3BzcGVlZC5jbwou\ndGNwc3BlZWQuY29tCnx8dGNwc3BlZWQuY29tCi50Y3NvZmJjLm9yZwoudGNzb3Zp\nLm9yZwoudGRtLmNvbS5tbwp0ZWFtYW1lcmljYW55LmNvbQohLS1PVkgKfHx0ZWNo\ndml6Lm5ldAp8fHRlY2suaW4KLnRlZW5pZWZ1Y2submV0CnRlZW5zaW5hc2lhLmNv\nbQoudGVsZWNvbXNwYWNlLmNvbQp8fHRlbGVncmFwaC5jby51awoudGVuYWN5LmNv\nbQp8fHRlbnppbnBhbG1vLmNvbQoudGV3Lm9yZwoudGhhaWNuLmNvbQp8fHRoZWF0\ncnVtLWJlbGxpLmNvbQp0aGVibGVtaXNoLmNvbQp8fHRoZWJjb21wbGV4LmNvbQou\ndGhlYm9icy5jb20KfHx0aGVib2JzLmNvbQoudGhlY2hpbmFiZWF0Lm9yZwp8aHR0\ncDovL3d3dy50aGVjaGluYXN0b3J5Lm9yZy95ZWFyYm9va3MveWVhcmJvb2stMjAx\nMi8KLnRoZWRhbGFpbGFtYW1vdmllLmNvbQp8aHR0cDovL3RoZWRhbGFpbGFtYW1v\ndmllLmNvbQp8fHRoZWR3LnVzCnRoZWZyb250aWVyLmhrL3RmCmNuLnRoZWdheS5j\nb20KfGh0dHA6Ly90aGVnaW9pdGluaG9jLnZuLwoudGhlZ2x5LmNvbQoudGhlaG90\ncy5pbmZvCnRoZWhvdXNlbmV3cy5jb20KfHx0aGVodW4ubmV0Ci50aGVpbml0aXVt\nLmNvbQp8fHRoZWluaXRpdW0uY29tCi50aGVuZXdzbGVucy5jb20KfHx0aGVuZXdz\nbGVucy5jb20KLnRoZXBpcmF0ZWJheS5vcmcKfHx0aGVwaXJhdGViYXkub3JnCiEt\nLXx8dGhlcGlyYXRlYmF5LnNlCi50aGVwb3JuZHVkZS5jb20KfHx0aGVwb3JuZHVk\nZS5jb20KfHx0aGVwb3J0YWx3aWtpLmNvbQp0aGVyZWFsbG92ZS5rcgp0aGVyb2Nr\nLm5ldC5uegp0aGVzcGVlZGVyLmNvbQp8fHRoZXN0YW5kbmV3cy5jb20KdGhldGli\nZXRjZW50ZXIub3JnCnRoZXRpYmV0Y29ubmVjdGlvbi5vcmcKLnRoZXRpYmV0bXVz\nZXVtLm9yZwoudGhldGliZXRwb3N0LmNvbQp8fHRoZXRpYmV0cG9zdC5jb20KIS0t\nVG9yCnx8dGhldGluaGF0LmNvbQp0aGV0cm90c2t5bW92aWUuY29tCnRoZXZpdmVr\nc3BvdC5jb20KfHx0aGV3Z28ub3JnCi50aGV5bmMuY29tCnxodHRwOi8vdGhleW5j\nLmNvbQoudGhpbmtpbmd0YWl3YW4uY29tCi50aGlzYXYuY29tCnxodHRwOi8vdGhp\nc2F2LmNvbQoudGhsaWIub3JnCnx8dGhvbWFzYmVybmhhcmQub3JnCi50aG9uZ2Ry\nZWFtcy5jb20KdGhyZWF0Y2hhb3MuY29tCnx8dGhyb3VnaG5pZ2h0c2ZpcmUuY29t\nCi50aHVtYnppbGxhLmNvbQp8fHRoeXdvcmRzLmNvbQoudGh5d29yZHMuY29tLnR3\nCnRpYW5hbm1lbm1vdGhlci5vcmcKLnRpYW5hbm1lbmR1aXpoaS5jb20KfHx0aWFu\nYW5tZW5kdWl6aGkuY29tCnx8dGlhbmFubWVudW5pdi5jb20KfHx0aWFuYW5tZW51\nbml2Lm5ldAp8fHRpYW5kaXhpbmcub3JnCi50aWFuaHVheXVhbi5jb20KLnRpYW5s\nYXdvZmZpY2UuY29tCnx8dGlhbnRpLmlvCnRpYW50aWJvb2tzLm9yZwp8fHRpYW50\naWJvb2tzLm9yZwp0aWFueWFudG9uZy5vcmcuY24KLnRpYW56aHUub3JnCi50aWJl\ndC5hdAp0aWJldC5jYQoudGliZXQuY29tCnx8dGliZXQuY29tCnRpYmV0LmZyCi50\naWJldC5uZXQKfHx0aWJldC5uZXQKdGliZXQubnUKLnRpYmV0Lm9yZwp8fHRpYmV0\nLm9yZwoudGliZXQuc2sKdGliZXQub3JnLnR3Ci50aWJldC50bwoudGliZXQtZW52\nb3kuZXUKfHx0aWJldC1lbnZveS5ldQoudGliZXQtZm91bmRhdGlvbi5vcmcKLnRp\nYmV0LWhvdXNlLXRydXN0LmNvLnVrCnRpYmV0LWluZm8ubmV0CnRpYmV0LWluaXRp\nYXRpdmUuZGUKfHx0aWJldC1pbml0aWF0aXZlLmRlCi50aWJldC1tdW5pY2guZGUK\nLnRpYmV0M3JkcG9sZS5vcmcKfGh0dHA6Ly90aWJldDNyZHBvbGUub3JnCnRpYmV0\nYWN0aW9uLm5ldAp8fHRpYmV0YWN0aW9uLm5ldAoudGliZXRhaWQub3JnCnRpYmV0\nYWxrLmNvbQoudGliZXRhbi5mcgp0aWJldGFuLWFsbGlhbmNlLm9yZwoudGliZXRh\nbmFydHMub3JnCi50aWJldGFuYnVkZGhpc3RpbnN0aXR1dGUub3JnCnxodHRwOi8v\ndGliZXRhbmJ1ZGRoaXN0aW5zdGl0dXRlLm9yZwp0aWJldGFuY29tbXVuaXR5Lm9y\nZwoudGliZXRhbmpvdXJuYWwuY29tCi50aWJldGFubGFuZ3VhZ2Uub3JnCi50aWJl\ndGFubGliZXJhdGlvbi5vcmcKfHx0aWJldGFubGliZXJhdGlvbi5vcmcKLnRpYmV0\nY29sbGVjdGlvbi5jb20KLnRpYmV0YW5haWRwcm9qZWN0Lm9yZwoudGliZXRhbmNv\nbW11bml0eXVrLm5ldAp8aHR0cDovL3RpYmV0YW5jb21tdW5pdHl1ay5uZXQKdGli\nZXRhbmN1bHR1cmUub3JnCnRpYmV0YW5mZW1pbmlzdGNvbGxlY3RpdmUub3JnCi50\naWJldGFucGFpbnRpbmdzLmNvbQoudGliZXRhbnBob3RvcHJvamVjdC5jb20KLnRp\nYmV0YW5wb2xpdGljYWxyZXZpZXcub3JnCi50aWJldGFucmV2aWV3Lm5ldAp8aHR0\ncDovL3RpYmV0YW5zcG9ydHMub3JnCi50aWJldGFud29tZW4ub3JnCnxodHRwOi8v\ndGliZXRhbndvbWVuLm9yZwoudGliZXRhbnlvdXRoLm9yZwoudGliZXRhbnlvdXRo\nY29uZ3Jlc3Mub3JnCnx8dGliZXRhbnlvdXRoY29uZ3Jlc3Mub3JnCi50aWJldGNo\nYXJpdHkuZGsKdGliZXRjaGFyaXR5LmluCi50aWJldGNoaWxkLm9yZwoudGliZXRj\naXR5LmNvbQoudGliZXRjb3Jwcy5vcmcKLnRpYmV0ZXhwcmVzcy5uZXQKfGh0dHA6\nLy90aWJldGV4cHJlc3MubmV0CnRpYmV0Zm9jdXMuY29tCnRpYmV0ZnVuZC5vcmcK\nLnRpYmV0Z2VybWFueS5jb20KfHx0aWJldGdlcm1hbnkuZGUKLnRpYmV0aGF1cy5j\nb20KLnRpYmV0aGVyaXRhZ2VmdW5kLm9yZwp0aWJldGhvdXNlLmpwCnRpYmV0aG91\nc2Uub3JnCnx8dGliZXRob3VzZS51cwoudGliZXRpbmZvbmV0Lm5ldAoudGliZXRq\ndXN0aWNlLm9yZwoudGliZXRrb21pdGUuZGsKfGh0dHA6Ly90aWJldG11c2V1bS5v\ncmcKdGliZXRuZXR3b3JrLm9yZwp8fHRpYmV0bmV0d29yay5vcmcKLnRpYmV0b2Zm\naWNlLmNoCnxodHRwOi8vdGliZXRvZmZpY2UuY2gKdGliZXRvZmZpY2UuZXUKdGli\nZXRvZmZpY2Uub3JnCnRpYmV0b25saW5lLmNvbQp8fHRpYmV0b25saW5lLmNvbQou\ndGliZXRvZmZpY2UuY29tLmF1CnxodHRwOi8vdGliZXRvZmZpY2UuY29tLmF1Cnx8\ndGliZXRvbmxpbmUudHYKLnRpYmV0b25saW5lLnR2Ci50aWJldG9yYWxoaXN0b3J5\nLm9yZwp8aHR0cDovL3RpYmV0b3JhbGhpc3Rvcnkub3JnCi50aWJldHBvbGljeS5l\ndQoudGliZXRyZWxpZWZmdW5kLmNvLnVrCnRpYmV0c2l0ZXMuY29tCi50aWJldHNv\nY2lldHkuY29tCnx8dGliZXRzb2NpZXR5LmNvbQoudGliZXRzdW4uY29tCi50aWJl\ndHN1cHBvcnRncm91cC5vcmcKfGh0dHA6Ly90aWJldHN1cHBvcnRncm91cC5vcmcK\nLnRpYmV0c3dpc3MuY2gKLnRpYmV0dGVsZWdyYXBoLmNvbQp0aWJldHRpbWVzLm5l\ndAp8fHRpYmV0d3JpdGVzLm9yZwoudGlja2V0LmNvbS50dwoudGlnZXJ2cG4uY29t\nCnx8dGlnZXJ2cG4uY29tCi50aW1kaXIuY29tCnxodHRwOi8vdGltZGlyLmNvbQou\ndGltZS5jb20KfGh0dHA6Ly90aW1lLmNvbQohLS0udGltZS5jb20vdGltZS90aW1l\nMTAwL2xlYWRlcnMvcHJvZmlsZS9yZWJlbAohLS0udGltZS5jb20vdGltZS9zcGVj\naWFscy9wYWNrYWdlcy9hcnRpY2xlLzAsMjg4MDQKIS0tLnRpbWUuY29tL3RpbWUv\nbWFnYXppbmUKLnRpbXNhaC5jb20KfHxibG9nLnRpbmV5LmNvbQp0aW50dWMxMDEu\nY29tCi50aW55LmNjCnxodHRwOi8vdGlueS5jYwp0aW55Y2hhdC5jb20KfHx0aW55\ncGFzdGUuY29tCi50aXN0b3J5LmNvbQp8fHRrY3MtY29sbGlucy5jb20KLnRtYWdh\nemluZS5jb20KfHx0bWFnYXppbmUuY29tCi50bWRmaXNoLmNvbQp8aHR0cDovL3Rt\naS5tZQoudG1wcC5vcmcKfGh0dHA6Ly90bXBwLm9yZwoudG5hZmxpeC5jb20KfHx0\nbmFmbGl4LmNvbQoudG5ncm5vdy5jb20KLnRuZ3Jub3cubmV0Ci50bnAub3JnCnxo\ndHRwOi8vdG5wLm9yZwoudG8tcG9ybm8uY29tCnx8dG8tcG9ybm8uY29tCnRvZ2V0\ndGVyLmNvbQoudG9reW8tMjQ3LmNvbQoudG9reW8taG90LmNvbQp8fHRva3lvLXBv\ncm4tdHViZS5jb20KfHx0b2t5b2NuLmNvbQp0dy50b21vbmV3cy5uZXQKLnRvbmdp\nbC5vci5rcgoudG9uby1va2EuanAKdG9ueXlhbi5uZXQKLnRvb2RvYy5jb20KdG9v\nbmVsLm5ldAp0b3A4MS53cwoudG9wbmV3cy5pbgoudG9wcG9ybnNpdGVzLmNvbQp8\naHR0cDovL3RvcHBvcm5zaXRlcy5jb20KLnRvcmd1YXJkLm5ldAp8fHRvcmd1YXJk\nLm5ldAp8fHRvcC50dgoudG9wc2hhcmV3YXJlLmNvbQoudG9wc3kuY29tCnx8dG9w\nc3kuY29tCnx8dG9wdGlwLmNhCnRvcmEudG8KLnRvcmNuLmNvbQoudG9ycHJvamVj\ndC5vcmcKfHx0b3Jwcm9qZWN0Lm9yZwp0b3JyZW50cHJpdmFjeS5jb20KfHx0b3Jy\nZW50cHJpdmFjeS5jb20KfGh0dHA6Ly90b3JyZW50cHJvamVjdC5zZQp8fHRvcnJl\nbnR5Lm9yZwp8fHRvcnJlbnR6LmV1Cnx8dG9ydnBuLmNvbQp8fHRvdGFsdnBuLmNv\nbQoudG91dGlhb2FiYy5jb20KdG93bmdhaW4uY29tCnRveXBhcmsuaW4KdG95dHJh\nY3RvcnNob3cuY29tCi50cGFyZW50cy5vcmcKLnRwaS5vcmcudHcKfHx0cGkub3Jn\nLnR3CnRyYWZmaWNoYXVzLmNvbQp8fHRyYW5zcGFyZW5jeS5vcmcKfHx0cmVlbWFs\nbC5jb20udHcKdHJlbmRzbWFwLmNvbQp8fHRyZW5kc21hcC5jb20KLnRyaWFsb2Zj\nY3Aub3JnCnx8dHJpYWxvZmNjcC5vcmcKLnRyaW1vbmRpLmRlL1NETEUKLnRyb3V3\nLm5sCnxodHRwOi8vdHJvdXcubmwKLnRydC5uZXQudHIKdHJ0Yy5jb20udHcKLnRy\ndWVidWRkaGEtbWQub3JnCnxodHRwOi8vdHJ1ZWJ1ZGRoYS1tZC5vcmcKdHJ1bHll\ncmdvbm9taWMuY29tCi50cnV0aDEwMS5jby50dgp8aHR0cDovL3RydXRoMTAxLmNv\nLnR2Ci50cnV0aG9udG91ci5vcmcKfGh0dHA6Ly90cnV0aG9udG91ci5vcmcKLnRy\ndXZlby5jb20KLnRzY3R2Lm5ldAoudHNlbXR1bGt1LmNvbQp0c3F1YXJlLnR2Ci50\nc3Uub3JnLnR3CnRzdW5hZ2FydW1vbi5jb20KIS0tfGh0dHA6Ly93d3cudHN1cnUt\nYmlyZC5uZXQvCi50c2N0di5uZXQKfHx0dDEwNjkuY29tCi50dHRhbi5jb20KfHx0\ndHRhbi5jb20KYmIudHR2LmNvbS50dy9iYgp0dTg5NjQuY29tCi50dWJhaG9saWMu\nY29tCi50dWJlLmNvbQp0dWJlOC5jb20KfHx0dWJlOC5jb20KLnR1YmU5MTEuY29t\nCnx8dHViZTkxMS5jb20KLnR1YmVjdXAuY29tCi50dWJlZ2Fscy5jb20KLnR1YmVp\nc2xhbS5jb20KfGh0dHA6Ly90dWJlaXNsYW0uY29tCi50dWJlc3RhY2suY29tCnx8\ndHViZXdvbGYuY29tCi50dWliZWl0dS5uZXQKdHVpZGFuZy5uZXQKLnR1aWRhbmcu\nb3JnCnx8dHVpZGFuZy5vcmcKLnR1aWRhbmcuc2UKYmJzLnR1aXR1aS5pbmZvCi50\ndW11dGFuemkuY29tCnxodHRwOi8vdHVtdXRhbnppLmNvbQp8fHR1bXZpZXcuY29t\nCi50dW5laW4uY29tCnxodHRwOi8vdHVuZWluLmNvbQp8fHR1bm5lbGJlYXIuY29t\nCi50dW5uZWxyLmNvbQp8fHR1bm5lbHIuY29tCi50dW84LmJsdWUKfHx0dW84LmJs\ndWUKLnR1bzguY2MKLnR1bzguY2x1Ygp8fHR1bzguY2x1YgoudHVvOC5maXQKLnR1\nbzguaGsKLnR1bzguaW4KLnR1bzgubmluamEKLnR1bzgub3JnCnx8dHVvOC5maXQK\nfHx0dW84Lm9yZwoudHVvOC5wdwp8aHR0cDovL3R1bzgucHcKfHx0dW84LnJlZAou\ndHVvOC5zcGFjZQp0dWl0d2l0LmNvbQoudHVyYW5zYW0ub3JnCi50dXJib2JpdC5u\nZXQKfGh0dHA6Ly90dXJib2JpdC5uZXQKLnR1cmJvaGlkZS5jb20KfHx0dXJib2hp\nZGUuY29tCi50dXNoeWNhc2guY29tCnxodHRwOi8vdHVzaHljYXNoLmNvbQp8fGFw\ncC50dXRhbm90YS5jb20KLnR1dnBuLmNvbQp8fHR1dnBuLmNvbQp8aHR0cDovL3R1\nemFpamlkaS5jb20KfGh0dHA6Ly8qLnR1emFpamlkaS5jb20KLnR3MDEub3JnCnxo\ndHRwOi8vdHcwMS5vcmcKCiEtLS1UdW1ibHItLS0KLnR1bWJsci5jb20KfHx0dW1i\nbHIuY29tCiEtLUBAfHxhc3NldHMudHVtYmxyLmNvbQohLS1AQHx8ZGF0YS50dW1i\nbHIuY29tCiEtLUBAfHxtZWRpYS50dW1ibHIuY29tCiEtLUBAfHxzdGF0aWMudHVt\nYmxyLmNvbQohLS1AQHx8d3d3LnR1bWJsci5jb20KfHxsZWNsb3VkLm5ldAp8aHR0\ncDovL2Nvc21pYy5tb25hci5jaAp8fHNsdXRtb29uYmVhbS5jb20KfGh0dHA6Ly9i\nbG9nLnNveWxlbnQuY29tCgoudHYuY29tCnxodHRwOi8vdHYuY29tCnR2YW50cy5j\nb20KZm9ydW0udHZiLmNvbQpuZXdzLnR2Yi5jb20vbGlzdC93b3JsZApuZXdzLnR2\nYi5jb20vbG9jYWwKbmV3cy50dmJzLmNvbS50dwoudHZib3hub3cuY29tCnxodHRw\nOi8vdHZib3hub3cuY29tLwp0dmlkZXIuY29tCi50dm1vc3QuY29tLmhrCi50dnBs\nYXl2aWRlb3MuY29tCnx8dHZ1bmV0d29ya3MuY29tCi50dy1ibG9nLmNvbQp8aHR0\ncHM6Ly90dy1ibG9nLmNvbQoudHctbnBvLm9yZwoudHdhaXR0ZXIuY29tCnR3YXBw\nZXJrZWVwZXIuY29tCnx8dHdhcHBlcmtlZXBlci5jb20KfHx0d2F1ZC5pbwoudHdh\ndWQuaW8KLnR3YXZpLmNvbQoudHdiYnMubmV0LnR3CnR3YmJzLm9yZwp0d2Jicy50\ndwp8fHR3YmxvZ2dlci5jb20KdHdlZXBtYWcuY29tCi50d2VlcG1sLm9yZwp8fHR3\nZWVwbWwub3JnCi50d2VldGJhY2t1cC5jb20KfHx0d2VldGJhY2t1cC5jb20KdHdl\nZXRib2FyZC5jb20KfHx0d2VldGJvYXJkLmNvbQoudHdlZXRib25lci5iaXoKfHx0\nd2VldGJvbmVyLmJpegoudHdlZXRjcy5jb20KfGh0dHA6Ly90d2VldGNzLmNvbQp8\naHR0cDovL2RlY2subHkKIS0tIE9wZXJhdGlvbiBkaXNjb250aW51ZWQKIS0tfHx0\nd2VldGUubmV0CiEtLW0udHdlZXRlLm5ldAp8fG10dy50bAp8fHR3ZWV0ZWR0aW1l\ncy5jb20KIS0tIE9wZXJhdGlvbiBkaXNjb250aW51ZWQKIS0tdHdlZXRtZW1lLmNv\nbQp8fHR3ZWV0bXlsYXN0LmZtCnR3ZWV0cGhvdG8uY29tCnx8dHdlZXRwaG90by5j\nb20KfHx0d2VldHJhbnMuY29tCnR3ZWV0cmVlLmNvbQp8fHR3ZWV0cmVlLmNvbQou\ndHdlZXR0dW5uZWwuY29tCnx8dHdlZXR0dW5uZWwuY29tCnx8dHdlZXR3YWxseS5j\nb20KdHdlZXR5bWFpbC5jb20KfHx0d2VsdmUudG9kYXkKLnR3ZWV6Lm5ldAp8aHR0\ncDovL3R3ZWV6Lm5ldAp8fHR3ZnRwLm9yZwp8fHR3Z3JlYXRkYWlseS5jb20KdHdp\nYmFzZS5jb20KLnR3aWJibGUuZGUKfHx0d2liYmxlLmRlCnR3aWJib24uY29tCnx8\ndHdpYnMuY29tCi50d2ljb3VudHJ5Lm9yZwp8aHR0cDovL3R3aWNvdW50cnkub3Jn\nCnR3aWNzeS5jb20KLnR3aWVuZHMuY29tCnxodHRwOi8vdHdpZW5kcy5jb20KLnR3\naWZhbi5jb20KfGh0dHA6Ly90d2lmYW4uY29tCnR3aWZmby5jb20KfHx0d2lmZm8u\nY29tCi50d2lsaWdodHNleC5jb20KdHdpbG9nLm9yZwp0d2ltYm93LmNvbQp8fHR3\naW5kZXh4LmNvbQp0d2lwcGxlLmpwCnx8dHdpcHBsZS5qcAp8fHR3aXAubWUKdHdp\nc2hvcnQuY29tCnx8dHdpc2hvcnQuY29tCnR3aXN0YXIuY2MKfHx0d2lzdGVyLm5l\ndC5jbwp8fHR3aXN0ZXJpby5jb20KdHdpc3Rlcm5vdy5jb20KdHdpc3RvcnkubmV0\nCnR3aXRicm93c2VyLm5ldAp8fHR3aXRjYXVzZS5jb20KfHx0d2l0Z2V0aGVyLmNv\nbQp8fHR3aWdnaXQub3JnCnR3aXRnb28uY29tCnR3aXRpcS5jb20KfHx0d2l0aXEu\nY29tCi50d2l0bG9uZ2VyLmNvbQp8fHR3aXRsb25nZXIuY29tCnxodHRwOi8vdGwu\nZ2QvCnR3aXRtYW5pYS5jb20KdHdpdG9hc3Rlci5jb20KfHx0d2l0b2FzdGVyLmNv\nbQp8fHR3aXRvbm1zbi5jb20KIS0tU2FtZSBJUAoudHdpdDJkLmNvbQp8fHR3aXQy\nZC5jb20KLnR3aXRzdGF0LmNvbQp8fHR3aXRzdGF0LmNvbQp8fGZpcnN0Zml2ZWZv\nbGxvd2Vycy5jb20KfHxyZXR3ZWV0ZWZmZWN0LmNvbQp8fHR3ZWVwbGlrZS5tZQp8\nfHR3ZWVwZ3VpZGUuY29tCnx8dHVyYm90d2l0dGVyLmNvbQoudHdpdHZpZC5jb20K\nfHx0d2l0dmlkLmNvbQp8aHR0cDovL3R3dC50bAp0d2l0dGJvdC5uZXQKfHxhZHMt\ndHdpdHRlci5jb20KfHx0d3R0ci5jb20KfHx0d2l0dGVyNGoub3JnCi50d2l0dGVy\nY291bnRlci5jb20KfHx0d2l0dGVyY291bnRlci5jb20KdHdpdHRlcmZlZWQuY29t\nCi50d2l0dGVyZ2FkZ2V0LmNvbQp8fHR3aXR0ZXJnYWRnZXQuY29tCi50d2l0dGVy\na3IuY29tCnx8dHdpdHRlcmtyLmNvbQp8fHR3aXR0ZXJtYWlsLmNvbQp8fHR3aXR0\nZXJyaWZpYy5jb20KdHdpdHRlcnRpbS5lcwp8fHR3aXR0ZXJ0aW0uZXMKdHdpdHRo\nYXQuY29tCnx8dHdpdHR1cmsuY29tCi50d2l0dHVybHkuY29tCnx8dHdpdHR1cmx5\nLmNvbQoudHdpdHphcC5jb20KdHdpeWlhLmNvbQp8fHR3c3Rhci5uZXQKLnR3dGty\nLmNvbQp8aHR0cDovL3R3dGtyLmNvbQoudHdub3J0aC5vcmcudHcKdHdza3lwZS5j\nb20KdHd0cmxhbmQuY29tCnR3dXJsLm5sCi50d3lhYy5vcmcKfHx0d3lhYy5vcmcK\nLnR4eHguY29tCi50eWNvb2wuY29tCnx8dHljb29sLmNvbQoKIS0tdHlwZXBhZAp8\nfHR5cGVwYWQuY29tCkBAfHx3d3cudHlwZXBhZC5jb20KQEB8fHN0YXRpYy50eXBl\ncGFkLmNvbQp8fGJsb2cuZXhwb2Z1dHVyZXMuY29tCnx8bGVnYWx0ZWNoLmxhdy5j\nb20KfHxibG9ncy50YW1wYWJheS5jb20KfHxjb250ZXN0cy50d2lsaW8uY29tCiEt\nbGF3cHJvZmVzc29ycy50eXBlcGFkLmNvbS9jaGluYV9sYXdfcHJvZgoKIS0tLS0t\nLS0tLS0tLS1Ud2l0ZXNlLS0tLS0KLmVtYnIuaW4KfHxlbWJyLmluCgohLS0tLS0t\nLS0tLS0tLS0tLS0tLS1VVS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLnU5dW4u\nY29tCnx8dTl1bi5jb20KLnViZGRucy5vcmcKfGh0dHA6Ly91YmRkbnMub3JnCnx8\ndWJlcnByb3h5Lm5ldAoudWMtamFwYW4ub3JnCnx8dWMtamFwYW4ub3JnCi5zcmNm\nLnVjYW0ub3JnL3NhbG9uLwp8aHR0cDovL2NoaW5hLnVjYW5ld3MuY29tLwp8fHVj\nZGMxOTk4Lm9yZwp8aHR0cDovL2h1bSoudWNoaWNhZ28uZWR1L2ZhY3VsdHkveXdh\nbmcvaGlzdG9yeQp8fHVkZXJ6by5pdAoudWRuLmNvbQp8fHVkbi5jb20KfHx1ZG4u\nY29tLnR3CnVkbmJray5jb20vYmJzCnx8dWZvcmFkaW8uY29tLnR3CnVmcmVldnBu\nLmNvbQoudWdvLmNvbQohLS1naHMKfHx1aGR3YWxscGFwZXJzLm9yZwp8fHVocnAu\nb3JnCi51aWdodXIubmwKfHx1aWdodXIubmwKdWlnaHVyYml6Lm5ldAoudWxpa2Uu\nbmV0CnVrY2RwLmNvLnVrCnVrbGlmZXJhZGlvLmNvLnVrCnx8dWtsaWZlcmFkaW8u\nY28udWsKdWx0cmF2cG4uZnIKfHx1bHRyYXZwbi5mcgp1bHRyYXhzLmNvbQp1bWlj\naC5lZHUvfmZhbHVuCnx8dW5ibG9jay5jbi5jb20KLnVuYmxvY2tlci55dAp1bmJs\nb2NrLXVzLmNvbQp8fHVuYmxvY2stdXMuY29tCi51bmJsb2NrZG1tLmNvbQp8aHR0\ncDovL3VuYmxvY2tkbW0uY29tCnx8dW5ibG9ja3NpdC5lcwp1bmN5Y2xvbWVkaWEu\nb3JnCi51bmN5Y2xvcGVkaWEuaGsvd2lraQp8aHR0cDovL3VuY3ljbG9wZWRpYS5o\nawohLS11bmN5Y2xvcGVkaWEuaW5mbwp8aHR0cDovL3VuY3ljbG9wZWRpYS50dwp1\nbmRlcndvb2RhbW1vLmNvbQp8fHVuZGVyd29vZGFtbW8uY29tCnx8dW5ob2x5a25p\nZ2h0LmNvbQoudW5pLmNjCnx8Y2xkci51bmljb2RlLm9yZwoudW5pZmljYXRpb24u\nbmV0Ci51bmlmaWNhdGlvbi5vcmcudHcKfHx1bmlydWxlLmNsb3VkCi51bml0ZWRz\nb2NpYWxwcmVzcy5jb20KLnVuaXgxMDAuY29tCnx8dW5rbm93bnNwYWNlLm9yZwou\ndW5vZGVkb3MuY29tCnVucG8ub3JnCi51bnRyYWNlYWJsZS51cwp8aHR0cDovL3Vu\ndHJhY2VhYmxlLnVzCnx8dW9jbi5vcmcKdG9yLnVwZGF0ZXN0YXIuY29tCi51cGhv\nbGRqdXN0aWNlLm9yZwoudXBsb2FkNHUuaW5mbwp1cGxvYWRlZC5uZXQvZmlsZQp8\naHR0cDovL3VwbG9hZGVkLm5ldC9maWxlCnxodHRwOi8vdXBsb2FkZWQudG8vZmls\nZQoudXBsb2Fkc3RhdGlvbi5jb20vZmlsZQoudXBtZWRpYS5tZwp8fHVwbWVkaWEu\nbWcKLnVwb3JuaWEuY29tCnxodHRwOi8vdXBvcm5pYS5jb20KfHx1cHJveHkub3Jn\nCnxodHRwOi8vdG9yLmNuLnVwdG9kb3duLmNvbS8KLnVwd2lsbC5vcmcKdXI3cy5j\nb20KfHx1cmJhbnN1cnZpdmFsLmNvbQpteXNoYXJlLnVybC5jb20udHcvCnx8dXJs\nYm9yZy5jb20KfHx1cmxwYXJzZXIuY29tCnVzLnRvCnx8dXNhY24uY29tCi51c2Fp\ncC5ldQp8fHVzYWlwLmV1CmRhbGFpbGFtYS51c2MuZWR1CmlpcGRpZ2l0YWwudXNl\nbWJhc3N5Lmdvdgp8fHVzZmsubWlsCnx8dXNtYS5lZHUKfHx1c21jLm1pbAoudXNv\nY2N0bi5jb20KfGh0dHA6Ly90YXJyLnVzcHRvLmdvdi8KfHx0c2RyLnVzcHRvLmdv\ndgoudXN0cmVhbS50dgp8fHVzdHJlYW0udHYKIS0tfHx1c3R3cmFwLmluZm8KLnVz\ndW5pdGVkbmV3cy5jb20KfGh0dHA6Ly91c3VuaXRlZG5ld3MuY29tCnVzdXMuY2MK\nLnV0b3BpYW5wYWwuY29tCnx8dXRvcGlhbnBhbC5jb20KLnV1LWdnLmNvbQoudXZ3\neHl6Lnh5egp8fHV2d3h5ei54eXoKLnV3YW50cy5jb20KLnV3YW50cy5uZXQKdXln\naHVyLmNvLnVrCnxodHRwOi8vdXlnaHVyLWoub3JnCnx8dXlnaHVyYW1lcmljYW4u\nb3JnCi51eWdodXJjYW5hZGlhbnNvY2lldHkub3JnCi51eWdodXJlbnNlbWJsZS5j\nby51awp8fHV5Z2h1cmNvbmdyZXNzLm9yZwoudXlnaHVycGVuLm9yZwoudXlnaHVy\ncHJlc3MuY29tCnxodHRwczovL3V5Z2h1cnByZXNzLmNvbQoudXlnaHVyc3R1ZGll\ncy5vcmcKfGh0dHA6Ly91eWdodXJzdHVkaWVzLm9yZwp1eWd1ci5vcmcKfGh0dHA6\nLy91eW1hYXJpcC5jb20vCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1WVi0tLS0tLS0t\nLS0tLS0tLS0tLS0tLS0tLS0KLnYycmF5LmNvbQp8fHYycmF5LmNvbQoudmFuMDAx\nLmNvbQoudmFuNjk4LmNvbQoudmFuZW11LmNuCi52YW5pbGxhLWpwLmNvbQoudmFu\ncGVvcGxlLmNvbQp2YW5za3kuY29tCnx8dmF0aWNhbm5ld3MudmEKfHx2Y2Ytb25s\naW5lLm9yZwp8fHZjZmJ1aWxkZXIub3JnCi52ZWdhc3JlZC5jb20KLnZlbGthZXBv\nY2hhLnNrCi52ZW5iYnMuY29tCi52ZW5jaGluYS5jb20KLnZlbmV0aWFubWFjYW8u\nY29tCnx8dmVuZXRpYW5tYWNhby5jb20KdmVvaC5jb20KbXlzaXRlLnZlcml6b24u\nbmV0CnZlcm1vbnR0aWJldC5vcmcKLnZlcnNhdnBuLmNvbQp8fHZlcnNhdnBuLmNv\nbQp8fHZlcnlicy5jb20KLnZmdC5jb20udHcKLnZpYmVyLmNvbQp8fHZpYmVyLmNv\nbQoudmljYS5pbmZvCi52aWN0aW1zb2Zjb21tdW5pc20ub3JnCnxodHRwOi8vdmlj\ndGltc29mY29tbXVuaXNtLm9yZwp8fHZpZC5tZQp8fHZpZGJsZS5jb20KdmlkZW9i\nYW0uY29tCnx8dmlkZW9iYW0uY29tCi52aWRlb2RldGVjdGl2ZS5jb20KLnZpZGVv\nbWVnYS50dgp8fHZpZGVvbWVnYS50dgoudmlkZW9tby5jb20KdmlkZW9wZWRpYXdv\ncmxkLmNvbQoudmlkZW9wcmVzcy5jb20KLnZpZGluZm8ub3JnL3ZpZGVvCnZpZXRk\nYWlreW5ndXllbi5jb20KLnZpamF5YXRlbXBsZS5vcmcKdmltZW8uY29tCnx8dmlt\nZW8uY29tCnx8dmltcGVyYXRvci5vcmcKfHx2aW5jbmQuY29tCnx8dmlubmlldi5j\nb20KfGh0dHA6Ly93d3cubGliLnZpcmdpbmlhLmVkdS9hcmVhLXN0dWRpZXMvVGli\nZXQvdGliZXQuaHRtbAoudmlydHVhbHJlYWxwb3JuLmNvbQp8fHZpcnR1YWxyZWFs\ncG9ybi5jb20KdmlzaWJsZXR3ZWV0cy5jb20KfGh0dHA6Ly9ueS52aXNpb250aW1l\ncy5jb20KLnZpdGFsMjQ3Lm9yZwp8fHZpdS5jb20KLnZpdmFoZW50YWk0dS5uZXQK\nLnZpdmF0dWJlLmNvbQoudml2dGhvbWFzLmNvbQp8fHZpdnRob21hcy5jb20KLnZq\nYXYuY29tCnx8dmphdi5jb20KLnZqbWVkaWEuY29tLmhrCi52bGxjcy5vcmcKfGh0\ndHA6Ly92bGxjcy5vcmcKfHx2bWl4Y29yZS5jb20KfHx2bmV0LmxpbmsKY24udm9h\nLm1vYmkKdHcudm9hLm1vYmkKLnZvYWNoaW5lc2VibG9nLmNvbQp8fHZvYWNoaW5l\nc2VibG9nLmNvbQp2b2FnZC5jb20KLnZvYWNhbnRvbmVzZS5jb20KfHx2b2FjYW50\nb25lc2UuY29tCnZvYWNoaW5lc2UuY29tCnx8dm9hY2hpbmVzZS5jb20KLnZvYW5l\nd3MuY29tCnx8dm9hbmV3cy5jb20Kdm9hdGliZXRhbi5jb20KfHx2b2F0aWJldGFu\nLmNvbQoudm9hdGliZXRhbmVuZ2xpc2guY29tCnx8dm9hdGliZXRhbmVuZ2xpc2gu\nY29tCi52b2NhdGl2LmNvbQp2b2NuLnR2Ci52b3Qub3JnCnx8dm90Lm9yZwoudm92\nbzIwMDAuY29tCnxodHRwOi8vdm92bzIwMDAuY29tCi52b3hlci5jb20KfHx2b3hl\nci5jb20KLnZveS5jb20KfHx2cG4uYWMKLnZwbjRhbGwuY29tCnx8dnBuNGFsbC5j\nb20KLnZwbmFjY291bnQub3JnCnxodHRwOi8vdnBuYWNjb3VudC5vcmcKLnZwbmFj\nY291bnRzLmNvbQp8fHZwbmFjY291bnRzLmNvbQoudnBuY29tcGFyaXNvbi5vcmcK\nLnZwbmN1cC5jb20KfHx2cG5jdXAuY29tCnZwbmJvb2suY29tCi52cG5jb3Vwb25z\nLmNvbQp8aHR0cDovL3ZwbmNvdXBvbnMuY29tCi52cG5kYWRhLmNvbQp8fHZwbmRh\nZGEuY29tCi52cG5mYW4uY29tCnZwbmZpcmUuY29tCi52cG5maXJlcy5iaXoKLnZw\nbmZvcmdhbWUubmV0Cnx8dnBuZm9yZ2FtZS5uZXQKfHx2cG5nYXRlLmpwCi52cG5n\nYXRlLm5ldAp8fHZwbmdhdGUubmV0Ci52cG5ncmF0aXMubmV0CnZwbmhxLmNvbQou\ndnBubWFzdGVyLmNvbQp8fHZwbm1hc3Rlci5jb20KLnZwbm1lbnRvci5jb20KfHx2\ncG5tZW50b3IuY29tCi52cG5pbmphLm5ldAp8fHZwbmluamEubmV0Ci52cG5pbnRv\ndWNoLmNvbQp8fHZwbmludG91Y2gubmV0CnZwbmphY2suY29tCnx8dnBuamFjay5j\nb20KLnZwbnBpY2suY29tCnx8dnBucGljay5jb20KfHx2cG5wb3AuY29tCnx8dnBu\ncHJvbmV0LmNvbQoudnBucmVhY3Rvci5jb20KfHx2cG5yZWFjdG9yLmNvbQp8fHZw\nbnJldmlld3ouY29tCi52cG5zZWN1cmUubWUKfHx2cG5zZWN1cmUubWUKLnZwbnNo\nYXphbS5jb20KfHx2cG5zaGF6YW0uY29tCi52cG5zaGllbGRhcHAuY29tCnx8dnBu\nc2hpZWxkYXBwLmNvbQoudnBuc3AuY29tCi52cG50cmFmZmljLmNvbQoudnBudHVu\nbmVsLmNvbQp8fHZwbnR1bm5lbC5jb20KLnZwbnVrLmluZm8KfHx2cG51ay5pbmZv\nCnx8dnBudW5saW1pdGVkYXBwLmNvbQoudnBudmlwLmNvbQp8fHZwbnZpcC5jb20K\nLnZwbndvcmxkd2lkZS5jb20KLnZwb3JuLmNvbQp8fHZwb3JuLmNvbQoudnBzZXIu\nbmV0CkBAfHx2cHNlci5uZXQKdnJhaWVzYWdlc3NlLm5ldAoudnJtdHIuY29tCnx8\ndnR1bm5lbC5jb20KfHx2dWt1LmNjCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1XVy0t\nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbGlzdHMudzMub3JnL2FyY2hpdmVzL3B1\nYmxpYwp8fHczc2Nob29scy5jb20KfHx3YWZmbGUxOTk5LmNvbQoud2FoYXMuY29t\nCi53YWlnYW9idS5jb20Kd2Fpa2V1bmcub3JnL3BocF93aW5kCi53YWlsYWlrZS5u\nZXQKLndhaXdhaWVyLmNvbQp8aHR0cDovL3dhaXdhaWVyLmNvbQp8fHdhbGxtYW1h\nLmNvbQp3YWxsb3Jub3Qub3JnCnx8d2FsbHBhcGVyY2FzYS5jb20KLndhbGxwcm94\neS5jb20KQEB8fHdhbGxwcm94eS5jb20uY24KfHx3YWx0ZXJtYXJ0aW4uY29tCnx8\nd2FsdGVybWFydGluLm9yZwp8fHd3dy53YW4tcHJlc3Mub3JnCnx8d2FuZGVyaW5n\naG9yc2UubmV0Cnx8d2FuZ2FmdS5uZXQKfHx3YW5namluYm8ub3JnCi53YW5namlu\nYm8ub3JnCndhbmdsaXhpb25nLmNvbQoud2FuZ28ub3JnCnx8d2FuZ28ub3JnCndh\nbmdydW9zaHVpLm5ldAp3d3cud2FuZ3J1b3dhbmcub3JnCndhbnQtZGFpbHkuY29t\nCndhcGVkaWEubW9iaS96aHNpbXAKfHx3YXNlbHByby5jb20KLndhdGNoaW5lc2Uu\nY29tCi53YXR0cGFkLmNvbQp8fHdhdHRwYWQuY29tCi5tYWt6aG91LndhcmVob3Vz\nZTMzMy5jb20Kd2FzaGVuZy5uZXQKLndhdGNoOHguY29tCnx8d2F0Y2hteWdmLm5l\ndAp8fHdhdi50dgoud2RmNS5jb20KLndlYXJlaGFpcnkuY29tCi53ZWFybi5jb20K\nfHx3ZWFybi5jb20KfGh0dHA6Ly9oa2NvYy53ZWF0aGVyLmNvbS5oawp8fGh1ZGF0\nb3JpcS53ZWIuaWQKfHx3ZWIycHJvamVjdC5uZXQKd2ViYmFuZy5uZXQKLndlYmV2\nYWRlci5vcmcKLndlYmZyZWVyLmNvbQp3ZWJsYWd1LmNvbQoud2ViamIub3JnCi53\nZWJydXNoLm5ldAp3ZWJzLXR2Lm5ldAoud2Vic2l0ZXB1bHNlLmNvbS9oZWxwL3Rl\nc3R0b29scy5jaGluYS10ZXN0CnxodHRwOi8vd3d3LndlYnNuYXByLmNvbQoud2Vi\nd2FycGVyLm5ldAp8aHR0cDovL3dlYndhcnBlci5uZXQKd2Vid29ya2VyZGFpbHku\nY29tCi53ZWVrbWFnLmluZm8KfHx3ZWZpZ2h0Y2Vuc29yc2hpcC5vcmcKLndlZm9u\nZy5jb20Kd2VpYm9sZWFrLmNvbQoud2VpaHVvLm9yZwp3ZWlqaW5nc2hlbmcub3Jn\nCi53ZWltaW5nLmluZm8KfHx3ZWltaW5nLmluZm8Kd2VpcXVhbndhbmcub3JnCnxo\ndHRwOi8vd2Vpc3VvLndzCi53ZWxvdmVjb2NrLmNvbQoud2VtaWdyYXRlLm9yZwp8\naHR0cDovL3dlbWlncmF0ZS5vcmcKd2VuZ2V3YW5nLmNvbQp8fHdlbmdld2FuZy5v\ncmcKLndlbmh1aS5jaAp8aHR0cDovL3RyYW5zLndlbndlaXBvLmNvbS9nYi8KLndl\nbnh1ZWNpdHkuY29tCnx8d2VueHVlY2l0eS5jb20KLndlbnl1bmNoYW8uY29tCnx8\nd2VueXVuY2hhby5jb20KLndlc3RjYS5jb20KfHx3ZXN0Y2EuY29tCnx8d2VzdGVy\nbndvbHZlcy5jb20KLndlc3RraXQubmV0Cnx8d2VzdHBvaW50LmVkdQoud2VzdGVy\nbnNodWdkZW5zb2NpZXR5Lm9yZwp3ZXRwdXNzeWdhbWVzLmNvbQoud2V0cGxhY2Uu\nY29tCndleGlhb2JvLm9yZwp8fHdleGlhb2JvLm9yZwp3ZXpoaXlvbmcub3JnCnx8\nd2V6b25lLm5ldAoud2ZvcnVtLmNvbQp8fHdmb3J1bS5jb20vCi53aGF0YmxvY2tl\nZC5jb20KfHx3aGF0YmxvY2tlZC5jb20KLndoZWF0c2VlZHMub3JnCnx8d2hlZWxv\nY2tzbGF0aW4uY29tCi53aGlwcGVkYXNzLmNvbQohLS18aHR0cDovL3doby5pcy8K\nLndob2VyLm5ldAp8fHdob2VyLm5ldAp3aG90YWxraW5nLmNvbQp3aHlsb3Zlci5j\nb20KfHx3aHl4Lm9yZwp8aHR0cDovL3poLmVjZG0ud2lraWEuY29tCnxodHRwOi8v\nZXZjaGsud2lraWEuY29tCmZxLndpa2lhLmNvbQp6aC5wdHRwZWRpYS53aWtpYS5j\nb20vd2lraS8lRTclQkYlOTIlRTUlOEMlODUlRTUlQUQlOTAlRTQlQjklOEIlRTQl\nQkElODIKY24udW5jeWNsb3BlZGlhLndpa2lhLmNvbQp6aC51bmN5Y2xvcGVkaWEu\nd2lraWEuY29tCnx8d2lraWxlYWtzLmNoCnx8d2lraWxlYWtzLmNvbQp8fHdpa2ls\nZWFrcy5kZQp8fHdpa2lsZWFrcy5ldQp8fHdpa2lsZWFrcy5sdQoud2lraWxlYWtz\nLm9yZwp8fHdpa2lsZWFrcy5vcmcKfHx3aWtpbGVha3MucGwKLndpa2lsZWFrcy1m\nb3J1bS5jb20Kd2lsZGFtbW8uY29tCi53aWxsaWFtaGlsbC5jb20KfHxjb2xsYXRl\ncmFsbXVyZGVyLmNvbQp8fGNvbGxhdGVyYWxtdXJkZXIub3JnCndpa2lsaXZyZXMu\naW5mby93aWtpLyVFOSU5QiVCNiVFNSU4NSVBQiVFNSVBRSVBQSVFNyVBQiVBMAp8\nfHdpa2ltYXBpYS5vcmcKCiEtLS0tLS0tLS0tLS0tV2lraXBlZGlhIFJlbGF0ZWQt\nLS0tLS0tLS0tLS0tCiEhRW1lcmdlbmN5IG5lZWQgb25seShJUC9Qb3J0IGJsb2Nr\nIHVzYWdlKSEhCiEtLS0tLS0wLS0tLS0tCiEtLXx8bWVkaWF3aWtpLm9yZwohLS1A\nQHx8bS5tZWRpYXdpa2kub3JnCiEtLS0tLS0xLS0tLS0tCiEtLXx8d2lraWRhdGEu\nb3JnCiEtLUBAfHxtLndpa2lkYXRhLm9yZwohLS0tLS0tMi0tLS0tLQohLS18fHdp\na2ltZWRpYS5vcmcKIS0tQEB8fGxpc3RzLndpa2ltZWRpYS5vcmcKIS0tQEB8fG0u\nd2lraW1lZGlhLm9yZwohLS1AQHx8cGhhYnJpY2F0b3Iud2lraW1lZGlhLm9yZwoh\nLS1AQHx8dXBsb2FkLndpa2ltZWRpYS5vcmcKIS0tQEB8fHdpa2l0ZWNoLndpa2lt\nZWRpYS5vcmcKIS0tLS0tLTMtLS0tLS0KIS0tfHx3aWtpYm9va3Mub3JnCiEtLUBA\nfHxtLndpa2lib29rcy5vcmcKIS0tLS0tLTQtLS0tLS0KIS0tfHx3aWtpdmVyc2l0\neS5vcmcKIS0tQEB8fG0ud2lraXZlcnNpdHkub3JnCiEtLS0tLS01LS0tLS0tCiEt\nLXx8d2lraXNvdXJjZS5vcmcKIS0tQEB8fG0ud2lraXNvdXJjZS5vcmcKfGh0dHA6\nLy96aC53aWtpc291cmNlLm9yZwohLS0tLS0tNi0tLS0tLQohLS18fHdpa2lxdW90\nZS5vcmcKIS0tQEB8fG0ud2lraXF1b3RlLm9yZwohLS0tLS0tNy0tLS0tLQohLS18\nfHdpa2luZXdzLm9yZwohLS1AQHx8bS53aWtpbmV3cy5vcmcKfHx6aC53aWtpbmV3\ncy5vcmcKIS0tLS0tLTgtLS0tLS0KIS0tfHx3aWtpdm95YWdlLm9yZwohLS1AQHx8\nbS53aWtpdm95YWdlLm9yZwohLS18aHR0cDovL3poLndpa2l2b3lhZ2Uub3JnCiEt\nLS0tLS05LS0tLS0tCiEtLXx8d2lrdGlvbmFyeS5vcmcKIS0tQEB8fG0ud2lrdGlv\nbmFyeS5vcmcKIS0tfGh0dHA6Ly96aC53aWt0aW9uYXJ5Lm9yZwohLS0tLS0xMC0t\nLS0tLQohLS18fHdpa2ltZWRpYWZvdW5kYXRpb24ub3JnCiEtLUBAfHxtLndpa2lt\nZWRpYWZvdW5kYXRpb24ub3JnCiEtLS0tTWFpbi0tLS0tCiEhLS18fGVuLndpa2lw\nZWRpYS5vcmcKIS0tfHx3aWtpcGVkaWEub3JnCnx8amEud2lraXBlZGlhLm9yZwoh\nIS0temgud2lraXBlZGlhLm9yZwohLS18fHpoLndpa2lwZWRpYS5vcmcKISEtLXx8\ndWcubS53aWtpcGVkaWEub3JnCiEhLS16aC5tLndpa2lwZWRpYS5vcmcKISEtLXxo\ndHRwczovL3poLm0ud2lraXBlZGlhLm9yZwohLS1AQHx8bS53aWtpcGVkaWEub3Jn\nCiEhLS18aHR0cHM6Ly96aC53aWtpcGVkaWEub3JnCiEtLU90aGVyIExhbmd1YWdl\ncyBvZiBXaWtpcGVkaWEKISEtLXd1dS53aWtpcGVkaWEub3JnCiEhLS18aHR0cHM6\nLy93dXUud2lraXBlZGlhLm9yZwohIS0temgteXVlLndpa2lwZWRpYS5vcmcKISEt\nLXxodHRwczovL3poLXl1ZS53aWtpcGVkaWEub3JnCiEhISBTdGFydGluZyB3aXRo\nICEhIGFyZSBwcmV2aW91cyBydWxlcyByZXBsYWNlZCBieToKfHx3aWtpcGVkaWEu\nb3JnCgp8fHdpa2l3aWtpLmpwCnx8Y2FzaW5vLndpbGxpYW1oaWxsLmNvbQp8fHNw\nb3J0cy53aWxsaWFtaGlsbC5jb20KfHx2ZWdhcy53aWxsaWFtaGlsbC5jb20KfHx3\naWxsdy5uZXQKfHx3aW5kb3dzcGhvbmVtZS5jb20KLndpbmRzY3JpYmUuY29tCnx8\nd2luZHNjcmliZS5jb20KfHxjb21tdW5pdHkud2luZHkuY29tCnx8d2luZ3kuc2l0\nZQp3aW5uaW5nMTEuY29tCndpbndoaXNwZXJzLmluZm8KfHx3aXJlZGJ5dGVzLmNv\nbQp8fHdpcmVkcGVuLmNvbQohLS18fHdpcmVzaGFyay5vcmcKLndpc2RvbXB1YnMu\nb3JnCi53aXNldmlkLmNvbQp8fHdpc2V2aWQuY29tCi53aXRuZXNzbGVldGVhY2hp\nbmcuY29tCi53aXRvcGlhLm5ldAoud2piay5vcmcKfHx3amJrLm9yZwp8aHR0cDov\nL3duLmNvbQoud25hY2cuY29tCi53bmFjZy5vcmcKLndvLnRjCnx8d29lc2VyLmNv\nbQp8aHR0cDovL3dvZXNlcm1pZGRsZS13YXkubmV0Lwoud29rYXIub3JnCnxodHRw\nOi8vd29rYXIub3JnCndvbGZheC5jb20KfHx3b2xmYXguY29tCnx8d29vbHlzcy5j\nb20Kd29vcGllLmpwCnx8d29vcGllLmpwCndvb3BpZS50dgp8fHdvb3BpZS50dgp8\nfHdvcmthdHJ1bmEuY29tCi53b3JrZXJkZW1vLm9yZy5oawoud29ya2VyZW1wb3dl\ncm1lbnQub3JnCnx8d29ya2Vyc3RoZWJpZy5uZXQKLndvcmxkY2F0Lm9yZwp3b3Js\nZGpvdXJuYWwuY29tCi53b3JsZHZwbi5uZXQKfHx3b3JsZHZwbi5uZXQKCnx8dmlk\nZW9wcmVzcy5jb20KLndvcmRwcmVzcy5jb20KfGh0dHA6Ly8qLndvcmRwcmVzcy5j\nb20KfHxjaGVuc2hhbjIwMDQyMDA1LndvcmRwcmVzcy5jb20KfHxjaGluYXZpZXcu\nd29yZHByZXNzLmNvbQp8fGNuYmJuZXdzLndvcmRwcmVzcy5jb20KfHxmcmVlZG9t\naW5mb25ldHdlYi53b3JkcHJlc3MuY29tCnx8aGthODk2NC53b3JkcHJlc3MuY29t\nCnx8aGthbmV3cy53b3JkcHJlc3MuY29tCnx8aHFzYm5ldC53b3JkcHJlc3MuY29t\nCnx8aHFzYm9ubGluZS53b3JkcHJlc3MuY29tCnx8aW52ZXN0aWdhdGluZy53b3Jk\ncHJlc3MuY29tCnx8am9ibmV3ZXJhLndvcmRwcmVzcy5jb20KfHxtaW5naHVpeXcu\nd29yZHByZXNzLmNvbQp8fHdvM3R0dC53b3JkcHJlc3MuY29tCnx8c3VqaWF0dW4u\nd29yZHByZXNzLmNvbQp8fHhpamllLndvcmRwcmVzcy5jb20KfHx3cC5jb20KCiEt\nfHx3b3Jtc2N1bHB0b3IuY29tCi53b3cuY29tCi53b3ctbGlmZS5uZXQKfHx3b3ds\nZWdhY3kubWwKfHx3b3dwb3JuLmNvbQp8fHdvd2dpcmxzLmNvbQoud293cmsuY29t\nCndveGluZ2h1aWd1by5jb20KLndveWFvbGlhbi5vcmcKfGh0dHA6Ly93b3lhb2xp\nYW4ub3JnCi53cG9mb3J1bS5jb20KfHx3cG9mb3J1bS5jb20KLndxeWQub3JnCnx8\nd3F5ZC5vcmcKd3JjaGluYS5vcmcKd3JldGNoLmNjCiEtY24ud3NqLmNvbS9nYi8y\nMDEzMDIxNS90ZWMxMTM4NTMuYXNwCi53c2ouY29tCnx8d3NqLmNvbQoud3NqLm5l\ndAp8fHdzai5uZXQKLndzamhrLmNvbQoud3Ribi5vcmcKLnd0ZnBlb3BsZS5jb20K\nd3VlcmthaXhpLmNvbQp8fHd1ZmFmYW5nd2VuLmNvbQp3dWZpLm9yZy50dwp8fHd1\nZ3VvZ3VhbmcuY29tCnd1amllLm5ldAp3dWppZWxpdWxhbi5jb20KfHx3dWppZWxp\ndWxhbi5jb20Kd3VrYW5ncnVpLm5ldAp8fHd1dy5yZWQKfHx3dXlhbmJsb2cuY29t\nCi53d2l0di5jb20KfHx3d2l0di5jb20Kd3p5Ym95LmltL3Bvc3QvMTYwCgohLS0t\nLS0tLS0tLS0tLS0tLS0tLS1YWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLngt\nYmVycnkuY29tCnx8eC1iZXJyeS5jb20KfHx4LWFydC5jb20KfHx4LXdhbGwub3Jn\nCngxOTQ5eC5jb20KeDM2NXguY29tCnhhbmdhLmNvbQp8fHhiYWJlLmNvbQoueGJv\nb2tjbi5jb20KfHx4Ym9va2NuLmNvbQp8fHhjYWZlLmluCnx8eGNpdHkuanAKLnhj\ncml0aWMuY29tCnxodHRwOi8vY2RuKi54ZGEtZGV2ZWxvcGVycy5jb20KLnhlcm90\naWNhLmNvbQpkZXN0aW55LnhmaWxlcy50by91YmJ0aHJlYWRzCi54Zm0ucHAucnUK\nLnhnbXlkLmNvbQp8fHhnbXlkLmNvbQp4aGFtc3Rlci5jb20KfHx4aGFtc3Rlci5j\nb20KLnhpYW5iYS5uZXQKLnhpYW5jaGF3YW5nLm5ldAoueGlhbmppYW4udHcKfGh0\ndHA6Ly94aWFuamlhbi50dwoueGlhbnFpYW8ubmV0Ci54aWFvYmFpd3UuY29tCi54\naWFvY2h1bmNuanAuY29tCi54aWFvZC5pbgoueGlhb2hleGllLmNvbQp8fHhpYW9s\nYW4ubWUKfHx4aWFvbWEub3JnCnx8eGlhb2hleGllLmNvbQp4aWV6aHVhLmNvbQou\neGlodWEuZXMKZm9ydW0ueGluYmFvLmRlL2ZvcnVtCi54aW5nLmNvbQp8aHR0cDov\nL3hpbmcuY29tCi54aW5taWFvLmNvbS5oawp8fHhpbm1pYW8uY29tLmhrCnhpbnNo\nZW5nLm5ldAp4aW5zaGlqdWUuY29tCnhpbmh1YW5ldC5vcmcKfGh0dHA6Ly94aW55\ndWJicy5uZXQKLnhpb25ncGlhbi5jb20KLnhpdXJlbi5vcmcKeGl6YW5nLXpoaXll\nLm9yZwp4anAuY2MKfHx4anAuY2MKfHx4anRyYXZlbGd1aWRlLmNvbQp4bGZtdGFs\nay5jb20KfHx4bGZtd3ouaW5mbwp8fHhtbC10cmFpbmluZy1ndWlkZS5jb20KeG1v\ndmllcy5jb20KfHx4bnh4LmNvbQp4cGRvLm5ldAp8fHhwdWQub3JnCi54cmVudGR2\nZC5jb20KLnhza3l3YWxrZXIubmV0Cnx8eHR1YmUuY29tCmJsb2cueHVpdGUubmV0\nCnZsb2cueHVpdGUubmV0Cnh1emhpeW9uZy5uZXQKfHx4dWNoYW8ub3JnCnh1Y2hh\nby5uZXQKfHx4dWNoYW8ubmV0Cnh2aWRlby5jYwoueHZpZGVvcy5jb20KfHx4dmlk\nZW9zLmNvbQp8fHh2aWRlb3MuZXMKLnhraXdpLnRrLwoueHhiYnguY29tCi54eGxt\nb3ZpZXMuY29tCnx8eHh4LmNvbQoueHh4Lnh4eAp8aHR0cDovL3h4eC54eHgKLnh4\neGZ1Y2ttb20uY29tCnx8eHh4eC5jb20uYXUKLnh4eHltb3ZpZXMuY29tCnxodHRw\nOi8veHh4eW1vdmllcy5jb20KeHlzLm9yZwp4eXNibG9ncy5vcmcKeHl5NjkuY29t\nCnh5eTY5LmluZm8KCiEtLS0tLS0tLS0tLS0tLS0tLS0tLVlZLS0tLS0tLS0tLS0t\nLS0tLS0tLS0tLS0tLQp8fHlha2J1dHRlcmJsdWVzLmNvbQp8fHlhbS5jb20KfHx5\nYW0ub3JnLnR3Ci55YW5naGVuZ2p1bi5jb20KeWFuZ2ppYW5saS5jb20KLnlhc25p\nLmNvLnVrCnx8eWFzbmkuY28udWsKIS0tfHx5YXN1a3VuaS5vci5qcAoueWF5YWJh\neS5jb20vZm9ydW0KLnlkeS5jb20KLnllYWh0ZWVudHViZS5jb20KfHx5ZWFodGVl\nbnR1YmUuY29tCnx8eWVjbC5uZXQKfHx5ZWVsb3UuY29tCnllZXlpLmNvbQp5ZWds\nZS5uZXQKfHx5ZWdsZS5uZXQKLnllcy54eHgKfHx5ZXMxMjMuY29tLnR3Cnx8eWVz\nYXNpYS5jb20KfHx5ZXNhc2lhLmNvbS5oawoueWVzLW5ld3MuY29tCnxodHRwOi8v\neWVzLW5ld3MuY29tCi55ZXNwb3JucGxlYXNlLmNvbQp8fHllc3Bvcm5wbGVhc2Uu\nY29tCnxodHRwOi8veWV5ZWNsdWIuY29tCiEtLXlmcm9nLmNvbQp8fHloY3cubmV0\nCi55aWJhZGEuY29tCi55aWJhb2NoaW5hLmNvbQoueWlkaW8uY29tCnx8eWlkaW8u\nY29tCnlpbHViYnMuY29tCnhhLnlpbWcuY29tCi55aW5nc3Vvc3MuY29tCi55aXB1\nYi5jb20KfHx5aXB1Yi5jb20KeWlubGVpLm9yZy9tdAoueWl6aGlob25neGluZy5j\nb20KLnlvYnQuY29tCi55b2J0LnR2Cnx8eW9idC50dgoueW9naWNoZW4ub3JnCnx8\neW9naWNoZW4ub3JnCi55b2xhc2l0ZS5jb20KLnlvbWl1cmkuY28uanAKeW9uZy5o\ndQoueW9ya2Jicy5jYQp8fHlvdXh1LmluZm8KLnlvdWppenouY29tCnx8eW91aml6\nei5jb20KLnlvdW1ha2VyLmNvbQp8fHlvdW1ha2VyLmNvbQoueW91bmdwb3Judmlk\nZW9zLmNvbQp5b3VuZ3NwaXJhdGlvbi5oawoueW91cGFpLm9yZwp8fHlvdXBhaS5v\ncmcKLnlvdXItZnJlZWRvbS5uZXQKfHx5b3VyZXBlYXQuY29tCi55b3VycHJpdmF0\nZXZwbi5jb20KfHx5b3VycHJpdmF0ZXZwbi5jb20KLnlvdXNlbmRpdC5jb20KfHx5\nb3VzZW5kaXQuY29tCi55b3V0aG5ldHJhZGlvLm9yZy90bWl0L2ZvcnVtCmJsb2cu\neW91dGh3YW50LmNvbS50dwptZS55b3V0aHdhbnQuY29tLnR3CnNoYXJlLnlvdXRo\nd2FudC5jb20udHcKdG9waWMueW91dGh3YW50LmNvbS50dwoueW91cG9ybi5jb20K\nfHx5b3Vwb3JuLmNvbQoueW91cG9ybmdheS5jb20KfHx5b3Vwb3JuZ2F5LmNvbQou\neW91cmxpc3Rlbi5jb20KfGh0dHA6Ly95b3VybGlzdGVuLmNvbQoueW91cmx1c3Qu\nY29tCnxodHRwOi8veW91cmx1c3QuY29tCnlvdXNodW4xMi5jb20KLnlvdXR1YmVj\nbi5jb20KeW91dmVyc2lvbi5jb20KfHx5b3V2ZXJzaW9uLmNvbQpibG9nLnlvdXh1\nLmluZm8vMjAxMC8wMy8xNC93ZXN0LWNoYW1iZXIKeXRodC5uZXQKeXVhbm1pbmcu\nbmV0Ci55dWFuemhlbmd0YW5nLm9yZwoueXVsZ2h1bi5jb20KfHx5dW5jaGFvLm5l\ndAp8fHl1bnRpcHViLmNvbQoueXV2dXR1LmNvbQp8fHl2ZXNnZWxleW4uY29tCi55\nd3B3LmNvbS9mb3J1bXMvaGlzdG9yeS9wb3N0L0EwL3AwL2h0bWwvMjI3Cnl4NTEu\nbmV0Ci55eWlpLm9yZwp8fHl5aWkub3JnCi55enprLmNvbQp8aHR0cDovL3l6emsu\nY29tCgohLS0tLS0tLS0tLS0tLS0tLS0tLS1aWi0tLS0tLS0tLS0tLS0tLS0tLS0t\nLS0tLS0KemFjZWJvb2suY29tCi56YWxtb3MuY29tCnx8emFsbW9zLmNvbQp8fHph\nbm5lbC5jb20KLnphb2Jhby5jb20KfHx6YW9iYW8uY29tCnxodHRwOi8vemFvYmFv\nLmNvbS5zZwp8fHphb2Jhby5jb20uc2cKLnphb3pvbi5jb20KfHx6ZG5ldC5jb20u\ndHcKLnplbGxvLmNvbQp8fHplbGxvLmNvbQouemVuZ2ppbnlhbi5vcmcKLnplbm1h\ndGUuY29tCnx8emVubWF0ZS5jb20KfHx6ZW5tYXRlLmNvbS5ydQp8fHplcm9uZXQu\naW8KfHx6ZXV0Y2guY29tCiEtLXd3dy56ZnJlZXQuY29tL3Bvc3QvdXNlanVtcC1i\ncm93bnMuaHRtbAouemZyZWV0LmNvbQouemdzZGRoLmNvbQp6Z3pjamoubmV0Ci56\naGFuYmluLm5ldAp8fHpoYW5iaW4ubmV0Ci56aGFuZ2JvbGkubmV0Cnx8emhhbmd0\naWFubGlhbmcuY29tCnx8emhhbmx2ZS5vcmcKemhlbmdodWkub3JnCi56aGVuZ2pp\nYW4ub3JnCnx8emhlbmdqaWFuLm9yZwp6aGVuZ3d1bmV0Lm9yZwp6aGVubGlidS5p\nbmZvCnx8emhlbmxpYnUuaW5mbwouemhlbmxpYnUxOTg0LmNvbQp8fHpoZW5saWJ1\nMTk4NC5jb20KfGh0dHA6Ly96aGVueGlhbmcuYml6Ci56aGluZW5nbHV5b3UuY29t\nCnpob25nZ3VvLmNhCnxodHRwOi8vemhvbmdndW9yZW5xdWFuLm9yZwp6aG9uZ2d1\nb3Rlc2UubmV0Cnx8emhvbmdndW90ZXNlLm5ldAp8fHpob25nbWVuZy5vcmcKLnpo\nb3VzaHVndWFuZy5jb20KfHx6aHJlYWRlci5jb20KLnpodWFuZ2JpLm1lCnx8emh1\nYW5nYmkubWUKLnpodWFueGluZy5jbgp8fHpodWF0aWViYS5jb20Kemh1aWNoYWd1\nb2ppLm9yZwp8fHpodWljaGFndW9qaS5vcmcKfGh0dHA6Ly9ib29rLnppNS5tZQou\nemlkZHUuY29tL2Rvd25sb2FkCnx8emlsbGlvbmsuY29tCi56aW5pby5jb20KfHx6\naW5pby5jb20KLnppcG9ybi5jb20KLnppcHB5c2hhcmUuY29tCi56a2FpcC5jb20K\nfHx6a2FpcC5jb20KcmVhbGZvcnVtLnpraXouY29tCiEtLXx8emxpYi5uZXQKfHx6\nbXcuY24KLnpvZGdhbWUudXMKem9tb2JvLm5ldAouem9uYWV1cm9wYS5jb20KfHx6\nb25hZXVyb3BhLmNvbQp8fHpvbmdoZXhpbndlbi5jb20KLnpvbmdoZXhpbndlbi5u\nZXQKfHx6b29ndnBuLmNvbQp8fHpvb3Rvb2wuY29tCi56b296bGUubmV0CndyaXRl\nci56b2hvLmNvbQp8fHpvcnJvdnBuLmNvbQp8fHpwbi5pbQp8fHpzcGVlZGVyLm1l\nCi56c3JoYW8uY29tCi56dW8ubGEKfHx6dW8ubGEKfHx6dW9iaWFvLm1lCi56dW9s\nYS5jb20KfHx6dW9sYS5jb20KfHx6dmVyZWZmLmNvbQouenluYWltYS5jb20Kenl6\nYzkuY29tCi56emNhcnRvb24uY29tCiEjIyMjIyMjIyMjIyMjI0dlbmVyYWwgTGlz\ndCBFbmQjIyMjIyMjIyMjIyMjIyMjIwoKISMjIyMjIyMjIyMjU3VwcGxlbWVudGFs\nIExpc3QgU3RhcnQjIyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0tLS0tLS0tLVVSTCBL\nZXl3b3Jkcy0tLS0tLS0tLS0tLS0tLS0tLQo2NG1lbW8KYUhSMGNITTZMeTk1WldO\nc0xtNWxkQQpmcmVlbmV0Ci5nb29nbGUuKi9mYWx1bgpwaG9ib3MuYXBwbGUuY29t\nKi92aWRlbwpxPWZyZWVkb20KcSUzRGZyZWVkb20KcmVtZW1iZXJpbmdfdGlhbmFu\nbWVuXzIwX3llYXJzCnNlYXJjaCpzYWZld2ViCnE9dHJpYW5nbGUKcSUzRFRyaWFu\nZ2xlCnVsdHJhcmVhY2gKdWx0cmFzdXJmCiEjIyMjIyMjIyMjIyMjU3VwcGxlbWVu\ndGFsIExpc3QgRW5kIyMjIyMjIyMjIyMjIwoKISMjIyMjIyMjIyMjIyMjIyNXaGl0\nZWxpc3QgU3RhcnQjIyMjIyMjIyMjIyMjIyMjCkBAfHxhbGl5dW4uY29tCkBAfHxi\nYWlkdS5jb20KIS0tQEB8fGJpbmcuY29tCkBAfHxjaGluYXNvLmNvbQpAQHx8Y2hp\nbmF6LmNvbQpAQHxodHRwOi8vbnJjaC5jdWx0dXJlLnR3LwoKIS0tLVNvbWUgYXJl\nIHBvd2VyZWQgYnkgR3VYaWFuZyAoQkdQKSwgcGxlYXNlIGNvbW1lbnQgb2ZmIGlm\nCiEtLS15b3UgZW5jb3VudGVyIGNvbm5lY3Rpdml0eSBpc3N1ZXMuCkBAfHxhZHNl\ncnZpY2UuZ29vZ2xlLmNvbQohLS1JU1AgY2FjaGUgd29ya3Mgc29tZXRpbWVzLCB2\nZXJpZmllZCBhdCBkcnBlbmcgKyBnZWh1YS4KQEB8fGRsLmdvb2dsZS5jb20KQEB8\nfGtoLmdvb2dsZS5jb20KQEB8fGtobS5nb29nbGUuY29tCkBAfHxraG0wLmdvb2ds\nZS5jb20KQEB8fGtobTEuZ29vZ2xlLmNvbQpAQHx8a2htMi5nb29nbGUuY29tCkBA\nfHxraG0zLmdvb2dsZS5jb20KQEB8fGtobWRiLmdvb2dsZS5jb20KQEB8fHRvb2xz\nLmdvb2dsZS5jb20KQEB8fGNsaWVudHNlcnZpY2VzLmdvb2dsZWFwaXMuY29tCkBA\nfHxmb250cy5nb29nbGVhcGlzLmNvbQpAQHx8a2htLmdvb2dsZWFwaXMuY29tCkBA\nfHxraG0wLmdvb2dsZWFwaXMuY29tCkBAfHxraG0xLmdvb2dsZWFwaXMuY29tCkBA\nfHxraG0yLmdvb2dsZWFwaXMuY29tCkBAfHxraG0zLmdvb2dsZWFwaXMuY29tCkBA\nfHxraG1kYi5nb29nbGVhcGlzLmNvbQpAQHx8c3RvcmFnZS5nb29nbGVhcGlzLmNv\nbQpAQHx8dHJhbnNsYXRlLmdvb2dsZWFwaXMuY29tCkBAfHx1cGRhdGUuZ29vZ2xl\nYXBpcy5jb20KQEB8fHNhZmVicm93c2luZy5nb29nbGVhcGlzLmNvbQpAQHx8Y24u\nZ3JhdmF0YXIuY29tCkBAfHxjb25uZWN0aXZpdHljaGVjay5nc3RhdGljLmNvbQpA\nQHx8Y3NpLmdzdGF0aWMuY29tCkBAfHxmb250cy5nc3RhdGljLmNvbQpAQHx8c3Ns\nLmdzdGF0aWMuY29tCkBAfHxoYW9zb3UuY29tCkBAfHxpcC5jbgpAQHx8amlrZS5j\nb20KQEB8aHR0cDovL3RyYW5zbGF0ZS5nb29nbGUuY24KQEB8aHR0cDovL3d3dy5n\nb29nbGUuY24vbWFwcwpAQHx8aHR0cDIuZ29sYW5nLm9yZwpAQHx8Z292LmNuCkBA\nfHxxcS5jb20KQEB8fHNpbmEuY24KQEB8fHNpbmEuY29tLmNuCkBAfHxzb2dvdS5j\nb20KQEB8fHNvLmNvbQpAQHx8c29zby5jb20KQEB8fHVsdWFpLmNvbS5jbgpAQHx8\nd2VpYm8uY29tCkBAfHx5YWhvby5jbgpAQHx8eW91ZGFvLmNvbQpAQHx8emhvbmdz\nb3UuY29tCkBAfGh0dHA6Ly9pbWUuYmFpZHUuanAKISMjIyMjIyMjIyMjIyMjIyNX\naGl0ZWxpc3QgRW5kIyMjIyMjIyMjIyMjIyMjIyMjCiEtLS0tLS0tLS0tLS0tLS0t\nLS0tLS1FT0YtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=\n"
  },
  {
    "path": "ShadowsocksX-NG/install_helper.sh",
    "content": "#!/bin/sh\n\n#  install_helper.sh\n#  shadowsocks\n#\n#  Created by clowwindy on 14-3-15.\n\ncd \"$(dirname \"${BASH_SOURCE[0]}\")\"\n\nsudo mkdir -p \"/Library/Application Support/ShadowsocksX-NG/\"\nsudo cp proxy_conf_helper \"/Library/Application Support/ShadowsocksX-NG/\"\nsudo chown root:admin \"/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper\"\nsudo chmod a+rx \"/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper\"\nsudo chmod +s \"/Library/Application Support/ShadowsocksX-NG/proxy_conf_helper\"\n\necho done\n"
  },
  {
    "path": "ShadowsocksX-NG/kcptun/install_kcptun.sh",
    "content": "#!/bin/sh\n\n#  install_kcptun.sh\n#  ShadowsocksX-NG\n#\n#  Created by 邱宇舟 on 2018/9/21.\n#  Copyright © 2018-2019年 qiuyuzhou. All rights reserved.\n\n# Use kcptune bianry from here which is not support SIP003.\n# We use an adatper to handle it.\n# https://github.com/xtaci/kcptun/releases\n\ncd \"$(dirname \"${BASH_SOURCE[0]}\")\"\n\nmkdir -p \"$HOME/Library/Application Support/ShadowsocksX-NG/kcptun\"\ncp -f client \"$HOME/Library/Application Support/ShadowsocksX-NG/kcptun/\"\n\n# Delete old kcptun symbol link\nrm -f \"$HOME/Library/Application Support/ShadowsocksX-NG/plugins/kcptun\"\n\n# Copy adapter shell script to plugin folder\ncp -f kcptun.sh \"$HOME/Library/Application Support/ShadowsocksX-NG/plugins/kcptun\"\n\necho \"install kcptun done\"\n"
  },
  {
    "path": "ShadowsocksX-NG/kcptun/kcptun.sh",
    "content": "#!/bin/bash\n\n# A shadowsocks SIP003 adapter shell script.\n#\n# SIP003 Docucment: https://github.com/shadowsocks/shadowsocks-org/issues/28\n#\n# Created by Qiu Yuzhou on 2019-09-09\n# Copyright © 2019 Qiu Yuzhou. All rights reserved.\n\n# test data, Start\n# SS_REMOTE_HOST=127.0.0.1\n# SS_REMOTE_PORT=8088\n# SS_LOCAL_HOST=192.168.1.1\n# SS_LOCAL_PORT=888\n# test data, End\n\nSS_ENV_NAMES=(SS_REMOTE_HOST SS_REMOTE_PORT SS_LOCAL_HOST SS_LOCAL_PORT)\n\nfor i in \"${SS_ENV_NAMES[@]}\"; do\n    if [ -z ${!i} ]\n    then\n        echo Not found env variable $i\n        exit\n    fi\ndone\n\n# Split options\nIFS=';' read -ra _OPTS <<< \"${SS_PLUGIN_OPTIONS}\"\n\n# Prepend `--`\nOPTS=()\nfor i in \"${_OPTS[@]}\"; do\n    OPTS+=(\"--$i\")\ndone\n\nPLUGIN_NAME=\"kcptun\"\nPLUGIN_BINARY_NAME=\"client\"\n\nCMD=\"$(dirname \"${BASH_SOURCE[0]}\")/../${PLUGIN_NAME}/${PLUGIN_BINARY_NAME}\"\n\n# Check if it is an IPv6 address\nif  [[ $SS_REMOTE_HOST == *\":\"* ]]; then\n    SS_REMOTE_ADDR=\"[${SS_REMOTE_HOST}]:${SS_REMOTE_PORT}\"\nelse\n    SS_REMOTE_ADDR=\"${SS_REMOTE_HOST}:${SS_REMOTE_PORT}\"\nfi\n\n# Check if it is an IPv6 address\nif  [[ $SS_LOCAL_HOST == *\":\"* ]]; then\n    SS_LOCAL_ADDR=\"[${SS_LOCAL_HOST}]:${SS_LOCAL_PORT}\"\nelse\n    SS_LOCAL_ADDR=\"${SS_LOCAL_HOST}:${SS_LOCAL_PORT}\"\nfi\n\n# Update this line when adapted other plugin.\n# echo -r \"${SS_REMOTE_ADDR}\" -l \"${SS_LOCAL_ADDR}\" ${OPTS[@]}\n\"$CMD\" -r \"${SS_REMOTE_ADDR}\" -l \"${SS_LOCAL_ADDR}\" ${OPTS[@]}\n"
  },
  {
    "path": "ShadowsocksX-NG/privoxy/install_privoxy.sh",
    "content": "#!/bin/sh\n\n#  install_privoxy.sh\n#  ShadowsocksX-NG\n#\n#  Created by 王晨 on 16/10/7.\n#  Copyright © 2016年 zhfish. All rights reserved.\n\n\ncd \"$(dirname \"${BASH_SOURCE[0]}\")\"\n\nmkdir -p \"$HOME/Library/Application Support/ShadowsocksX-NG/privoxy\"\ncp -f privoxy \"$HOME/Library/Application Support/ShadowsocksX-NG/privoxy/\"\n\necho done\n"
  },
  {
    "path": "ShadowsocksX-NG/privoxy/privoxy.template.config",
    "content": "listen-address {http}\ntoggle  1\nenable-remote-toggle 1\nenable-remote-http-toggle 1\nenable-edit-actions 0\nenforce-blocks 0\nbuffer-limit 4096\nforwarded-connect-retries  0\naccept-intercepted-requests 0\nallow-cgi-request-crunching 0\nsplit-large-forms 0\nkeep-alive-timeout 5\nsocket-timeout 60\n\nforward         192.168.*.*/     .\nforward         10.*.*.*/        .\nforward         127.*.*.*/       .\nforward         [FE80::/64]      .\nforward         [::1]            .\nforward         [FD00::/8]       .\nforward-socks5 / {socks5} .\n\n"
  },
  {
    "path": "ShadowsocksX-NG/privoxy/start_privoxy.sh",
    "content": "#!/bin/sh\n\n#  start_privoxy.sh\n#  ShadowsocksX-NG\n#\n#  Created by 王晨 on 16/10/7.\n#  Copyright © 2016年 zhfish. All rights reserved.\n\nchmod 644 \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist\"\nlaunchctl load -wF \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist\"\nlaunchctl start com.qiuyuzhou.shadowsocksX-NG.http\n"
  },
  {
    "path": "ShadowsocksX-NG/privoxy/stop_privoxy.sh",
    "content": "#!/bin/sh\n\n#  stop_privoxy.sh\n#  ShadowsocksX-NG\n#\n#  Created by 王晨 on 16/10/7.\n#  Copyright © 2016年 zhfish. All rights reserved.\n\nlaunchctl stop com.qiuyuzhou.shadowsocksX-NG.http\nlaunchctl unload \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.http.plist\"\n"
  },
  {
    "path": "ShadowsocksX-NG/privoxy/user-privoxy.config",
    "content": "# Put user privoxy config line in this file.\n# Ref: https://www.privoxy.org/user-manual/index.html\n\n"
  },
  {
    "path": "ShadowsocksX-NG/proxy_conf_helper_version.h",
    "content": "//\n//  proxy_conf_helper_version.h\n//  ShadowsocksX-NG\n//\n//  Created by 邱宇舟 on 16/6/10.\n//  Copyright © 2016年 qiuyuzhou. All rights reserved.\n//\n\n#ifndef proxy_conf_helper_version_h\n#define proxy_conf_helper_version_h\n\n#define kProxyConfHelperVersion @\"1.8.2\"\n\n#endif /* proxy_conf_helper_version_h */\n"
  },
  {
    "path": "ShadowsocksX-NG/simple-obfs/install_simple_obfs.sh",
    "content": "#!/bin/sh\n# v0.0.5 https://bintray.com/homebrew/bottles/simple-obfs\n\nFILE_DIR=`dirname \"${BASH_SOURCE[0]}\"`\ncd \"$FILE_DIR\"\n\nNGDir=\"$HOME/Library/Application Support/ShadowsocksX-NG\"\nTargetDir=\"$NGDir/simple-obfs\"\nPluginDir=\"$NGDir/plugins\"\n\necho ngdir: ${NGDir}\n\nmkdir -p \"$TargetDir\"\nmkdir -p \"$PluginDir\"\n\ncp -f obfs-local \"$TargetDir\"\n\nln -sfh \"$TargetDir/obfs-local\" \"$PluginDir/simple-obfs\"\nln -sfh \"$TargetDir/obfs-local\" \"$PluginDir/obfs-local\"\n\necho done\n"
  },
  {
    "path": "ShadowsocksX-NG/ss-local/install_ss_local.sh",
    "content": "#!/bin/bash\n\n#  install_ss_local.sh\n#  ShadowsocksX-NG\n#\n#  Created by 邱宇舟 on 16/6/6.\n#  Copyright © 2016年 qiuyuzhou. All rights reserved.\n\n\ncd \"$(dirname \"${BASH_SOURCE[0]}\")\"\n\nNGDir=\"$HOME/Library/Application Support/ShadowsocksX-NG\"\nTargetDir=\"$NGDir/ss-local\"\n\necho ngdir: ${NGDir}\n\n# https://bintray.com/homebrew/bottles/shadowsocks-libev/\nmkdir -p \"$TargetDir\"\ncp -f ss-local \"$TargetDir\"\n\necho done\n"
  },
  {
    "path": "ShadowsocksX-NG/ss-local/start_ss_local.sh",
    "content": "#!/bin/sh\n\n#  start_ss_local.sh\n#  ShadowsocksX-NG\n#\n#  Created by 邱宇舟 on 16/6/6.\n#  Copyright © 2016年 qiuyuzhou. All rights reserved.\n\nchmod 644 \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist\"\nlaunchctl load -wF \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist\"\nlaunchctl start com.qiuyuzhou.shadowsocksX-NG.local\n"
  },
  {
    "path": "ShadowsocksX-NG/ss-local/stop_ss_local.sh",
    "content": "#!/bin/sh\n\n#  stop_ss_local.sh\n#  ShadowsocksX-NG\n#\n#  Created by 邱宇舟 on 16/6/6.\n#  Copyright © 2016年 qiuyuzhou. All rights reserved.\n\nlaunchctl stop com.qiuyuzhou.shadowsocksX-NG.local\nlaunchctl unload \"$HOME/Library/LaunchAgents/com.qiuyuzhou.shadowsocksX-NG.local.plist\"\n"
  },
  {
    "path": "ShadowsocksX-NG/user-rule.txt",
    "content": "! Put user rules line by line in this file.\n! See https://adblockplus.org/en/filter-cheatsheet\n"
  },
  {
    "path": "ShadowsocksX-NG/v2ray-plugin/install_v2ray_plugin.sh",
    "content": "#!/bin/sh\n\n#  install_v2ray_plugin.sh\n#  ShadowsocksX-NG\n#\n#  Created by lkebin on 2019/2/18.\n#  Copyright © 2019 qiuyuzhou. All rights reserved.\n# https://github.com/shadowsocks/v2ray-plugin/\n\n# v2ray-core/v4 v4.38.3\n# build by go1.16.4\n#\n# v2ray-plugin_darwin_universal: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64]\n# v2ray-plugin_darwin_universal (for architecture x86_64):        Mach-O 64-bit executable x86_64\n# v2ray-plugin_darwin_universal (for architecture arm64): Mach-O 64-bit executable arm64\n\ncd \"$(dirname \"${BASH_SOURCE[0]}\")\"\n\nmkdir -p \"$HOME/Library/Application Support/ShadowsocksX-NG/v2ray-plugin\"\ncp -f v2ray-plugin \"$HOME/Library/Application Support/ShadowsocksX-NG/v2ray-plugin/\"\n\nln -sfh \"$HOME/Library/Application Support/ShadowsocksX-NG/v2ray-plugin/v2ray-plugin\" \"$HOME/Library/Application Support/ShadowsocksX-NG/plugins/v2ray-plugin\"\nln -sfh \"$HOME/Library/Application Support/ShadowsocksX-NG/v2ray-plugin/v2ray-plugin\" \"$HOME/Library/Application Support/ShadowsocksX-NG/plugins/v2ray\"\n\necho \"install v2ray-plugin done\"\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/ImportWindowController.strings",
    "content": "\n/* Class = \"NSButtonCell\"; title = \"Import\"; ObjectID = \"EW8-ld-aGr\"; */\n\"EW8-ld-aGr.title\" = \"导入\";\n\n/* Class = \"NSWindow\"; title = \"Import Server URLs\"; ObjectID = \"F0z-JX-Cv5\"; */\n\"F0z-JX-Cv5.title\" = \"导入服务器URLs\";\n\n/* Class = \"NSTextFieldCell\"; placeholderString = \"Copy your shadowsocks URLs to here\"; ObjectID = \"h31-8G-f2d\"; */\n\"h31-8G-f2d.placeholderString\" = \"复制shadowsocks URLs到这里\";\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/Localizable.strings",
    "content": "\n\n\n\n/*\n * SHARED STRINGS\n */\n\n/*\n * ./PACUtils.swift\n */\n\n\"PAC has been updated by latest GFW List.\" = \"已经使用最新的 GFW List 更新PAC\";\n\n\"It's failed to update PAC by User Rules.\" = \"更新 PAC 失败\";\n\n\"Failed to download latest GFW List.\" = \"下载最新的 GFW 列表失败\";\n\n/*\n * ./AppDelegate.swift\n */\n\n\"Save Diagnosis to File\" = \"保存诊断信息到文件\";\n\n\"Global Mode\" = \"全局模式\";\n\n\"Manual Mode\" = \"手动模式\";\n\n\"Auto Mode By PAC\" = \"PAC自动模式\";\n\n\"Add \\(addCount) Shadowsocks Server Profile\" = \"已添加\\(addCount)个Shadowsocks服务器配置\";\n\n\"Not found valid qrcode or url of shadowsocks profile\" = \"没有找到有效的shadowsocks配置二维码或链接\";\n\n\"By scan QR Code\" = \"通过扫描二维码\";\n\n\"Shadowsocks: On\" = \"Shadowsocks: On\";\n\n\"Turn Shadowsocks Off\" = \"关闭 Shadowsocks\";\n\n\"Shadowsocks: Off\" = \"Shadowsocks: Off\";\n\n\"Turn Shadowsocks On\" = \"打开 Shadowsocks\";\n\n\"Servers\" = \"服务器\";\n\n\"Servers - (No Selected)\" = \"服务器 - (未选择)\";\n\n\"Add \\(addCount) Shadowsocks Server Profile\" = \"新增 \\(addCount) 个 Shadowsocks 服务器配置\";\n\n\"Not found valid QRCode of shadowsocks profile\" = \"未找到有效的 shadowsocks 二维码\";\n\n\"Not found valid URL of shadowsocks profile\" = \"未找到有效的 shadowsocks 链接\";\n\n/*\n * ./HTTPPreferencesWindowController.swift\n */\n\n\"Export Command Copied.\" = \"Export 命令已复制至剪贴板\";\n\n\"Timeout\" = \"超时\";\n\n/*\n * ./ShadowsocksX-NG/ShareServerProfilesWindowController.swift\n */\n\n\"Save All Server URLs To File\" = \"保存所有服务器 URL 到文件\";\n\n\"Save QRCode As File\" = \"保存 QRCode 为文件\";\n\n/*\n * ./ShadowsocksX-NG/ImportWindowController.swift\n */\n\n\"Success to add \\(addCount) server.\" = \"成功添加 \\(addCount) 个服务器\";\n\n\"Not found valid shadowsocks server urls.\" = \"未找到有效的shadowsocks服务器URL\";\n\n/*\n * ./ShadowsocksX-NG/PreferencesWindowController.swift\n */\n\n\"New Server\" = \"新建服务器\";\n\n\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/MainMenu.strings",
    "content": "\n/* Class = \"NSMenuItem\"; title = \"Preferences...\"; ObjectID = \"4CS-qD-zW5\"; */\n\"4CS-qD-zW5.title\" = \"偏好设置...\";\n\n/* Class = \"NSMenuItem\"; title = \"Import Server URLs From Pasteboard\"; ObjectID = \"7Eq-XD-K5c\"; */\n\"7Eq-XD-K5c.title\" = \"从剪贴板导入服务器配置链接\";\n\n/* Class = \"NSMenuItem\"; title = \"应用用户自定规则到 PAC\"; ObjectID = \"6qf-cg-HXc\"; */\n\"6qf-cg-HXc.title\" = \"应用用户自定规则到 PAC\";\n\n/* Class = \"NSMenuItem\"; title = \"手动模式\"; ObjectID = \"8PR-gs-c5N\"; */\n\"8PR-gs-c5N.title\" = \"手动模式\";\n\n/* Class = \"NSMenu\"; title = \"服务器\"; ObjectID = \"9Y1-db-3HK\"; */\n\"9Y1-db-3HK.title\" = \"服务器\";\n\n/* Class = \"NSMenuItem\"; title = \"打开 ShadowsocksX\"; ObjectID = \"GSu-Tf-StS\"; */\n\"GSu-Tf-StS.title\" = \"打开 ShadowsocksX\";\n\n/* Class = \"NSMenu\"; title = \"ShadowsocksX-NG\"; ObjectID = \"Hob-KD-bx9\"; */\n\"Hob-KD-bx9.title\" = \"ShadowsocksX-NG\";\n\n/* Class = \"NSMenuItem\"; title = \"显示日志...\"; ObjectID = \"Jfy-sf-Fhl\"; */\n\"Jfy-sf-Fhl.title\" = \"显示日志...\";\n\n/* Class = \"NSMenuItem\"; title = \"关于\"; ObjectID = \"LgB-6g-Gba\"; */\n\"LgB-6g-Gba.title\" = \"关于\";\n\n/* Class = \"NSMenuItem\"; title = \"服务器设置...\"; ObjectID = \"M5r-E7-44f\"; */\n\"M5r-E7-44f.title\" = \"服务器设置...\";\n\n/* Class = \"NSMenuItem\"; title = \"全局模式\"; ObjectID = \"Mw3-Jm-eXA\"; */\n\"Mw3-Jm-eXA.title\" = \"全局模式\";\n\n/* Class = \"NSMenuItem\"; title = \"扫描屏幕上的二维码...\"; ObjectID = \"Qe6-bF-paT\"; */\n\"Qe6-bF-paT.title\" = \"扫描屏幕上的二维码\";\n\n/* Class = \"NSMenuItem\"; title = \"显示当前服务器的二维码...\"; ObjectID = \"R6A-96-Zcb\"; */\n\"R6A-96-Zcb.title\" = \"显示当前服务器的二维码...\";\n\n/* Class = \"NSMenuItem\"; title = \"从 GFW List 更新PAC\"; ObjectID = \"TFc-Ec-duM\"; */\n\"TFc-Ec-duM.title\" = \"从 GFW List 更新PAC\";\n\n/* Class = \"NSMenuItem\"; title = \"复制终端代理命令\"; ObjectID = \"lg6-To-GZA\"; */\n\"lg6-To-GZA.title\" = \"复制终端代理命令\";\n\n/* Class = \"NSMenuItem\"; title = \"反馈\"; ObjectID = \"W7u-7g-Gv4\"; */\n\"W7u-7g-Gv4.title\" = \"反馈\";\n\n/* Class = \"NSMenu\"; title = \"代理\"; ObjectID = \"YZp-bf-L40\"; */\n\"YZp-bf-L40.title\" = \"代理\";\n\n/* Class = \"NSMenuItem\"; title = \"Advanced Preferences ...\"; ObjectID = \"bZ3-fy-34d\"; */\n\"bZ3-fy-34d.title\" = \"高级设置...\";\n\n/* Class = \"NSMenuItem\"; title = \"代理\"; ObjectID = \"diI-fB-Rss\"; */\n\"diI-fB-Rss.title\" = \"代理\";\n\n/* Class = \"NSMenuItem\"; title = \"登录时自动启动\"; ObjectID = \"eUq-p7-ICK\"; */\n\"eUq-p7-ICK.title\" = \"登录时自动启动\";\n\n/* Class = \"NSMenuItem\"; title = \"Showsocks: On\"; ObjectID = \"fzk-mE-CEV\"; */\n\"fzk-mE-CEV.title\" = \"Showsocks: On\";\n\n/* Class = \"NSMenuItem\"; title = \"PAC自动模式\"; ObjectID = \"r07-Gu-aEz\"; */\n\"r07-Gu-aEz.title\" = \"PAC自动模式\";\n\n/* Class = \"NSMenuItem\"; title = \"Auto Mode By External PAC\"; ObjectID = \"U9N-QS-BwB\"; */\n\"U9N-QS-BwB.title\" = \"外部PAC自动模式\";\n\n/* Class = \"NSMenuItem\"; title = \"编辑PAC用户自定规则...\"; ObjectID = \"rms-p0-CvB\"; */\n\"rms-p0-CvB.title\" = \"编辑PAC用户自定规则...\";\n\n/* Class = \"NSMenuItem\"; title = \"Advanced PAC Proxy Preferences...\"; ObjectID = \"sbx-yz-3lO\"; */\n\"sbx-yz-3lO.title\" = \"高级PAC代理设置...\";\n\n/* Class = \"NSMenuItem\"; title = \"服务器\"; ObjectID = \"u5M-hQ-VSc\"; */\n\"u5M-hQ-VSc.title\" = \"服务器\";\n\n/* Class = \"NSMenuItem\"; title = \"退出\"; ObjectID = \"vJS-JW-byz\"; */\n\"vJS-JW-byz.title\" = \"退出\";\n\n/* Class = \"NSMenuItem\"; title = \"Ping server\"; ObjectID = \"zfR-Jt-GmS\"; */\n\"zfR-Jt-GmS.title\" = \"服务器测速\";\n\n/* Class = \"NSMenuItem\"; title = \"Show network speed\"; ObjectID = \"a3h-uQ-DuO\"; */\n\"a3h-uQ-DuO.title\" = \"显示网速\";\n\n/* Class = \"NSMenuItem\"; title = \"Connect At Launch\"; ObjectID = \"aB3-cf-5j0\"; */\n\"aB3-cf-5j0.title\" = \"打开时自动连接\";\n\n/* Class = \"NSMenuItem\"; title = \"HTTP Proxy Preference ...\"; ObjectID = \"uEp-Gz-cu0\"; */\n\"uEp-Gz-cu0.title\" = \"HTTP代理设置...\";\n\n/* Class = \"NSMenuItem\"; title = \"Show Bunch Json Example File...\"; ObjectID = \"pdy-JE-50Q\"; */\n\"pdy-JE-50Q.title\" = \"显示示例服务器配置文件...\";\n\n/* Class = \"NSMenuItem\"; title = \"Import Bunch Json File...\"; ObjectID = \"T9g-gy-gvv\"; */\n\"T9g-gy-gvv.title\" = \"导入服务器配置文件...\";\n\n/* Class = \"NSMenuItem\"; title = \"Export All Server To Json...\"; ObjectID = \"6k0-gn-DQv\"; */\n\"6k0-gn-DQv.title\" = \"导出全部服务器配置...\";\n\n/* Class = \"NSMenuItem\"; title = \"Preferences\"; ObjectID = \"iVn-LD-Ynd\"; */\n\"iVn-LD-Ynd.title\" = \"偏好设置\";\n\n/* Class = \"NSMenuItem\"; title = \"Share Server Profiles...\"; ObjectID = \"r5z-RB-LIZ\"; */\n\"r5z-RB-LIZ.title\" = \"分享服务器配置...\";\n\n/* Class = \"NSMenuItem\"; title = \"Help\"; ObjectID = \"Xg8-er-4Ov\"; */\n\"Xg8-er-4Ov.title\" = \"帮助\";\n\n/* Class = \"NSMenuItem\"; title = \"Check for Updates...\"; ObjectID = \"hLv-bp-doM\"; */\n\"hLv-bp-doM.title\" = \"检查更新...\";\n\n/* Class = \"NSMenuItem\"; title = \"Export Diagnosis...\"; ObjectID = \"eNh-vY-utd\"; */\n\"eNh-vY-utd.title\" = \"导出诊断信息...\";\n\n/* Class = \"NSMenuItem\"; title = \"Import Server URLs...\"; ObjectID = \"geG-dQ-OYl\"; */\n\"geG-dQ-OYl.title\" = \"导入服务器URL...\";\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/PreferencesWinController.strings",
    "content": "/* Class = \"NSTextFieldCell\"; title = \"Seconds\"; ObjectID = \"4R2-UO-qs7\"; */\n\"4R2-UO-qs7.title\" = \"秒\";\n\n/* Class = \"NSTextFieldCell\"; title = \"HTTP Proxy Listen Address:\"; ObjectID = \"6W4-TY-Bw5\"; */\n\"6W4-TY-Bw5.title\" = \"HTTP代理监听地址:\";\n\n/* Class = \"NSButtonCell\"; title = \"Check\"; ObjectID = \"8Ku-VV-ZaY\"; */\n\"8Ku-VV-ZaY.title\" = \"Check\";\n\n/* Class = \"NSToolbarItem\"; label = \"Servers\"; ObjectID = \"8Nu-gG-5rY\"; */\n\"8Nu-gG-5rY.label\" = \"Servers\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"Servers\"; ObjectID = \"8Nu-gG-5rY\"; */\n\"8Nu-gG-5rY.paletteLabel\" = \"Servers\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Local Socks5 Listen Port:\"; ObjectID = \"8fk-fw-Tsx\"; */\n\"8fk-fw-Tsx.title\" = \"本地Socks5监听端口:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Toggle Shadowsocks On/Off:\"; ObjectID = \"95S-ma-8Q7\"; */\n\"95S-ma-8Q7.title\" = \"开关 Shadowsocks:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Switch proxy mode:\"; ObjectID = \"BaL-cn-m8v\"; */\n\"BaL-cn-m8v.title\" = \"切换代理模式:\";\n\n/* Class = \"NSToolbarItem\"; label = \"Interfaces\"; ObjectID = \"Bdm-pj-Ckd\"; */\n\"Bdm-pj-Ckd.label\" = \"网络接口\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"Interfaces\"; ObjectID = \"Bdm-pj-Ckd\"; */\n\"Bdm-pj-Ckd.paletteLabel\" = \"网络接口\";\n\n/* Class = \"NSToolbarItem\"; label = \"Kcptun\"; ObjectID = \"CIc-BO-xjN\"; */\n\"CIc-BO-xjN.label\" = \"Kcptun\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"Kcptun\"; ObjectID = \"CIc-BO-xjN\"; */\n\"CIc-BO-xjN.paletteLabel\" = \"Kcptun\";\n\n/* Class = \"NSToolbarItem\"; label = \"HTTP\"; ObjectID = \"D0F-6S-Ztu\"; */\n\"D0F-6S-Ztu.label\" = \"HTTP\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"HTTP\"; ObjectID = \"D0F-6S-Ztu\"; */\n\"D0F-6S-Ztu.paletteLabel\" = \"HTTP\";\n\n/* Class = \"NSTabViewItem\"; label = \"Servers\"; ObjectID = \"Dsu-Ba-zYR\"; */\n\"Dsu-Ba-zYR.label\" = \"Servers\";\n\n/* Class = \"NSWindow\"; title = \"Preferences\"; ObjectID = \"F0z-JX-Cv5\"; */\n\"F0z-JX-Cv5.title\" = \"偏好设置\";\n\n/* Class = \"NSTabViewItem\"; label = \"HTTP\"; ObjectID = \"F5Q-Ce-JJN\"; */\n\"F5Q-Ce-JJN.label\" = \"HTTP\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Num of Kcptun connections:\"; ObjectID = \"FSi-9j-QBe\"; */\n\"FSi-9j-QBe.title\" = \"Num of Kcptun connections:\";\n\n/* Class = \"NSButtonCell\"; title = \"Local PAC Server Bind To Localhost\"; ObjectID = \"oCf-id-PAx\"; */\n\"oCf-id-PAx.title\" = \"本地PAC服务器监听localhost\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Local PAC Server Listen Port:\"; ObjectID = \"IMQ-c4-gmc\"; */\n\"IMQ-c4-gmc.title\" = \"本地PAC服务器监听端口:\";\n\n/* Class = \"NSToolbarItem\"; label = \"General\"; ObjectID = \"Mp8-cF-kQ7\"; */\n\"Mp8-cF-kQ7.label\" = \"常规\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"General\"; ObjectID = \"Mp8-cF-kQ7\"; */\n\"Mp8-cF-kQ7.paletteLabel\" = \"常规\";\n\n/* Class = \"NSButtonCell\"; title = \"Enable Udp Replay\"; ObjectID = \"R3v-iN-zu8\"; */\n\"R3v-iN-zu8.title\" = \"启用 UDP 中继\";\n\n/* Class = \"NSTextFieldCell\"; title = \"HTTP Proxy Listen Port:\"; ObjectID = \"Ww9-j9-WYR\"; */\n\"Ww9-j9-WYR.title\" = \"HTTP代理监听端口:\";\n\n/* Class = \"NSButtonCell\"; title = \"Launch At Login\"; ObjectID = \"XJx-j4-bBr\"; */\n\"XJx-j4-bBr.title\" = \"开机启动\";\n\n/* Class = \"NSButtonCell\"; title = \"Auto Configure\"; ObjectID = \"bu3-s5-bYM\"; */\n\"bu3-s5-bYM.title\" = \"自动配置\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Bypass proxy settings for these Hosts & Domains:\"; ObjectID = \"v4F-L4-s8U\"; */\n\"v4F-L4-s8U.title\" = \"忽略这些主机与域的代理设置：\";\n\n/* Class = \"NSButtonCell\"; title = \"Enable Verbose Mode\"; ObjectID = \"cIS-Wb-Rzg\"; */\n\"cIS-Wb-Rzg.title\" = \"Enable Verbose Mode\";\n\n/* Class = \"NSTabViewItem\"; label = \"Interfaces\"; ObjectID = \"eDR-CZ-P4p\"; */\n\"eDR-CZ-P4p.label\" = \"网络接口\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Local Kcptun Listen Address:\"; ObjectID = \"ejW-7L-9bP\"; */\n\"ejW-7L-9bP.title\" = \"Kcptun 本地监听地址:\";\n\n/* Class = \"NSTabViewItem\"; label = \"Shortcuts\"; ObjectID = \"gpA-k4-fiw\"; */\n\"gpA-k4-fiw.label\" = \"快捷键\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Local Socks5 Listen Address:\"; ObjectID = \"jkc-e3-4O0\"; */\n\"jkc-e3-4O0.title\" = \"本地Socks5监听地址:\";\n\n/* Class = \"NSButtonCell\"; title = \"HTTP Proxy Enable\"; ObjectID = \"jr6-x7-WJD\"; */\n\"jr6-x7-WJD.title\" = \"开启HTTP代理服务器\";\n\n/* Class = \"NSTabViewItem\"; label = \"Advanced\"; ObjectID = \"ksf-9b-qoz\"; */\n\"ksf-9b-qoz.label\" = \"高级\";\n\n/* Class = \"NSToolbarItem\"; label = \"Advanced\"; ObjectID = \"kuN-wm-bl5\"; */\n\"kuN-wm-bl5.label\" = \"高级\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"Advanced\"; ObjectID = \"kuN-wm-bl5\"; */\n\"kuN-wm-bl5.paletteLabel\" = \"高级\";\n\n/* Class = \"NSToolbarItem\"; label = \"Shortcuts\"; ObjectID = \"kzb-T5-CPp\"; */\n\"kzb-T5-CPp.label\" = \"快捷键\";\n\n/* Class = \"NSToolbarItem\"; paletteLabel = \"Shortcuts\"; ObjectID = \"kzb-T5-CPp\"; */\n\"kzb-T5-CPp.paletteLabel\" = \"快捷键\";\n\n/* Class = \"NSTabViewItem\"; label = \"Kcptun\"; ObjectID = \"n2m-5k-0Ws\"; */\n\"n2m-5k-0Ws.label\" = \"Kcptun\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Local Kcptun Listen Port:\"; ObjectID = \"pdk-mh-FAj\"; */\n\"pdk-mh-FAj.title\" = \"Kcptun 本地监听端口:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Timeout:\"; ObjectID = \"sQ9-bj-V0I\"; */\n\"sQ9-bj-V0I.title\" = \"超时:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Which network interfaces  proxy setting would be controlled by ShadowsocksX-NG\"; ObjectID = \"t0I-6n-gnu\"; */\n\"t0I-6n-gnu.title\" = \"Which network interfaces  proxy setting would be controlled by ShadowsocksX-NG\";\n\n/* Class = \"NSTextFieldCell\"; title = \"GFW List URL:\"; ObjectID = \"v7a-wf-aEm\"; */\n\"v7a-wf-aEm.title\" = \"GFW List URL:\";\n\n/* Class = \"NSButtonCell\"; title = \"Show Running Proxy Mode In Status Bar\"; ObjectID = \"wXO-Qz-yDg\"; */\n\"wXO-Qz-yDg.title\" = \"在状态栏显示当前代理模式\";\n\n/* Class = \"NSTabViewItem\"; label = \"General\"; ObjectID = \"xbG-eW-Prj\"; */\n\"xbG-eW-Prj.label\" = \"常规\";\n\n/* Class = \"NSButtonCell\"; title = \"Set HTTP proxy to system proxy configure in global mode\"; ObjectID = \"m8L-D6-ye3\"; */\n\"m8L-D6-ye3.title\" = \"全局模式时，在系统代理中设置HTTP代理服务器\";\n\n/* Class = \"NSTextFieldCell\"; title = \"External PAC URL:\"; ObjectID = \"kBe-eq-uZL\"; */\n\"kBe-eq-uZL.title\" = \"外部PAC URL:\";\n\n/* Class = \"NSButtonCell\"; title = \"Reset Preferences\"; ObjectID = \"mQC-AR-HXC\"; */\n\"mQC-AR-HXC.title\" = \"重置偏好设置\";\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/PreferencesWindowController.strings",
    "content": "\n/* Class = \"NSTextFieldCell\"; title = \"Text\"; ObjectID = \"COZ-Qr-bmU\"; */\n\"COZ-Qr-bmU.title\" = \"Text\";\n\n/* Class = \"NSWindow\"; title = \"Server Preferences\"; ObjectID = \"F0z-JX-Cv5\"; */\n\"F0z-JX-Cv5.title\" = \"服务器设置\";\n\n/* Class = \"NSBox\"; title = \"Box\"; ObjectID = \"Gqv-5O-Wwf\"; */\n\"Gqv-5O-Wwf.title\" = \"Box\";\n\n/* Class = \"NSTextFieldCell\"; title = \":\"; ObjectID = \"Ibr-Gs-5Js\"; */\n\"Ibr-Gs-5Js.title\" = \":\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Remarks:\"; ObjectID = \"MiN-VE-FtC\"; */\n\"MiN-VE-FtC.title\" = \"备注:\";\n\n/* Class = \"NSButtonCell\"; title = \"Enable OTA\"; ObjectID = \"hRZ-Rp-I5e\"; */\n\"hRZ-Rp-I5e.title\" = \"启用 OTA (被废弃)\";\n\n/* Class = \"NSButtonCell\"; title = \"Cacnel\"; ObjectID = \"j03-9E-uHW\"; */\n\"j03-9E-uHW.title\" = \"取消\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Password:\"; ObjectID = \"kil-xC-HPD\"; */\n\"kil-xC-HPD.title\" = \"密码:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Encryption:\"; ObjectID = \"mOh-nD-7EX\"; */\n\"mOh-nD-7EX.title\" = \"加密方法:\";\n\n/* Class = \"NSButtonCell\"; title = \"Copy URL to Clipboard\"; ObjectID = \"t3T-Kd-5La\"; */\n\"t3T-Kd-5La.title\" = \"复制服务器URL到剪贴板\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Address:\"; ObjectID = \"yHs-XE-XEB\"; */\n\"yHs-XE-XEB.title\" = \"地址:\";\n\n/* Class = \"NSButtonCell\"; title = \"OK\"; ObjectID = \"zPE-oD-PwK\"; */\n\"zPE-oD-PwK.title\" = \"确定\";\n\n/* Class = \"NSMenuItem\"; title = \"Clone\"; ObjectID = \"bl9-lq-u9V\"; */\n\"bl9-lq-u9V.title\" = \"克隆\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Plugin:\"; ObjectID = \"gDt-yZ-Mqs\"; */\n\"gDt-yZ-Mqs.title\" = \"插件:\";\n\n/* Class = \"NSTextFieldCell\"; title = \"Plugin Opts:\"; ObjectID = \"orT-7j-dxE\"; */\n\"orT-7j-dxE.title\" = \"插件选项:\";\n\n/* Class = \"NSButtonCell\"; title = \"Open Plugin Folder...\"; ObjectID = \"T8q-g1-qjN\"; */\n\"T8q-g1-qjN.title\" = \"打开插件目录...\";\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/ShareServerProfilesWindowController.strings",
    "content": "\n/* Class = \"NSButtonCell\"; title = \"Save All Server URLs As File\"; ObjectID = \"9OS-xy-GB1\"; */\n\"9OS-xy-GB1.title\" = \"保存所有服务器链接到文件\";\n\n/* Class = \"NSWindow\"; title = \"Share Server Profiles\"; ObjectID = \"F0z-JX-Cv5\"; */\n\"F0z-JX-Cv5.title\" = \"分享服务器配置\";\n\n/* Class = \"NSButtonCell\"; title = \"Save QRCode As File\"; ObjectID = \"IaI-Rj-Kss\"; */\n\"IaI-Rj-Kss.title\" = \"保存二维码到文件\";\n\n/* Class = \"NSButtonCell\"; title = \"Copy URL\"; ObjectID = \"PHX-gY-lZe\"; */\n\"PHX-gY-lZe.title\" = \"复制链接\";\n\n/* Class = \"NSButtonCell\"; title = \"Copy QRCode\"; ObjectID = \"PrW-s6-Uab\"; */\n\"PrW-s6-Uab.title\" = \"复制二维码\";\n\n/* Class = \"NSButtonCell\"; title = \"Copy All Server URLs\"; ObjectID = \"Yt2-p1-4w0\"; */\n\"Yt2-p1-4w0.title\" = \"复制所有服务器链接\";\n\n"
  },
  {
    "path": "ShadowsocksX-NG/zh-Hans.lproj/UserRulesController.strings",
    "content": "\n/* Class = \"NSButtonCell\"; title = \"OK\"; ObjectID = \"0Sc-cm-Vyu\"; */\n\"0Sc-cm-Vyu.title\" = \"确定\";\n\n/* Class = \"NSWindow\"; title = \"User Rules\"; ObjectID = \"F0z-JX-Cv5\"; */\n\"F0z-JX-Cv5.title\" = \"用户规则\";\n\n/* Class = \"NSButtonCell\"; title = \"Cancel\"; ObjectID = \"QAR-9i-kmv\"; */\n\"QAR-9i-kmv.title\" = \"取消\";\n"
  },
  {
    "path": "ShadowsocksX-NG.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1C82DBA81FA96C7500B32551 /* obfs-local in Resources */ = {isa = PBXBuildFile; fileRef = 1C82DBA51FA96C7400B32551 /* obfs-local */; };\n\t\t1C82DBAA1FA96FB600B32551 /* install_simple_obfs.sh in Resources */ = {isa = PBXBuildFile; fileRef = 1C82DBA91FA96F0300B32551 /* install_simple_obfs.sh */; };\n\t\t9B07EFA71D048BBB0052D9DF /* ss-local in Resources */ = {isa = PBXBuildFile; fileRef = 9B07EFA61D048BBB0052D9DF /* ss-local */; };\n\t\t9B0BFFE91D0460A70040E62B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B0BFFE81D0460A70040E62B /* AppDelegate.swift */; };\n\t\t9B0BFFEB1D0460A70040E62B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9B0BFFEA1D0460A70040E62B /* Assets.xcassets */; };\n\t\t9B0BFFEE1D0460A70040E62B /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B0BFFEC1D0460A70040E62B /* MainMenu.xib */; };\n\t\t9B20804A2326AC460075386C /* kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B2080482326AC460075386C /* kcptun.sh */; };\n\t\t9B20804B2326AC460075386C /* client in Resources */ = {isa = PBXBuildFile; fileRef = 9B2080492326AC460075386C /* client */; };\n\t\t9B2491B41D0ACC3A003BBECC /* PreferencesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */; };\n\t\t9B3546721E802B1200B510B4 /* ToastWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3546701E802B1200B510B4 /* ToastWindowController.swift */; };\n\t\t9B3546731E802B1200B510B4 /* ToastWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3546711E802B1200B510B4 /* ToastWindowController.xib */; };\n\t\t9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF0C1D05FEB30019A709 /* Utils.swift */; };\n\t\t9B3FFF141D0705810019A709 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF131D0705810019A709 /* Notifications.swift */; };\n\t\t9B3FFF171D072FDE0019A709 /* LaunchAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF161D072FDE0019A709 /* LaunchAtLoginController.m */; };\n\t\t9B3FFF1E1D0732660019A709 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF1D1D0732660019A709 /* Utils.m */; };\n\t\t9B3FFF211D08826E0019A709 /* PACUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF201D08826E0019A709 /* PACUtils.swift */; };\n\t\t9B3FFF231D088E8D0019A709 /* abp.js in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF221D088E8D0019A709 /* abp.js */; };\n\t\t9B3FFF271D0898EB0019A709 /* gfwlist.txt in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF261D0898EB0019A709 /* gfwlist.txt */; };\n\t\t9B3FFF291D08A1DF0019A709 /* user-rule.txt in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF281D08A1DF0019A709 /* user-rule.txt */; };\n\t\t9B3FFF321D08CEE40019A709 /* SWBQRCodeWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF311D08CEE40019A709 /* SWBQRCodeWindowController.m */; };\n\t\t9B3FFF341D08CEF70019A709 /* SWBQRCodeWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF331D08CEF70019A709 /* SWBQRCodeWindowController.xib */; };\n\t\t9B3FFF3E1D08D9910019A709 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B3FFF3D1D08D9910019A709 /* SystemConfiguration.framework */; };\n\t\t9B3FFF471D09CD3B0019A709 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF461D09CD3B0019A709 /* main.m */; };\n\t\t9B3FFF4C1D09D8F70019A709 /* install_helper.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF4B1D09D8F70019A709 /* install_helper.sh */; };\n\t\t9B3FFF4F1D09D9D50019A709 /* ProxyConfHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B3FFF4E1D09D9D50019A709 /* ProxyConfHelper.m */; };\n\t\t9B3FFF541D09E2D10019A709 /* proxy_conf_helper in Resources */ = {isa = PBXBuildFile; fileRef = 9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */; };\n\t\t9B5831F61E7302F8009D5B7D /* ShortcutsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831F51E7302F8009D5B7D /* ShortcutsController.m */; };\n\t\t9B5831FF1E741969009D5B7D /* PreferencesWinController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */; };\n\t\t9B5AA0AC209C43C200E8B659 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 9B5AA0AB209C43C200E8B659 /* Credits.rtf */; };\n\t\t9B5D132A2154A62600F99F03 /* install_kcptun.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9B5D13272154A50700F99F03 /* install_kcptun.sh */; };\n\t\t9B5DD7B02683A354005EFEF7 /* ShadowsocksX_NGTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5DD7AF2683A354005EFEF7 /* ShadowsocksX_NGTests.swift */; };\n\t\t9B5DD7B82683A369005EFEF7 /* ServerProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B5DD7B72683A369005EFEF7 /* ServerProfileTests.swift */; };\n\t\t9B6BF9541E27B2570061B9A7 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */; };\n\t\t9B7297EA214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */; };\n\t\t9B7297EC214DA88A00FD24AA /* ShareServerProfilesWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */; };\n\t\t9B72FB62232782A300C6AAAE /* ImportWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B72FB60232782A300C6AAAE /* ImportWindowController.swift */; };\n\t\t9B74B5E9232949B100DEA386 /* ImportWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9B74B5EB232949B100DEA386 /* ImportWindowController.xib */; };\n\t\t9B7725E6232E30C50062299F /* PACURLFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B7725E5232E30C50062299F /* PACURLFormatter.swift */; };\n\t\t9B7725EA232E54A20062299F /* menu_e_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B7725E8232E54A20062299F /* menu_e_icon.png */; };\n\t\t9B7725EB232E54A20062299F /* menu_e_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B7725E9232E54A20062299F /* menu_e_icon@2x.png */; };\n\t\t9B84DAED2163A72F00DFF068 /* Diagnose.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B84DAEC2163A72F00DFF068 /* Diagnose.swift */; };\n\t\t9B86459D1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */; };\n\t\t9B9B9966236992CA0036600F /* v2ray-plugin in Resources */ = {isa = PBXBuildFile; fileRef = 9B9B9965236992C90036600F /* v2ray-plugin */; };\n\t\t9B9F13A71E8A28B300DE4794 /* LaunchHelper.app in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B9F13A61E8A282D00DE4794 /* LaunchHelper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t9BA04B231D23D5A5005AAD7F /* ProxyConfTool.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */; };\n\t\t9BAA662723295FAB00F5CC99 /* icons8-Eye Filled-50.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661723295FAB00F5CC99 /* icons8-Eye Filled-50.png */; };\n\t\t9BAA662823295FAB00F5CC99 /* menu_m_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661823295FAB00F5CC99 /* menu_m_icon.png */; };\n\t\t9BAA662923295FAB00F5CC99 /* menu_p_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661923295FAB00F5CC99 /* menu_p_icon.png */; };\n\t\t9BAA662A23295FAB00F5CC99 /* menu_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661A23295FAB00F5CC99 /* menu_icon@2x.png */; };\n\t\t9BAA662B23295FAB00F5CC99 /* http.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661B23295FAB00F5CC99 /* http.png */; };\n\t\t9BAA662C23295FAC00F5CC99 /* menu_g_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661C23295FAB00F5CC99 /* menu_g_icon@2x.png */; };\n\t\t9BAA662D23295FAC00F5CC99 /* icons8-Blind Filled-50.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661D23295FAB00F5CC99 /* icons8-Blind Filled-50.png */; };\n\t\t9BAA662E23295FAC00F5CC99 /* menu_p_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661E23295FAB00F5CC99 /* menu_p_icon@2x.png */; };\n\t\t9BAA662F23295FAC00F5CC99 /* menu_icon_disabled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA661F23295FAB00F5CC99 /* menu_icon_disabled@2x.png */; };\n\t\t9BAA663023295FAC00F5CC99 /* menu_icon_disabled.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662023295FAB00F5CC99 /* menu_icon_disabled.png */; };\n\t\t9BAA663123295FAC00F5CC99 /* menu_m_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662123295FAB00F5CC99 /* menu_m_icon@2x.png */; };\n\t\t9BAA663223295FAC00F5CC99 /* command-512.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662223295FAB00F5CC99 /* command-512.png */; };\n\t\t9BAA663323295FAC00F5CC99 /* terminal-logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662323295FAB00F5CC99 /* terminal-logo.png */; };\n\t\t9BAA663423295FAC00F5CC99 /* menu_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662423295FAB00F5CC99 /* menu_icon.png */; };\n\t\t9BAA663523295FAC00F5CC99 /* virtual-server-icon-3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662523295FAB00F5CC99 /* virtual-server-icon-3.png */; };\n\t\t9BAA663623295FAC00F5CC99 /* menu_g_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA662623295FAB00F5CC99 /* menu_g_icon.png */; };\n\t\t9BAA66382329636200F5CC99 /* user-privoxy.config in Resources */ = {isa = PBXBuildFile; fileRef = 9BAA66372329636200F5CC99 /* user-privoxy.config */; };\n\t\t9BAFE2E21E83ED7F00F71CCE /* PreferencesWinController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9BAFE2E41E83ED7F00F71CCE /* PreferencesWinController.xib */; };\n\t\t9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB706A51D1B982300551F0E /* SWBApplication.m */; };\n\t\t9BBE7B751F508A0E00E8FFE5 /* fix_dir_owner.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BBE7B711F50790500E8FFE5 /* fix_dir_owner.sh */; };\n\t\t9BC70EDC1D2E3E3100EDA4CA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */; };\n\t\t9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */; };\n\t\t9BEEF06A1D04D4D500FC52B3 /* start_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */; };\n\t\t9BEEF06B1D04D4D500FC52B3 /* stop_ss_local.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */; };\n\t\t9BEEF06E1D04DCE400FC52B3 /* ServerProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */; };\n\t\t9BEEF0701D04DDB100FC52B3 /* ServerProfileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */; };\n\t\t9BEEF0751D04EF3E00FC52B3 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */; };\n\t\t9BEEF0781D04FE8A00FC52B3 /* LaunchAgentUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */; };\n\t\tB5A2AB04221A72EC003F77B7 /* install_v2ray_plugin.sh in Resources */ = {isa = PBXBuildFile; fileRef = B5A2AB02221A72EC003F77B7 /* install_v2ray_plugin.sh */; };\n\t\tC6D429931DA75988002A5711 /* install_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D4298E1DA75988002A5711 /* install_privoxy.sh */; };\n\t\tC6D429941DA75988002A5711 /* privoxy in Resources */ = {isa = PBXBuildFile; fileRef = C6D4298F1DA75988002A5711 /* privoxy */; };\n\t\tC6D429961DA75988002A5711 /* start_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D429911DA75988002A5711 /* start_privoxy.sh */; };\n\t\tC6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */ = {isa = PBXBuildFile; fileRef = C6D429921DA75988002A5711 /* stop_privoxy.sh */; };\n\t\tC6D429991DA76FBC002A5711 /* privoxy.template.config in Resources */ = {isa = PBXBuildFile; fileRef = C6D429981DA76FBC002A5711 /* privoxy.template.config */; };\n\t\tC8E42A6C1D4F270A0074C7EA /* UserRulesController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */; };\n\t\tC8E42A6E1D4F2CAF0074C7EA /* UserRulesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */; };\n\t\tF0809FF1595BE2966343D3C7 /* libPods-proxy_conf_helper.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7783AEDB4A3BDDC9FF16AC /* libPods-proxy_conf_helper.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t9B3FFF521D09E2B30019A709 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 9B0BFFDD1D0460A70040E62B /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9B3FFF431D09CD3B0019A709;\n\t\t\tremoteInfo = proxy_conf_helper;\n\t\t};\n\t\t9B5DD7B22683A354005EFEF7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 9B0BFFDD1D0460A70040E62B /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9B0BFFE41D0460A70040E62B;\n\t\t\tremoteInfo = \"ShadowsocksX-NG\";\n\t\t};\n\t\t9B9F13A51E8A282D00DE4794 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 9B9F13A11E8A282C00DE4794 /* LaunchHelper.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 9B9F138D1E8A282C00DE4794;\n\t\t\tremoteInfo = LaunchHelper;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9B3FFF421D09CD3B0019A709 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n\t\t9B6BF9511E27B2250061B9A7 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Contents/Library/LoginItems;\n\t\t\tdstSubfolderSpec = 1;\n\t\t\tfiles = (\n\t\t\t\t9B9F13A71E8A28B300DE4794 /* LaunchHelper.app in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t19083CFCED87354F006967FF /* Pods_ShadowsocksX_NGUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1C82DBA51FA96C7400B32551 /* obfs-local */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; path = \"obfs-local\"; sourceTree = \"<group>\"; };\n\t\t1C82DBA91FA96F0300B32551 /* install_simple_obfs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = install_simple_obfs.sh; sourceTree = \"<group>\"; };\n\t\t1E7783AEDB4A3BDDC9FF16AC /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-proxy_conf_helper.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t283ED1A8E9B711AC65670031 /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t297AF069022A197FD8E9D226 /* Pods-proxy_conf_helper.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-proxy_conf_helper.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t388120F062D7EB7DD0D8DDCA /* Pods_ShadowsocksX_NGTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3AC7CD9886196A997D6FC78D /* Pods-ShadowsocksX-NGTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-ShadowsocksX-NGTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5B6203C1228FCD3D365814AC /* Pods-ShadowsocksX-NGTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-ShadowsocksX-NGTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-ShadowsocksX-NGTests/Pods-ShadowsocksX-NGTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t9B07EFA61D048BBB0052D9DF /* ss-local */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; path = \"ss-local\"; sourceTree = \"<group>\"; };\n\t\t9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"ShadowsocksX-NG.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B0BFFE81D0460A70040E62B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t9B0BFFEA1D0460A70040E62B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t9B0BFFED1D0460A70040E62B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t9B0BFFEF1D0460A70040E62B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t9B172A601D0ADA5B00B87B9A /* genstrings.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = genstrings.py; sourceTree = \"<group>\"; };\n\t\t9B172A6B1D0ADDDD00B87B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t9B172A6D1D0ADDE800B87B9A /* zh-Hans */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/Localizable.strings\"; sourceTree = \"<group>\"; };\n\t\t9B2080482326AC460075386C /* kcptun.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = kcptun.sh; sourceTree = \"<group>\"; };\n\t\t9B2080492326AC460075386C /* client */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; path = client; sourceTree = \"<group>\"; };\n\t\t9B2491B51D0ACC3A003BBECC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreferencesWindowController.xib; sourceTree = \"<group>\"; };\n\t\t9B3546701E802B1200B510B4 /* ToastWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToastWindowController.swift; sourceTree = \"<group>\"; };\n\t\t9B3546711E802B1200B510B4 /* ToastWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ToastWindowController.xib; sourceTree = \"<group>\"; };\n\t\t9B3FFF0C1D05FEB30019A709 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = \"<group>\"; };\n\t\t9B3FFF131D0705810019A709 /* Notifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = \"<group>\"; };\n\t\t9B3FFF151D072FDE0019A709 /* LaunchAtLoginController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchAtLoginController.h; sourceTree = \"<group>\"; };\n\t\t9B3FFF161D072FDE0019A709 /* LaunchAtLoginController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LaunchAtLoginController.m; sourceTree = \"<group>\"; };\n\t\t9B3FFF1D1D0732660019A709 /* Utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Utils.m; sourceTree = \"<group>\"; };\n\t\t9B3FFF1F1D0734060019A709 /* Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = \"<group>\"; };\n\t\t9B3FFF201D08826E0019A709 /* PACUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PACUtils.swift; sourceTree = \"<group>\"; };\n\t\t9B3FFF221D088E8D0019A709 /* abp.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = abp.js; sourceTree = \"<group>\"; };\n\t\t9B3FFF261D0898EB0019A709 /* gfwlist.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gfwlist.txt; sourceTree = \"<group>\"; };\n\t\t9B3FFF281D08A1DF0019A709 /* user-rule.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = \"user-rule.txt\"; sourceTree = \"<group>\"; };\n\t\t9B3FFF301D08CEE40019A709 /* SWBQRCodeWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWBQRCodeWindowController.h; sourceTree = \"<group>\"; };\n\t\t9B3FFF311D08CEE40019A709 /* SWBQRCodeWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWBQRCodeWindowController.m; sourceTree = \"<group>\"; };\n\t\t9B3FFF331D08CEF70019A709 /* SWBQRCodeWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SWBQRCodeWindowController.xib; sourceTree = \"<group>\"; };\n\t\t9B3FFF3B1D08D93B0019A709 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };\n\t\t9B3FFF3D1D08D9910019A709 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };\n\t\t9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = proxy_conf_helper; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B3FFF461D09CD3B0019A709 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t9B3FFF4B1D09D8F70019A709 /* install_helper.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = install_helper.sh; sourceTree = \"<group>\"; };\n\t\t9B3FFF4D1D09D9D50019A709 /* ProxyConfHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProxyConfHelper.h; sourceTree = \"<group>\"; };\n\t\t9B3FFF4E1D09D9D50019A709 /* ProxyConfHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyConfHelper.m; sourceTree = \"<group>\"; };\n\t\t9B3FFF501D09DAEA0019A709 /* proxy_conf_helper_version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = proxy_conf_helper_version.h; sourceTree = \"<group>\"; };\n\t\t9B3FFF511D09DBA20019A709 /* ShadowsocksX-NG-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"ShadowsocksX-NG-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t9B5831F41E7302F8009D5B7D /* ShortcutsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShortcutsController.h; sourceTree = \"<group>\"; };\n\t\t9B5831F51E7302F8009D5B7D /* ShortcutsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShortcutsController.m; sourceTree = \"<group>\"; };\n\t\t9B5831FA1E73098F009D5B7D /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = \"<group>\"; };\n\t\t9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesWinController.swift; sourceTree = \"<group>\"; };\n\t\t9B5AA0AB209C43C200E8B659 /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = \"<group>\"; };\n\t\t9B5D13272154A50700F99F03 /* install_kcptun.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = install_kcptun.sh; sourceTree = \"<group>\"; };\n\t\t9B5DD7AD2683A354005EFEF7 /* ShadowsocksX-NGTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"ShadowsocksX-NGTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B5DD7AF2683A354005EFEF7 /* ShadowsocksX_NGTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowsocksX_NGTests.swift; sourceTree = \"<group>\"; };\n\t\t9B5DD7B12683A354005EFEF7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t9B5DD7B72683A369005EFEF7 /* ServerProfileTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProfileTests.swift; sourceTree = \"<group>\"; };\n\t\t9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };\n\t\t9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareServerProfilesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t9B7297ED214DA88A00FD24AA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ShareServerProfilesWindowController.xib; sourceTree = \"<group>\"; };\n\t\t9B7297F0214DA89000FD24AA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/ShareServerProfilesWindowController.strings\"; sourceTree = \"<group>\"; };\n\t\t9B72FB60232782A300C6AAAE /* ImportWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportWindowController.swift; sourceTree = \"<group>\"; };\n\t\t9B74B5EF232949D400DEA386 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ImportWindowController.xib; sourceTree = \"<group>\"; };\n\t\t9B74B5F1232949E800DEA386 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/ImportWindowController.strings\"; sourceTree = \"<group>\"; };\n\t\t9B7725E5232E30C50062299F /* PACURLFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PACURLFormatter.swift; sourceTree = \"<group>\"; };\n\t\t9B7725E8232E54A20062299F /* menu_e_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_e_icon.png; sourceTree = \"<group>\"; };\n\t\t9B7725E9232E54A20062299F /* menu_e_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_e_icon@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9B84DAEC2163A72F00DFF068 /* Diagnose.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Diagnose.swift; sourceTree = \"<group>\"; };\n\t\t9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxyInterfacesViewCtrl.swift; sourceTree = \"<group>\"; };\n\t\t9B9B9965236992C90036600F /* v2ray-plugin */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; path = \"v2ray-plugin\"; sourceTree = \"<group>\"; };\n\t\t9B9F13A11E8A282C00DE4794 /* LaunchHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = LaunchHelper.xcodeproj; path = LaunchHelper/LaunchHelper.xcodeproj; sourceTree = \"<group>\"; };\n\t\t9BA04B211D23D5A5005AAD7F /* ProxyConfTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProxyConfTool.h; sourceTree = \"<group>\"; };\n\t\t9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyConfTool.m; sourceTree = \"<group>\"; };\n\t\t9BAA661723295FAB00F5CC99 /* icons8-Eye Filled-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icons8-Eye Filled-50.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA661823295FAB00F5CC99 /* menu_m_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_m_icon.png; sourceTree = \"<group>\"; };\n\t\t9BAA661923295FAB00F5CC99 /* menu_p_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_p_icon.png; sourceTree = \"<group>\"; };\n\t\t9BAA661A23295FAB00F5CC99 /* menu_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_icon@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA661B23295FAB00F5CC99 /* http.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = http.png; sourceTree = \"<group>\"; };\n\t\t9BAA661C23295FAB00F5CC99 /* menu_g_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_g_icon@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA661D23295FAB00F5CC99 /* icons8-Blind Filled-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"icons8-Blind Filled-50.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA661E23295FAB00F5CC99 /* menu_p_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_p_icon@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA661F23295FAB00F5CC99 /* menu_icon_disabled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_icon_disabled@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA662023295FAB00F5CC99 /* menu_icon_disabled.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_icon_disabled.png; sourceTree = \"<group>\"; };\n\t\t9BAA662123295FAB00F5CC99 /* menu_m_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"menu_m_icon@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA662223295FAB00F5CC99 /* command-512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"command-512.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA662323295FAB00F5CC99 /* terminal-logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"terminal-logo.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA662423295FAB00F5CC99 /* menu_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_icon.png; sourceTree = \"<group>\"; };\n\t\t9BAA662523295FAB00F5CC99 /* virtual-server-icon-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"virtual-server-icon-3.png\"; sourceTree = \"<group>\"; };\n\t\t9BAA662623295FAB00F5CC99 /* menu_g_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = menu_g_icon.png; sourceTree = \"<group>\"; };\n\t\t9BAA66372329636200F5CC99 /* user-privoxy.config */ = {isa = PBXFileReference; lastKnownFileType = text; path = \"user-privoxy.config\"; sourceTree = \"<group>\"; };\n\t\t9BAFE2E31E83ED7F00F71CCE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreferencesWinController.xib; sourceTree = \"<group>\"; };\n\t\t9BAFE2E91E83EDDF00F71CCE /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/PreferencesWinController.strings\"; sourceTree = \"<group>\"; };\n\t\t9BAFE2EB1E83F91D00F71CCE /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/MainMenu.strings\"; sourceTree = \"<group>\"; };\n\t\t9BB706A51D1B982300551F0E /* SWBApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWBApplication.m; sourceTree = \"<group>\"; };\n\t\t9BB706A61D1B982300551F0E /* SWBApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWBApplication.h; sourceTree = \"<group>\"; };\n\t\t9BBE7B711F50790500E8FFE5 /* fix_dir_owner.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = fix_dir_owner.sh; sourceTree = \"<group>\"; };\n\t\t9BE8FBC11D0B71CF00CAFD01 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/PreferencesWindowController.strings\"; sourceTree = \"<group>\"; };\n\t\t9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = install_ss_local.sh; sourceTree = \"<group>\"; };\n\t\t9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = start_ss_local.sh; sourceTree = \"<group>\"; };\n\t\t9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = stop_ss_local.sh; sourceTree = \"<group>\"; };\n\t\t9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProfile.swift; sourceTree = \"<group>\"; };\n\t\t9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProfileManager.swift; sourceTree = \"<group>\"; };\n\t\t9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = \"<group>\"; };\n\t\t9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchAgentUtils.swift; sourceTree = \"<group>\"; };\n\t\tB4E6A97CA843F3943524B686 /* Pods-proxy_conf_helper.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-proxy_conf_helper.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-proxy_conf_helper/Pods-proxy_conf_helper.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB5A2AB02221A72EC003F77B7 /* install_v2ray_plugin.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = install_v2ray_plugin.sh; sourceTree = \"<group>\"; };\n\t\tC6D4298E1DA75988002A5711 /* install_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = install_privoxy.sh; sourceTree = \"<group>\"; };\n\t\tC6D4298F1DA75988002A5711 /* privoxy */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; path = privoxy; sourceTree = \"<group>\"; };\n\t\tC6D429911DA75988002A5711 /* start_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = start_privoxy.sh; sourceTree = \"<group>\"; };\n\t\tC6D429921DA75988002A5711 /* stop_privoxy.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = stop_privoxy.sh; sourceTree = \"<group>\"; };\n\t\tC6D429981DA76FBC002A5711 /* privoxy.template.config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = privoxy.template.config; sourceTree = \"<group>\"; };\n\t\tC8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserRulesController.swift; sourceTree = \"<group>\"; };\n\t\tC8E42A6F1D4F2CAF0074C7EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/UserRulesController.xib; sourceTree = \"<group>\"; };\n\t\tC8E42A721D4F2CB10074C7EA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/UserRulesController.strings\"; sourceTree = \"<group>\"; };\n\t\tE9E9FB3855DA55D0710EE7BD /* Pods-ShadowsocksX-NG.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-ShadowsocksX-NG.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tFE3237E9FB24D9B924A0E630 /* Pods-ShadowsocksX-NG.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-ShadowsocksX-NG.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG.debug.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t9B0BFFE21D0460A70040E62B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B6BF9541E27B2570061B9A7 /* ServiceManagement.framework in Frameworks */,\n\t\t\t\t9B3FFF3E1D08D9910019A709 /* SystemConfiguration.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B3FFF411D09CD3B0019A709 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF0809FF1595BE2966343D3C7 /* libPods-proxy_conf_helper.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B5DD7AA2683A354005EFEF7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1C82DBA31FA96C7400B32551 /* simple-obfs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1C82DBA51FA96C7400B32551 /* obfs-local */,\n\t\t\t\t1C82DBA91FA96F0300B32551 /* install_simple_obfs.sh */,\n\t\t\t);\n\t\t\tpath = \"simple-obfs\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t33F4F299F89330966F4526E4 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFE3237E9FB24D9B924A0E630 /* Pods-ShadowsocksX-NG.debug.xcconfig */,\n\t\t\t\tE9E9FB3855DA55D0710EE7BD /* Pods-ShadowsocksX-NG.release.xcconfig */,\n\t\t\t\t5B6203C1228FCD3D365814AC /* Pods-ShadowsocksX-NGTests.debug.xcconfig */,\n\t\t\t\t3AC7CD9886196A997D6FC78D /* Pods-ShadowsocksX-NGTests.release.xcconfig */,\n\t\t\t\tB4E6A97CA843F3943524B686 /* Pods-proxy_conf_helper.debug.xcconfig */,\n\t\t\t\t297AF069022A197FD8E9D226 /* Pods-proxy_conf_helper.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B07EFB01D048E900052D9DF /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9BAA661623295F7F00F5CC99 /* images */,\n\t\t\t\tB5A2AB00221A72EC003F77B7 /* v2ray-plugin */,\n\t\t\t\t9B5D13252154A4B400F99F03 /* kcptun */,\n\t\t\t\t9B5AA0A9209C41EC00E8B659 /* ss-local */,\n\t\t\t\t1C82DBA31FA96C7400B32551 /* simple-obfs */,\n\t\t\t\t9B5AA0AA209C42A900E8B659 /* privoxy */,\n\t\t\t\t9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */,\n\t\t\t\t9B3FFF4B1D09D8F70019A709 /* install_helper.sh */,\n\t\t\t\t9B3FFF281D08A1DF0019A709 /* user-rule.txt */,\n\t\t\t\t9B3FFF261D0898EB0019A709 /* gfwlist.txt */,\n\t\t\t\t9B3FFF221D088E8D0019A709 /* abp.js */,\n\t\t\t\t9BBE7B711F50790500E8FFE5 /* fix_dir_owner.sh */,\n\t\t\t\t9B5AA0AB209C43C200E8B659 /* Credits.rtf */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B0BFFDC1D0460A70040E62B = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B5831FA1E73098F009D5B7D /* README.md */,\n\t\t\t\t9B172A601D0ADA5B00B87B9A /* genstrings.py */,\n\t\t\t\t9B9F13A11E8A282C00DE4794 /* LaunchHelper.xcodeproj */,\n\t\t\t\t9B0BFFE71D0460A70040E62B /* ShadowsocksX-NG */,\n\t\t\t\t9B3FFF451D09CD3B0019A709 /* proxy_conf_helper */,\n\t\t\t\t9B5DD7AE2683A354005EFEF7 /* ShadowsocksX-NGTests */,\n\t\t\t\t9B0BFFE61D0460A70040E62B /* Products */,\n\t\t\t\t33F4F299F89330966F4526E4 /* Pods */,\n\t\t\t\tD3CE66CC039F651F28057DDB /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B0BFFE61D0460A70040E62B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */,\n\t\t\t\t9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */,\n\t\t\t\t9B5DD7AD2683A354005EFEF7 /* ShadowsocksX-NGTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B0BFFE71D0460A70040E62B /* ShadowsocksX-NG */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9BB706A51D1B982300551F0E /* SWBApplication.m */,\n\t\t\t\t9BB706A61D1B982300551F0E /* SWBApplication.h */,\n\t\t\t\t9B3FFF511D09DBA20019A709 /* ShadowsocksX-NG-Bridging-Header.h */,\n\t\t\t\t9B3FFF151D072FDE0019A709 /* LaunchAtLoginController.h */,\n\t\t\t\t9B3FFF161D072FDE0019A709 /* LaunchAtLoginController.m */,\n\t\t\t\t9B3FFF0B1D05D8B80019A709 /* UI */,\n\t\t\t\t9B07EFB01D048E900052D9DF /* Support Files */,\n\t\t\t\t9B0BFFE81D0460A70040E62B /* AppDelegate.swift */,\n\t\t\t\t9B0BFFEA1D0460A70040E62B /* Assets.xcassets */,\n\t\t\t\t9B0BFFEC1D0460A70040E62B /* MainMenu.xib */,\n\t\t\t\t9B0BFFEF1D0460A70040E62B /* Info.plist */,\n\t\t\t\t9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */,\n\t\t\t\t9B7725E5232E30C50062299F /* PACURLFormatter.swift */,\n\t\t\t\t9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */,\n\t\t\t\t9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */,\n\t\t\t\t9B3FFF0C1D05FEB30019A709 /* Utils.swift */,\n\t\t\t\t9B3FFF201D08826E0019A709 /* PACUtils.swift */,\n\t\t\t\t9B3FFF131D0705810019A709 /* Notifications.swift */,\n\t\t\t\t9B3FFF1D1D0732660019A709 /* Utils.m */,\n\t\t\t\t9B3FFF1F1D0734060019A709 /* Utils.h */,\n\t\t\t\t9B3FFF4D1D09D9D50019A709 /* ProxyConfHelper.h */,\n\t\t\t\t9B3FFF4E1D09D9D50019A709 /* ProxyConfHelper.m */,\n\t\t\t\t9B3FFF501D09DAEA0019A709 /* proxy_conf_helper_version.h */,\n\t\t\t\t9BA04B211D23D5A5005AAD7F /* ProxyConfTool.h */,\n\t\t\t\t9BA04B221D23D5A5005AAD7F /* ProxyConfTool.m */,\n\t\t\t\t9B5831F41E7302F8009D5B7D /* ShortcutsController.h */,\n\t\t\t\t9B5831F51E7302F8009D5B7D /* ShortcutsController.m */,\n\t\t\t\t9B84DAEC2163A72F00DFF068 /* Diagnose.swift */,\n\t\t\t);\n\t\t\tpath = \"ShadowsocksX-NG\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B3FFF0B1D05D8B80019A709 /* UI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B3FFF331D08CEF70019A709 /* SWBQRCodeWindowController.xib */,\n\t\t\t\t9B3FFF301D08CEE40019A709 /* SWBQRCodeWindowController.h */,\n\t\t\t\t9B3FFF311D08CEE40019A709 /* SWBQRCodeWindowController.m */,\n\t\t\t\t9BEEF0731D04EF3E00FC52B3 /* PreferencesWindowController.swift */,\n\t\t\t\t9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */,\n\t\t\t\tC8E42A6A1D4F270A0074C7EA /* UserRulesController.swift */,\n\t\t\t\tC8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */,\n\t\t\t\t9B5831FD1E741969009D5B7D /* PreferencesWinController.swift */,\n\t\t\t\t9BAFE2E41E83ED7F00F71CCE /* PreferencesWinController.xib */,\n\t\t\t\t9B86459C1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift */,\n\t\t\t\t9B3546701E802B1200B510B4 /* ToastWindowController.swift */,\n\t\t\t\t9B3546711E802B1200B510B4 /* ToastWindowController.xib */,\n\t\t\t\t9B7297E8214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift */,\n\t\t\t\t9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */,\n\t\t\t\t9B72FB60232782A300C6AAAE /* ImportWindowController.swift */,\n\t\t\t\t9B74B5EB232949B100DEA386 /* ImportWindowController.xib */,\n\t\t\t);\n\t\t\tname = UI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B3FFF451D09CD3B0019A709 /* proxy_conf_helper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B3FFF461D09CD3B0019A709 /* main.m */,\n\t\t\t);\n\t\t\tpath = proxy_conf_helper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B5AA0A9209C41EC00E8B659 /* ss-local */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B07EFA61D048BBB0052D9DF /* ss-local */,\n\t\t\t\t9BEEF0651D04CB8500FC52B3 /* install_ss_local.sh */,\n\t\t\t\t9BEEF0661D04CE8D00FC52B3 /* start_ss_local.sh */,\n\t\t\t\t9BEEF0671D04CE9A00FC52B3 /* stop_ss_local.sh */,\n\t\t\t);\n\t\t\tpath = \"ss-local\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B5AA0AA209C42A900E8B659 /* privoxy */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC6D429981DA76FBC002A5711 /* privoxy.template.config */,\n\t\t\t\t9BAA66372329636200F5CC99 /* user-privoxy.config */,\n\t\t\t\tC6D4298F1DA75988002A5711 /* privoxy */,\n\t\t\t\tC6D4298E1DA75988002A5711 /* install_privoxy.sh */,\n\t\t\t\tC6D429911DA75988002A5711 /* start_privoxy.sh */,\n\t\t\t\tC6D429921DA75988002A5711 /* stop_privoxy.sh */,\n\t\t\t);\n\t\t\tpath = privoxy;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B5D13252154A4B400F99F03 /* kcptun */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B2080492326AC460075386C /* client */,\n\t\t\t\t9B2080482326AC460075386C /* kcptun.sh */,\n\t\t\t\t9B5D13272154A50700F99F03 /* install_kcptun.sh */,\n\t\t\t);\n\t\t\tpath = kcptun;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B5DD7AE2683A354005EFEF7 /* ShadowsocksX-NGTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B5DD7B72683A369005EFEF7 /* ServerProfileTests.swift */,\n\t\t\t\t9B5DD7AF2683A354005EFEF7 /* ShadowsocksX_NGTests.swift */,\n\t\t\t\t9B5DD7B12683A354005EFEF7 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = \"ShadowsocksX-NGTests\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B9F13A21E8A282C00DE4794 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9F13A61E8A282D00DE4794 /* LaunchHelper.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9BAA661623295F7F00F5CC99 /* images */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B7725E8232E54A20062299F /* menu_e_icon.png */,\n\t\t\t\t9B7725E9232E54A20062299F /* menu_e_icon@2x.png */,\n\t\t\t\t9BAA662223295FAB00F5CC99 /* command-512.png */,\n\t\t\t\t9BAA661B23295FAB00F5CC99 /* http.png */,\n\t\t\t\t9BAA661D23295FAB00F5CC99 /* icons8-Blind Filled-50.png */,\n\t\t\t\t9BAA661723295FAB00F5CC99 /* icons8-Eye Filled-50.png */,\n\t\t\t\t9BAA662623295FAB00F5CC99 /* menu_g_icon.png */,\n\t\t\t\t9BAA661C23295FAB00F5CC99 /* menu_g_icon@2x.png */,\n\t\t\t\t9BAA662023295FAB00F5CC99 /* menu_icon_disabled.png */,\n\t\t\t\t9BAA661F23295FAB00F5CC99 /* menu_icon_disabled@2x.png */,\n\t\t\t\t9BAA662423295FAB00F5CC99 /* menu_icon.png */,\n\t\t\t\t9BAA661A23295FAB00F5CC99 /* menu_icon@2x.png */,\n\t\t\t\t9BAA661823295FAB00F5CC99 /* menu_m_icon.png */,\n\t\t\t\t9BAA662123295FAB00F5CC99 /* menu_m_icon@2x.png */,\n\t\t\t\t9BAA661923295FAB00F5CC99 /* menu_p_icon.png */,\n\t\t\t\t9BAA661E23295FAB00F5CC99 /* menu_p_icon@2x.png */,\n\t\t\t\t9BAA662323295FAB00F5CC99 /* terminal-logo.png */,\n\t\t\t\t9BAA662523295FAB00F5CC99 /* virtual-server-icon-3.png */,\n\t\t\t);\n\t\t\tpath = images;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB5A2AB00221A72EC003F77B7 /* v2ray-plugin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B9B9965236992C90036600F /* v2ray-plugin */,\n\t\t\t\tB5A2AB02221A72EC003F77B7 /* install_v2ray_plugin.sh */,\n\t\t\t);\n\t\t\tpath = \"v2ray-plugin\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD3CE66CC039F651F28057DDB /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B6BF9531E27B2570061B9A7 /* ServiceManagement.framework */,\n\t\t\t\t9B3FFF3D1D08D9910019A709 /* SystemConfiguration.framework */,\n\t\t\t\t9B3FFF3B1D08D93B0019A709 /* WebKit.framework */,\n\t\t\t\t283ED1A8E9B711AC65670031 /* Pods_ShadowsocksX_NG.framework */,\n\t\t\t\t388120F062D7EB7DD0D8DDCA /* Pods_ShadowsocksX_NGTests.framework */,\n\t\t\t\t19083CFCED87354F006967FF /* Pods_ShadowsocksX_NGUITests.framework */,\n\t\t\t\t1E7783AEDB4A3BDDC9FF16AC /* libPods-proxy_conf_helper.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget \"ShadowsocksX-NG\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA3C8167BB5EB01FBDE2A08BC /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9B0BFFE11D0460A70040E62B /* Sources */,\n\t\t\t\t9B0BFFE21D0460A70040E62B /* Frameworks */,\n\t\t\t\t9B0BFFE31D0460A70040E62B /* Resources */,\n\t\t\t\t5E160625E3EC80E27DA7EF05 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t9B6BF9511E27B2250061B9A7 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t9B3FFF531D09E2B30019A709 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"ShadowsocksX-NG\";\n\t\t\tproductName = \"ShadowsocksX-NG\";\n\t\t\tproductReference = 9B0BFFE51D0460A70040E62B /* ShadowsocksX-NG.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t9B3FFF431D09CD3B0019A709 /* proxy_conf_helper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9B3FFF481D09CD3B0019A709 /* Build configuration list for PBXNativeTarget \"proxy_conf_helper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3545247EFCD033C3FA63EA6C /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9B3FFF401D09CD3B0019A709 /* Sources */,\n\t\t\t\t9B3FFF411D09CD3B0019A709 /* Frameworks */,\n\t\t\t\t9B3FFF421D09CD3B0019A709 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = proxy_conf_helper;\n\t\t\tproductName = proxy_conf_helper;\n\t\t\tproductReference = 9B3FFF441D09CD3B0019A709 /* proxy_conf_helper */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t9B5DD7AC2683A354005EFEF7 /* ShadowsocksX-NGTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9B5DD7B42683A354005EFEF7 /* Build configuration list for PBXNativeTarget \"ShadowsocksX-NGTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9B5DD7A92683A354005EFEF7 /* Sources */,\n\t\t\t\t9B5DD7AA2683A354005EFEF7 /* Frameworks */,\n\t\t\t\t9B5DD7AB2683A354005EFEF7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t9B5DD7B32683A354005EFEF7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"ShadowsocksX-NGTests\";\n\t\t\tproductName = \"ShadowsocksX-NGTests\";\n\t\t\tproductReference = 9B5DD7AD2683A354005EFEF7 /* ShadowsocksX-NGTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t9B0BFFDD1D0460A70040E62B /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1250;\n\t\t\t\tLastUpgradeCheck = 1250;\n\t\t\t\tORGANIZATIONNAME = qiuyuzhou;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t9B0BFFE41D0460A70040E62B = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1250;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t9B3FFF431D09CD3B0019A709 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t9B5DD7AC2683A354005EFEF7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 12.5.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t\tTestTargetID = 9B0BFFE41D0460A70040E62B;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 9B0BFFE01D0460A70040E62B /* Build configuration list for PBXProject \"ShadowsocksX-NG\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t\t\"zh-Hans\",\n\t\t\t);\n\t\t\tmainGroup = 9B0BFFDC1D0460A70040E62B;\n\t\t\tproductRefGroup = 9B0BFFE61D0460A70040E62B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 9B9F13A21E8A282C00DE4794 /* Products */;\n\t\t\t\t\tProjectRef = 9B9F13A11E8A282C00DE4794 /* LaunchHelper.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */,\n\t\t\t\t9B3FFF431D09CD3B0019A709 /* proxy_conf_helper */,\n\t\t\t\t9B5DD7AC2683A354005EFEF7 /* ShadowsocksX-NGTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t9B9F13A61E8A282D00DE4794 /* LaunchHelper.app */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.application;\n\t\t\tpath = LaunchHelper.app;\n\t\t\tremoteRef = 9B9F13A51E8A282D00DE4794 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t9B0BFFE31D0460A70040E62B /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B5D132A2154A62600F99F03 /* install_kcptun.sh in Resources */,\n\t\t\t\t9BBE7B751F508A0E00E8FFE5 /* fix_dir_owner.sh in Resources */,\n\t\t\t\t9BAA66382329636200F5CC99 /* user-privoxy.config in Resources */,\n\t\t\t\t9BAA662D23295FAC00F5CC99 /* icons8-Blind Filled-50.png in Resources */,\n\t\t\t\t9BAA663623295FAC00F5CC99 /* menu_g_icon.png in Resources */,\n\t\t\t\t9BAA662E23295FAC00F5CC99 /* menu_p_icon@2x.png in Resources */,\n\t\t\t\t1C82DBAA1FA96FB600B32551 /* install_simple_obfs.sh in Resources */,\n\t\t\t\t9B74B5E9232949B100DEA386 /* ImportWindowController.xib in Resources */,\n\t\t\t\t9BAA663523295FAC00F5CC99 /* virtual-server-icon-3.png in Resources */,\n\t\t\t\t9B3FFF541D09E2D10019A709 /* proxy_conf_helper in Resources */,\n\t\t\t\t9BAA662723295FAB00F5CC99 /* icons8-Eye Filled-50.png in Resources */,\n\t\t\t\t9BEEF0691D04D4D500FC52B3 /* install_ss_local.sh in Resources */,\n\t\t\t\t9B2491B41D0ACC3A003BBECC /* PreferencesWindowController.xib in Resources */,\n\t\t\t\t9B3FFF291D08A1DF0019A709 /* user-rule.txt in Resources */,\n\t\t\t\t9BAA663123295FAC00F5CC99 /* menu_m_icon@2x.png in Resources */,\n\t\t\t\tC6D429971DA75988002A5711 /* stop_privoxy.sh in Resources */,\n\t\t\t\t9BAA662F23295FAC00F5CC99 /* menu_icon_disabled@2x.png in Resources */,\n\t\t\t\tC8E42A6E1D4F2CAF0074C7EA /* UserRulesController.xib in Resources */,\n\t\t\t\t9BAA663423295FAC00F5CC99 /* menu_icon.png in Resources */,\n\t\t\t\t9BEEF06A1D04D4D500FC52B3 /* start_ss_local.sh in Resources */,\n\t\t\t\t9B3546731E802B1200B510B4 /* ToastWindowController.xib in Resources */,\n\t\t\t\t9B7725EA232E54A20062299F /* menu_e_icon.png in Resources */,\n\t\t\t\t9BAA662923295FAB00F5CC99 /* menu_p_icon.png in Resources */,\n\t\t\t\tC6D429941DA75988002A5711 /* privoxy in Resources */,\n\t\t\t\tC6D429991DA76FBC002A5711 /* privoxy.template.config in Resources */,\n\t\t\t\t9BEEF06B1D04D4D500FC52B3 /* stop_ss_local.sh in Resources */,\n\t\t\t\t9B3FFF341D08CEF70019A709 /* SWBQRCodeWindowController.xib in Resources */,\n\t\t\t\t9B3FFF231D088E8D0019A709 /* abp.js in Resources */,\n\t\t\t\t9BAFE2E21E83ED7F00F71CCE /* PreferencesWinController.xib in Resources */,\n\t\t\t\t9BAA663223295FAC00F5CC99 /* command-512.png in Resources */,\n\t\t\t\t9BAA663023295FAC00F5CC99 /* menu_icon_disabled.png in Resources */,\n\t\t\t\t9B7725EB232E54A20062299F /* menu_e_icon@2x.png in Resources */,\n\t\t\t\t9BAA662C23295FAC00F5CC99 /* menu_g_icon@2x.png in Resources */,\n\t\t\t\t9BAA663323295FAC00F5CC99 /* terminal-logo.png in Resources */,\n\t\t\t\t9B0BFFEB1D0460A70040E62B /* Assets.xcassets in Resources */,\n\t\t\t\tB5A2AB04221A72EC003F77B7 /* install_v2ray_plugin.sh in Resources */,\n\t\t\t\t9BAA662B23295FAB00F5CC99 /* http.png in Resources */,\n\t\t\t\t1C82DBA81FA96C7500B32551 /* obfs-local in Resources */,\n\t\t\t\t9B7297EC214DA88A00FD24AA /* ShareServerProfilesWindowController.xib in Resources */,\n\t\t\t\t9B3FFF271D0898EB0019A709 /* gfwlist.txt in Resources */,\n\t\t\t\tC6D429931DA75988002A5711 /* install_privoxy.sh in Resources */,\n\t\t\t\t9BC70EDC1D2E3E3100EDA4CA /* Localizable.strings in Resources */,\n\t\t\t\t9B20804B2326AC460075386C /* client in Resources */,\n\t\t\t\t9B0BFFEE1D0460A70040E62B /* MainMenu.xib in Resources */,\n\t\t\t\t9B9B9966236992CA0036600F /* v2ray-plugin in Resources */,\n\t\t\t\t9B3FFF4C1D09D8F70019A709 /* install_helper.sh in Resources */,\n\t\t\t\t9BAA662823295FAB00F5CC99 /* menu_m_icon.png in Resources */,\n\t\t\t\tC6D429961DA75988002A5711 /* start_privoxy.sh in Resources */,\n\t\t\t\t9BAA662A23295FAB00F5CC99 /* menu_icon@2x.png in Resources */,\n\t\t\t\t9B5AA0AC209C43C200E8B659 /* Credits.rtf in Resources */,\n\t\t\t\t9B07EFA71D048BBB0052D9DF /* ss-local in Resources */,\n\t\t\t\t9B20804A2326AC460075386C /* kcptun.sh in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B5DD7AB2683A354005EFEF7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3545247EFCD033C3FA63EA6C /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-proxy_conf_helper-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t5E160625E3EC80E27DA7EF05 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/GCDWebServer/GCDWebServer.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/MASShortcut/MASShortcut.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GCDWebServer.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MASShortcut.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxRelay.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-ShadowsocksX-NG/Pods-ShadowsocksX-NG-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tA3C8167BB5EB01FBDE2A08BC /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-ShadowsocksX-NG-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t9B0BFFE11D0460A70040E62B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B3FFF171D072FDE0019A709 /* LaunchAtLoginController.m in Sources */,\n\t\t\t\t9B7725E6232E30C50062299F /* PACURLFormatter.swift in Sources */,\n\t\t\t\t9B86459D1E7C2CAD00A84029 /* ProxyInterfacesViewCtrl.swift in Sources */,\n\t\t\t\t9B3FFF4F1D09D9D50019A709 /* ProxyConfHelper.m in Sources */,\n\t\t\t\t9B5831F61E7302F8009D5B7D /* ShortcutsController.m in Sources */,\n\t\t\t\t9BB706A71D1B982300551F0E /* SWBApplication.m in Sources */,\n\t\t\t\t9B3FFF1E1D0732660019A709 /* Utils.m in Sources */,\n\t\t\t\t9B7297EA214D7C6B00FD24AA /* ShareServerProfilesWindowController.swift in Sources */,\n\t\t\t\t9B3FFF321D08CEE40019A709 /* SWBQRCodeWindowController.m in Sources */,\n\t\t\t\t9B3FFF211D08826E0019A709 /* PACUtils.swift in Sources */,\n\t\t\t\t9B3FFF141D0705810019A709 /* Notifications.swift in Sources */,\n\t\t\t\t9BEEF0701D04DDB100FC52B3 /* ServerProfileManager.swift in Sources */,\n\t\t\t\t9BEEF06E1D04DCE400FC52B3 /* ServerProfile.swift in Sources */,\n\t\t\t\t9B72FB62232782A300C6AAAE /* ImportWindowController.swift in Sources */,\n\t\t\t\t9B3FFF0D1D05FEB30019A709 /* Utils.swift in Sources */,\n\t\t\t\t9BEEF0751D04EF3E00FC52B3 /* PreferencesWindowController.swift in Sources */,\n\t\t\t\t9B0BFFE91D0460A70040E62B /* AppDelegate.swift in Sources */,\n\t\t\t\t9B84DAED2163A72F00DFF068 /* Diagnose.swift in Sources */,\n\t\t\t\t9BA04B231D23D5A5005AAD7F /* ProxyConfTool.m in Sources */,\n\t\t\t\t9B5831FF1E741969009D5B7D /* PreferencesWinController.swift in Sources */,\n\t\t\t\t9BEEF0781D04FE8A00FC52B3 /* LaunchAgentUtils.swift in Sources */,\n\t\t\t\t9B3546721E802B1200B510B4 /* ToastWindowController.swift in Sources */,\n\t\t\t\tC8E42A6C1D4F270A0074C7EA /* UserRulesController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B3FFF401D09CD3B0019A709 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B3FFF471D09CD3B0019A709 /* main.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B5DD7A92683A354005EFEF7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B5DD7B82683A369005EFEF7 /* ServerProfileTests.swift in Sources */,\n\t\t\t\t9B5DD7B02683A354005EFEF7 /* ShadowsocksX_NGTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t9B3FFF531D09E2B30019A709 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 9B3FFF431D09CD3B0019A709 /* proxy_conf_helper */;\n\t\t\ttargetProxy = 9B3FFF521D09E2B30019A709 /* PBXContainerItemProxy */;\n\t\t};\n\t\t9B5DD7B32683A354005EFEF7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 9B0BFFE41D0460A70040E62B /* ShadowsocksX-NG */;\n\t\t\ttargetProxy = 9B5DD7B22683A354005EFEF7 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t9B0BFFEC1D0460A70040E62B /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B0BFFED1D0460A70040E62B /* Base */,\n\t\t\t\t9BAFE2EB1E83F91D00F71CCE /* zh-Hans */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B172A6C1D0ADDDD00B87B9A /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B172A6B1D0ADDDD00B87B9A /* Base */,\n\t\t\t\t9B172A6D1D0ADDE800B87B9A /* zh-Hans */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B2491B61D0ACC3A003BBECC /* PreferencesWindowController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B2491B51D0ACC3A003BBECC /* Base */,\n\t\t\t\t9BE8FBC11D0B71CF00CAFD01 /* zh-Hans */,\n\t\t\t);\n\t\t\tname = PreferencesWindowController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B7297EE214DA88A00FD24AA /* ShareServerProfilesWindowController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B7297ED214DA88A00FD24AA /* Base */,\n\t\t\t\t9B7297F0214DA89000FD24AA /* zh-Hans */,\n\t\t\t);\n\t\t\tname = ShareServerProfilesWindowController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B74B5EB232949B100DEA386 /* ImportWindowController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9B74B5EF232949D400DEA386 /* Base */,\n\t\t\t\t9B74B5F1232949E800DEA386 /* zh-Hans */,\n\t\t\t);\n\t\t\tname = ImportWindowController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9BAFE2E41E83ED7F00F71CCE /* PreferencesWinController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t9BAFE2E31E83ED7F00F71CCE /* Base */,\n\t\t\t\t9BAFE2E91E83EDDF00F71CCE /* zh-Hans */,\n\t\t\t);\n\t\t\tname = PreferencesWinController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC8E42A701D4F2CAF0074C7EA /* UserRulesController.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tC8E42A6F1D4F2CAF0074C7EA /* Base */,\n\t\t\t\tC8E42A721D4F2CB10074C7EA /* zh-Hans */,\n\t\t\t);\n\t\t\tname = UserRulesController.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t9B0B00061D0460A70040E62B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = \"$(inherited)\";\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = \"$(inherited)\";\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B0B00071D0460A70040E62B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = \"$(inherited)\";\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = \"$(inherited)\";\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9B0B00091D0460A70040E62B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = FE3237E9FB24D9B924A0E630 /* Pods-ShadowsocksX-NG.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 2;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/libcork/include/\",\n\t\t\t\t\t\"$(SRCROOT)/libipset/include/\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"ShadowsocksX-NG/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.productivity\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ShadowsocksX-NG\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ShadowsocksX-NG/simple-obfs\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NG\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B0B000A1D0460A70040E62B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E9E9FB3855DA55D0710EE7BD /* Pods-ShadowsocksX-NG.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 2;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SRCROOT)/libcork/include/\",\n\t\t\t\t\t\"$(SRCROOT)/libipset/include/\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"ShadowsocksX-NG/Info.plist\";\n\t\t\t\tINFOPLIST_KEY_LSApplicationCategoryType = \"public.app-category.productivity\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/system\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ShadowsocksX-NG\",\n\t\t\t\t\t\"$(PROJECT_DIR)/ShadowsocksX-NG/simple-obfs\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NG\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"ShadowsocksX-NG/ShadowsocksX-NG-Bridging-Header.h\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9B3FFF491D09CD3B0019A709 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B4E6A97CA843F3943524B686 /* Pods-proxy_conf_helper.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B3FFF4A1D09CD3B0019A709 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 297AF069022A197FD8E9D226 /* Pods-proxy_conf_helper.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9B5DD7B52683A354005EFEF7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"ShadowsocksX-NGTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NGTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/ShadowsocksX-NG.app/Contents/MacOS/ShadowsocksX-NG\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B5DD7B62683A354005EFEF7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"ShadowsocksX-NGTests/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.qiuyuzhou.ShadowsocksX-NGTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/ShadowsocksX-NG.app/Contents/MacOS/ShadowsocksX-NG\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t9B0B00081D0460A70040E62B /* Build configuration list for PBXNativeTarget \"ShadowsocksX-NG\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B0B00091D0460A70040E62B /* Debug */,\n\t\t\t\t9B0B000A1D0460A70040E62B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9B0BFFE01D0460A70040E62B /* Build configuration list for PBXProject \"ShadowsocksX-NG\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B0B00061D0460A70040E62B /* Debug */,\n\t\t\t\t9B0B00071D0460A70040E62B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9B3FFF481D09CD3B0019A709 /* Build configuration list for PBXNativeTarget \"proxy_conf_helper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B3FFF491D09CD3B0019A709 /* Debug */,\n\t\t\t\t9B3FFF4A1D09CD3B0019A709 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9B5DD7B42683A354005EFEF7 /* Build configuration list for PBXNativeTarget \"ShadowsocksX-NGTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B5DD7B52683A354005EFEF7 /* Debug */,\n\t\t\t\t9B5DD7B62683A354005EFEF7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 9B0BFFDD1D0460A70040E62B /* Project object */;\n}\n"
  },
  {
    "path": "ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NG.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1250\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9B0BFFE41D0460A70040E62B\"\n               BuildableName = \"ShadowsocksX-NG.app\"\n               BlueprintName = \"ShadowsocksX-NG\"\n               ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B0BFFE41D0460A70040E62B\"\n            BuildableName = \"ShadowsocksX-NG.app\"\n            BlueprintName = \"ShadowsocksX-NG\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9B0BFFF31D0460A70040E62B\"\n               BuildableName = \"ShadowsocksX-NGTests.xctest\"\n               BlueprintName = \"ShadowsocksX-NGTests\"\n               ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B0BFFE41D0460A70040E62B\"\n            BuildableName = \"ShadowsocksX-NG.app\"\n            BlueprintName = \"ShadowsocksX-NG\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B0BFFE41D0460A70040E62B\"\n            BuildableName = \"ShadowsocksX-NG.app\"\n            BlueprintName = \"ShadowsocksX-NG\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/ShadowsocksX-NGTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1250\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9B0BFFF31D0460A70040E62B\"\n               BuildableName = \"ShadowsocksX-NGTests.xctest\"\n               BlueprintName = \"ShadowsocksX-NGTests\"\n               ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ShadowsocksX-NG.xcodeproj/xcshareddata/xcschemes/proxy_conf_helper.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1250\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9B3FFF431D09CD3B0019A709\"\n               BuildableName = \"proxy_conf_helper\"\n               BlueprintName = \"proxy_conf_helper\"\n               ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B3FFF431D09CD3B0019A709\"\n            BuildableName = \"proxy_conf_helper\"\n            BlueprintName = \"proxy_conf_helper\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B3FFF431D09CD3B0019A709\"\n            BuildableName = \"proxy_conf_helper\"\n            BlueprintName = \"proxy_conf_helper\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9B3FFF431D09CD3B0019A709\"\n            BuildableName = \"proxy_conf_helper\"\n            BlueprintName = \"proxy_conf_helper\"\n            ReferencedContainer = \"container:ShadowsocksX-NG.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ShadowsocksX-NG.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ShadowsocksX-NGTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ShadowsocksX-NGTests/ServerProfileTests.swift",
    "content": "//\n//  ServerProfileTests.swift\n//  ShadowsocksX-NG\n//\n//  Created by Rainux Luo on 07/01/2017.\n//  Copyright © 2017 qiuyuzhou. All rights reserved.\n//\n\nimport XCTest\n@testable import ShadowsocksX_NG\n\nclass ServerProfileTests: XCTestCase {\n\n    var profile: ServerProfile!\n\n    override func setUp() {\n        super.setUp()\n\n        profile = ServerProfile.fromDictionary([\"ServerHost\": \"example.com\",\n                                                \"ServerPort\": 8388,\n                                                \"Method\": \"aes-256-cfb\",\n                                                \"Password\": \"password\",\n                                                \"Remark\": \"Protoss Prism\",\n                                                \"OTA\": true])\n        XCTAssertNotNil(profile)\n    }\n\n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testInitWithSelfGeneratedURL() {\n        let newProfile = ServerProfile.init(url: profile.URL()!)\n\n        XCTAssertEqual(newProfile?.serverHost, profile.serverHost)\n        XCTAssertEqual(newProfile?.serverPort, profile.serverPort)\n        XCTAssertEqual(newProfile?.method, profile.method)\n        XCTAssertEqual(newProfile?.password, profile.password)\n        XCTAssertEqual(newProfile?.remark, profile.remark)\n    }\n\n    func testInitWithBase64EncodedURL() {\n        // \"ss://aes-256-cfb:password@example.com:8388\"\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODM4OA\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNotNil(profile)\n\n        XCTAssertEqual(profile?.serverHost, \"example.com\")\n        XCTAssertEqual(profile?.serverPort, 8388)\n        XCTAssertEqual(profile?.method, \"aes-256-cfb\")\n        XCTAssertEqual(profile?.password, \"password\")\n        XCTAssertEqual(profile?.remark, \"\")\n    }\n\n    func testInitWithBase64EncodedURLandQuery() {\n        // \"ss://aes-256-cfb:password@example.com:8388?Remark=Prism&OTA=true\"\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmRAZXhhbXBsZS5jb206ODM4OD9SZW1hcms9UHJpc20mT1RBPXRydWU\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNotNil(profile)\n\n        XCTAssertEqual(profile?.serverHost, \"example.com\")\n        XCTAssertEqual(profile?.serverPort, 8388)\n        XCTAssertEqual(profile?.method, \"aes-256-cfb\")\n        XCTAssertEqual(profile?.password, \"password\")\n        XCTAssertEqual(profile?.remark, \"Prism\")\n    }\n    \n    func testInitWithLegacyBase64EncodedURLWithTag() {\n        let url = URL(string: \"ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4Cg#example-server\")!\n        \n        let profile = ServerProfile(url: url)\n        \n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.remark, \"example-server\")\n    }\n    \n    func testInitWithLegacyBase64EncodedURLWithSymboInPassword() {\n        // Note that the legacy URI doesn't follow RFC3986. It means the password here\n        // should be plain text, not percent-encoded.\n        // Ref: https://shadowsocks.org/en/config/quick-guide.html\n        // `ss://bf-cfb:test/!@#:@192.168.100.1:8888`\n        let url = URL(string: \"ss://YmYtY2ZiOnRlc3QvIUAjOkAxOTIuMTY4LjEwMC4xOjg4ODg#example\")!\n        \n        let profile = ServerProfile(url: url)\n        \n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.password, \"test/!@#:\")\n    }\n    \n    func testInitWithLegacyURLWithEscapedChineseRemark() {\n        let url = URL(string: \"ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4#%e4%bd%a0%e5%a5%bd\")!\n        let profile = ServerProfile(url: url)\n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.remark, \"你好\")\n    }\n\n    func testInitWithEmptyURL() {\n        let url = URL(string: \"ss://\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNil(profile)\n    }\n\n    func testInitWithBase64EncodedInvalidURL() {\n        // \"ss://invalid url\"\n        let url = URL(string: \"ss://aW52YWxpZCB1cmw\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNil(profile)\n    }\n\n    func testInitWithSIP002URL() {\n        // \"ss://aes-256-cfb:password@example.com:8388?Remark=Prism&OTA=true\"\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ=@example.com:8388/?Remark=Prism&OTA=true\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNotNil(profile)\n\n        XCTAssertEqual(profile?.serverHost, \"example.com\")\n        XCTAssertEqual(profile?.serverPort, 8388)\n        XCTAssertEqual(profile?.method, \"aes-256-cfb\")\n        XCTAssertEqual(profile?.password, \"password\")\n        XCTAssertEqual(profile?.remark, \"Prism\")\n    }\n\n    func testInitWithSIP002URLProfileName() {\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ=@example.com:8388/#Name\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.remark, \"Name\")\n    }\n\n    func testInitWithSIP002URLProfileNameOverride() {\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ=@example.com:8388/?Remark=Name#Overriden\")!\n\n        let profile = ServerProfile(url: url)\n\n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.remark, \"Overriden\")\n    }\n    \n    func testInitWithSIP002URLProfileWithSIP003PluginNoPluginOpts() {\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ=@134.209.56.100:8088/?plugin=v2ray-plugin;#moon-v2ray\")!\n        \n        let profile = ServerProfile(url: url)\n        \n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.plugin, \"v2ray-plugin\")\n    }\n    \n    func testInitWithSIP002URLProfileWithSIP003Plugin() {\n        let url = URL(string: \"ss://YWVzLTI1Ni1jZmI6cGFzc3dvcmQ=@134.209.56.100:8088/?plugin=v2ray-plugin;tls#moon-v2ray\")!\n        \n        let profile = ServerProfile(url: url)\n        \n        XCTAssertNotNil(profile)\n        XCTAssertEqual(profile?.plugin, \"v2ray-plugin\")\n    }\n\n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n\n}\n"
  },
  {
    "path": "ShadowsocksX-NGTests/ShadowsocksX_NGTests.swift",
    "content": "//\n//  ShadowsocksX_NGTests.swift\n//  ShadowsocksX-NGTests\n//\n//  Created by 邱宇舟 on 2021/6/24.\n//  Copyright © 2021 qiuyuzhou. All rights reserved.\n//\n\nimport XCTest\n\nclass ShadowsocksX_NGTests: XCTestCase {\n\n    override func setUpWithError() throws {\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n\n    override func tearDownWithError() throws {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n    }\n\n    func testExample() throws {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n\n    func testPerformanceExample() throws {\n        // This is an example of a performance test case.\n        measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n\n}\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-slate"
  },
  {
    "path": "deps/Makefile",
    "content": "override ARCH ?= $(shell uname -m)\n\nifeq ($(ARCH),arm64)\noverride ARCH := aarch64\nendif\n\nTARGET := $(ARCH)-apple-macos10.12\nJOBS := $(shell getconf _NPROCESSORS_ONLN)\nGOROOT := $${PWD}/../dist/go\nGO := $(GOROOT)/bin/go\n\nifeq ($(ARCH),x86_64)\nGOARCH := amd64\nelse\nGOARCH := arm64\nendif\n\n.PHONY: all\nall: \n\t$(MAKE) ARCH=x86_64 shadowsocks-libev privoxy simple-obfs v2ray-plugin kcptun\n\t$(MAKE) ARCH=aarch64 shadowsocks-libev privoxy simple-obfs v2ray-plugin kcptun\n\t$(MAKE) universal\n\n.PHONY: universal\nuniversal:\n\t# shadowsocks-libev\n\tmkdir -p $${PWD}/dist/universal/shadowsocks-libev/bin\n\tlipo \\\n\t\t$${PWD}/dist/x86_64/shadowsocks-libev/bin/ss-local \\\n\t\t$${PWD}/dist/aarch64/shadowsocks-libev/bin/ss-local \\\n\t\t-create \\\n\t\t-output $${PWD}/dist/universal/shadowsocks-libev/bin/ss-local\n\tcp $${PWD}/dist/universal/shadowsocks-libev/bin/ss-local $${PWD}/../ShadowsocksX-NG/ss-local/\n\n\t# privoxy\n\tmkdir -p $${PWD}/dist/universal/privoxy/sbin\n\tlipo \\\n\t\t$${PWD}/dist/x86_64/privoxy/sbin/privoxy \\\n\t\t$${PWD}/dist/aarch64/privoxy/sbin/privoxy \\\n\t\t-create \\\n\t\t-output $${PWD}/dist/universal/privoxy/sbin/privoxy\n\tcp $${PWD}/dist/universal/privoxy/sbin/privoxy $${PWD}/../ShadowsocksX-NG/privoxy/\n\n\t# simple-obfs\n\tmkdir -p $${PWD}/dist/universal/simple-obfs/bin\n\tlipo \\\n\t\t$${PWD}/dist/x86_64/simple-obfs/bin/obfs-local \\\n\t\t$${PWD}/dist/aarch64/simple-obfs/bin/obfs-local \\\n\t\t-create \\\n\t\t-output $${PWD}/dist/universal/simple-obfs/bin/obfs-local\n\tcp $${PWD}/dist/universal/simple-obfs/bin/obfs-local $${PWD}/../ShadowsocksX-NG/simple-obfs/\n\n\t# v2ray-plugin\n\tmkdir -p $${PWD}/dist/universal/v2ray-plugin/bin\n\tlipo \\\n\t\t$${PWD}/dist/x86_64/v2ray-plugin/bin/v2ray-plugin \\\n\t\t$${PWD}/dist/aarch64/v2ray-plugin/bin/v2ray-plugin \\\n\t\t-create \\\n\t\t-output $${PWD}/dist/universal/v2ray-plugin/bin/v2ray-plugin\n\tcp $${PWD}/dist/universal/v2ray-plugin/bin/v2ray-plugin $${PWD}/../ShadowsocksX-NG/v2ray-plugin/\n\n\t# kcptun\n\tmkdir -p $${PWD}/dist/universal/kcptun/bin\n\tlipo \\\n\t\t$${PWD}/dist/x86_64/kcptun/bin/client \\\n\t\t$${PWD}/dist/aarch64/kcptun/bin/client \\\n\t\t-create \\\n\t\t-output $${PWD}/dist/universal/kcptun/bin/client\n\tcp $${PWD}/dist/universal/kcptun/bin/client $${PWD}/../ShadowsocksX-NG/kcptun/\n\n.PHONY: pcre\npcre:\n\t[ -f pcre.tar.gz ] || curl -L -o pcre.tar.gz 'https://downloads.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz'\n\ttar -xf pcre.tar.gz\n\tcd pcre-8.45 \\\n\t\t&& CXXFLAGS=\"-target $(TARGET)\" CFLAGS=\"-target $(TARGET)\" ./configure --prefix $${PWD}/../dist/$(ARCH)/pcre \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-dependency-tracking \\\n\t\t--enable-utf8 \\\n\t\t--enable-pcre8 \\\n\t\t--enable-pcre16 \\\n\t\t--enable-pcre32 \\\n\t\t--enable-unicode-properties \\\n\t\t--enable-pcregrep-libz \\\n\t\t--enable-pcregrep-libbz2 \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: libev\nlibev:\n\t[ -f libev.tar.gz ] || curl -L -o libev.tar.gz 'http://dist.schmorp.de/libev/libev-4.33.tar.gz'\n\ttar -xf libev.tar.gz\n\tcd libev-4.33 \\\n\t\t&& CFLAGS=\"-target $(TARGET)\" ./configure --prefix $${PWD}/../dist/$(ARCH)/libev \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-dependency-tracking \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: privoxy\nprivoxy:\n\t[ -f privoxy.tar.gz ] || curl -L -o privoxy.tar.gz 'https://www.privoxy.org/sf-download-mirror/Sources/3.0.33%20%28stable%29/privoxy-3.0.33-stable-src.tar.gz'\n\ttar -xf privoxy.tar.gz\n\tcd privoxy-3.0.33-stable \\\n\t\t&& patch -Ru configure.in < $${PWD}/../patch/privoxy/configure.in.patch \\\n\t\t&& autoreconf -fi \\\n\t\t&& LDFLAGS=\"-target $(TARGET) -L$${PWD}/../dist/$(ARCH)/pcre/lib\" \\\n\t\tCPPFLAGS=\"-target $(TARGET) -Dunix -I$${PWD}/../dist/$(ARCH)/pcre/include\" \\\n\t\tCFLAGS=\"-target $(TARGET) -Dunix -I$${PWD}/../dist/$(ARCH)/pcre/include\" \\\n\t\t./configure --prefix $${PWD}/../dist/$(ARCH)/privoxy \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-debug \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: c-ares\nc-ares:\n\tcd c-ares \\\n\t\t&& autoreconf -fi \\\n\t\t&& CXXFLAGS=\"-target $(TARGET)\" CFLAGS=\"-target $(TARGET)\" ./configure --prefix=$${PWD}/../dist/$(ARCH)/c-ares \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-dependency-tracking \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: libsodium\nlibsodium:\n\tcd libsodium \\\n\t\t&& ./autogen.sh \\\n\t\t&& CFLAGS=\"-target $(TARGET)\" ./configure --prefix $${PWD}/../dist/$(ARCH)/libsodium \\\n\t\t--host=$(TARGET) \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: mbedtls\nmbedtls:\n\tcd mbedtls \\\n\t\t&& make CFLAGS=\"-target $(TARGET) -O2\" LDFLAGS=\"-target $(TARGET) -O2\" -j$(JOBS)\\\n\t\t&& make DESTDIR=$${PWD}/../dist/$(ARCH)/mbedtls install \\\n\t\t&& make clean\n\n.PHONY: shadowsocks-libev\nshadowsocks-libev: pcre libev c-ares libsodium mbedtls \n\tcd shadowsocks-libev \\\n\t\t&& ./autogen.sh \\\n\t\t&& CFLAGS=\"-target $(TARGET)\" LDFLAGS=\"-lresolv\" ./configure --prefix $${PWD}/../dist/$(ARCH)/shadowsocks-libev \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-dependency-tracking \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t--disable-documentation \\\n\t\t--with-mbedtls=$${PWD}/../dist/$(ARCH)/mbedtls \\\n\t\t--with-pcre=$${PWD}/../dist/$(ARCH)/pcre \\\n\t\t--with-sodium=$${PWD}/../dist/$(ARCH)/libsodium \\\n\t\t--with-cares=$${PWD}/../dist/$(ARCH)/c-ares \\\n\t\t--with-ev=$${PWD}/../dist/$(ARCH)/libev \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: simple-obfs\nsimple-obfs:\n\tcd simple-obfs \\\n\t\t&& ./autogen.sh \\\n\t\t&& CFLAGS=\"-target $(TARGET)\" ./configure --prefix=$${PWD}/../dist/$(ARCH)/simple-obfs \\\n\t\t--host=$(TARGET) \\\n\t\t--disable-dependency-tracking \\\n\t\t--disable-documentation \\\n\t\t--enable-static \\\n\t\t--disable-shared \\\n\t\t--with-ev=$${PWD}/../dist/$(ARCH)/libev \\\n\t\t&& make -j$(JOBS) \\\n\t\t&& make install \\\n\t\t&& make clean\n\n.PHONY: v2ray-plugin\nv2ray-plugin: go\n\tcd v2ray-plugin \\\n\t\t&& GOROOT=$(GOROOT) GOOS=darwin GOARCH=$(GOARCH) \\\n\t\t\t$(GO) build -trimpath -ldflags \"-s -w\" -o $${PWD}/../dist/$(ARCH)/v2ray-plugin/bin/v2ray-plugin \n\n.PHONY: kcptun\nkcptun: go\n\tcd kcptun \\\n\t\t&& GOROOT=$(GOROOT) GOOS=darwin GOARCH=$(GOARCH) \\\n\t\t\t$(GO) build -trimpath -ldflags \"-s -w\" -o $${PWD}/../dist/$(ARCH)/kcptun/bin/client github.com/xtaci/kcptun/client \n\n.PHONY: go\ngo:\n\t[ -d dist ] || mkdir dist\nifeq ($(shell uname -m),arm64)\n\t[ -f dist/go.tar.gz ] || curl \"https://dl.google.com/go/go1.18.darwin-arm64.tar.gz\" --output dist/go.tar.gz\nelse\n\t[ -f dist/go.tar.gz ] || curl \"https://dl.google.com/go/go1.18.darwin-amd64.tar.gz\" --output dist/go.tar.gz\nendif\n\tcd dist \\\n\t\t&& tar -zxf go.tar.gz\n\nclean:\n\trm -rf dist\n\trm -rf pcre*\n\trm -rf libev*\n\trm -rf privoxy*\n"
  },
  {
    "path": "deps/patch/privoxy/configure.in.patch",
    "content": "--- configure.in\t2023-01-05 14:37:57\n+++ configure.in.1\t2023-01-05 14:37:40\n@@ -1090,7 +1090,7 @@\n   fi\n fi\n \n-use_static_pcre=\"yes\"\n+\n # If we have libpcre and either we also have pcreposix or\n # we don't need pcreposix, then link pcre dynamically; else\n # build it and link statically\n"
  },
  {
    "path": "genstrings.py",
    "content": "#  Created by Johannes Schriewer on 2011-11-30. Modified by Roy Marmelstein 2015-08-05\n#  Copyright (c) 2011 planetmutlu.\n#  All rights reserved.\n#\n#  Redistribution and use in source and binary forms, with or without\n#  modification, are permitted provided that the following conditions\n#  are met:\n#\n#  - Redistributions of source code must retain the above copyright\n#    notice, this list of conditions and the following disclaimer.\n#  - Redistributions in binary form must reproduce the above copyright\n#    notice, this list of conditions and the following disclaimer in the\n#    documentation and/or other materials provided with the distribution.\n#\n#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n#  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n#  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n#  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER\n#  OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# This script is heavily copied from: https://github.com/dunkelstern/Cocoa-Localisation-Helper\n# Copied from https://github.com/marmelroy/Localize-Swift By QiuYuzhou\n\nimport os, re, subprocess\nimport fnmatch\n\ndef fetch_files_recursive(directory, extension):\n    matches = []\n    for root, dirnames, filenames in os.walk(directory):\n      for filename in fnmatch.filter(filenames, '*' + extension):\n          matches.append(os.path.join(root, filename))\n    return matches\n\n\n# prepare regexes\nlocalizedStringComment = re.compile('NSLocalizedString\\(\"([^\"]*)\",\\s*\"([^\"]*)\"\\s*\\)', re.DOTALL)\nlocalizedStringNil = re.compile('NSLocalizedString\\(\"([^\"]*)\",\\s*nil\\s*\\)', re.DOTALL)\nlocalized = re.compile('Localized\\(\"([^\"]*)\"[^\\n\\r]*\\)', re.DOTALL)\nlocalizedProperty = re.compile('\"([^\"]*)\".localized', re.DOTALL)# Add By QiuYuzhou\nlocalizedSwift2 = re.compile('\"([^\"]*)\".localized\\(\\)', re.DOTALL)\nlocalizedSwift2WithFormat = re.compile('\"([^\"]*)\".localizedFormat\\([^\\n\\r]*\\)', re.DOTALL)\n\n# get string list\nuid = 0\nstrings = []\nfor file in fetch_files_recursive('.', '.swift'):\n    with open(file, 'r') as f:\n        content = f.read()\n        for result in localizedStringComment.finditer(content):\n            uid += 1\n            strings.append((result.group(1), result.group(2), file, uid))\n        for result in localizedStringNil.finditer(content):\n            uid += 1\n            strings.append((result.group(1), '', file, uid))\n        for result in localized.finditer(content):\n            uid += 1\n            strings.append((result.group(1), '', file, uid))\n        # Add By QiuYuzhou, Begin\n        for result in localizedProperty.finditer(content):\n            uid += 1\n            strings.append((result.group(1), '', file, uid))\n        # Add By QiuYuzhou, End\n        for result in localizedSwift2.finditer(content):\n            uid += 1\n            strings.append((result.group(1), '', file, uid))\n        for result in localizedSwift2WithFormat.finditer(content):\n            uid += 1\n            strings.append((result.group(1), '', file, uid))\n\n# prepare regexes\nlocalizedString = re.compile('\"[^=]*=\\s*\"([^\"]*)\";')\n\n# Changed By QiuYuzhou, disable for *.xib\n# fetch files\n#for file in fetch_files_recursive('.', '.xib'):\n#    tempFile = file + '.strings'\n#    utf8tempFile = file + '.strings.utf8'\n#    subprocess.call('ibtool --export-strings-file \"' + tempFile + '\" \"' + file + '\" 2>/dev/null', shell=True)\n#    subprocess.call('iconv -s -f UTF-16 -t UTF-8 \"' + tempFile + '\" >\"'+utf8tempFile+'\" 2>/dev/null', shell=True)\n#\n#    f = open(utf8tempFile, 'r')\n#    for line in f:\n#        result = localizedString.match(line)\n#        if result:\n#            uid += 1\n#            strings.append((result.group(1), '', file, uid))\n#    f.close()\n#\n#    os.remove(utf8tempFile)\n#    os.remove(tempFile)\n\n# find duplicates\nduplicated = []\nfilestrings = {}\nfor string1 in strings:\n    dupmatch = 0\n    for string2 in strings:\n        if string1[3] == string2[3]:\n            continue\n        if string1[0] == string2[0]:\n            if string1[2] != string2[2]:\n                dupmatch = 1\n            break\n    if dupmatch == 1:\n        dupmatch = 0\n        for string2 in duplicated:\n            if string1[0] == string2[0]:\n                dupmatch = 1\n                break\n        if dupmatch == 0:\n            duplicated.append(string1)\n    else:\n        dupmatch = 0\n        if string1[2] in filestrings:\n            for fs in filestrings[string1[2]]:\n                if fs[0] == string1[0]:\n                    dupmatch = 1\n                    break\n        else:\n            filestrings[string1[2]] = []\n        if dupmatch == 0:\n            filestrings[string1[2]].append(string1)\n\nprint '\\n\\n\\n\\n\\n'\nprint '/*\\n * SHARED STRINGS\\n */\\n'\n\n# output filewise\nfor key in filestrings.keys():\n    print '/*\\n * ' + key + '\\n */\\n'\n\n    strings = filestrings[key]\n    for string in strings:\n        if string[1] == '':\n            print '\"' + string[0] + '\" = \"' + string[0] + '\";'\n            print\n        else:\n            print '/* ' + string[1] + ' */'\n            print '\"' + string[0] + '\" = \"' + string[0] + '\";'\n            print\n\n# output duplicates\nfor string in duplicated:\n    if string[1] == '':\n        print '\"' + string[0] + '\" = \"' + string[0] + '\";'\n        print\n    else:\n        print '/* ' + string[1] + ' */'\n        print '\"' + string[0] + '\" = \"' + string[0] + '\";'\n        print"
  },
  {
    "path": "proxy_conf_helper/main.m",
    "content": "//\n//  main.m\n//  shadowsocks_sysconf\n//\n//  Created by clowwindy on 14-3-15.\n//  Copyright (c) 2014年 clowwindy. All rights reserved.\n//\n// Changed by QiuYuzhou\n\n\n#import <Foundation/Foundation.h>\n#import <SystemConfiguration/SystemConfiguration.h>\n#import \"../ShadowsocksX-NG/proxy_conf_helper_version.h\"\n\n// A library for parsing command line.\n// https://github.com/stephencelis/BRLOptionParser\n#import <BRLOptionParser/BRLOptionParser.h>\n\n\nint main(int argc, const char * argv[])\n{\n    NSString* mode;\n    NSString* pacURL;\n    NSString* portString;\n    NSString* socks5ListenAddress;\n    NSString* privoxyPortString;\n    NSString* privoxyListenAddress;\n    \n    BRLOptionParser *options = [BRLOptionParser new];\n    [options setBanner:@\"Usage: %s [-v] [-m auto|global|off] [-u <url>] [-p <port>] [-l <socks5-listen-address>] [-r <port>] [-p <privoxy-listen-address>] [-x <exception>]\", argv[0]];\n    \n    // Version\n    [options addOption:\"version\" flag:'v' description:@\"Print the version number.\" block:^{\n        printf(\"%s\", [kProxyConfHelperVersion UTF8String]);\n        exit(EXIT_SUCCESS);\n    }];\n    \n    // Help\n    __weak typeof(options) weakOptions = options;\n    [options addOption:\"help\" flag:'h' description:@\"Show this message\" block:^{\n        printf(\"%s\", [[weakOptions description] UTF8String]);\n        exit(EXIT_SUCCESS);\n    }];\n    \n    // Mode\n    [options addOption:\"mode\" flag:'m' description:@\"Proxy mode, may be: auto,global,off\" argument:&mode];\n    \n    [options addOption:\"pac-url\" flag:'u' description:@\"PAC file url for auto mode.\" argument:&pacURL];\n    [options addOption:\"port\" flag:'p' description:@\"Listen port for global mode.\" argument:&portString];\n    [options addOption:\"socks-listen-address\" flag:'l' description:@\"Listen socks5 address for global mode.\" argument:&socks5ListenAddress];\n    \n    [options addOption:\"privoxy-port\" flag:'r' description:@\"Privoxy Port for global mode.\" argument:&privoxyPortString];\n    [options addOption:\"privoxy-listen-address\" flag:'s' description:@\"Privoxy Listen Address for global mode.\" argument:&privoxyListenAddress];\n    \n    NSMutableSet* networkServiceKeys = [NSMutableSet set];\n    [options addOption:\"network-service\" flag:'n' description:@\"Manual specify the network profile need to set proxy.\" blockWithArgument:^(NSString* value){\n        [networkServiceKeys addObject:value];\n    }];\n\n    NSMutableSet* proxyExceptions = [NSMutableSet set];\n    [options addOption:\"proxy-exception\" flag:'x' description:@\"Bypass proxy settings for this Host / Domain\" blockWithArgument:^(NSString *value) {\n        [proxyExceptions addObject:value];\n    }];\n    \n    NSError *error = nil;\n    if (![options parseArgc:argc argv:argv error:&error]) {\n        const char * message = error.localizedDescription.UTF8String;\n        fprintf(stderr, \"%s: %s\\n\", argv[0], message);\n        exit(EXIT_FAILURE);\n    }\n    \n    if (mode) {\n        if ([@\"auto\" isEqualToString:mode]) {\n            if (!pacURL) {\n                return 1;\n            }\n        } else if ([@\"global\" isEqualToString:mode]) {\n            if (!portString) {\n                return 1;\n            }\n        } else if (![@\"off\" isEqualToString:mode]) {\n            return 1;\n        }\n    } else {\n        printf(\"%s\", [kProxyConfHelperVersion UTF8String]);\n        return 0;\n    }\n    \n    NSInteger port = 0;\n    if (portString) {\n        port = [portString integerValue];\n        if (0 == port) {\n            return 1;\n        }\n    }\n    \n    NSInteger privoxyPort = 0;\n    if (privoxyPortString) {\n        privoxyPort = [privoxyPortString integerValue];\n        if (0 == privoxyPort) {\n            return 1;\n        }\n    }\n    \n    static AuthorizationRef authRef;\n    static AuthorizationFlags authFlags;\n    authFlags = kAuthorizationFlagDefaults\n    | kAuthorizationFlagExtendRights\n    | kAuthorizationFlagInteractionAllowed\n    | kAuthorizationFlagPreAuthorize;\n    OSStatus authErr = AuthorizationCreate(nil, kAuthorizationEmptyEnvironment, authFlags, &authRef);\n    if (authErr != noErr) {\n        authRef = nil;\n        NSLog(@\"Error when create authorization\");\n        return 1;\n    } else {\n        if (authRef == NULL) {\n            NSLog(@\"No authorization has been granted to modify network configuration\");\n            return 1;\n        }\n        \n        SCPreferencesRef prefRef = SCPreferencesCreateWithAuthorization(nil, CFSTR(\"Shadowsocks\"), nil, authRef);\n        \n        NSDictionary *sets = (__bridge NSDictionary *)SCPreferencesGetValue(prefRef, kSCPrefNetworkServices);\n        \n        NSMutableDictionary *proxies = [[NSMutableDictionary alloc] init];\n        [proxies setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCFNetworkProxiesHTTPEnable];\n        [proxies setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCFNetworkProxiesHTTPSEnable];\n        [proxies setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCFNetworkProxiesProxyAutoConfigEnable];\n        [proxies setObject:[NSNumber numberWithInt:0] forKey:(NSString *)kCFNetworkProxiesSOCKSEnable];\n        [proxies setObject:@[] forKey:(NSString *)kCFNetworkProxiesExceptionsList];\n        \n        // 遍历系统中的网络设备列表，设置 AirPort 和 Ethernet 的代理\n        for (NSString *key in [sets allKeys]) {\n            NSMutableDictionary *dict = [sets objectForKey:key];\n            NSString *hardware = [dict valueForKeyPath:@\"Interface.Hardware\"];\n            //        NSLog(@\"%@\", hardware);\n            BOOL modify = NO;\n            if ([networkServiceKeys count] > 0) {\n                if ([networkServiceKeys containsObject:key]) {\n                    modify = YES;\n                }\n            } else if ([hardware isEqualToString:@\"AirPort\"]\n                       || [hardware isEqualToString:@\"Wi-Fi\"]\n                       || [hardware isEqualToString:@\"Ethernet\"]) {\n                modify = YES;\n            }\n            \n            if (modify) {\n                \n                NSString* prefPath = [NSString stringWithFormat:@\"/%@/%@/%@\", kSCPrefNetworkServices\n                                      , key, kSCEntNetProxies];\n                \n                if ([mode isEqualToString:@\"auto\"]) {\n                    \n                    [proxies setObject:pacURL forKey:(NSString *)kCFNetworkProxiesProxyAutoConfigURLString];\n                    [proxies setObject:[NSNumber numberWithInt:1] forKey:(NSString *)kCFNetworkProxiesProxyAutoConfigEnable];\n                    \n                    SCPreferencesPathSetValue(prefRef, (__bridge CFStringRef)prefPath\n                                              , (__bridge CFDictionaryRef)proxies);\n                } else if ([mode isEqualToString:@\"global\"]) {\n                    \n                    \n                    [proxies setObject:socks5ListenAddress forKey:(NSString *)\n                     kCFNetworkProxiesSOCKSProxy];\n                    [proxies setObject:[NSNumber numberWithInteger:port] forKey:(NSString*)\n                     kCFNetworkProxiesSOCKSPort];\n                    [proxies setObject:[NSNumber numberWithInt:1] forKey:(NSString*)\n                     kCFNetworkProxiesSOCKSEnable];\n                    [proxies setObject:[proxyExceptions allObjects] forKey:(NSString *)kCFNetworkProxiesExceptionsList];\n                    \n                    if (privoxyPort != 0) {\n                        [proxies setObject:privoxyListenAddress forKey:(NSString *)\n                         kCFNetworkProxiesHTTPProxy];\n                        [proxies setObject:[NSNumber numberWithInteger:privoxyPort] forKey:(NSString*)\n                         kCFNetworkProxiesHTTPPort];\n                        [proxies setObject:[NSNumber numberWithInt:1] forKey:(NSString*)\n                         kCFNetworkProxiesHTTPEnable];\n                        \n                        [proxies setObject:privoxyListenAddress forKey:(NSString *)\n                         kCFNetworkProxiesHTTPSProxy];\n                        [proxies setObject:[NSNumber numberWithInteger:privoxyPort] forKey:(NSString*)\n                         kCFNetworkProxiesHTTPSPort];\n                        [proxies setObject:[NSNumber numberWithInt:1] forKey:(NSString*)\n                         kCFNetworkProxiesHTTPSEnable];\n                    }\n                    \n                    SCPreferencesPathSetValue(prefRef, (__bridge CFStringRef)prefPath\n                                              , (__bridge CFDictionaryRef)proxies);\n                } else if ([mode isEqualToString:@\"off\"]) {\n                    if (pacURL != nil && portString != nil && socks5ListenAddress != nil) {\n                        // 取原来的配置，判断是否为shadowsocksX-NG设置的\n                        NSDictionary* oldProxies\n                            = (__bridge NSDictionary*)SCPreferencesPathGetValue(prefRef\n                                                                                , (__bridge CFStringRef)prefPath);\n                        \n                        if (([oldProxies[(NSString *)kCFNetworkProxiesProxyAutoConfigURLString] isEqualToString:pacURL]\n                             &&[oldProxies[(NSString *)kCFNetworkProxiesProxyAutoConfigEnable] isEqual:[NSNumber numberWithInt:1]])\n                            ||([oldProxies[(NSString*)kCFNetworkProxiesSOCKSProxy] isEqualToString:socks5ListenAddress]\n                               &&[oldProxies[(NSString*)kCFNetworkProxiesSOCKSPort] isEqualTo:[NSNumber numberWithInteger:port]]\n                               &&[oldProxies[(NSString*)kCFNetworkProxiesSOCKSEnable] isEqual:[NSNumber numberWithInt:1]])\n                            ) {\n                            SCPreferencesPathSetValue(prefRef, (__bridge CFStringRef)prefPath\n                                                      , (__bridge CFDictionaryRef)proxies);\n                        }\n                    } else {\n                        SCPreferencesPathSetValue(prefRef, (__bridge CFStringRef)prefPath\n                                                  , (__bridge CFDictionaryRef)proxies);\n                    }\n                }\n            }\n        }\n        \n        SCPreferencesCommitChanges(prefRef);\n        SCPreferencesApplyChanges(prefRef);\n        SCPreferencesSynchronize(prefRef);\n        \n        AuthorizationFree(authRef, kAuthorizationFlagDefaults);\n    }\n    \n    printf(\"pac proxy set to %s\", [mode UTF8String]);\n    \n    return 0;\n}\n"
  }
]